From c0de29bb4ef13e8513904427a8b007fb7bd2473e Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Tue, 25 Feb 2014 23:11:55 +0100 Subject: [PATCH 001/385] Add test for frame position. Add a helper function to get the bounding rectangle for an ODF page. --- webodf/lib/odf/OdfUtils.js | 17 +++++++++++++ webodf/tests/odf/LayoutTests.js | 25 ++++++++++++++++--- webodf/tests/odf/layouttests.xml | 42 +++++++++++++++++++++++++++++++- 3 files changed, 80 insertions(+), 4 deletions(-) diff --git a/webodf/lib/odf/OdfUtils.js b/webodf/lib/odf/OdfUtils.js index 12c636ec0..de4b897e3 100644 --- a/webodf/lib/odf/OdfUtils.js +++ b/webodf/lib/odf/OdfUtils.js @@ -963,4 +963,21 @@ odf.OdfUtils = function OdfUtils() { newRange.detach(); return links; }; + /** + * Get the bounding rect for the page or spreadsheet. + * @param {!Element} node + * @return {!ClientRect} + */ + this.getPageRect = function (node) { + var p = node; + while (p && !((p.namespaceURI === odf.Namespaces.officens + && (p.localName === "text" + || p.localName === "spreadsheet")) + || (p.namespaceURI === odf.Namespaces.drawns + && p.localName === "page"))) { + p = p.parentElement; + } + p = p || node; + return /**@type{!ClientRect}*/(p.getBoundingClientRect()); + }; }; diff --git a/webodf/tests/odf/LayoutTests.js b/webodf/tests/odf/LayoutTests.js index fce2a8f86..f8f4170cb 100644 --- a/webodf/tests/odf/LayoutTests.js +++ b/webodf/tests/odf/LayoutTests.js @@ -178,6 +178,8 @@ odf.LayoutTests = function LayoutTests(runner) { n = length.value; } else if (length && length.unit === "cm") { n = length.value / 2.54 * 96; + } else if (length && length.unit === "mm") { + n = length.value / 25.4 * 96; } else { throw "Unit " + length.unit + " not supported."; } @@ -212,6 +214,17 @@ odf.LayoutTests = function LayoutTests(runner) { t.b = b; r.shouldBe(t, "t.a", "t.b"); } + /** + * @param {!Element} node + * @return {!ClientRect} + */ + function getRectOnPage(node) { + var pr = odfUtils.getPageRect(node), + rect = node.getBoundingClientRect(); + rect.top -= pr.top; + rect.left -= pr.left; + return rect; + } /** * @param {!{count:!number,values:!Object.,xpath:!string}} check * @param {!Element} node @@ -224,9 +237,15 @@ odf.LayoutTests = function LayoutTests(runner) { value; for (i in check.values) { if (check.values.hasOwnProperty(i)) { - // get value from computed style (e.g. margin-left) or from - // node properties (e.g. clientWidth). - value = style[i] || node[i]; + if (i === "pageX") { + value = getRectOnPage(node).left; + } else if (i === "pageY") { + value = getRectOnPage(node).top; + } else { + // get value from computed style (e.g. margin-left) or from + // node properties (e.g. clientWidth). + value = style[i] || node[i]; + } compareValues(value, check.values[i]); } } diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index 7c875243e..310bd4c45 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -4,6 +4,7 @@ xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" + xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" > + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - Lorem ipsum. @@ -50,55 +51,31 @@ - - + + - - + + - - - - - - - - - - - - - - + + + + + - - - - - - - - - - - - - + @@ -319,26 +296,9 @@ - - - - - - - - - - - - - - - + @@ -346,9 +306,6 @@ - - - @@ -356,34 +313,14 @@ - - - - - - - - - - - - - - - + - - - From c0ce4880840d38d380effd4ab1b00d405f8691e9 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Wed, 26 Feb 2014 20:47:58 +0100 Subject: [PATCH 010/385] Fix positioning for horizontal-pos="left" and vertical-pos="top". --- webodf/lib/odf/OdfCanvas.js | 109 ++++++++++++++++++++++++------- webodf/lib/odf/StyleInfo.js | 76 +++++++++++++++++++++ webodf/tests/odf/layouttests.xml | 28 ++++++-- 3 files changed, 185 insertions(+), 28 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 6a9a82612..bc8414533 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -192,6 +192,7 @@ /**@type{?Window}*/window = runtime.getWindow(), xpath = xmldom.XPath, odfUtils = new odf.OdfUtils(), + styleInfo = new odf.StyleInfo(), domUtils = new core.DomUtils(); /** @@ -317,38 +318,97 @@ } } } + /** + * @param {!string} x + * @param {?string} horizontalPos + * @param {?string} horizontalRel + * @param {!Element} frame + * @return {!number} + */ + function getHorizontalOffset(x, horizontalPos, horizontalRel, frame) { + var parentRect = frame.parentElement.getBoundingClientRect(), + pageRect, + nx = 0; + if (horizontalPos === "from-left" || horizontalPos === "from-inside") { + nx = odfUtils.convertToPx(x || 0); + } + if (horizontalRel === "page") { + pageRect = odfUtils.getPageRect(frame); + if (parentRect) { + nx -= parentRect.left; + } + if (pageRect) { + nx += pageRect.left; + } + } + return nx; + } + /** + * @param {!string} y + * @param {?string} verticalPos + * @param {?string} verticalRel + * @param {!Element} frame + * @return {!number} + */ + function getVerticalOffset(y, verticalPos, verticalRel, frame) { + var parentRect = frame.parentElement.getBoundingClientRect(), + pageRect, + ny = 0; + if (verticalPos === "from-top") { + ny = odfUtils.convertToPx(y || 0); + } + if (verticalRel === "page") { + pageRect = odfUtils.getPageRect(frame); + if (parentRect) { + ny -= parentRect.top; + } + if (pageRect) { + ny += pageRect.top; + } + } + return ny; + } /** + * @param {!odf.ODFDocumentElement} odfnode * @param {string} styleid * @param {!Element} frame * @param {!CSSStyleSheet} stylesheet * @return {undefined} **/ - function setDrawElementPosition(styleid, frame, stylesheet) { + function setDrawElementPosition(odfnode, styleid, frame, stylesheet) { frame.setAttributeNS(webodfhelperns, 'styleid', styleid); var rule, - anchor = frame.getAttributeNS(textns, 'anchor-type'), + anchor = frame.getAttributeNS(textns, 'anchor-type') || "paragraph", + styleName = frame.getAttributeNS(drawns, "style-name"), x = frame.getAttributeNS(svgns, 'x'), y = frame.getAttributeNS(svgns, 'y'), width = frame.getAttributeNS(svgns, 'width'), height = frame.getAttributeNS(svgns, 'height'), minheight = frame.getAttributeNS(fons, 'min-height'), minwidth = frame.getAttributeNS(fons, 'min-width'), - parentRect = frame.parentElement.getBoundingClientRect(), - pageRect = odfUtils.getPageRect(frame); + properties; if (anchor === "as-char") { rule = 'display: inline-block;'; - } else if (anchor || x || y) { + } else { + properties = styleInfo.getStyleProperties(odfnode.styles, + odfnode.automaticStyles, styleName, "graphic", + { + style: { + "vertical-pos": null, + "vertical-rel": null, + "horizontal-pos": null, + "horizontal-rel": null + } + })["style"]; + x = getHorizontalOffset(x, properties["horizontal-pos"], + properties["horizontal-rel"], frame); + y = getVerticalOffset(y, properties["vertical-pos"], + properties["vertical-rel"], frame); rule = 'position: absolute;'; - } else if (width || height || minheight || minwidth) { - rule = 'display: block;'; - } - if (x && parentRect && pageRect) { - rule += 'left: ' + odfUtils.sumLengths(x, pageRect.left - parentRect.left) + 'px;'; - } - if (y && parentRect && pageRect) { - rule += 'top: ' + odfUtils.sumLengths(y, pageRect.top - parentRect.top) + 'px;'; + rule += 'left: ' + x + 'px;'; + rule += 'top: ' + y + 'px;'; } if (width) { rule += 'width: ' + width + ';'; @@ -548,12 +608,13 @@ }); } /** - * @param {!Element} odfbody + * @param {!odf.ODFDocumentElement} odfnode * @param {!CSSStyleSheet} stylesheet * @return {undefined} **/ - function modifyDrawElements(odfbody, stylesheet) { + function modifyDrawElements(odfnode, stylesheet) { var node, + odfbody = odfnode.body, /**@type{!Array.}*/ drawElements = [], i; @@ -577,7 +638,7 @@ // adjust all the frame positions for (i = 0; i < drawElements.length; i += 1) { node = drawElements[i]; - setDrawElementPosition('frame' + String(i), node, stylesheet); + setDrawElementPosition(odfnode, 'frame' + String(i), node, stylesheet); } formatParagraphAnchors(odfbody); } @@ -586,11 +647,11 @@ * @param {!odf.Formatting} formatting * @param {!odf.OdfContainer} odfContainer * @param {!Element} shadowContent - * @param {!Element} odfbody + * @param {!odf.ODFDocumentElement} odfnode * @param {!CSSStyleSheet} stylesheet * @return {undefined} **/ - function cloneMasterPages(formatting, odfContainer, shadowContent, odfbody, stylesheet) { + function cloneMasterPages(formatting, odfContainer, shadowContent, odfnode, stylesheet) { var masterPageName, masterPageElement, styleId, @@ -602,7 +663,7 @@ elementToClone, document = odfContainer.rootElement.ownerDocument; - element = odfbody.firstElementChild; + element = odfnode.body.firstElementChild; // no master pages to expect? if (!(element && element.namespaceURI === officens && (element.localName === "presentation" || element.localName === "drawing"))) { @@ -628,7 +689,7 @@ if (elementToClone.getAttributeNS(presentationns, 'placeholder') !== 'true') { clonedElement = /**@type{!Element}*/(elementToClone.cloneNode(true)); clonedPageElement.appendChild(clonedElement); - setDrawElementPosition(styleId + '_' + i, clonedElement, stylesheet); + setDrawElementPosition(odfnode, styleId + '_' + i, clonedElement, stylesheet); } elementToClone = elementToClone.nextElementSibling; i += 1; @@ -650,7 +711,7 @@ setContainerValue(clonedPageElement, presentationns, 'footer', getHeaderFooter(odfContainer, /**@type{!Element}*/(element), 'footer')); // Now call setDrawElementPosition on this new page to set the proper dimensions - setDrawElementPosition(styleId, clonedPageElement, stylesheet); + setDrawElementPosition(odfnode, styleId, clonedPageElement, stylesheet); // And finally, add an attribute referring to the master page, so the CSS targeted for that master page will style this clonedPageElement.setAttributeNS(drawns, 'draw:master-page-name', masterPageElement.getAttributeNS(stylens, 'name')); } @@ -1198,8 +1259,8 @@ shadowContent.style.left = 0; container.getContentElement().appendChild(shadowContent); - modifyDrawElements(odfnode.body, css); - cloneMasterPages(formatting, container, shadowContent, odfnode.body, css); + modifyDrawElements(odfnode, css); + cloneMasterPages(formatting, container, shadowContent, odfnode, css); modifyTables(odfnode.body, element.namespaceURI); modifyLineBreakElements(odfnode.body); expandSpaceElements(odfnode.body); @@ -1582,7 +1643,7 @@ // TODO: frameid and imageid generation here is better brought in sync with that for the images on loading of a odf file. var frameName = frame.getAttributeNS(drawns, 'name'), fc = frame.firstElementChild; - setDrawElementPosition(frameName, frame, + setDrawElementPosition(odfcontainer.rootElement, frameName, frame, /**@type{!CSSStyleSheet}*/(positioncss.sheet)); if (fc) { setImage(frameName + 'img', odfcontainer, fc, diff --git a/webodf/lib/odf/StyleInfo.js b/webodf/lib/odf/StyleInfo.js index 799f3d0c6..2d5fc05e2 100644 --- a/webodf/lib/odf/StyleInfo.js +++ b/webodf/lib/odf/StyleInfo.js @@ -899,6 +899,82 @@ odf.StyleInfo = function StyleInfo() { } }; + /** + * @param {!Element} stylesElement + * @param {!string} styleName + * @param {!string} styleFamily + * @return {?Element} + */ + function getStyleElement(stylesElement, styleName, styleFamily) { + var e = stylesElement.firstElementChild; + while (e && !(e.namespaceURI === stylens && e.localName === "style" + && e.getAttributeNS(stylens, "name") === styleName + && e.getAttributeNS(stylens, "family") === styleFamily)) { + e = e.nextElementSibling; + } + return e; + } + + /** + * @param {!Element} styleElement + * @param {!Object.>} properties + * @return {undefined} + */ + function getProperties(styleElement, properties) { + var c = styleElement.firstElementChild, p, ns, + /**@type{!string}*/ + prefix, + /**@type{!string}*/ + n; + while (c) { + for (prefix in properties) { + if (properties.hasOwnProperty(prefix)) { + p = properties[prefix]; + ns = /**@type{!string}*/(odf.Namespaces.namespaceMap[prefix]); + for (n in p) { + if (p.hasOwnProperty(n) && p[n] === null && c.hasAttributeNS(ns, n)) { + p[n] = c.getAttributeNS(ns, n); + } + } + } + } + c = c.nextElementSibling; + } + } + + /** + * @param {!Element} styles + * @param {!Element} automaticStyles + * @param {!string} styleName + * @param {!string} styleFamily + * @param {!Object.>} properties + * @return {!Object.>} + */ + function getStyleProperties(styles, automaticStyles, styleName, + styleFamily, properties) { + var s; + do { + s = getStyleElement(automaticStyles, styleName, styleFamily); + if (s) { + getProperties(s, properties); + styleName = s.getAttributeNS(stylens, "parent-style-name"); + } else { + styleName = ""; + } + } while (styleName !== ""); + while (styleName !== "") { + s = getStyleElement(styles, styleName, styleFamily); + if (s) { + getProperties(s, properties); + styleName = s.getAttributeNS(stylens, "parent-style-name"); + } else { + styleName = ""; + } + } + return properties; + } + this.getStyleProperties = getStyleProperties; + this.hasDerivedStyles = hasDerivedStyles; this.prefixStyleNames = prefixStyleNames; this.removePrefixFromStyleNames = removePrefixFromStyleNames; diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index 779fb80f8..0b5d27c56 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -22,9 +22,14 @@ - + + + + + + - + @@ -298,7 +303,7 @@ - + @@ -314,7 +319,22 @@ - + + + + + + + + + + + + + + + + From 3f62ab41ec60dcefe29f748e98cd303cb501af6d Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Thu, 27 Feb 2014 00:14:49 +0100 Subject: [PATCH 011/385] Code cleanup and add a test for anchor="as-char". --- webodf/lib/odf/StyleInfo.js | 27 +++++++++++++------------- webodf/tests/odf/LayoutTests.js | 33 ++++++++++++++++++-------------- webodf/tests/odf/layouttests.xml | 32 +++++++++++++++++++++++++------ 3 files changed, 59 insertions(+), 33 deletions(-) diff --git a/webodf/lib/odf/StyleInfo.js b/webodf/lib/odf/StyleInfo.js index 2d5fc05e2..dad0b4e05 100644 --- a/webodf/lib/odf/StyleInfo.js +++ b/webodf/lib/odf/StyleInfo.js @@ -952,23 +952,24 @@ odf.StyleInfo = function StyleInfo() { */ function getStyleProperties(styles, automaticStyles, styleName, styleFamily, properties) { - var s; - do { + var style = null, + visited = {}, s = getStyleElement(automaticStyles, styleName, styleFamily); - if (s) { - getProperties(s, properties); - styleName = s.getAttributeNS(stylens, "parent-style-name"); - } else { - styleName = ""; + if (s) { + getProperties(s, properties); + if (s.hasAttributeNS(stylens, "parent-style-name")) { + style = s.getAttributeNS(stylens, "parent-style-name"); } - } while (styleName !== ""); - while (styleName !== "") { - s = getStyleElement(styles, styleName, styleFamily); + } + while (style !== null && !visited[style]) { + s = getStyleElement(styles, style, styleFamily); + visited[style] = true; // avoid infinite loop + style = null; if (s) { getProperties(s, properties); - styleName = s.getAttributeNS(stylens, "parent-style-name"); - } else { - styleName = ""; + if (s.hasAttributeNS(stylens, "parent-style-name")) { + style = s.getAttributeNS(stylens, "parent-style-name"); + } } } return properties; diff --git a/webodf/tests/odf/LayoutTests.js b/webodf/tests/odf/LayoutTests.js index b39a7ae98..438cdc176 100644 --- a/webodf/tests/odf/LayoutTests.js +++ b/webodf/tests/odf/LayoutTests.js @@ -142,32 +142,37 @@ odf.LayoutTests = function LayoutTests(runner) { } } } + /** + * @param {!odf.ODFDocumentElement} root + * @param {!Element} input + * @return {undefined} + */ + function fill(root, input) { + var officens = odf.Namespaces.officens; + addChildren(root.styles, + input.getElementsByTagNameNS(officens, "styles")); + addChildren(root.automaticStyles, + input.getElementsByTagNameNS(officens, "automatic-styles")); + addChildren(root.masterStyles, + input.getElementsByTagNameNS(officens, "master-styles")); + addChildren(root.body.getElementsByTagNameNS(officens, "text")[0], + input.getElementsByTagNameNS(officens, "text")); + } /** * @param {!Object.} test * @param {!function():undefined} callback * @return {undefined} */ function fillDocument(test, callback) { - var officens = odf.Namespaces.officens, - odfContainer = new odf.OdfContainer("", null), + var odfContainer = new odf.OdfContainer("", null), root = odfContainer.rootElement, path = test.name + ".odt", input = test.input, commonInput = test.commonInput; if (commonInput) { - addChildren(root.automaticStyles, - commonInput.getElementsByTagNameNS(officens, "automatic-styles")); - addChildren(root.masterStyles, - commonInput.getElementsByTagNameNS(officens, "master-styles")); - addChildren(root.body.getElementsByTagNameNS(officens, "text")[0], - commonInput.getElementsByTagNameNS(officens, "text")); + fill(root, commonInput); } - addChildren(root.automaticStyles, - input.getElementsByTagNameNS(officens, "automatic-styles")); - addChildren(root.masterStyles, - input.getElementsByTagNameNS(officens, "master-styles")); - addChildren(root.body.getElementsByTagNameNS(officens, "text")[0], - input.getElementsByTagNameNS(officens, "text")); + fill(root, input); function handler() { t.odfContainer = t.odfCanvas.odfContainer(); callback(); diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index 0b5d27c56..0a8352c55 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -16,19 +16,22 @@ + + + + + - + + - - - - - + + + + + + + + + + + + + + + + + + + From b57034aa20f87e859d8fde4559eb42cb32352212 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Wed, 5 Mar 2014 09:34:16 +0100 Subject: [PATCH 012/385] Move getStyleElement from odf.Formatting to odf.StyleInfo. Also add description to some functions and make convertToPx clearer. --- webodf/lib/odf/Formatting.js | 40 +++------------------------ webodf/lib/odf/OdfCanvas.js | 16 +++++++---- webodf/lib/odf/OdfUtils.js | 18 ++++++------ webodf/lib/odf/StyleInfo.js | 53 ++++++++++++++++++++++++++++-------- 4 files changed, 65 insertions(+), 62 deletions(-) diff --git a/webodf/lib/odf/Formatting.js b/webodf/lib/odf/Formatting.js index 08822f0ab..f734a0683 100644 --- a/webodf/lib/odf/Formatting.js +++ b/webodf/lib/odf/Formatting.js @@ -52,10 +52,6 @@ odf.Formatting = function Formatting() { /**@const*/ stylens = odf.Namespaces.stylens, /**@const*/ - textns = odf.Namespaces.textns, - /**@const*/ - numberns = odf.Namespaces.numberns, - /**@const*/ fons = odf.Namespaces.fons, odfUtils = new odf.OdfUtils(), domUtils = new core.DomUtils(), @@ -219,38 +215,10 @@ odf.Formatting = function Formatting() { * @return {Element} */ function getStyleElement(styleName, family, styleElements) { - var node, - nodeStyleName, - styleListElement, - i; - - styleElements = styleElements || [odfContainer.rootElement.automaticStyles, odfContainer.rootElement.styles]; - for (i = 0; i < styleElements.length; i += 1) { - styleListElement = /**@type{!Element}*/(styleElements[i]); - node = styleListElement.firstElementChild; - while (node) { - nodeStyleName = node.getAttributeNS(stylens, 'name'); - if (node.namespaceURI === stylens - && node.localName === "style" - && node.getAttributeNS(stylens, 'family') === family - && nodeStyleName === styleName) { - return node; - } - if (family === "list-style" - && node.namespaceURI === textns - && node.localName === "list-style" - && nodeStyleName === styleName) { - return node; - } - if (family === "data" - && node.namespaceURI === numberns - && nodeStyleName === styleName) { - return node; - } - node = node.nextElementSibling; - } - } - return null; + return styleInfo.getStyleElement(styleName, family, styleElements || [ + odfContainer.rootElement.automaticStyles, + odfContainer.rootElement.styles + ]); } this.getStyleElement = getStyleElement; diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index bc8414533..08dc68a66 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -319,9 +319,11 @@ } } /** - * @param {!string} x - * @param {?string} horizontalPos - * @param {?string} horizontalRel + * Calculate the horizontal position on a page at which a frame should + * be positioned. + * @param {!string} x svg:x + * @param {?string} horizontalPos style:horizontal-pos + * @param {?string} horizontalRel style:horizontal-rel * @param {!Element} frame * @return {!number} */ @@ -344,9 +346,11 @@ return nx; } /** - * @param {!string} y - * @param {?string} verticalPos - * @param {?string} verticalRel + * Calculate the vertical position on a page at which a frame should + * be positioned. + * @param {!string} y svg:y + * @param {?string} verticalPos style:vertical-pos + * @param {?string} verticalRel style:vertical-rel * @param {!Element} frame * @return {!number} */ diff --git a/webodf/lib/odf/OdfUtils.js b/webodf/lib/odf/OdfUtils.js index 090e945e2..c840a879a 100644 --- a/webodf/lib/odf/OdfUtils.js +++ b/webodf/lib/odf/OdfUtils.js @@ -971,25 +971,27 @@ odf.OdfUtils = function OdfUtils() { * @return {!number} */ function convertToPx(val) { - var n = -1, length; + var n = -1, length, unit; if (typeof val === "number") { n = val; } else { length = parseLength(val); - if (length && length.unit === "px") { + unit = length && length.unit; + if (unit === "px") { n = length.value; - } else if (length && length.unit === "cm") { + } else if (unit === "cm") { n = length.value / 2.54 * 96; - } else if (length && length.unit === "mm") { + } else if (unit === "mm") { n = length.value / 25.4 * 96; - } else if (length && length.unit === "in") { + } else if (unit === "in") { n = length.value * 96; - } else if (length && length.unit === "pt") { + } else if (unit === "pt") { n = length.value / 0.75; - } else if (length && length.unit === "pc") { + } else if (unit === "pc") { n = length.value * 16; } else { - throw "Unit " + length.unit + " not supported by this function."; + // TODO: handle catching of this exception in the callers + throw "Unit " + unit + " not supported by this function."; } } return n; diff --git a/webodf/lib/odf/StyleInfo.js b/webodf/lib/odf/StyleInfo.js index dad0b4e05..fbb26d5c0 100644 --- a/webodf/lib/odf/StyleInfo.js +++ b/webodf/lib/odf/StyleInfo.js @@ -900,20 +900,47 @@ odf.StyleInfo = function StyleInfo() { }; /** - * @param {!Element} stylesElement + * Fetch style element associated with the requested name and family * @param {!string} styleName - * @param {!string} styleFamily - * @return {?Element} + * @param {!string} family + * @param {!Array.} styleElements Specific style trees to search. If unspecified will search both automatic + * and user-created styles + * @return {Element} */ - function getStyleElement(stylesElement, styleName, styleFamily) { - var e = stylesElement.firstElementChild; - while (e && !(e.namespaceURI === stylens && e.localName === "style" - && e.getAttributeNS(stylens, "name") === styleName - && e.getAttributeNS(stylens, "family") === styleFamily)) { - e = e.nextElementSibling; + function getStyleElement(styleName, family, styleElements) { + var node, + nodeStyleName, + styleListElement, + i; + + for (i = 0; i < styleElements.length; i += 1) { + styleListElement = /**@type{!Element}*/(styleElements[i]); + node = styleListElement.firstElementChild; + while (node) { + nodeStyleName = node.getAttributeNS(stylens, 'name'); + if (node.namespaceURI === stylens + && node.localName === "style" + && node.getAttributeNS(stylens, 'family') === family + && nodeStyleName === styleName) { + return node; + } + if (family === "list-style" + && node.namespaceURI === textns + && node.localName === "list-style" + && nodeStyleName === styleName) { + return node; + } + if (family === "data" + && node.namespaceURI === numberns + && nodeStyleName === styleName) { + return node; + } + node = node.nextElementSibling; + } } - return e; + return null; } + this.getStyleElement = getStyleElement; /** * @param {!Element} styleElement @@ -943,6 +970,8 @@ odf.StyleInfo = function StyleInfo() { } /** + * Get specific style properties from a style element. + * * @param {!Element} styles * @param {!Element} automaticStyles * @param {!string} styleName @@ -954,7 +983,7 @@ odf.StyleInfo = function StyleInfo() { styleFamily, properties) { var style = null, visited = {}, - s = getStyleElement(automaticStyles, styleName, styleFamily); + s = getStyleElement(styleName, styleFamily, [automaticStyles]); if (s) { getProperties(s, properties); if (s.hasAttributeNS(stylens, "parent-style-name")) { @@ -962,7 +991,7 @@ odf.StyleInfo = function StyleInfo() { } } while (style !== null && !visited[style]) { - s = getStyleElement(styles, style, styleFamily); + s = getStyleElement(style, styleFamily, [styles]); visited[style] = true; // avoid infinite loop style = null; if (s) { From cc848ca2bd1abda5508da78c58e053ca80afa863 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Wed, 5 Mar 2014 16:45:28 +0100 Subject: [PATCH 013/385] Fix positioning of frames in ODP files. This fixes a regression. In ODP, the location of frames is relative to the top and left of the page, but this is not explicitly specified in the styles. --- webodf/lib/odf/OdfCanvas.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 08dc68a66..f1efe3693 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -331,7 +331,8 @@ var parentRect = frame.parentElement.getBoundingClientRect(), pageRect, nx = 0; - if (horizontalPos === "from-left" || horizontalPos === "from-inside") { + if (horizontalPos === null || horizontalPos === "from-left" + || horizontalPos === "from-inside") { nx = odfUtils.convertToPx(x || 0); } if (horizontalRel === "page") { @@ -358,7 +359,7 @@ var parentRect = frame.parentElement.getBoundingClientRect(), pageRect, ny = 0; - if (verticalPos === "from-top") { + if (verticalPos === null || verticalPos === "from-top") { ny = odfUtils.convertToPx(y || 0); } if (verticalRel === "page") { From 76b2eeea896fc18243307115ae955ccfa3922998 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Wed, 26 Feb 2014 20:47:58 +0100 Subject: [PATCH 014/385] Fix positioning for horizontal-pos="left" and vertical-pos="top". --- webodf/lib/odf/StyleInfo.js | 27 +++++++++++++-------------- webodf/tests/odf/layouttests.xml | 3 +++ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/webodf/lib/odf/StyleInfo.js b/webodf/lib/odf/StyleInfo.js index fbb26d5c0..6870cfc54 100644 --- a/webodf/lib/odf/StyleInfo.js +++ b/webodf/lib/odf/StyleInfo.js @@ -981,24 +981,23 @@ odf.StyleInfo = function StyleInfo() { */ function getStyleProperties(styles, automaticStyles, styleName, styleFamily, properties) { - var style = null, - visited = {}, + var s; + do { s = getStyleElement(styleName, styleFamily, [automaticStyles]); - if (s) { - getProperties(s, properties); - if (s.hasAttributeNS(stylens, "parent-style-name")) { - style = s.getAttributeNS(stylens, "parent-style-name"); + if (s) { + getProperties(s, properties); + styleName = s.getAttributeNS(stylens, "parent-style-name"); + } else { + styleName = ""; } - } - while (style !== null && !visited[style]) { - s = getStyleElement(style, styleFamily, [styles]); - visited[style] = true; // avoid infinite loop - style = null; + } while (styleName !== ""); + while (styleName !== "") { + s = getStyleElement(styleName, styleFamily, [styles]); if (s) { getProperties(s, properties); - if (s.hasAttributeNS(stylens, "parent-style-name")) { - style = s.getAttributeNS(stylens, "parent-style-name"); - } + styleName = s.getAttributeNS(stylens, "parent-style-name"); + } else { + styleName = ""; } } return properties; diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index 0a8352c55..e21de1f74 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -33,6 +33,9 @@ + + + Date: Tue, 25 Feb 2014 23:11:55 +0100 Subject: [PATCH 015/385] Add test for frame position. Add a helper function to get the bounding rectangle for an ODF page. --- webodf/tests/odf/LayoutTests.js | 3 ++- webodf/tests/odf/layouttests.xml | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/webodf/tests/odf/LayoutTests.js b/webodf/tests/odf/LayoutTests.js index 438cdc176..50e56bfb5 100644 --- a/webodf/tests/odf/LayoutTests.js +++ b/webodf/tests/odf/LayoutTests.js @@ -107,7 +107,7 @@ odf.LayoutTests = function LayoutTests(runner) { } while (n) { testName = n.getAttribute("name"); - runtime.assert(n.localName === "test", "Element is not ."); + runtime.assert(n.localName === "test", "Element is not but " + n.localName); runtime.assert(!tests.hasOwnProperty(testName), "Test name " + testName + " is not unique."); test = parseTest(testName, n); if (!test.isFailing) { @@ -220,6 +220,7 @@ odf.LayoutTests = function LayoutTests(runner) { /** * @param {!Element} node * @return {!odf.OdfRect} + * @return {!ClientRect} */ function getRectOnPage(node) { var pr = odfUtils.getPageRect(node), diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index e21de1f74..0f45a57c9 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -369,4 +369,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From af6e2301fe12f1ff8aa2610cfc5f106fac751abf Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Wed, 26 Feb 2014 17:38:53 +0100 Subject: [PATCH 016/385] Simplify layout tests by having common styles. --- webodf/tests/odf/LayoutTests.js | 1 - webodf/tests/odf/layouttests.xml | 43 ++------------------------------ 2 files changed, 2 insertions(+), 42 deletions(-) diff --git a/webodf/tests/odf/LayoutTests.js b/webodf/tests/odf/LayoutTests.js index 50e56bfb5..70f2435c1 100644 --- a/webodf/tests/odf/LayoutTests.js +++ b/webodf/tests/odf/LayoutTests.js @@ -220,7 +220,6 @@ odf.LayoutTests = function LayoutTests(runner) { /** * @param {!Element} node * @return {!odf.OdfRect} - * @return {!ClientRect} */ function getRectOnPage(node) { var pr = odfUtils.getPageRect(node), diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index 0f45a57c9..f6bc3bde7 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -33,7 +33,7 @@ - + @@ -76,7 +76,7 @@ - + @@ -369,43 +369,4 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 6ff7cabe959d81c54ddc330e2ca40cd3931c9fb9 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Thu, 13 Mar 2014 08:31:40 +0100 Subject: [PATCH 017/385] Remove type odf.OdfRect. It is not needed any more. No call to getPageRect modifies the resulting ClientRect. --- webodf/lib/odf/OdfUtils.js | 8 ++------ webodf/tests/odf/LayoutTests.js | 6 +++--- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/webodf/lib/odf/OdfUtils.js b/webodf/lib/odf/OdfUtils.js index c840a879a..34b0957d0 100644 --- a/webodf/lib/odf/OdfUtils.js +++ b/webodf/lib/odf/OdfUtils.js @@ -1011,7 +1011,7 @@ odf.OdfUtils = function OdfUtils() { * Find the page, slide or spreadsheet for a node and return the rect for it. * The page, slide or spreadsheet should be an ancestor to the node. * @param {!Element} node - * @return {?odf.OdfRect} + * @return {?ClientRect} */ this.getPageRect = function (node) { var p = node; @@ -1023,10 +1023,6 @@ odf.OdfUtils = function OdfUtils() { p = p.parentElement; } p = p || node; - return p.getBoundingClientRect(); + return domUtils.getBoundingClientRect(p); }; }; -/** - * @typedef{!ClientRect|!{top:!number,left:!number,right:!number,bottom:!number,width:!number,height:!number}} - */ -odf.OdfRect; diff --git a/webodf/tests/odf/LayoutTests.js b/webodf/tests/odf/LayoutTests.js index 70f2435c1..fea984bdf 100644 --- a/webodf/tests/odf/LayoutTests.js +++ b/webodf/tests/odf/LayoutTests.js @@ -219,19 +219,19 @@ odf.LayoutTests = function LayoutTests(runner) { } /** * @param {!Element} node - * @return {!odf.OdfRect} + * @return {!ClientRect} */ function getRectOnPage(node) { var pr = odfUtils.getPageRect(node), rect = node.getBoundingClientRect(); - return { + return /**@type{!ClientRect}*/({ top: rect.top - pr.top, left: rect.left - pr.left, width: rect.width, height: rect.height, bottom: rect.bottom - pr.top, right: rect.right - pr.left - }; + }); } /** * @param {!{count:!number,values:!Object.,xpath:!string}} check From 8a38622813f2048fa64cf603bb741bad67a4db18 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Tue, 25 Feb 2014 23:11:55 +0100 Subject: [PATCH 018/385] Add test for frame position. Add a helper function to get the bounding rectangle for an ODF page. --- webodf/lib/odf/OdfUtils.js | 2 +- webodf/tests/odf/layouttests.xml | 39 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/webodf/lib/odf/OdfUtils.js b/webodf/lib/odf/OdfUtils.js index 34b0957d0..3264e0cfd 100644 --- a/webodf/lib/odf/OdfUtils.js +++ b/webodf/lib/odf/OdfUtils.js @@ -1016,7 +1016,7 @@ odf.OdfUtils = function OdfUtils() { this.getPageRect = function (node) { var p = node; while (p && !((p.namespaceURI === odf.Namespaces.officens - && (p.localName === "body" + && (p.localName === "text" || p.localName === "spreadsheet")) || (p.namespaceURI === odf.Namespaces.drawns && p.localName === "page"))) { diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index f6bc3bde7..465de9641 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -369,4 +369,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 8e05b5c2b253fbd06a8978a85da1e6753941f0ff Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Wed, 26 Feb 2014 17:38:53 +0100 Subject: [PATCH 019/385] Simplify layout tests by having common styles. --- webodf/tests/odf/layouttests.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index 465de9641..e1b25ea21 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -400,9 +400,6 @@ - - - From 94eeafbcc3b1c69b47bf49b9bec289f7e984f313 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Wed, 26 Feb 2014 20:47:58 +0100 Subject: [PATCH 020/385] Fix positioning for horizontal-pos="left" and vertical-pos="top". --- webodf/tests/odf/layouttests.xml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index e1b25ea21..af6ccc746 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -36,6 +36,9 @@ + + + - + From 7587542286c2192fafdb58f29ca371c8e5cc7478 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Thu, 27 Feb 2014 14:51:31 +0100 Subject: [PATCH 021/385] Add simple pagination. This pagination algorithm is quite simple and only deals with documents with uniform pages. Features not implemented: - frame positioning and wrapping - different pages sizes - hard page breaks - tabs - headers and footers --- webodf/lib/manifest.json | 4 + webodf/lib/odf/OdfCanvas.js | 9 +- webodf/lib/odf/TextLayout.js | 217 +++++++++++++++++++++++++++++++ webodf/tests/odf/layouttests.xml | 39 ++---- webodf/tools/karma.conf.js | 1 + 5 files changed, 242 insertions(+), 28 deletions(-) create mode 100644 webodf/lib/odf/TextLayout.js diff --git a/webodf/lib/manifest.json b/webodf/lib/manifest.json index e3a6156c8..910b9fcba 100644 --- a/webodf/lib/manifest.json +++ b/webodf/lib/manifest.json @@ -219,6 +219,7 @@ "odf.Formatting", "odf.ListStylesToCss", "odf.Style2CSS", + "odf.TextLayout", "ops.Canvas" ], "odf.OdfContainer": [ @@ -248,6 +249,9 @@ "odf.StyleTree": [ "odf.Namespaces" ], + "odf.TextLayout": [ + "odf.OdfContainer" + ], "odf.TextSerializer": [ "odf.OdfUtils", "xmldom.LSSerializerFilter" diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index f1efe3693..28185ed71 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -193,6 +193,7 @@ xpath = xmldom.XPath, odfUtils = new odf.OdfUtils(), styleInfo = new odf.StyleInfo(), + textLayout = new odf.TextLayout(), domUtils = new core.DomUtils(); /** @@ -1066,7 +1067,10 @@ stylesxmlcss, /**@type{!HTMLStyleElement}*/ positioncss, + /**@type{!HTMLDivElement}*/ shadowContent, + /**@type{!HTMLDivElement}*/ + pagesDiv, /**@type{!Object.>}*/ eventHandlers = {}, waitingForDoneTimeoutId, @@ -1257,7 +1261,7 @@ // styled, so we will populate this in the ODF body first. Once the // styling is handled, it can then be lifted out of the // ODF body and placed beside it, to not pollute the ODF dom. - shadowContent = doc.createElementNS(element.namespaceURI, 'div'); + shadowContent = /**@type{!HTMLDivElement}*/(doc.createElementNS(element.namespaceURI, 'div')); shadowContent.id = "shadowContent"; shadowContent.style.position = 'absolute'; shadowContent.style.top = 0; @@ -1265,6 +1269,9 @@ container.getContentElement().appendChild(shadowContent); modifyDrawElements(odfnode, css); + pagesDiv = /**@type{!HTMLDivElement}*/(doc.createElementNS(element.namespaceURI, 'div')); + container.getContentElement().parentNode.insertBefore(pagesDiv, container.getContentElement()); + textLayout.layout(odfnode, pagesDiv, 100); cloneMasterPages(formatting, container, shadowContent, odfnode, css); modifyTables(odfnode.body, element.namespaceURI); modifyLineBreakElements(odfnode.body); diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js new file mode 100644 index 000000000..3a0b27248 --- /dev/null +++ b/webodf/lib/odf/TextLayout.js @@ -0,0 +1,217 @@ +/** + * @license + * Copyright (C) 2014 KO GmbH + * + * @licstart + * The JavaScript code in this page is free software: you can redistribute it + * and/or modify it under the terms of the GNU Affero General Public License + * (GNU AGPL) as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. The code is distributed + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this code. If not, see . + * + * As additional permission under GNU AGPL version 3 section 7, you + * may distribute non-source (e.g., minimized or compacted) forms of + * that code without the copy of the GNU GPL normally required by + * section 4, provided you include this license notice and a URL + * through which recipients can access the Corresponding Source. + * + * As a special exception to the AGPL, any HTML file which merely makes function + * calls to this code, and for that purpose includes it by reference shall be + * deemed a separate work for copyright law purposes. In addition, the copyright + * holders of this code give you permission to combine this code with free + * software libraries that are released under the GNU LGPL. You may copy and + * distribute such a system following the terms of the GNU AGPL for this code + * and the LGPL for the libraries. If you modify this code, you may extend this + * exception to your version of the code, but you are not obligated to do so. + * If you do not wish to do so, delete this exception statement from your + * version. + * + * This license applies to this entire compilation. + * @licend + * @source: http://www.webodf.org/ + * @source: https://github.com/kogmbh/WebODF/ + */ + +/*global odf, window*/ +/** + * @constructor + */ +odf.TextLayout = function TextLayout() { + "use strict"; + /** + * @param {!HTMLDivElement} pagesDiv + * @return {!number} + */ + function countPages(pagesDiv) { + return Math.ceil((pagesDiv.childElementCount - 1) / 2); + } + /** + * @param {!odf.TextLayout.PageDimensions} dims + * @param {!HTMLDivElement} pagesDiv + * @return {!number} + */ + function getPagesHeight(dims, pagesDiv) { + var npages = countPages(pagesDiv), + height; + height = npages * dims.pageHeight + (npages - 1) * dims.pageSeparation; + return height; + } + /** + * @param {!HTMLDivElement} pagesDiv + * @param {!number} count + * @return {undefined} + */ + function removePages(pagesDiv, count) { + var last = pagesDiv.lastElementChild; + while (count > 0) { + pagesDiv.removeChild(last); + last = pagesDiv.lastElementChild; + if (last) { + pagesDiv.removeChild(last); + last = pagesDiv.lastElementChild; + } + count -= 1; + } + last.style.marginBottom = 0; + last.style.height = 0; + } + /** + * @param {!odf.TextLayout.PageDimensions} dims + * @param {!HTMLDivElement} pagesDiv + * @param {!number} count + * @return {undefined} + */ + function addPages(dims, pagesDiv, count) { + var doc = pagesDiv.ownerDocument, + frag = doc.createDocumentFragment(), + htmlns = doc.documentElement.namespaceURI, + n = countPages(pagesDiv), + lastSeparator = pagesDiv.lastElementChild, + contentHeight = dims.pageHeight - dims.marginTop - dims.marginBottom, + div; + count += n; + while (n < count) { + // make separator + div = doc.createElementNS(htmlns, "div"); + div.style.width = "100%"; + div.style.cssFloat = "right"; + div.style.position = "relative"; + div.style.zIndex = 10; + div.style.marginBottom = dims.marginTop + "px"; + if (n > 0) { + div.style.height = dims.pageSeparation + "px"; + div.style.marginTop = dims.marginBottom + "px"; + div.style.background = dims.background; + } + frag.appendChild(div); + div = doc.createElementNS(htmlns, "div"); + div.style.height = contentHeight + "px"; + div.style.width = "1px"; + div.style.cssFloat = "right"; + frag.appendChild(div); + n += 1; + } + div = doc.createElementNS(htmlns, "div"); + div.style.width = "100%"; + div.style.cssFloat = "right"; + div.style.position = "relative"; + div.style.zIndex = 10; + div.style.marginTop = dims.marginBottom + "px"; + frag.appendChild(div); + if (lastSeparator) { + pagesDiv.replaceChild(frag, lastSeparator); + } else { + pagesDiv.appendChild(frag); + } + } + /** + * @param {!odf.TextLayout.PageDimensions} dims + * @param {!HTMLDivElement} pagesDiv + * @param {!number} bodyHeight + * @return {!boolean} + */ + function adjustPages(dims, pagesDiv, bodyHeight) { + var missingHeight = bodyHeight - getPagesHeight(dims, pagesDiv), + missingPages = Math.ceil(missingHeight / dims.pageHeight), + pageCountChanged = false; + if (missingPages > 0) { + // too few pages + pageCountChanged = true; + addPages(dims, pagesDiv, missingPages); + } else if (missingPages < 0) { + // too many pages + pageCountChanged = true; + removePages(pagesDiv, -missingPages); + } + return pageCountChanged; + } + /** + * @param {!number} maxTime + * @return {!number} + */ + function endTime(maxTime) { + return new Date().getTime() + maxTime; + } + /** + * @param {!number} end + * @return {!boolean} + */ + function checkTime(end) { + var now = new Date().getTime(); + return now < end; + } + /** + * @param {!odf.ODFDocumentElement} odfroot + * @param {!odf.TextLayout.PageDimensions} dims + * @param {!HTMLDivElement} pagesDiv + * @param {!number} maxTime (milliseconds) + * @return {!boolean} + */ + function updateNumberOfPages(odfroot, dims, pagesDiv, maxTime) { + var text = odfroot.body.lastElementChild, + end = endTime(maxTime), + textHeight = text.clientHeight, + timeLeft = true; + while (timeLeft && adjustPages(dims, pagesDiv, textHeight)) { + timeLeft = checkTime(end); + } + return timeLeft; + } + /** + * Layout the text by resizing frames and updating the numbers of pages. + * This function runs for the maximum allocated time and returns true if + * it is done in that time. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!HTMLDivElement} pagesDiv + * @param {!number} maxTime (milliseconds) + * @param {!odf.TextLayout.PageDimensions=} dims + * @return {!boolean} + */ + function layout(odfroot, pagesDiv, maxTime, dims) { + if (!dims) { + dims = { + pageHeight: 1130, // ~ 30 cm + marginTop: 60, + marginBottom: 60, + pageSeparation: 30,// ~ 1 cm + background: "black" + }; + } + updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); + updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); + return maxTime > 0; + } + this.layout = layout; +}; +/**@typedef{{ + pageHeight:!number, + marginTop:!number, + marginBottom:!number, + pageSeparation:!number, + background:!string +}}*/ +odf.TextLayout.PageDimensions; diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index af6ccc746..2d948551c 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -41,8 +41,8 @@ @@ -372,39 +372,24 @@ - + - - - - - - - - - - - - - - - - - - + + + + + +>>>>>>> Add simple pagination. - - - + + + diff --git a/webodf/tools/karma.conf.js b/webodf/tools/karma.conf.js index 24261b58f..a21416a30 100644 --- a/webodf/tools/karma.conf.js +++ b/webodf/tools/karma.conf.js @@ -55,6 +55,7 @@ module.exports = function (config) { 'lib/odf/StyleTree.js', 'lib/odf/ListStylesToCss.js', 'lib/odf/Style2CSS.js', + 'lib/odf/TextLayout.js', 'lib/gui/ZoomHelper.js', 'lib/ops/Canvas.js', 'lib/odf/OdfCanvas.js', From 5c87c710e05898941982f7a2e22e5d3c4aabce3f Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Sun, 9 Mar 2014 12:30:25 +0100 Subject: [PATCH 022/385] First commit of work on different type of pagination implementation. --- webodf/lib/odf/OdfCanvas.js | 4 +- webodf/lib/odf/TextLayout.js | 246 ++++++++++++++++++++++++++++++++++- 2 files changed, 248 insertions(+), 2 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 28185ed71..e3793fdff 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -1271,7 +1271,9 @@ modifyDrawElements(odfnode, css); pagesDiv = /**@type{!HTMLDivElement}*/(doc.createElementNS(element.namespaceURI, 'div')); container.getContentElement().parentNode.insertBefore(pagesDiv, container.getContentElement()); - textLayout.layout(odfnode, pagesDiv, 100); + //textLayout.layout(odfnode, pagesDiv, 100); + textLayout.updateCompleteLayout(odfnode, pagesDiv); + cloneMasterPages(container, shadowContent, odfnode, css); cloneMasterPages(formatting, container, shadowContent, odfnode, css); modifyTables(odfnode.body, element.namespaceURI); modifyLineBreakElements(odfnode.body); diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 3a0b27248..a63edd016 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -36,12 +36,15 @@ * @source: https://github.com/kogmbh/WebODF/ */ -/*global odf, window*/ +/*global odf, window, core, NodeFilter*/ /** * @constructor */ odf.TextLayout = function TextLayout() { "use strict"; + var domUtils = new core.DomUtils(), + officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", + textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0"; /** * @param {!HTMLDivElement} pagesDiv * @return {!number} @@ -206,6 +209,247 @@ odf.TextLayout = function TextLayout() { return maxTime > 0; } this.layout = layout; + /** + * @param {!odf.ODFDocumentElement} odfRoot + * @return {?Element} + */ + function getOfficeText(odfRoot) { + return domUtils.getDirectChild(odfRoot.body, officens, "text"); + } + /** + * @param {!Node} node + * @return {!number} + */ + function paragraphNodeFilter(node) { + var r = NodeFilter.FILTER_ACCEPT; + if (node.localName !== "p" && node.localName !== "h") { + r = NodeFilter.FILTER_REJECT; + } else if (node.namespaceURI !== textns) { + r = NodeFilter.FILTER_REJECT; + } + return r; + } + /** + * @param {!Element} officeText + * @return {!TreeWalker} + */ + function createParagraphWalker(officeText) { + var doc = officeText.ownerDocument; + return doc.createTreeWalker(officeText, NodeFilter.SHOW_ELEMENT, + paragraphNodeFilter, false); + } + /** + * @param {!Element} element + * @return {!number} + */ + function getTop(element) { + var he = /**@type{!HTMLElement}*/(element), + top = he.offsetTop || 0; + if (he.offsetParent) { + top += getTop(he.offsetParent); + } + return top; + } + /** + * @param {!Element} element + * @return {!number} + */ + function getBottom(element) { + var height = /**@type{!HTMLElement}*/(element).offsetHeight || 0; + return height + getTop(element); + } + /** + * @param {!HTMLDivElement} pagesDiv + * @return {!HTMLDivElement} + */ + function createPageDiv(pagesDiv) { + var doc = pagesDiv.ownerDocument, + htmlns = pagesDiv.namespaceURI, + page = doc.createElementNS(htmlns, "div"), + header = doc.createElementNS(htmlns, "div"), + footer = doc.createElementNS(htmlns, "div"); + page.style.cssFloat = "right"; + page.style.width = "1px"; + page.style.height = "10cm"; + page.style.position = "relative"; + + header.style.position = "absolute"; + header.style.right = 0; + header.style.top = 0; + header.style.width = "1cm"; + header.style.height = "1cm"; + header.style.background = "yellow"; + + footer.style.position = "absolute"; + footer.style.right = 0; + footer.style.bottom = 0; + footer.style.width = "1cm"; + footer.style.height = "1cm"; + footer.style.background = "red"; + + page.appendChild(header); + page.appendChild(footer); + return /**@type{!HTMLDivElement}*/(page); + } + /** + * @param {!HTMLDivElement} pagesDiv + * @return {!HTMLDivElement} + */ + function createSeparator(pagesDiv) { + var doc = pagesDiv.ownerDocument, + htmlns = pagesDiv.namespaceURI, + separator = doc.createElementNS(htmlns, "div"); + separator.style.cssFloat = "right"; + separator.style.width = "100%"; + separator.style.height = "1cm"; + separator.style.background = "black"; + return /**@type{!HTMLDivElement}*/(separator); + } + /** + * @param {!number} page + * @param {!HTMLDivElement} pagesDiv + * @return {!HTMLDivElement} + */ + function getPageDiv(page, pagesDiv) { + var pageDiv = pagesDiv.firstElementChild; + if (pageDiv === null) { + pagesDiv.appendChild(createSeparator(pagesDiv)); + } + while (page > 0 && pageDiv !== null) { + pageDiv = pageDiv.nextElementSibling; + pageDiv = pageDiv && pageDiv.nextElementSibling; + if (pageDiv !== null) { + page -= 1; + } + } + if (pageDiv === null) { + while (page > 0) { + pageDiv = pagesDiv.appendChild(createPageDiv(pagesDiv)); + pagesDiv.appendChild(createSeparator(pagesDiv)); + page -= 1; + } + } + return /**@type{!HTMLDivElement}*/(pageDiv); + } + /** + * @param {!number} pageBottom + * @param {?Element} officeText + * @param {?Element} previousFirstPageParagraph + * @return {?Element} + */ + function getFirstPageParagraph(pageBottom, officeText, previousFirstPageParagraph) { + if (!officeText) { + return null; + } + var walker = createParagraphWalker(officeText), + top, + e; + if (previousFirstPageParagraph) { + walker.currentNode = previousFirstPageParagraph; + } + e = /**@type{?Element}*/(walker.nextNode()); + while (e) { + top = getTop(e); + if (top >= pageBottom) { + break; + } + e = /**@type{?Element}*/(walker.nextNode()); + } + return e; + } + /** + * @param {!Element} masterPageStyle + * @return {!odf.TextLayout.PageDimensions} + */ + function getPageDimensions(masterPageStyle) { + var dims = { + pageHeight: 1130, // ~ 30 cm + marginTop: 60, + marginBottom: 60, + pageSeparation: 30,// ~ 1 cm + background: "black" + }; + if (masterPageStyle) { + dims.background = "black"; + } + return dims; + } + /** + * @param {!HTMLDivElement} pageDiv + * @param {!Element} masterPageStyle + * @return {undefined} + */ + function updatePageSize(pageDiv, masterPageStyle) { + var dim = getPageDimensions(masterPageStyle), + h = dim.pageHeight + "px"; + if (pageDiv.style.height !== h) { + pageDiv.style.height = h; + } + } + /** + * @param {!number} currentPage + * @param {!Element} paragraph + * @param {!odf.ODFDocumentElement} odfroot + * @return {!Element} + */ + function getMasterPageStyle(currentPage, paragraph, odfroot) { + var p = paragraph; + if (currentPage || odfroot) { + p = paragraph; + } + return p; + } + /** + * Update the layout of pages. + * Returns the number of the next page that should be layed out or 0 if + * layout is done. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!HTMLDivElement} pagesDiv + * @param {!number} maxTime (milliseconds) + * @param {!number} currentPage + * @return {!number} + */ + function updateLayout(odfroot, pagesDiv, maxTime, currentPage) { + currentPage = Math.max(1, currentPage); + var officeText = getOfficeText(odfroot), + masterPageStyle, + firstPageParagraph = getFirstPageParagraph(0, officeText, null), + end = endTime(maxTime), + pageBottom, + pageDiv, + timeLeft = true; +runtime.log(currentPage + " " + firstPageParagraph); +runtime.log(firstPageParagraph + " "); + while (timeLeft && firstPageParagraph) { + masterPageStyle = getMasterPageStyle(currentPage, + firstPageParagraph, odfroot); + pageDiv = getPageDiv(currentPage, pagesDiv); +console.log(pageDiv); + updatePageSize(pageDiv, masterPageStyle); + currentPage += 1; + pageBottom = getBottom(pageDiv); + firstPageParagraph = getFirstPageParagraph(pageBottom, officeText, firstPageParagraph); + timeLeft = checkTime(end); +runtime.log("timeleft " + timeLeft); +runtime.log(firstPageParagraph + " "); + } + return timeLeft ? 0 : currentPage; + } + this.updateLayout = updateLayout; + /** + * @param {!odf.ODFDocumentElement} odfroot + * @param {!HTMLDivElement} pagesDiv + * @return {undefined} + */ + function updateCompleteLayout(odfroot, pagesDiv) { + var page = 1, + count = 0; + do { + page = updateLayout(odfroot, pagesDiv, 1, page); + count += 1; + } while (page !== 0 && count < 10); + } + this.updateCompleteLayout = updateCompleteLayout; }; /**@typedef{{ pageHeight:!number, From 5afba58ea0ab8eab2fc470ecc2c8a3c4099cdcfa Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Sun, 9 Mar 2014 14:55:57 +0100 Subject: [PATCH 023/385] snapshot --- webodf/lib/odf/OdfCanvas.js | 1 - webodf/lib/odf/TextLayout.js | 25 ++++++++++++++++++------- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index e3793fdff..f70087e24 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -1273,7 +1273,6 @@ container.getContentElement().parentNode.insertBefore(pagesDiv, container.getContentElement()); //textLayout.layout(odfnode, pagesDiv, 100); textLayout.updateCompleteLayout(odfnode, pagesDiv); - cloneMasterPages(container, shadowContent, odfnode, css); cloneMasterPages(formatting, container, shadowContent, odfnode, css); modifyTables(odfnode.body, element.namespaceURI); modifyLineBreakElements(odfnode.body); diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index a63edd016..a86bf5d7c 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -393,10 +393,26 @@ odf.TextLayout = function TextLayout() { * @return {!Element} */ function getMasterPageStyle(currentPage, paragraph, odfroot) { - var p = paragraph; - if (currentPage || odfroot) { + var styleElements = [odfroot.automaticStyles, odfroot.styles], + //styleName, + //style, + p = paragraph; + if (styleElements && currentPage) { p = paragraph; } +/* TODO: implement + do { + if (p.hasAttributeNS(textns, "style-name")) { + styleName = p.getAttributeNS(textns, "style-name"); + style = styleInfo.getStyleElement(styleName, "paragraph", + styleElements); + if (style) { + } + } else { + } + p = p.previousElementSibling; + } while (p !== null); +*/ return p; } /** @@ -418,20 +434,15 @@ odf.TextLayout = function TextLayout() { pageBottom, pageDiv, timeLeft = true; -runtime.log(currentPage + " " + firstPageParagraph); -runtime.log(firstPageParagraph + " "); while (timeLeft && firstPageParagraph) { masterPageStyle = getMasterPageStyle(currentPage, firstPageParagraph, odfroot); pageDiv = getPageDiv(currentPage, pagesDiv); -console.log(pageDiv); updatePageSize(pageDiv, masterPageStyle); currentPage += 1; pageBottom = getBottom(pageDiv); firstPageParagraph = getFirstPageParagraph(pageBottom, officeText, firstPageParagraph); timeLeft = checkTime(end); -runtime.log("timeleft " + timeLeft); -runtime.log(firstPageParagraph + " "); } return timeLeft ? 0 : currentPage; } From efd664784c908491e88133fbc0084afeeaeaad49 Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Tue, 18 Feb 2014 11:01:15 +0100 Subject: [PATCH 024/385] Add getElementsByTagName to DomUtils. --- webodf/lib/core/DomUtils.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/webodf/lib/core/DomUtils.js b/webodf/lib/core/DomUtils.js index 3c9288517..ce03d7451 100644 --- a/webodf/lib/core/DomUtils.js +++ b/webodf/lib/core/DomUtils.js @@ -605,6 +605,23 @@ } this.getElementsByTagNameNS = getElementsByTagNameNS; + /** + * Get an array of nodes below the specified node with the specific name tag name. + * @param {!Element|!Document} node + * @param {!string} tagName + * @return {!Array.} + */ + function getElementsByTagName(node, tagName) { + var e = [], list, i, l; + list = node.getElementsByTagName(tagName); + e.length = l = list.length; + for (i = 0; i < l; i += 1) { + e[i] = /**@type{!Element}*/(list.item(i)); + } + return e; + } + this.getElementsByTagName = getElementsByTagName; + /** * Whether a node contains another node * Wrapper around Node.contains From 9f46e8328dd50cad3c0d318c1c396ad658da8a3e Mon Sep 17 00:00:00 2001 From: Jos van den Oever Date: Tue, 18 Feb 2014 08:42:54 +0100 Subject: [PATCH 025/385] Remove dangerous - - - -
-
-
- - diff --git a/programs/firefoxextension/install.rdf.in b/programs/firefoxextension/install.rdf.in deleted file mode 100644 index 217944a38..000000000 --- a/programs/firefoxextension/install.rdf.in +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - uriloader@webodf.js - 2 - true - - ODF Viewer - @WEBODF_VERSION@ - Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies. - KO GmbH - http://webodf.org/ - - - - - {ec8030f7-c20a-464f-9b0e-13a3a9e97384} - 6.0 - 15.0a1 - - - - - - - {92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a} - 2.1.* - 2.12a1 - - - - - - - {aa3c5121-dab2-40e2-81ca-7ea25febc110} - 11.0 - 16.0a1 - - - - diff --git a/programs/firefoxextension/manifest.json.in b/programs/firefoxextension/manifest.json.in new file mode 100644 index 000000000..ea4115801 --- /dev/null +++ b/programs/firefoxextension/manifest.json.in @@ -0,0 +1,34 @@ +{ + "manifest_version": 3, + "name": "ODF Viewer", + "version": "@WEBODF_VERSION@", + "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", + "author": "Daniel Berthereau", + "homepage_url": "http://webodf.org/", + "browser_specific_settings": { + "gecko": { + "id": "uriloader@webodf.js", + "strict_min_version": "115.0" + } + }, + "icons": { + "48": "skin/default/icon.png" + }, + "permissions": [ + "webRequest", + "webRequestBlocking", + "downloads" + ], + "host_permissions": [ + "" + ], + "background": { + "scripts": ["background.js"] + }, + "web_accessible_resources": [ + { + "resources": ["viewer.html"], + "matches": [""] + } + ] +} diff --git a/programs/firefoxextension/packextension.js b/programs/firefoxextension/packextension.js deleted file mode 100644 index b6bfa9958..000000000 --- a/programs/firefoxextension/packextension.js +++ /dev/null @@ -1,80 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - * - * @licstart - * This file is part of WebODF. - * - * WebODF is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License (GNU AGPL) - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * WebODF is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with WebODF. If not, see . - * @licend - * - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ - -/*global require, runtime, webodfcore*/ - -runtime.loadClass("webodfcore.Base64"); - -function addFiles(dirname, pos, files, callback) { - "use strict"; - if (pos >= files.length) { - return; - } - var path = require("path"), - fs = require("fs"), - filepath = files[pos]; - runtime.readFile(filepath, "binary", function (err, data) { - var base64, - target = path.join(dirname, filepath), - dir = dirname, - reldir = path.relative(dir, path.dirname(target)); - if (err) { - return callback(err); - } - if (filepath === "content/webodf.js") { - // replace eval() with evil(), since Firefox does not approve of it - base64 = new webodfcore.Base64(); - data = base64.convertUTF8ArrayToUTF16String(data); - data = data.replace(new RegExp('eval\\(', 'g'), 'evil('); - data = runtime.byteArrayFromString(data); - } - reldir.split(path.sep).forEach(function (part) { - dir = path.join(dir, part); - if (!fs.existsSync(dir)) { - fs.mkdirSync(dir); - } - }); - fs.writeFile(target, new Buffer(data), {encoding: "binary"}, function (err) { - if (err) { - throw err; - } - addFiles(dirname, pos + 1, files, callback); - }); - }); -} - -var args = arguments, - dirname = args[1], - members = [], - i; -for (i = 2; i < arguments.length; i += 1) { - members.push(arguments[i]); -} - -addFiles(dirname, 0, members, function (err) { - "use strict"; - if (err) { - runtime.log(err); - } -}); diff --git a/programs/firefoxextension/viewer.css b/programs/firefoxextension/viewer.css new file mode 100644 index 000000000..aadc39b89 --- /dev/null +++ b/programs/firefoxextension/viewer.css @@ -0,0 +1,27 @@ +body, html, div { + padding: 0; + margin: 0; + border: 0; +} +body, html { + height: 100%; + text-align: center; +} +html > body { + background: black; +} +div#toolbar { + background: white; + padding: 7px; + border-bottom: 1px solid black; +} +div#toolbar > .button { + border: 1px solid black; + padding: 2px; + cursor: default; + color: black; + text-decoration: none; +} +div#toolbar > .button:hover { + background: #CCCCCC; +} diff --git a/programs/firefoxextension/viewer.html b/programs/firefoxextension/viewer.html new file mode 100644 index 000000000..229c5514a --- /dev/null +++ b/programs/firefoxextension/viewer.html @@ -0,0 +1,20 @@ + + + + + ODF Viewer + + + +
+ download this document + + about WebODF + + get the source code +
+
+ + + + diff --git a/programs/firefoxextension/viewer.js b/programs/firefoxextension/viewer.js new file mode 100644 index 000000000..7393c5b8d --- /dev/null +++ b/programs/firefoxextension/viewer.js @@ -0,0 +1,43 @@ +/** + * Copyright (C) 2012 KO GmbH + * Copyright (C) 2026 Daniel Berthereau + * + * @licstart + * This file is part of WebODF. + * + * WebODF is free software: you can redistribute it and/or modify it under the + * terms of the GNU Affero General Public License (GNU AGPL) as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * WebODF is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License + * along with WebODF. If not, see . + * @licend + * + * @source: http://www.webodf.org/ + * @source: https://github.com/kogmbh/WebODF/ + */ + +/*global document, window, browser, odf, URLSearchParams*/ + +(function () { + "use strict"; + + var url = new URLSearchParams(window.location.search).get("file"); + + if (!url) { + return; + } + document.title = decodeURIComponent(url.split("/").pop()); + // The download goes through the background script, as the viewer holds no + // permission of its own. + document.getElementById("download").addEventListener("click", function () { + browser.runtime.sendMessage({action: "download", url: url}); + }); + new odf.OdfCanvas(document.getElementById("odf")).load(url); +}()); From 3885544a82b46210f767cded9dd42ab2e9771bd5 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 128/385] Fixed the errors jslint reports on the sources merged from the forks. --- webodf/lib/gui/ZoomHelper.js | 37 ++-- webodf/lib/odf/OdfCanvas.js | 362 ++++++++++++++++++++--------------- 2 files changed, 225 insertions(+), 174 deletions(-) diff --git a/webodf/lib/gui/ZoomHelper.js b/webodf/lib/gui/ZoomHelper.js index f37a1f909..83d58fae5 100644 --- a/webodf/lib/gui/ZoomHelper.js +++ b/webodf/lib/gui/ZoomHelper.js @@ -129,6 +129,7 @@ * @return {undefined} */ function applyCSSTransform(x, y, scale, is3D) { + /*jslint unparam: true*/ // Scale the page with the CSS `zoom` property rather than a CSS // transform. A transform promotes the (very tall) page onto a // composited GPU layer, which mobile WebViews rasterise in tiles; @@ -460,24 +461,6 @@ } }; - /** - * Enable or disable ZoomHelper's own touch-gesture handling - * (pinch-zoom and pan). When disabled, any attached listeners are - * removed and none are re-attached on subsequent setZoomableElement - * calls, leaving gestures to the host. Programmatic setZoomLevel is - * unaffected. - * @param {!boolean} enabled - * @return {undefined} - */ - this.setGestureSupportEnabled = function (enabled) { - gesturesEnabled = enabled; - if (enabled) { - registerGestureListeners(); - } else { - unregisterGestureListeners(); - } - }; - /** * Adds touchstart, touchmove, and touchend * event listeners to the element's scrollable @@ -508,6 +491,24 @@ } } + /** + * Enable or disable ZoomHelper's own touch-gesture handling + * (pinch-zoom and pan). When disabled, any attached listeners are + * removed and none are re-attached on subsequent setZoomableElement + * calls, leaving gestures to the host. Programmatic setZoomLevel is + * unaffected. + * @param {!boolean} enabled + * @return {undefined} + */ + this.setGestureSupportEnabled = function (enabled) { + gesturesEnabled = enabled; + if (enabled) { + registerGestureListeners(); + } else { + unregisterGestureListeners(); + } + }; + /** * @param {!function(!Error=)} callback, passing an error object in case of error * @return {undefined} diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 0db436e81..4f3882d4e 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -22,8 +22,9 @@ * @source: https://github.com/kogmbh/WebODF/ */ -/*global runtime, odf, xmldom, webodf_css, webodfcore, gui */ -/*jslint sub: true*/ +/*global runtime, odf, xmldom, webodf_css, webodfcore, gui, atob, Uint8Array */ +/*jslint sub: true, bitwise: true, continue: true, regexp: true, + unparam: true*/ (function () { "use strict"; @@ -175,7 +176,10 @@ /**@const@type {!string}*/presentationns = odf.Namespaces.presentationns, /**@const@type {!string}*/webodfhelperns = "urn:webodf:names:helper", xpath = xmldom.XPath, - domUtils = webodfcore.DomUtils; + domUtils = webodfcore.DomUtils, + /**@const@type{!Array.}*/ + chartPalette = ["#4f81bd", "#c0504d", "#9bbb59", "#8064a2", "#4bacc6", + "#f79646", "#5da5da", "#faa43a", "#60bd68", "#f17cb0"]; /** * @param {!HTMLStyleElement} style @@ -325,8 +329,8 @@ // origin (top-left, pre-rotation) lands at (x, y) and is rotated about // that origin. ODF rotation is counter-clockwise, so negate it for CSS. if (!x && !y && transform) { - tm = /translate\s*\(\s*([0-9.eE+-]+[a-z%]*)\s+([0-9.eE+-]+[a-z%]*)\s*\)/.exec(transform); - angle = /rotate\s*\(\s*([0-9.eE+-]+)\s*\)/.exec(transform); + tm = /translate\s*\(\s*([0-9.eE+\-]+[a-z%]*)\s+([0-9.eE+\-]+[a-z%]*)\s*\)/.exec(transform); + angle = /rotate\s*\(\s*([0-9.eE+\-]+)\s*\)/.exec(transform); if (tm) { tx = tm[1]; ty = tm[2]; @@ -495,10 +499,10 @@ * @return {undefined} */ function addObject(o) { - var /**@type{!number}*/i; - for (i = 0; i < objects.length; i += 1) { - if (!objects[i]) { - objects[i] = o; + var /**@type{!number}*/slot; + for (slot = 0; slot < objects.length; slot += 1) { + if (!objects[slot]) { + objects[slot] = o; return; } } @@ -932,6 +936,15 @@ } return null; } + /** + * Parse an ODF length ("7.112cm", "-3pt") into value + unit. + * @param {?string} value + * @return {!{v: !number, u: !string}} + */ + function parseLength(value) { + var m = /^(-?[0-9.]+)([a-z%]*)$/.exec((value || "").trim()); + return m ? { v: parseFloat(m[1]), u: m[2] || "" } : { v: 0, u: "" }; + } /** * Apply an image crop (fo:clip) to a draw:image. The frame's svg:width/height * is the visible (cropped) size; fo:clip gives the inset cut from each edge. @@ -1064,35 +1077,41 @@ pages = domUtils.getElementsByTagNameNS(odfbody, drawns, "page"), seen = {}, i; - for (i = 0; i < pages.length; i += 1) { - (function (styleName) { - var style, props = null, href, repeat; - if (!styleName || seen.hasOwnProperty(styleName)) { - return; - } - seen[styleName] = true; - // Walk the parent-style chain until a fill is specified. - style = findDrawingPageStyle(rootElement, styleName); - while (style) { - props = domUtils.getDirectChild(style, stylens, "drawing-page-properties"); - if (props && props.getAttributeNS(drawns, "fill")) { - break; - } - props = null; - style = findDrawingPageStyle(rootElement, - style.getAttributeNS(stylens, "parent-style-name")); - } - if (!props || props.getAttributeNS(drawns, "fill") !== "bitmap") { - return; - } - href = findFillImageHref(rootElement, - props.getAttributeNS(drawns, "fill-image-name")); - if (!href) { - return; + /** + * @param {?string} styleName + * @return {undefined} + */ + function addBackgroundOfPage(styleName) { + var style, props = null, href, repeat; + if (!styleName || seen.hasOwnProperty(styleName)) { + return; + } + seen[styleName] = true; + // Walk the parent-style chain until a fill is specified. + style = findDrawingPageStyle(rootElement, styleName); + while (style) { + props = domUtils.getDirectChild(style, stylens, "drawing-page-properties"); + if (props && props.getAttributeNS(drawns, "fill")) { + break; } - repeat = props.getAttributeNS(stylens, "repeat"); - setPageBackground(container, styleName, href, repeat, stylesheet); - }(pages[i].getAttributeNS(drawns, "style-name"))); + props = null; + style = findDrawingPageStyle(rootElement, + style.getAttributeNS(stylens, "parent-style-name")); + } + if (!props || props.getAttributeNS(drawns, "fill") !== "bitmap") { + return; + } + href = findFillImageHref(rootElement, + props.getAttributeNS(drawns, "fill-image-name")); + if (!href) { + return; + } + repeat = props.getAttributeNS(stylens, "repeat"); + setPageBackground(container, styleName, href, repeat, stylesheet); + } + + for (i = 0; i < pages.length; i += 1) { + addBackgroundOfPage(pages[i].getAttributeNS(drawns, "style-name")); } } /** @@ -1113,41 +1132,49 @@ masterStyles = rootElement.masterStyles, master = masterStyles && masterStyles.firstElementChild, selectorPrefix = '#shadowContent draw|page[draw|master-page-name="'; + /** + * @param {?string} name + * @param {?string} drawStyleName + * @return {undefined} + */ + function addBackgroundOfMasterPage(name, drawStyleName) { + var style = findDrawingPageStyle(rootElement, drawStyleName), + props = null, + fill, + color, + selector = selectorPrefix + name + '"]'; + while (style) { + props = domUtils.getDirectChild(style, stylens, "drawing-page-properties"); + if (props && props.getAttributeNS(drawns, "fill")) { + break; + } + props = null; + style = findDrawingPageStyle(rootElement, + style.getAttributeNS(stylens, "parent-style-name")); + } + if (!props) { + return; + } + fill = props.getAttributeNS(drawns, "fill"); + if (fill === "solid") { + color = props.getAttributeNS(drawns, "fill-color"); + if (color) { + stylesheet.insertRule(selector + " {background-color: " + color + + "; background-image: none;}", stylesheet.cssRules.length); + } + } else if (fill === "none") { + stylesheet.insertRule(selector + " {background: none;}", stylesheet.cssRules.length); + } + // Bitmap master fills are intentionally not painted here: the + // slide's own draw:page already carries its fill (see + // loadPageBackgrounds), and painting the master clone's bitmap + // as well makes the two overlap and ghost. + } + while (master) { if (master.namespaceURI === stylens && master.localName === "master-page") { - (function (name, drawStyleName) { - var style = findDrawingPageStyle(rootElement, drawStyleName), - props = null, - fill, - color, - selector = selectorPrefix + name + '"]'; - while (style) { - props = domUtils.getDirectChild(style, stylens, "drawing-page-properties"); - if (props && props.getAttributeNS(drawns, "fill")) { - break; - } - props = null; - style = findDrawingPageStyle(rootElement, - style.getAttributeNS(stylens, "parent-style-name")); - } - if (!props) { - return; - } - fill = props.getAttributeNS(drawns, "fill"); - if (fill === "solid") { - color = props.getAttributeNS(drawns, "fill-color"); - if (color) { - stylesheet.insertRule(selector + " {background-color: " + color - + "; background-image: none;}", stylesheet.cssRules.length); - } - } else if (fill === "none") { - stylesheet.insertRule(selector + " {background: none;}", stylesheet.cssRules.length); - } - // Bitmap master fills are intentionally not painted here: the - // slide's own draw:page already carries its fill (see - // loadPageBackgrounds), and painting the master clone's bitmap - // as well makes the two overlap and ghost. - }(master.getAttributeNS(stylens, "name"), master.getAttributeNS(drawns, "style-name"))); + addBackgroundOfMasterPage(master.getAttributeNS(stylens, "name"), + master.getAttributeNS(drawns, "style-name")); } master = master.nextElementSibling; } @@ -1212,7 +1239,11 @@ xstretch: 0, ystretch: 0, hasstroke: 1, hasfill: 1, pi: Math.PI }, node = geometry.firstElementChild, - /**@type{!{evaluate:function((!string|undefined)):!number,viewBox:!Array.,stretchX:!number,stretchY:!number}}*/ctx; + /**@type{!{evaluate:function((!string|undefined)):!number,viewBox:!Array.,stretchX:!number,stretchY:!number}}*/ctx, + // An equation may name another one, that names it back, so these + // two are declared before the functions that call them. + /**@type{!function((!string|undefined)):!number}*/resolve, + /**@type{!function(!string):!number}*/evaluateEquation; while (node) { if (node.namespaceURI === drawns && node.localName === "equation") { @@ -1226,7 +1257,10 @@ * @return {!number} */ function parseExpression(tokens) { - var /**@type{!number}*/pos = 0; + // The grammar is recursive: parseAddition is declared here, so that + // the functions it calls may call it back in turn. + var /**@type{!number}*/pos = 0, + /**@type{!function():!number}*/parseAddition; /** * @return {(!string|undefined)} @@ -1334,7 +1368,7 @@ /** * @return {!number} */ - function parseAddition() { return parseAdditionInner(); } + parseAddition = parseAdditionInner; return parseAddition(); } @@ -1344,7 +1378,7 @@ * @param {(!string|undefined)} token * @return {!number} */ - function resolve(token) { + resolve = function (token) { var /**@type{!number}*/value; if (token === undefined) { return 0; @@ -1361,7 +1395,7 @@ } value = parseFloat(token); return isNaN(value) ? 0 : value; - } + }; /** * Tokenize a formula/path value expression. @@ -1369,7 +1403,7 @@ * @return {!Array.} */ function tokenize(expression) { - var tokens = expression.match(/\?[a-zA-Z0-9]+|\$[0-9]+|[a-z]+|[0-9]*\.?[0-9]+|[()+\-*/,]/g); + var tokens = expression.match(/\?[a-zA-Z0-9]+|\$[0-9]+|[a-z]+|[0-9]*\.?[0-9]+|[()+\-*\/,]/g); return tokens || []; } @@ -1377,7 +1411,7 @@ * @param {!string} name * @return {!number} */ - function evaluateEquation(name) { + evaluateEquation = function (name) { var result; if (memo.hasOwnProperty(name)) { return memo[name]; @@ -1390,7 +1424,7 @@ inProgress[name] = false; memo[name] = result; return result; - } + }; ctx = { evaluate: resolve, @@ -1430,7 +1464,9 @@ /**@type{!boolean}*/prevOnPoint = false, /**@type{!number}*/offset = targetSize - viewBoxSize, /**@type{(!string|undefined)}*/cmd, - /**@type{!number}*/coord = 0; + /**@type{!number}*/coord = 0, + /**@type{!number}*/j = 0, + /**@type{!number}*/c = 0; while (pos < tokens.length) { cmd = tokens[pos]; if (!commandRe.test(cmd)) { pos += 1; continue; } @@ -1458,8 +1494,8 @@ if (cur === null) { // First point: take the side of the next off-point coordinate. cur = "L"; - for (var j = i + 1; j < n; j += 1) { - var c = horizontal ? raw[j].x : raw[j].y; + for (j = i + 1; j < n; j += 1) { + c = horizontal ? raw[j].x : raw[j].y; if (c < stretchPoint - 0.5) { cur = "L"; break; } if (c > stretchPoint + 0.5) { cur = "R"; break; } } @@ -1641,6 +1677,37 @@ curY = cy + ry * Math.sin(a1); } + /** + * Read the next point and make it the current one. + * @return {undefined} + */ + function moveToNextPoint() { + var p = nextPoint(); + curX = p[0]; + curY = p[1]; + } + /** + * Read the next point and draw a quadrant towards it. + * @param {!boolean} startAlongX + * @return {undefined} + */ + function quadrantToNextPoint(startAlongX) { + var p = nextPoint(); + quadrant(p[0], p[1], startAlongX); + } + /** + * Read an angle-ellipse and append it, from the current command. + * @return {undefined} + */ + function appendAngleEllipse() { + var ecx = val(), ecy = val(), erx = val(), ery = val(), + a0 = val() / 65536 * Math.PI / 180, + a1 = val() / 65536 * Math.PI / 180; + appendEllipticalArc(d, ecx, ecy, erx, ery, a0, a1, command === "U"); + curX = ecx + erx * Math.cos(a1); + curY = ecy + ery * Math.sin(a1); + } + while (pos < tokens.length) { command = tokens[pos]; if (!commandRe.test(command)) { @@ -1649,16 +1716,16 @@ pos += 1; switch (command) { case "M": - (function () { var p = nextPoint(); curX = p[0]; curY = p[1]; }()); + moveToNextPoint(); d.push("M" + curX + " " + curY); while (hasValue()) { - (function () { var p = nextPoint(); curX = p[0]; curY = p[1]; }()); + moveToNextPoint(); d.push("L" + curX + " " + curY); } break; case "L": while (hasValue()) { - (function () { var p = nextPoint(); curX = p[0]; curY = p[1]; }()); + moveToNextPoint(); d.push("L" + curX + " " + curY); } break; @@ -1678,12 +1745,12 @@ break; case "X": while (hasValue()) { - (function () { var p = nextPoint(); quadrant(p[0], p[1], true); }()); + quadrantToNextPoint(true); } break; case "Y": while (hasValue()) { - (function () { var p = nextPoint(); quadrant(p[0], p[1], false); }()); + quadrantToNextPoint(false); } break; case "A": // arcto, counter-clockwise, connect with line @@ -1701,14 +1768,7 @@ case "T": // angle-ellipse-to, connect with line case "U": // angle-ellipse, connect with move while (hasValue()) { - (function () { - var ecx = val(), ecy = val(), erx = val(), ery = val(), - a0 = val() / 65536 * Math.PI / 180, - a1 = val() / 65536 * Math.PI / 180; - appendEllipticalArc(d, ecx, ecy, erx, ery, a0, a1, command === "U"); - curX = ecx + erx * Math.cos(a1); - curY = ecy + ery * Math.sin(a1); - }()); + appendAngleEllipse(); } break; case "Z": @@ -2094,9 +2154,6 @@ // in a local table. We parse that and draw a static SVG (bar/line/pie/ring), // which is enough for a preview. - /**@const@type{!Array.}*/ - var chartPalette = ["#4f81bd", "#c0504d", "#9bbb59", "#8064a2", "#4bacc6", - "#f79646", "#5da5da", "#faa43a", "#60bd68", "#f17cb0"]; /** * @param {!string} s @@ -2240,27 +2297,6 @@ categories: data.categories, series: data.series }; } - /** - * A "nice" axis maximum and step for a value range 0..maxVal. - * @param {!number} maxVal - * @param {!boolean} preferExactMax - * @return {!{max:!number,step:!number}} - */ - function niceAxis(maxVal, preferExactMax) { - var /**@type{?{max:!number,step:!number}}*/exact, - target = (maxVal <= 0 ? 1 : maxVal) * (preferExactMax ? 1 : 1.05), - rough = target / 5, - pow = Math.pow(10, Math.floor(Math.log(rough) / Math.LN10)), - n = rough / pow, - step = (n <= 1 ? 1 : n <= 2 ? 2 : n <= 5 ? 5 : 10) * pow; - if (preferExactMax) { - exact = exactAxis(maxVal); - if (exact) { - return exact; - } - } - return { max: Math.ceil(target / step) * step, step: step }; - } /** * Prefer the data maximum when it already falls on a readable axis step. * @param {!number} maxVal @@ -2290,6 +2326,28 @@ return null; } + /** + * A "nice" axis maximum and step for a value range 0..maxVal. + * @param {!number} maxVal + * @param {!boolean} preferExactMax + * @return {!{max:!number,step:!number}} + */ + function niceAxis(maxVal, preferExactMax) { + var /**@type{?{max:!number,step:!number}}*/exact, + target = (maxVal <= 0 ? 1 : maxVal) * (preferExactMax ? 1 : 1.05), + rough = target / 5, + pow = Math.pow(10, Math.floor(Math.log(rough) / Math.LN10)), + n = rough / pow, + step = (n <= 1 ? 1 : n <= 2 ? 2 : n <= 5 ? 5 : 10) * pow; + if (preferExactMax) { + exact = exactAxis(maxVal); + if (exact) { + return exact; + } + } + return { max: Math.ceil(target / step) * step, step: step }; + } + /** * Render the parsed chart model to an SVG string at the given cm size. * @param {!{type:!string,title:!string,hasLegend:!boolean,categories:!Array.,series:!Array.,pointColors:!Array.}>}} c parsed chart model @@ -2328,6 +2386,26 @@ } return items; } + /** + * Legend at the right; returns its width and appends to body. + * @param {!Array.} items + * @param {!number} top + * @return {undefined} + */ + function drawLegend(items, top) { + var maxLen = 0, k, ly; + for (k = 0; k < items.length; k += 1) { + maxLen = Math.max(maxLen, items[k].label.length); + } + legendW = 22 + maxLen * 6.2; + for (k = 0; k < items.length; k += 1) { + ly = top + k * 18; + body += ''; + body += text(W - legendW + 16, ly + 10, items[k].label, "start", 11); + } + } + /** * Draw the legend of the series and return the maximum value. * @@ -2353,26 +2431,6 @@ } return maxVal; } - /** - * Legend at the right; returns its width and appends to body. - * @param {!Array.} items - * @param {!number} top - * @return {undefined} - */ - function drawLegend(items, top) { - var maxLen = 0, k, ly; - for (k = 0; k < items.length; k += 1) { - maxLen = Math.max(maxLen, items[k].label.length); - } - legendW = 22 + maxLen * 6.2; - for (k = 0; k < items.length; k += 1) { - ly = top + k * 18; - body += ''; - body += text(W - legendW + 16, ly + 10, items[k].label, "start", 11); - } - } - if (c.title) { body += text(W / 2, 18, c.title, "middle", 14, "bold"); } @@ -2497,15 +2555,6 @@ + '' + body + ''; } - /** - * Parse an ODF length ("7.112cm", "-3pt") into value + unit. - * @param {?string} value - * @return {!{v: !number, u: !string}} - */ - function parseLength(value) { - var m = /^(-?[0-9.]+)([a-z%]*)$/.exec((value || "").trim()); - return m ? { v: parseFloat(m[1]), u: m[2] || "" } : { v: 0, u: "" }; - } /** * Parse the viewBox of a draw:marker, with the default used by ODF. * @param {!Element} marker @@ -2820,16 +2869,16 @@ var doc = table.ownerDocument, ncols = domUtils.getElementsByTagNameNS(table, tablens, 'table-column').length, rows, - i, + row, count, c; if (!ncols) { return; } rows = domUtils.getElementsByTagNameNS(table, tablens, 'table-row'); - for (i = 0; i < rows.length; i += 1) { + for (row = 0; row < rows.length; row += 1) { count = 0; - c = rows[i].firstElementChild; + c = rows[row].firstElementChild; while (c) { if (c.namespaceURI === tablens && (c.localName === "table-cell" @@ -2838,8 +2887,9 @@ } c = c.nextElementSibling; } - for (; count < ncols; count += 1) { - rows[i].appendChild(doc.createElementNS(tablens, 'table:table-cell')); + while (count < ncols) { + rows[row].appendChild(doc.createElementNS(tablens, 'table:table-cell')); + count += 1; } } } @@ -3362,7 +3412,7 @@ } path = href.replace(/^\.?\//, "").replace(/\/$/, "") + "/content.xml"; container.getPartData(path, function (err, data) { - var /**@type{?Document}*/doc, + var /**@type{?Document}*/chartDoc, model, /**@type{!string}*/svg, /**@type{!{v: !number, u: !string}}*/w, @@ -3372,11 +3422,11 @@ return; } try { - doc = runtime.parseXML(runtime.byteArrayToString(data, "utf8")); - if (!doc) { + chartDoc = runtime.parseXML(runtime.byteArrayToString(data, "utf8")); + if (!chartDoc) { return; } - model = parseChart(doc); + model = parseChart(chartDoc); if (!model || !model.series.length) { return; } From 45343bfd5f8d2b83090952f740ed1587941f99d1 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 129/385] Packed the add-on of Firefox with both versions of the manifest. --- CMakeLists.txt | 5 ++ programs/firefoxextension/CMakeLists.txt | 74 +++++++++++-------- programs/firefoxextension/manifest-v2.json.in | 27 +++++++ .../{manifest.json.in => manifest-v3.json.in} | 2 +- 4 files changed, 77 insertions(+), 31 deletions(-) create mode 100644 programs/firefoxextension/manifest-v2.json.in rename programs/firefoxextension/{manifest.json.in => manifest-v3.json.in} (95%) diff --git a/CMakeLists.txt b/CMakeLists.txt index 91c5b43c5..3be2e94e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -373,8 +373,13 @@ set(WODOTEXTEDITORBUILDDIR ${CMAKE_CURRENT_BINARY_DIR}/wodotexteditor) set(WODOCOLLABTEXTEDITORBUILDDIR ${CMAKE_BINARY_DIR}/wodocollabtexteditor) set(WODOCOLLABTEXTEDITOR_ZIP ${CMAKE_CURRENT_BINARY_DIR}/wodocollabtexteditor-${WEBODF_VERSION}.zip) +# The add-on is packed twice, from the same scripts: the manifest version 3 +# needs Firefox 109, of 2023, and the version 2 reaches back to Firefox 48, of +# 2016. See "README-Products.md". set(FIREFOX_EXTENSION_ODFVIEWER_DIR ${CMAKE_CURRENT_BINARY_DIR}/firefox-extension-odfviewer-${WEBODF_VERSION}) set(FIREFOX_EXTENSION_ODFVIEWER ${FIREFOX_EXTENSION_ODFVIEWER_DIR}.xpi) +set(FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR ${CMAKE_CURRENT_BINARY_DIR}/firefox-extension-odfviewer-mv2-${WEBODF_VERSION}) +set(FIREFOX_EXTENSION_ODFVIEWER_MV2 ${FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR}.xpi) #################### diff --git a/programs/firefoxextension/CMakeLists.txt b/programs/firefoxextension/CMakeLists.txt index 8bc76dc25..cf11846f6 100644 --- a/programs/firefoxextension/CMakeLists.txt +++ b/programs/firefoxextension/CMakeLists.txt @@ -1,5 +1,5 @@ # The files that go into the extension, copied as they are. "webodf.js" comes -# from the build and "manifest.json" carries the version, see below. +# from the build and the manifest carries the version, see below. set(FIREFOXEXTENSIONFILES background.js viewer.html @@ -7,37 +7,51 @@ set(FIREFOXEXTENSIONFILES viewer.js skin/default/icon.png ) -configure_file(manifest.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest.json) -add_custom_command( - OUTPUT ${FIREFOX_EXTENSION_ODFVIEWER} - COMMAND ${CMAKE_COMMAND} -E remove_directory ${FIREFOX_EXTENSION_ODFVIEWER_DIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${FIREFOX_EXTENSION_ODFVIEWER_DIR}/skin/default - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/manifest.json ${FIREFOX_EXTENSION_ODFVIEWER_DIR} - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/webodf/webodf.js ${FIREFOX_EXTENSION_ODFVIEWER_DIR} - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/background.js - ${CMAKE_CURRENT_SOURCE_DIR}/viewer.html - ${CMAKE_CURRENT_SOURCE_DIR}/viewer.css - ${CMAKE_CURRENT_SOURCE_DIR}/viewer.js - ${FIREFOX_EXTENSION_ODFVIEWER_DIR} - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/skin/default/icon.png - ${FIREFOX_EXTENSION_ODFVIEWER_DIR}/skin/default - # An xpi is a zip whose manifest.json sits at its root. - COMMAND ${NODE} ARGS ${RUNTIMEJS} ${TOOLS_DIR}/zipdir.js - ${FIREFOX_EXTENSION_ODFVIEWER_DIR} - ${FIREFOX_EXTENSION_ODFVIEWER} - notopdir - DEPENDS ${NODE} - ${TOOLS_DIR}/zipdir.js - ${FIREFOXEXTENSIONFILES} - webodf.js-target - ${CMAKE_CURRENT_BINARY_DIR}/manifest.json - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} -) +configure_file(manifest-v3.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest-v3.json) +configure_file(manifest-v2.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest-v2.json) + +# Pack the add-on from one of the two manifests. The scripts are the same: +# only the manifest tells the version 2 from the version 3, see +# "README-Products.md". +macro(PACK_FIREFOX_EXTENSION xpi dir manifest) + add_custom_command( + OUTPUT ${xpi} + COMMAND ${CMAKE_COMMAND} -E remove_directory ${dir} + COMMAND ${CMAKE_COMMAND} -E make_directory ${dir}/skin/default + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_BINARY_DIR}/${manifest} ${dir}/manifest.json + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/webodf/webodf.js ${dir} + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/background.js + ${CMAKE_CURRENT_SOURCE_DIR}/viewer.html + ${CMAKE_CURRENT_SOURCE_DIR}/viewer.css + ${CMAKE_CURRENT_SOURCE_DIR}/viewer.js + ${dir} + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_CURRENT_SOURCE_DIR}/skin/default/icon.png + ${dir}/skin/default + # An xpi is a zip whose manifest.json sits at its root. + COMMAND ${NODE} ARGS ${RUNTIMEJS} ${TOOLS_DIR}/zipdir.js + ${dir} + ${xpi} + notopdir + DEPENDS ${NODE} + ${TOOLS_DIR}/zipdir.js + ${FIREFOXEXTENSIONFILES} + webodf.js-target + ${CMAKE_CURRENT_BINARY_DIR}/${manifest} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) +endmacro() + +PACK_FIREFOX_EXTENSION(${FIREFOX_EXTENSION_ODFVIEWER} + ${FIREFOX_EXTENSION_ODFVIEWER_DIR} manifest-v3.json) +PACK_FIREFOX_EXTENSION(${FIREFOX_EXTENSION_ODFVIEWER_MV2} + ${FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR} manifest-v2.json) -add_custom_target(build-firefoxextension DEPENDS ${FIREFOX_EXTENSION_ODFVIEWER}) +add_custom_target(build-firefoxextension + DEPENDS ${FIREFOX_EXTENSION_ODFVIEWER} ${FIREFOX_EXTENSION_ODFVIEWER_MV2}) add_custom_target(test-firefoxextension DEPENDS webodf.js-tests) diff --git a/programs/firefoxextension/manifest-v2.json.in b/programs/firefoxextension/manifest-v2.json.in new file mode 100644 index 000000000..4dcd9dee3 --- /dev/null +++ b/programs/firefoxextension/manifest-v2.json.in @@ -0,0 +1,27 @@ +{ + "manifest_version": 2, + "name": "ODF Viewer", + "version": "@WEBODF_VERSION@", + "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", + "author": "Daniel Berthereau", + "homepage_url": "http://webodf.org/", + "browser_specific_settings": { + "gecko": { + "id": "uriloader@webodf.js", + "strict_min_version": "48.0" + } + }, + "icons": { + "48": "skin/default/icon.png" + }, + "permissions": [ + "webRequest", + "webRequestBlocking", + "downloads", + "" + ], + "background": { + "scripts": ["background.js"] + }, + "web_accessible_resources": ["viewer.html"] +} diff --git a/programs/firefoxextension/manifest.json.in b/programs/firefoxextension/manifest-v3.json.in similarity index 95% rename from programs/firefoxextension/manifest.json.in rename to programs/firefoxextension/manifest-v3.json.in index ea4115801..0e4da39e3 100644 --- a/programs/firefoxextension/manifest.json.in +++ b/programs/firefoxextension/manifest-v3.json.in @@ -8,7 +8,7 @@ "browser_specific_settings": { "gecko": { "id": "uriloader@webodf.js", - "strict_min_version": "115.0" + "strict_min_version": "109.0" } }, "icons": { From 26e07cbc61c388797bba8b04509e2ccf095be614 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 130/385] Removed the deprecation warnings of cmake and of node. --- CMakeLists.txt | 19 +++++++++++++++---- webodf/lib/externs/JSZip.js | 9 ++++++++- webodf/lib/runtime.js | 6 +++--- webodf/tools/externs.js | 11 +++++++++++ 4 files changed, 37 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 53702ccba..6bc11d8e8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,6 +4,14 @@ cmake_minimum_required(VERSION 3.0.0) message("CMake version: ${CMAKE_VERSION}") +# The archives of the tools are downloaded from an url: the timestamps of the +# files they hold have to be the ones of the extraction, so that a change of +# the url rebuilds what depends on them. The policy is only set when it is +# known, as it was added by cmake 3.24. +if (POLICY CMP0135) + cmake_policy(SET CMP0135 NEW) +endif() + # WebODF is mostly a JavaScript project. CMake needs to know about the C++ parts project(WebODF C CXX) @@ -39,9 +47,10 @@ else (OVERRULED_WEBODF_VERSION) set(WEBODF_VERSION ${CMAKE_MATCH_1}) else (CMAKE_MATCH_1) # get version number from git - exec_program(git ${CMAKE_CURRENT_SOURCE_DIR} - ARGS describe --tags --dirty --match "v[0-9]*" - OUTPUT_VARIABLE GIT_WEBODF_VERSION) + execute_process(COMMAND git describe --tags --dirty --match "v[0-9]*" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + OUTPUT_VARIABLE GIT_WEBODF_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) # check version number from git string(REGEX MATCH "^v([0-9]+.[0-9]+.[0-9]+((-[0-9]+-[0-9a-z]+)?(-dirty)?)?)$" CHECKED_WEBODF_VERSION "${GIT_WEBODF_VERSION}") if (CMAKE_MATCH_1) @@ -159,7 +168,9 @@ else(WIN32) DOC "Path to Node.js executable" ) IF(NODEJS_EXECUTABLE) - EXEC_PROGRAM(${NODEJS_EXECUTABLE} ARGS --version OUTPUT_VARIABLE NODEJS_VERSION) + execute_process(COMMAND ${NODEJS_EXECUTABLE} --version + OUTPUT_VARIABLE NODEJS_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) string(SUBSTRING ${NODEJS_VERSION} 1 -1 NODEJS_VERSION) MESSAGE (STATUS "Installed Node.js found: ${NODEJS_EXECUTABLE} - ${NODEJS_VERSION}") ELSE(NODEJS_EXECUTABLE) diff --git a/webodf/lib/externs/JSZip.js b/webodf/lib/externs/JSZip.js index 4114ee5aa..00d654f18 100644 --- a/webodf/lib/externs/JSZip.js +++ b/webodf/lib/externs/JSZip.js @@ -595,7 +595,14 @@ module.exports = function(data, options) { (function (Buffer){ 'use strict'; module.exports = function(data, encoding){ - return new Buffer(data, encoding); + // Patched: new Buffer() is deprecated since node 10. The callers only pass + // a string or an array, never a size, so from() always applies. + // Patched: new Buffer() is deprecated since node 10. A number is a size + // to allocate, that alloc() also fills with zeroes, anything else is the + // content to copy. + return typeof data === "number" + ? Buffer.alloc(data) + : Buffer.from(data, encoding); }; module.exports.test = function(b){ return Buffer.isBuffer(b); diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 033231b8b..5a871a57d 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -946,7 +946,7 @@ function NodeJSRuntime() { * @return {!Uint8Array} */ this.byteArrayFromString = function (string, encoding) { - var buf = new Buffer(string, encoding), i, l = buf.length, + var buf = Buffer.from(string, encoding), i, l = buf.length, a = new Uint8Array(new ArrayBuffer(l)); for (i = 0; i < l; i += 1) { a[i] = buf[i]; @@ -1036,7 +1036,7 @@ function NodeJSRuntime() { * @return {undefined} */ this.writeFile = function (path, data, callback) { - var buf = new Buffer(data); + var buf = Buffer.from(data); path = pathmod.resolve(currentDirectory, path); fs.writeFile(path, buf, "binary", function (err) { callback(err || null); @@ -1065,7 +1065,7 @@ function NodeJSRuntime() { callback(err, null); return; } - var buffer = new Buffer(length); + var buffer = Buffer.alloc(length); fs.read(fd, buffer, 0, length, offset, function (err) { fs.close(fd); callback(err, bufferToUint8Array(buffer)); diff --git a/webodf/tools/externs.js b/webodf/tools/externs.js index 9dc37aff4..f5999d459 100644 --- a/webodf/tools/externs.js +++ b/webodf/tools/externs.js @@ -202,6 +202,17 @@ function Buffer(arg1, encoding) {"use strict"; } * @type{!number} */ Buffer.prototype.length = 0; +/** + * @param {!Array.|!string|!Uint8Array} source + * @param {!string=} encoding + * @return {!Buffer} + */ +Buffer.from = function (source, encoding) {"use strict"; }; +/** + * @param {!number} size + * @return {!Buffer} + */ +Buffer.alloc = function (size) {"use strict"; }; /** * @param {!string} msg * @return {undefined} From 42c66c8e360c3dc4dd8bcaf258f40d5a210342af Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 131/385] Rewritten the viewer of android without cordova. --- .gitignore | 6 + CMakeLists.txt | 26 ---- programs/CMakeLists.txt | 2 + programs/androidviewer/CMakeLists.txt | 42 +++++++ programs/androidviewer/build.gradle | 38 ++++++ programs/androidviewer/gradle.properties | 2 + programs/androidviewer/settings.gradle | 14 +++ .../src/main/AndroidManifest.xml | 39 ++++++ .../androidviewer/src/main/assets/index.css | 15 +++ .../androidviewer/src/main/assets/index.html | 15 +++ .../androidviewer/src/main/assets/index.js | 13 ++ .../org/webodf/viewer/ViewerActivity.java | 114 ++++++++++++++++++ .../src/main/res/mipmap/icon.png | Bin 0 -> 44606 bytes .../src/main/res/values/strings.xml | 4 + programs/cordova/CMakeLists.txt | 29 ++--- 15 files changed, 311 insertions(+), 48 deletions(-) create mode 100644 programs/androidviewer/CMakeLists.txt create mode 100644 programs/androidviewer/build.gradle create mode 100644 programs/androidviewer/gradle.properties create mode 100644 programs/androidviewer/settings.gradle create mode 100644 programs/androidviewer/src/main/AndroidManifest.xml create mode 100644 programs/androidviewer/src/main/assets/index.css create mode 100644 programs/androidviewer/src/main/assets/index.html create mode 100644 programs/androidviewer/src/main/assets/index.js create mode 100644 programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java create mode 100644 programs/androidviewer/src/main/res/mipmap/icon.png create mode 100644 programs/androidviewer/src/main/res/values/strings.xml diff --git a/.gitignore b/.gitignore index 647ca6c36..9709cc81d 100644 --- a/.gitignore +++ b/.gitignore @@ -46,3 +46,9 @@ coverage node_modules/* !node_modules/.package-lock.json !node_modules/@xmldom + +# The library is copied into the assets of the viewer of android. +programs/androidviewer/src/main/assets/webodf.js +programs/androidviewer/.gradle +programs/androidviewer/build +programs/androidviewer/local.properties diff --git a/CMakeLists.txt b/CMakeLists.txt index 1b0841896..720ef6517 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -233,32 +233,6 @@ add_custom_target(coverage # for, so that the library builds without them. option(WEBODF_PROGRAMS "Build the editors and the extensions of programs/" OFF) -# The apk of android is one more output of programs/cordova, so it is only -# looked for along with the programs. Nothing of that toolchain is available -# any more: it drives cordova 3.5, of 2014, that builds android with ant, -# which google dropped in 2015 for gradle, through the executable "android", -# that the sdk replaced by "sdkmanager" in 2018. It is kept as it is until -# programs/ is either brought up to date or dropped. -if (WEBODF_PROGRAMS) - # If android sdk is properly installed, cmake only needs to know where to find - # the executable 'android'. - # The variable ANDROID_SDK_DIR can be provided if a specific android sdk version - # is desired or if the android executable is not in the path. - if (ANDROID_SDK_DIR) - set(ANDROID ${ANDROID_SDK_DIR}/tools/android) - else (ANDROID_SDK_DIR) - find_program(ANDROID NAMES android DOC "Path to the Android executable.") - endif(ANDROID_SDK_DIR) - FIND_PROGRAM(ANT NAMES ant DOC "Path to the Ant executable.") - if(ANDROID AND ANT) - set(BUILD_APK TRUE) - message(STATUS "Found Android and Ant: building an APK for Android.") - message(STATUS "android: ${ANDROID}") - message(STATUS "ant: ${ANT}") - else() - message(STATUS "Android was not found: APK will not be built.") - endif() -endif () # Dojo diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index ee7887969..a0809373a 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -11,3 +11,5 @@ add_subdirectory(odfviewer-webext) add_subdirectory(benchmark) add_subdirectory(editor) add_subdirectory(cordova) + +add_subdirectory(androidviewer) diff --git a/programs/androidviewer/CMakeLists.txt b/programs/androidviewer/CMakeLists.txt new file mode 100644 index 000000000..27358269d --- /dev/null +++ b/programs/androidviewer/CMakeLists.txt @@ -0,0 +1,42 @@ +# The viewer of android is a web view that shows a document with WebODF. It +# replaces the one of programs/cordova, that drove cordova 3.5, of 2014, and +# built with ant, which google dropped in 2015 for gradle. +# +# It is opt-in, as it needs the sdk of android and a jdk, that the build does +# not download: gradle reads the sdk from $ANDROID_HOME, or from the file +# "local.properties" that the sdk writes. +option(WEBODF_ANDROID "Build the viewer of android, that needs its sdk" OFF) + +if (WEBODF_ANDROID) + find_program(GRADLE NAMES gradle DOC "Path to the Gradle executable.") + if (NOT GRADLE) + message(FATAL_ERROR "gradle was not found, so the viewer of android" + " cannot be built. On Debian: apt-get install gradle") + endif() + + set(ANDROIDVIEWER_APK + ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/androidviewer-release-unsigned.apk) + + add_custom_command( + OUTPUT ${ANDROIDVIEWER_APK} + # The library is read from the assets, as the page is. + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_BINARY_DIR}/webodf/webodf.js + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/webodf.js + COMMAND ${GRADLE} --project-dir ${CMAKE_CURRENT_SOURCE_DIR} + --project-cache-dir ${CMAKE_CURRENT_BINARY_DIR}/.gradle + -PwebodfVersion=${WEBODF_MANIFEST_VERSION} + -PbuildDir=${CMAKE_CURRENT_BINARY_DIR}/build + assembleRelease + DEPENDS webodf.js-target + ${CMAKE_CURRENT_SOURCE_DIR}/build.gradle + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/AndroidManifest.xml + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/java/org/webodf/viewer/ViewerActivity.java + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/index.html + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/index.js + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/index.css + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + + add_custom_target(product-androidviewer DEPENDS ${ANDROIDVIEWER_APK}) +endif () diff --git a/programs/androidviewer/build.gradle b/programs/androidviewer/build.gradle new file mode 100644 index 000000000..1eefaafb2 --- /dev/null +++ b/programs/androidviewer/build.gradle @@ -0,0 +1,38 @@ +// The viewer is a web view that shows a document with WebODF: no framework, +// no plugin, only the library and a page, both read from the assets. The +// library is copied there by cmake, see CMakeLists.txt. +plugins { + id 'com.android.application' version '8.7.3' +} + +android { + namespace 'org.webodf.viewer' + compileSdk 35 + + defaultConfig { + applicationId 'org.webodf.viewer' + // 21 is the oldest release the build tools still support, and the + // web view of every release since then reads what the library needs. + minSdk 21 + targetSdk 35 + versionCode 1 + versionName project.findProperty('webodfVersion') ?: '0.0.0' + } + + buildTypes { + release { + minifyEnabled false + } + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_17 + targetCompatibility JavaVersion.VERSION_17 + } +} + +dependencies { + // Serves the assets and the cache over https, so that the page may read + // the document with XMLHttpRequest. + implementation 'androidx.webkit:webkit:1.12.1' +} diff --git a/programs/androidviewer/gradle.properties b/programs/androidviewer/gradle.properties new file mode 100644 index 000000000..c33552957 --- /dev/null +++ b/programs/androidviewer/gradle.properties @@ -0,0 +1,2 @@ +android.useAndroidX=true +org.gradle.jvmargs=-Xmx2g diff --git a/programs/androidviewer/settings.gradle b/programs/androidviewer/settings.gradle new file mode 100644 index 000000000..2fbdb606d --- /dev/null +++ b/programs/androidviewer/settings.gradle @@ -0,0 +1,14 @@ +pluginManagement { + repositories { + google() + mavenCentral() + gradlePluginPortal() + } +} +dependencyResolutionManagement { + repositories { + google() + mavenCentral() + } +} +rootProject.name = 'ODFViewer' diff --git a/programs/androidviewer/src/main/AndroidManifest.xml b/programs/androidviewer/src/main/AndroidManifest.xml new file mode 100644 index 000000000..6589e6586 --- /dev/null +++ b/programs/androidviewer/src/main/AndroidManifest.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/programs/androidviewer/src/main/assets/index.css b/programs/androidviewer/src/main/assets/index.css new file mode 100644 index 000000000..3e2fc9ca4 --- /dev/null +++ b/programs/androidviewer/src/main/assets/index.css @@ -0,0 +1,15 @@ +body, html, div { + padding: 0; + margin: 0; + border: 0; +} +body, html { + height: 100%; + background: #333; +} +div#message { + padding: 1em; + font-family: sans-serif; + color: white; + text-align: center; +} diff --git a/programs/androidviewer/src/main/assets/index.html b/programs/androidviewer/src/main/assets/index.html new file mode 100644 index 000000000..d98eef03d --- /dev/null +++ b/programs/androidviewer/src/main/assets/index.html @@ -0,0 +1,15 @@ + + + + + + ODF Viewer + + + +
Open a document in the OpenDocument format to read it.
+
+ + + + diff --git a/programs/androidviewer/src/main/assets/index.js b/programs/androidviewer/src/main/assets/index.js new file mode 100644 index 000000000..f8f44a51c --- /dev/null +++ b/programs/androidviewer/src/main/assets/index.js @@ -0,0 +1,13 @@ +/*global document, window, odf, URLSearchParams*/ + +(function () { + "use strict"; + + var url = new URLSearchParams(window.location.search).get("file"); + + if (!url) { + return; + } + document.getElementById("message").style.display = "none"; + new odf.OdfCanvas(document.getElementById("odf")).load(url); +}()); diff --git a/programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java b/programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java new file mode 100644 index 000000000..6105c33af --- /dev/null +++ b/programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java @@ -0,0 +1,114 @@ +/** + * Copyright (C) 2026 Daniel Berthereau + * + * @licstart + * This file is part of WebODF. + * + * WebODF is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License (GNU AGPL) + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * WebODF is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with WebODF. If not, see . + * @licend + * + * @source: http://www.webodf.org/ + * @source: https://github.com/kogmbh/WebODF/ + */ + +package org.webodf.viewer; + +import android.app.Activity; +import android.content.Intent; +import android.net.Uri; +import android.os.Bundle; +import android.webkit.WebView; +import android.webkit.WebViewClient; +import androidx.webkit.WebViewAssetLoader; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * Show a document in the OpenDocument format with WebODF, in a web view. + * + * The page and the library are read from the assets, and the document the + * system hands over is copied into the directory of the cache, as it comes as + * a "content://" uri that the web view may not read by itself. + * + * Everything is served over "https://webodf.invalid/", by the asset loader: + * a page loaded from "file://" may not read another file with XMLHttpRequest, + * which is how the library reads a document. + */ +public class ViewerActivity extends Activity { + + private static final String DOMAIN = "webodf.invalid"; + private static final String CACHED = "document.odf"; + + /** + * Copy the document into the cache, so that it is served as a file of its + * own. + */ + private boolean cache(Uri uri) { + File target = new File(getCacheDir(), CACHED); + try (InputStream in = getContentResolver().openInputStream(uri); + OutputStream out = new FileOutputStream(target)) { + if (in == null) { + return false; + } + byte[] buffer = new byte[16384]; + int read = in.read(buffer); + while (read > 0) { + out.write(buffer, 0, read); + read = in.read(buffer); + } + return true; + } catch (IOException e) { + return false; + } + } + + @Override + protected void onCreate(Bundle state) { + super.onCreate(state); + + WebViewAssetLoader loader = new WebViewAssetLoader.Builder() + .setDomain(DOMAIN) + .addPathHandler("/assets/", + new WebViewAssetLoader.AssetsPathHandler(this)) + .addPathHandler("/cache/", + new WebViewAssetLoader.InternalStoragePathHandler( + this, getCacheDir())) + .build(); + + WebView view = new WebView(this); + view.getSettings().setJavaScriptEnabled(true); + view.setWebViewClient(new WebViewClient() { + @Override + public android.webkit.WebResourceResponse shouldInterceptRequest( + WebView webView, android.webkit.WebResourceRequest request) { + return loader.shouldInterceptRequest(request.getUrl()); + } + }); + setContentView(view); + + String page = "https://" + DOMAIN + "/assets/index.html"; + Intent intent = getIntent(); + Uri uri = (intent == null) + ? null + : intent.getData(); + if (uri != null && cache(uri)) { + page += "?file=/cache/" + CACHED; + } + view.loadUrl(page); + } +} diff --git a/programs/androidviewer/src/main/res/mipmap/icon.png b/programs/androidviewer/src/main/res/mipmap/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..94d7d8da5defc1d587cbbd4e8ef7cdc1901ca6d9 GIT binary patch literal 44606 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 literal 0 HcmV?d00001 diff --git a/programs/androidviewer/src/main/res/values/strings.xml b/programs/androidviewer/src/main/res/values/strings.xml new file mode 100644 index 000000000..5672dedc4 --- /dev/null +++ b/programs/androidviewer/src/main/res/values/strings.xml @@ -0,0 +1,4 @@ + + + ODF Viewer + diff --git a/programs/cordova/CMakeLists.txt b/programs/cordova/CMakeLists.txt index 4a313d606..283fe56ea 100644 --- a/programs/cordova/CMakeLists.txt +++ b/programs/cordova/CMakeLists.txt @@ -4,10 +4,13 @@ # or dropped: cordova only wraps "webodf.js" in a web view, so what has to be # written again is the packaging, not anything of WebODF. # -# - product-androidviewer drives cordova 3.5, of 2014, that builds android -# with ant, dropped by google in 2015 for gradle. -# - product-firefoxosviewer packs it for Firefox OS, that Mozilla abandoned in -# 2016, but that lives on through its forks, B2G OS, KaiOS and Capyloon. +# product-firefoxosviewer packs the viewer for Firefox OS, that Mozilla +# abandoned in 2016, but that lives on through its forks, B2G OS, KaiOS and +# Capyloon. It does not build any more: cordova 3.5, of 2014, is asked for +# below. +# +# The apk of android was packed here as well, and is built by +# programs/androidviewer now. configure_file(config.xml.in config.xml) configure_file(manifest.webapp.in manifest.webapp) @@ -67,24 +70,6 @@ add_custom_command( WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/WebODF ) -if(BUILD_APK) - # build the android apk - add_custom_command( - OUTPUT WebODF/platforms/android/ant-build/WebODF-debug.apk - COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different - ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/AndroidManifest.xml - ${CMAKE_CURRENT_BINARY_DIR}/WebODF/platforms/android/AndroidManifest.xml - COMMAND ${CMAKE_COMMAND} ARGS -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/WebODF/platforms/android/res/ - COMMAND ${CMAKE_COMMAND} ARGS -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/res/ ${CMAKE_CURRENT_BINARY_DIR}/WebODF/platforms/android/res/ - COMMAND ${CMAKE_COMMAND} ARGS -E remove_directory ${CMAKE_CURRENT_BINARY_DIR}/WebODF/platforms/android/src/org/webodf/ - COMMAND ${CMAKE_COMMAND} ARGS -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/platforms/android/src/org/webodf/ ${CMAKE_CURRENT_BINARY_DIR}/WebODF/platforms/android/src/org/webodf/ - COMMAND ${CORDOVA} build android - DEPENDS WebODF/merges/config.xml - ${CMAKE_CURRENT_BINARY_DIR}/WebODF/plugins/android.json - WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/WebODF - ) - add_custom_target(product-androidviewer DEPENDS WebODF/platforms/android/ant-build/WebODF-debug.apk) -endif() # build the firefoxos package add_custom_command( From 2687ce8c3fc5a054b8a36b68c0de2e2a91ee3725 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 132/385] Made the packages of the add-on pass the linter of addons.mozilla.org. --- CMakeLists.txt | 8 ++++++++ programs/firefoxextension/manifest-v2.json.in | 9 ++++++--- programs/firefoxextension/manifest-v3.json.in | 7 +++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3be2e94e8..73bfc13a2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -59,6 +59,14 @@ else (OVERRULED_WEBODF_VERSION) endif (OVERRULED_WEBODF_VERSION) message(STATUS "WebODF version " ${WEBODF_VERSION}) +# The manifest of an add-on only takes up to four numbers separated by dots, +# where git describe adds the number of commits and the hash of the last one: +# "0.5.10-161-gc2572a4a" is written "0.5.10.161", so that the builds between +# two tags still follow each other. A tagged build is left as it is. +string(REGEX REPLACE "^([0-9]+(\\.[0-9]+)*)-([0-9]+)-g[0-9a-f]+.*$" "\\1.\\3" + WEBODF_MANIFEST_VERSION "${WEBODF_VERSION}") +string(REGEX REPLACE "-dirty$" "" WEBODF_MANIFEST_VERSION "${WEBODF_MANIFEST_VERSION}") + ######################################################### ## Find installed dependencies diff --git a/programs/firefoxextension/manifest-v2.json.in b/programs/firefoxextension/manifest-v2.json.in index 4dcd9dee3..90287371c 100644 --- a/programs/firefoxextension/manifest-v2.json.in +++ b/programs/firefoxextension/manifest-v2.json.in @@ -1,18 +1,21 @@ { "manifest_version": 2, "name": "ODF Viewer", - "version": "@WEBODF_VERSION@", + "version": "@WEBODF_MANIFEST_VERSION@", "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "browser_specific_settings": { "gecko": { "id": "uriloader@webodf.js", - "strict_min_version": "48.0" + "data_collection_permissions": { + "required": ["none"] + }, + "strict_min_version": "52.0" } }, "icons": { - "48": "skin/default/icon.png" + "238": "skin/default/icon.png" }, "permissions": [ "webRequest", diff --git a/programs/firefoxextension/manifest-v3.json.in b/programs/firefoxextension/manifest-v3.json.in index 0e4da39e3..6419d36a3 100644 --- a/programs/firefoxextension/manifest-v3.json.in +++ b/programs/firefoxextension/manifest-v3.json.in @@ -1,18 +1,21 @@ { "manifest_version": 3, "name": "ODF Viewer", - "version": "@WEBODF_VERSION@", + "version": "@WEBODF_MANIFEST_VERSION@", "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "browser_specific_settings": { "gecko": { "id": "uriloader@webodf.js", + "data_collection_permissions": { + "required": ["none"] + }, "strict_min_version": "109.0" } }, "icons": { - "48": "skin/default/icon.png" + "238": "skin/default/icon.png" }, "permissions": [ "webRequest", From ca1cb11ea3ab040c4124fc5084c113ff48ff1832 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 133/385] Declared the range of the versions of cmake the project works with. --- CMakeLists.txt | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 6bc11d8e8..daed126d4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,14 @@ # This makefile 'compiles' WebODF using various tools, instruments the code and # builds and packages programs that use WebODF. -cmake_minimum_required(VERSION 3.0.0) +# The project needs cmake 3.10 and works with the policies of cmake 3.24. The +# most useful of them is CMP0135: the archives of the tools are downloaded +# from an url, so the timestamps of the files they hold have to be the ones of +# the extraction, otherwise a change of the url does not rebuild what depends +# on them. Older versions of cmake read the range as its first version only. +cmake_minimum_required(VERSION 3.10...3.24) message("CMake version: ${CMAKE_VERSION}") -# The archives of the tools are downloaded from an url: the timestamps of the -# files they hold have to be the ones of the extraction, so that a change of -# the url rebuilds what depends on them. The policy is only set when it is -# known, as it was added by cmake 3.24. -if (POLICY CMP0135) - cmake_policy(SET CMP0135 NEW) -endif() - # WebODF is mostly a JavaScript project. CMake needs to know about the C++ parts project(WebODF C CXX) From 9459b83e1b346c9173cde422606e55855c273d81 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 134/385] Declared the java packages exposed by Rhino as values, not as types. --- webodf/tools/externs.js | 215 +++++++++++++++++++-------------- webodf/tools/externs/window.js | 1 + 2 files changed, 126 insertions(+), 90 deletions(-) diff --git a/webodf/tools/externs.js b/webodf/tools/externs.js index b71843bbc..5b8fce922 100644 --- a/webodf/tools/externs.js +++ b/webodf/tools/externs.js @@ -211,173 +211,208 @@ function readFile(path, encoding) {"use strict"; } * @return {undefined} */ function quit(exitCode) {"use strict"; } +// The java packages that Rhino exposes to the scripts it runs. The variable +// itself is declared in "externs/window.js". Only the classes and the methods +// used by RhinoRuntime are declared below. The namespaces are plain objects: a +// typedef would declare a type, not a value, and the classes below it would be +// unknown. + /** - * @typedef {!Object} + * @const {!Object} */ -Packages.java; +Packages.java = {}; + /** - * @typedef {!Object} + * @const {!Object} */ -Packages.java.io; +Packages.java.io = {}; + /** * @constructor - * @extends Packages.java.io.Reader + * @param {!string} path + */ +Packages.java.io.File = function (path) {"use strict"; }; + +/** + * @return {!boolean} + */ +Packages.java.io.File.prototype.isFile = function () {"use strict"; }; + +/** + * @return {!boolean} + */ +Packages.java.io.File.prototype['delete'] = function () {"use strict"; }; + +/** + * @param {!Packages.java.io.File} other + * @return {!boolean} + */ +Packages.java.io.File.prototype.rename = function (other) {"use strict"; }; + +/** + * @return {undefined} + */ +Packages.java.io.File.prototype.deleteOnExit = function () {"use strict"; }; + +/** + * @return {!number} + */ +Packages.java.io.File.prototype.length = function () {"use strict"; }; + +/** + * @constructor + */ +Packages.java.io.Reader = function () {"use strict"; }; + +/** + * @constructor + * @extends {Packages.java.io.Reader} * @param {!string} path */ Packages.java.io.FileReader = function (path) {"use strict"; }; + /** - * @typedef {!Object} + * @constructor + * @extends {Packages.java.io.Reader} + * @param {!string} string */ -Packages.javax; +Packages.java.io.StringReader = function (string) {"use strict"; }; + /** - * @namespace + * @constructor + * @param {!string} path + */ +Packages.java.io.FileOutputStream = function (path) {"use strict"; }; + +/** + * @param {!number} b + * @return {undefined} + */ +Packages.java.io.FileOutputStream.prototype.write = function (b) {"use strict"; }; + +/** + * @return {undefined} + */ +Packages.java.io.FileOutputStream.prototype.close = function () {"use strict"; }; + +/** + * @const {!Object} + */ +Packages.javax = {}; + +/** + * @const {!Object} */ Packages.javax.xml = {}; + /** - * @namespace + * @const {!Object} */ Packages.javax.xml.validation = {}; + /** * @constructor */ Packages.javax.xml.validation.Schema = function () {"use strict"; }; + /** - * @namespace + * @const {!Object} */ Packages.javax.xml.parsers = {}; + /** * @constructor */ Packages.javax.xml.parsers.DocumentBuilder = function () {"use strict"; }; + /** - * @param {!Object} entityresolver + * @param {!Object} entityResolver * @return {undefined} */ Packages.javax.xml.parsers.DocumentBuilder.prototype.setEntityResolver = - function (entityresolver) {"use strict"; }; + function (entityResolver) {"use strict"; }; + /** * @param {!Packages.org.xml.sax.InputSource|!Packages.java.io.File} source - * @return {?Document} + * @return {!Document} */ Packages.javax.xml.parsers.DocumentBuilder.prototype.parse = function (source) {"use strict"; }; + /** - * @return {DOMImplementation} + * @return {!DOMImplementation} */ Packages.javax.xml.parsers.DocumentBuilder.prototype.getDOMImplementation = function () {"use strict"; }; + /** * @constructor */ Packages.javax.xml.parsers.DocumentBuilderFactory = function () {"use strict"; }; -/** - * @constructor - */ -Packages.DocumentBuilderFactory = function () {"use strict"; }; -/** - * @return {!Packages.javax.xml.parsers.DocumentBuilderFactory} - */ -Packages.newInstance = function () {"use strict"; }; + /** * @return {!Packages.javax.xml.parsers.DocumentBuilderFactory} */ -Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance = function () {"use strict"; }; +Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance = + function () {"use strict"; }; + /** - * @param {!boolean} value + * @param {!boolean} validating + * @return {undefined} */ Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.setValidating = - function (value) {"use strict"; }; + function (validating) {"use strict"; }; + /** - * @param {!boolean} value + * @param {!boolean} namespaceAware + * @return {undefined} */ Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.setNamespaceAware = - function (value) {"use strict"; }; + function (namespaceAware) {"use strict"; }; + /** - * @param {!boolean} value + * @param {!boolean} expandEntityReferences + * @return {undefined} */ Packages.javax.xml.parsers.DocumentBuilderFactory.prototype - .setExpandEntityReferences = function (value) {"use strict"; }; + .setExpandEntityReferences = function (expandEntityReferences) {"use strict"; }; + /** * @param {?Packages.javax.xml.validation.Schema} schema + * @return {undefined} */ Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.setSchema = function (schema) {"use strict"; }; + /** * @return {!Packages.javax.xml.parsers.DocumentBuilder} */ Packages.javax.xml.parsers.DocumentBuilderFactory.prototype.newDocumentBuilder = function () {"use strict"; }; + /** - * @typedef {!Object} + * @const {!Object} */ -Packages.org; +Packages.org = {}; + /** - * @namespace + * @const {!Object} + */ +Packages.org.xml = {}; + +/** + * @const {!Object} */ Packages.org.xml.sax = {}; + /** + * Rhino builds an implementation of the java interface from an object holding + * its methods, so it is called without "new". * @param {!Object} definition * @return {!Object} */ Packages.org.xml.sax.EntityResolver = function (definition) {"use strict"; }; -/** - * @typedef {!Object} - */ -Packages.java; -/** - * @namespace - */ -Packages.java.io = {}; -/** - * @constructor - * @param {!string} path - */ -Packages.java.io.File = function (path) {"use strict"; }; -/** - * @return {!boolean} - */ -Packages.java.io.File.prototype.isFile = function () {"use strict"; }; -/** - * @return {!boolean} - */ -Packages.java.io.File.prototype['delete'] = function () {"use strict"; }; -/** - * @param {!Packages.java.io.File} other - * @return {!boolean} - */ -Packages.java.io.File.prototype.rename = function (other) {"use strict"; }; -/** - * @return {undefined} - */ -Packages.java.io.File.prototype.deleteOnExit = function () {"use strict"; }; -/** - * @return {!number} - */ -Packages.java.io.File.prototype.length = function () {"use strict"; }; -/** - * @constructor - */ -Packages.java.io.Reader = function () {"use strict"; }; -/** - * @constructor - * @extends Packages.java.io.Reader - * @param {!string} string - */ -Packages.java.io.StringReader = function (string) {"use strict"; }; -/** - * @constructor - * @param {!string} path - */ -Packages.java.io.FileOutputStream = function (path) {"use strict"; }; -/** - * @param {!number} b - * @return {undefined} - */ -Packages.java.io.FileOutputStream.prototype.write = function (b) {"use strict"; }; -/** - * @return {undefined} - */ -Packages.java.io.FileOutputStream.prototype.close = function () {"use strict"; }; + /** * @constructor * @param {!Packages.java.io.Reader|!string} reader diff --git a/webodf/tools/externs/window.js b/webodf/tools/externs/window.js index 34e3945c1..679240c46 100644 --- a/webodf/tools/externs/window.js +++ b/webodf/tools/externs/window.js @@ -98,6 +98,7 @@ var JavaObject; var JavaPackage; /** + * @const {!Object} * @see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Packages */ var Packages; From 1d6737f19a52225f23e231735edc2d98fc535b43 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 135/385] Fixed the declaration of the dom of xmldom, seen as a cycle by the compiler. --- scripts/check.js | 2 +- scripts/lib/closure.js | 26 ++++++++++++++++++++++++-- webodf/tools/externs.js | 20 ++++++++++++-------- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/scripts/check.js b/scripts/check.js index 4eeaf0b56..31d9e769a 100644 --- a/scripts/check.js +++ b/scripts/check.js @@ -72,7 +72,7 @@ function flags(files) { "--hide_warnings_for=synthetic", "--summary_detail_level", "3" ]; - closure.errorGroups.forEach(function (group) { + closure.errorGroupsFor(closure.version).forEach(function (group) { list.push("--jscomp_error", group); }); closure.offGroups.forEach(function (group) { diff --git a/scripts/lib/closure.js b/scripts/lib/closure.js index d3d61798f..5c5c468b5 100644 --- a/scripts/lib/closure.js +++ b/scripts/lib/closure.js @@ -11,8 +11,7 @@ var fs = require("fs"), https = require("https"), rootDir = path.resolve(__dirname, "../.."), toolsDir = path.join(rootDir, ".tools"), - // Version the sources are validated against. - version = "v20160911", + version = process.env.CLOSURE_VERSION || "v20160911", jarName = "closure-compiler-" + version + ".jar", jarPath = path.join(toolsDir, jarName), jarUrl = "https://repo1.maven.org/maven2/com/google/javascript/closure-compiler/" @@ -58,6 +57,13 @@ function jar() { // ambiguousFunctionDecl, checkEventfulObjectDisposal, es3, fileoverviewTags, // internetExplorerChecks, missingGetCssName, newCheckTypes, undefinedNames, // unusedPrivateMembers and useOfGoogBase. +// Groups removed from the compilers newer than 2016. +var removedGroups = [ + "ambiguousFunctionDecl", "checkEventfulObjectDisposal", "es3", + "fileoverviewTags", "internetExplorerChecks", "missingGetCssName", + "newCheckTypes", "undefinedNames", "unusedPrivateMembers", "useOfGoogBase" +]; + var errorGroups = [ "accessControls", "ambiguousFunctionDecl", "checkEventfulObjectDisposal", "checkRegExp", "checkTypes", "checkVars", @@ -75,6 +81,22 @@ var errorGroups = [ var offGroups = ["missingRequire", "nonStandardJsDocs"]; +/** + * Groups of checks to report as errors, without the ones the given version of + * the compiler does not know any more. + * @return {!Array.} + */ +function errorGroupsFor(compilerVersion) { + if (compilerVersion === "v20160911") { + return errorGroups; + } + return errorGroups.filter(function (group) { + return removedGroups.indexOf(group) === -1; + }); +} + exports.jar = jar; +exports.version = version; +exports.errorGroupsFor = errorGroupsFor; exports.errorGroups = errorGroups; exports.offGroups = offGroups; diff --git a/webodf/tools/externs.js b/webodf/tools/externs.js index f50df14fa..b71843bbc 100644 --- a/webodf/tools/externs.js +++ b/webodf/tools/externs.js @@ -118,18 +118,22 @@ NodeJSObject.prototype.close = function (fd, callback) {"use strict"; }; */ function XmlDom() {"use strict"; } /** - * @constructor - * @extends DOMParser + * The package exports the constructors of the dom interfaces it implements. + * They are not declared as classes extending them, else the compiler sees a + * cycle in the inheritance: the name of the property is the name of the type. + * @type {function(new:DOMParser)} */ -XmlDom.prototype.DOMParser = function () {"use strict"; }; +XmlDom.prototype.DOMParser; /** - * @constructor - * @extends DOMImplementation + * @type {function(new:DOMImplementation)} */ -XmlDom.prototype.DOMImplementation = function () {"use strict"; }; +XmlDom.prototype.DOMImplementation; /** + * The constructor of the nodes of the dom of the package, whose prototype gets + * the properties missing outside of a browser. It does not extend Node: the + * name of the property is the name of the type, and the compiler would see a + * cycle in the inheritance. * @constructor - * @extends Node */ XmlDom.prototype.Node = function () {"use strict"; }; /** @@ -657,7 +661,7 @@ var global = {}; /** * The dom interfaces that a browser exposes globally, added to the global * object of NodeJS by the runtime. - * @type {(function(new:Node)|undefined)} + * @type {(!Function|undefined)} */ global.Node; From d79ac9a96a519e23ed477cfacbc91729607b3ce8 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 136/385] Downloaded gradle to build the viewer of android. --- programs/androidviewer/CMakeLists.txt | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/programs/androidviewer/CMakeLists.txt b/programs/androidviewer/CMakeLists.txt index 27358269d..f765cc068 100644 --- a/programs/androidviewer/CMakeLists.txt +++ b/programs/androidviewer/CMakeLists.txt @@ -3,16 +3,25 @@ # built with ant, which google dropped in 2015 for gradle. # # It is opt-in, as it needs the sdk of android and a jdk, that the build does -# not download: gradle reads the sdk from $ANDROID_HOME, or from the file -# "local.properties" that the sdk writes. +# not download: gradle reads the sdk from $ANDROID_HOME, the directory the sdk +# is installed in, or from "sdk.dir" of the file "local.properties". option(WEBODF_ANDROID "Build the viewer of android, that needs its sdk" OFF) if (WEBODF_ANDROID) - find_program(GRADLE NAMES gradle DOC "Path to the Gradle executable.") - if (NOT GRADLE) - message(FATAL_ERROR "gradle was not found, so the viewer of android" - " cannot be built. On Debian: apt-get install gradle") - endif() + # Gradle is downloaded, as the closure compiler and Rhino are: the plugin + # of android needs 8.9 or later, where Debian 13 packages the 4.4.1 of + # 2017, so the one of the distribution is never the right one. + set(GRADLE_VERSION 8.14.3) + ExternalProject_Add( + Gradle + DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR} + URL "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" + URL_HASH SHA256=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531 + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + ) + set(GRADLE ${CMAKE_BINARY_DIR}/Gradle-prefix/src/Gradle/bin/gradle) set(ANDROIDVIEWER_APK ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/androidviewer-release-unsigned.apk) @@ -28,7 +37,7 @@ if (WEBODF_ANDROID) -PwebodfVersion=${WEBODF_MANIFEST_VERSION} -PbuildDir=${CMAKE_CURRENT_BINARY_DIR}/build assembleRelease - DEPENDS webodf.js-target + DEPENDS webodf.js-target Gradle ${CMAKE_CURRENT_SOURCE_DIR}/build.gradle ${CMAKE_CURRENT_SOURCE_DIR}/src/main/AndroidManifest.xml ${CMAKE_CURRENT_SOURCE_DIR}/src/main/java/org/webodf/viewer/ViewerActivity.java From 1c636ffa804dda1ff27b16e82e5243a591e05829 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 137/385] Removed getVariable(), that nothing called. --- webodf/lib/runtime.js | 39 --------------------------------------- 1 file changed, 39 deletions(-) diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index add4e7c2e..211fe4c9d 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -40,12 +40,6 @@ */ function Runtime() {"use strict"; } -/** - * @param {!string} name - * @return {*} - */ -Runtime.prototype.getVariable = function (name) { "use strict"; }; - /** * @param {*} anything * @return {!string} @@ -275,21 +269,6 @@ Runtime.byteArrayToString = function (bytearray, encoding) { return result; }; -/** - * @param {!string} name - * @return {*} - */ -Runtime.getVariable = function (name) { - "use strict"; - /*jslint evil: true*/ - try { - return eval(name); - } catch (e) { - return undefined; - } - /*jslint evil: false*/ -}; - /** * @param {*} anything * @return {!string} @@ -466,12 +445,6 @@ function BrowserRuntime() { }; this.byteArrayToString = Runtime.byteArrayToString; - /** - * @param {!string} name - * @return {*} - */ - this.getVariable = Runtime.getVariable; - /** * @param {!string} jsonstr @@ -956,12 +929,6 @@ function NodeJSRuntime() { this.byteArrayToString = Runtime.byteArrayToString; - /** - * @param {!string} name - * @return {*} - */ - this.getVariable = Runtime.getVariable; - /** * @param {!string} jsonstr * @return {*} @@ -1371,12 +1338,6 @@ function RhinoRuntime() { /*jslint unparam: false*/ this.byteArrayToString = Runtime.byteArrayToString; - /** - * @param {!string} name - * @return {*} - */ - this.getVariable = Runtime.getVariable; - /** * @param {!string} jsonstr * @return {*} From f361a84ec9605582434fdcbe6c3bc8c9111e1359 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 138/385] Updated JSZip to 2.6.1, the last version of its line. --- webodf/lib/externs/JSZip.js | 1486 ++++++++++++++++++++++++----------- 1 file changed, 1008 insertions(+), 478 deletions(-) diff --git a/webodf/lib/externs/JSZip.js b/webodf/lib/externs/JSZip.js index 00d654f18..5d78fdaf7 100644 --- a/webodf/lib/externs/JSZip.js +++ b/webodf/lib/externs/JSZip.js @@ -1,7 +1,7 @@ /** * @license * @licstart -JSZip - A Javascript class for generating and reading zip files +JSZip v2.6.1 - A Javascript class for generating and reading zip files (c) 2009-2014 Stuart Knightley @@ -9,14 +9,71 @@ Dual licenced under the MIT license or GPLv3. See https://raw.github.com/Stuk/js JSZip uses the library pako released under the MIT license : https://github.com/nodeca/pako/blob/master/LICENSE + +The wrapper of the distribution is replaced, so that the class is attached to +the shared object "externs" instead of the global scope, and so that the +modules it holds do not see the commonjs of node: the library of webodf is +loaded with require(), and jszip would then export itself to it. * @licend */ !function(e){ - // if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.JSZip=e()} var globalScope = typeof window !== "undefined" ? window : (typeof global !== "undefined" ? global : {}), externs = globalScope.externs || (globalScope.externs = {}); externs.JSZip = e(); -}(function(){var define,module,exports;if(define||module||exports){console.log("");}return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][0].call(f.exports,function(e){var n=t[o][1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0; --i) { + if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) { + return i - this.zero; + } + } + + return -1; +}; +/** + * @see DataReader.readData + */ +ArrayReader.prototype.readData = function(size) { + this.checkOffset(size); + if(size === 0) { + return []; + } + var result = this.data.slice(this.zero + this.index, this.zero + this.index + size); + this.index += size; + return result; +}; +module.exports = ArrayReader; + +},{"./dataReader":6}],2:[function(require,module,exports){ 'use strict'; // private property var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; @@ -88,7 +145,7 @@ exports.decode = function(input, utf8) { }; -},{}],2:[function(_dereq_,module,exports){ +},{}],3:[function(require,module,exports){ 'use strict'; function CompressedObject() { this.compressedSize = 0; @@ -118,11 +175,11 @@ CompressedObject.prototype = { }; module.exports = CompressedObject; -},{}],3:[function(_dereq_,module,exports){ +},{}],4:[function(require,module,exports){ 'use strict'; exports.STORE = { magic: "\x00\x00", - compress: function(content) { + compress: function(content, compressionOptions) { return content; // no compression }, uncompress: function(content) { @@ -131,12 +188,12 @@ exports.STORE = { compressInputType: null, uncompressInputType: null }; -exports.DEFLATE = _dereq_('./flate'); +exports.DEFLATE = require('./flate'); -},{"./flate":8}],4:[function(_dereq_,module,exports){ +},{"./flate":9}],5:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('./utils'); +var utils = require('./utils'); var table = [ 0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA, @@ -237,14 +294,15 @@ module.exports = function crc32(input, crc) { }; // vim: set shiftwidth=4 softtabstop=4: -},{"./utils":21}],5:[function(_dereq_,module,exports){ +},{"./utils":22}],6:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('./utils'); +var utils = require('./utils'); function DataReader(data) { this.data = null; // type : see implementation this.length = 0; this.index = 0; + this.zero = 0; } DataReader.prototype = { /** @@ -261,7 +319,7 @@ DataReader.prototype = { * @throws {Error} an Error if the index is out of bounds. */ checkIndex: function(newIndex) { - if (this.length < newIndex || newIndex < 0) { + if (this.length < this.zero + newIndex || newIndex < 0) { throw new Error("End of data reached (data length = " + this.length + ", asked index = " + (newIndex) + "). Corrupted zip ?"); } }, @@ -346,7 +404,7 @@ DataReader.prototype = { }; module.exports = DataReader; -},{"./utils":21}],6:[function(_dereq_,module,exports){ +},{"./utils":22}],7:[function(require,module,exports){ 'use strict'; exports.base64 = false; exports.binary = false; @@ -354,11 +412,14 @@ exports.dir = false; exports.createFolders = false; exports.date = null; exports.compression = null; +exports.compressionOptions = null; exports.comment = null; +exports.unixPermissions = null; +exports.dosPermissions = null; -},{}],7:[function(_dereq_,module,exports){ +},{}],8:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('./utils'); +var utils = require('./utils'); /** * @deprecated @@ -463,26 +524,28 @@ exports.isRegExp = function (object) { }; -},{"./utils":21}],8:[function(_dereq_,module,exports){ +},{"./utils":22}],9:[function(require,module,exports){ 'use strict'; var USE_TYPEDARRAY = (typeof Uint8Array !== 'undefined') && (typeof Uint16Array !== 'undefined') && (typeof Uint32Array !== 'undefined'); -var pako = _dereq_("pako"); +var pako = require("pako"); exports.uncompressInputType = USE_TYPEDARRAY ? "uint8array" : "array"; exports.compressInputType = USE_TYPEDARRAY ? "uint8array" : "array"; exports.magic = "\x08\x00"; -exports.compress = function(input) { - return pako.deflateRaw(input); +exports.compress = function(input, compressionOptions) { + return pako.deflateRaw(input, { + level : compressionOptions.level || -1 // default compression + }); }; exports.uncompress = function(input) { return pako.inflateRaw(input); }; -},{"pako":24}],9:[function(_dereq_,module,exports){ +},{"pako":25}],10:[function(require,module,exports){ 'use strict'; -var base64 = _dereq_('./base64'); +var base64 = require('./base64'); /** Usage: @@ -499,7 +562,7 @@ Usage: /** * Representation a of zip file in js * @constructor - * @param {(string|ArrayBuffer|Uint8Array)=} data the data to load, if any (optional). + * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional). * @param {Object=} options the options for creating this objects (optional). */ function JSZip(data, options) { @@ -530,16 +593,16 @@ function JSZip(data, options) { return newObj; }; } -JSZip.prototype = _dereq_('./object'); -JSZip.prototype.load = _dereq_('./load'); -JSZip.support = _dereq_('./support'); -JSZip.defaults = _dereq_('./defaults'); +JSZip.prototype = require('./object'); +JSZip.prototype.load = require('./load'); +JSZip.support = require('./support'); +JSZip.defaults = require('./defaults'); /** * @deprecated * This namespace will be removed in a future version without replacement. */ -JSZip.utils = _dereq_('./deprecatedPublicUtils'); +JSZip.utils = require('./deprecatedPublicUtils'); JSZip.base64 = { /** @@ -557,16 +620,24 @@ JSZip.base64 = { return base64.decode(input); } }; -JSZip.compressions = _dereq_('./compressions'); +JSZip.compressions = require('./compressions'); module.exports = JSZip; -},{"./base64":1,"./compressions":3,"./defaults":6,"./deprecatedPublicUtils":7,"./load":10,"./object":13,"./support":17}],10:[function(_dereq_,module,exports){ +},{"./base64":2,"./compressions":4,"./defaults":7,"./deprecatedPublicUtils":8,"./load":11,"./object":14,"./support":18}],11:[function(require,module,exports){ 'use strict'; -var base64 = _dereq_('./base64'); -var ZipEntries = _dereq_('./zipEntries'); +var base64 = require('./base64'); +var utf8 = require('./utf8'); +var utils = require('./utils'); +var ZipEntries = require('./zipEntries'); module.exports = function(data, options) { var files, zipEntries, i, input; - options = options || {}; + options = utils.extend(options || {}, { + base64: false, + checkCRC32: false, + optimizedBinaryString : false, + createFolders: false, + decodeFileName: utf8.utf8decode + }); if (options.base64) { data = base64.decode(data); } @@ -575,12 +646,14 @@ module.exports = function(data, options) { files = zipEntries.files; for (i = 0; i < files.length; i++) { input = files[i]; - this.file(input.fileName, input.decompressed, { + this.file(input.fileNameStr, input.decompressed, { binary: true, optimizedBinaryString: true, date: input.date, dir: input.dir, - comment : input.fileComment.length ? input.fileComment : null, + comment : input.fileCommentStr.length ? input.fileCommentStr : null, + unixPermissions : input.unixPermissions, + dosPermissions : input.dosPermissions, createFolders: options.createFolders }); } @@ -591,12 +664,10 @@ module.exports = function(data, options) { return this; }; -},{"./base64":1,"./zipEntries":22}],11:[function(_dereq_,module,exports){ +},{"./base64":2,"./utf8":21,"./utils":22,"./zipEntries":23}],12:[function(require,module,exports){ (function (Buffer){ 'use strict'; module.exports = function(data, encoding){ - // Patched: new Buffer() is deprecated since node 10. The callers only pass - // a string or an array, never a size, so from() always applies. // Patched: new Buffer() is deprecated since node 10. A number is a size // to allocate, that alloc() also fills with zeroes, anything else is the // content to copy. @@ -607,15 +678,17 @@ module.exports = function(data, encoding){ module.exports.test = function(b){ return Buffer.isBuffer(b); }; + }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined)) -},{}],12:[function(_dereq_,module,exports){ +},{}],13:[function(require,module,exports){ 'use strict'; -var Uint8ArrayReader = _dereq_('./uint8ArrayReader'); +var Uint8ArrayReader = require('./uint8ArrayReader'); function NodeBufferReader(data) { this.data = data; this.length = this.data.length; this.index = 0; + this.zero = 0; } NodeBufferReader.prototype = new Uint8ArrayReader(); @@ -624,31 +697,31 @@ NodeBufferReader.prototype = new Uint8ArrayReader(); */ NodeBufferReader.prototype.readData = function(size) { this.checkOffset(size); - var result = this.data.slice(this.index, this.index + size); + var result = this.data.slice(this.zero + this.index, this.zero + this.index + size); this.index += size; return result; }; module.exports = NodeBufferReader; -},{"./uint8ArrayReader":18}],13:[function(_dereq_,module,exports){ +},{"./uint8ArrayReader":19}],14:[function(require,module,exports){ 'use strict'; -var support = _dereq_('./support'); -var utils = _dereq_('./utils'); -var crc32 = _dereq_('./crc32'); -var signature = _dereq_('./signature'); -var defaults = _dereq_('./defaults'); -var base64 = _dereq_('./base64'); -var compressions = _dereq_('./compressions'); -var CompressedObject = _dereq_('./compressedObject'); -var nodeBuffer = _dereq_('./nodeBuffer'); -var utf8 = _dereq_('./utf8'); -var StringWriter = _dereq_('./stringWriter'); -var Uint8ArrayWriter = _dereq_('./uint8ArrayWriter'); +var support = require('./support'); +var utils = require('./utils'); +var crc32 = require('./crc32'); +var signature = require('./signature'); +var defaults = require('./defaults'); +var base64 = require('./base64'); +var compressions = require('./compressions'); +var CompressedObject = require('./compressedObject'); +var nodeBuffer = require('./nodeBuffer'); +var utf8 = require('./utf8'); +var StringWriter = require('./stringWriter'); +var Uint8ArrayWriter = require('./uint8ArrayWriter'); /** * Returns the raw data of a ZipObject, decompress the content if necessary. * @param {ZipObject} file the file to use. - * @return {string|ArrayBuffer|Uint8Array|Buffer} the data. + * @return {String|ArrayBuffer|Uint8Array|Buffer} the data. */ var getRawData = function(file) { if (file._data instanceof CompressedObject) { @@ -673,7 +746,7 @@ var getRawData = function(file) { /** * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it. * @param {ZipObject} file the file to use. - * @return {string|ArrayBuffer|Uint8Array|Buffer} the data. + * @return {String|ArrayBuffer|Uint8Array|Buffer} the data. */ var getBinaryData = function(file) { var result = getRawData(file), @@ -693,8 +766,8 @@ var getBinaryData = function(file) { /** * Transform this._data into a string. - * @param {function(!string):!string} filter a function String -> String, applied if not null on the result. - * @return {string} the string representing this._data. + * @param {function} filter a function String -> String, applied if not null on the result. + * @return {String} the string representing this._data. */ var dataToString = function(asUTF8) { var result = getRawData(this); @@ -724,7 +797,7 @@ var dataToString = function(asUTF8) { * A simple object representing a file in the zip file. * @constructor * @param {string} name the name of the file - * @param {string|ArrayBuffer|Uint8Array|Buffer} data the data + * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data * @param {Object} options the options of the file */ var ZipObject = function(name, data, options) { @@ -732,6 +805,8 @@ var ZipObject = function(name, data, options) { this.dir = options.dir; this.date = options.date; this.comment = options.comment; + this.unixPermissions = options.unixPermissions; + this.dosPermissions = options.dosPermissions; this._data = data; this.options = options; @@ -804,24 +879,6 @@ var decToHex = function(dec, bytes) { return hex; }; -/** - * Merge the objects passed as parameters into a new one. - * @private - * @param {...Object} var_args All objects to merge. - * @return {Object} a new object with the data of the others. - */ -var extend = function() { - var result = {}, i, attr; - for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers - for (attr in arguments[i]) { - if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") { - result[attr] = arguments[i][attr]; - } - } - } - return result; -}; - /** * Transforms the (incomplete) options from the user into the complete * set of options to create a file. @@ -834,7 +891,7 @@ var prepareFileAttrs = function(o) { if (o.base64 === true && (o.binary === null || o.binary === undefined)) { o.binary = true; } - o = extend(o, defaults); + o = utils.extend(o, defaults); o.date = o.date || new Date(); if (o.compression !== null) o.compression = o.compression.toUpperCase(); @@ -845,7 +902,7 @@ var prepareFileAttrs = function(o) { * Add a file in the current folder. * @private * @param {string} name the name of the file - * @param {string|ArrayBuffer|Uint8Array|Buffer} data the data of the file + * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file * @param {Object} o the options of the file * @return {Object} the new file. */ @@ -856,6 +913,23 @@ var fileAdd = function(name, data, o) { o = prepareFileAttrs(o); + if (typeof o.unixPermissions === "string") { + o.unixPermissions = parseInt(o.unixPermissions, 8); + } + + // UNX_IFDIR 0040000 see zipinfo.c + if (o.unixPermissions && (o.unixPermissions & 0x4000)) { + o.dir = true; + } + // Bit 4 Directory + if (o.dosPermissions && (o.dosPermissions & 0x0010)) { + o.dir = true; + } + + if (o.dir) { + name = forceTrailingSlash(name); + } + if (o.createFolders && (parent = parentFolder(name))) { folderAdd.call(this, parent, true); } @@ -864,6 +938,7 @@ var fileAdd = function(name, data, o) { o.base64 = false; o.binary = false; data = null; + dataType = null; } else if (dataType === "string") { if (o.binary && !o.base64) { @@ -908,6 +983,20 @@ var parentFolder = function (path) { return (lastSlash > 0) ? path.substring(0, lastSlash) : ""; }; + +/** + * Returns the path with a slash at the end. + * @private + * @param {String} path the path to check. + * @return {String} the path with a trailing slash. + */ +var forceTrailingSlash = function(path) { + // Check the name ends with a / + if (path.slice(-1) != "/") { + path += "/"; // IE doesn't like substr(-1) + } + return path; +}; /** * Add a (sub) folder in the current folder. * @private @@ -917,13 +1006,10 @@ var parentFolder = function (path) { * @return {Object} the new folder. */ var folderAdd = function(name, createFolders) { - // Check the name ends with a / - if (name.slice(-1) != "/") { - name += "/"; // IE doesn't like substr(-1) - } - createFolders = (typeof createFolders !== 'undefined') ? createFolders : false; + name = forceTrailingSlash(name); + // Does this folder already exist? if (!this.files[name]) { fileAdd.call(this, name, null, { @@ -938,9 +1024,10 @@ var folderAdd = function(name, createFolders) { * Generate a JSZip.CompressedObject for a given zipOject. * @param {ZipObject} file the object to read. * @param {JSZip.compression} compression the compression to use. + * @param {Object} compressionOptions the options to use when compressing. * @return {JSZip.CompressedObject} the compressed result. */ -var generateCompressedObjectFrom = function(file, compression) { +var generateCompressedObjectFrom = function(file, compression, compressionOptions) { var result = new CompressedObject(), content; @@ -960,7 +1047,7 @@ var generateCompressedObjectFrom = function(file, compression) { else { content = file._data.getContent(); // need to decompress / recompress - result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content)); + result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions); } } else { @@ -972,7 +1059,7 @@ var generateCompressedObjectFrom = function(file, compression) { } result.uncompressedSize = content.length; result.crc32 = crc32(content); - result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content)); + result.compressedContent = compression.compress(utils.transformTo(compression.compressInputType, content), compressionOptions); } result.compressedSize = result.compressedContent.length; @@ -981,17 +1068,74 @@ var generateCompressedObjectFrom = function(file, compression) { return result; }; + + + +/** + * Generate the UNIX part of the external file attributes. + * @param {Object} unixPermissions the unix permissions or null. + * @param {Boolean} isDir true if the entry is a directory, false otherwise. + * @return {Number} a 32 bit integer. + * + * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute : + * + * TTTTsstrwxrwxrwx0000000000ADVSHR + * ^^^^____________________________ file type, see zipinfo.c (UNX_*) + * ^^^_________________________ setuid, setgid, sticky + * ^^^^^^^^^________________ permissions + * ^^^^^^^^^^______ not used ? + * ^^^^^^ DOS attribute bits : Archive, Directory, Volume label, System file, Hidden, Read only + */ +var generateUnixExternalFileAttr = function (unixPermissions, isDir) { + + var result = unixPermissions; + if (!unixPermissions) { + // I can't use octal values in strict mode, hence the hexa. + // 040775 => 0x41fd + // 0100664 => 0x81b4 + result = isDir ? 0x41fd : 0x81b4; + } + + return (result & 0xFFFF) << 16; +}; + +/** + * Generate the DOS part of the external file attributes. + * @param {Object} dosPermissions the dos permissions or null. + * @param {Boolean} isDir true if the entry is a directory, false otherwise. + * @return {Number} a 32 bit integer. + * + * Bit 0 Read-Only + * Bit 1 Hidden + * Bit 2 System + * Bit 3 Volume Label + * Bit 4 Directory + * Bit 5 Archive + */ +var generateDosExternalFileAttr = function (dosPermissions, isDir) { + + // the dir flag is already set for compatibility + + return (dosPermissions || 0) & 0x3F; +}; + /** * Generate the various parts used in the construction of the final zip file. * @param {string} name the file name. * @param {ZipObject} file the file content. * @param {JSZip.CompressedObject} compressedObject the compressed object. * @param {number} offset the current offset from the start of the zip file. + * @param {String} platform let's pretend we are this platform (change platform dependents fields) + * @param {Function} encodeFileName the function to encode the file name / comment. * @return {object} the zip parts. */ -var generateZipParts = function(name, file, compressedObject, offset) { - var utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)), +var generateZipParts = function(name, file, compressedObject, offset, platform, encodeFileName) { + var data = compressedObject.compressedContent, + useCustomEncoding = encodeFileName !== utf8.utf8encode, + encodedFileName = utils.transformTo("string", encodeFileName(file.name)), + utfEncodedFileName = utils.transformTo("string", utf8.utf8encode(file.name)), comment = file.comment || "", + encodedComment = utils.transformTo("string", encodeFileName(comment)), utfEncodedComment = utils.transformTo("string", utf8.utf8encode(comment)), useUTF8ForFileName = utfEncodedFileName.length !== file.name.length, useUTF8ForComment = utfEncodedComment.length !== comment.length, @@ -1018,6 +1162,20 @@ var generateZipParts = function(name, file, compressedObject, offset) { date = o.date; } + var extFileAttr = 0; + var versionMadeBy = 0; + if (dir) { + // dos or unix, we set the dos dir flag + extFileAttr |= 0x00010; + } + if(platform === "UNIX") { + versionMadeBy = 0x031E; // UNIX, version 3.0 + extFileAttr |= generateUnixExternalFileAttr(file.unixPermissions, dir); + } else { // DOS or other, fallback to DOS + versionMadeBy = 0x0014; // DOS, version 2.0 + extFileAttr |= generateDosExternalFileAttr(file.dosPermissions, dir); + } + // date // @see http://www.delorie.com/djgpp/doc/rbinter/it/52/13.html // @see http://www.delorie.com/djgpp/doc/rbinter/it/65/16.html @@ -1049,7 +1207,7 @@ var generateZipParts = function(name, file, compressedObject, offset) { // Version decToHex(1, 1) + // NameCRC32 - decToHex(crc32(utfEncodedFileName), 4) + + decToHex(crc32(encodedFileName), 4) + // UnicodeName utfEncodedFileName; @@ -1068,7 +1226,7 @@ var generateZipParts = function(name, file, compressedObject, offset) { // Version decToHex(1, 1) + // CommentCRC32 - decToHex(this.crc32(utfEncodedComment), 4) + + decToHex(this.crc32(encodedComment), 4) + // UnicodeName utfEncodedComment; @@ -1087,7 +1245,7 @@ var generateZipParts = function(name, file, compressedObject, offset) { header += "\x0A\x00"; // general purpose bit flag // set bit 11 if utf8 - header += (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00"; + header += !useCustomEncoding && (useUTF8ForFileName || useUTF8ForComment) ? "\x00\x08" : "\x00\x00"; // compression method header += compressedObject.compressionMethod; // last mod file time @@ -1101,34 +1259,34 @@ var generateZipParts = function(name, file, compressedObject, offset) { // uncompressed size header += decToHex(compressedObject.uncompressedSize, 4); // file name length - header += decToHex(utfEncodedFileName.length, 2); + header += decToHex(encodedFileName.length, 2); // extra field length header += decToHex(extraFields.length, 2); - var fileRecord = signature.LOCAL_FILE_HEADER + header + utfEncodedFileName + extraFields; + var fileRecord = signature.LOCAL_FILE_HEADER + header + encodedFileName + extraFields; var dirRecord = signature.CENTRAL_FILE_HEADER + // version made by (00: DOS) - "\x14\x00" + + decToHex(versionMadeBy, 2) + // file header (common to file and central directory) header + // file comment length - decToHex(utfEncodedComment.length, 2) + + decToHex(encodedComment.length, 2) + // disk number start "\x00\x00" + // internal file attributes TODO "\x00\x00" + // external file attributes - (dir === true ? "\x10\x00\x00\x00" : "\x00\x00\x00\x00") + + decToHex(extFileAttr, 4) + // relative offset of local header decToHex(offset, 4) + // file name - utfEncodedFileName + + encodedFileName + // extra field extraFields + // file comment - utfEncodedComment; + encodedComment; return { fileRecord: fileRecord, @@ -1143,7 +1301,7 @@ var out = { /** * Read an existing zip and merge the data in the current JSZip object. * The implementation is in jszip-load.js, don't forget to include it. - * @param {string|ArrayBuffer|Uint8Array|Buffer} stream The stream to load + * @param {String|ArrayBuffer|Uint8Array|Buffer} stream The stream to load * @param {Object} options Options for loading the stream. * options.base64 : is the stream in base64 ? default : false * @return {JSZip} the current JSZip object @@ -1168,7 +1326,7 @@ var out = { } file = this.files[filename]; // return a new object, don't let the user mess with our internal objects :) - fileClone = new ZipObject(file.name, file._data, extend(file.options)); + fileClone = new ZipObject(file.name, file._data, utils.extend(file.options)); relativePath = filename.slice(this.root.length, filename.length); if (filename.slice(0, this.root.length) === this.root && // the file is in the current root search(relativePath, fileClone)) { // and the file matches the function @@ -1182,7 +1340,7 @@ var out = { * Add a file to the zip file, or search a file. * @param {string|RegExp} name The name of the file to add (if data is defined), * the name of the file to find (if no data) or a regex to match files. - * @param {string|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded + * @param {String|ArrayBuffer|Uint8Array|Buffer} data The file data, either raw or base64 encoded * @param {Object} o File options * @return {JSZip|Object|Array} this JSZip object (when adding a file), * a file (when searching by string) or an array of files (when searching by regex). @@ -1210,7 +1368,7 @@ var out = { /** * Add a directory to the zip file, or search. - * @param {string|RegExp} arg The name of the directory to add, or a regex to search folders. + * @param {String|RegExp} arg The name of the directory to add, or a regex to search folders. * @return {JSZip} an object with the new directory as the root, or an array containing matching folders. */ folder: function(arg) { @@ -1272,23 +1430,40 @@ var out = { * - base64, (deprecated, use type instead) true to generate base64. * - compression, "STORE" by default. * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob. - * @return {string|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file + * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file */ generate: function(options) { - options = extend(options || {}, { + options = utils.extend(options || {}, { base64: true, compression: "STORE", + compressionOptions : null, type: "base64", - comment: null + platform: "DOS", + comment: null, + mimeType: 'application/zip', + encodeFileName: utf8.utf8encode }); utils.checkSupport(options.type); + // accept nodejs `process.platform` + if( + options.platform === 'darwin' || + options.platform === 'freebsd' || + options.platform === 'linux' || + options.platform === 'sunos' + ) { + options.platform = "UNIX"; + } + if (options.platform === 'win32') { + options.platform = "DOS"; + } + var zipData = [], localDirLength = 0, centralDirLength = 0, writer, i, - utfEncodedComment = utils.transformTo("string", this.utf8encode(options.comment || this.comment || "")); + encodedComment = utils.transformTo("string", options.encodeFileName(options.comment || this.comment || "")); // first, generate all the zip parts. for (var name in this.files) { @@ -1302,10 +1477,11 @@ var out = { if (!compression) { throw new Error(compressionName + " is not a valid compression method !"); } + var compressionOptions = file.options.compressionOptions || options.compressionOptions || {}; - var compressedObject = generateCompressedObjectFrom.call(this, file, compression); + var compressedObject = generateCompressedObjectFrom.call(this, file, compression, compressionOptions); - var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength); + var zipPart = generateZipParts.call(this, name, file, compressedObject, localDirLength, options.platform, options.encodeFileName); localDirLength += zipPart.fileRecord.length + compressedObject.compressedSize; centralDirLength += zipPart.dirRecord.length; zipData.push(zipPart); @@ -1328,9 +1504,9 @@ var out = { // offset of start of central directory with respect to the starting disk number decToHex(localDirLength, 4) + // .ZIP file comment length - decToHex(utfEncodedComment.length, 2) + + decToHex(encodedComment.length, 2) + // .ZIP file comment - utfEncodedComment; + encodedComment; // we have all the parts (and the total length) @@ -1363,7 +1539,7 @@ var out = { case "nodebuffer" : return utils.transformTo(options.type.toLowerCase(), zip); case "blob" : - return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip)); + return utils.arrayBuffer2Blob(utils.transformTo("arraybuffer", zip), options.mimeType); // case "zip is a string" case "base64" : return (options.base64) ? base64.encode(zip) : zip; @@ -1399,7 +1575,7 @@ var out = { }; module.exports = out; -},{"./base64":1,"./compressedObject":2,"./compressions":3,"./crc32":4,"./defaults":6,"./nodeBuffer":11,"./signature":14,"./stringWriter":16,"./support":17,"./uint8ArrayWriter":19,"./utf8":20,"./utils":21}],14:[function(_dereq_,module,exports){ +},{"./base64":2,"./compressedObject":3,"./compressions":4,"./crc32":5,"./defaults":7,"./nodeBuffer":12,"./signature":15,"./stringWriter":17,"./support":18,"./uint8ArrayWriter":20,"./utf8":21,"./utils":22}],15:[function(require,module,exports){ 'use strict'; exports.LOCAL_FILE_HEADER = "PK\x03\x04"; exports.CENTRAL_FILE_HEADER = "PK\x01\x02"; @@ -1408,10 +1584,10 @@ exports.ZIP64_CENTRAL_DIRECTORY_LOCATOR = "PK\x06\x07"; exports.ZIP64_CENTRAL_DIRECTORY_END = "PK\x06\x06"; exports.DATA_DESCRIPTOR = "PK\x07\x08"; -},{}],15:[function(_dereq_,module,exports){ +},{}],16:[function(require,module,exports){ 'use strict'; -var DataReader = _dereq_('./dataReader'); -var utils = _dereq_('./utils'); +var DataReader = require('./dataReader'); +var utils = require('./utils'); function StringReader(data, optimizedBinaryString) { this.data = data; @@ -1420,19 +1596,20 @@ function StringReader(data, optimizedBinaryString) { } this.length = this.data.length; this.index = 0; + this.zero = 0; } StringReader.prototype = new DataReader(); /** * @see DataReader.byteAt */ StringReader.prototype.byteAt = function(i) { - return this.data.charCodeAt(i); + return this.data.charCodeAt(this.zero + i); }; /** * @see DataReader.lastIndexOfSignature */ StringReader.prototype.lastIndexOfSignature = function(sig) { - return this.data.lastIndexOf(sig); + return this.data.lastIndexOf(sig) - this.zero; }; /** * @see DataReader.readData @@ -1440,16 +1617,16 @@ StringReader.prototype.lastIndexOfSignature = function(sig) { StringReader.prototype.readData = function(size) { this.checkOffset(size); // this will work because the constructor applied the "& 0xff" mask. - var result = this.data.slice(this.index, this.index + size); + var result = this.data.slice(this.zero + this.index, this.zero + this.index + size); this.index += size; return result; }; module.exports = StringReader; -},{"./dataReader":5,"./utils":21}],16:[function(_dereq_,module,exports){ +},{"./dataReader":6,"./utils":22}],17:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('./utils'); +var utils = require('./utils'); /** * An object to write any content to a string. @@ -1478,7 +1655,7 @@ StringWriter.prototype = { module.exports = StringWriter; -},{"./utils":21}],17:[function(_dereq_,module,exports){ +},{"./utils":22}],18:[function(require,module,exports){ (function (Buffer){ 'use strict'; exports.base64 = true; @@ -1516,40 +1693,19 @@ else { } }).call(this,(typeof Buffer !== "undefined" ? Buffer : undefined)) -},{}],18:[function(_dereq_,module,exports){ +},{}],19:[function(require,module,exports){ 'use strict'; -var DataReader = _dereq_('./dataReader'); +var ArrayReader = require('./arrayReader'); function Uint8ArrayReader(data) { if (data) { this.data = data; this.length = this.data.length; this.index = 0; + this.zero = 0; } } -Uint8ArrayReader.prototype = new DataReader(); -/** - * @see DataReader.byteAt - */ -Uint8ArrayReader.prototype.byteAt = function(i) { - return this.data[i]; -}; -/** - * @see DataReader.lastIndexOfSignature - */ -Uint8ArrayReader.prototype.lastIndexOfSignature = function(sig) { - var sig0 = sig.charCodeAt(0), - sig1 = sig.charCodeAt(1), - sig2 = sig.charCodeAt(2), - sig3 = sig.charCodeAt(3); - for (var i = this.length - 4; i >= 0; --i) { - if (this.data[i] === sig0 && this.data[i + 1] === sig1 && this.data[i + 2] === sig2 && this.data[i + 3] === sig3) { - return i; - } - } - - return -1; -}; +Uint8ArrayReader.prototype = new ArrayReader(); /** * @see DataReader.readData */ @@ -1559,16 +1715,16 @@ Uint8ArrayReader.prototype.readData = function(size) { // in IE10, when using subarray(idx, idx), we get the array [0x00] instead of []. return new Uint8Array(0); } - var result = this.data.subarray(this.index, this.index + size); + var result = this.data.subarray(this.zero + this.index, this.zero + this.index + size); this.index += size; return result; }; module.exports = Uint8ArrayReader; -},{"./dataReader":5}],19:[function(_dereq_,module,exports){ +},{"./arrayReader":1}],20:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('./utils'); +var utils = require('./utils'); /** * An object to write any content to an Uint8Array. @@ -1603,12 +1759,12 @@ Uint8ArrayWriter.prototype = { module.exports = Uint8ArrayWriter; -},{"./utils":21}],20:[function(_dereq_,module,exports){ +},{"./utils":22}],21:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('./utils'); -var support = _dereq_('./support'); -var nodeBuffer = _dereq_('./nodeBuffer'); +var utils = require('./utils'); +var support = require('./support'); +var nodeBuffer = require('./nodeBuffer'); /** * The following functions come from pako, from pako/lib/utils/strings @@ -1711,7 +1867,7 @@ var utf8border = function(buf, max) { // convert array to string var buf2string = function (buf) { - var i, out, c, c_len; + var str, i, out, c, c_len; var len = buf.length; // Reserve max possible length (2 words per char) @@ -1768,7 +1924,7 @@ var buf2string = function (buf) { /** * Transform a javascript string into an array (typed if possible) of bytes, * UTF-8 encoded. - * @param {string} str the string to encode + * @param {String} str the string to encode * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string. */ exports.utf8encode = function utf8encode(str) { @@ -1784,7 +1940,7 @@ exports.utf8encode = function utf8encode(str) { * Transform a bytes array (or a representation) representing an UTF-8 encoded * string into a javascript string. * @param {Array|Uint8Array|Buffer} buf the data de decode - * @return {string} the decoded string. + * @return {String} the decoded string. */ exports.utf8decode = function utf8decode(buf) { if (support.nodebuffer) { @@ -1812,15 +1968,15 @@ exports.utf8decode = function utf8decode(buf) { }; // vim: set shiftwidth=4 softtabstop=4: -},{"./nodeBuffer":11,"./support":17,"./utils":21}],21:[function(_dereq_,module,exports){ +},{"./nodeBuffer":12,"./support":18,"./utils":22}],22:[function(require,module,exports){ 'use strict'; -var support = _dereq_('./support'); -var compressions = _dereq_('./compressions'); -var nodeBuffer = _dereq_('./nodeBuffer'); +var support = require('./support'); +var compressions = require('./compressions'); +var nodeBuffer = require('./nodeBuffer'); /** * Convert a string to a "binary string" : a string containing only char codes between 0 and 255. * @param {string} str the string to transform. - * @return {string} the binary string. + * @return {String} the binary string. */ exports.string2binary = function(str) { var result = ""; @@ -1829,13 +1985,14 @@ exports.string2binary = function(str) { } return result; }; -exports.arrayBuffer2Blob = function(buffer) { +exports.arrayBuffer2Blob = function(buffer, mimeType) { exports.checkSupport("blob"); + mimeType = mimeType || 'application/zip'; try { // Blob constructor return new Blob([buffer], { - type: "application/zip" + type: mimeType }); } catch (e) { @@ -1845,7 +2002,7 @@ exports.arrayBuffer2Blob = function(buffer) { var Builder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder; var builder = new Builder(); builder.append(buffer); - return builder.getBlob('application/zip'); + return builder.getBlob(mimeType); } catch (e) { @@ -1867,7 +2024,7 @@ function identity(input) { /** * Fill in an array with a string. - * @param {string} str the string to use. + * @param {String} str the string to use. * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated). * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array. */ @@ -1881,7 +2038,7 @@ function stringToArrayLike(str, array) { /** * Transform an array-like object to a string. * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform. - * @return {string} the result. + * @return {String} the result. */ function arrayLikeToString(array) { // Performances notes : @@ -2040,8 +2197,8 @@ transform["nodebuffer"] = { * Transform an input into any type. * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer. * If no output type is specified, the unmodified input will be returned. - * @param {string} outputType the output type. - * @param {string|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert. + * @param {String} outputType the output type. + * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert. * @throws {Error} an Error if the browser doesn't support the requested output type. */ exports.transformTo = function(outputType, input) { @@ -2063,7 +2220,7 @@ exports.transformTo = function(outputType, input) { * Return the type of the input. * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer. * @param {Object} input the input to identify. - * @return {string} the (lowercase) type of the input. + * @return {String} the (lowercase) type of the input. */ exports.getTypeOf = function(input) { if (typeof input === "string") { @@ -2085,7 +2242,7 @@ exports.getTypeOf = function(input) { /** * Throw an exception if the type is not supported. - * @param {string} type the type to check. + * @param {String} type the type to check. * @throws {Error} an Error if the browser doesn't support the requested type. */ exports.checkSupport = function(type) { @@ -2131,29 +2288,48 @@ exports.findCompression = function(compressionMethod) { /** * Cross-window, cross-Node-context regular expression detection * @param {Object} object Anything -* @return {boolean} true if the object is a regular expression, +* @return {Boolean} true if the object is a regular expression, * false otherwise */ exports.isRegExp = function (object) { return Object.prototype.toString.call(object) === "[object RegExp]"; }; +/** + * Merge the objects passed as parameters into a new one. + * @private + * @param {...Object} var_args All objects to merge. + * @return {Object} a new object with the data of the others. + */ +exports.extend = function() { + var result = {}, i, attr; + for (i = 0; i < arguments.length; i++) { // arguments is not enumerable in some browsers + for (attr in arguments[i]) { + if (arguments[i].hasOwnProperty(attr) && typeof result[attr] === "undefined") { + result[attr] = arguments[i][attr]; + } + } + } + return result; +}; -},{"./compressions":3,"./nodeBuffer":11,"./support":17}],22:[function(_dereq_,module,exports){ + +},{"./compressions":4,"./nodeBuffer":12,"./support":18}],23:[function(require,module,exports){ 'use strict'; -var StringReader = _dereq_('./stringReader'); -var NodeBufferReader = _dereq_('./nodeBufferReader'); -var Uint8ArrayReader = _dereq_('./uint8ArrayReader'); -var utils = _dereq_('./utils'); -var sig = _dereq_('./signature'); -var ZipEntry = _dereq_('./zipEntry'); -var support = _dereq_('./support'); -var jszipProto = _dereq_('./object'); +var StringReader = require('./stringReader'); +var NodeBufferReader = require('./nodeBufferReader'); +var Uint8ArrayReader = require('./uint8ArrayReader'); +var ArrayReader = require('./arrayReader'); +var utils = require('./utils'); +var sig = require('./signature'); +var ZipEntry = require('./zipEntry'); +var support = require('./support'); +var jszipProto = require('./object'); // class ZipEntries {{{ /** * All the entries in the zip file. * @constructor - * @param {string|ArrayBuffer|Uint8Array} data the binary stream to load. + * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load. * @param {Object} loadOptions Options for loading the stream. */ function ZipEntries(data, loadOptions) { @@ -2175,6 +2351,20 @@ ZipEntries.prototype = { throw new Error("Corrupted zip or bug : unexpected signature " + "(" + utils.pretty(signature) + ", expected " + utils.pretty(expectedSignature) + ")"); } }, + /** + * Check if the given signature is at the given index. + * @param {number} askedIndex the index to check. + * @param {string} expectedSignature the signature to expect. + * @return {boolean} true if the signature is here, false otherwise. + */ + isSignature: function(askedIndex, expectedSignature) { + var currentIndex = this.reader.index; + this.reader.setIndex(askedIndex); + var signature = this.reader.readString(4); + var result = signature === expectedSignature; + this.reader.setIndex(currentIndex); + return result; + }, /** * Read the end of the central directory. */ @@ -2190,10 +2380,12 @@ ZipEntries.prototype = { // warning : the encoding depends of the system locale // On a linux machine with LANG=en_US.utf8, this field is utf8 encoded. // On a windows machine, this field is encoded with the localized windows code page. - this.zipComment = this.reader.readString(this.zipCommentLength); + var zipComment = this.reader.readData(this.zipCommentLength); + var decodeParamType = support.uint8array ? "uint8array" : "array"; // To get consistent behavior with the generation part, we will assume that - // this is utf8 encoded. - this.zipComment = jszipProto.utf8decode(this.zipComment); + // this is utf8 encoded unless specified otherwise. + var decodeContent = utils.transformTo(decodeParamType, zipComment); + this.zipComment = this.loadOptions.decodeFileName(decodeContent); }, /** * Read the end of the Zip 64 central directory. @@ -2251,6 +2443,7 @@ ZipEntries.prototype = { this.checkSignature(sig.LOCAL_FILE_HEADER); file.readLocalPart(this.reader); file.handleUTF8(); + file.processAttributes(); } }, /** @@ -2267,16 +2460,41 @@ ZipEntries.prototype = { file.readCentralPart(this.reader); this.files.push(file); } + + if (this.centralDirRecords !== this.files.length) { + if (this.centralDirRecords !== 0 && this.files.length === 0) { + // We expected some records but couldn't find ANY. + // This is really suspicious, as if something went wrong. + throw new Error("Corrupted zip or bug: expected " + this.centralDirRecords + " records in central dir, got " + this.files.length); + } else { + // We found some records but not all. + // Something is wrong but we got something for the user: no error here. + // console.warn("expected", this.centralDirRecords, "records in central dir, got", this.files.length); + } + } }, /** * Read the end of central directory. */ readEndOfCentral: function() { var offset = this.reader.lastIndexOfSignature(sig.CENTRAL_DIRECTORY_END); - if (offset === -1) { - throw new Error("Corrupted zip : can't find end of central directory"); + if (offset < 0) { + // Check if the content is a truncated zip or complete garbage. + // A "LOCAL_FILE_HEADER" is not required at the beginning (auto + // extractible zip for example) but it can give a good hint. + // If an ajax request was used without responseType, we will also + // get unreadable data. + var isGarbage = !this.isSignature(0, sig.LOCAL_FILE_HEADER); + + if (isGarbage) { + throw new Error("Can't find end of central directory : is this a zip file ? " + + "If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html"); + } else { + throw new Error("Corrupted zip : can't find end of central directory"); + } } this.reader.setIndex(offset); + var endOfCentralDirOffset = offset; this.checkSignature(sig.CENTRAL_DIRECTORY_END); this.readBlockEndOfCentral(); @@ -2305,7 +2523,7 @@ ZipEntries.prototype = { // should look for a zip64 EOCD locator offset = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_LOCATOR); - if (offset === -1) { + if (offset < 0) { throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator"); } this.reader.setIndex(offset); @@ -2313,26 +2531,60 @@ ZipEntries.prototype = { this.readBlockZip64EndOfCentralLocator(); // now the zip64 EOCD record + if (!this.isSignature(this.relativeOffsetEndOfZip64CentralDir, sig.ZIP64_CENTRAL_DIRECTORY_END)) { + // console.warn("ZIP64 end of central directory not where expected."); + this.relativeOffsetEndOfZip64CentralDir = this.reader.lastIndexOfSignature(sig.ZIP64_CENTRAL_DIRECTORY_END); + if (this.relativeOffsetEndOfZip64CentralDir < 0) { + throw new Error("Corrupted zip : can't find the ZIP64 end of central directory"); + } + } this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir); this.checkSignature(sig.ZIP64_CENTRAL_DIRECTORY_END); this.readBlockZip64EndOfCentral(); } + + var expectedEndOfCentralDirOffset = this.centralDirOffset + this.centralDirSize; + if (this.zip64) { + expectedEndOfCentralDirOffset += 20; // end of central dir 64 locator + expectedEndOfCentralDirOffset += 12 /* should not include the leading 12 bytes */ + this.zip64EndOfCentralSize; + } + + var extraBytes = endOfCentralDirOffset - expectedEndOfCentralDirOffset; + + if (extraBytes > 0) { + // console.warn(extraBytes, "extra bytes at beginning or within zipfile"); + if (this.isSignature(endOfCentralDirOffset, sig.CENTRAL_FILE_HEADER)) { + // The offsets seem wrong, but we have something at the specified offset. + // So… we keep it. + } else { + // the offset is wrong, update the "zero" of the reader + // this happens if data has been prepended (crx files for example) + this.reader.zero = extraBytes; + } + } else if (extraBytes < 0) { + throw new Error("Corrupted zip: missing " + Math.abs(extraBytes) + " bytes."); + } }, prepareReader: function(data) { var type = utils.getTypeOf(data); + utils.checkSupport(type); if (type === "string" && !support.uint8array) { this.reader = new StringReader(data, this.loadOptions.optimizedBinaryString); } else if (type === "nodebuffer") { this.reader = new NodeBufferReader(data); } - else { + else if (support.uint8array) { this.reader = new Uint8ArrayReader(utils.transformTo("uint8array", data)); + } else if (support.array) { + this.reader = new ArrayReader(utils.transformTo("array", data)); + } else { + throw new Error("Unexpected error: unsupported type '" + type + "'"); } }, /** * Read a zip file and create ZipEntries. - * @param {string|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file. + * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file. */ load: function(data) { this.prepareReader(data); @@ -2344,12 +2596,17 @@ ZipEntries.prototype = { // }}} end of ZipEntries module.exports = ZipEntries; -},{"./nodeBufferReader":12,"./object":13,"./signature":14,"./stringReader":15,"./support":17,"./uint8ArrayReader":18,"./utils":21,"./zipEntry":23}],23:[function(_dereq_,module,exports){ +},{"./arrayReader":1,"./nodeBufferReader":13,"./object":14,"./signature":15,"./stringReader":16,"./support":18,"./uint8ArrayReader":19,"./utils":22,"./zipEntry":24}],24:[function(require,module,exports){ 'use strict'; -var StringReader = _dereq_('./stringReader'); -var utils = _dereq_('./utils'); -var CompressedObject = _dereq_('./compressedObject'); -var jszipProto = _dereq_('./object'); +var StringReader = require('./stringReader'); +var utils = require('./utils'); +var CompressedObject = require('./compressedObject'); +var jszipProto = require('./object'); +var support = require('./support'); + +var MADE_BY_DOS = 0x00; +var MADE_BY_UNIX = 0x03; + // class ZipEntry {{{ /** * An entry in the zip file. @@ -2443,7 +2700,7 @@ ZipEntry.prototype = { // Unfortunately, this lead also to some issues : http://seclists.org/fulldisclosure/2009/Sep/394 this.fileNameLength = reader.readInt(2); localExtraFieldsLength = reader.readInt(2); // can't be sure this will be the same as the central dir - this.fileName = reader.readString(this.fileNameLength); + this.fileName = reader.readData(this.fileNameLength); reader.skip(localExtraFieldsLength); if (this.compressedSize == -1 || this.uncompressedSize == -1) { @@ -2452,7 +2709,7 @@ ZipEntry.prototype = { compression = utils.findCompression(this.compressionMethod); if (compression === null) { // no compression found - throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + this.fileName + ")"); + throw new Error("Corrupted zip : compression " + utils.pretty(this.compressionMethod) + " unknown (inner file : " + utils.transformTo("string", this.fileName) + ")"); } this.decompressed = new CompressedObject(); this.decompressed.compressedSize = this.compressedSize; @@ -2476,7 +2733,7 @@ ZipEntry.prototype = { * @param {DataReader} reader the reader to use. */ readCentralPart: function(reader) { - this.versionMadeBy = reader.readString(2); + this.versionMadeBy = reader.readInt(2); this.versionNeeded = reader.readInt(2); this.bitFlag = reader.readInt(2); this.compressionMethod = reader.readString(2); @@ -2496,14 +2753,41 @@ ZipEntry.prototype = { throw new Error("Encrypted zip are not supported"); } - this.fileName = reader.readString(this.fileNameLength); + this.fileName = reader.readData(this.fileNameLength); this.readExtraFields(reader); this.parseZIP64ExtraField(reader); - this.fileComment = reader.readString(this.fileCommentLength); + this.fileComment = reader.readData(this.fileCommentLength); + }, + + /** + * Parse the external file attributes and get the unix/dos permissions. + */ + processAttributes: function () { + this.unixPermissions = null; + this.dosPermissions = null; + var madeBy = this.versionMadeBy >> 8; + + // Check if we have the DOS directory flag set. + // We look for it in the DOS and UNIX permissions + // but some unknown platform could set it as a compatibility flag. + this.dir = this.externalFileAttributes & 0x0010 ? true : false; + + if(madeBy === MADE_BY_DOS) { + // first 6 bits (0 to 5) + this.dosPermissions = this.externalFileAttributes & 0x3F; + } - // warning, this is true only for zip with madeBy == DOS (plateform dependent feature) - this.dir = this.externalFileAttributes & 0x00000010 ? true : false; + if(madeBy === MADE_BY_UNIX) { + this.unixPermissions = (this.externalFileAttributes >> 16) & 0xFFFF; + // the octal permissions are in (this.unixPermissions & 0x01FF).toString(8); + } + + // fail safe : if the name ends with a / it probably means a folder + if (!this.dir && this.fileNameStr.slice(-1) === '/') { + this.dir = true; + } }, + /** * Parse the ZIP64 extra field and merge the info in the current ZipEntry. * @param {DataReader} reader the reader to use. @@ -2560,24 +2844,32 @@ ZipEntry.prototype = { * Apply an UTF8 transformation if needed. */ handleUTF8: function() { + var decodeParamType = support.uint8array ? "uint8array" : "array"; if (this.useUTF8()) { - this.fileName = jszipProto.utf8decode(this.fileName); - this.fileComment = jszipProto.utf8decode(this.fileComment); + this.fileNameStr = jszipProto.utf8decode(this.fileName); + this.fileCommentStr = jszipProto.utf8decode(this.fileComment); } else { var upath = this.findExtraFieldUnicodePath(); if (upath !== null) { - this.fileName = upath; + this.fileNameStr = upath; + } else { + var fileNameByteArray = utils.transformTo(decodeParamType, this.fileName); + this.fileNameStr = this.loadOptions.decodeFileName(fileNameByteArray); } + var ucomment = this.findExtraFieldUnicodeComment(); if (ucomment !== null) { - this.fileComment = ucomment; + this.fileCommentStr = ucomment; + } else { + var commentByteArray = utils.transformTo(decodeParamType, this.fileComment); + this.fileCommentStr = this.loadOptions.decodeFileName(commentByteArray); } } }, /** * Find the unicode path declared in the extra field, if any. - * @return {string} the unicode path, null otherwise. + * @return {String} the unicode path, null otherwise. */ findExtraFieldUnicodePath: function() { var upathField = this.extraFields[0x7075]; @@ -2601,7 +2893,7 @@ ZipEntry.prototype = { /** * Find the unicode comment declared in the extra field, if any. - * @return {string} the unicode comment, null otherwise. + * @return {String} the unicode comment, null otherwise. */ findExtraFieldUnicodeComment: function() { var ucommentField = this.extraFields[0x6375]; @@ -2625,31 +2917,33 @@ ZipEntry.prototype = { }; module.exports = ZipEntry; -},{"./compressedObject":2,"./object":13,"./stringReader":15,"./utils":21}],24:[function(_dereq_,module,exports){ +},{"./compressedObject":3,"./object":14,"./stringReader":16,"./support":18,"./utils":22}],25:[function(require,module,exports){ // Top level file is just a mixin of submodules & constants 'use strict'; -var assign = _dereq_('./lib/utils/common').assign; +var assign = require('./lib/utils/common').assign; -var deflate = _dereq_('./lib/deflate'); -var inflate = _dereq_('./lib/inflate'); -var constants = _dereq_('./lib/zlib/constants'); +var deflate = require('./lib/deflate'); +var inflate = require('./lib/inflate'); +var constants = require('./lib/zlib/constants'); var pako = {}; assign(pako, deflate, inflate, constants); module.exports = pako; -},{"./lib/deflate":25,"./lib/inflate":26,"./lib/utils/common":27,"./lib/zlib/constants":30}],25:[function(_dereq_,module,exports){ + +},{"./lib/deflate":26,"./lib/inflate":27,"./lib/utils/common":28,"./lib/zlib/constants":31}],26:[function(require,module,exports){ 'use strict'; -var zlib_deflate = _dereq_('./zlib/deflate.js'); -var utils = _dereq_('./utils/common'); -var strings = _dereq_('./utils/strings'); -var msg = _dereq_('./zlib/messages'); -var zstream = _dereq_('./zlib/zstream'); +var zlib_deflate = require('./zlib/deflate'); +var utils = require('./utils/common'); +var strings = require('./utils/strings'); +var msg = require('./zlib/messages'); +var ZStream = require('./zlib/zstream'); +var toString = Object.prototype.toString; /* Public constants ==========================================================*/ /* ===========================================================================*/ @@ -2659,6 +2953,7 @@ var Z_FINISH = 4; var Z_OK = 0; var Z_STREAM_END = 1; +var Z_SYNC_FLUSH = 2; var Z_DEFAULT_COMPRESSION = -1; @@ -2688,7 +2983,9 @@ var Z_DEFLATED = 8; * * Compressed result, generated by default [[Deflate#onData]] * and [[Deflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Deflate#push]] with `Z_FINISH` / `true` param). + * (call [[Deflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Deflate#push]] with + * `Z_SYNC_FLUSH` param). **/ /** @@ -2718,6 +3015,7 @@ var Z_DEFLATED = 8; * - `windowBits` * - `memLevel` * - `strategy` + * - `dictionary` * * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) * for more information on these. @@ -2755,7 +3053,8 @@ var Z_DEFLATED = 8; * console.log(deflate.result); * ``` **/ -var Deflate = function(options) { +function Deflate(options) { + if (!(this instanceof Deflate)) return new Deflate(options); this.options = utils.assign({ level: Z_DEFAULT_COMPRESSION, @@ -2782,7 +3081,7 @@ var Deflate = function(options) { this.ended = false; // used to avoid multiple onEnd() calls this.chunks = []; // chunks of compressed data - this.strm = new zstream(); + this.strm = new ZStream(); this.strm.avail_out = 0; var status = zlib_deflate.deflateInit2( @@ -2801,19 +3100,41 @@ var Deflate = function(options) { if (opt.header) { zlib_deflate.deflateSetHeader(this.strm, opt.header); } -}; + + if (opt.dictionary) { + var dict; + // Convert data if needed + if (typeof opt.dictionary === 'string') { + // If we need to compress text, change encoding to utf8. + dict = strings.string2buf(opt.dictionary); + } else if (toString.call(opt.dictionary) === '[object ArrayBuffer]') { + dict = new Uint8Array(opt.dictionary); + } else { + dict = opt.dictionary; + } + + status = zlib_deflate.deflateSetDictionary(this.strm, dict); + + if (status !== Z_OK) { + throw new Error(msg[status]); + } + + this._dict_set = true; + } +} /** * Deflate#push(data[, mode]) -> Boolean - * - data (Uint8Array|Array|String): input data. Strings will be converted to - * utf8 byte sequence. + * - data (Uint8Array|Array|ArrayBuffer|String): input data. Strings will be + * converted to utf8 byte sequence. * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. * * Sends input data to deflate pipe, generating [[Deflate#onData]] calls with * new compressed chunks. Returns `true` on success. The last data block must have - * mode Z_FINISH (or `true`). That flush internal pending buffers and call - * [[Deflate#onEnd]]. + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Deflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the compression context. * * On fail call [[Deflate#onEnd]] with error code and return false. * @@ -2831,7 +3152,7 @@ var Deflate = function(options) { * push(chunk, true); // push last chunk * ``` **/ -Deflate.prototype.push = function(data, mode) { +Deflate.prototype.push = function (data, mode) { var strm = this.strm; var chunkSize = this.options.chunkSize; var status, _mode; @@ -2844,6 +3165,8 @@ Deflate.prototype.push = function(data, mode) { if (typeof data === 'string') { // If we need to compress text, change encoding to utf8. strm.input = strings.string2buf(data); + } else if (toString.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); } else { strm.input = data; } @@ -2864,7 +3187,7 @@ Deflate.prototype.push = function(data, mode) { this.ended = true; return false; } - if (strm.avail_out === 0 || (strm.avail_in === 0 && _mode === Z_FINISH)) { + if (strm.avail_out === 0 || (strm.avail_in === 0 && (_mode === Z_FINISH || _mode === Z_SYNC_FLUSH))) { if (this.options.to === 'string') { this.onData(strings.buf2binstring(utils.shrinkBuf(strm.output, strm.next_out))); } else { @@ -2881,6 +3204,13 @@ Deflate.prototype.push = function(data, mode) { return status === Z_OK; } + // callback interim results if Z_SYNC_FLUSH. + if (_mode === Z_SYNC_FLUSH) { + this.onEnd(Z_OK); + strm.avail_out = 0; + return true; + } + return true; }; @@ -2894,7 +3224,7 @@ Deflate.prototype.push = function(data, mode) { * By default, stores data blocks in `chunks[]` property and glue * those in `onEnd`. Override this handler, if you need another behaviour. **/ -Deflate.prototype.onData = function(chunk) { +Deflate.prototype.onData = function (chunk) { this.chunks.push(chunk); }; @@ -2904,11 +3234,12 @@ Deflate.prototype.onData = function(chunk) { * - status (Number): deflate status. 0 (Z_OK) on success, * other if not. * - * Called once after you tell deflate that input stream complete - * or error happenned. By default - join collected chunks, + * Called once after you tell deflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, * free memory and fill `results` / `err` properties. **/ -Deflate.prototype.onEnd = function(status) { +Deflate.prototype.onEnd = function (status) { // On success - join if (status === Z_OK) { if (this.options.to === 'string') { @@ -2928,7 +3259,7 @@ Deflate.prototype.onEnd = function(status) { * - data (Uint8Array|Array|String): input data to compress. * - options (Object): zlib deflate options. * - * Compress `data` with deflate alrorythm and `options`. + * Compress `data` with deflate algorithm and `options`. * * Supported options are: * @@ -2936,6 +3267,7 @@ Deflate.prototype.onEnd = function(status) { * - windowBits * - memLevel * - strategy + * - dictionary * * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) * for more information on these. @@ -3002,18 +3334,20 @@ exports.Deflate = Deflate; exports.deflate = deflate; exports.deflateRaw = deflateRaw; exports.gzip = gzip; -},{"./utils/common":27,"./utils/strings":28,"./zlib/deflate.js":32,"./zlib/messages":37,"./zlib/zstream":39}],26:[function(_dereq_,module,exports){ + +},{"./utils/common":28,"./utils/strings":29,"./zlib/deflate":33,"./zlib/messages":38,"./zlib/zstream":40}],27:[function(require,module,exports){ 'use strict'; -var zlib_inflate = _dereq_('./zlib/inflate.js'); -var utils = _dereq_('./utils/common'); -var strings = _dereq_('./utils/strings'); -var c = _dereq_('./zlib/constants'); -var msg = _dereq_('./zlib/messages'); -var zstream = _dereq_('./zlib/zstream'); -var gzheader = _dereq_('./zlib/gzheader'); +var zlib_inflate = require('./zlib/inflate'); +var utils = require('./utils/common'); +var strings = require('./utils/strings'); +var c = require('./zlib/constants'); +var msg = require('./zlib/messages'); +var ZStream = require('./zlib/zstream'); +var GZheader = require('./zlib/gzheader'); +var toString = Object.prototype.toString; /** * class Inflate @@ -3034,7 +3368,9 @@ var gzheader = _dereq_('./zlib/gzheader'); * * Uncompressed result, generated by default [[Inflate#onData]] * and [[Inflate#onEnd]] handlers. Filled after you push last chunk - * (call [[Inflate#push]] with `Z_FINISH` / `true` param). + * (call [[Inflate#push]] with `Z_FINISH` / `true` param) or if you + * push a chunk with explicit flush (call [[Inflate#push]] with + * `Z_SYNC_FLUSH` param). **/ /** @@ -3059,6 +3395,7 @@ var gzheader = _dereq_('./zlib/gzheader'); * on bad params. Supported options: * * - `windowBits` + * - `dictionary` * * [http://zlib.net/manual.html#Advanced](http://zlib.net/manual.html#Advanced) * for more information on these. @@ -3091,7 +3428,8 @@ var gzheader = _dereq_('./zlib/gzheader'); * console.log(inflate.result); * ``` **/ -var Inflate = function(options) { +function Inflate(options) { + if (!(this instanceof Inflate)) return new Inflate(options); this.options = utils.assign({ chunkSize: 16384, @@ -3129,7 +3467,7 @@ var Inflate = function(options) { this.ended = false; // used to avoid multiple onEnd() calls this.chunks = []; // chunks of compressed data - this.strm = new zstream(); + this.strm = new ZStream(); this.strm.avail_out = 0; var status = zlib_inflate.inflateInit2( @@ -3141,21 +3479,22 @@ var Inflate = function(options) { throw new Error(msg[status]); } - this.header = new gzheader(); + this.header = new GZheader(); zlib_inflate.inflateGetHeader(this.strm, this.header); -}; +} /** * Inflate#push(data[, mode]) -> Boolean - * - data (Uint8Array|Array|String): input data + * - data (Uint8Array|Array|ArrayBuffer|String): input data * - mode (Number|Boolean): 0..6 for corresponding Z_NO_FLUSH..Z_TREE modes. * See constants. Skipped or `false` means Z_NO_FLUSH, `true` meansh Z_FINISH. * * Sends input data to inflate pipe, generating [[Inflate#onData]] calls with * new output chunks. Returns `true` on success. The last data block must have - * mode Z_FINISH (or `true`). That flush internal pending buffers and call - * [[Inflate#onEnd]]. + * mode Z_FINISH (or `true`). That will flush internal pending buffers and call + * [[Inflate#onEnd]]. For interim explicit flushes (without ending the stream) you + * can use mode Z_SYNC_FLUSH, keeping the decompression context. * * On fail call [[Inflate#onEnd]] with error code and return false. * @@ -3173,11 +3512,17 @@ var Inflate = function(options) { * push(chunk, true); // push last chunk * ``` **/ -Inflate.prototype.push = function(data, mode) { +Inflate.prototype.push = function (data, mode) { var strm = this.strm; var chunkSize = this.options.chunkSize; + var dictionary = this.options.dictionary; var status, _mode; var next_out_utf8, tail, utf8str; + var dict; + + // Flag to properly process Z_BUF_ERROR on testing inflate call + // when we check that all output data was flushed. + var allowBufError = false; if (this.ended) { return false; } _mode = (mode === ~~mode) ? mode : ((mode === true) ? c.Z_FINISH : c.Z_NO_FLUSH); @@ -3186,6 +3531,8 @@ Inflate.prototype.push = function(data, mode) { if (typeof data === 'string') { // Only binary strings can be decompressed on practice strm.input = strings.binstring2buf(data); + } else if (toString.call(data) === '[object ArrayBuffer]') { + strm.input = new Uint8Array(data); } else { strm.input = data; } @@ -3202,6 +3549,25 @@ Inflate.prototype.push = function(data, mode) { status = zlib_inflate.inflate(strm, c.Z_NO_FLUSH); /* no bad return value */ + if (status === c.Z_NEED_DICT && dictionary) { + // Convert data if needed + if (typeof dictionary === 'string') { + dict = strings.string2buf(dictionary); + } else if (toString.call(dictionary) === '[object ArrayBuffer]') { + dict = new Uint8Array(dictionary); + } else { + dict = dictionary; + } + + status = zlib_inflate.inflateSetDictionary(this.strm, dict); + + } + + if (status === c.Z_BUF_ERROR && allowBufError === true) { + status = c.Z_OK; + allowBufError = false; + } + if (status !== c.Z_STREAM_END && status !== c.Z_OK) { this.onEnd(status); this.ended = true; @@ -3209,7 +3575,7 @@ Inflate.prototype.push = function(data, mode) { } if (strm.next_out) { - if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && _mode === c.Z_FINISH)) { + if (strm.avail_out === 0 || status === c.Z_STREAM_END || (strm.avail_in === 0 && (_mode === c.Z_FINISH || _mode === c.Z_SYNC_FLUSH))) { if (this.options.to === 'string') { @@ -3230,11 +3596,24 @@ Inflate.prototype.push = function(data, mode) { } } } - } while ((strm.avail_in > 0) && status !== c.Z_STREAM_END); + + // When no more input data, we should check that internal inflate buffers + // are flushed. The only way to do it when avail_out = 0 - run one more + // inflate pass. But if output data not exists, inflate return Z_BUF_ERROR. + // Here we set flag to process this error properly. + // + // NOTE. Deflate does not return error in this case and does not needs such + // logic. + if (strm.avail_in === 0 && strm.avail_out === 0) { + allowBufError = true; + } + + } while ((strm.avail_in > 0 || strm.avail_out === 0) && status !== c.Z_STREAM_END); if (status === c.Z_STREAM_END) { _mode = c.Z_FINISH; } + // Finalize on the last chunk. if (_mode === c.Z_FINISH) { status = zlib_inflate.inflateEnd(this.strm); @@ -3243,6 +3622,13 @@ Inflate.prototype.push = function(data, mode) { return status === c.Z_OK; } + // callback interim results if Z_SYNC_FLUSH. + if (_mode === c.Z_SYNC_FLUSH) { + this.onEnd(c.Z_OK); + strm.avail_out = 0; + return true; + } + return true; }; @@ -3256,7 +3642,7 @@ Inflate.prototype.push = function(data, mode) { * By default, stores data blocks in `chunks[]` property and glue * those in `onEnd`. Override this handler, if you need another behaviour. **/ -Inflate.prototype.onData = function(chunk) { +Inflate.prototype.onData = function (chunk) { this.chunks.push(chunk); }; @@ -3266,11 +3652,12 @@ Inflate.prototype.onData = function(chunk) { * - status (Number): inflate status. 0 (Z_OK) on success, * other if not. * - * Called once after you tell inflate that input stream complete - * or error happenned. By default - join collected chunks, + * Called either after you tell inflate that the input stream is + * complete (Z_FINISH) or should be flushed (Z_SYNC_FLUSH) + * or if an error happened. By default - join collected chunks, * free memory and fill `results` / `err` properties. **/ -Inflate.prototype.onEnd = function(status) { +Inflate.prototype.onEnd = function (status) { // On success - join if (status === c.Z_OK) { if (this.options.to === 'string') { @@ -3368,7 +3755,7 @@ exports.inflate = inflate; exports.inflateRaw = inflateRaw; exports.ungzip = inflate; -},{"./utils/common":27,"./utils/strings":28,"./zlib/constants":30,"./zlib/gzheader":33,"./zlib/inflate.js":35,"./zlib/messages":37,"./zlib/zstream":39}],27:[function(_dereq_,module,exports){ +},{"./utils/common":28,"./utils/strings":29,"./zlib/constants":31,"./zlib/gzheader":34,"./zlib/inflate":36,"./zlib/messages":38,"./zlib/zstream":40}],28:[function(require,module,exports){ 'use strict'; @@ -3383,7 +3770,7 @@ exports.assign = function (obj /*from1, from2, from3, ...*/) { var source = sources.shift(); if (!source) { continue; } - if (typeof(source) !== 'object') { + if (typeof source !== 'object') { throw new TypeError(source + 'must be non-object'); } @@ -3410,28 +3797,28 @@ exports.shrinkBuf = function (buf, size) { var fnTyped = { arraySet: function (dest, src, src_offs, len, dest_offs) { if (src.subarray && dest.subarray) { - dest.set(src.subarray(src_offs, src_offs+len), dest_offs); + dest.set(src.subarray(src_offs, src_offs + len), dest_offs); return; } // Fallback to ordinary array - for(var i=0; i= 252 ? 6 : i >= 248 ? 5 : i >= 240 ? 4 : i >= 224 ? 3 : i >= 192 ? 2 : 1); +for (var q = 0; q < 256; q++) { + _utf8len[q] = (q >= 252 ? 6 : q >= 248 ? 5 : q >= 240 ? 4 : q >= 224 ? 3 : q >= 192 ? 2 : 1); } -_utf8len[254]=_utf8len[254]=1; // Invalid sequence start +_utf8len[254] = _utf8len[254] = 1; // Invalid sequence start // convert string to array (typed, when possible) @@ -3508,8 +3896,8 @@ exports.string2buf = function (str) { // count binary size for (m_pos = 0; m_pos < str_len; m_pos++) { c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { - c2 = str.charCodeAt(m_pos+1); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); if ((c2 & 0xfc00) === 0xdc00) { c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); m_pos++; @@ -3522,10 +3910,10 @@ exports.string2buf = function (str) { buf = new utils.Buf8(buf_len); // convert - for (i=0, m_pos = 0; i < buf_len; m_pos++) { + for (i = 0, m_pos = 0; i < buf_len; m_pos++) { c = str.charCodeAt(m_pos); - if ((c & 0xfc00) === 0xd800 && (m_pos+1 < str_len)) { - c2 = str.charCodeAt(m_pos+1); + if ((c & 0xfc00) === 0xd800 && (m_pos + 1 < str_len)) { + c2 = str.charCodeAt(m_pos + 1); if ((c2 & 0xfc00) === 0xdc00) { c = 0x10000 + ((c - 0xd800) << 10) + (c2 - 0xdc00); m_pos++; @@ -3565,7 +3953,7 @@ function buf2binstring(buf, len) { } var result = ''; - for(var i=0; i < len; i++) { + for (var i = 0; i < len; i++) { result += String.fromCharCode(buf[i]); } return result; @@ -3573,15 +3961,15 @@ function buf2binstring(buf, len) { // Convert byte array to binary string -exports.buf2binstring = function(buf) { +exports.buf2binstring = function (buf) { return buf2binstring(buf, buf.length); }; // Convert binary string (typed, when possible) -exports.binstring2buf = function(str) { +exports.binstring2buf = function (str) { var buf = new utils.Buf8(str.length); - for(var i=0, len=buf.length; i < len; i++) { + for (var i = 0, len = buf.length; i < len; i++) { buf[i] = str.charCodeAt(i); } return buf; @@ -3596,16 +3984,16 @@ exports.buf2string = function (buf, max) { // Reserve max possible length (2 words per char) // NB: by unknown reasons, Array is significantly faster for // String.fromCharCode.apply than Uint16Array. - var utf16buf = new Array(len*2); + var utf16buf = new Array(len * 2); - for (out=0, i=0; i 4) { utf16buf[out++] = 0xfffd; i += c_len-1; continue; } + if (c_len > 4) { utf16buf[out++] = 0xfffd; i += c_len - 1; continue; } // apply mask on first byte c &= c_len === 2 ? 0x1f : c_len === 3 ? 0x0f : 0x07; @@ -3637,14 +4025,14 @@ exports.buf2string = function (buf, max) { // // buf[] - utf8 bytes array // max - length limit (mandatory); -exports.utf8border = function(buf, max) { +exports.utf8border = function (buf, max) { var pos; max = max || buf.length; if (max > buf.length) { max = buf.length; } // go back from last position, until start of sequence found - pos = max-1; + pos = max - 1; while (pos >= 0 && (buf[pos] & 0xC0) === 0x80) { pos--; } // Fuckup - very small and broken sequence, @@ -3658,7 +4046,7 @@ exports.utf8border = function(buf, max) { return (pos + _utf8len[buf[pos]] > max) ? pos : max; }; -},{"./common":27}],29:[function(_dereq_,module,exports){ +},{"./common":28}],30:[function(require,module,exports){ 'use strict'; // Note: adler32 takes 12% for level 0 and 2% for level 6. @@ -3666,9 +4054,9 @@ exports.utf8border = function(buf, max) { // Small size is preferable. function adler32(adler, buf, len, pos) { - var s1 = (adler & 0xffff) |0 - , s2 = ((adler >>> 16) & 0xffff) |0 - , n = 0; + var s1 = (adler & 0xffff) |0, + s2 = ((adler >>> 16) & 0xffff) |0, + n = 0; while (len !== 0) { // Set limit ~ twice less than 5552, to keep @@ -3691,7 +4079,11 @@ function adler32(adler, buf, len, pos) { module.exports = adler32; -},{}],30:[function(_dereq_,module,exports){ + +},{}],31:[function(require,module,exports){ +'use strict'; + + module.exports = { /* Allowed flush values; see deflate() and inflate() below for details */ @@ -3739,7 +4131,8 @@ module.exports = { Z_DEFLATED: 8 //Z_NULL: null // Use -1 or null inline, depending on var type }; -},{}],31:[function(_dereq_,module,exports){ + +},{}],32:[function(require,module,exports){ 'use strict'; // Note: we can't get significant speed boost here. @@ -3751,10 +4144,10 @@ module.exports = { function makeTable() { var c, table = []; - for(var n =0; n < 256; n++){ + for (var n = 0; n < 256; n++) { c = n; - for(var k =0; k < 8; k++){ - c = ((c&1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); + for (var k = 0; k < 8; k++) { + c = ((c & 1) ? (0xEDB88320 ^ (c >>> 1)) : (c >>> 1)); } table[n] = c; } @@ -3767,12 +4160,12 @@ var crcTable = makeTable(); function crc32(crc, buf, len, pos) { - var t = crcTable - , end = pos + len; + var t = crcTable, + end = pos + len; - crc = crc ^ (-1); + crc ^= -1; - for (var i = pos; i < end; i++ ) { + for (var i = pos; i < end; i++) { crc = (crc >>> 8) ^ t[(crc ^ buf[i]) & 0xFF]; } @@ -3781,14 +4174,15 @@ function crc32(crc, buf, len, pos) { module.exports = crc32; -},{}],32:[function(_dereq_,module,exports){ + +},{}],33:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('../utils/common'); -var trees = _dereq_('./trees'); -var adler32 = _dereq_('./adler32'); -var crc32 = _dereq_('./crc32'); -var msg = _dereq_('./messages'); +var utils = require('../utils/common'); +var trees = require('./trees'); +var adler32 = require('./adler32'); +var crc32 = require('./crc32'); +var msg = require('./messages'); /* Public constants ==========================================================*/ /* ===========================================================================*/ @@ -3861,7 +4255,7 @@ var D_CODES = 30; /* number of distance codes */ var BL_CODES = 19; /* number of codes used to transfer the bit lengths */ -var HEAP_SIZE = 2*L_CODES + 1; +var HEAP_SIZE = 2 * L_CODES + 1; /* maximum heap size */ var MAX_BITS = 15; /* All codes must not exceed MAX_BITS bits */ @@ -3927,7 +4321,7 @@ function flush_pending(strm) { } -function flush_block_only (s, last) { +function flush_block_only(s, last) { trees._tr_flush_block(s, (s.block_start >= 0 ? s.block_start : -1), s.strstart - s.block_start, last); s.block_start = s.strstart; flush_pending(s.strm); @@ -3967,6 +4361,7 @@ function read_buf(strm, buf, start, size) { strm.avail_in -= len; + // zmemcpy(buf, strm->next_in, len); utils.arraySet(buf, strm.input, strm.next_in, len, start); if (strm.state.wrap === 1) { strm.adler = adler32(strm.adler, buf, len, start); @@ -4197,7 +4592,7 @@ function fill_window(s) { //#endif while (s.insert) { /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ - s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH-1]) & s.hash_mask; + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; s.prev[str & s.w_mask] = s.head[s.ins_h]; s.head[s.ins_h] = str; @@ -4461,7 +4856,7 @@ function deflate_fast(s, flush) { /***/ } } - s.insert = ((s.strstart < (MIN_MATCH-1)) ? s.strstart : MIN_MATCH-1); + s.insert = ((s.strstart < (MIN_MATCH - 1)) ? s.strstart : MIN_MATCH - 1); if (flush === Z_FINISH) { /*** FLUSH_BLOCK(s, 1); ***/ flush_block_only(s, true); @@ -4524,10 +4919,10 @@ function deflate_slow(s, flush) { */ s.prev_length = s.match_length; s.prev_match = s.match_start; - s.match_length = MIN_MATCH-1; + s.match_length = MIN_MATCH - 1; if (hash_head !== 0/*NIL*/ && s.prev_length < s.max_lazy_match && - s.strstart - hash_head <= (s.w_size-MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { + s.strstart - hash_head <= (s.w_size - MIN_LOOKAHEAD)/*MAX_DIST(s)*/) { /* To simplify the code, we prevent matches with the string * of window index 0 (in particular we have to avoid a match * of the string with itself at the start of the input file). @@ -4541,7 +4936,7 @@ function deflate_slow(s, flush) { /* If prev_match is also MIN_MATCH, match_start is garbage * but we will ignore the current match anyway. */ - s.match_length = MIN_MATCH-1; + s.match_length = MIN_MATCH - 1; } } /* If there was a match at the previous step and the current @@ -4555,13 +4950,13 @@ function deflate_slow(s, flush) { /***_tr_tally_dist(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH, bflush);***/ - bflush = trees._tr_tally(s, s.strstart - 1- s.prev_match, s.prev_length - MIN_MATCH); + bflush = trees._tr_tally(s, s.strstart - 1 - s.prev_match, s.prev_length - MIN_MATCH); /* Insert in hash table all strings up to the end of the match. * strstart-1 and strstart are already inserted. If there is not * enough lookahead, the last two strings are not inserted in * the hash table. */ - s.lookahead -= s.prev_length-1; + s.lookahead -= s.prev_length - 1; s.prev_length -= 2; do { if (++s.strstart <= max_insert) { @@ -4573,7 +4968,7 @@ function deflate_slow(s, flush) { } } while (--s.prev_length !== 0); s.match_available = 0; - s.match_length = MIN_MATCH-1; + s.match_length = MIN_MATCH - 1; s.strstart++; if (bflush) { @@ -4592,7 +4987,7 @@ function deflate_slow(s, flush) { */ //Tracevv((stderr,"%c", s->window[s->strstart-1])); /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]); + bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); if (bflush) { /*** FLUSH_BLOCK_ONLY(s, 0) ***/ @@ -4617,11 +5012,11 @@ function deflate_slow(s, flush) { if (s.match_available) { //Tracevv((stderr,"%c", s->window[s->strstart-1])); /*** _tr_tally_lit(s, s.window[s.strstart-1], bflush); ***/ - bflush = trees._tr_tally(s, 0, s.window[s.strstart-1]); + bflush = trees._tr_tally(s, 0, s.window[s.strstart - 1]); s.match_available = 0; } - s.insert = s.strstart < MIN_MATCH-1 ? s.strstart : MIN_MATCH-1; + s.insert = s.strstart < MIN_MATCH - 1 ? s.strstart : MIN_MATCH - 1; if (flush === Z_FINISH) { /*** FLUSH_BLOCK(s, 1); ***/ flush_block_only(s, true); @@ -4801,13 +5196,13 @@ function deflate_huff(s, flush) { * exclude worst case performance for pathological files. Better values may be * found for specific files. */ -var Config = function (good_length, max_lazy, nice_length, max_chain, func) { +function Config(good_length, max_lazy, nice_length, max_chain, func) { this.good_length = good_length; this.max_lazy = max_lazy; this.nice_length = nice_length; this.max_chain = max_chain; this.func = func; -}; +} var configuration_table; @@ -4957,8 +5352,8 @@ function DeflateState() { // Use flat array of DOUBLE size, with interleaved fata, // because JS does not support effective this.dyn_ltree = new utils.Buf16(HEAP_SIZE * 2); - this.dyn_dtree = new utils.Buf16((2*D_CODES+1) * 2); - this.bl_tree = new utils.Buf16((2*BL_CODES+1) * 2); + this.dyn_dtree = new utils.Buf16((2 * D_CODES + 1) * 2); + this.bl_tree = new utils.Buf16((2 * BL_CODES + 1) * 2); zero(this.dyn_ltree); zero(this.dyn_dtree); zero(this.bl_tree); @@ -4968,11 +5363,11 @@ function DeflateState() { this.bl_desc = null; /* desc. for bit length tree */ //ush bl_count[MAX_BITS+1]; - this.bl_count = new utils.Buf16(MAX_BITS+1); + this.bl_count = new utils.Buf16(MAX_BITS + 1); /* number of codes at each bit length for an optimal tree */ //int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */ - this.heap = new utils.Buf16(2*L_CODES+1); /* heap used to build the Huffman trees */ + this.heap = new utils.Buf16(2 * L_CODES + 1); /* heap used to build the Huffman trees */ zero(this.heap); this.heap_len = 0; /* number of elements in the heap */ @@ -4981,7 +5376,7 @@ function DeflateState() { * The same heap array is used to build all trees. */ - this.depth = new utils.Buf16(2*L_CODES+1); //uch depth[2*L_CODES+1]; + this.depth = new utils.Buf16(2 * L_CODES + 1); //uch depth[2*L_CODES+1]; zero(this.depth); /* Depth of each subtree used as tie breaker for trees of equal frequency */ @@ -5147,9 +5542,16 @@ function deflateInit2(strm, level, method, windowBits, memLevel, strategy) { s.lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */ s.pending_buf_size = s.lit_bufsize * 4; + + //overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2); + //s->pending_buf = (uchf *) overlay; s.pending_buf = new utils.Buf8(s.pending_buf_size); - s.d_buf = s.lit_bufsize >> 1; + // It is offset from `s.pending_buf` (size is `s.lit_bufsize * 2`) + //s->d_buf = overlay + s->lit_bufsize/sizeof(ush); + s.d_buf = 1 * s.lit_bufsize; + + //s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize; s.l_buf = (1 + 2) * s.lit_bufsize; s.level = level; @@ -5318,7 +5720,7 @@ function deflate(strm, flush) { put_byte(s, val); } while (val !== 0); - if (s.gzhead.hcrc && s.pending > beg){ + if (s.gzhead.hcrc && s.pending > beg) { strm.adler = crc32(strm.adler, s.pending_buf, s.pending - beg, beg); } if (val === 0) { @@ -5522,12 +5924,94 @@ function deflateEnd(strm) { return status === BUSY_STATE ? err(strm, Z_DATA_ERROR) : Z_OK; } + /* ========================================================================= - * Copy the source state to the destination state + * Initializes the compression dictionary from the given byte + * sequence without producing any compressed output. */ -//function deflateCopy(dest, source) { -// -//} +function deflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; + + var s; + var str, n; + var wrap; + var avail; + var next; + var input; + var tmpDict; + + if (!strm/*== Z_NULL*/ || !strm.state/*== Z_NULL*/) { + return Z_STREAM_ERROR; + } + + s = strm.state; + wrap = s.wrap; + + if (wrap === 2 || (wrap === 1 && s.status !== INIT_STATE) || s.lookahead) { + return Z_STREAM_ERROR; + } + + /* when using zlib wrappers, compute Adler-32 for provided dictionary */ + if (wrap === 1) { + /* adler32(strm->adler, dictionary, dictLength); */ + strm.adler = adler32(strm.adler, dictionary, dictLength, 0); + } + + s.wrap = 0; /* avoid computing Adler-32 in read_buf */ + + /* if dictionary would fill window, just replace the history */ + if (dictLength >= s.w_size) { + if (wrap === 0) { /* already empty otherwise */ + /*** CLEAR_HASH(s); ***/ + zero(s.head); // Fill with NIL (= 0); + s.strstart = 0; + s.block_start = 0; + s.insert = 0; + } + /* use the tail */ + // dictionary = dictionary.slice(dictLength - s.w_size); + tmpDict = new utils.Buf8(s.w_size); + utils.arraySet(tmpDict, dictionary, dictLength - s.w_size, s.w_size, 0); + dictionary = tmpDict; + dictLength = s.w_size; + } + /* insert dictionary into window and hash */ + avail = strm.avail_in; + next = strm.next_in; + input = strm.input; + strm.avail_in = dictLength; + strm.next_in = 0; + strm.input = dictionary; + fill_window(s); + while (s.lookahead >= MIN_MATCH) { + str = s.strstart; + n = s.lookahead - (MIN_MATCH - 1); + do { + /* UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]); */ + s.ins_h = ((s.ins_h << s.hash_shift) ^ s.window[str + MIN_MATCH - 1]) & s.hash_mask; + + s.prev[str & s.w_mask] = s.head[s.ins_h]; + + s.head[s.ins_h] = str; + str++; + } while (--n); + s.strstart = str; + s.lookahead = MIN_MATCH - 1; + fill_window(s); + } + s.strstart += s.lookahead; + s.block_start = s.strstart; + s.insert = s.lookahead; + s.lookahead = 0; + s.match_length = s.prev_length = MIN_MATCH - 1; + s.match_available = 0; + strm.next_in = next; + strm.input = input; + strm.avail_in = avail; + s.wrap = wrap; + return Z_OK; +} + exports.deflateInit = deflateInit; exports.deflateInit2 = deflateInit2; @@ -5536,18 +6020,19 @@ exports.deflateResetKeep = deflateResetKeep; exports.deflateSetHeader = deflateSetHeader; exports.deflate = deflate; exports.deflateEnd = deflateEnd; +exports.deflateSetDictionary = deflateSetDictionary; exports.deflateInfo = 'pako deflate (from Nodeca project)'; /* Not implemented exports.deflateBound = deflateBound; exports.deflateCopy = deflateCopy; -exports.deflateSetDictionary = deflateSetDictionary; exports.deflateParams = deflateParams; exports.deflatePending = deflatePending; exports.deflatePrime = deflatePrime; exports.deflateTune = deflateTune; */ -},{"../utils/common":27,"./adler32":29,"./crc32":31,"./messages":37,"./trees":38}],33:[function(_dereq_,module,exports){ + +},{"../utils/common":28,"./adler32":30,"./crc32":32,"./messages":38,"./trees":39}],34:[function(require,module,exports){ 'use strict'; @@ -5588,7 +6073,8 @@ function GZheader() { } module.exports = GZheader; -},{}],34:[function(_dereq_,module,exports){ + +},{}],35:[function(require,module,exports){ 'use strict'; // See state defs from inflate.js @@ -5643,7 +6129,8 @@ module.exports = function inflate_fast(strm, start) { var wsize; /* window size or zero if not using window */ var whave; /* valid bytes in the window */ var wnext; /* window write index */ - var window; /* allocated sliding window, if wsize != 0 */ + // Use `s_window` instead `window`, avoid conflict with instrumentation tools + var s_window; /* allocated sliding window, if wsize != 0 */ var hold; /* local strm.hold */ var bits; /* local strm.bits */ var lcode; /* local strm.lencode */ @@ -5677,7 +6164,7 @@ module.exports = function inflate_fast(strm, start) { wsize = state.wsize; whave = state.whave; wnext = state.wnext; - window = state.window; + s_window = state.window; hold = state.hold; bits = state.bits; lcode = state.lencode; @@ -5795,13 +6282,13 @@ module.exports = function inflate_fast(strm, start) { //#endif } from = 0; // window index - from_source = window; + from_source = s_window; if (wnext === 0) { /* very common case */ from += wsize - op; if (op < len) { /* some from window */ len -= op; do { - output[_out++] = window[from++]; + output[_out++] = s_window[from++]; } while (--op); from = _out - dist; /* rest from output */ from_source = output; @@ -5813,14 +6300,14 @@ module.exports = function inflate_fast(strm, start) { if (op < len) { /* some from end of window */ len -= op; do { - output[_out++] = window[from++]; + output[_out++] = s_window[from++]; } while (--op); from = 0; if (wnext < len) { /* some from start of window */ op = wnext; len -= op; do { - output[_out++] = window[from++]; + output[_out++] = s_window[from++]; } while (--op); from = _out - dist; /* rest from output */ from_source = output; @@ -5832,7 +6319,7 @@ module.exports = function inflate_fast(strm, start) { if (op < len) { /* some from window */ len -= op; do { - output[_out++] = window[from++]; + output[_out++] = s_window[from++]; } while (--op); from = _out - dist; /* rest from output */ from_source = output; @@ -5915,15 +6402,15 @@ module.exports = function inflate_fast(strm, start) { return; }; -},{}],35:[function(_dereq_,module,exports){ +},{}],36:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('../utils/common'); -var adler32 = _dereq_('./adler32'); -var crc32 = _dereq_('./crc32'); -var inflate_fast = _dereq_('./inffast'); -var inflate_table = _dereq_('./inftrees'); +var utils = require('../utils/common'); +var adler32 = require('./adler32'); +var crc32 = require('./crc32'); +var inflate_fast = require('./inffast'); +var inflate_table = require('./inftrees'); var CODES = 0; var LENS = 1; @@ -6010,7 +6497,7 @@ var MAX_WBITS = 15; var DEF_WBITS = MAX_WBITS; -function ZSWAP32(q) { +function zswap32(q) { return (((q >>> 24) & 0xff) + ((q >>> 8) & 0xff00) + ((q & 0xff00) << 8) + @@ -6203,13 +6690,13 @@ function fixedtables(state) { while (sym < 280) { state.lens[sym++] = 7; } while (sym < 288) { state.lens[sym++] = 8; } - inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, {bits: 9}); + inflate_table(LENS, state.lens, 0, 288, lenfix, 0, state.work, { bits: 9 }); /* distance table */ sym = 0; while (sym < 32) { state.lens[sym++] = 5; } - inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, {bits: 5}); + inflate_table(DISTS, state.lens, 0, 32, distfix, 0, state.work, { bits: 5 }); /* do this just once */ virgin = false; @@ -6251,7 +6738,7 @@ function updatewindow(strm, src, end, copy) { /* copy state->wsize or less output bytes into the circular window */ if (copy >= state.wsize) { - utils.arraySet(state.window,src, end - state.wsize, state.wsize, 0); + utils.arraySet(state.window, src, end - state.wsize, state.wsize, 0); state.wnext = 0; state.whave = state.wsize; } @@ -6261,11 +6748,11 @@ function updatewindow(strm, src, end, copy) { dist = copy; } //zmemcpy(state->window + state->wnext, end - copy, dist); - utils.arraySet(state.window,src, end - copy, dist, state.wnext); + utils.arraySet(state.window, src, end - copy, dist, state.wnext); copy -= dist; if (copy) { //zmemcpy(state->window, end - copy, copy); - utils.arraySet(state.window,src, end - copy, copy, 0); + utils.arraySet(state.window, src, end - copy, copy, 0); state.wnext = copy; state.whave = state.wsize; } @@ -6302,7 +6789,7 @@ function inflate(strm, flush) { var n; // temporary var for NEED_BITS var order = /* permutation of code lengths */ - [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]; + [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ]; if (!strm || !strm.state || !strm.output || @@ -6629,7 +7116,7 @@ function inflate(strm, flush) { state.head.hcrc = ((state.flags >> 9) & 1); state.head.done = true; } - strm.adler = state.check = 0 /*crc32(0L, Z_NULL, 0)*/; + strm.adler = state.check = 0; state.mode = TYPE; break; case DICTID: @@ -6641,7 +7128,7 @@ function inflate(strm, flush) { bits += 8; } //===// - strm.adler = state.check = ZSWAP32(hold); + strm.adler = state.check = zswap32(hold); //=== INITBITS(); hold = 0; bits = 0; @@ -6833,7 +7320,7 @@ function inflate(strm, flush) { state.lencode = state.lendyn; state.lenbits = 7; - opts = {bits: state.lenbits}; + opts = { bits: state.lenbits }; ret = inflate_table(CODES, state.lens, 0, 19, state.lencode, 0, state.work, opts); state.lenbits = opts.bits; @@ -6964,7 +7451,7 @@ function inflate(strm, flush) { concerning the ENOUGH constants, which depend on those values */ state.lenbits = 9; - opts = {bits: state.lenbits}; + opts = { bits: state.lenbits }; ret = inflate_table(LENS, state.lens, 0, state.nlen, state.lencode, 0, state.work, opts); // We have separate tables & no pointers. 2 commented lines below not needed. // state.next_index = opts.table_index; @@ -6981,7 +7468,7 @@ function inflate(strm, flush) { //state.distcode.copy(state.codes); // Switch to use dynamic table state.distcode = state.distdyn; - opts = {bits: state.distbits}; + opts = { bits: state.distbits }; ret = inflate_table(DISTS, state.lens, state.nlen, state.ndist, state.distcode, 0, state.work, opts); // We have separate tables & no pointers. 2 commented lines below not needed. // state.next_index = opts.table_index; @@ -7029,7 +7516,7 @@ function inflate(strm, flush) { } state.back = 0; for (;;) { - here = state.lencode[hold & ((1 << state.lenbits) -1)]; /*BITS(state.lenbits)*/ + here = state.lencode[hold & ((1 << state.lenbits) - 1)]; /*BITS(state.lenbits)*/ here_bits = here >>> 24; here_op = (here >>> 16) & 0xff; here_val = here & 0xffff; @@ -7048,7 +7535,7 @@ function inflate(strm, flush) { last_val = here_val; for (;;) { here = state.lencode[last_val + - ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; here_bits = here >>> 24; here_op = (here >>> 16) & 0xff; here_val = here & 0xffff; @@ -7105,7 +7592,7 @@ function inflate(strm, flush) { bits += 8; } //===// - state.length += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/; + state.length += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; //--- DROPBITS(state.extra) ---// hold >>>= state.extra; bits -= state.extra; @@ -7118,7 +7605,7 @@ function inflate(strm, flush) { /* falls through */ case DIST: for (;;) { - here = state.distcode[hold & ((1 << state.distbits) -1)];/*BITS(state.distbits)*/ + here = state.distcode[hold & ((1 << state.distbits) - 1)];/*BITS(state.distbits)*/ here_bits = here >>> 24; here_op = (here >>> 16) & 0xff; here_val = here & 0xffff; @@ -7137,7 +7624,7 @@ function inflate(strm, flush) { last_val = here_val; for (;;) { here = state.distcode[last_val + - ((hold & ((1 << (last_bits + last_op)) -1))/*BITS(last.bits + last.op)*/ >> last_bits)]; + ((hold & ((1 << (last_bits + last_op)) - 1))/*BITS(last.bits + last.op)*/ >> last_bits)]; here_bits = here >>> 24; here_op = (here >>> 16) & 0xff; here_val = here & 0xffff; @@ -7181,7 +7668,7 @@ function inflate(strm, flush) { bits += 8; } //===// - state.offset += hold & ((1 << state.extra) -1)/*BITS(state.extra)*/; + state.offset += hold & ((1 << state.extra) - 1)/*BITS(state.extra)*/; //--- DROPBITS(state.extra) ---// hold >>>= state.extra; bits -= state.extra; @@ -7275,8 +7762,8 @@ function inflate(strm, flush) { } _out = left; - // NB: crc32 stored as signed 32-bit int, ZSWAP32 returns signed too - if ((state.flags ? hold : ZSWAP32(hold)) !== state.check) { + // NB: crc32 stored as signed 32-bit int, zswap32 returns signed too + if ((state.flags ? hold : zswap32(hold)) !== state.check) { strm.msg = 'incorrect data check'; state.mode = BAD; break; @@ -7398,6 +7885,41 @@ function inflateGetHeader(strm, head) { return Z_OK; } +function inflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; + + var state; + var dictid; + var ret; + + /* check state */ + if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } + state = strm.state; + + if (state.wrap !== 0 && state.mode !== DICT) { + return Z_STREAM_ERROR; + } + + /* check for correct dictionary identifier */ + if (state.mode === DICT) { + dictid = 1; /* adler32(0, null, 0)*/ + /* dictid = adler32(dictid, dictionary, dictLength); */ + dictid = adler32(dictid, dictionary, dictLength, 0); + if (dictid !== state.check) { + return Z_DATA_ERROR; + } + } + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary, dictLength, dictLength); + if (ret) { + state.mode = MEM; + return Z_MEM_ERROR; + } + state.havedict = 1; + // Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} exports.inflateReset = inflateReset; exports.inflateReset2 = inflateReset2; @@ -7407,6 +7929,7 @@ exports.inflateInit2 = inflateInit2; exports.inflate = inflate; exports.inflateEnd = inflateEnd; exports.inflateGetHeader = inflateGetHeader; +exports.inflateSetDictionary = inflateSetDictionary; exports.inflateInfo = 'pako inflate (from Nodeca project)'; /* Not implemented @@ -7414,16 +7937,16 @@ exports.inflateCopy = inflateCopy; exports.inflateGetDictionary = inflateGetDictionary; exports.inflateMark = inflateMark; exports.inflatePrime = inflatePrime; -exports.inflateSetDictionary = inflateSetDictionary; exports.inflateSync = inflateSync; exports.inflateSyncPoint = inflateSyncPoint; exports.inflateUndermine = inflateUndermine; */ -},{"../utils/common":27,"./adler32":29,"./crc32":31,"./inffast":34,"./inftrees":36}],36:[function(_dereq_,module,exports){ + +},{"../utils/common":28,"./adler32":30,"./crc32":32,"./inffast":35,"./inftrees":37}],37:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('../utils/common'); +var utils = require('../utils/common'); var MAXBITS = 15; var ENOUGH_LENS = 852; @@ -7479,8 +8002,8 @@ module.exports = function inflate_table(type, lens, lens_index, codes, table, ta var base_index = 0; // var shoextra; /* extra bits table to use */ var end; /* use base and extra for symbol > end */ - var count = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new utils.Buf16(MAXBITS+1); //[MAXBITS+1]; /* offsets in table for each length */ + var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ + var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ var extra = null; var extra_index = 0; @@ -7616,18 +8139,20 @@ module.exports = function inflate_table(type, lens, lens_index, codes, table, ta // poor man optimization - use if-else instead of switch, // to avoid deopts in old v8 if (type === CODES) { - base = extra = work; /* dummy value--not used */ - end = 19; + base = extra = work; /* dummy value--not used */ + end = 19; + } else if (type === LENS) { - base = lbase; - base_index -= 257; - extra = lext; - extra_index -= 257; - end = 256; + base = lbase; + base_index -= 257; + extra = lext; + extra_index -= 257; + end = 256; + } else { /* DISTS */ - base = dbase; - extra = dext; - end = -1; + base = dbase; + extra = dext; + end = -1; } /* initialize opts for loop */ @@ -7647,7 +8172,7 @@ module.exports = function inflate_table(type, lens, lens_index, codes, table, ta return 1; } - var i=0; + var i = 0; /* process all codes and make table entries */ for (;;) { i++; @@ -7746,13 +8271,13 @@ module.exports = function inflate_table(type, lens, lens_index, codes, table, ta return 0; }; -},{"../utils/common":27}],37:[function(_dereq_,module,exports){ +},{"../utils/common":28}],38:[function(require,module,exports){ 'use strict'; module.exports = { - '2': 'need dictionary', /* Z_NEED_DICT 2 */ - '1': 'stream end', /* Z_STREAM_END 1 */ - '0': '', /* Z_OK 0 */ + 2: 'need dictionary', /* Z_NEED_DICT 2 */ + 1: 'stream end', /* Z_STREAM_END 1 */ + 0: '', /* Z_OK 0 */ '-1': 'file error', /* Z_ERRNO (-1) */ '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ '-3': 'data error', /* Z_DATA_ERROR (-3) */ @@ -7760,11 +8285,12 @@ module.exports = { '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ }; -},{}],38:[function(_dereq_,module,exports){ + +},{}],39:[function(require,module,exports){ 'use strict'; -var utils = _dereq_('../utils/common'); +var utils = require('../utils/common'); /* Public constants ==========================================================*/ /* ===========================================================================*/ @@ -7818,7 +8344,7 @@ var D_CODES = 30; var BL_CODES = 19; /* number of codes used to transfer the bit lengths */ -var HEAP_SIZE = 2*L_CODES + 1; +var HEAP_SIZE = 2 * L_CODES + 1; /* maximum heap size */ var MAX_BITS = 15; @@ -7847,6 +8373,7 @@ var REPZ_3_10 = 17; var REPZ_11_138 = 18; /* repeat a zero length 11-138 times (7 bits of repeat count) */ +/* eslint-disable comma-spacing,array-bracket-spacing */ var extra_lbits = /* extra bits for each length code */ [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; @@ -7858,6 +8385,8 @@ var extra_blbits = /* extra bits for each bit length code */ var bl_order = [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; +/* eslint-enable comma-spacing,array-bracket-spacing */ + /* The lengths of the bit length codes are sent in order of decreasing * probability, to avoid transmitting the lengths for unused bit length codes. */ @@ -7871,7 +8400,7 @@ var bl_order = var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ // !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 -var static_ltree = new Array((L_CODES+2) * 2); +var static_ltree = new Array((L_CODES + 2) * 2); zero(static_ltree); /* The static literal tree. Since the bit lengths are imposed, there is no * need for the L_CODES extra codes used during heap construction. However @@ -7892,7 +8421,7 @@ zero(_dist_code); * the 15 bit distances. */ -var _length_code = new Array(MAX_MATCH-MIN_MATCH+1); +var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); zero(_length_code); /* length code for each normalized match length (0 == MIN_MATCH) */ @@ -7905,7 +8434,7 @@ zero(base_dist); /* First normalized distance for each code (0 = distance of 1) */ -var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_length) { +function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { this.static_tree = static_tree; /* static tree or NULL */ this.extra_bits = extra_bits; /* extra bits for each code or NULL */ @@ -7915,7 +8444,7 @@ var StaticTreeDesc = function (static_tree, extra_bits, extra_base, elems, max_l // show if `static_tree` has data or dummy - needed for monomorphic objects this.has_stree = static_tree && static_tree.length; -}; +} var static_l_desc; @@ -7923,11 +8452,11 @@ var static_d_desc; var static_bl_desc; -var TreeDesc = function(dyn_tree, stat_desc) { +function TreeDesc(dyn_tree, stat_desc) { this.dyn_tree = dyn_tree; /* the dynamic tree */ this.max_code = 0; /* largest code with non zero frequency */ this.stat_desc = stat_desc; /* the corresponding static tree */ -}; +} @@ -7940,7 +8469,7 @@ function d_code(dist) { * Output a short LSB first on the stream. * IN assertion: there is enough room in pendingBuf. */ -function put_short (s, w) { +function put_short(s, w) { // put_byte(s, (uch)((w) & 0xff)); // put_byte(s, (uch)((ush)(w) >> 8)); s.pending_buf[s.pending++] = (w) & 0xff; @@ -7966,7 +8495,7 @@ function send_bits(s, value, length) { function send_code(s, c, tree) { - send_bits(s, tree[c*2]/*.Code*/, tree[c*2 + 1]/*.Len*/); + send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); } @@ -8038,16 +8567,16 @@ function gen_bitlen(s, desc) /* In a first pass, compute the optimal bit lengths (which may * overflow in the case of the bit length tree). */ - tree[s.heap[s.heap_max]*2 + 1]/*.Len*/ = 0; /* root of the heap */ + tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ - for (h = s.heap_max+1; h < HEAP_SIZE; h++) { + for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { n = s.heap[h]; - bits = tree[tree[n*2 +1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; + bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; if (bits > max_length) { bits = max_length; overflow++; } - tree[n*2 + 1]/*.Len*/ = bits; + tree[n * 2 + 1]/*.Len*/ = bits; /* We overwrite tree[n].Dad which is no longer needed */ if (n > max_code) { continue; } /* not a leaf node */ @@ -8055,12 +8584,12 @@ function gen_bitlen(s, desc) s.bl_count[bits]++; xbits = 0; if (n >= base) { - xbits = extra[n-base]; + xbits = extra[n - base]; } f = tree[n * 2]/*.Freq*/; s.opt_len += f * (bits + xbits); if (has_stree) { - s.static_len += f * (stree[n*2 + 1]/*.Len*/ + xbits); + s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); } } if (overflow === 0) { return; } @@ -8070,10 +8599,10 @@ function gen_bitlen(s, desc) /* Find the first bit length which could increase: */ do { - bits = max_length-1; + bits = max_length - 1; while (s.bl_count[bits] === 0) { bits--; } s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits+1] += 2; /* move one overflow item as its brother */ + s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ s.bl_count[max_length]--; /* The brother of the overflow item also moves one step up, * but this does not affect bl_count[max_length] @@ -8091,10 +8620,10 @@ function gen_bitlen(s, desc) while (n !== 0) { m = s.heap[--h]; if (m > max_code) { continue; } - if (tree[m*2 + 1]/*.Len*/ !== bits) { + if (tree[m * 2 + 1]/*.Len*/ !== bits) { // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m*2 + 1]/*.Len*/)*tree[m*2]/*.Freq*/; - tree[m*2 + 1]/*.Len*/ = bits; + s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; + tree[m * 2 + 1]/*.Len*/ = bits; } n--; } @@ -8115,7 +8644,7 @@ function gen_codes(tree, max_code, bl_count) // int max_code; /* largest code with non zero frequency */ // ushf *bl_count; /* number of codes at each bit length */ { - var next_code = new Array(MAX_BITS+1); /* next code value for each bit length */ + var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ var code = 0; /* running code value */ var bits; /* bit index */ var n; /* code index */ @@ -8124,7 +8653,7 @@ function gen_codes(tree, max_code, bl_count) * without bit reversal. */ for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits-1]) << 1; + next_code[bits] = code = (code + bl_count[bits - 1]) << 1; } /* Check that the bit counts in bl_count are consistent. The last code * must be all ones. @@ -8134,10 +8663,10 @@ function gen_codes(tree, max_code, bl_count) //Tracev((stderr,"\ngen_codes: max_code %d ", max_code)); for (n = 0; n <= max_code; n++) { - var len = tree[n*2 + 1]/*.Len*/; + var len = tree[n * 2 + 1]/*.Len*/; if (len === 0) { continue; } /* Now reverse the bits */ - tree[n*2]/*.Code*/ = bi_reverse(next_code[len]++, len); + tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len); //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); @@ -8154,7 +8683,7 @@ function tr_static_init() { var length; /* length value */ var code; /* code value */ var dist; /* distance index */ - var bl_count = new Array(MAX_BITS+1); + var bl_count = new Array(MAX_BITS + 1); /* number of codes at each bit length for an optimal tree */ // do check in _tr_init() @@ -8171,9 +8700,9 @@ function tr_static_init() { /* Initialize the mapping length (0..255) -> length code (0..28) */ length = 0; - for (code = 0; code < LENGTH_CODES-1; code++) { + for (code = 0; code < LENGTH_CODES - 1; code++) { base_length[code] = length; - for (n = 0; n < (1< dist code (0..29) */ dist = 0; - for (code = 0 ; code < 16; code++) { + for (code = 0; code < 16; code++) { base_dist[code] = dist; - for (n = 0; n < (1<>= 7; /* from now on, all distances are divided by 128 */ - for ( ; code < D_CODES; code++) { + for (; code < D_CODES; code++) { base_dist[code] = dist << 7; - for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) { + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { _dist_code[256 + dist++] = code; } } @@ -8209,22 +8738,22 @@ function tr_static_init() { n = 0; while (n <= 143) { - static_ltree[n*2 + 1]/*.Len*/ = 8; + static_ltree[n * 2 + 1]/*.Len*/ = 8; n++; bl_count[8]++; } while (n <= 255) { - static_ltree[n*2 + 1]/*.Len*/ = 9; + static_ltree[n * 2 + 1]/*.Len*/ = 9; n++; bl_count[9]++; } while (n <= 279) { - static_ltree[n*2 + 1]/*.Len*/ = 7; + static_ltree[n * 2 + 1]/*.Len*/ = 7; n++; bl_count[7]++; } while (n <= 287) { - static_ltree[n*2 + 1]/*.Len*/ = 8; + static_ltree[n * 2 + 1]/*.Len*/ = 8; n++; bl_count[8]++; } @@ -8232,18 +8761,18 @@ function tr_static_init() { * tree construction to get a canonical Huffman tree (longest code * all ones) */ - gen_codes(static_ltree, L_CODES+1, bl_count); + gen_codes(static_ltree, L_CODES + 1, bl_count); /* The static distance tree is trivial: */ for (n = 0; n < D_CODES; n++) { - static_dtree[n*2 + 1]/*.Len*/ = 5; - static_dtree[n*2]/*.Code*/ = bi_reverse(n, 5); + static_dtree[n * 2 + 1]/*.Len*/ = 5; + static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); } // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS); + static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); - static_bl_desc =new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); + static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); //static_init_done = true; } @@ -8256,11 +8785,11 @@ function init_block(s) { var n; /* iterates over tree elements */ /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n*2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n*2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES; n++) { s.bl_tree[n*2]/*.Freq*/ = 0; } + for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } - s.dyn_ltree[END_BLOCK*2]/*.Freq*/ = 1; + s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; s.opt_len = s.static_len = 0; s.last_lit = s.matches = 0; } @@ -8309,8 +8838,8 @@ function copy_block(s, buf, len, header) * the subtrees have equal frequency. This minimizes the worst case length. */ function smaller(tree, n, m, depth) { - var _n2 = n*2; - var _m2 = m*2; + var _n2 = n * 2; + var _m2 = m * 2; return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); } @@ -8331,7 +8860,7 @@ function pqdownheap(s, tree, k) while (j <= s.heap_len) { /* Set j to the smallest of the two sons: */ if (j < s.heap_len && - smaller(tree, s.heap[j+1], s.heap[j], s.depth)) { + smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { j++; } /* Exit if v is smaller than both sons */ @@ -8367,7 +8896,7 @@ function compress_block(s, ltree, dtree) if (s.last_lit !== 0) { do { - dist = (s.pending_buf[s.d_buf + lx*2] << 8) | (s.pending_buf[s.d_buf + lx*2 + 1]); + dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); lc = s.pending_buf[s.l_buf + lx]; lx++; @@ -8377,7 +8906,7 @@ function compress_block(s, ltree, dtree) } else { /* Here, lc is the match length - MIN_MATCH */ code = _length_code[lc]; - send_code(s, code+LITERALS+1, ltree); /* send the length code */ + send_code(s, code + LITERALS + 1, ltree); /* send the length code */ extra = extra_lbits[code]; if (extra !== 0) { lc -= base_length[code]; @@ -8439,7 +8968,7 @@ function build_tree(s, desc) s.depth[n] = 0; } else { - tree[n*2 + 1]/*.Len*/ = 0; + tree[n * 2 + 1]/*.Len*/ = 0; } } @@ -8455,7 +8984,7 @@ function build_tree(s, desc) s.opt_len--; if (has_stree) { - s.static_len -= stree[node*2 + 1]/*.Len*/; + s.static_len -= stree[node * 2 + 1]/*.Len*/; } /* node is 0 or 1 so it does not have extra bits */ } @@ -8486,7 +9015,7 @@ function build_tree(s, desc) /* Create a new node father of n and m */ tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n*2 + 1]/*.Dad*/ = tree[m*2 + 1]/*.Dad*/ = node; + tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; /* and insert the new node in the heap */ s.heap[1/*SMALLEST*/] = node++; @@ -8519,7 +9048,7 @@ function scan_tree(s, tree, max_code) var prevlen = -1; /* last emitted length */ var curlen; /* length of current code */ - var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */ + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ var count = 0; /* repeat count of the current code */ var max_count = 7; /* max repeat count */ @@ -8529,11 +9058,11 @@ function scan_tree(s, tree, max_code) max_count = 138; min_count = 3; } - tree[(max_code+1)*2 + 1]/*.Len*/ = 0xffff; /* guard */ + tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ for (n = 0; n <= max_code; n++) { curlen = nextlen; - nextlen = tree[(n+1)*2 + 1]/*.Len*/; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; if (++count < max_count && curlen === nextlen) { continue; @@ -8544,13 +9073,13 @@ function scan_tree(s, tree, max_code) } else if (curlen !== 0) { if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6*2]/*.Freq*/++; + s.bl_tree[REP_3_6 * 2]/*.Freq*/++; } else if (count <= 10) { - s.bl_tree[REPZ_3_10*2]/*.Freq*/++; + s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; } else { - s.bl_tree[REPZ_11_138*2]/*.Freq*/++; + s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; } count = 0; @@ -8585,7 +9114,7 @@ function send_tree(s, tree, max_code) var prevlen = -1; /* last emitted length */ var curlen; /* length of current code */ - var nextlen = tree[0*2 + 1]/*.Len*/; /* length of next code */ + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ var count = 0; /* repeat count of the current code */ var max_count = 7; /* max repeat count */ @@ -8599,7 +9128,7 @@ function send_tree(s, tree, max_code) for (n = 0; n <= max_code; n++) { curlen = nextlen; - nextlen = tree[(n+1)*2 + 1]/*.Len*/; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; if (++count < max_count && curlen === nextlen) { continue; @@ -8614,15 +9143,15 @@ function send_tree(s, tree, max_code) } //Assert(count >= 3 && count <= 6, " 3_6?"); send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count-3, 2); + send_bits(s, count - 3, 2); } else if (count <= 10) { send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count-3, 3); + send_bits(s, count - 3, 3); } else { send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count-11, 7); + send_bits(s, count - 11, 7); } count = 0; @@ -8664,13 +9193,13 @@ function build_bl_tree(s) { * requires that at least 4 bit length codes be sent. (appnote.txt says * 3 but the actual value used is 4.) */ - for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex]*2 + 1]/*.Len*/ !== 0) { + for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { break; } } /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3*(max_blindex+1) + 5+5+4; + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", // s->opt_len, s->static_len)); @@ -8693,19 +9222,19 @@ function send_all_trees(s, lcodes, dcodes, blcodes) //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, // "too many codes"); //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes-1, 5); - send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */ + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ for (rank = 0; rank < blcodes; rank++) { //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank]*2 + 1]/*.Len*/, 3); + send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); } //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); - send_tree(s, s.dyn_ltree, lcodes-1); /* literal tree */ + send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); - send_tree(s, s.dyn_dtree, dcodes-1); /* distance tree */ + send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } @@ -8733,7 +9262,7 @@ function detect_data_type(s) { /* Check for non-textual ("black-listed") bytes. */ for (n = 0; n <= 31; n++, black_mask >>>= 1) { - if ((black_mask & 1) && (s.dyn_ltree[n*2]/*.Freq*/ !== 0)) { + if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { return Z_BINARY; } } @@ -8790,7 +9319,7 @@ function _tr_stored_block(s, buf, stored_len, last) //ulg stored_len; /* length of input block */ //int last; /* one if this is the last block for a file */ { - send_bits(s, (STORED_BLOCK<<1)+(last ? 1 : 0), 3); /* send block type */ + send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ copy_block(s, buf, stored_len, true); /* with header */ } @@ -8800,7 +9329,7 @@ function _tr_stored_block(s, buf, stored_len, last) * This takes 10 bits, of which 7 may remain in the bit buffer. */ function _tr_align(s) { - send_bits(s, STATIC_TREES<<1, 3); + send_bits(s, STATIC_TREES << 1, 3); send_code(s, END_BLOCK, static_ltree); bi_flush(s); } @@ -8845,8 +9374,8 @@ function _tr_flush_block(s, buf, stored_len, last) max_blindex = build_bl_tree(s); /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len+3+7) >>> 3; - static_lenb = (s.static_len+3+7) >>> 3; + opt_lenb = (s.opt_len + 3 + 7) >>> 3; + static_lenb = (s.static_len + 3 + 7) >>> 3; // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, @@ -8859,7 +9388,7 @@ function _tr_flush_block(s, buf, stored_len, last) opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } - if ((stored_len+4 <= opt_lenb) && (buf !== -1)) { + if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { /* 4: two words for the lengths */ /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. @@ -8872,12 +9401,12 @@ function _tr_flush_block(s, buf, stored_len, last) } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { - send_bits(s, (STATIC_TREES<<1) + (last ? 1 : 0), 3); + send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); compress_block(s, static_ltree, static_dtree); } else { - send_bits(s, (DYN_TREES<<1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code+1, s.d_desc.max_code+1, max_blindex+1); + send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); + send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); compress_block(s, s.dyn_ltree, s.dyn_dtree); } // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); @@ -8912,7 +9441,7 @@ function _tr_tally(s, dist, lc) if (dist === 0) { /* lc is the unmatched char */ - s.dyn_ltree[lc*2]/*.Freq*/++; + s.dyn_ltree[lc * 2]/*.Freq*/++; } else { s.matches++; /* Here, lc is the match length - MIN_MATCH */ @@ -8921,7 +9450,7 @@ function _tr_tally(s, dist, lc) // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); - s.dyn_ltree[(_length_code[lc]+LITERALS+1) * 2]/*.Freq*/++; + s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; } @@ -8948,7 +9477,7 @@ function _tr_tally(s, dist, lc) // } //#endif - return (s.last_lit === s.lit_bufsize-1); + return (s.last_lit === s.lit_bufsize - 1); /* We avoid equality with lit_bufsize because of wraparound at 64K * on 16 bit machines and because stored blocks are restricted to * 64K-1 bytes. @@ -8960,7 +9489,8 @@ exports._tr_stored_block = _tr_stored_block; exports._tr_flush_block = _tr_flush_block; exports._tr_tally = _tr_tally; exports._tr_align = _tr_align; -},{"../utils/common":27}],39:[function(_dereq_,module,exports){ + +},{"../utils/common":28}],40:[function(require,module,exports){ 'use strict'; @@ -8990,6 +9520,6 @@ function ZStream() { } module.exports = ZStream; -},{}]},{},[9]) -(9) -}); + +},{}]},{},[10])(10) +}); \ No newline at end of file From c93e8a9836fc5d6759d5d2d4e3a37f67bfb42de3 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 139/385] Fixed the runtime for Rhino, that could not start since 2013. --- webodf/lib/runtime.js | 1 - 1 file changed, 1 deletion(-) diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 27af9ac78..4971ee93d 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -1249,7 +1249,6 @@ function NodeJSRuntime() { function RhinoRuntime() { "use strict"; var self = this, - Packages = {}, dom = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance(), /**@type{!Packages.javax.xml.parsers.DocumentBuilder}*/ builder, From 4bdbcddab598636fc50ae0653a9692c11cf10213 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 140/385] Renamed a local that shadowed the type of the parser of the dom. --- webodf/lib/runtime.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index a1f50a085..27af9ac78 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -1201,11 +1201,13 @@ function NodeJSRuntime() { Object.defineProperty(proto, "nextElementSibling", {get: nextElementSibling}); } function init() { + // The local is not named DOMParser: it would shadow the name of the + // type it is declared with, and the compiler would see a cycle. var /**@type{!XmlDom}*/ xmldomPackage = /**@type{!XmlDom}*/(require('@xmldom/xmldom')), /**@type{function(new:DOMParser)}*/ - DOMParser = xmldomPackage.DOMParser; - parser = new DOMParser(); + XmlDomParser = xmldomPackage.DOMParser; + parser = new XmlDomParser(); domImplementation = self.parseXML("").implementation; // A browser exposes the dom interfaces globally and the whole library // uses their constants. The package xmldom provides Node, but not From 8ee4b931bc7715296b721c730afa0a95b0f18d3e Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 141/385] Built the viewer of android with the current tools. --- programs/androidviewer/CMakeLists.txt | 14 +++++++------ programs/androidviewer/build.gradle | 29 ++++++++++++++------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/programs/androidviewer/CMakeLists.txt b/programs/androidviewer/CMakeLists.txt index f765cc068..ca870a7e6 100644 --- a/programs/androidviewer/CMakeLists.txt +++ b/programs/androidviewer/CMakeLists.txt @@ -8,20 +8,22 @@ option(WEBODF_ANDROID "Build the viewer of android, that needs its sdk" OFF) if (WEBODF_ANDROID) - # Gradle is downloaded, as the closure compiler and Rhino are: the plugin - # of android needs 8.9 or later, where Debian 13 packages the 4.4.1 of - # 2017, so the one of the distribution is never the right one. - set(GRADLE_VERSION 8.14.3) + # Gradle is downloaded, as the closure compiler and Rhino are: Debian 13 + # packages the 4.4.1 of 2017, where the plugin of android asks for a 9, + # so the one of the distribution is never the right one. The version is + # the oldest line the plugin accepts, 9.5, rather than the newest: the plugin + # says which one it needs when it is applied, and refuses to run below it. + set(GRADLE_VERSION 9.5.1) ExternalProject_Add( Gradle DOWNLOAD_DIR ${EXTERNALS_DOWNLOAD_DIR} URL "https://services.gradle.org/distributions/gradle-${GRADLE_VERSION}-bin.zip" - URL_HASH SHA256=bd71102213493060956ec229d946beee57158dbd89d0e62b91bca0fa2c5f3531 + URL_HASH SHA256=bafc141b619ad6350fd975fc903156dd5c151998cc8b058e8c1044ab5f7b031f CONFIGURE_COMMAND "" BUILD_COMMAND "" INSTALL_COMMAND "" ) - set(GRADLE ${CMAKE_BINARY_DIR}/Gradle-prefix/src/Gradle/bin/gradle) + set(GRADLE ${CMAKE_CURRENT_BINARY_DIR}/Gradle-prefix/src/Gradle/bin/gradle) set(ANDROIDVIEWER_APK ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/androidviewer-release-unsigned.apk) diff --git a/programs/androidviewer/build.gradle b/programs/androidviewer/build.gradle index 1eefaafb2..e9e91e3e0 100644 --- a/programs/androidviewer/build.gradle +++ b/programs/androidviewer/build.gradle @@ -2,37 +2,38 @@ // no plugin, only the library and a page, both read from the assets. The // library is copied there by cmake, see CMakeLists.txt. plugins { - id 'com.android.application' version '8.7.3' + id 'com.android.application' version '9.3.1' } android { - namespace 'org.webodf.viewer' - compileSdk 35 + namespace = 'org.webodf.viewer' + compileSdk = 36 defaultConfig { - applicationId 'org.webodf.viewer' - // 21 is the oldest release the build tools still support, and the - // web view of every release since then reads what the library needs. - minSdk 21 - targetSdk 35 - versionCode 1 - versionName project.findProperty('webodfVersion') ?: '0.0.0' + applicationId = 'org.webodf.viewer' + // 21 is the release the web view began to be updated apart from the + // system in, so it holds a recent engine from there on, and the one + // call the viewer intercepts its requests with was added there too. + minSdk = 21 + targetSdk = 36 + versionCode = 1 + versionName = project.findProperty('webodfVersion') ?: '0.0.0' } buildTypes { release { - minifyEnabled false + minifyEnabled = false } } compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 } } dependencies { // Serves the assets and the cache over https, so that the page may read // the document with XMLHttpRequest. - implementation 'androidx.webkit:webkit:1.12.1' + implementation = 'androidx.webkit:webkit:1.17.0' } From 767838d3249cac5c2a75b7016946a209794cb0dc Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 142/385] Kept eval() out of the compiled library. --- scripts/build.js | 12 +++++-- webodf/lib/runtime.js | 76 +++++++++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 34 deletions(-) diff --git a/scripts/build.js b/scripts/build.js index fec52e243..9d1fba9e6 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -36,12 +36,18 @@ function main() { return Promise.resolve(); } terser = require("terser"); + // The declaration is dropped and the value passed as a definition instead: + // terser only folds an identifier it holds as a constant, and a declared + // variable is not one. Folding it removes the loader of the classes and the + // runner of the scripts from the compiled library, that both read a file + // with eval() and are only used on the sources. + code = code.replace("var IS_COMPILED_CODE = true;", ""); // ecma 5 because the sources are still written for ECMAScript 3. Three - // passes give the same size as the previous closure compiler, that is - // eight percent smaller than a single pass. + // passes give the same size as the previous closure compiler, that is eight + // percent smaller than a single pass. return terser.minify(code, { ecma: 5, - compress: {passes: 3}, + compress: {passes: 3, global_defs: {IS_COMPILED_CODE: true}}, mangle: true, // The license of each source file is dropped: the header of the // compiled file covers the whole result. diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 211fe4c9d..0580339c8 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -1748,6 +1748,28 @@ var webodf = {}; classNames.forEach(visit); return loadList; } + // The five namespaces of the library are gathered here, so that a class may + // be looked up by its name. The compiler reports a partial alias for each + // of them, JSC_PARTIAL_NAMESPACE, as it may no longer flatten what they + // hold, and any way of reading a namespace as a value does it: a map built + // when a class is looked up rather than here, or a function returning them + // one by one, are reported the same way. Only dropping the lookup by name + // would remove it, that this loader exists for. + // + // The warning is left, as it only shows in the target "compiled.js" of the + // build with cmake, that compiles the library and the tests with + // ADVANCED_OPTIMIZATIONS to report more problems, and whose output is never + // run. The library that ships is compiled with SIMPLE_OPTIMIZATIONS, that + // flattens no namespace, and reports none of it. + var /**@type{!Object.}>}*/ + dependencies, + packages = { + webodfcore: webodfcore, + gui: gui, + xmldom: xmldom, + odf: odf, + ops: ops + }; /** * @param {string} path * @param {string} content @@ -1762,15 +1784,22 @@ var webodf = {}; * @param {!Array.} paths */ function loadFiles(paths) { - // this function is not strict, so eval can assign to globals - var i, - content; - for (i = 0; i < paths.length; i += 1) { - content = runtime.readFileSync(paths[i], "utf-8"); - content = addContent(paths[i], /**@type{string}*/(content)); - /*jslint evil: true*/ - eval(content); - /*jslint evil: false*/ + // The classes are read in the scope of this file, where the five + // namespaces are declared: a direct eval() is needed for that, an + // indirect one only sees the global scope, and this file is a module + // under node. The block around it is only there so that a minifier + // drops the whole of it when the code is compiled, as it may not drop + // a scope that holds a direct eval(). + if (!IS_COMPILED_CODE) { + var i, + content; + for (i = 0; i < paths.length; i += 1) { + content = runtime.readFileSync(paths[i], "utf-8"); + content = addContent(paths[i], /**@type{string}*/(content)); + /*jslint evil: true*/ + eval(content); + /*jslint evil: false*/ + } } } /** @@ -1802,28 +1831,6 @@ var webodf = {}; } e.parentNode.insertBefore(df, e); } - // The five namespaces of the library are gathered here, so that a class may - // be looked up by its name. The compiler reports a partial alias for each - // of them, JSC_PARTIAL_NAMESPACE, as it may no longer flatten what they - // hold, and any way of reading a namespace as a value does it: a map built - // when a class is looked up rather than here, or a function returning them - // one by one, are reported the same way. Only dropping the lookup by name - // would remove it, that this loader exists for. - // - // The warning is left, as it only shows in the target "compiled.js" of the - // build with cmake, that compiles the library and the tests with - // ADVANCED_OPTIMIZATIONS to report more problems, and whose output is never - // run. The library that ships is compiled with SIMPLE_OPTIMIZATIONS, that - // flattens no namespace, and reports none of it. - var /**@type{!Object.}>}*/ - dependencies, - packages = { - webodfcore: webodfcore, - gui: gui, - xmldom: xmldom, - odf: odf, - ops: ops - }; /** * Check if a class has been defined. * For class "webodfcore.sub.Name", this checks if there is an entry @@ -1931,6 +1938,12 @@ var webodf = {}; }()); /*jslint sloppy: true*/ +// Run the scripts given as arguments, "runtime.js script.js". Only the +// sources are run this way, never the compiled library, so the whole +// runner is kept out of it: it reads a file with eval(), that a minifier +// may only drop when the block around it is dropped whole, as it has to +// assume that the string it runs reads the locals around it. +if (!IS_COMPILED_CODE) { (function (args) { if (args) { args = Array.prototype.slice.call(/**@type{{length:number}}*/(args)); @@ -1990,3 +2003,4 @@ var webodf = {}; run(args.slice(1)); } }(String(typeof arguments) !== "undefined" && arguments)); +} From abbd7c09012dc875a8d085d6f4d7646f959bf8be Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 143/385] Fixed the annotations of JSZip and checked them with node too. --- scripts/check.js | 38 +++++++++++++++++++++++ webodf/lib/externs/JSZip.js | 60 ++++++++++++++++++------------------- 2 files changed, 68 insertions(+), 30 deletions(-) diff --git a/scripts/check.js b/scripts/check.js index b085fa90b..88c0c68e6 100644 --- a/scripts/check.js +++ b/scripts/check.js @@ -107,6 +107,40 @@ function flags(files) { return list; } +/** + * Arguments of a second pass, over the libraries packaged with webodf.js, JSZip + * for now. Their types are not checked, as they are not written for the + * compiler, but their jsdoc has to parse, as the target "simplecompiled.js" of + * the build with cmake compiles them: without this pass, a broken annotation is + * only reported by the build with cmake. + * @return {!Array.} + */ +function packagedFlags() { + var list = [ + "--compilation_level", "WHITESPACE_ONLY", + "--warning_level", "VERBOSE", + "--env", "CUSTOM", + "--language_in", "ECMASCRIPT3", + "--language_out", "ECMASCRIPT3", + "--js_output_file", "/dev/null" + ]; + // The same groups as the build with cmake, so that a broken annotation is + // an error and not a warning. reportUnknownTypes is left out, as are the + // checks of the types: WHITESPACE_ONLY does not run them. + closure.errorGroupsFor(closure.version).forEach(function (group) { + if (group !== "reportUnknownTypes") { + list.push("--jscomp_error", group); + } + }); + closure.offGroups.forEach(function (group) { + list.push("--jscomp_off", group); + }); + fs.readdirSync(path.join(rootDir, "webodf/lib/externs")).forEach(function (name) { + list.push("--js", path.join(rootDir, "webodf/lib/externs", name)); + }); + return list; +} + closure.jar().then(function (jarPath) { var files = writeGeneratedFiles(), flagFile = path.join(files.dir, "flagfile.txt"), @@ -135,6 +169,10 @@ closure.jar().then(function (jarPath) { + result.error.message); process.exit(1); } + if (result.status === 0 && withTests) { + result = child.spawnSync("java", + ["-jar", jarPath].concat(packagedFlags()), {stdio: "inherit"}); + } process.exit(result.status === null ? 1 : result.status); }).catch(function (err) { console.error(String(err)); diff --git a/webodf/lib/externs/JSZip.js b/webodf/lib/externs/JSZip.js index 5d78fdaf7..730ad3507 100644 --- a/webodf/lib/externs/JSZip.js +++ b/webodf/lib/externs/JSZip.js @@ -562,7 +562,7 @@ Usage: /** * Representation a of zip file in js * @constructor - * @param {String=|ArrayBuffer=|Uint8Array=} data the data to load, if any (optional). + * @param {(string|ArrayBuffer|Uint8Array)=} data the data to load, if any (optional). * @param {Object=} options the options for creating this objects (optional). */ function JSZip(data, options) { @@ -721,7 +721,7 @@ var Uint8ArrayWriter = require('./uint8ArrayWriter'); /** * Returns the raw data of a ZipObject, decompress the content if necessary. * @param {ZipObject} file the file to use. - * @return {String|ArrayBuffer|Uint8Array|Buffer} the data. + * @return {string|ArrayBuffer|Uint8Array|Buffer} the data. */ var getRawData = function(file) { if (file._data instanceof CompressedObject) { @@ -746,7 +746,7 @@ var getRawData = function(file) { /** * Returns the data of a ZipObject in a binary form. If the content is an unicode string, encode it. * @param {ZipObject} file the file to use. - * @return {String|ArrayBuffer|Uint8Array|Buffer} the data. + * @return {string|ArrayBuffer|Uint8Array|Buffer} the data. */ var getBinaryData = function(file) { var result = getRawData(file), @@ -766,8 +766,8 @@ var getBinaryData = function(file) { /** * Transform this._data into a string. - * @param {function} filter a function String -> String, applied if not null on the result. - * @return {String} the string representing this._data. + * @param {function(!string):!string} filter a function String -> String, applied if not null on the result. + * @return {string} the string representing this._data. */ var dataToString = function(asUTF8) { var result = getRawData(this); @@ -797,7 +797,7 @@ var dataToString = function(asUTF8) { * A simple object representing a file in the zip file. * @constructor * @param {string} name the name of the file - * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data + * @param {string|ArrayBuffer|Uint8Array|Buffer} data the data * @param {Object} options the options of the file */ var ZipObject = function(name, data, options) { @@ -902,7 +902,7 @@ var prepareFileAttrs = function(o) { * Add a file in the current folder. * @private * @param {string} name the name of the file - * @param {String|ArrayBuffer|Uint8Array|Buffer} data the data of the file + * @param {string|ArrayBuffer|Uint8Array|Buffer} data the data of the file * @param {Object} o the options of the file * @return {Object} the new file. */ @@ -987,8 +987,8 @@ var parentFolder = function (path) { /** * Returns the path with a slash at the end. * @private - * @param {String} path the path to check. - * @return {String} the path with a trailing slash. + * @param {string} path the path to check. + * @return {string} the path with a trailing slash. */ var forceTrailingSlash = function(path) { // Check the name ends with a / @@ -1074,8 +1074,8 @@ var generateCompressedObjectFrom = function(file, compression, compressionOption /** * Generate the UNIX part of the external file attributes. * @param {Object} unixPermissions the unix permissions or null. - * @param {Boolean} isDir true if the entry is a directory, false otherwise. - * @return {Number} a 32 bit integer. + * @param {boolean} isDir true if the entry is a directory, false otherwise. + * @return {number} a 32 bit integer. * * adapted from http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute : * @@ -1102,8 +1102,8 @@ var generateUnixExternalFileAttr = function (unixPermissions, isDir) { /** * Generate the DOS part of the external file attributes. * @param {Object} dosPermissions the dos permissions or null. - * @param {Boolean} isDir true if the entry is a directory, false otherwise. - * @return {Number} a 32 bit integer. + * @param {boolean} isDir true if the entry is a directory, false otherwise. + * @return {number} a 32 bit integer. * * Bit 0 Read-Only * Bit 1 Hidden @@ -1125,7 +1125,7 @@ var generateDosExternalFileAttr = function (dosPermissions, isDir) { * @param {ZipObject} file the file content. * @param {JSZip.CompressedObject} compressedObject the compressed object. * @param {number} offset the current offset from the start of the zip file. - * @param {String} platform let's pretend we are this platform (change platform dependents fields) + * @param {string} platform let's pretend we are this platform (change platform dependents fields) * @param {Function} encodeFileName the function to encode the file name / comment. * @return {object} the zip parts. */ @@ -1301,7 +1301,7 @@ var out = { /** * Read an existing zip and merge the data in the current JSZip object. * The implementation is in jszip-load.js, don't forget to include it. - * @param {String|ArrayBuffer|Uint8Array|Buffer} stream The stream to load + * @param {string|ArrayBuffer|Uint8Array|Buffer} stream The stream to load * @param {Object} options Options for loading the stream. * options.base64 : is the stream in base64 ? default : false * @return {JSZip} the current JSZip object @@ -1430,7 +1430,7 @@ var out = { * - base64, (deprecated, use type instead) true to generate base64. * - compression, "STORE" by default. * - type, "base64" by default. Values are : string, base64, uint8array, arraybuffer, blob. - * @return {String|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file + * @return {string|Uint8Array|ArrayBuffer|Buffer|Blob} the zip file */ generate: function(options) { options = utils.extend(options || {}, { @@ -1924,7 +1924,7 @@ var buf2string = function (buf) { /** * Transform a javascript string into an array (typed if possible) of bytes, * UTF-8 encoded. - * @param {String} str the string to encode + * @param {string} str the string to encode * @return {Array|Uint8Array|Buffer} the UTF-8 encoded string. */ exports.utf8encode = function utf8encode(str) { @@ -1940,7 +1940,7 @@ exports.utf8encode = function utf8encode(str) { * Transform a bytes array (or a representation) representing an UTF-8 encoded * string into a javascript string. * @param {Array|Uint8Array|Buffer} buf the data de decode - * @return {String} the decoded string. + * @return {string} the decoded string. */ exports.utf8decode = function utf8decode(buf) { if (support.nodebuffer) { @@ -1976,7 +1976,7 @@ var nodeBuffer = require('./nodeBuffer'); /** * Convert a string to a "binary string" : a string containing only char codes between 0 and 255. * @param {string} str the string to transform. - * @return {String} the binary string. + * @return {string} the binary string. */ exports.string2binary = function(str) { var result = ""; @@ -2024,7 +2024,7 @@ function identity(input) { /** * Fill in an array with a string. - * @param {String} str the string to use. + * @param {string} str the string to use. * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to fill in (will be mutated). * @return {Array|ArrayBuffer|Uint8Array|Buffer} the updated array. */ @@ -2038,7 +2038,7 @@ function stringToArrayLike(str, array) { /** * Transform an array-like object to a string. * @param {Array|ArrayBuffer|Uint8Array|Buffer} array the array to transform. - * @return {String} the result. + * @return {string} the result. */ function arrayLikeToString(array) { // Performances notes : @@ -2197,8 +2197,8 @@ transform["nodebuffer"] = { * Transform an input into any type. * The supported output type are : string, array, uint8array, arraybuffer, nodebuffer. * If no output type is specified, the unmodified input will be returned. - * @param {String} outputType the output type. - * @param {String|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert. + * @param {string} outputType the output type. + * @param {string|Array|ArrayBuffer|Uint8Array|Buffer} input the input to convert. * @throws {Error} an Error if the browser doesn't support the requested output type. */ exports.transformTo = function(outputType, input) { @@ -2220,7 +2220,7 @@ exports.transformTo = function(outputType, input) { * Return the type of the input. * The type will be in a format valid for JSZip.utils.transformTo : string, array, uint8array, arraybuffer. * @param {Object} input the input to identify. - * @return {String} the (lowercase) type of the input. + * @return {string} the (lowercase) type of the input. */ exports.getTypeOf = function(input) { if (typeof input === "string") { @@ -2242,7 +2242,7 @@ exports.getTypeOf = function(input) { /** * Throw an exception if the type is not supported. - * @param {String} type the type to check. + * @param {string} type the type to check. * @throws {Error} an Error if the browser doesn't support the requested type. */ exports.checkSupport = function(type) { @@ -2288,7 +2288,7 @@ exports.findCompression = function(compressionMethod) { /** * Cross-window, cross-Node-context regular expression detection * @param {Object} object Anything -* @return {Boolean} true if the object is a regular expression, +* @return {boolean} true if the object is a regular expression, * false otherwise */ exports.isRegExp = function (object) { @@ -2329,7 +2329,7 @@ var jszipProto = require('./object'); /** * All the entries in the zip file. * @constructor - * @param {String|ArrayBuffer|Uint8Array} data the binary stream to load. + * @param {string|ArrayBuffer|Uint8Array} data the binary stream to load. * @param {Object} loadOptions Options for loading the stream. */ function ZipEntries(data, loadOptions) { @@ -2584,7 +2584,7 @@ ZipEntries.prototype = { }, /** * Read a zip file and create ZipEntries. - * @param {String|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file. + * @param {string|ArrayBuffer|Uint8Array|Buffer} data the binary string representing a zip file. */ load: function(data) { this.prepareReader(data); @@ -2869,7 +2869,7 @@ ZipEntry.prototype = { /** * Find the unicode path declared in the extra field, if any. - * @return {String} the unicode path, null otherwise. + * @return {string} the unicode path, null otherwise. */ findExtraFieldUnicodePath: function() { var upathField = this.extraFields[0x7075]; @@ -2893,7 +2893,7 @@ ZipEntry.prototype = { /** * Find the unicode comment declared in the extra field, if any. - * @return {String} the unicode comment, null otherwise. + * @return {string} the unicode comment, null otherwise. */ findExtraFieldUnicodeComment: function() { var ucommentField = this.extraFields[0x6375]; From df39313a079715a247fdd087c899afdf9e403c39 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 144/385] Added the dom interfaces missing in Rhino. --- webodf/lib/runtime.js | 33 +++++++++++++++++++++++++++++++++ webodf/tools/externs.js | 18 ++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 4971ee93d..81dd153a4 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -1250,11 +1250,44 @@ function RhinoRuntime() { "use strict"; var self = this, dom = Packages.javax.xml.parsers.DocumentBuilderFactory.newInstance(), + // A browser exposes these dom interfaces globally and the whole + // library uses their constants. Java provides the same constants on + // its own interface of a node, and NodeFilter is only a set of them. + // The global object is seen as a map holding them, since the type of + // the compiler for globalThis refuses an object of constants alone. + javaNode = Packages.org.w3c.dom.Node, + /**@type{!{Node:(!Function|undefined),NodeFilter:(!Object|undefined)}}*/ + globalScope = /**@type{!{Node:(!Function|undefined),NodeFilter:(!Object|undefined)}}*/(globalThis), /**@type{!Packages.javax.xml.parsers.DocumentBuilder}*/ builder, entityresolver, /**@type{!string}*/ currentDirectory = ""; + if (!globalScope.Node) { + globalScope.Node = javaNode; + } + if (!globalScope.NodeFilter) { + // Only the constants are used, so the object does not implement the + // methods of the interface of a browser. + globalScope.NodeFilter = { + SHOW_ALL: 4294967295, + SHOW_ELEMENT: 1, + SHOW_ATTRIBUTE: 2, + SHOW_TEXT: 4, + SHOW_CDATA_SECTION: 8, + SHOW_ENTITY_REFERENCE: 16, + SHOW_ENTITY: 32, + SHOW_PROCESSING_INSTRUCTION: 64, + SHOW_COMMENT: 128, + SHOW_DOCUMENT: 256, + SHOW_DOCUMENT_TYPE: 512, + SHOW_DOCUMENT_FRAGMENT: 1024, + SHOW_NOTATION: 2048, + FILTER_ACCEPT: 1, + FILTER_REJECT: 2, + FILTER_SKIP: 3 + }; + } dom.setValidating(false); dom.setNamespaceAware(true); dom.setExpandEntityReferences(false); diff --git a/webodf/tools/externs.js b/webodf/tools/externs.js index 5b8fce922..fdac7cc43 100644 --- a/webodf/tools/externs.js +++ b/webodf/tools/externs.js @@ -418,6 +418,24 @@ Packages.org.xml.sax.EntityResolver = function (definition) {"use strict"; }; * @param {!Packages.java.io.Reader|!string} reader */ Packages.org.xml.sax.InputSource = function (reader) {"use strict"; }; + +/** + * @const {!Object} + */ +Packages.org.w3c = {}; + +/** + * @const {!Object} + */ +Packages.org.w3c.dom = {}; + +/** + * The interface of the nodes of the dom of java, that holds the constants a + * browser exposes on the global Node. + * @const {!Function} + */ +Packages.org.w3c.dom.Node; + /** * @type {!StyleSheet} */ From a91f44cd42270672071ac461d6deb34ae88f28a0 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 145/385] Fixed the type of the group of an operation, undefined until it is queued. --- webodf/lib/ops/Operation.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/webodf/lib/ops/Operation.js b/webodf/lib/ops/Operation.js index 3a682d212..8be5b8f45 100644 --- a/webodf/lib/ops/Operation.js +++ b/webodf/lib/ops/Operation.js @@ -49,7 +49,9 @@ ops.Operation.prototype.init = function (data) {"use strict"; }; ops.Operation.prototype.isEdit; /** - * @type {string} + * Identifier of the group of operations this one belongs to, set by the router + * when the operation is queued: it is undefined until then. + * @type {(string|undefined)} */ ops.Operation.prototype.group; From 1d362d95dc625eebf2c81640b5dd46653a182126 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 146/385] Named the project of gradle as the apk cmake waits for. --- programs/androidviewer/settings.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/androidviewer/settings.gradle b/programs/androidviewer/settings.gradle index 2fbdb606d..a694adca3 100644 --- a/programs/androidviewer/settings.gradle +++ b/programs/androidviewer/settings.gradle @@ -11,4 +11,4 @@ dependencyResolutionManagement { mavenCentral() } } -rootProject.name = 'ODFViewer' +rootProject.name = 'androidviewer' From 514583b12150973513080d8fbeb5281798ab3bff Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 147/385] Wrote the library with the build of node in both builds. --- README-Building.md | 11 ++++++++++- scripts/build.js | 22 +++++++++++++++++----- webodf/CMakeLists.txt | 28 ++++++++++++++++++---------- 3 files changed, 45 insertions(+), 16 deletions(-) diff --git a/README-Building.md b/README-Building.md index 227b6e8f4..b90484123 100644 --- a/README-Building.md +++ b/README-Building.md @@ -12,7 +12,16 @@ The library "webodf.js" is built in two ways. compiler, Rhino and Dojo are downloaded from maven central and from the registry of npm, at the same versions as the build with node uses. -Both produce the same library, from the same sources and in the same order. +Both produce the same file, byte for byte: the build with cmake writes the +library by running "scripts/build.js" as well. It still compiles the sources +with the closure compiler, but only to check their types, as it compiles with +SIMPLE_OPTIMIZATIONS, which neither folds the definition IS_COMPILED_CODE nor +drops what it makes unreachable: the loader of the classes and the runner of +the scripts stayed in a library that never calls them, with the eval() they +read a file with. + +So "npm install" is needed for the build with cmake too, as terser minifies +the library. Two parts of the build with cmake are opt-in, so that a plain build stays short and needs nothing but node, java and cmake: diff --git a/scripts/build.js b/scripts/build.js index 9d1fba9e6..fd8d03bb7 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -5,7 +5,7 @@ * compiler: the sources are concatenated in the order of their dependencies, * as the compiled file of the original build was, then minified with terser. * - * Usage: node scripts/build.js [--no-minify] + * Usage: node scripts/build.js [--no-minify] [--output path] */ var fs = require("fs"), @@ -14,20 +14,32 @@ var fs = require("fs"), sources = require("./lib/sources.js"), rootDir = path.resolve(__dirname, ".."), distDir = path.join(rootDir, "dist"), - outputPath = path.join(distDir, "webodf.js"), + outputIndex = process.argv.indexOf("--output"), + // The build with cmake writes it in its own directory, see + // "webodf/CMakeLists.txt": both builds run this script, so that they + // produce the same file. + outputPath = outputIndex === -1 + ? path.join(distDir, "webodf.js") + : path.resolve(process.argv[outputIndex + 1]), + headerIndex = process.argv.indexOf("--header"), + // A release replaces the license of the compiled file, as the build with + // cmake does with -DHEADERCOMPILED_FILE. + headerPath = headerIndex === -1 + ? path.join(sources.libDir, "HeaderCompiled.js") + : path.resolve(process.argv[headerIndex + 1]), minify = process.argv.indexOf("--no-minify") === -1; function main() { var code = bundle.library(), // License of the compiled file, that keeps the exception of the AGPL // for the pages that only call the library. - header = fs.readFileSync(path.join(sources.libDir, "HeaderCompiled.js"), "utf8"), + header = fs.readFileSync(headerPath, "utf8"), terser; if (!/var IS_COMPILED_CODE = true;/.test(code)) { throw new Error("IS_COMPILED_CODE was not set, the runtime would try to load the classes."); } - if (!fs.existsSync(distDir)) { - fs.mkdirSync(distDir); + if (!fs.existsSync(path.dirname(outputPath))) { + fs.mkdirSync(path.dirname(outputPath), {recursive: true}); } if (!minify) { fs.writeFileSync(outputPath, header + code); diff --git a/webodf/CMakeLists.txt b/webodf/CMakeLists.txt index 6d806362c..6396756b9 100644 --- a/webodf/CMakeLists.txt +++ b/webodf/CMakeLists.txt @@ -221,18 +221,26 @@ add_custom_command( DEPENDS ClosureCompiler ${LIBJSFILES} tools/externs.js webodf.css.js-target ) -# Include non-Closure Compiler compatible libraries with no further recompilation +# The library is written by the build with node, so that both builds produce +# the same file. The closure compiler still reads the sources, in +# "webodf-compiled.js" above, but only to check their types: it compiles with +# SIMPLE_OPTIMIZATIONS, that neither folds the definition IS_COMPILED_CODE nor +# drops what it makes unreachable, so it kept the loader of the classes and +# the runner of the scripts, that read a file with eval(), inside a library +# that never calls them. add_custom_command( OUTPUT webodf.js - COMMAND ${Java_JAVA_EXECUTABLE} - ARGS ${SHARED_CLOSURE_ARGS} - --js ${HEADERCOMPILED_FILE} - --js webodf-compiled.js - --js ${CMAKE_CURRENT_SOURCE_DIR}/lib/externs/*.js - --compilation_level WHITESPACE_ONLY - --js_output_file webodf.js- - COMMAND ${CMAKE_COMMAND} ARGS -E rename webodf.js- webodf.js - DEPENDS ClosureCompiler webodf-compiled.js ${HEADERCOMPILED_FILE} + COMMAND ${NODE} ARGS ${CMAKE_SOURCE_DIR}/scripts/build.js + --output ${CMAKE_CURRENT_BINARY_DIR}/webodf.js + --header ${HEADERCOMPILED_FILE} + DEPENDS ${NODE} webodf-compiled.js manifest.json-target + ${CMAKE_SOURCE_DIR}/scripts/build.js + ${CMAKE_SOURCE_DIR}/scripts/lib/bundle.js + ${CMAKE_SOURCE_DIR}/scripts/lib/sources.js + ${CMAKE_SOURCE_DIR}/scripts/lib/generated.js + ${HEADERCOMPILED_FILE} + ${LIBJSFILES} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) add_custom_target(webodf.js-target DEPENDS webodf.js) From 0436b668d6f27c0c0f813febff68424000fee2b7 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 148/385] Required a maintained version of node. --- CMakeLists.txt | 94 +++++++++++++++++++++-------------------------- package-lock.json | 2 +- package.json | 2 +- 3 files changed, 43 insertions(+), 55 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index daed126d4..02b7afdb1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -81,7 +81,11 @@ endif () find_package(Java COMPONENTS Runtime REQUIRED) # Node.js will be downloaded on Windows systems, so check for installed version is below -SET(REQUIRED_NODEJS_VERSION 0.10.5) +# 22.22.2 is the oldest release of node jsdom runs on, that the tests need. +# The tools of the build are tested with 24, the release under long term +# support. The exact range is in the field "engines" of "package.json", that +# cmake cannot express. +SET(REQUIRED_NODEJS_VERSION 22.22.2) ######################################################### @@ -137,58 +141,42 @@ ExternalProject_Add( ) set(JSDOCDIR ${CMAKE_BINARY_DIR}/JsDoc-prefix/src/JsDoc/jsdoc-toolkit) -# Node.js -set(NODEVERSION 0.10.20) -if(WIN32) - # On windows, it is significantly faster and more reliable to download - # a pre-built 32-bit binary - set(NODE_BIN_URL "http://nodejs.org/dist/v${NODEVERSION}/node.exe") - set(NODE_BIN_MD5 "3bc43fbbfcddc376d5769e9757bd0bca") - file(DOWNLOAD "${NODE_BIN_URL}" "${EXTERNALS_DOWNLOAD_DIR}/node-download.exe" - SHOW_PROGRESS - EXPECTED_MD5 ${NODE_BIN_MD5} - ) - set(NODE ${CMAKE_BINARY_DIR}/NodeJS-prefix/bin/node.exe) - set(NPM ${CMAKE_BINARY_DIR}/NodeJS-prefix/bin/npm.exe) - execute_process(COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/NodeJS-prefix - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/NodeJS-prefix/bin - COMMAND ${CMAKE_COMMAND} -E copy ${EXTERNALS_DOWNLOAD_DIR}/node-download.exe "${NODE}" - ) - add_custom_target(NodeJS DEPENDS "${NODE}") -else(WIN32) - SET(NODEJS_VERSION 0.0.0) - # Debian uses nodejs as binary name, due to conflict with node package (Amateur Packet Radio Node Program) - # https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager - FIND_PROGRAM(NODEJS_EXECUTABLE - NAMES nodejs node - PATHS "" - DOC "Path to Node.js executable" - ) - IF(NODEJS_EXECUTABLE) - execute_process(COMMAND ${NODEJS_EXECUTABLE} --version - OUTPUT_VARIABLE NODEJS_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE) - string(SUBSTRING ${NODEJS_VERSION} 1 -1 NODEJS_VERSION) - MESSAGE (STATUS "Installed Node.js found: ${NODEJS_EXECUTABLE} - ${NODEJS_VERSION}") - ELSE(NODEJS_EXECUTABLE) - MESSAGE (STATUS "No installed Node.js found. On platforms other than Windows, Node.js is not downloaded, but expected to be installed.") - ENDIF(NODEJS_EXECUTABLE) - - # fail if NodeJS version requirement is not satisfied - if (${NODEJS_VERSION} VERSION_LESS ${REQUIRED_NODEJS_VERSION}) - message(FATAL_ERROR "Node.js is required in version " ${REQUIRED_NODEJS_VERSION} " or later") - else() - message(STATUS "good Node.js found: " ${NODEJS_VERSION} " (" ${REQUIRED_NODEJS_VERSION} " required.)") - endif() - set(NODE ${NODEJS_EXECUTABLE}) - FIND_PROGRAM(NPM - NAMES npm - PATHS "" - DOC "Path to NPM executable" - ) - MESSAGE (STATUS "npm found: " ${NPM}) - add_custom_target(NodeJS DEPENDS "${NODEJS_EXECUTABLE}") -endif(WIN32) +# Node.js is expected to be installed, on every platform. Windows used to +# download a single node.exe, but the build needs npm as well, that comes with +# the installer only, and the url that binary was at holds the releases of +# 2013 alone. +SET(NODEJS_VERSION 0.0.0) +# Debian uses nodejs as binary name, due to conflict with node package (Amateur Packet Radio Node Program) +# https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager +FIND_PROGRAM(NODEJS_EXECUTABLE + NAMES nodejs node + PATHS "" + DOC "Path to Node.js executable" +) +IF(NODEJS_EXECUTABLE) + execute_process(COMMAND ${NODEJS_EXECUTABLE} --version + OUTPUT_VARIABLE NODEJS_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE) + string(SUBSTRING ${NODEJS_VERSION} 1 -1 NODEJS_VERSION) + MESSAGE (STATUS "Installed Node.js found: ${NODEJS_EXECUTABLE} - ${NODEJS_VERSION}") +ELSE(NODEJS_EXECUTABLE) + MESSAGE (STATUS "No installed Node.js found. Node.js is not downloaded, but expected to be installed.") +ENDIF(NODEJS_EXECUTABLE) + +# fail if NodeJS version requirement is not satisfied +if (${NODEJS_VERSION} VERSION_LESS ${REQUIRED_NODEJS_VERSION}) + message(FATAL_ERROR "Node.js is required in version " ${REQUIRED_NODEJS_VERSION} " or later") +else() + message(STATUS "good Node.js found: " ${NODEJS_VERSION} " (" ${REQUIRED_NODEJS_VERSION} " required.)") +endif() +set(NODE ${NODEJS_EXECUTABLE}) +FIND_PROGRAM(NPM + NAMES npm + PATHS "" + DOC "Path to NPM executable" +) +MESSAGE (STATUS "npm found: " ${NPM}) +add_custom_target(NodeJS DEPENDS "${NODEJS_EXECUTABLE}") # copy node_modules directory from source to build # (this is needed if a module is required in there) diff --git a/package-lock.json b/package-lock.json index 4452f821e..241339ec1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "terser": "^5.50.0" }, "engines": { - "node": ">=18" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } }, "node_modules/@asamuzakjp/css-color": { diff --git a/package.json b/package.json index f7db9c05d..53c5b2d00 100644 --- a/package.json +++ b/package.json @@ -65,6 +65,6 @@ ], "main": "dist/webodf.js", "engines": { - "node": ">=18" + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" } } From 08a712154b8690aa9230e20021ad43493b2aff39 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 149/385] Updated Rhino to 1.9.1 and split the outputs of the build. --- package.json | 5 ++- scripts/build.js | 21 +-------- scripts/lib/bundle.js | 50 +++++++++++++++++++++ scripts/lib/rhino.js | 55 +++++++++++++++++++++++ scripts/test-rhino.js | 42 +++++++++++++++++ scripts/test.js | 24 +--------- webodf/lib/runtime.js | 6 ++- webodf/lib/webodfcore/PositionIterator.js | 4 +- webodf/tools/externs.js | 2 +- 9 files changed, 163 insertions(+), 46 deletions(-) create mode 100644 scripts/lib/bundle.js create mode 100644 scripts/lib/rhino.js create mode 100644 scripts/test-rhino.js diff --git a/package.json b/package.json index 3a21d1fe3..a51207e29 100644 --- a/package.json +++ b/package.json @@ -44,8 +44,11 @@ "scripts": { "build": "node scripts/build.js", "check": "node scripts/check.js", + "doc": "node scripts/doc.js", "test": "node scripts/test.js", - "doc": "node scripts/doc.js" + "test:node": "node scripts/test.js", + "test:rhino": "node scripts/test-rhino.js", + "all": "npm run check && npm test && npm run build && npm run doc" }, "files": [ "dist", diff --git a/scripts/build.js b/scripts/build.js index cb9d831f3..fec52e243 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -10,32 +10,15 @@ var fs = require("fs"), path = require("path"), + bundle = require("./lib/bundle.js"), sources = require("./lib/sources.js"), - generated = require("./lib/generated.js"), rootDir = path.resolve(__dirname, ".."), distDir = path.join(rootDir, "dist"), outputPath = path.join(distDir, "webodf.js"), minify = process.argv.indexOf("--no-minify") === -1; -/** - * Concatenate the header, the generated files, the library and the packaged - * dependencies. IS_COMPILED_CODE tells the runtime that all the classes are - * already loaded, so that loadClass() does not fetch them one by one. - * @return {string} - */ -function bundle() { - var parts = [generated.versionSource()]; - sources.libraryFiles().forEach(function (file) { - parts.push(fs.readFileSync(file, "utf8")); - }); - parts.push(generated.cssSource()); - parts.push(fs.readFileSync(path.join(sources.libDir, "externs/JSZip.js"), "utf8")); - return parts.join("\n").replace("var IS_COMPILED_CODE = false;", - "var IS_COMPILED_CODE = true;"); -} - function main() { - var code = bundle(), + var code = bundle.library(), // License of the compiled file, that keeps the exception of the AGPL // for the pages that only call the library. header = fs.readFileSync(path.join(sources.libDir, "HeaderCompiled.js"), "utf8"), diff --git a/scripts/lib/bundle.js b/scripts/lib/bundle.js new file mode 100644 index 000000000..2dfef896f --- /dev/null +++ b/scripts/lib/bundle.js @@ -0,0 +1,50 @@ +"use strict"; + +/** + * Concatenation of the sources of the library, with or without its tests. The + * order of the files comes from their dependencies, see lib/sources.js. + */ + +var fs = require("fs"), + path = require("path"), + sources = require("./sources.js"), + generated = require("./generated.js"); + +/** + * @param {boolean} withTests + * @return {string} + */ +function build(withTests) { + var parts = [generated.versionSource()]; + sources.libraryFiles().forEach(function (file) { + parts.push(fs.readFileSync(file, "utf8")); + }); + parts.push(generated.cssSource()); + parts.push(fs.readFileSync(path.join(sources.libDir, "externs/JSZip.js"), "utf8")); + if (withTests) { + sources.testFiles().forEach(function (file) { + parts.push(fs.readFileSync(file, "utf8")); + }); + } + // IS_COMPILED_CODE tells the runtime that all the classes are already + // loaded, so that loadClass() does not fetch them one by one. + return parts.join("\n").replace("var IS_COMPILED_CODE = false;", + "var IS_COMPILED_CODE = true;"); +} + +/** + * @return {string} + */ +function library() { + return build(false); +} + +/** + * @return {string} + */ +function withTests() { + return build(true); +} + +exports.library = library; +exports.withTests = withTests; diff --git a/scripts/lib/rhino.js b/scripts/lib/rhino.js new file mode 100644 index 000000000..b3da15786 --- /dev/null +++ b/scripts/lib/rhino.js @@ -0,0 +1,55 @@ +"use strict"; + +/** + * Rhino runs javascript on a java virtual machine. It is used to run the tests + * in a second engine, besides node. The jar is published on maven central and + * is cached in the directory ".tools". + */ + +var fs = require("fs"), + path = require("path"), + https = require("https"), + rootDir = path.resolve(__dirname, "../.."), + toolsDir = path.join(rootDir, ".tools"), + version = process.env.RHINO_VERSION || "1.9.1", + jarName = "rhino-all-" + version + ".jar", + jarPath = path.join(toolsDir, jarName), + jarUrl = "https://repo1.maven.org/maven2/org/mozilla/rhino-all/" + + version + "/" + jarName; + +/** + * Path of the jar, downloaded when missing. The environment variable RHINO_JAR + * overrides it, to use a local copy or another version. + * @return {!Promise} + */ +function jar() { + if (process.env.RHINO_JAR) { + return Promise.resolve(process.env.RHINO_JAR); + } + if (fs.existsSync(jarPath)) { + return Promise.resolve(jarPath); + } + if (!fs.existsSync(toolsDir)) { + fs.mkdirSync(toolsDir); + } + console.log("Downloading " + jarUrl); + return new Promise(function (resolve, reject) { + var file = fs.createWriteStream(jarPath + ".part"); + https.get(jarUrl, function (response) { + if (response.statusCode !== 200) { + reject(new Error("Unable to download Rhino: " + response.statusCode)); + return; + } + response.pipe(file); + file.on("finish", function () { + file.close(function () { + fs.renameSync(jarPath + ".part", jarPath); + resolve(jarPath); + }); + }); + }).on("error", reject); + }); +} + +exports.jar = jar; +exports.version = version; diff --git a/scripts/test-rhino.js b/scripts/test-rhino.js new file mode 100644 index 000000000..fcf88a550 --- /dev/null +++ b/scripts/test-rhino.js @@ -0,0 +1,42 @@ +"use strict"; + +/** + * Run the tests that do not need a browser with Rhino, on a java virtual + * machine, as a second engine besides node. + * + * Usage: node scripts/test-rhino.js + */ + +var fs = require("fs"), + os = require("os"), + path = require("path"), + child = require("child_process"), + bundle = require("./lib/bundle.js"), + rhino = require("./lib/rhino.js"), + sources = require("./lib/sources.js"); + +rhino.jar().then(function (jarPath) { + var dir = fs.mkdtempSync(path.join(os.tmpdir(), "webodf-rhino-")), + bundlePath = path.join(dir, "tests.js"), + result; + fs.writeFileSync(bundlePath, bundle.withTests()); + // The tests read their documents from the current directory. + // The dom of java is implemented by internal classes that the module system + // does not export since java 9, and Rhino reaches them by reflection. + result = child.spawnSync("java", [ + "--add-opens", "java.xml/com.sun.org.apache.xerces.internal.dom=ALL-UNNAMED", + "-jar", jarPath, "-f", bundlePath + ], { + cwd: sources.testsDir, + stdio: "inherit" + }); + fs.rmSync(dir, {recursive: true, force: true}); + if (result.error) { + console.error("Unable to run java, that Rhino needs: " + result.error.message); + process.exit(1); + } + process.exit(result.status === null ? 1 : result.status); +}).catch(function (err) { + console.error(String(err)); + process.exit(1); +}); diff --git a/scripts/test.js b/scripts/test.js index c70797196..1fdb8f48a 100644 --- a/scripts/test.js +++ b/scripts/test.js @@ -13,35 +13,15 @@ var fs = require("fs"), os = require("os"), path = require("path"), child = require("child_process"), + bundle = require("./lib/bundle.js"), sources = require("./lib/sources.js"), - generated = require("./lib/generated.js"), rootDir = path.resolve(__dirname, ".."); -/** - * The library and the tests, concatenated. IS_COMPILED_CODE is not set: the - * tests use runtime.loadClass() on classes that are already there, and the - * runtime handles it when the code is marked as compiled. - * @return {string} - */ -function bundle() { - var parts = [generated.versionSource()]; - sources.libraryFiles().forEach(function (file) { - parts.push(fs.readFileSync(file, "utf8")); - }); - parts.push(generated.cssSource()); - parts.push(fs.readFileSync(path.join(sources.libDir, "externs/JSZip.js"), "utf8")); - sources.testFiles().forEach(function (file) { - parts.push(fs.readFileSync(file, "utf8")); - }); - return parts.join("\n").replace("var IS_COMPILED_CODE = false;", - "var IS_COMPILED_CODE = true;"); -} - function main() { var dir = fs.mkdtempSync(path.join(os.tmpdir(), "webodf-test-")), bundlePath = path.join(dir, "tests.js"), result; - fs.writeFileSync(bundlePath, bundle()); + fs.writeFileSync(bundlePath, bundle.withTests()); // The tests read their documents from the current directory, and require() // resolves the dependencies from the directory of the bundle. fs.symlinkSync(path.join(rootDir, "node_modules"), path.join(dir, "node_modules")); diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 81dd153a4..7597d05e9 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -1270,7 +1270,9 @@ function RhinoRuntime() { // Only the constants are used, so the object does not implement the // methods of the interface of a browser. globalScope.NodeFilter = { - SHOW_ALL: 4294967295, + // The dom of java takes a signed integer, where the value of the + // specification, 0xFFFFFFFF, does not fit. + SHOW_ALL: -1, SHOW_ELEMENT: 1, SHOW_ATTRIBUTE: 2, SHOW_TEXT: 4, @@ -1445,7 +1447,7 @@ function RhinoRuntime() { otherPath = path + Math.random(), other = new Packages.java.io.File(otherPath); // 'delete' cannot be used with closure compiler, so we use a workaround - if (file.rename(other)) { + if (file.renameTo(other)) { other.deleteOnExit(); callback(null); } else { diff --git a/webodf/lib/webodfcore/PositionIterator.js b/webodf/lib/webodfcore/PositionIterator.js index d2ec330dc..ca39ac954 100644 --- a/webodf/lib/webodfcore/PositionIterator.js +++ b/webodf/lib/webodfcore/PositionIterator.js @@ -506,8 +506,10 @@ webodfcore.PositionIterator = function PositionIterator(root, whatToShow, filter nodeFilter.acceptNode = nodeFilter; whatToShow = whatToShow || NodeFilter.SHOW_ALL; runtime.assert(root.nodeType !== Node.TEXT_NODE, "Internet Explorer doesn't allow tree walker roots to be text nodes"); + // The last argument must be a boolean: a dom of java refuses undefined, + // while a browser ignores the argument. walker = root.ownerDocument.createTreeWalker(root, whatToShow, - nodeFilter, expandEntityReferences); + nodeFilter, expandEntityReferences === true); currentPos = 0; if (walker.firstChild() === null) { diff --git a/webodf/tools/externs.js b/webodf/tools/externs.js index fdac7cc43..bd9469abd 100644 --- a/webodf/tools/externs.js +++ b/webodf/tools/externs.js @@ -247,7 +247,7 @@ Packages.java.io.File.prototype['delete'] = function () {"use strict"; }; * @param {!Packages.java.io.File} other * @return {!boolean} */ -Packages.java.io.File.prototype.rename = function (other) {"use strict"; }; +Packages.java.io.File.prototype.renameTo = function (other) {"use strict"; }; /** * @return {undefined} From 8edfa158c14ac8ae74ead4456f598050ab43f47d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 150/385] Fixed the types of the schema and of the lookup of the style names. --- webodf/lib/odf/OdfSchema.js | 3 ++- webodf/lib/odf/StyleInfo.js | 31 ++++++++++++++++++------------- 2 files changed, 20 insertions(+), 14 deletions(-) diff --git a/webodf/lib/odf/OdfSchema.js b/webodf/lib/odf/OdfSchema.js index da0e52a20..cc1552a22 100644 --- a/webodf/lib/odf/OdfSchema.js +++ b/webodf/lib/odf/OdfSchema.js @@ -43,7 +43,8 @@ UNKNOWN = "uncategorized", // Uncategorized element // Basic list of containers originally created using tools/odfRng2Config.js // List has been hand-updated however, and should not simply be discarded! - /**@type{!Array.>}*/ + // Each entry is a pair: the name of the element and its category. + /**@type{!Array.>}*/ containers = [ ["config:config-item" , UNKNOWN], ["form:item" , OBJECT], diff --git a/webodf/lib/odf/StyleInfo.js b/webodf/lib/odf/StyleInfo.js index 6e9ba9490..f5ce60d18 100644 --- a/webodf/lib/odf/StyleInfo.js +++ b/webodf/lib/odf/StyleInfo.js @@ -892,19 +892,24 @@ odf.StyleInfo = function StyleInfo() { * @return {!string|undefined} */ function getStyleName(family, element) { - var stylename, i, - map = elements[element.localName]; - if (map) { - map = map[element.namespaceURI]; - if (map) { - for (i = 0; i < map.length; i += 1) { - if (map[i].keyname === family) { - map = map[i]; - if (element.hasAttributeNS(map.ns, map.localname)) { - stylename = element.getAttributeNS(map.ns, map.localname); - break; - } - } + var /**@type{(!string|undefined)}*/stylename, + /**@type{!number}*/i, + /**@type{(!Object.>|undefined)}*/ + namespaces = elements[element.localName], + /**@type{(!Array.|undefined)}*/ + attributes, + /**@type{!{keyname:!string,ns:!string,localname:!string}}*/ + attribute; + if (namespaces) { + attributes = namespaces[element.namespaceURI]; + } + if (attributes) { + for (i = 0; i < attributes.length; i += 1) { + attribute = attributes[i]; + if (attribute.keyname === family + && element.hasAttributeNS(attribute.ns, attribute.localname)) { + stylename = element.getAttributeNS(attribute.ns, attribute.localname); + break; } } } From 61de97e6c713d53f515cf58a2e4060208d464726 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 151/385] Looked for the sdk of android before building with it. --- programs/androidviewer/CMakeLists.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/programs/androidviewer/CMakeLists.txt b/programs/androidviewer/CMakeLists.txt index ca870a7e6..d1a72e435 100644 --- a/programs/androidviewer/CMakeLists.txt +++ b/programs/androidviewer/CMakeLists.txt @@ -8,6 +8,21 @@ option(WEBODF_ANDROID "Build the viewer of android, that needs its sdk" OFF) if (WEBODF_ANDROID) + # The sdk is looked for here rather than left to gradle, that only says so + # once it has resolved the plugin and started the tasks of android. + if (NOT DEFINED ENV{ANDROID_HOME} + AND NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/local.properties) + message(FATAL_ERROR + "The sdk of android was not found, so the viewer cannot be built." + " Export ANDROID_HOME with the directory it is installed in, or write" + " \"sdk.dir=/path/to/sdk\" in" + " ${CMAKE_CURRENT_SOURCE_DIR}/local.properties." + " The command line tools that install it are at" + " https://developer.android.com/studio#command-tools, and the" + " packages the build needs are \"platforms;android-36\" and" + " \"build-tools;36.0.0\".") + endif() + # Gradle is downloaded, as the closure compiler and Rhino are: Debian 13 # packages the 4.4.1 of 2017, where the plugin of android asks for a 9, # so the one of the distribution is never the right one. The version is From 6c82c072a37a330d051a224f676d8e234865c72e Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 152/385] Opened a local document from the page of the add-on. --- programs/firefoxextension/viewer.css | 4 ++++ programs/firefoxextension/viewer.html | 5 ++++ programs/firefoxextension/viewer.js | 34 +++++++++++++++++++++++---- 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/programs/firefoxextension/viewer.css b/programs/firefoxextension/viewer.css index aadc39b89..34fd8b481 100644 --- a/programs/firefoxextension/viewer.css +++ b/programs/firefoxextension/viewer.css @@ -25,3 +25,7 @@ div#toolbar > .button { div#toolbar > .button:hover { background: #CCCCCC; } +/* The label opens the picker, so the input itself is not shown. */ +div#toolbar > #openlabel > input { + display: none; +} diff --git a/programs/firefoxextension/viewer.html b/programs/firefoxextension/viewer.html index 229c5514a..2003fc89b 100644 --- a/programs/firefoxextension/viewer.html +++ b/programs/firefoxextension/viewer.html @@ -9,6 +9,11 @@
download this document + + about WebODF get the source code diff --git a/programs/firefoxextension/viewer.js b/programs/firefoxextension/viewer.js index 7393c5b8d..295049299 100644 --- a/programs/firefoxextension/viewer.js +++ b/programs/firefoxextension/viewer.js @@ -23,21 +23,47 @@ * @source: https://github.com/kogmbh/WebODF/ */ -/*global document, window, browser, odf, URLSearchParams*/ +/*global document, window, browser, odf, URLSearchParams, URL*/ (function () { "use strict"; - var url = new URLSearchParams(window.location.search).get("file"); + var url = new URLSearchParams(window.location.search).get("file"), + canvas = new odf.OdfCanvas(document.getElementById("odf")), + open = document.getElementById("open"); + + /** + * @param {!string} name + * @return {undefined} + */ + function show(name) { + document.title = name; + document.getElementById("download").style.display = url + ? "" + : "none"; + } + + // A document that is read from the disk is opened here, as the requests of + // a file:// url never reach the background script: webRequest only watches + // http, https and the web sockets. + open.addEventListener("change", function () { + var file = open.files[0]; + if (file) { + url = null; + show(file.name); + canvas.load(URL.createObjectURL(file)); + } + }); if (!url) { + show("ODF Viewer"); return; } - document.title = decodeURIComponent(url.split("/").pop()); + show(decodeURIComponent(url.split("/").pop())); // The download goes through the background script, as the viewer holds no // permission of its own. document.getElementById("download").addEventListener("click", function () { browser.runtime.sendMessage({action: "download", url: url}); }); - new odf.OdfCanvas(document.getElementById("odf")).load(url); + canvas.load(url); }()); From 8bbecd5de7201ba89a9a5fa61f198f7b94ae5392 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 153/385] Named the node cmake found when its version is too old. --- CMakeLists.txt | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 02b7afdb1..be82f2d5a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -163,9 +163,16 @@ ELSE(NODEJS_EXECUTABLE) MESSAGE (STATUS "No installed Node.js found. Node.js is not downloaded, but expected to be installed.") ENDIF(NODEJS_EXECUTABLE) -# fail if NodeJS version requirement is not satisfied +# fail if NodeJS version requirement is not satisfied. find_program() caches +# what it finds, so a node that was installed later, by nvm for instance, is +# only seen once the entry is dropped: the path is named here, as it is often +# an older one that is still in the cache. if (${NODEJS_VERSION} VERSION_LESS ${REQUIRED_NODEJS_VERSION}) - message(FATAL_ERROR "Node.js is required in version " ${REQUIRED_NODEJS_VERSION} " or later") + message(FATAL_ERROR "Node.js is required in version " + ${REQUIRED_NODEJS_VERSION} " or later, but " + ${NODEJS_EXECUTABLE} " is " ${NODEJS_VERSION} + ".\nIf a newer node is installed, cmake kept the path it found before:" + " run it again with -U NODEJS_EXECUTABLE -U NPM.") else() message(STATUS "good Node.js found: " ${NODEJS_VERSION} " (" ${REQUIRED_NODEJS_VERSION} " required.)") endif() From b71ca3c5ce2bb488d78ea2c6af1c3987f863b70e Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 154/385] Selected the tests from the dom the runtime provides, so Rhino passes. --- webodf/lib/runtime.js | 7 +++++-- webodf/tests/tests.js | 22 +++++++++++++++++++++- webodf/tools/externs.js | 5 +++++ 3 files changed, 31 insertions(+), 3 deletions(-) diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 7597d05e9..51bbadc30 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -1256,8 +1256,8 @@ function RhinoRuntime() { // The global object is seen as a map holding them, since the type of // the compiler for globalThis refuses an object of constants alone. javaNode = Packages.org.w3c.dom.Node, - /**@type{!{Node:(!Function|undefined),NodeFilter:(!Object|undefined)}}*/ - globalScope = /**@type{!{Node:(!Function|undefined),NodeFilter:(!Object|undefined)}}*/(globalThis), + /**@type{!{Node:(!Function|undefined),NodeFilter:(!Object|undefined),Element:(!Function|undefined)}}*/ + globalScope = /**@type{!{Node:(!Function|undefined),NodeFilter:(!Object|undefined),Element:(!Function|undefined)}}*/(globalThis), /**@type{!Packages.javax.xml.parsers.DocumentBuilder}*/ builder, entityresolver, @@ -1266,6 +1266,9 @@ function RhinoRuntime() { if (!globalScope.Node) { globalScope.Node = javaNode; } + if (!globalScope.Element) { + globalScope.Element = Packages.org.w3c.dom.Element; + } if (!globalScope.NodeFilter) { // Only the constants are used, so the object does not implement the // methods of the interface of a browser. diff --git a/webodf/tests/tests.js b/webodf/tests/tests.js index e7374645b..8efe5c5f2 100644 --- a/webodf/tests/tests.js +++ b/webodf/tests/tests.js @@ -80,8 +80,28 @@ var tests = [ webodfcore.Base64Tests ]; +/** + * The tests below need a dom close to the one of a browser: a range, and lists + * of nodes read with an index, that the dom of java, used by Rhino, does not + * provide. + * @return {!boolean} + */ +function hasBrowserLikeDom() { + "use strict"; + var doc = runtime.parseXML(""); + if (!runtime.getDOMImplementation() || !doc || !doc.createRange) { + return false; + } + try { + // A dom of java throws instead of returning undefined. + return Boolean(doc.documentElement && doc.documentElement.childNodes[0]); + } catch (ignore) { + return false; + } +} + // add tests depending on runtime with XML parser -if (runtime.getDOMImplementation() && runtime.parseXML("").createRange) { +if (hasBrowserLikeDom()) { // TODO: fix test and enable // tests.push(webodfcore.CursorTests); tests.push(webodfcore.PositionIteratorTests); diff --git a/webodf/tools/externs.js b/webodf/tools/externs.js index bd9469abd..b12046816 100644 --- a/webodf/tools/externs.js +++ b/webodf/tools/externs.js @@ -436,6 +436,11 @@ Packages.org.w3c.dom = {}; */ Packages.org.w3c.dom.Node; +/** + * @const {!Function} + */ +Packages.org.w3c.dom.Element; + /** * @type {!StyleSheet} */ From c757ee2e4051aec70bd9bc0f769a2fad64d326f7 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 155/385] Renamed a local that shadowed the namespace of the operations. --- webodf/lib/gui/TrivialUndoManager.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/webodf/lib/gui/TrivialUndoManager.js b/webodf/lib/gui/TrivialUndoManager.js index babfc8c73..eb8b5ff34 100644 --- a/webodf/lib/gui/TrivialUndoManager.js +++ b/webodf/lib/gui/TrivialUndoManager.js @@ -249,7 +249,10 @@ gui.TrivialUndoManager = function TrivialUndoManager(defaultRules) { moveCursor = {}, requiredAddOps = {}, remainingAddOps, - ops, + // Not named "ops": it would shadow the namespace of the same name, + // used by the annotations of this function. + /**@type{!Array.}*/ + operations, stateTransition = undoStateTransitions.pop(); document.getMemberIds().forEach(function (memberid) { @@ -285,9 +288,9 @@ gui.TrivialUndoManager = function TrivialUndoManager(defaultRules) { } while (stateTransition && remainingAddOps > 0) { - ops = stateTransition.getOperations(); - ops.reverse(); // Want the LAST move/add operation seen - ops.forEach(processOp); + operations = stateTransition.getOperations(); + operations.reverse(); // Want the LAST move/add operation seen + operations.forEach(processOp); stateTransition = undoStateTransitions.pop(); } From 2e37ffecabc1e7449e0ec1238aed6c7b9df279c4 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 156/385] Asked for the release of android androidx.webkit runs on. --- programs/androidviewer/build.gradle | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/programs/androidviewer/build.gradle b/programs/androidviewer/build.gradle index e9e91e3e0..686e09601 100644 --- a/programs/androidviewer/build.gradle +++ b/programs/androidviewer/build.gradle @@ -11,10 +11,11 @@ android { defaultConfig { applicationId = 'org.webodf.viewer' - // 21 is the release the web view began to be updated apart from the - // system in, so it holds a recent engine from there on, and the one - // call the viewer intercepts its requests with was added there too. - minSdk = 21 + // 24 is the oldest release androidx.webkit runs on, which it says + // when the manifests are merged. The web view has been updated apart + // from the system since 21, so it reads what the library needs on + // every release from there anyway. + minSdk = 24 targetSdk = 36 versionCode = 1 versionName = project.findProperty('webodfVersion') ?: '0.0.0' From 80562819f3b3226f41305f1e80f899fa12ddae11 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 157/385] Packed the viewer for Chrome as well. --- CMakeLists.txt | 4 +++ programs/firefoxextension/CMakeLists.txt | 21 +++++++----- programs/firefoxextension/background.js | 7 ---- .../firefoxextension/manifest-chrome.json.in | 34 +++++++++++++++++++ programs/firefoxextension/rules.json | 16 +++++++++ programs/firefoxextension/viewer.js | 13 ++++--- 6 files changed, 75 insertions(+), 20 deletions(-) create mode 100644 programs/firefoxextension/manifest-chrome.json.in create mode 100644 programs/firefoxextension/rules.json diff --git a/CMakeLists.txt b/CMakeLists.txt index 73bfc13a2..1b0841896 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -388,6 +388,10 @@ set(FIREFOX_EXTENSION_ODFVIEWER_DIR ${CMAKE_CURRENT_BINARY_DIR}/firefox-extensio set(FIREFOX_EXTENSION_ODFVIEWER ${FIREFOX_EXTENSION_ODFVIEWER_DIR}.xpi) set(FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR ${CMAKE_CURRENT_BINARY_DIR}/firefox-extension-odfviewer-mv2-${WEBODF_VERSION}) set(FIREFOX_EXTENSION_ODFVIEWER_MV2 ${FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR}.xpi) +# Chrome takes a zip, and a file of rules rather than a script: it dropped the +# blocking webRequest the two others redirect with. +set(CHROME_EXTENSION_ODFVIEWER_DIR ${CMAKE_CURRENT_BINARY_DIR}/chrome-extension-odfviewer-${WEBODF_VERSION}) +set(CHROME_EXTENSION_ODFVIEWER ${CHROME_EXTENSION_ODFVIEWER_DIR}.zip) #################### diff --git a/programs/firefoxextension/CMakeLists.txt b/programs/firefoxextension/CMakeLists.txt index cf11846f6..e952eba39 100644 --- a/programs/firefoxextension/CMakeLists.txt +++ b/programs/firefoxextension/CMakeLists.txt @@ -2,6 +2,7 @@ # from the build and the manifest carries the version, see below. set(FIREFOXEXTENSIONFILES background.js + rules.json viewer.html viewer.css viewer.js @@ -10,11 +11,12 @@ set(FIREFOXEXTENSIONFILES configure_file(manifest-v3.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest-v3.json) configure_file(manifest-v2.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest-v2.json) +configure_file(manifest-chrome.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest-chrome.json) -# Pack the add-on from one of the two manifests. The scripts are the same: -# only the manifest tells the version 2 from the version 3, see -# "README-Products.md". -macro(PACK_FIREFOX_EXTENSION xpi dir manifest) +# Pack the add-on from one of the three manifests. The viewer is the same in +# all of them: only the way the documents reach it differs, and Chrome takes +# a file of rules rather than a script, see "README-Products.md". +macro(PACK_FIREFOX_EXTENSION xpi dir manifest extra) add_custom_command( OUTPUT ${xpi} COMMAND ${CMAKE_COMMAND} -E remove_directory ${dir} @@ -23,10 +25,10 @@ macro(PACK_FIREFOX_EXTENSION xpi dir manifest) ${CMAKE_CURRENT_BINARY_DIR}/${manifest} ${dir}/manifest.json COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/webodf/webodf.js ${dir} COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_CURRENT_SOURCE_DIR}/background.js ${CMAKE_CURRENT_SOURCE_DIR}/viewer.html ${CMAKE_CURRENT_SOURCE_DIR}/viewer.css ${CMAKE_CURRENT_SOURCE_DIR}/viewer.js + ${CMAKE_CURRENT_SOURCE_DIR}/${extra} ${dir} COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/skin/default/icon.png @@ -46,12 +48,15 @@ macro(PACK_FIREFOX_EXTENSION xpi dir manifest) endmacro() PACK_FIREFOX_EXTENSION(${FIREFOX_EXTENSION_ODFVIEWER} - ${FIREFOX_EXTENSION_ODFVIEWER_DIR} manifest-v3.json) + ${FIREFOX_EXTENSION_ODFVIEWER_DIR} manifest-v3.json background.js) PACK_FIREFOX_EXTENSION(${FIREFOX_EXTENSION_ODFVIEWER_MV2} - ${FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR} manifest-v2.json) + ${FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR} manifest-v2.json background.js) +PACK_FIREFOX_EXTENSION(${CHROME_EXTENSION_ODFVIEWER} + ${CHROME_EXTENSION_ODFVIEWER_DIR} manifest-chrome.json rules.json) add_custom_target(build-firefoxextension - DEPENDS ${FIREFOX_EXTENSION_ODFVIEWER} ${FIREFOX_EXTENSION_ODFVIEWER_MV2}) + DEPENDS ${FIREFOX_EXTENSION_ODFVIEWER} ${FIREFOX_EXTENSION_ODFVIEWER_MV2} + ${CHROME_EXTENSION_ODFVIEWER}) add_custom_target(test-firefoxextension DEPENDS webodf.js-tests) diff --git a/programs/firefoxextension/background.js b/programs/firefoxextension/background.js index 58a1d0fc0..677feff30 100644 --- a/programs/firefoxextension/background.js +++ b/programs/firefoxextension/background.js @@ -104,11 +104,4 @@ urls: [""], types: ["main_frame", "sub_frame"] }, ["blocking", "responseHeaders"]); - - // The viewer has no permission to download, so it asks for it. - browser.runtime.onMessage.addListener(function (message) { - if (message && message.action === "download" && message.url) { - browser.downloads.download({url: message.url}); - } - }); }()); diff --git a/programs/firefoxextension/manifest-chrome.json.in b/programs/firefoxextension/manifest-chrome.json.in new file mode 100644 index 000000000..63424f1c2 --- /dev/null +++ b/programs/firefoxextension/manifest-chrome.json.in @@ -0,0 +1,34 @@ +{ + "manifest_version": 3, + "name": "ODF Viewer", + "version": "@WEBODF_MANIFEST_VERSION@", + "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", + "author": "Daniel Berthereau", + "homepage_url": "http://webodf.org/", + "minimum_chrome_version": "88", + "icons": { + "238": "skin/default/icon.png" + }, + "permissions": [ + "declarativeNetRequest", + "downloads" + ], + "host_permissions": [ + "" + ], + "declarative_net_request": { + "rule_resources": [ + { + "id": "opendocument", + "enabled": true, + "path": "rules.json" + } + ] + }, + "web_accessible_resources": [ + { + "resources": ["viewer.html"], + "matches": [""] + } + ] +} diff --git a/programs/firefoxextension/rules.json b/programs/firefoxextension/rules.json new file mode 100644 index 000000000..14b675048 --- /dev/null +++ b/programs/firefoxextension/rules.json @@ -0,0 +1,16 @@ +[ + { + "id": 1, + "priority": 1, + "action": { + "type": "redirect", + "redirect": { + "regexSubstitution": "/viewer.html?file=\\0" + } + }, + "condition": { + "regexFilter": "^https?://[^?#]+\\.(odt|fodt|ott|odp|fodp|otp|ods|fods|ots)(\\?[^#]*)?$", + "resourceTypes": ["main_frame", "sub_frame"] + } + } +] diff --git a/programs/firefoxextension/viewer.js b/programs/firefoxextension/viewer.js index 295049299..5cee21e7f 100644 --- a/programs/firefoxextension/viewer.js +++ b/programs/firefoxextension/viewer.js @@ -23,12 +23,17 @@ * @source: https://github.com/kogmbh/WebODF/ */ -/*global document, window, browser, odf, URLSearchParams, URL*/ +/*global document, window, browser, chrome, odf, URLSearchParams, URL*/ (function () { "use strict"; - var url = new URLSearchParams(window.location.search).get("file"), + // Firefox names the api "browser", Chrome names it "chrome". A page of an + // add-on carries its permissions, so it downloads by itself. + var api = (String(typeof browser) !== "undefined") + ? browser + : chrome, + url = new URLSearchParams(window.location.search).get("file"), canvas = new odf.OdfCanvas(document.getElementById("odf")), open = document.getElementById("open"); @@ -60,10 +65,8 @@ return; } show(decodeURIComponent(url.split("/").pop())); - // The download goes through the background script, as the viewer holds no - // permission of its own. document.getElementById("download").addEventListener("click", function () { - browser.runtime.sendMessage({action: "download", url: url}); + api.downloads.download({url: url}); }); canvas.load(url); }()); From 6e33489add95774d38ea69ba53bcb44364e6693d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 158/385] Told why the namespaces of the class loader are aliased. --- webodf/lib/runtime.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 5a871a57d..add4e7c2e 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -1841,6 +1841,19 @@ var webodf = {}; } e.parentNode.insertBefore(df, e); } + // The five namespaces of the library are gathered here, so that a class may + // be looked up by its name. The compiler reports a partial alias for each + // of them, JSC_PARTIAL_NAMESPACE, as it may no longer flatten what they + // hold, and any way of reading a namespace as a value does it: a map built + // when a class is looked up rather than here, or a function returning them + // one by one, are reported the same way. Only dropping the lookup by name + // would remove it, that this loader exists for. + // + // The warning is left, as it only shows in the target "compiled.js" of the + // build with cmake, that compiles the library and the tests with + // ADVANCED_OPTIMIZATIONS to report more problems, and whose output is never + // run. The library that ships is compiled with SIMPLE_OPTIMIZATIONS, that + // flattens no namespace, and reports none of it. var /**@type{!Object.}>}*/ dependencies, packages = { From c1530aca34bf667e08c96ce2b1b85b01c127417b Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 159/385] Ran the tests of the dom with node, using jsdom. --- package-lock.json | 543 ++++++++++++++++++++++++ package.json | 1 + scripts/lib/dom.js | 43 ++ scripts/test.js | 7 +- webodf/lib/runtime.js | 34 +- webodf/tests/odf/ListStyleToCssTests.js | 3 + webodf/tests/tests.js | 64 ++- webodf/tools/externs.js | 7 + 8 files changed, 689 insertions(+), 13 deletions(-) create mode 100644 scripts/lib/dom.js diff --git a/package-lock.json b/package-lock.json index 4941341c7..af0e15206 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,7 +13,44 @@ }, "devDependencies": { "jsdoc": "^4.0.5", + "jsdom": "^30.0.1", "terser": "^5.50.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-6.0.7.tgz", + "integrity": "sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.3.0", + "@csstools/css-color-parser": "^4.1.10", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.5.2" + }, + "engines": { + "node": "^22.13.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-8.3.2.tgz", + "integrity": "sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.5.2" + }, + "engines": { + "node": "^22.13.0 || >=24.0.0" } }, "node_modules/@babel/helper-string-parser": { @@ -66,6 +103,177 @@ "node": ">=6.9.0" } }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", + "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.10.tgz", + "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.1.0", + "@csstools/css-calc": "^3.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", + "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -183,6 +391,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -217,6 +435,56 @@ "dev": true, "license": "MIT" }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -247,6 +515,26 @@ "dev": true, "license": "ISC" }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js2xmlparser": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", @@ -287,6 +575,47 @@ "node": ">=12.0.0" } }, + "node_modules/jsdom": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-30.0.1.tgz", + "integrity": "sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^6.0.5", + "@asamuzakjp/dom-selector": "^8.3.0", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.7", + "@exodus/bytes": "^1.15.1", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.5.2", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.2", + "undici": "^8.9.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^17.1.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "canvas": "^3.2.3" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/klaw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", @@ -324,6 +653,16 @@ "dev": true, "license": "MIT" }, + "node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/markdown-it": { "version": "14.3.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", @@ -376,6 +715,13 @@ "node": ">= 12" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/mdurl": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", @@ -396,6 +742,42 @@ "node": ">=10" } }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -406,6 +788,16 @@ "node": ">=6" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", @@ -416,6 +808,19 @@ "lodash": "^4.17.21" } }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -426,6 +831,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -450,6 +865,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, "node_modules/terser": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.50.0.tgz", @@ -469,6 +891,52 @@ "node": ">=10" } }, + "node_modules/tldts": { + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz", + "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.10" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz", + "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", + "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -483,6 +951,81 @@ "dev": true, "license": "MIT" }, + "node_modules/undici": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", + "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.0.tgz", + "integrity": "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.15.1", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^22.14.0 || >=24.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/xmlcreate": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", diff --git a/package.json b/package.json index a51207e29..77ba9bae6 100644 --- a/package.json +++ b/package.json @@ -39,6 +39,7 @@ }, "devDependencies": { "jsdoc": "^4.0.5", + "jsdom": "^30.0.1", "terser": "^5.50.0" }, "scripts": { diff --git a/scripts/lib/dom.js b/scripts/lib/dom.js new file mode 100644 index 000000000..96d036363 --- /dev/null +++ b/scripts/lib/dom.js @@ -0,0 +1,43 @@ +"use strict"; + +/** + * A dom close to the one of a browser, from jsdom, added to the globals of + * node. The package xmldom, that the library uses by default, has no range and + * no tree walker, so the tests that walk a document are skipped without this. + */ + +/** + * Add the interfaces of a dom to the global object, when jsdom is installed. + * @return {boolean} true when the dom is available + */ +function install() { + var JSDOM, window, names; + try { + JSDOM = require("jsdom").JSDOM; + } catch (ignore) { + return false; + } + window = new JSDOM("").window; + names = [ + "DOMParser", "XMLSerializer", "Node", "NodeFilter", "Element", "Attr", + "Document", "DocumentFragment", "Text", "Range", "NodeIterator", + "TreeWalker", "XPathResult", "DOMException", "getComputedStyle" + ]; + names.forEach(function (name) { + if (window[name] !== undefined) { + global[name] = window[name]; + } + }); + // The document and the window of the page, that some tests use to build + // their fixtures. + global.document = window.document; + global.window = window; + // The packaged libraries, JSZip for now, attach themselves to the window + // when there is one, while the library reads them as a global. The same + // object is shared, so that both see the same packages. + global.externs = {}; + window.externs = global.externs; + return true; +} + +exports.install = install; diff --git a/scripts/test.js b/scripts/test.js index 1fdb8f48a..1cdd09052 100644 --- a/scripts/test.js +++ b/scripts/test.js @@ -21,11 +21,16 @@ function main() { var dir = fs.mkdtempSync(path.join(os.tmpdir(), "webodf-test-")), bundlePath = path.join(dir, "tests.js"), result; + // The bundle is loaded by a small script that adds a dom to the globals + // first, so that the tests walking a document are not skipped. fs.writeFileSync(bundlePath, bundle.withTests()); + fs.writeFileSync(path.join(dir, "run.js"), + "require(" + JSON.stringify(path.join(__dirname, "lib/dom.js")) + + ").install();\nrequire(" + JSON.stringify(bundlePath) + ");\n"); // The tests read their documents from the current directory, and require() // resolves the dependencies from the directory of the bundle. fs.symlinkSync(path.join(rootDir, "node_modules"), path.join(dir, "node_modules")); - result = child.spawnSync(process.execPath, [bundlePath], { + result = child.spawnSync(process.execPath, [path.join(dir, "run.js")], { cwd: sources.testsDir, stdio: "inherit" }); diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 51bbadc30..041084ba6 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -902,6 +902,8 @@ function BrowserRuntime() { */ function NodeJSRuntime() { "use strict"; + var /**@type{!{DOMParser:(!Function|undefined),Node:(!Function|undefined),NodeFilter:(!Object|undefined),Element:(!Function|undefined),window:(!Window|undefined)}}*/ + globalScope = /**@type{!{DOMParser:(!Function|undefined),Node:(!Function|undefined),NodeFilter:(!Object|undefined),Element:(!Function|undefined),window:(!Window|undefined)}}*/(globalThis); var self = this, fs = require('fs'), pathmod = require('path'), @@ -1146,8 +1148,12 @@ function NodeJSRuntime() { return parser.parseFromString(xml, "text/xml"); }; this.exit = process.exit; + /** + * The window of the host, when it provides a full dom, for example jsdom. + * @return {?Window} + */ this.getWindow = function () { - return null; + return globalScope.window || null; }; /** * @param {!function():undefined} callback @@ -1207,20 +1213,26 @@ function NodeJSRuntime() { xmldomPackage = /**@type{!XmlDom}*/(require('@xmldom/xmldom')), /**@type{function(new:DOMParser)}*/ XmlDomParser = xmldomPackage.DOMParser; - parser = new XmlDomParser(); + // A host may provide a full dom, for example jsdom: it is used when it + // is there, since the package xmldom has no range and no tree walker. + if (globalScope.DOMParser) { + parser = new (/**@type{function(new:DOMParser)}*/(globalScope.DOMParser))(); + } else { + parser = new XmlDomParser(); + } domImplementation = self.parseXML("").implementation; // A browser exposes the dom interfaces globally and the whole library // uses their constants. The package xmldom provides Node, but not // NodeFilter, that is only a set of constants. They are not replaced // when they exist already, for example under a full dom like jsdom. - if (!global.Node) { - global.Node = xmldomPackage.Node; + if (!globalScope.Node) { + globalScope.Node = xmldomPackage.Node; } addElementTraversal(xmldomPackage.Node.prototype); - if (global.NodeFilter) { + if (globalScope.NodeFilter) { return; } - global.NodeFilter = { + globalScope.NodeFilter = { SHOW_ALL: 4294967295, SHOW_ELEMENT: 1, SHOW_ATTRIBUTE: 2, @@ -1591,10 +1603,14 @@ Runtime.create = function create() { "use strict"; var /**@type{!Runtime}*/ result; - if (String(typeof window) !== "undefined") { - result = new BrowserRuntime(); - } else if (String(typeof require) !== "undefined") { + // Node comes first: a dom like jsdom may add a window to its globals, and + // the runtime of a browser would then be chosen by mistake. A bundler for + // a browser defines process, but not its versions. + if (String(typeof process) !== "undefined" && process.versions + && process.versions.node) { result = new NodeJSRuntime(); + } else if (String(typeof window) !== "undefined") { + result = new BrowserRuntime(); } else { result = new RhinoRuntime(); } diff --git a/webodf/tests/odf/ListStyleToCssTests.js b/webodf/tests/odf/ListStyleToCssTests.js index 4e3367ee3..f8b16d4dd 100644 --- a/webodf/tests/odf/ListStyleToCssTests.js +++ b/webodf/tests/odf/ListStyleToCssTests.js @@ -201,6 +201,9 @@ odf.ListStyleToCssTests = function ListStyleToCssTests(runner) { // Replace counters as they report counter() in qtjsruntimetests... grrr.. content = content.replace(/counter\([^)]*\)/g, "counter(...)"); + // A dom without a browser, like jsdom, writes the value of the content + // on several lines, where a browser keeps a single space. + content = content.replace(/\s*\n\s*/g, " "); for (stringStartIndex = 0, currentCharIndex = 0; currentCharIndex < content.length; currentCharIndex += 1) { currentCharacter = content[currentCharIndex]; diff --git a/webodf/tests/tests.js b/webodf/tests/tests.js index 8efe5c5f2..c37bcb1b0 100644 --- a/webodf/tests/tests.js +++ b/webodf/tests/tests.js @@ -100,6 +100,55 @@ function hasBrowserLikeDom() { } } +/** + * Two suites measure where the text is drawn. A dom without a layout engine, + * like jsdom, has no geometry at all and cannot run them. + * @return {!boolean} + */ +function hasLayout() { + "use strict"; + var window = runtime.getWindow(); + if (!window || !window.document) { + return false; + } + try { + return typeof window.document.createRange().getClientRects === "function"; + } catch (ignore) { + return false; + } +} + +/** + * The suite on the styles of the lists compares the rules of a stylesheet one + * by one. A permissive css parser, like the one of jsdom, keeps a rule that a + * browser drops, so the lists do not match. + * @return {!boolean} + */ +function hasStrictCssParser() { + "use strict"; + var window = runtime.getWindow(), + style, + sheet, + count; + if (!window || !window.document) { + return false; + } + style = window.document.createElement("style"); + window.document.head.appendChild(style); + sheet = style.sheet; + try { + sheet.insertRule("@namespace text url(urn:webodf:names:test);", 0); + count = sheet.cssRules.length; + sheet.insertRule("text|a > :not(text|b){margin-left:0;}", count); + return sheet.cssRules.length === count; + } catch (ignore) { + // The engine refused the rule, as a browser does. + return true; + } finally { + style.parentNode.removeChild(style); + } +} + // add tests depending on runtime with XML parser if (hasBrowserLikeDom()) { // TODO: fix test and enable @@ -109,18 +158,15 @@ if (hasBrowserLikeDom()) { tests.push(webodfcore.EventSubscriptionsTests); tests.push(webodfcore.StepIteratorTests); tests.push(gui.DirectFormattingControllerTests); - tests.push(gui.GuiStepUtilsTests); tests.push(gui.UndoStateRulesTests); tests.push(gui.TextControllerTests); tests.push(gui.ImageControllerTests); tests.push(gui.TrivialUndoManagerTests); tests.push(gui.MetadataControllerTests); - tests.push(gui.SelectionControllerTests); tests.push(gui.StyleSummaryTests); tests.push(odf.OdfUtilsTests); tests.push(odf.ObjectNameGeneratorTests); tests.push(odf.FormattingTests); - tests.push(odf.ListStyleToCssTests); tests.push(odf.MaliciousDocumentTests); tests.push(odf.OdfContainerTests); tests.push(odf.OdfContainerSafetyTests); @@ -131,6 +177,18 @@ if (hasBrowserLikeDom()) { tests.push(ops.OdtStepsTranslatorTests); tests.push(ops.TransformerTests); } + +// add tests needing a css parser as strict as the one of a browser +if (hasStrictCssParser()) { + tests.push(odf.ListStyleToCssTests); +} + +// add tests needing the geometry of a layout engine +if (hasLayout()) { + tests.push(gui.GuiStepUtilsTests); + tests.push(gui.SelectionControllerTests); +} + // add tests depending on browser runtime if (runtime.type() === "BrowserRuntime") { tests.push(xmldom.LSSerializerTests); diff --git a/webodf/tools/externs.js b/webodf/tools/externs.js index b12046816..9dc37aff4 100644 --- a/webodf/tools/externs.js +++ b/webodf/tools/externs.js @@ -181,6 +181,13 @@ var JSON; * @type {!NodeJSProcess} */ var process; + +/** + * The versions of node and of its libraries. It tells a real node from a + * bundler that only defines an object named process. + * @type {(!{node:(!string|undefined)}|undefined)} + */ +NodeJSProcess.prototype.versions; /** * @type {!string} */ From 3fd7ba0994437d4874bb0e2953a54ff4358e683d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 160/385] Updated the closure compiler used to check the types to 2026. --- README-Building.md | 14 ++++++++++---- scripts/lib/closure.js | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/README-Building.md b/README-Building.md index 5dd61a9df..a521485d1 100644 --- a/README-Building.md +++ b/README-Building.md @@ -184,10 +184,16 @@ npm run doc # generate the documentation of the api in "dist/docs" The command "npm run check" uses the closure compiler as a type checker only: it writes no output. The jar is downloaded once from maven central into the -directory ".tools". The version is pinned in "scripts/lib/closure.js", because -a newer compiler reports about two hundred more errors, mostly from a stricter -inference, so updating it is a task of its own. Set the environment variable -CLOSURE_JAR to use another copy. +directory ".tools". The version is pinned in "scripts/lib/closure.js" and the +sources pass with it as with the one of 2016, that the project used before: + +```sh +CLOSURE_VERSION=v20160911 npm run check # the previous compiler +CLOSURE_JAR=/path/to/compiler.jar npm run check # another copy +``` + +The groups of checks removed from the compilers newer than 2016 are dropped +automatically, so both versions run with the same set of checks. The tests needing a browser are still run with karma, see "webodf/tools/karma.conf.js". diff --git a/scripts/lib/closure.js b/scripts/lib/closure.js index 5c5c468b5..d0ca6ee8c 100644 --- a/scripts/lib/closure.js +++ b/scripts/lib/closure.js @@ -11,7 +11,7 @@ var fs = require("fs"), https = require("https"), rootDir = path.resolve(__dirname, "../.."), toolsDir = path.join(rootDir, ".tools"), - version = process.env.CLOSURE_VERSION || "v20160911", + version = process.env.CLOSURE_VERSION || "v20260804", jarName = "closure-compiler-" + version + ".jar", jarPath = path.join(toolsDir, jarName), jarUrl = "https://repo1.maven.org/maven2/com/google/javascript/closure-compiler/" From 4db26893b2ae4f7c4463643053ecc56db31016bb Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 161/385] Named the products "OpenDocument Viewer". --- programs/odfviewer-android/src/main/assets/index.html | 2 +- programs/odfviewer-android/src/main/res/values/strings.xml | 2 +- programs/odfviewer-webext/manifest-chrome.json.in | 2 +- programs/odfviewer-webext/manifest-v2.json.in | 2 +- programs/odfviewer-webext/manifest-v3.json.in | 2 +- programs/odfviewer-webext/viewer.html | 2 +- programs/odfviewer-webext/viewer.js | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/programs/odfviewer-android/src/main/assets/index.html b/programs/odfviewer-android/src/main/assets/index.html index 0810aea54..0beabaa31 100644 --- a/programs/odfviewer-android/src/main/assets/index.html +++ b/programs/odfviewer-android/src/main/assets/index.html @@ -3,7 +3,7 @@ - ODF Viewer + OpenDocument Viewer diff --git a/programs/odfviewer-android/src/main/res/values/strings.xml b/programs/odfviewer-android/src/main/res/values/strings.xml index d5e663fa8..6c76d50f2 100644 --- a/programs/odfviewer-android/src/main/res/values/strings.xml +++ b/programs/odfviewer-android/src/main/res/values/strings.xml @@ -1,6 +1,6 @@ - ODF Viewer + OpenDocument Viewer No application of this system opens a file, so a document has to be opened from a file manager. diff --git a/programs/odfviewer-webext/manifest-chrome.json.in b/programs/odfviewer-webext/manifest-chrome.json.in index d05beafa2..c2a22acd5 100644 --- a/programs/odfviewer-webext/manifest-chrome.json.in +++ b/programs/odfviewer-webext/manifest-chrome.json.in @@ -1,6 +1,6 @@ { "manifest_version": 3, - "name": "ODF Viewer", + "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", "author": "Daniel Berthereau", diff --git a/programs/odfviewer-webext/manifest-v2.json.in b/programs/odfviewer-webext/manifest-v2.json.in index 90287371c..561183ca9 100644 --- a/programs/odfviewer-webext/manifest-v2.json.in +++ b/programs/odfviewer-webext/manifest-v2.json.in @@ -1,6 +1,6 @@ { "manifest_version": 2, - "name": "ODF Viewer", + "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", "author": "Daniel Berthereau", diff --git a/programs/odfviewer-webext/manifest-v3.json.in b/programs/odfviewer-webext/manifest-v3.json.in index 6419d36a3..83f95b336 100644 --- a/programs/odfviewer-webext/manifest-v3.json.in +++ b/programs/odfviewer-webext/manifest-v3.json.in @@ -1,6 +1,6 @@ { "manifest_version": 3, - "name": "ODF Viewer", + "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", "author": "Daniel Berthereau", diff --git a/programs/odfviewer-webext/viewer.html b/programs/odfviewer-webext/viewer.html index 2003fc89b..5bf32fc4e 100644 --- a/programs/odfviewer-webext/viewer.html +++ b/programs/odfviewer-webext/viewer.html @@ -2,7 +2,7 @@ - ODF Viewer + OpenDocument Viewer diff --git a/programs/odfviewer-webext/viewer.js b/programs/odfviewer-webext/viewer.js index 5cee21e7f..e3e5309c8 100644 --- a/programs/odfviewer-webext/viewer.js +++ b/programs/odfviewer-webext/viewer.js @@ -61,7 +61,7 @@ }); if (!url) { - show("ODF Viewer"); + show("OpenDocument Viewer"); return; } show(decodeURIComponent(url.split("/").pop())); From f3a859be4a04a21b85ee7cca201bb26b0c8a5d15 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 162/385] Served the files of the viewer without androidx. --- programs/androidviewer/build.gradle | 15 ++-- .../org/webodf/viewer/ViewerActivity.java | 81 ++++++++++++++----- 2 files changed, 68 insertions(+), 28 deletions(-) diff --git a/programs/androidviewer/build.gradle b/programs/androidviewer/build.gradle index 686e09601..b2325af3a 100644 --- a/programs/androidviewer/build.gradle +++ b/programs/androidviewer/build.gradle @@ -11,11 +11,10 @@ android { defaultConfig { applicationId = 'org.webodf.viewer' - // 24 is the oldest release androidx.webkit runs on, which it says - // when the manifests are merged. The web view has been updated apart - // from the system since 21, so it reads what the library needs on - // every release from there anyway. - minSdk = 24 + // 21 is the release the web view began to be updated apart from the + // system in, so it holds a recent engine from there on, and the one + // call the viewer intercepts its requests with was added there too. + minSdk = 21 targetSdk = 36 versionCode = 1 versionName = project.findProperty('webodfVersion') ?: '0.0.0' @@ -33,8 +32,4 @@ android { } } -dependencies { - // Serves the assets and the cache over https, so that the page may read - // the document with XMLHttpRequest. - implementation = 'androidx.webkit:webkit:1.17.0' -} +// No dependency at all: the viewer serves its own files, see ViewerActivity. diff --git a/programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java b/programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java index 6105c33af..0c84e4e64 100644 --- a/programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java +++ b/programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java @@ -28,11 +28,13 @@ import android.content.Intent; import android.net.Uri; import android.os.Bundle; +import android.webkit.WebResourceRequest; +import android.webkit.WebResourceResponse; import android.webkit.WebView; import android.webkit.WebViewClient; -import androidx.webkit.WebViewAssetLoader; import java.io.File; +import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; @@ -45,14 +47,37 @@ * system hands over is copied into the directory of the cache, as it comes as * a "content://" uri that the web view may not read by itself. * - * Everything is served over "https://webodf.invalid/", by the asset loader: - * a page loaded from "file://" may not read another file with XMLHttpRequest, - * which is how the library reads a document. + * Everything is served over "https://webodf.invalid/", from the requests the + * web view is intercepted on: a page loaded from "file://" may not read + * another file with XMLHttpRequest, which is how the library reads a + * document. Only the four files of the viewer and the one document are + * served, so no name from a document may reach anything else. */ public class ViewerActivity extends Activity { private static final String DOMAIN = "webodf.invalid"; + private static final String PAGE = "https://" + DOMAIN + "/index.html"; private static final String CACHED = "document.odf"; + private static final String[] FILES = { + "index.html", "index.css", "index.js", "webodf.js" + }; + + /** + * The type of a file of the viewer, as the web view only reads a script + * and a style sheet when they are served as such. + */ + private static String typeOf(String name) { + if (name.endsWith(".html")) { + return "text/html"; + } + if (name.endsWith(".js")) { + return "application/javascript"; + } + if (name.endsWith(".css")) { + return "text/css"; + } + return "application/octet-stream"; + } /** * Copy the document into the cache, so that it is served as a file of its @@ -77,37 +102,57 @@ private boolean cache(Uri uri) { } } + /** + * Answer a request of the page, and nothing else: the name is compared to + * the files that are served, never used to build a path. + */ + private WebResourceResponse answer(Uri uri) { + if (!DOMAIN.equals(uri.getHost())) { + return null; + } + String name = uri.getLastPathSegment(); + if (name == null) { + return null; + } + try { + if (("/" + CACHED).equals(uri.getPath())) { + return new WebResourceResponse(typeOf(name), null, + new FileInputStream(new File(getCacheDir(), CACHED))); + } + for (String served : FILES) { + if (served.equals(name) && ("/" + served).equals(uri.getPath())) { + return new WebResourceResponse(typeOf(name), "utf-8", + getAssets().open(served)); + } + } + } catch (IOException e) { + return null; + } + return null; + } + @Override protected void onCreate(Bundle state) { super.onCreate(state); - WebViewAssetLoader loader = new WebViewAssetLoader.Builder() - .setDomain(DOMAIN) - .addPathHandler("/assets/", - new WebViewAssetLoader.AssetsPathHandler(this)) - .addPathHandler("/cache/", - new WebViewAssetLoader.InternalStoragePathHandler( - this, getCacheDir())) - .build(); - WebView view = new WebView(this); view.getSettings().setJavaScriptEnabled(true); view.setWebViewClient(new WebViewClient() { @Override - public android.webkit.WebResourceResponse shouldInterceptRequest( - WebView webView, android.webkit.WebResourceRequest request) { - return loader.shouldInterceptRequest(request.getUrl()); + public WebResourceResponse shouldInterceptRequest( + WebView webView, WebResourceRequest request) { + return answer(request.getUrl()); } }); setContentView(view); - String page = "https://" + DOMAIN + "/assets/index.html"; + String page = PAGE; Intent intent = getIntent(); Uri uri = (intent == null) ? null : intent.getData(); if (uri != null && cache(uri)) { - page += "?file=/cache/" + CACHED; + page += "?file=/" + CACHED; } view.loadUrl(page); } From fface2d2b3c3ae4ee5f7a0f3408e8e604267e2ba Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 163/385] Redirected with a rule Chrome accepts, and told how to run the packages. --- programs/firefoxextension/CMakeLists.txt | 4 +- .../firefoxextension/background-chrome.js | 69 +++++++++++++++++++ .../firefoxextension/manifest-chrome.json.in | 10 +-- programs/firefoxextension/rules.json | 16 ----- 4 files changed, 73 insertions(+), 26 deletions(-) create mode 100644 programs/firefoxextension/background-chrome.js delete mode 100644 programs/firefoxextension/rules.json diff --git a/programs/firefoxextension/CMakeLists.txt b/programs/firefoxextension/CMakeLists.txt index e952eba39..7956f0a25 100644 --- a/programs/firefoxextension/CMakeLists.txt +++ b/programs/firefoxextension/CMakeLists.txt @@ -2,7 +2,7 @@ # from the build and the manifest carries the version, see below. set(FIREFOXEXTENSIONFILES background.js - rules.json + background-chrome.js viewer.html viewer.css viewer.js @@ -52,7 +52,7 @@ PACK_FIREFOX_EXTENSION(${FIREFOX_EXTENSION_ODFVIEWER} PACK_FIREFOX_EXTENSION(${FIREFOX_EXTENSION_ODFVIEWER_MV2} ${FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR} manifest-v2.json background.js) PACK_FIREFOX_EXTENSION(${CHROME_EXTENSION_ODFVIEWER} - ${CHROME_EXTENSION_ODFVIEWER_DIR} manifest-chrome.json rules.json) + ${CHROME_EXTENSION_ODFVIEWER_DIR} manifest-chrome.json background-chrome.js) add_custom_target(build-firefoxextension DEPENDS ${FIREFOX_EXTENSION_ODFVIEWER} ${FIREFOX_EXTENSION_ODFVIEWER_MV2} diff --git a/programs/firefoxextension/background-chrome.js b/programs/firefoxextension/background-chrome.js new file mode 100644 index 000000000..b6c864f1b --- /dev/null +++ b/programs/firefoxextension/background-chrome.js @@ -0,0 +1,69 @@ +/** + * Copyright (C) 2026 Daniel Berthereau + * + * @licstart + * This file is part of WebODF. + * + * WebODF is free software: you can redistribute it and/or modify it under the + * terms of the GNU Affero General Public License (GNU AGPL) as published by the + * Free Software Foundation, either version 3 of the License, or (at your + * option) any later version. + * + * WebODF is distributed in the hope that it will be useful, but WITHOUT ANY + * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR + * A PARTICULAR PURPOSE. See the GNU Affero General Public License for more + * details. + * + * You should have received a copy of the GNU Affero General Public License + * along with WebODF. If not, see . + * @licend + * + * @source: http://www.webodf.org/ + * @source: https://github.com/kogmbh/WebODF/ + */ + +/*global chrome*/ + +/** + * Send the documents in the OpenDocument format to the viewer of the extension, + * instead of letting Chrome download them. + * + * Chrome dropped the blocking webRequest the add-on of Firefox redirects with, + * so a rule of declarativeNetRequest does it. The rule is written here rather + * than in a file of the manifest, as the url it redirects to has to be an + * absolute one, and the identifier of the extension is only known once it is + * installed. + */ +(function () { + "use strict"; + + var /**@const@type{!string}*/ + extensions = "odt|fodt|ott|odp|fodp|otp|ods|fods|ots", + /**@const@type{!number}*/ + ruleId = 1; + + function install() { + chrome.declarativeNetRequest.updateDynamicRules({ + removeRuleIds: [ruleId], + addRules: [{ + id: ruleId, + priority: 1, + action: { + type: "redirect", + redirect: { + regexSubstitution: chrome.runtime.getURL("viewer.html") + + "?file=\\0" + } + }, + condition: { + regexFilter: "^https?://[^?#]+\\.(" + extensions + + ")(\\?[^#]*)?$", + resourceTypes: ["main_frame", "sub_frame"] + } + }] + }); + } + + chrome.runtime.onInstalled.addListener(install); + chrome.runtime.onStartup.addListener(install); +}()); diff --git a/programs/firefoxextension/manifest-chrome.json.in b/programs/firefoxextension/manifest-chrome.json.in index 63424f1c2..d05beafa2 100644 --- a/programs/firefoxextension/manifest-chrome.json.in +++ b/programs/firefoxextension/manifest-chrome.json.in @@ -16,14 +16,8 @@ "host_permissions": [ "" ], - "declarative_net_request": { - "rule_resources": [ - { - "id": "opendocument", - "enabled": true, - "path": "rules.json" - } - ] + "background": { + "service_worker": "background-chrome.js" }, "web_accessible_resources": [ { diff --git a/programs/firefoxextension/rules.json b/programs/firefoxextension/rules.json deleted file mode 100644 index 14b675048..000000000 --- a/programs/firefoxextension/rules.json +++ /dev/null @@ -1,16 +0,0 @@ -[ - { - "id": 1, - "priority": 1, - "action": { - "type": "redirect", - "redirect": { - "regexSubstitution": "/viewer.html?file=\\0" - } - }, - "condition": { - "regexFilter": "^https?://[^?#]+\\.(odt|fodt|ott|odp|fodp|otp|ods|fods|ots)(\\?[^#]*)?$", - "resourceTypes": ["main_frame", "sub_frame"] - } - } -] From 5a9c1dfc126747839d0c35f71c6ee68d8d7e9db6 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 164/385] Put qtjsruntime behind an option and fixed the name of a module. --- CMakeLists.txt | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index be82f2d5a..cfc7e4fa8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -64,17 +64,26 @@ message(STATUS "WebODF version " ${WEBODF_VERSION}) ## Find installed dependencies ######################################################### -set(QT_MIN_VERSION "5.1.1") -find_package(Qt5Network) -find_package(Qt5Xml) -find_package(Qt5PrintSupport) -find_package(Qt5WebKitWidgets) - -if (Qt5Network_FOUND AND Qt5Xml_FOUND AND Qt5PrintSupport_FOUND AND Qt5WebKitWidgets_FOUND) - set(BUILD_QTJSRUNTIME TRUE) -else () - message(WARNING "Qt5 with modules Qt5Network Qt5Xmle Qt5PrintSupport Qt5WebKitWidgets was not found. qtjsruntime will no be built.") - set(BUILD_QTJSRUNTIME FALSE) +# qtjsruntime runs the tests in the webkit of qt, see "webodf/tests". It is +# opt-in: Qt WebKit was dropped from Qt in 5.6 and is not packaged any more by +# Debian since 13, and "npm run test:browser" runs the same tests in a browser +# that is still maintained. Without the option, the modules are not looked for +# at all, so no warning is reported for something that is not asked for. +option(WEBODF_QTJSRUNTIME "Build qtjsruntime, that runs the tests in the webkit of qt" OFF) + +set(BUILD_QTJSRUNTIME FALSE) +if (WEBODF_QTJSRUNTIME) + set(QT_MIN_VERSION "5.1.1") + find_package(Qt5Network) + find_package(Qt5Xml) + find_package(Qt5PrintSupport) + find_package(Qt5WebKitWidgets) + + if (Qt5Network_FOUND AND Qt5Xml_FOUND AND Qt5PrintSupport_FOUND AND Qt5WebKitWidgets_FOUND) + set(BUILD_QTJSRUNTIME TRUE) + else () + message(FATAL_ERROR "Qt5 with modules Qt5Network Qt5Xml Qt5PrintSupport Qt5WebKitWidgets was not found, so qtjsruntime cannot be built. On Debian 12 and older: apt-get install qtbase5-dev libqt5webkit5-dev") + endif () endif () # java runtime is needed for Closure Compiler From 6d13b19ad2f7a9691442bf5dac0a562dd72e25f5 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 165/385] Updated the lock of the installed packages after adding jsdom. --- node_modules/.package-lock.json | 539 ++++++++++++++++++++++++++++++++ 1 file changed, 539 insertions(+) diff --git a/node_modules/.package-lock.json b/node_modules/.package-lock.json index 8e1e238a2..816116a27 100644 --- a/node_modules/.package-lock.json +++ b/node_modules/.package-lock.json @@ -4,6 +4,39 @@ "lockfileVersion": 3, "requires": true, "packages": { + "node_modules/@asamuzakjp/css-color": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-6.0.7.tgz", + "integrity": "sha512-vC/bk1Lz7Tn/EfU9/apOTBk80/8dyGyWMowPoV1tJ52muDGsDqt2HPT2klrFUiY60MQmQv9q8yIht15JnBgDGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.3.0", + "@csstools/css-color-parser": "^4.1.10", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.5.2" + }, + "engines": { + "node": "^22.13.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-8.3.2.tgz", + "integrity": "sha512-93Z1N+BQNXysodoicpOIyNh2drHfz/CTf9nnT0FEx72GJcIiwgydD7tGAr78j41LsYn3hlRn+LdGPuBLn1Bl8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bidi-js": "^1.0.3", + "css-tree": "^3.2.1", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.5.2" + }, + "engines": { + "node": "^22.13.0 || >=24.0.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", @@ -54,6 +87,177 @@ "node": ">=6.9.0" } }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz", + "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.3.0.tgz", + "integrity": "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.10.tgz", + "integrity": "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.1.0", + "@csstools/css-calc": "^3.3.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.7.tgz", + "integrity": "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz", + "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -171,6 +375,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -205,6 +419,56 @@ "dev": true, "license": "MIT" }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -235,6 +499,26 @@ "dev": true, "license": "ISC" }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js2xmlparser": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz", @@ -275,6 +559,47 @@ "node": ">=12.0.0" } }, + "node_modules/jsdom": { + "version": "30.0.1", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-30.0.1.tgz", + "integrity": "sha512-52v7mUVUfNQVYYqE1lcdaymWL0njO7lTLUog6ZvW2U5KsbiLk/GnZlVJ+qx0xfNJZ6Gn+KSpPNE52vurbxZwrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^6.0.5", + "@asamuzakjp/dom-selector": "^8.3.0", + "@bramus/specificity": "^2.4.2", + "@csstools/css-syntax-patches-for-csstree": "^1.1.7", + "@exodus/bytes": "^1.15.1", + "css-tree": "^3.2.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.5.2", + "parse5": "^8.0.1", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.2", + "undici": "^8.9.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^17.1.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^22.22.2 || ^24.15.0 || >=26.0.0" + }, + "peerDependencies": { + "canvas": "^3.2.3" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, "node_modules/klaw": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/klaw/-/klaw-3.0.0.tgz", @@ -312,6 +637,16 @@ "dev": true, "license": "MIT" }, + "node_modules/lru-cache": { + "version": "11.5.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz", + "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/markdown-it": { "version": "14.3.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.3.0.tgz", @@ -364,6 +699,13 @@ "node": ">= 12" } }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/mdurl": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.1.0.tgz", @@ -384,6 +726,42 @@ "node": ">=10" } }, + "node_modules/parse5": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz", + "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^8.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz", + "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20.19.0" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/punycode.js": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", @@ -394,6 +772,16 @@ "node": ">=6" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/requizzle": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/requizzle/-/requizzle-0.2.4.tgz", @@ -404,6 +792,19 @@ "lodash": "^4.17.21" } }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -414,6 +815,16 @@ "node": ">=0.10.0" } }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", @@ -438,6 +849,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, "node_modules/terser": { "version": "5.50.0", "resolved": "https://registry.npmjs.org/terser/-/terser-5.50.0.tgz", @@ -457,6 +875,52 @@ "node": ">=10" } }, + "node_modules/tldts": { + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.10.tgz", + "integrity": "sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.4.10" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.4.10", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.10.tgz", + "integrity": "sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz", + "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/uc.micro": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", @@ -471,6 +935,81 @@ "dev": true, "license": "MIT" }, + "node_modules/undici": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-8.10.0.tgz", + "integrity": "sha512-HvltHd7avK13QIw/oLe4qoOLyoVSoafqJ2jYOrtMRBkbYT31eiBQ8O0ehRKZiEZCMEyLFQNIADpgCWC5fALvYQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=22.19.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-url": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-17.1.0.tgz", + "integrity": "sha512-3GeworPmc2ZfEEHP7lEbUfBX/L75wdEsi0rLNhXcXxnoN5jyq0SL5gCy06SGW2cyTIZdTvWIDQNQoza++vKeaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.15.1", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^22.14.0 || >=24.0.0" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, "node_modules/xmlcreate": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-2.0.4.tgz", From 19e5c0290a3629b226d076ce2301dda0b1674a7d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 166/385] Renamed the product as OpenDocument Viewer. --- .gitignore | 8 +- CMakeLists.txt | 18 +-- programs/CMakeLists.txt | 4 +- programs/cordova/CMakeLists.txt | 10 +- programs/editor/CMakeLists.txt | 138 +++++++++--------- .../CMakeLists.txt | 22 +-- .../build.gradle | 0 .../gradle.properties | 0 .../settings.gradle | 2 +- .../src/main/AndroidManifest.xml | 0 .../src/main/assets/index.css | 0 .../src/main/assets/index.html | 0 .../src/main/assets/index.js | 0 .../org/webodf/viewer/ViewerActivity.java | 0 .../src/main/res/mipmap/icon.png | Bin .../src/main/res/values/strings.xml | 0 .../CMakeLists.txt | 28 ++-- .../background-chrome.js | 0 .../background.js | 0 .../manifest-chrome.json.in | 0 .../manifest-v2.json.in | 0 .../manifest-v3.json.in | 0 .../skin/default/icon.png | Bin .../viewer.css | 0 .../viewer.html | 0 .../viewer.js | 0 scripts/test-extension.js | 4 +- 27 files changed, 117 insertions(+), 117 deletions(-) rename programs/{odfviewer-android => opendocumentviewer-android}/CMakeLists.txt (80%) rename programs/{odfviewer-android => opendocumentviewer-android}/build.gradle (100%) rename programs/{odfviewer-android => opendocumentviewer-android}/gradle.properties (100%) rename programs/{odfviewer-android => opendocumentviewer-android}/settings.gradle (81%) rename programs/{odfviewer-android => opendocumentviewer-android}/src/main/AndroidManifest.xml (100%) rename programs/{odfviewer-android => opendocumentviewer-android}/src/main/assets/index.css (100%) rename programs/{odfviewer-android => opendocumentviewer-android}/src/main/assets/index.html (100%) rename programs/{odfviewer-android => opendocumentviewer-android}/src/main/assets/index.js (100%) rename programs/{odfviewer-android => opendocumentviewer-android}/src/main/java/org/webodf/viewer/ViewerActivity.java (100%) rename programs/{odfviewer-android => opendocumentviewer-android}/src/main/res/mipmap/icon.png (100%) rename programs/{odfviewer-android => opendocumentviewer-android}/src/main/res/values/strings.xml (100%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/CMakeLists.txt (67%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/background-chrome.js (100%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/background.js (100%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/manifest-chrome.json.in (100%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/manifest-v2.json.in (100%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/manifest-v3.json.in (100%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/skin/default/icon.png (100%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/viewer.css (100%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/viewer.html (100%) rename programs/{odfviewer-webext => opendocumentviewer-webext}/viewer.js (100%) diff --git a/.gitignore b/.gitignore index 2572ce6c8..5394664a9 100644 --- a/.gitignore +++ b/.gitignore @@ -48,7 +48,7 @@ node_modules/* !node_modules/@xmldom # The library is copied into the assets of the viewer of android. -programs/odfviewer-android/src/main/assets/webodf.js -programs/odfviewer-android/.gradle -programs/odfviewer-android/build -programs/odfviewer-android/local.properties +programs/opendocumentviewer-android/src/main/assets/webodf.js +programs/opendocumentviewer-android/.gradle +programs/opendocumentviewer-android/build +programs/opendocumentviewer-android/local.properties diff --git a/CMakeLists.txt b/CMakeLists.txt index ce1d240f0..ba97621ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -339,22 +339,22 @@ set(LIBJSLICENSEFILE ${CMAKE_CURRENT_SOURCE_DIR}/AGPL-3.0.txt) set(WEBODFJS_DIR ${CMAKE_CURRENT_BINARY_DIR}/webodf.js-${WEBODF_VERSION}) set(WEBODFJS_ZIP webodf.js-${WEBODF_VERSION}.zip) -set(WODOTEXTEDITORBUILDDIR ${CMAKE_CURRENT_BINARY_DIR}/wodotexteditor) +set(OPENDOCUMENTTEXTEDITORBUILDDIR ${CMAKE_CURRENT_BINARY_DIR}/opendocumenttexteditor) -set(WODOCOLLABTEXTEDITORBUILDDIR ${CMAKE_BINARY_DIR}/wodocollabtexteditor) -set(WODOCOLLABTEXTEDITOR_ZIP ${CMAKE_CURRENT_BINARY_DIR}/wodocollabtexteditor-${WEBODF_VERSION}.zip) +set(OPENDOCUMENTTEXTCOLLABBUILDDIR ${CMAKE_BINARY_DIR}/opendocumenttextcollab) +set(OPENDOCUMENTTEXTCOLLAB_ZIP ${CMAKE_CURRENT_BINARY_DIR}/opendocumenttextcollab-${WEBODF_VERSION}.zip) # The add-on is packed twice, from the same scripts: the manifest version 3 # needs Firefox 109, of 2023, and the version 2 reaches back to Firefox 48, of # 2016. See "README-Products.md". -set(FIREFOX_EXTENSION_ODFVIEWER_DIR ${CMAKE_CURRENT_BINARY_DIR}/firefox-extension-odfviewer-${WEBODF_VERSION}) -set(FIREFOX_EXTENSION_ODFVIEWER ${FIREFOX_EXTENSION_ODFVIEWER_DIR}.xpi) -set(FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR ${CMAKE_CURRENT_BINARY_DIR}/firefox-extension-odfviewer-mv2-${WEBODF_VERSION}) -set(FIREFOX_EXTENSION_ODFVIEWER_MV2 ${FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR}.xpi) +set(OPENDOCUMENTVIEWER_FIREFOX_DIR ${CMAKE_CURRENT_BINARY_DIR}/opendocumentviewer-firefox-${WEBODF_VERSION}) +set(OPENDOCUMENTVIEWER_FIREFOX ${OPENDOCUMENTVIEWER_FIREFOX_DIR}.xpi) +set(OPENDOCUMENTVIEWER_FIREFOX_MV2_DIR ${CMAKE_CURRENT_BINARY_DIR}/opendocumentviewer-firefox-mv2-${WEBODF_VERSION}) +set(OPENDOCUMENTVIEWER_FIREFOX_MV2 ${OPENDOCUMENTVIEWER_FIREFOX_MV2_DIR}.xpi) # Chrome takes a zip, and a file of rules rather than a script: it dropped the # blocking webRequest the two others redirect with. -set(CHROME_EXTENSION_ODFVIEWER_DIR ${CMAKE_CURRENT_BINARY_DIR}/chrome-extension-odfviewer-${WEBODF_VERSION}) -set(CHROME_EXTENSION_ODFVIEWER ${CHROME_EXTENSION_ODFVIEWER_DIR}.zip) +set(OPENDOCUMENTVIEWER_CHROME_DIR ${CMAKE_CURRENT_BINARY_DIR}/opendocumentviewer-chrome-${WEBODF_VERSION}) +set(OPENDOCUMENTVIEWER_CHROME ${OPENDOCUMENTVIEWER_CHROME_DIR}.zip) #################### diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index e63d9a149..d9768a75d 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -6,10 +6,10 @@ endif(BUILD_QTJSRUNTIME) add_subdirectory(docnosis) -add_subdirectory(odfviewer-webext) +add_subdirectory(opendocumentviewer-webext) add_subdirectory(benchmark) add_subdirectory(editor) add_subdirectory(cordova) -add_subdirectory(odfviewer-android) +add_subdirectory(opendocumentviewer-android) diff --git a/programs/cordova/CMakeLists.txt b/programs/cordova/CMakeLists.txt index 6912e8e5a..da7b1afb4 100644 --- a/programs/cordova/CMakeLists.txt +++ b/programs/cordova/CMakeLists.txt @@ -4,14 +4,14 @@ # or dropped: cordova only wraps "webodf.js" in a web view, so what has to be # written again is the packaging, not anything of WebODF. # -# product-firefoxosviewer packs the viewer for Firefox OS, that Mozilla +# product-opendocumentviewer-firefoxos packs the viewer for Firefox OS, that Mozilla # abandoned in 2016, but that lives on through its forks, B2G OS, KaiOS and # Capyloon. It does not build any more: cordova 3.5, of 2014, is asked for # below. # -# The apk of android was packed here as well. It is built by -# programs/odfviewer-android now, without cordova, so the platform of android -# is not added here any more and the files it needed are gone. +# The apk of android was packed here as well. It is built by programs/opendocumentviewer-android +# now, without cordova, so the platform of android is not added here any more +# and the files it needed are gone. configure_file(config.xml.in config.xml) configure_file(manifest.webapp.in manifest.webapp) @@ -78,4 +78,4 @@ add_custom_command( WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/WebODF ) -add_custom_target(product-firefoxosviewer DEPENDS WebODF/platforms/firefoxos/build/package.zip) +add_custom_target(product-opendocumentviewer-firefoxos DEPENDS WebODF/platforms/firefoxos/build/package.zip) diff --git a/programs/editor/CMakeLists.txt b/programs/editor/CMakeLists.txt index 62d7ef04a..82931bfaf 100644 --- a/programs/editor/CMakeLists.txt +++ b/programs/editor/CMakeLists.txt @@ -128,40 +128,40 @@ add_custom_target(more-common-editorfiles-target ## Wodo.TextEditor ################## -set(WODOTEXTEDITORDOC_BUILDDIR ${WODOTEXTEDITORBUILDDIR}/docs) -set(WODOTEXTEDITORCODE_BUILDDIR ${WODOTEXTEDITORBUILDDIR}/wodotexteditor) +set(OPENDOCUMENTTEXTEDITORDOC_BUILDDIR ${OPENDOCUMENTTEXTEDITORBUILDDIR}/docs) +set(OPENDOCUMENTTEXTEDITORCODE_BUILDDIR ${OPENDOCUMENTTEXTEDITORBUILDDIR}/wodotexteditor) add_custom_command( - OUTPUT ${WODOTEXTEDITORBUILDDIR} + OUTPUT ${OPENDOCUMENTTEXTEDITORBUILDDIR} # clean up output dir - COMMAND ${CMAKE_COMMAND} -E remove_directory ${WODOTEXTEDITORBUILDDIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${WODOTEXTEDITORBUILDDIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${WODOTEXTEDITORCODE_BUILDDIR} + COMMAND ${CMAKE_COMMAND} -E remove_directory ${OPENDOCUMENTTEXTEDITORBUILDDIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENDOCUMENTTEXTEDITORBUILDDIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR} - COMMAND ${CMAKE_COMMAND} -E copy webodf.js ${WODOTEXTEDITORCODE_BUILDDIR} + COMMAND ${CMAKE_COMMAND} -E copy webodf.js ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR} - COMMAND ${CMAKE_COMMAND} -E copy_directory resources/ ${WODOTEXTEDITORCODE_BUILDDIR}/resources/ - COMMAND ${CMAKE_COMMAND} -E copy_directory translations/ ${WODOTEXTEDITORCODE_BUILDDIR}/translations/ - COMMAND ${CMAKE_COMMAND} -E copy_directory widgets/ ${WODOTEXTEDITORCODE_BUILDDIR}/widgets/ + COMMAND ${CMAKE_COMMAND} -E copy_directory resources/ ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/resources/ + COMMAND ${CMAKE_COMMAND} -E copy_directory translations/ ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/translations/ + COMMAND ${CMAKE_COMMAND} -E copy_directory widgets/ ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/widgets/ # dojo compiled - COMMAND ${CMAKE_COMMAND} -E copy dojo-amalgamation.js ${WODOTEXTEDITORCODE_BUILDDIR} + COMMAND ${CMAKE_COMMAND} -E copy dojo-amalgamation.js ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR} # more dojo (data) files - COMMAND ${CMAKE_COMMAND} -E make_directory ${WODOTEXTEDITORCODE_BUILDDIR}/dojo - COMMAND ${CMAKE_COMMAND} -E copy_directory dojo/resources ${WODOTEXTEDITORCODE_BUILDDIR}/dojo/resources - COMMAND ${CMAKE_COMMAND} -E copy_directory app/ ${WODOTEXTEDITORCODE_BUILDDIR}/app/ - COMMAND ${CMAKE_COMMAND} -E copy_directory dijit/ ${WODOTEXTEDITORCODE_BUILDDIR}/dijit/ - COMMAND ${CMAKE_COMMAND} -E copy_directory dojox/ ${WODOTEXTEDITORCODE_BUILDDIR}/dojox/ + COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/dojo + COMMAND ${CMAKE_COMMAND} -E copy_directory dojo/resources ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/dojo/resources + COMMAND ${CMAKE_COMMAND} -E copy_directory app/ ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/app/ + COMMAND ${CMAKE_COMMAND} -E copy_directory dijit/ ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/dijit/ + COMMAND ${CMAKE_COMMAND} -E copy_directory dojox/ ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/dojox/ - COMMAND ${CMAKE_COMMAND} -E copy ${LIBJSLICENSEFILE} ${WODOTEXTEDITORBUILDDIR} - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/HOWTO-wodotexteditor.md ${WODOTEXTEDITORBUILDDIR}/HOWTO.md + COMMAND ${CMAKE_COMMAND} -E copy ${LIBJSLICENSEFILE} ${OPENDOCUMENTTEXTEDITORBUILDDIR} + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/HOWTO-wodotexteditor.md ${OPENDOCUMENTTEXTEDITORBUILDDIR}/HOWTO.md DEPENDS dojo-amalgamation.js editor-webodf.js-target more-common-editorfiles-target ) foreach(AE_FILE ${ALONE_EDITOR_FILES}) - set(AE_BUILDFILE ${WODOTEXTEDITORCODE_BUILDDIR}/${AE_FILE}) + set(AE_BUILDFILE ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/${AE_FILE}) set(AE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${AE_FILE}) add_custom_command( OUTPUT ${AE_BUILDFILE} @@ -169,13 +169,13 @@ foreach(AE_FILE ${ALONE_EDITOR_FILES}) ${AE_FILE} ${AE_BUILDFILE} DEPENDS - ${AE_FILE} ${WODOTEXTEDITORBUILDDIR} + ${AE_FILE} ${OPENDOCUMENTTEXTEDITORBUILDDIR} ) - list(APPEND WODOTEXTEDITOR_BUILDFILES ${AE_BUILDFILE}) + list(APPEND OPENDOCUMENTTEXTEDITOR_BUILDFILES ${AE_BUILDFILE}) endforeach(AE_FILE) foreach(AE_FILE ${ALONE_EDITOR_EXAMPLE_FILES}) - set(AE_BUILDFILE ${WODOTEXTEDITORBUILDDIR}/${AE_FILE}) + set(AE_BUILDFILE ${OPENDOCUMENTTEXTEDITORBUILDDIR}/${AE_FILE}) set(AE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${AE_FILE}) add_custom_command( OUTPUT ${AE_BUILDFILE} @@ -183,44 +183,44 @@ foreach(AE_FILE ${ALONE_EDITOR_EXAMPLE_FILES}) ${AE_FILE} ${AE_BUILDFILE} DEPENDS - ${AE_FILE} ${WODOTEXTEDITORBUILDDIR} + ${AE_FILE} ${OPENDOCUMENTTEXTEDITORBUILDDIR} ) - list(APPEND WODOTEXTEDITOR_BUILDFILES ${AE_BUILDFILE}) + list(APPEND OPENDOCUMENTTEXTEDITOR_BUILDFILES ${AE_BUILDFILE}) endforeach(AE_FILE) -add_custom_target(wodotexteditorbuilddir-target DEPENDS ${WODOTEXTEDITORBUILDDIR} ${WODOTEXTEDITOR_BUILDFILES}) +add_custom_target(opendocumenttexteditorbuilddir-target DEPENDS ${OPENDOCUMENTTEXTEDITORBUILDDIR} ${OPENDOCUMENTTEXTEDITOR_BUILDFILES}) add_custom_command( - OUTPUT ${WODOTEXTEDITORDOC_BUILDDIR}/index.html + OUTPUT ${OPENDOCUMENTTEXTEDITORDOC_BUILDDIR}/index.html COMMAND ${NODE} ARGS ${CMAKE_SOURCE_DIR}/scripts/doc.js - --output ${WODOTEXTEDITORDOC_BUILDDIR} + --output ${OPENDOCUMENTTEXTEDITORDOC_BUILDDIR} --source ${CMAKE_CURRENT_SOURCE_DIR}/wodotexteditor.js WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - DEPENDS ${NODE} wodotexteditorbuilddir-target + DEPENDS ${NODE} opendocumenttexteditorbuilddir-target ${CMAKE_SOURCE_DIR}/scripts/doc.js ) -add_custom_target(wodotexteditor-doc DEPENDS ${WODOTEXTEDITORDOC_BUILDDIR}/index.html) +add_custom_target(opendocumenttexteditor-doc DEPENDS ${OPENDOCUMENTTEXTEDITORDOC_BUILDDIR}/index.html) -# package wodotexteditor -set(WODOTEXTEDITOR_ZIP wodotexteditor-${WEBODF_VERSION}.zip) +# package opendocumenttexteditor +set(OPENDOCUMENTTEXTEDITOR_ZIP opendocumenttexteditor-${WEBODF_VERSION}.zip) add_custom_command( - OUTPUT ${WODOTEXTEDITOR_ZIP} + OUTPUT ${OPENDOCUMENTTEXTEDITOR_ZIP} # zip using javascript code running in node.js COMMAND ${NODE} ARGS ${RUNTIMEJS} ${TOOLS_DIR}/zipdir.js - ${WODOTEXTEDITORBUILDDIR} - ${CMAKE_BINARY_DIR}/${WODOTEXTEDITOR_ZIP} + ${OPENDOCUMENTTEXTEDITORBUILDDIR} + ${CMAKE_BINARY_DIR}/${OPENDOCUMENTTEXTEDITOR_ZIP} notopdir - wodotexteditor-${WEBODF_VERSION} + opendocumenttexteditor-${WEBODF_VERSION} DEPENDS - wodotexteditorbuilddir-target - wodotexteditor-doc + opendocumenttexteditorbuilddir-target + opendocumenttexteditor-doc WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) -add_custom_target(build-wodotexteditor DEPENDS ${WODOTEXTEDITOR_ZIP}) +add_custom_target(build-opendocumenttexteditor DEPENDS ${OPENDOCUMENTTEXTEDITOR_ZIP}) -add_custom_target(test-wodotexteditor DEPENDS webodf.js-tests) +add_custom_target(test-opendocumenttexteditor DEPENDS webodf.js-tests) -add_custom_target(product-wodotexteditor DEPENDS build-wodotexteditor test-wodotexteditor) +add_custom_target(product-opendocumenttexteditor DEPENDS build-opendocumenttexteditor test-opendocumenttexteditor) ########################### @@ -228,38 +228,38 @@ add_custom_target(product-wodotexteditor DEPENDS build-wodotexteditor test-wodot ########################### # Needs more thinking still, interface not yet done -set(WODOCOLLABTEXTEDITORCODE_BUILDDIR ${WODOCOLLABTEXTEDITORBUILDDIR}/wodo) +set(OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR ${OPENDOCUMENTTEXTCOLLABBUILDDIR}/wodo) add_custom_command( - OUTPUT ${WODOCOLLABTEXTEDITORBUILDDIR} + OUTPUT ${OPENDOCUMENTTEXTCOLLABBUILDDIR} # clean up output dir - COMMAND ${CMAKE_COMMAND} -E remove_directory ${WODOCOLLABTEXTEDITORBUILDDIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${WODOCOLLABTEXTEDITORBUILDDIR} - COMMAND ${CMAKE_COMMAND} -E make_directory ${WODOCOLLABTEXTEDITORCODE_BUILDDIR} + COMMAND ${CMAKE_COMMAND} -E remove_directory ${OPENDOCUMENTTEXTCOLLABBUILDDIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENDOCUMENTTEXTCOLLABBUILDDIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR} - COMMAND ${CMAKE_COMMAND} -E copy webodf.js ${WODOCOLLABTEXTEDITORCODE_BUILDDIR} + COMMAND ${CMAKE_COMMAND} -E copy webodf.js ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR} - COMMAND ${CMAKE_COMMAND} -E copy_directory resources/ ${WODOCOLLABTEXTEDITORCODE_BUILDDIR}/resources/ - COMMAND ${CMAKE_COMMAND} -E copy_directory translations/ ${WODOCOLLABTEXTEDITORCODE_BUILDDIR}/translations/ - COMMAND ${CMAKE_COMMAND} -E copy_directory widgets/ ${WODOCOLLABTEXTEDITORCODE_BUILDDIR}/widgets/ + COMMAND ${CMAKE_COMMAND} -E copy_directory resources/ ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/resources/ + COMMAND ${CMAKE_COMMAND} -E copy_directory translations/ ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/translations/ + COMMAND ${CMAKE_COMMAND} -E copy_directory widgets/ ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/widgets/ # dojo compiled - COMMAND ${CMAKE_COMMAND} -E copy dojo-amalgamation.js ${WODOCOLLABTEXTEDITORCODE_BUILDDIR} + COMMAND ${CMAKE_COMMAND} -E copy dojo-amalgamation.js ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR} # more dojo (data) files - COMMAND ${CMAKE_COMMAND} -E make_directory ${WODOCOLLABTEXTEDITORCODE_BUILDDIR}/dojo - COMMAND ${CMAKE_COMMAND} -E copy_directory dojo/resources ${WODOCOLLABTEXTEDITORCODE_BUILDDIR}/dojo/resources - COMMAND ${CMAKE_COMMAND} -E copy_directory app/ ${WODOCOLLABTEXTEDITORCODE_BUILDDIR}/app/ - COMMAND ${CMAKE_COMMAND} -E copy_directory dijit/ ${WODOCOLLABTEXTEDITORCODE_BUILDDIR}/dijit/ - COMMAND ${CMAKE_COMMAND} -E copy_directory dojox/ ${WODOCOLLABTEXTEDITORCODE_BUILDDIR}/dojox/ + COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/dojo + COMMAND ${CMAKE_COMMAND} -E copy_directory dojo/resources ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/dojo/resources + COMMAND ${CMAKE_COMMAND} -E copy_directory app/ ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/app/ + COMMAND ${CMAKE_COMMAND} -E copy_directory dijit/ ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/dijit/ + COMMAND ${CMAKE_COMMAND} -E copy_directory dojox/ ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/dojox/ - COMMAND ${CMAKE_COMMAND} -E copy ${LIBJSLICENSEFILE} ${WODOCOLLABTEXTEDITORBUILDDIR} + COMMAND ${CMAKE_COMMAND} -E copy ${LIBJSLICENSEFILE} ${OPENDOCUMENTTEXTCOLLABBUILDDIR} DEPENDS dojo-amalgamation.js editor-webodf.js-target more-common-editorfiles-target ) foreach(CE_FILE ${COMMON_COLLAB_FILES} ${COMMON_EDITOR_FILES}) - set(CE_BUILDFILE ${WODOCOLLABTEXTEDITORCODE_BUILDDIR}/${CE_FILE}) + set(CE_BUILDFILE ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/${CE_FILE}) set(CE_FILE ${CMAKE_CURRENT_SOURCE_DIR}/${CE_FILE}) add_custom_command( OUTPUT ${CE_BUILDFILE} @@ -267,31 +267,31 @@ foreach(CE_FILE ${COMMON_COLLAB_FILES} ${COMMON_EDITOR_FILES}) ${CE_FILE} ${CE_BUILDFILE} DEPENDS - ${CE_FILE} ${WODOCOLLABTEXTEDITORBUILDDIR} + ${CE_FILE} ${OPENDOCUMENTTEXTCOLLABBUILDDIR} ) - list(APPEND WODOCOLLABTEXTEDITOR_BUILDFILES ${CE_BUILDFILE}) + list(APPEND OPENDOCUMENTTEXTCOLLAB_BUILDFILES ${CE_BUILDFILE}) endforeach(CE_FILE) -add_custom_target(wodocollabtexteditorbuilddir-target DEPENDS ${WODOCOLLABTEXTEDITORBUILDDIR} ${WODOCOLLABTEXTEDITOR_BUILDFILES}) +add_custom_target(opendocumenttextcollabbuilddir-target DEPENDS ${OPENDOCUMENTTEXTCOLLABBUILDDIR} ${OPENDOCUMENTTEXTCOLLAB_BUILDFILES}) -# package wodotexteditor +# package opendocumenttexteditor add_custom_command( - OUTPUT ${WODOCOLLABTEXTEDITOR_ZIP} + OUTPUT ${OPENDOCUMENTTEXTCOLLAB_ZIP} # zip using javascript code running in node.js COMMAND ${NODE} ARGS ${RUNTIMEJS} ${TOOLS_DIR}/zipdir.js - ${WODOCOLLABTEXTEDITORBUILDDIR} - ${WODOCOLLABTEXTEDITOR_ZIP} + ${OPENDOCUMENTTEXTCOLLABBUILDDIR} + ${OPENDOCUMENTTEXTCOLLAB_ZIP} notopdir - wodocollabtexteditor-${WEBODF_VERSION} + opendocumenttextcollab-${WEBODF_VERSION} DEPENDS - wodocollabtexteditorbuilddir-target + opendocumenttextcollabbuilddir-target WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} ) -add_custom_target(build-wodocollabtexteditor DEPENDS ${WODOCOLLABTEXTEDITOR_ZIP}) +add_custom_target(build-opendocumenttextcollab DEPENDS ${OPENDOCUMENTTEXTCOLLAB_ZIP}) -add_custom_target(test-wodocollabtexteditor DEPENDS webodf.js-tests) +add_custom_target(test-opendocumenttextcollab DEPENDS webodf.js-tests) -add_custom_target(product-wodocollabtexteditor DEPENDS build-wodocollabtexteditor test-wodocollabtexteditor) +add_custom_target(product-opendocumenttextcollab DEPENDS build-opendocumenttextcollab test-opendocumenttextcollab) ################ diff --git a/programs/odfviewer-android/CMakeLists.txt b/programs/opendocumentviewer-android/CMakeLists.txt similarity index 80% rename from programs/odfviewer-android/CMakeLists.txt rename to programs/opendocumentviewer-android/CMakeLists.txt index 07266d9f9..ee04f9de8 100644 --- a/programs/odfviewer-android/CMakeLists.txt +++ b/programs/opendocumentviewer-android/CMakeLists.txt @@ -40,7 +40,7 @@ if (WEBODF_ANDROID) ) set(GRADLE ${CMAKE_CURRENT_BINARY_DIR}/Gradle-prefix/src/Gradle/bin/gradle) - set(ODFVIEWER_ANDROID_SOURCES + set(OPENDOCUMENTVIEWER_ANDROID_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/build.gradle ${CMAKE_CURRENT_SOURCE_DIR}/src/main/AndroidManifest.xml ${CMAKE_CURRENT_SOURCE_DIR}/src/main/java/org/webodf/viewer/ViewerActivity.java @@ -52,7 +52,7 @@ if (WEBODF_ANDROID) # signed, as only its author may sign it; the one of the debug is, with # the key gradle writes for that, so that it installs on a device or in an # emulator without anything else, see "README-Products.md". - macro(BUILD_ODFVIEWER_ANDROID apk task) + macro(BUILD_OPENDOCUMENTVIEWER_ANDROID apk task) add_custom_command( OUTPUT ${apk} # The library is read from the assets, as the page is. @@ -64,19 +64,19 @@ if (WEBODF_ANDROID) -PwebodfVersion=${WEBODF_MANIFEST_VERSION} -PbuildDir=${CMAKE_CURRENT_BINARY_DIR}/build ${task} - DEPENDS webodf.js-target Gradle ${ODFVIEWER_ANDROID_SOURCES} + DEPENDS webodf.js-target Gradle ${OPENDOCUMENTVIEWER_ANDROID_SOURCES} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) endmacro() - set(ODFVIEWER_ANDROID_APK - ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/odfviewer-android-release-unsigned.apk) - set(ODFVIEWER_ANDROID_APK_DEBUG - ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/debug/odfviewer-android-debug.apk) + set(OPENDOCUMENTVIEWER_ANDROID_APK + ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/opendocumentviewer-android-release-unsigned.apk) + set(OPENDOCUMENTVIEWER_ANDROID_APK_DEBUG + ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/debug/opendocumentviewer-android-debug.apk) - BUILD_ODFVIEWER_ANDROID(${ODFVIEWER_ANDROID_APK} assembleRelease) - BUILD_ODFVIEWER_ANDROID(${ODFVIEWER_ANDROID_APK_DEBUG} assembleDebug) + BUILD_OPENDOCUMENTVIEWER_ANDROID(${OPENDOCUMENTVIEWER_ANDROID_APK} assembleRelease) + BUILD_OPENDOCUMENTVIEWER_ANDROID(${OPENDOCUMENTVIEWER_ANDROID_APK_DEBUG} assembleDebug) - add_custom_target(product-odfviewer-android DEPENDS ${ODFVIEWER_ANDROID_APK}) - add_custom_target(odfviewer-android-debug DEPENDS ${ODFVIEWER_ANDROID_APK_DEBUG}) + add_custom_target(product-opendocumentviewer-android DEPENDS ${OPENDOCUMENTVIEWER_ANDROID_APK}) + add_custom_target(opendocumentviewer-android-debug DEPENDS ${OPENDOCUMENTVIEWER_ANDROID_APK_DEBUG}) endif () diff --git a/programs/odfviewer-android/build.gradle b/programs/opendocumentviewer-android/build.gradle similarity index 100% rename from programs/odfviewer-android/build.gradle rename to programs/opendocumentviewer-android/build.gradle diff --git a/programs/odfviewer-android/gradle.properties b/programs/opendocumentviewer-android/gradle.properties similarity index 100% rename from programs/odfviewer-android/gradle.properties rename to programs/opendocumentviewer-android/gradle.properties diff --git a/programs/odfviewer-android/settings.gradle b/programs/opendocumentviewer-android/settings.gradle similarity index 81% rename from programs/odfviewer-android/settings.gradle rename to programs/opendocumentviewer-android/settings.gradle index b2836ae65..d7d1496cf 100644 --- a/programs/odfviewer-android/settings.gradle +++ b/programs/opendocumentviewer-android/settings.gradle @@ -11,4 +11,4 @@ dependencyResolutionManagement { mavenCentral() } } -rootProject.name = 'odfviewer-android' +rootProject.name = 'opendocumentviewer-android' diff --git a/programs/odfviewer-android/src/main/AndroidManifest.xml b/programs/opendocumentviewer-android/src/main/AndroidManifest.xml similarity index 100% rename from programs/odfviewer-android/src/main/AndroidManifest.xml rename to programs/opendocumentviewer-android/src/main/AndroidManifest.xml diff --git a/programs/odfviewer-android/src/main/assets/index.css b/programs/opendocumentviewer-android/src/main/assets/index.css similarity index 100% rename from programs/odfviewer-android/src/main/assets/index.css rename to programs/opendocumentviewer-android/src/main/assets/index.css diff --git a/programs/odfviewer-android/src/main/assets/index.html b/programs/opendocumentviewer-android/src/main/assets/index.html similarity index 100% rename from programs/odfviewer-android/src/main/assets/index.html rename to programs/opendocumentviewer-android/src/main/assets/index.html diff --git a/programs/odfviewer-android/src/main/assets/index.js b/programs/opendocumentviewer-android/src/main/assets/index.js similarity index 100% rename from programs/odfviewer-android/src/main/assets/index.js rename to programs/opendocumentviewer-android/src/main/assets/index.js diff --git a/programs/odfviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java b/programs/opendocumentviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java similarity index 100% rename from programs/odfviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java rename to programs/opendocumentviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java diff --git a/programs/odfviewer-android/src/main/res/mipmap/icon.png b/programs/opendocumentviewer-android/src/main/res/mipmap/icon.png similarity index 100% rename from programs/odfviewer-android/src/main/res/mipmap/icon.png rename to programs/opendocumentviewer-android/src/main/res/mipmap/icon.png diff --git a/programs/odfviewer-android/src/main/res/values/strings.xml b/programs/opendocumentviewer-android/src/main/res/values/strings.xml similarity index 100% rename from programs/odfviewer-android/src/main/res/values/strings.xml rename to programs/opendocumentviewer-android/src/main/res/values/strings.xml diff --git a/programs/odfviewer-webext/CMakeLists.txt b/programs/opendocumentviewer-webext/CMakeLists.txt similarity index 67% rename from programs/odfviewer-webext/CMakeLists.txt rename to programs/opendocumentviewer-webext/CMakeLists.txt index ab7138512..f899bc523 100644 --- a/programs/odfviewer-webext/CMakeLists.txt +++ b/programs/opendocumentviewer-webext/CMakeLists.txt @@ -1,6 +1,6 @@ # The files that go into the extension, copied as they are. "webodf.js" comes # from the build and the manifest carries the version, see below. -set(ODFVIEWER_WEBEXT_FILES +set(OPENDOCUMENTVIEWER_WEBEXT_FILES background.js background-chrome.js viewer.html @@ -16,7 +16,7 @@ configure_file(manifest-chrome.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest-chro # Pack the add-on from one of the three manifests. The viewer is the same in # all of them: only the way the documents reach it differs, and Chrome takes # a file of rules rather than a script, see "README-Products.md". -macro(PACK_ODFVIEWER_WEBEXT xpi dir manifest extra) +macro(PACK_OPENDOCUMENTVIEWER_WEBEXT xpi dir manifest extra) add_custom_command( OUTPUT ${xpi} COMMAND ${CMAKE_COMMAND} -E remove_directory ${dir} @@ -40,24 +40,24 @@ macro(PACK_ODFVIEWER_WEBEXT xpi dir manifest extra) notopdir DEPENDS ${NODE} ${TOOLS_DIR}/zipdir.js - ${ODFVIEWER_WEBEXT_FILES} + ${OPENDOCUMENTVIEWER_WEBEXT_FILES} webodf.js-target ${CMAKE_CURRENT_BINARY_DIR}/${manifest} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) endmacro() -PACK_ODFVIEWER_WEBEXT(${FIREFOX_EXTENSION_ODFVIEWER} - ${FIREFOX_EXTENSION_ODFVIEWER_DIR} manifest-v3.json background.js) -PACK_ODFVIEWER_WEBEXT(${FIREFOX_EXTENSION_ODFVIEWER_MV2} - ${FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR} manifest-v2.json background.js) -PACK_ODFVIEWER_WEBEXT(${CHROME_EXTENSION_ODFVIEWER} - ${CHROME_EXTENSION_ODFVIEWER_DIR} manifest-chrome.json background-chrome.js) +PACK_OPENDOCUMENTVIEWER_WEBEXT(${OPENDOCUMENTVIEWER_FIREFOX} + ${OPENDOCUMENTVIEWER_FIREFOX_DIR} manifest-v3.json background.js) +PACK_OPENDOCUMENTVIEWER_WEBEXT(${OPENDOCUMENTVIEWER_FIREFOX_MV2} + ${OPENDOCUMENTVIEWER_FIREFOX_MV2_DIR} manifest-v2.json background.js) +PACK_OPENDOCUMENTVIEWER_WEBEXT(${OPENDOCUMENTVIEWER_CHROME} + ${OPENDOCUMENTVIEWER_CHROME_DIR} manifest-chrome.json background-chrome.js) -add_custom_target(build-odfviewer-webext - DEPENDS ${FIREFOX_EXTENSION_ODFVIEWER} ${FIREFOX_EXTENSION_ODFVIEWER_MV2} - ${CHROME_EXTENSION_ODFVIEWER}) +add_custom_target(build-opendocumentviewer-webext + DEPENDS ${OPENDOCUMENTVIEWER_FIREFOX} ${OPENDOCUMENTVIEWER_FIREFOX_MV2} + ${OPENDOCUMENTVIEWER_CHROME}) -add_custom_target(test-odfviewer-webext DEPENDS webodf.js-tests) +add_custom_target(test-opendocumentviewer-webext DEPENDS webodf.js-tests) -add_custom_target(product-odfviewer-webext DEPENDS build-odfviewer-webext test-odfviewer-webext) +add_custom_target(product-opendocumentviewer-webext DEPENDS build-opendocumentviewer-webext test-opendocumentviewer-webext) diff --git a/programs/odfviewer-webext/background-chrome.js b/programs/opendocumentviewer-webext/background-chrome.js similarity index 100% rename from programs/odfviewer-webext/background-chrome.js rename to programs/opendocumentviewer-webext/background-chrome.js diff --git a/programs/odfviewer-webext/background.js b/programs/opendocumentviewer-webext/background.js similarity index 100% rename from programs/odfviewer-webext/background.js rename to programs/opendocumentviewer-webext/background.js diff --git a/programs/odfviewer-webext/manifest-chrome.json.in b/programs/opendocumentviewer-webext/manifest-chrome.json.in similarity index 100% rename from programs/odfviewer-webext/manifest-chrome.json.in rename to programs/opendocumentviewer-webext/manifest-chrome.json.in diff --git a/programs/odfviewer-webext/manifest-v2.json.in b/programs/opendocumentviewer-webext/manifest-v2.json.in similarity index 100% rename from programs/odfviewer-webext/manifest-v2.json.in rename to programs/opendocumentviewer-webext/manifest-v2.json.in diff --git a/programs/odfviewer-webext/manifest-v3.json.in b/programs/opendocumentviewer-webext/manifest-v3.json.in similarity index 100% rename from programs/odfviewer-webext/manifest-v3.json.in rename to programs/opendocumentviewer-webext/manifest-v3.json.in diff --git a/programs/odfviewer-webext/skin/default/icon.png b/programs/opendocumentviewer-webext/skin/default/icon.png similarity index 100% rename from programs/odfviewer-webext/skin/default/icon.png rename to programs/opendocumentviewer-webext/skin/default/icon.png diff --git a/programs/odfviewer-webext/viewer.css b/programs/opendocumentviewer-webext/viewer.css similarity index 100% rename from programs/odfviewer-webext/viewer.css rename to programs/opendocumentviewer-webext/viewer.css diff --git a/programs/odfviewer-webext/viewer.html b/programs/opendocumentviewer-webext/viewer.html similarity index 100% rename from programs/odfviewer-webext/viewer.html rename to programs/opendocumentviewer-webext/viewer.html diff --git a/programs/odfviewer-webext/viewer.js b/programs/opendocumentviewer-webext/viewer.js similarity index 100% rename from programs/odfviewer-webext/viewer.js rename to programs/opendocumentviewer-webext/viewer.js diff --git a/scripts/test-extension.js b/scripts/test-extension.js index 32b5ba318..d571e3f38 100644 --- a/scripts/test-extension.js +++ b/scripts/test-extension.js @@ -3,7 +3,7 @@ /** * Run the add-on of Chrome and check that it shows a document. * - * The package is built here, from "programs/odfviewer-webext" and the library + * The package is built here, from "programs/opendocumentviewer-webext" and the library * of "dist", then a document is served over http and the browser is asked for * it. The add-on has to send it to its viewer, that has to draw it. * @@ -22,7 +22,7 @@ var fs = require("fs"), http = require("http"), path = require("path"), rootDir = path.resolve(__dirname, ".."), - extensionDir = path.join(rootDir, "programs/odfviewer-webext"), + extensionDir = path.join(rootDir, "programs/opendocumentviewer-webext"), libraryPath = path.join(rootDir, "dist/webodf.js"), // A document that is versioned, so that the test needs no other build. documentPath = path.join(rootDir, "programs/benchmark/1page.odt"), From dbdf03af3ee77ac4f06090dfe5ea0450fb682014 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 167/385] Kept every request of the viewer of android on the device. --- .../src/main/AndroidManifest.xml | 15 ++++++ .../org/webodf/viewer/ViewerActivity.java | 50 ++++++++++++++----- 2 files changed, 53 insertions(+), 12 deletions(-) diff --git a/programs/androidviewer/src/main/AndroidManifest.xml b/programs/androidviewer/src/main/AndroidManifest.xml index 6589e6586..f28505d79 100644 --- a/programs/androidviewer/src/main/AndroidManifest.xml +++ b/programs/androidviewer/src/main/AndroidManifest.xml @@ -8,6 +8,21 @@ android:label="@string/app_name" android:theme="@android:style/Theme.Material.Light.NoActionBar"> + + + + Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 168/385] Told how to run the add-ons from their directory. --- README-Building.md | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/README-Building.md b/README-Building.md index b90484123..685b13d3a 100644 --- a/README-Building.md +++ b/README-Building.md @@ -380,11 +380,30 @@ and the css are generated in memory, not in files. The build with cmake writes in the directory given to cmake, usually "build", next to the sources, and keeps its downloads there. -Both libraries hold the same code: the sources concatenated in the order of -their dependencies, with IS_COMPILED_CODE set to true so that the runtime does -not load the classes one by one. The one built with node is about eight percent -smaller, since terser compresses more than the closure compiler used with -SIMPLE_OPTIMIZATIONS. +Both libraries are the same file, byte for byte: the sources concatenated in +the order of their dependencies, with IS_COMPILED_CODE set to true so that the +runtime does not load the classes one by one, minified by terser. The build +with cmake runs "scripts/build.js" as well, see "Two ways to build" above. + +### Running the add-ons without installing them + +The three packages of "programs/firefoxextension", see "README-Products.md", +are loaded from their directory, with a profile of their own, so that nothing +has to be clicked and nothing is kept: + +```sh +npx web-ext run --source-dir build/firefox-extension-odfviewer-mv2-x.y.z/ +chromium --user-data-dir=$(mktemp -d) --no-first-run \ + --load-extension=build/chrome-extension-odfviewer-x.y.z/ +``` + +web-ext writes a temporary profile, installs the add-on in it and follows the +changes of the files; "--firefox" chooses the binary and "--url" opens a page +at once. Firefox refuses an unsigned xpi, but not a directory loaded this way, +which is what "about:debugging" does by hand. + +Chrome keeps the profile of "--user-data-dir", hence the temporary directory, +and "--load-extension" only takes a directory, never a zip. ### What the closure compiler is used for From e6479fd7a12268c3cbdeea796ef57a1b6571eba1 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 169/385] Looked for android along with the programs only. --- CMakeLists.txt | 54 +++++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index cfc7e4fa8..91c5b43c5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -205,26 +205,6 @@ add_custom_target(copy_node_modules ALL COMMENT copying node_modules from source to build ) -# Android -# If android sdk is properly installed, cmake only needs to know where to find -# the executable 'android'. -# The variable ANDROID_SDK_DIR can be provided if a specific android sdk version -# is desired or if the android executable is not in the path. -if (ANDROID_SDK_DIR) - set(ANDROID ${ANDROID_SDK_DIR}/tools/android) -else (ANDROID_SDK_DIR) - find_program(ANDROID NAMES android DOC "Path to the Android executable.") -endif(ANDROID_SDK_DIR) -FIND_PROGRAM(ANT NAMES ant DOC "Path to the Ant executable.") -if(ANDROID AND ANT) - set(BUILD_APK TRUE) - message(STATUS "Found Android and Ant: building an APK for Android.") - message(STATUS "android: ${ANDROID}") - message(STATUS "ant: ${ANT}") -else() - message(STATUS "Android was not found: APK will not be built.") -endif() - # The coverage is measured by c8, that reads the one V8 records while it runs # the tests: it neither parses nor rewrites the sources, so it does not # constrain the version of ECMAScript the library is written in. It replaces @@ -240,11 +220,39 @@ add_custom_target(coverage USES_TERMINAL ) -# The programs, the editors and the extensions, need Dojo 1.8.1, that is not -# published any more: neither dojotoolkit.org nor npm has it. They are built -# only when they are asked for, so that the library builds without them. +# The programs, the editors and the extensions, need Dojo, that is downloaded +# from the registry of npm, see below. They are built only when they are asked +# for, so that the library builds without them. option(WEBODF_PROGRAMS "Build the editors and the extensions of programs/" OFF) +# The apk of android is one more output of programs/cordova, so it is only +# looked for along with the programs. Nothing of that toolchain is available +# any more: it drives cordova 3.5, of 2014, that builds android with ant, +# which google dropped in 2015 for gradle, through the executable "android", +# that the sdk replaced by "sdkmanager" in 2018. It is kept as it is until +# programs/ is either brought up to date or dropped. +if (WEBODF_PROGRAMS) + # If android sdk is properly installed, cmake only needs to know where to find + # the executable 'android'. + # The variable ANDROID_SDK_DIR can be provided if a specific android sdk version + # is desired or if the android executable is not in the path. + if (ANDROID_SDK_DIR) + set(ANDROID ${ANDROID_SDK_DIR}/tools/android) + else (ANDROID_SDK_DIR) + find_program(ANDROID NAMES android DOC "Path to the Android executable.") + endif(ANDROID_SDK_DIR) + FIND_PROGRAM(ANT NAMES ant DOC "Path to the Ant executable.") + if(ANDROID AND ANT) + set(BUILD_APK TRUE) + message(STATUS "Found Android and Ant: building an APK for Android.") + message(STATUS "android: ${ANDROID}") + message(STATUS "ant: ${ANT}") + else() + message(STATUS "Android was not found: APK will not be built.") + endif() +endif () + + # Dojo # The source release of dojotoolkit.org is not published any more, so the four # packages are taken from the registry of npm, where they are still released. From be8ec6c5d20003f2467a92397acec82aa2eb8425 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 170/385] Clarified description of webext. --- programs/opendocumentviewer-webext/manifest-chrome.json.in | 2 +- programs/opendocumentviewer-webext/manifest-v2.json.in | 2 +- programs/opendocumentviewer-webext/manifest-v3.json.in | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/programs/opendocumentviewer-webext/manifest-chrome.json.in b/programs/opendocumentviewer-webext/manifest-chrome.json.in index c2a22acd5..7954cf14f 100644 --- a/programs/opendocumentviewer-webext/manifest-chrome.json.in +++ b/programs/opendocumentviewer-webext/manifest-chrome.json.in @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", + "description": "Light reader for .odt, .ods and .odp documents of LibreOffice, OpenOffice and Office 365, without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "minimum_chrome_version": "88", diff --git a/programs/opendocumentviewer-webext/manifest-v2.json.in b/programs/opendocumentviewer-webext/manifest-v2.json.in index 561183ca9..1eea13ba0 100644 --- a/programs/opendocumentviewer-webext/manifest-v2.json.in +++ b/programs/opendocumentviewer-webext/manifest-v2.json.in @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", + "description": "Light reader for .odt, .ods and .odp documents of LibreOffice, OpenOffice and Office 365, without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "browser_specific_settings": { diff --git a/programs/opendocumentviewer-webext/manifest-v3.json.in b/programs/opendocumentviewer-webext/manifest-v3.json.in index 83f95b336..b939eb2ea 100644 --- a/programs/opendocumentviewer-webext/manifest-v3.json.in +++ b/programs/opendocumentviewer-webext/manifest-v3.json.in @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Viewer for files in OpenDocument Format (ODF), powered by WebODF, using only web standard technologies.", + "description": "Light reader for .odt, .ods and .odp documents of LibreOffice, OpenOffice and Office 365, without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "browser_specific_settings": { From f8cb170361febdde9dc139ac22538845d614163d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 171/385] Built an apk that installs, to run the viewer of android. --- programs/androidviewer/CMakeLists.txt | 54 +++++++++++++++++---------- 1 file changed, 34 insertions(+), 20 deletions(-) diff --git a/programs/androidviewer/CMakeLists.txt b/programs/androidviewer/CMakeLists.txt index d1a72e435..1ddb5db96 100644 --- a/programs/androidviewer/CMakeLists.txt +++ b/programs/androidviewer/CMakeLists.txt @@ -40,29 +40,43 @@ if (WEBODF_ANDROID) ) set(GRADLE ${CMAKE_CURRENT_BINARY_DIR}/Gradle-prefix/src/Gradle/bin/gradle) + set(ANDROIDVIEWER_SOURCES + ${CMAKE_CURRENT_SOURCE_DIR}/build.gradle + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/AndroidManifest.xml + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/java/org/webodf/viewer/ViewerActivity.java + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/index.html + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/index.js + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/index.css) + + # Two apk are built from the same sources. The one of the release is not + # signed, as only its author may sign it; the one of the debug is, with + # the key gradle writes for that, so that it installs on a device or in an + # emulator without anything else, see "README-Products.md". + macro(BUILD_ANDROIDVIEWER apk task) + add_custom_command( + OUTPUT ${apk} + # The library is read from the assets, as the page is. + COMMAND ${CMAKE_COMMAND} -E copy + ${CMAKE_BINARY_DIR}/webodf/webodf.js + ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/webodf.js + COMMAND ${GRADLE} --project-dir ${CMAKE_CURRENT_SOURCE_DIR} + --project-cache-dir ${CMAKE_CURRENT_BINARY_DIR}/.gradle + -PwebodfVersion=${WEBODF_MANIFEST_VERSION} + -PbuildDir=${CMAKE_CURRENT_BINARY_DIR}/build + ${task} + DEPENDS webodf.js-target Gradle ${ANDROIDVIEWER_SOURCES} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + ) + endmacro() + set(ANDROIDVIEWER_APK ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/androidviewer-release-unsigned.apk) + set(ANDROIDVIEWER_APK_DEBUG + ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/debug/androidviewer-debug.apk) - add_custom_command( - OUTPUT ${ANDROIDVIEWER_APK} - # The library is read from the assets, as the page is. - COMMAND ${CMAKE_COMMAND} -E copy - ${CMAKE_BINARY_DIR}/webodf/webodf.js - ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/webodf.js - COMMAND ${GRADLE} --project-dir ${CMAKE_CURRENT_SOURCE_DIR} - --project-cache-dir ${CMAKE_CURRENT_BINARY_DIR}/.gradle - -PwebodfVersion=${WEBODF_MANIFEST_VERSION} - -PbuildDir=${CMAKE_CURRENT_BINARY_DIR}/build - assembleRelease - DEPENDS webodf.js-target Gradle - ${CMAKE_CURRENT_SOURCE_DIR}/build.gradle - ${CMAKE_CURRENT_SOURCE_DIR}/src/main/AndroidManifest.xml - ${CMAKE_CURRENT_SOURCE_DIR}/src/main/java/org/webodf/viewer/ViewerActivity.java - ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/index.html - ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/index.js - ${CMAKE_CURRENT_SOURCE_DIR}/src/main/assets/index.css - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} - ) + BUILD_ANDROIDVIEWER(${ANDROIDVIEWER_APK} assembleRelease) + BUILD_ANDROIDVIEWER(${ANDROIDVIEWER_APK_DEBUG} assembleDebug) add_custom_target(product-androidviewer DEPENDS ${ANDROIDVIEWER_APK}) + add_custom_target(androidviewer-debug DEPENDS ${ANDROIDVIEWER_APK_DEBUG}) endif () From a6cd3904033553a942d996546900032fc961029c Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 172/385] Ran the add-on of Chrome as a test. --- README-Building.md | 15 +++- package.json | 3 +- scripts/test-extension.js | 170 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 scripts/test-extension.js diff --git a/README-Building.md b/README-Building.md index 685b13d3a..3300763c9 100644 --- a/README-Building.md +++ b/README-Building.md @@ -288,6 +288,7 @@ npm run check:tests # check the types of the library and of the tests npm test # run the tests with node npm run test:rhino # run the tests with Rhino, on a java virtual machine npm run test:browser # run the tests in a browser, with all the suites +npm run test:extension # run the add-on of Chrome and check it shows a document npm run all # check, test, build and doc ``` @@ -399,12 +400,24 @@ chromium --user-data-dir=$(mktemp -d) --no-first-run \ web-ext writes a temporary profile, installs the add-on in it and follows the changes of the files; "--firefox" chooses the binary and "--url" opens a page -at once. Firefox refuses an unsigned xpi, but not a directory loaded this way, +at once. Open the page after the add-on is installed, not with it: +a page that is asked for while Firefox is still starting is not redirected, +and the add-on looks broken when it is not. Firefox refuses an unsigned xpi, but not a directory loaded this way, which is what "about:debugging" does by hand. Chrome keeps the profile of "--user-data-dir", hence the temporary directory, and "--load-extension" only takes a directory, never a zip. +"npm run test:extension" does all of it for Chrome: it builds the package, +serves a document under a type that says nothing, asks the browser for it and +checks that the viewer of the add-on drew it. It needs a chromium, like +"npm run test:browser", and the library of "dist". + +It is worth running: a rule Chrome refuses is dropped without a word, and the +documents are downloaded as if the add-on were not installed. Neither the +linter of addons.mozilla.org nor the closure compiler sees it. Firefox is not +driven, as web-ext is not a dependency of this project. + ### What the closure compiler is used for The library is not compiled with it any more, only checked. It is worth keeping, diff --git a/package.json b/package.json index 53c5b2d00..fc959961f 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,8 @@ "test:rhino": "node scripts/test-rhino.js", "coverage": "node scripts/coverage.js", "all": "npm run check && npm run check:tests && npm test && npm run build && npm run doc", - "test:browser": "node scripts/test-browser.js" + "test:browser": "node scripts/test-browser.js", + "test:extension": "node scripts/test-extension.js" }, "files": [ "dist", diff --git a/scripts/test-extension.js b/scripts/test-extension.js new file mode 100644 index 000000000..28c13def1 --- /dev/null +++ b/scripts/test-extension.js @@ -0,0 +1,170 @@ +"use strict"; + +/** + * Run the add-on of Chrome and check that it shows a document. + * + * The package is built here, from "programs/firefoxextension" and the library + * of "dist", then a document is served over http and the browser is asked for + * it. The add-on has to send it to its viewer, that has to draw it. + * + * This catches what neither the linter nor the compiler sees: a rule Chrome + * refuses is dropped without a word, and the document is downloaded as if the + * add-on were not installed. + * + * Firefox is not driven here: it takes web-ext, that is not a dependency of + * this project, see "README-Building.md". + * + * Usage: node scripts/test-extension.js + */ + +var fs = require("fs"), + os = require("os"), + http = require("http"), + path = require("path"), + rootDir = path.resolve(__dirname, ".."), + extensionDir = path.join(rootDir, "programs/firefoxextension"), + libraryPath = path.join(rootDir, "dist/webodf.js"), + // A document that is versioned, so that the test needs no other build. + documentPath = path.join(rootDir, "programs/benchmark/1page.odt"), + browserPaths = [ + process.env.WEBODF_BROWSER, + "/usr/bin/chromium", + "/usr/bin/chromium-browser", + "/usr/bin/google-chrome", + "/opt/google/chrome/chrome" + ], + port = 8734; + +/** + * The first browser found among the usual paths. + * @return {?string} + */ +function findBrowser() { + var found = null; + browserPaths.forEach(function (candidate) { + if (!found && candidate && fs.existsSync(candidate)) { + found = candidate; + } + }); + return found; +} + +/** + * Write the package of Chrome in a directory of its own. + * @return {string} + */ +function buildPackage() { + var dir = fs.mkdtempSync(path.join(os.tmpdir(), "webodf-extension-")), + manifest = fs.readFileSync( + path.join(extensionDir, "manifest-chrome.json.in"), + "utf8" + ); + fs.mkdirSync(path.join(dir, "skin/default"), {recursive: true}); + fs.writeFileSync(path.join(dir, "manifest.json"), + manifest.replace("@WEBODF_MANIFEST_VERSION@", "0.0.0")); + ["background-chrome.js", "viewer.html", "viewer.css", "viewer.js"].forEach( + function (name) { + fs.copyFileSync(path.join(extensionDir, name), path.join(dir, name)); + } + ); + fs.copyFileSync(path.join(extensionDir, "skin/default/icon.png"), + path.join(dir, "skin/default/icon.png")); + fs.copyFileSync(libraryPath, path.join(dir, "webodf.js")); + return dir; +} + +/** + * Serve the document under a type that says nothing, so that the add-on has to + * read the name of the file, as it does on a server that knows no ODF. + * @return {!http.Server} + */ +function serve() { + var body = fs.readFileSync(documentPath); + return http.createServer(function (request, response) { + response.writeHead(200, { + "Content-Type": "application/octet-stream", + "Content-Length": body.length + }); + response.end(body); + }).listen(port); +} + +function main() { + var browser = findBrowser(), + playwright, + server, + directory; + if (!browser) { + console.error("No browser found. Set WEBODF_BROWSER to the path of a" + + " chromium, or install one with: npx playwright install chromium"); + process.exit(1); + } + if (!fs.existsSync(libraryPath)) { + console.error("The library is missing: run \"npm run build\" first."); + process.exit(1); + } + playwright = require("playwright-core"); + directory = buildPackage(); + server = serve(); + return playwright.chromium.launchPersistentContext( + fs.mkdtempSync(path.join(os.tmpdir(), "webodf-profile-")), + { + executablePath: browser, + headless: true, + args: [ + "--no-sandbox", + "--disable-gpu", + "--disable-extensions-except=" + directory, + "--load-extension=" + directory + ] + } + ).then(function (context) { + // The rule is written by the service worker once it is installed, so + // the document is only asked for after it has run. The worker may + // already be there, and the event would then never come. + return (context.serviceWorkers().length > 0 + ? Promise.resolve() + : context.waitForEvent("serviceworker", {timeout: 30000})) + .then(function () { + return context.serviceWorkers()[0].evaluate(function () { + return chrome.declarativeNetRequest.getDynamicRules(); + }); + }) + .then(function (rules) { + if (!rules || rules.length === 0) { + throw new Error("the add-on wrote no rule to redirect with"); + } + return context.newPage(); + }) + .then(function (page) { + return page.goto("http://127.0.0.1:" + port + "/1page.odt", { + waitUntil: "load", + timeout: 30000 + }).then(function () { + return page.waitForSelector("#odf *", {timeout: 30000}); + }).then(function () { + return page.url(); + }); + }) + .then(function (url) { + return context.close().then(function () { + return url; + }); + }); + }).then(function (url) { + server.close(); + fs.rmSync(directory, {recursive: true, force: true}); + if (url.indexOf("viewer.html") === -1) { + console.error("The add-on did not send the document to its viewer," + + " the page is at " + url); + process.exit(1); + } + console.log("The add-on showed the document: " + url.slice(0, 80)); + }).catch(function (err) { + server.close(); + console.error("The add-on did not show the document: " + String(err)); + process.exit(1); + }); +} + +main(); From 4139aa367164f894611b813bc86a233714f65b36 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 173/385] Updated readme for building. --- README-Building.md | 149 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 137 insertions(+), 12 deletions(-) diff --git a/README-Building.md b/README-Building.md index 50d78f4bb..227b6e8f4 100644 --- a/README-Building.md +++ b/README-Building.md @@ -7,10 +7,68 @@ The library "webodf.js" is built in two ways. check of the types. - **With cmake**, described first, as it was done originally: it is still the only way to build the other products, the editors and the extensions, listed - in "README-Products.md", and to run the tests that need a browser. + in "README-Products.md". They are behind the option WEBODF_PROGRAMS, off by + default, since they are the longest to build and need Dojo. The closure + compiler, Rhino and Dojo are downloaded from maven central and from the + registry of npm, at the same versions as the build with node uses. Both produce the same library, from the same sources and in the same order. +Two parts of the build with cmake are opt-in, so that a plain build stays +short and needs nothing but node, java and cmake: + +| Option | What it adds | +|--------------------|-------------------------------------------------------| +| WEBODF_PROGRAMS | The editors and the extensions of "programs/" | +| WEBODF_QTJSRUNTIME | qtjsruntime, that runs the tests in the webkit of qt | + +The apk of android is one more output of "programs/cordova", so android and +ant are only looked for along with the programs. That toolchain is out of +reach as well: it drives cordova 3.5, of 2014, that builds android with ant, +which google dropped in 2015 for gradle, through the executable "android", +that the sdk replaced by "sdkmanager" in 2018. + +WEBODF_QTJSRUNTIME needs Qt5Network, Qt5Xml, Qt5PrintSupport and +Qt5WebKitWidgets, that Debian 12 and older install with: + +```sh +apt-get install qtbase5-dev libqt5webkit5-dev +``` + +Qt WebKit was dropped from Qt in 5.6, kept alive as a separate project, and is +not packaged any more by Debian since 13, so the modules are out of reach +there. The suite it runs is the same as the one "npm run test:browser" runs, +in a browser that is still maintained, which is the reason this option is off. + + +## Coverage + +The coverage of the tests is measured by [c8][], with node and with cmake: + +```sh +npm run coverage +make coverage +``` + +By default it writes a table on the terminal and a report to browse in +"coverage/index.html". Another reporter is chosen by passing it through: + +```sh +node scripts/coverage.js --reporter=lcov +``` + +c8 reads the coverage V8 records while it runs, so it neither parses nor +rewrites the sources: the version of ECMAScript the library is written in does +not matter to it. The tests run on the bundle, that is written with a source +map so that the coverage is reported on the files of "webodf/lib". + +It replaces JSCoverage, that instrumented the sources for the target +"instrumented" of the original build. Its last release, 0.5.1 of 2010, bundles +SpiderMonkey 1.7, whose autoconf 2.13 probe declares "main()" without a return +type: gcc 14 and clang 16 reject it, as -Wimplicit-int is an error in C23, so +it does not build any more on a recent distribution. +[c8]: https://github.com/bcoe/c8 + ## Building WebODF on Linux @@ -55,14 +113,27 @@ make webodf.js-target A successful run will yield the file "webodf.js" in the subfolder "build/webodf/", among other things, from where you can then copy it and use for your website. -### Dependencies on Ubuntu +CMake keeps the paths of the programs it finds in "build/CMakeCache.txt", so a +node that is installed afterwards, with nvm for instance, is not seen: it +keeps using the one it found the first time, and reports it as too old. The +entries are dropped with: + +```sh +cmake -S ../webodf -U NODEJS_EXECUTABLE -U NPM +``` -For a Ubuntu 18.04 distribution you can satisfy the build dependencies with: +### Dependencies on Debian and Ubuntu + +The build needs cmake, a java runtime and node, that is installed apart, see +"Building with node" below for the version: ```sh -apt-get install libqt5webkit5-dev default-jdk +apt-get install cmake default-jre ``` +The modules of Qt are only needed by the option WEBODF_QTJSRUNTIME, see "Two +ways to build" above. + ## Building WebODF on Windows The following steps have been tested with the Microsoft C\C++ compilers that are @@ -158,12 +229,36 @@ git add package.json package-lock.json node_modules Without it, a fresh checkout keeps running the previous version, whatever the file "package.json" says. +JSZip is versioned too, but differently: the file "webodf/lib/externs/JSZip.js" +holds its distribution, that is concatenated into "webodf.js", as a browser +needs it to read and write the zip an ODF document is. It is updated by hand, +from the file "dist/jszip.js" of the package, whose wrapper is replaced by the +one the previous copy carries: the class is attached to the shared object +"externs" rather than to the global scope, and the modules of its bundle are +hidden from the commonjs of node, that would otherwise capture the export. The +call to new Buffer() of its module "nodeBuffer" is patched as well, as node +deprecated it. + +The version in use is JSZip 2.6.1, the last of its line. JSZip 3 is not used +yet, for two reasons only: its api is asynchronous, so the three calls of +Zip.js would go through the promises it ships with, and it weighs 17 kB more +once minified, since it added a layer of streams. Both versions run on the +same browsers, IE 6 included. + ## Building with node The library is also built without cmake and without java, with node only. This is the simplest way to get "webodf.js", and it does not download anything but the packages of npm. +Node 22.22.2 or later is needed, both here and for the build with cmake: 22 is +the oldest release that is still maintained, and jsdom, that the tests use, +runs on none of its earlier ones. The exact range is in the field "engines" of +"package.json"; the tools are tested with node 24, the release under long term +support. Node is expected to be installed, on every platform, npm along with +it: it used to be downloaded on Windows, but only the binary of node, without +the npm the build needs. + ```sh npm install npm run build @@ -180,8 +275,10 @@ Each command builds one output, so only what is needed is built: npm run build # the library, in "dist/webodf.js" npm run doc # the documentation of the api, in "dist/docs" npm run check # check the types with the closure compiler (java is needed) +npm run check:tests # check the types of the library and of the tests npm test # run the tests with node npm run test:rhino # run the tests with Rhino, on a java virtual machine +npm run test:browser # run the tests in a browser, with all the suites npm run all # check, test, build and doc ``` @@ -189,6 +286,17 @@ The command "npm run check" uses the closure compiler as a type checker only: it writes no output. The jar is downloaded once from maven central into the directory ".tools" and the version is pinned in "scripts/lib/closure.js". +"npm run check:tests" checks the tests as well, as the target "compiled.js" of +the build with cmake does, so that both builds report the same errors. The +library alone is fully typed, the tests are not: they declare mocks that are +partial on purpose, so reportUnknownTypes is off for them. + +It ends with a second pass over the libraries packaged with "webodf.js", JSZip +for now, that only reads their jsdoc, as the target "simplecompiled.js" of the +build with cmake does. Their types are not checked, since they are not written +for the compiler, but an annotation it cannot parse stops the build, so the +check with node has to see it too. + ```sh CLOSURE_VERSION=v20240101 npm run check # another version CLOSURE_JAR=/path/to/compiler.jar npm run check # another copy @@ -199,8 +307,9 @@ automatically when an older one is used. The compiler of 2016, that the project used until now, does not check the sources any more: they use globalThis, that it does not know. -The tests needing a browser are still run with karma, see -"webodf/tools/karma.conf.js". +The configuration for karma, in "webodf/tools/karma.conf.js", is kept and is +still generated by "webodf/tools/updateJS.js" during a build with cmake, but +the command "npm run test:browser" replaces it and needs no extra package. ### Running with Rhino @@ -212,12 +321,12 @@ the tests, besides node. The jar of Rhino is downloaded from maven central into The file "tests.js" selects the suites from what the runtime provides, so each engine runs what it can: -| Engine | Suites | What it provides | -|-------------------|--------|-------------------------------------------| -| node, with jsdom | 26 | a dom with a range and a tree walker | -| node, alone | 3 | the package xmldom, without a range | -| Rhino | 3 | the dom of java, lists without an index | -| a browser, karma | 29 | everything, with a layout and its css | +| Engine | Suites | What it provides | +|------------------|--------|------------------------------------------| +| a browser | 35 | everything, with a layout and its css | +| node, with jsdom | 26 | a dom with a range and a tree walker | +| node, alone | 3 | the package xmldom, without a range | +| Rhino | 3 | the dom of java, lists without an index | The tests with node use jsdom when it is installed, which is the case after "npm install": it is a development dependency, the library itself does not use @@ -228,6 +337,22 @@ one by one, that needs a css parser rejecting the same rules. The runtime for Rhino could not even start between 2013 and now, so its own tests had never been run. +### Running the tests in a browser + +The command "npm run test:browser" serves the tests over http, since a page +loaded from a file cannot read them, then opens them in a chromium found on the +system. The browser is not downloaded: set WEBODF_BROWSER to its path, or +install one with "npx playwright install chromium". + +Two tests fail today, and they are not a defect of the browser: + +- RuntimeTests.testRead reads the raw bytes of a file that starts with a byte + order mark. The runtime asks for them with the trick of the mime type + "charset=x-user-defined", but a recent chromium decodes the answer as utf-8 + and removes the mark first. Reading the answer as an array buffer, as it is + done since a long time, would fix it. +- MaliciousDocumentTests.loadInjectionDocument reads a document the same way. + ### Outputs | Path | Built by | Content | From 8f2a62c6e1e2b94bf4f9a0900ff2796aa59b56b3 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 174/385] Updated readmes. --- README-Building.md | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/README-Building.md b/README-Building.md index a521485d1..50d78f4bb 100644 --- a/README-Building.md +++ b/README-Building.md @@ -174,30 +174,60 @@ order of their dependencies, taken from the file "webodf/lib/manifest.json", then minified with terser. The output has the same size as the one of the closure compiler used with SIMPLE_OPTIMIZATIONS, that the original build used. -Other commands: +Each command builds one output, so only what is needed is built: ```sh -npm run check # check the types with the closure compiler (java is needed) -npm test # run the tests that do not need a browser -npm run doc # generate the documentation of the api in "dist/docs" +npm run build # the library, in "dist/webodf.js" +npm run doc # the documentation of the api, in "dist/docs" +npm run check # check the types with the closure compiler (java is needed) +npm test # run the tests with node +npm run test:rhino # run the tests with Rhino, on a java virtual machine +npm run all # check, test, build and doc ``` The command "npm run check" uses the closure compiler as a type checker only: it writes no output. The jar is downloaded once from maven central into the -directory ".tools". The version is pinned in "scripts/lib/closure.js" and the -sources pass with it as with the one of 2016, that the project used before: +directory ".tools" and the version is pinned in "scripts/lib/closure.js". ```sh -CLOSURE_VERSION=v20160911 npm run check # the previous compiler +CLOSURE_VERSION=v20240101 npm run check # another version CLOSURE_JAR=/path/to/compiler.jar npm run check # another copy ``` The groups of checks removed from the compilers newer than 2016 are dropped -automatically, so both versions run with the same set of checks. +automatically when an older one is used. The compiler of 2016, that the project +used until now, does not check the sources any more: they use globalThis, that +it does not know. The tests needing a browser are still run with karma, see "webodf/tools/karma.conf.js". +### Running with Rhino + +Rhino runs javascript on a java virtual machine and gives a second engine for +the tests, besides node. The jar of Rhino is downloaded from maven central into +".tools", like the one of the closure compiler, and the version is set in +"scripts/lib/rhino.js" or with the environment variable RHINO_VERSION. + +The file "tests.js" selects the suites from what the runtime provides, so each +engine runs what it can: + +| Engine | Suites | What it provides | +|-------------------|--------|-------------------------------------------| +| node, with jsdom | 26 | a dom with a range and a tree walker | +| node, alone | 3 | the package xmldom, without a range | +| Rhino | 3 | the dom of java, lists without an index | +| a browser, karma | 29 | everything, with a layout and its css | + +The tests with node use jsdom when it is installed, which is the case after +"npm install": it is a development dependency, the library itself does not use +it. Three suites are added only in a browser: two measure where the text is +drawn, that needs a layout engine, and one compares the rules of a stylesheet +one by one, that needs a css parser rejecting the same rules. + +The runtime for Rhino could not even start between 2013 and now, so its own +tests had never been run. + ### Outputs | Path | Built by | Content | From 7400825e0e3ededb04050ac5e625d299152804ec Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 175/385] Wrote the texts of the stores for android, in the layout of fastlane. --- .../metadata/android/en-US/changelogs/1.txt | 3 ++ .../android/en-US/full_description.txt | 27 +++++++++++++++++ .../android/en-US/short_description.txt | 1 + .../fastlane/metadata/android/en-US/title.txt | 1 + .../metadata/android/fr-FR/changelogs/1.txt | 3 ++ .../android/fr-FR/full_description.txt | 29 +++++++++++++++++++ .../android/fr-FR/short_description.txt | 1 + .../fastlane/metadata/android/fr-FR/title.txt | 1 + 8 files changed, 66 insertions(+) create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/changelogs/1.txt create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/full_description.txt create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/short_description.txt create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/title.txt create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/changelogs/1.txt create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/full_description.txt create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/short_description.txt create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/title.txt diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/changelogs/1.txt b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/changelogs/1.txt new file mode 100644 index 000000000..b82b541ea --- /dev/null +++ b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/changelogs/1.txt @@ -0,0 +1,3 @@ +First release of the viewer for Android: it shows the texts, the spreadsheets +and the presentations of the OpenDocument format, from a file manager, a mail +or the picker of the system. diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/full_description.txt b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/full_description.txt new file mode 100644 index 000000000..cd3ddb5a9 --- /dev/null +++ b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/full_description.txt @@ -0,0 +1,27 @@ +OpenDocument Viewer shows the documents of LibreOffice and OpenOffice, the +texts, the spreadsheets and the presentations, so that a document a phone +receives is read at once, without an office suite. + +It registers for the nine types of the format, so the system offers it when one +is opened from a mail, a message or a file manager. Started on its own, it +shows an empty page that asks for a document, and opens the picker of the +system when it is touched: the system reads the file and hands it over, so the +viewer holds no permission to reach the storage, and it reaches no network. + +It is light: the whole application weighs less than a megabyte, where the other +viewers of the format weigh a hundred times that, so it is installed on a phone +that has no room left, and it opens at once. + +OpenDocument is the first format of office documents that was approved as an +international standard, ISO/IEC 26300, in 2006, and the only one that works as +one: it is written in the open by OASIS, it belongs to no company, and several +programs of several makers write and read the whole of it. + +A document written today is still read in twenty years, by whoever, with +whatever. + +The same viewer is an add-on of Firefox and of Chrome, that shows those +documents in the browser instead of downloading them. + +It is built on WebODF, a library that reads the format in JavaScript, and it is +free software, under the AGPL 3. diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/short_description.txt b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/short_description.txt new file mode 100644 index 000000000..06292e5e2 --- /dev/null +++ b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/short_description.txt @@ -0,0 +1 @@ +Reads the .odt, .ods and .odp documents without an office suite. diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/title.txt b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/title.txt new file mode 100644 index 000000000..84c5b1d96 --- /dev/null +++ b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/title.txt @@ -0,0 +1 @@ +OpenDocument Viewer diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/changelogs/1.txt b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/changelogs/1.txt new file mode 100644 index 000000000..6f36c8844 --- /dev/null +++ b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/changelogs/1.txt @@ -0,0 +1,3 @@ +Première version de la visionneuse pour Android : elle affiche les textes, les +tableurs et les présentations du format OpenDocument, depuis un gestionnaire de +fichiers, un courriel ou le sélecteur du système. diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/full_description.txt b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/full_description.txt new file mode 100644 index 000000000..d5834ef7e --- /dev/null +++ b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/full_description.txt @@ -0,0 +1,29 @@ +OpenDocument Viewer affiche les documents de LibreOffice et d’OpenOffice, les +textes, les tableurs et les présentations, pour qu’un document reçu sur un +téléphone se lise aussitôt, sans suite bureautique. + +Il se déclare pour les neuf types du format, et le système le propose donc dès +qu’un document est ouvert depuis un courriel, un message ou un gestionnaire de +fichiers. Lancé seul, il affiche une page vide qui demande un document et ouvre +le sélecteur du système quand on la touche : c’est le système qui lit le +fichier et le lui remet, si bien que la visionneuse ne détient aucune +permission d’accès au stockage, et n’accède à aucun réseau. + +Elle est légère : l’application entière pèse moins d’un mégaoctet, là où les +autres visionneuses du format en pèsent cent fois plus, si bien qu’elle +s’installe sur un téléphone qui n’a plus de place, et qu’elle s’ouvre aussitôt. + +OpenDocument est le premier format de documents bureautiques approuvé comme +norme internationale, ISO/IEC 26300, en 2006, et le seul qui en tienne le +rôle : il est écrit au grand jour par OASIS, il n’appartient à aucune +entreprise, et plusieurs programmes de plusieurs auteurs l’écrivent et le +lisent en entier. + +Un document écrit aujourd’hui se lira encore dans vingt ans, par qui que ce +soit, avec quoi que ce soit. + +La même visionneuse existe en extension pour Firefox et pour Chrome, qui +affiche ces documents dans le navigateur au lieu de les télécharger. + +Elle repose sur WebODF, une bibliothèque qui lit le format en JavaScript, et +c’est un logiciel libre, sous licence AGPL 3. diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/short_description.txt b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/short_description.txt new file mode 100644 index 000000000..344851559 --- /dev/null +++ b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/short_description.txt @@ -0,0 +1 @@ +Lit les documents .odt, .ods et .odp sans suite bureautique. diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/title.txt b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/title.txt new file mode 100644 index 000000000..84c5b1d96 --- /dev/null +++ b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/fr-FR/title.txt @@ -0,0 +1 @@ +OpenDocument Viewer From 09a15c411aaff26dad71aae87b16645750d07a55 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 176/385] Named the product as a viewer of OpenDocument for android. --- .gitignore | 8 +++--- programs/CMakeLists.txt | 2 +- programs/cordova/CMakeLists.txt | 2 +- .../CMakeLists.txt | 26 +++++++++--------- .../build.gradle | 0 .../gradle.properties | 0 .../settings.gradle | 2 +- .../src/main/AndroidManifest.xml | 0 .../src/main/assets/index.css | 0 .../src/main/assets/index.html | 0 .../src/main/assets/index.js | 0 .../org/webodf/viewer/ViewerActivity.java | 0 .../src/main/res/mipmap/icon.png | Bin .../src/main/res/values/strings.xml | 0 14 files changed, 20 insertions(+), 20 deletions(-) rename programs/{androidviewer => odfviewer-android}/CMakeLists.txt (79%) rename programs/{androidviewer => odfviewer-android}/build.gradle (100%) rename programs/{androidviewer => odfviewer-android}/gradle.properties (100%) rename programs/{androidviewer => odfviewer-android}/settings.gradle (84%) rename programs/{androidviewer => odfviewer-android}/src/main/AndroidManifest.xml (100%) rename programs/{androidviewer => odfviewer-android}/src/main/assets/index.css (100%) rename programs/{androidviewer => odfviewer-android}/src/main/assets/index.html (100%) rename programs/{androidviewer => odfviewer-android}/src/main/assets/index.js (100%) rename programs/{androidviewer => odfviewer-android}/src/main/java/org/webodf/viewer/ViewerActivity.java (100%) rename programs/{androidviewer => odfviewer-android}/src/main/res/mipmap/icon.png (100%) rename programs/{androidviewer => odfviewer-android}/src/main/res/values/strings.xml (100%) diff --git a/.gitignore b/.gitignore index 9709cc81d..2572ce6c8 100644 --- a/.gitignore +++ b/.gitignore @@ -48,7 +48,7 @@ node_modules/* !node_modules/@xmldom # The library is copied into the assets of the viewer of android. -programs/androidviewer/src/main/assets/webodf.js -programs/androidviewer/.gradle -programs/androidviewer/build -programs/androidviewer/local.properties +programs/odfviewer-android/src/main/assets/webodf.js +programs/odfviewer-android/.gradle +programs/odfviewer-android/build +programs/odfviewer-android/local.properties diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index a0809373a..e63d9a149 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -12,4 +12,4 @@ add_subdirectory(benchmark) add_subdirectory(editor) add_subdirectory(cordova) -add_subdirectory(androidviewer) +add_subdirectory(odfviewer-android) diff --git a/programs/cordova/CMakeLists.txt b/programs/cordova/CMakeLists.txt index 283fe56ea..d40202fff 100644 --- a/programs/cordova/CMakeLists.txt +++ b/programs/cordova/CMakeLists.txt @@ -10,7 +10,7 @@ # below. # # The apk of android was packed here as well, and is built by -# programs/androidviewer now. +# programs/odfviewer-android now. configure_file(config.xml.in config.xml) configure_file(manifest.webapp.in manifest.webapp) diff --git a/programs/androidviewer/CMakeLists.txt b/programs/odfviewer-android/CMakeLists.txt similarity index 79% rename from programs/androidviewer/CMakeLists.txt rename to programs/odfviewer-android/CMakeLists.txt index 1ddb5db96..07266d9f9 100644 --- a/programs/androidviewer/CMakeLists.txt +++ b/programs/odfviewer-android/CMakeLists.txt @@ -1,11 +1,11 @@ -# The viewer of android is a web view that shows a document with WebODF. It +# The viewer of OpenDocument for android is a web view that shows a document with WebODF. It # replaces the one of programs/cordova, that drove cordova 3.5, of 2014, and # built with ant, which google dropped in 2015 for gradle. # # It is opt-in, as it needs the sdk of android and a jdk, that the build does # not download: gradle reads the sdk from $ANDROID_HOME, the directory the sdk # is installed in, or from "sdk.dir" of the file "local.properties". -option(WEBODF_ANDROID "Build the viewer of android, that needs its sdk" OFF) +option(WEBODF_ANDROID "Build the viewer of OpenDocument for android, that needs its sdk" OFF) if (WEBODF_ANDROID) # The sdk is looked for here rather than left to gradle, that only says so @@ -40,7 +40,7 @@ if (WEBODF_ANDROID) ) set(GRADLE ${CMAKE_CURRENT_BINARY_DIR}/Gradle-prefix/src/Gradle/bin/gradle) - set(ANDROIDVIEWER_SOURCES + set(ODFVIEWER_ANDROID_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/build.gradle ${CMAKE_CURRENT_SOURCE_DIR}/src/main/AndroidManifest.xml ${CMAKE_CURRENT_SOURCE_DIR}/src/main/java/org/webodf/viewer/ViewerActivity.java @@ -52,7 +52,7 @@ if (WEBODF_ANDROID) # signed, as only its author may sign it; the one of the debug is, with # the key gradle writes for that, so that it installs on a device or in an # emulator without anything else, see "README-Products.md". - macro(BUILD_ANDROIDVIEWER apk task) + macro(BUILD_ODFVIEWER_ANDROID apk task) add_custom_command( OUTPUT ${apk} # The library is read from the assets, as the page is. @@ -64,19 +64,19 @@ if (WEBODF_ANDROID) -PwebodfVersion=${WEBODF_MANIFEST_VERSION} -PbuildDir=${CMAKE_CURRENT_BINARY_DIR}/build ${task} - DEPENDS webodf.js-target Gradle ${ANDROIDVIEWER_SOURCES} + DEPENDS webodf.js-target Gradle ${ODFVIEWER_ANDROID_SOURCES} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) endmacro() - set(ANDROIDVIEWER_APK - ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/androidviewer-release-unsigned.apk) - set(ANDROIDVIEWER_APK_DEBUG - ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/debug/androidviewer-debug.apk) + set(ODFVIEWER_ANDROID_APK + ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/release/odfviewer-android-release-unsigned.apk) + set(ODFVIEWER_ANDROID_APK_DEBUG + ${CMAKE_CURRENT_BINARY_DIR}/build/outputs/apk/debug/odfviewer-android-debug.apk) - BUILD_ANDROIDVIEWER(${ANDROIDVIEWER_APK} assembleRelease) - BUILD_ANDROIDVIEWER(${ANDROIDVIEWER_APK_DEBUG} assembleDebug) + BUILD_ODFVIEWER_ANDROID(${ODFVIEWER_ANDROID_APK} assembleRelease) + BUILD_ODFVIEWER_ANDROID(${ODFVIEWER_ANDROID_APK_DEBUG} assembleDebug) - add_custom_target(product-androidviewer DEPENDS ${ANDROIDVIEWER_APK}) - add_custom_target(androidviewer-debug DEPENDS ${ANDROIDVIEWER_APK_DEBUG}) + add_custom_target(product-odfviewer-android DEPENDS ${ODFVIEWER_ANDROID_APK}) + add_custom_target(odfviewer-android-debug DEPENDS ${ODFVIEWER_ANDROID_APK_DEBUG}) endif () diff --git a/programs/androidviewer/build.gradle b/programs/odfviewer-android/build.gradle similarity index 100% rename from programs/androidviewer/build.gradle rename to programs/odfviewer-android/build.gradle diff --git a/programs/androidviewer/gradle.properties b/programs/odfviewer-android/gradle.properties similarity index 100% rename from programs/androidviewer/gradle.properties rename to programs/odfviewer-android/gradle.properties diff --git a/programs/androidviewer/settings.gradle b/programs/odfviewer-android/settings.gradle similarity index 84% rename from programs/androidviewer/settings.gradle rename to programs/odfviewer-android/settings.gradle index a694adca3..b2836ae65 100644 --- a/programs/androidviewer/settings.gradle +++ b/programs/odfviewer-android/settings.gradle @@ -11,4 +11,4 @@ dependencyResolutionManagement { mavenCentral() } } -rootProject.name = 'androidviewer' +rootProject.name = 'odfviewer-android' diff --git a/programs/androidviewer/src/main/AndroidManifest.xml b/programs/odfviewer-android/src/main/AndroidManifest.xml similarity index 100% rename from programs/androidviewer/src/main/AndroidManifest.xml rename to programs/odfviewer-android/src/main/AndroidManifest.xml diff --git a/programs/androidviewer/src/main/assets/index.css b/programs/odfviewer-android/src/main/assets/index.css similarity index 100% rename from programs/androidviewer/src/main/assets/index.css rename to programs/odfviewer-android/src/main/assets/index.css diff --git a/programs/androidviewer/src/main/assets/index.html b/programs/odfviewer-android/src/main/assets/index.html similarity index 100% rename from programs/androidviewer/src/main/assets/index.html rename to programs/odfviewer-android/src/main/assets/index.html diff --git a/programs/androidviewer/src/main/assets/index.js b/programs/odfviewer-android/src/main/assets/index.js similarity index 100% rename from programs/androidviewer/src/main/assets/index.js rename to programs/odfviewer-android/src/main/assets/index.js diff --git a/programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java b/programs/odfviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java similarity index 100% rename from programs/androidviewer/src/main/java/org/webodf/viewer/ViewerActivity.java rename to programs/odfviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java diff --git a/programs/androidviewer/src/main/res/mipmap/icon.png b/programs/odfviewer-android/src/main/res/mipmap/icon.png similarity index 100% rename from programs/androidviewer/src/main/res/mipmap/icon.png rename to programs/odfviewer-android/src/main/res/mipmap/icon.png diff --git a/programs/androidviewer/src/main/res/values/strings.xml b/programs/odfviewer-android/src/main/res/values/strings.xml similarity index 100% rename from programs/androidviewer/src/main/res/values/strings.xml rename to programs/odfviewer-android/src/main/res/values/strings.xml From a99c3d78a46a107f790aae4a249209e3a86e3647 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 177/385] Renamed the add-ons of the browsers to odfviewer-webext. --- .gitignore | 2 -- programs/CMakeLists.txt | 2 +- .../CMakeLists.txt | 18 +++++++++--------- .../background-chrome.js | 0 .../background.js | 0 .../manifest-chrome.json.in | 0 .../manifest-v2.json.in | 0 .../manifest-v3.json.in | 0 .../skin/default/icon.png | Bin .../viewer.css | 0 .../viewer.html | 0 .../viewer.js | 0 scripts/test-extension.js | 4 ++-- 13 files changed, 12 insertions(+), 14 deletions(-) rename programs/{firefoxextension => odfviewer-webext}/CMakeLists.txt (82%) rename programs/{firefoxextension => odfviewer-webext}/background-chrome.js (100%) rename programs/{firefoxextension => odfviewer-webext}/background.js (100%) rename programs/{firefoxextension => odfviewer-webext}/manifest-chrome.json.in (100%) rename programs/{firefoxextension => odfviewer-webext}/manifest-v2.json.in (100%) rename programs/{firefoxextension => odfviewer-webext}/manifest-v3.json.in (100%) rename programs/{firefoxextension => odfviewer-webext}/skin/default/icon.png (100%) rename programs/{firefoxextension => odfviewer-webext}/viewer.css (100%) rename programs/{firefoxextension => odfviewer-webext}/viewer.html (100%) rename programs/{firefoxextension => odfviewer-webext}/viewer.js (100%) diff --git a/.gitignore b/.gitignore index b9c336a1d..647ca6c36 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,6 @@ #android/bin #android/gen nativeQtClient/nativeQtClient.pro.user -programs/firefoxextension/content/web/viewer.html -programs/firefoxextension/install.rdf programs/ios/WebODF.xcodeproj/project.xcworkspace programs/ios/WebODF.xcodeproj/xcuserdata programs/ios/www/ZoomIn.png diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index 79ecd7744..ee7887969 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -6,7 +6,7 @@ endif(BUILD_QTJSRUNTIME) add_subdirectory(docnosis) -add_subdirectory(firefoxextension) +add_subdirectory(odfviewer-webext) add_subdirectory(benchmark) add_subdirectory(editor) diff --git a/programs/firefoxextension/CMakeLists.txt b/programs/odfviewer-webext/CMakeLists.txt similarity index 82% rename from programs/firefoxextension/CMakeLists.txt rename to programs/odfviewer-webext/CMakeLists.txt index 7956f0a25..ab7138512 100644 --- a/programs/firefoxextension/CMakeLists.txt +++ b/programs/odfviewer-webext/CMakeLists.txt @@ -1,6 +1,6 @@ # The files that go into the extension, copied as they are. "webodf.js" comes # from the build and the manifest carries the version, see below. -set(FIREFOXEXTENSIONFILES +set(ODFVIEWER_WEBEXT_FILES background.js background-chrome.js viewer.html @@ -16,7 +16,7 @@ configure_file(manifest-chrome.json.in ${CMAKE_CURRENT_BINARY_DIR}/manifest-chro # Pack the add-on from one of the three manifests. The viewer is the same in # all of them: only the way the documents reach it differs, and Chrome takes # a file of rules rather than a script, see "README-Products.md". -macro(PACK_FIREFOX_EXTENSION xpi dir manifest extra) +macro(PACK_ODFVIEWER_WEBEXT xpi dir manifest extra) add_custom_command( OUTPUT ${xpi} COMMAND ${CMAKE_COMMAND} -E remove_directory ${dir} @@ -40,24 +40,24 @@ macro(PACK_FIREFOX_EXTENSION xpi dir manifest extra) notopdir DEPENDS ${NODE} ${TOOLS_DIR}/zipdir.js - ${FIREFOXEXTENSIONFILES} + ${ODFVIEWER_WEBEXT_FILES} webodf.js-target ${CMAKE_CURRENT_BINARY_DIR}/${manifest} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} ) endmacro() -PACK_FIREFOX_EXTENSION(${FIREFOX_EXTENSION_ODFVIEWER} +PACK_ODFVIEWER_WEBEXT(${FIREFOX_EXTENSION_ODFVIEWER} ${FIREFOX_EXTENSION_ODFVIEWER_DIR} manifest-v3.json background.js) -PACK_FIREFOX_EXTENSION(${FIREFOX_EXTENSION_ODFVIEWER_MV2} +PACK_ODFVIEWER_WEBEXT(${FIREFOX_EXTENSION_ODFVIEWER_MV2} ${FIREFOX_EXTENSION_ODFVIEWER_MV2_DIR} manifest-v2.json background.js) -PACK_FIREFOX_EXTENSION(${CHROME_EXTENSION_ODFVIEWER} +PACK_ODFVIEWER_WEBEXT(${CHROME_EXTENSION_ODFVIEWER} ${CHROME_EXTENSION_ODFVIEWER_DIR} manifest-chrome.json background-chrome.js) -add_custom_target(build-firefoxextension +add_custom_target(build-odfviewer-webext DEPENDS ${FIREFOX_EXTENSION_ODFVIEWER} ${FIREFOX_EXTENSION_ODFVIEWER_MV2} ${CHROME_EXTENSION_ODFVIEWER}) -add_custom_target(test-firefoxextension DEPENDS webodf.js-tests) +add_custom_target(test-odfviewer-webext DEPENDS webodf.js-tests) -add_custom_target(product-firefoxextension DEPENDS build-firefoxextension test-firefoxextension) +add_custom_target(product-odfviewer-webext DEPENDS build-odfviewer-webext test-odfviewer-webext) diff --git a/programs/firefoxextension/background-chrome.js b/programs/odfviewer-webext/background-chrome.js similarity index 100% rename from programs/firefoxextension/background-chrome.js rename to programs/odfviewer-webext/background-chrome.js diff --git a/programs/firefoxextension/background.js b/programs/odfviewer-webext/background.js similarity index 100% rename from programs/firefoxextension/background.js rename to programs/odfviewer-webext/background.js diff --git a/programs/firefoxextension/manifest-chrome.json.in b/programs/odfviewer-webext/manifest-chrome.json.in similarity index 100% rename from programs/firefoxextension/manifest-chrome.json.in rename to programs/odfviewer-webext/manifest-chrome.json.in diff --git a/programs/firefoxextension/manifest-v2.json.in b/programs/odfviewer-webext/manifest-v2.json.in similarity index 100% rename from programs/firefoxextension/manifest-v2.json.in rename to programs/odfviewer-webext/manifest-v2.json.in diff --git a/programs/firefoxextension/manifest-v3.json.in b/programs/odfviewer-webext/manifest-v3.json.in similarity index 100% rename from programs/firefoxextension/manifest-v3.json.in rename to programs/odfviewer-webext/manifest-v3.json.in diff --git a/programs/firefoxextension/skin/default/icon.png b/programs/odfviewer-webext/skin/default/icon.png similarity index 100% rename from programs/firefoxextension/skin/default/icon.png rename to programs/odfviewer-webext/skin/default/icon.png diff --git a/programs/firefoxextension/viewer.css b/programs/odfviewer-webext/viewer.css similarity index 100% rename from programs/firefoxextension/viewer.css rename to programs/odfviewer-webext/viewer.css diff --git a/programs/firefoxextension/viewer.html b/programs/odfviewer-webext/viewer.html similarity index 100% rename from programs/firefoxextension/viewer.html rename to programs/odfviewer-webext/viewer.html diff --git a/programs/firefoxextension/viewer.js b/programs/odfviewer-webext/viewer.js similarity index 100% rename from programs/firefoxextension/viewer.js rename to programs/odfviewer-webext/viewer.js diff --git a/scripts/test-extension.js b/scripts/test-extension.js index 28c13def1..32b5ba318 100644 --- a/scripts/test-extension.js +++ b/scripts/test-extension.js @@ -3,7 +3,7 @@ /** * Run the add-on of Chrome and check that it shows a document. * - * The package is built here, from "programs/firefoxextension" and the library + * The package is built here, from "programs/odfviewer-webext" and the library * of "dist", then a document is served over http and the browser is asked for * it. The add-on has to send it to its viewer, that has to draw it. * @@ -22,7 +22,7 @@ var fs = require("fs"), http = require("http"), path = require("path"), rootDir = path.resolve(__dirname, ".."), - extensionDir = path.join(rootDir, "programs/firefoxextension"), + extensionDir = path.join(rootDir, "programs/odfviewer-webext"), libraryPath = path.join(rootDir, "dist/webodf.js"), // A document that is versioned, so that the test needs no other build. documentPath = path.join(rootDir, "programs/benchmark/1page.odt"), From da19310caf615d021f9892cf46c510658a2568b5 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 178/385] =?UTF-8?q?Pr=C3=A9pared=20the=20readmes=20for=20n?= =?UTF-8?q?ext=20improvements.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CMakeLists.txt | 26 +++++++++++++++ README-Products.md | 21 ++++++++++++ programs/text/format.en.html | 63 +++++++++++++++++++++++++++++++++++ programs/text/format.fr.html | 64 ++++++++++++++++++++++++++++++++++++ 4 files changed, 174 insertions(+) create mode 100644 programs/text/format.en.html create mode 100644 programs/text/format.fr.html diff --git a/CMakeLists.txt b/CMakeLists.txt index 65dadf9bd..169d7e3e6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -302,6 +302,32 @@ endif(WIN32 AND WEBODF_PROGRAMS) ## Define custom macros ############################## +# The pages of the products tell what the OpenDocument format is worth, and they +# tell it in the same words: the text is written once, in "programs/text", and +# inserted where a page names it, "@FORMAT_TEXT@". A page is a template, +# "*.html.in", and the page itself is written into the build directory. +# +# The text is read here, and it is named as a dependency of the configuration, +# so that cmake runs itself again when it is revised: the pages then follow +# without anything to remember. +set(TEXT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/programs/text) +foreach (LANGUAGE en fr) + file(READ ${TEXT_DIR}/format.${LANGUAGE}.html FORMAT_TEXT_${LANGUAGE}) + # The newline an editor writes at the end of a file would become a blank line + # in every page, so the text is taken without what closes it. + string(REGEX REPLACE "[ \t\r\n]+$" "" FORMAT_TEXT_${LANGUAGE} + "${FORMAT_TEXT_${LANGUAGE}}") + set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS + ${TEXT_DIR}/format.${LANGUAGE}.html) +endforeach () + +# INSERT_TEXT (template output language) +# Writes the page of a product, with the text of the format in it. +macro(INSERT_TEXT _template _output _language) + set(FORMAT_TEXT "${FORMAT_TEXT_${_language}}") + configure_file(${_template} ${_output} @ONLY) +endmacro(INSERT_TEXT) + # COPY_FILES (varname srcdir tgtdir files) # Creates a target that copies the listed files from the srcdir to the tgtdir, # preserving their relative path. diff --git a/README-Products.md b/README-Products.md index fcd703b6a..d8f1d20c9 100644 --- a/README-Products.md +++ b/README-Products.md @@ -291,6 +291,27 @@ It replaces the product of "programs/cordova", that drove cordova 3.5, of 2014, and built android with ant, which google dropped in 2015 for gradle, through the executable "android", that the sdk replaced by "sdkmanager" in 2018. +### One text for every product + +The pages of the products tell what the OpenDocument format is worth, and they +tell it in the same words: the text is written once, in +"programs/text/format.en.html" and "programs/text/format.fr.html", and nowhere +else. + +A page that shows it is a template, "*.html.in", that names it where it goes: + +```html +@FORMAT_TEXT@ +``` + +Cmake reads the text and writes the page, see the macro INSERT_TEXT in the +CMakeLists of the root. The page of a product is written where that product +reads it, and it is not in the repository: only its template and the text are. + +The text is named as a dependency of the configuration, so cmake runs itself +again as soon as it is revised, and every product follows. A revision is +therefore made in one file, and it cannot be forgotten in another. + ### Products that are not built any more One product of "programs/cordova" is still declared, and no version of its diff --git a/programs/text/format.en.html b/programs/text/format.en.html new file mode 100644 index 000000000..9fee9c390 --- /dev/null +++ b/programs/text/format.en.html @@ -0,0 +1,63 @@ +

Why choose the OpenDocument format

+

OpenDocument is the first format of office documents that was approved + as an international standard, ISO/IEC 26300, in 2006, and the only one + that works as one: it is written in the open by OASIS, it belongs to no + company, and many programs of many makers read and write all of it. + Another "standard" was approved after it, Microsoft OOXML, without the + first one being withdrawn, which is a nonsense: what makes a standard is + to be single, shared and lasting.

+

OpenDocument is therefore the only standard whose documents are shared + and last. Every office suite needs, in practice, to write elements the + standard does not provide for. What becomes of those elements is what + sets the two formats apart, fundamentally, and what makes OOXML a false + standard.

+

OpenDocument gives the elements it does not provide for a name of their + own: a program writes its additions under its own name, LibreOffice under + "loext", and the standard states that a reader that does not know them + has to ignore them and read on, rather than read them wrongly. The file + stays a file of the standard.

+

OOXML treats the elements of its own another way. Beside the strict form, + the standard approved in 2008 defined a transitional one, which keeps the + ways of writing of the old binary files of the Microsoft Office suite. It + was meant for turning the older documents over, and the intent publicly + stated was that it be dropped from the standard. Yet it is that temporary + form the office suites still write today: the format Microsoft 365 saves + in is the transitional one to this day, in the desktop version as in the + web one. The strict form, the one that was to be the default, is still + only a choice made by hand, which the web version does not even offer.

+

Besides, the adoption of OOXML by the fast track of 2008 was secured by + politico-commercial pressure and by acts of corruption of Microsoft. It + drew, accordingly, several appeals and the stuffing of the committees + that voted: in several countries, dozens of companies close to Microsoft + joined the national body of standards on the eve of the vote, carried it, + and left soon after, which is + + documented country by country. A reader has to implement not the + standard alone, but the whole history of one proprietary program. It is + there to be measured: the whole standard of OpenDocument holds in a + thousand pages, the one of OOXML comes near seven thousand pages.

+

In short, a document written today in OpenDocument will still be read in + twenty years, by anyone and with anything. That is the whole difference + with a standard in name only, and the whole worth of a true one.

+ +

To read further

+ diff --git a/programs/text/format.fr.html b/programs/text/format.fr.html new file mode 100644 index 000000000..90f4c6283 --- /dev/null +++ b/programs/text/format.fr.html @@ -0,0 +1,64 @@ +

Pourquoi choisir le format OpenDocument

+

OpenDocument est le premier format de documents bureautiques approuvé + comme norme internationale, ISO/IEC 26300, en 2006, et le seul qui en + tienne le rôle : il est écrit en toute transparence par OASIS, il + n’appartient à aucune entreprise et de nombreux programmes de multiples + éditeurs le lisent et l’écrivent complètement. Un autre « standard » a été + approuvé ensuite, Microsoft OOXML, sans annuler le précédent, ce qui est + un non-sens puisque le principe d’un standard est d’être unique, partagé + et durable.

+

Or OpenDocument est la seule norme qui crée des documents partageables et + durables. En effet, en pratique, toute suite bureautique a besoin d’écrire + des éléments non prévus par la norme. C’est le traitement de ces éléments + qui sépare fondamentalement les deux formats et fait d’OOXML une fausse + norme.

+

OpenDocument prévoit une identification claire pour les éléments non + prévus : un programme écrit ses ajouts avec un nom qui lui est propre, + LibreOffice sous « loext », et la norme précise qu’un lecteur qui ne les + connaît pas doit les ignorer et poursuivre sa lecture sans les + interpréter de manière erronée. Le fichier reste un fichier de la norme.

+

OOXML traite les éléments spécifiques différemment. À côté de la forme + stricte, la norme approuvée en 2008 définissait une forme transitoire, qui + conserve les modes de codage des anciens fichiers binaires de la suite + Microsoft Office. Elle était prévue pour convertir les anciens documents + et l’intention publiquement affichée était de la retirer de la norme. + Pourtant, c’est cette variante temporaire que les suites bureautiques + écrivent toujours aujourd’hui : le format par défaut de Microsoft 365 est + toujours la forme transitoire, dans la version bureau comme dans la + version web. La forme stricte qui devait être activée par défaut n’est + toujours qu’un choix manuel que la version web ne propose même pas.

+

En outre, l’adoption d’OOXML par voie accélérée en 2008 a été établie + suite à des pressions politico-commerciales et à des actes de corruption + de Microsoft. De fait, elle a fait l’objet de multiples recours et de + bourrages de comités : dans plusieurs pays, des dizaines d’entreprises + proches de Microsoft ont adhéré au comité national de normalisation à la + veille du vote, l’ont emporté, puis s’en sont retirées, ce qui est + + documenté pays par pays. Un lecteur doit donc implémenter non pas + seulement la norme, mais toute l’histoire d’un programme propriétaire. + Cela se mesure : la norme complète OpenDocument tient en un millier de + pages, celle d’OOXML approche les sept mille pages.

+

Bref, un document écrit aujourd’hui en OpenDocument se lira encore dans + vingt ans, par qui que ce soit et avec quoi que ce soit. C’est toute la + différence avec un faux standard et tout l’intérêt d’une vraie norme.

+ +

Pour aller plus loin

+ From b1f7b1c3ec9ff921b23d3ff67aabbffeb947aea8 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 179/385] Added the screenshots of the store for android. --- .../en-US/images/phoneScreenshots/1.png | Bin 0 -> 166140 bytes .../en-US/images/phoneScreenshots/2.png | Bin 0 -> 51185 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png create mode 100644 programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png new file mode 100644 index 0000000000000000000000000000000000000000..9d0145e48c321f97d104f51ea4c07cd4e40fc7d3 GIT binary patch literal 166140 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

Y^386)dNaW?gf{93$Lkm%fGcc0O&g)bwiO~wyY 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 literal 0 HcmV?d00001 diff --git a/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png b/programs/opendocumentviewer-android/src/main/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png new file mode 100644 index 0000000000000000000000000000000000000000..2ad2a465f039482bc69beeaa987854a1d5a1b932 GIT binary patch literal 51185 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%0D*i&X1QFy=w*P;8!O~yG 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 Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 180/385] Named the deprecated api the viewer of android used, and dropped it. --- programs/odfviewer-android/build.gradle | 6 ++++++ .../src/main/java/org/webodf/viewer/ViewerActivity.java | 8 ++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/programs/odfviewer-android/build.gradle b/programs/odfviewer-android/build.gradle index b2325af3a..502c1e0d4 100644 --- a/programs/odfviewer-android/build.gradle +++ b/programs/odfviewer-android/build.gradle @@ -32,4 +32,10 @@ android { } } +// javac only says that a deprecated api is used, never which one, unless it +// is asked to. +tasks.withType(JavaCompile).configureEach { + options.compilerArgs << '-Xlint:deprecation' +} + // No dependency at all: the viewer serves its own files, see ViewerActivity. diff --git a/programs/odfviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java b/programs/odfviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java index 71a5327bc..3e6d46c04 100644 --- a/programs/odfviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java +++ b/programs/odfviewer-android/src/main/java/org/webodf/viewer/ViewerActivity.java @@ -153,15 +153,15 @@ protected void onCreate(Bundle state) { WebView view = new WebView(this); WebSettings settings = view.getSettings(); // The library runs in the page, so scripts are needed. Everything - // else a web view may reach is closed: the page reads no file, no - // content provider and no database of its own, and it is never - // allowed to read the network, see answer() above. + // else a web view may reach is closed: the page reads no file and no + // content provider, and it is never allowed to read the network, see + // answer() above. The databases of a page are not closed, as the api + // that did it is deprecated: the web view dropped WebSQL itself. settings.setJavaScriptEnabled(true); settings.setAllowFileAccess(false); settings.setAllowContentAccess(false); settings.setGeolocationEnabled(false); settings.setDomStorageEnabled(false); - settings.setDatabaseEnabled(false); settings.setCacheMode(WebSettings.LOAD_NO_CACHE); view.setWebViewClient(new WebViewClient() { @Override From 397b85bad2af4e663994e35ad397a42ecd6c7398 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 181/385] Added a menu to the viewer. --- .../_locales/en/messages.json | 22 ++++ .../_locales/fr/messages.json | 22 ++++ .../manifest-chrome.json.in | 3 +- .../manifest-v2.json.in | 3 +- .../manifest-v3.json.in | 3 +- programs/opendocumentviewer-webext/viewer.css | 113 ++++++++++++++++-- .../opendocumentviewer-webext/viewer.html | 26 ++-- programs/opendocumentviewer-webext/viewer.js | 106 +++++++++++++++- 8 files changed, 270 insertions(+), 28 deletions(-) create mode 100644 programs/opendocumentviewer-webext/_locales/en/messages.json create mode 100644 programs/opendocumentviewer-webext/_locales/fr/messages.json diff --git a/programs/opendocumentviewer-webext/_locales/en/messages.json b/programs/opendocumentviewer-webext/_locales/en/messages.json new file mode 100644 index 000000000..870486628 --- /dev/null +++ b/programs/opendocumentviewer-webext/_locales/en/messages.json @@ -0,0 +1,22 @@ +{ + "openInViewer": { + "message": "Open in OpenDocument Viewer", + "description": "The entry of the menus that opens an attachment in the viewer." + }, + "menu": { + "message": "Menu", + "description": "The name of the button that opens the menu of the viewer." + }, + "openLocal": { + "message": "Open a local document", + "description": "The entry of the menu of the viewer that opens a file of the disk." + }, + "download": { + "message": "Save this document", + "description": "The entry of the menu of the viewer that saves the document." + }, + "about": { + "message": "About this viewer", + "description": "The entry of the menu of the viewer that leads to the page of the welcome." + } +} diff --git a/programs/opendocumentviewer-webext/_locales/fr/messages.json b/programs/opendocumentviewer-webext/_locales/fr/messages.json new file mode 100644 index 000000000..530f0c763 --- /dev/null +++ b/programs/opendocumentviewer-webext/_locales/fr/messages.json @@ -0,0 +1,22 @@ +{ + "openInViewer": { + "message": "Ouvrir dans le lecteur OpenDocument", + "description": "The entry of the menus that opens an attachment in the viewer." + }, + "menu": { + "message": "Menu", + "description": "The name of the button that opens the menu of the viewer." + }, + "openLocal": { + "message": "Ouvrir un document local", + "description": "The entry of the menu of the viewer that opens a file of the disk." + }, + "download": { + "message": "Enregistrer ce document", + "description": "The entry of the menu of the viewer that saves the document." + }, + "about": { + "message": "À propos de ce lecteur", + "description": "The entry of the menu of the viewer that leads to the page of the welcome." + } +} diff --git a/programs/opendocumentviewer-webext/manifest-chrome.json.in b/programs/opendocumentviewer-webext/manifest-chrome.json.in index 9559ce572..fc630e71e 100644 --- a/programs/opendocumentviewer-webext/manifest-chrome.json.in +++ b/programs/opendocumentviewer-webext/manifest-chrome.json.in @@ -2,9 +2,10 @@ "manifest_version": 3, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Light reader for .odt, .ods and .odp documents of LibreOffice, OpenOffice and Office 365, without an office suite.", + "description": "Light reader for .odt, .ods and .odp documents of LibreOffice and compatible applications, without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", + "default_locale": "en", "minimum_chrome_version": "88", "icons": { "128": "skin/default/icon.png" diff --git a/programs/opendocumentviewer-webext/manifest-v2.json.in b/programs/opendocumentviewer-webext/manifest-v2.json.in index f22a47244..d0d6e837e 100644 --- a/programs/opendocumentviewer-webext/manifest-v2.json.in +++ b/programs/opendocumentviewer-webext/manifest-v2.json.in @@ -2,9 +2,10 @@ "manifest_version": 2, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Light reader for .odt, .ods and .odp documents of LibreOffice, OpenOffice and Office 365, without an office suite.", + "description": "Light reader for .odt, .ods and .odp documents of LibreOffice and compatible applications, without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", + "default_locale": "en", "browser_specific_settings": { "gecko": { "id": "uriloader@webodf.js", diff --git a/programs/opendocumentviewer-webext/manifest-v3.json.in b/programs/opendocumentviewer-webext/manifest-v3.json.in index 95cc52e86..8354fb4bd 100644 --- a/programs/opendocumentviewer-webext/manifest-v3.json.in +++ b/programs/opendocumentviewer-webext/manifest-v3.json.in @@ -2,9 +2,10 @@ "manifest_version": 3, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Light reader for .odt, .ods and .odp documents of LibreOffice, OpenOffice and Office 365, without an office suite.", + "description": "Light reader for .odt, .ods and .odp documents of LibreOffice and compatible applications, without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", + "default_locale": "en", "browser_specific_settings": { "gecko": { "id": "uriloader@webodf.js", diff --git a/programs/opendocumentviewer-webext/viewer.css b/programs/opendocumentviewer-webext/viewer.css index 34fd8b481..e22bd02e4 100644 --- a/programs/opendocumentviewer-webext/viewer.css +++ b/programs/opendocumentviewer-webext/viewer.css @@ -7,25 +7,112 @@ body, html { height: 100%; text-align: center; } +/* The ground sets the page apart, as a reader of pdf does, and follows the + theme of the browser: the black it used to be is the ground of no theme. */ html > body { - background: black; + background: #d4d4d7; + color: black; } -div#toolbar { - background: white; - padding: 7px; - border-bottom: 1px solid black; +@media (prefers-color-scheme: dark) { + html > body { + background: #2a2a2e; + color: white; + } } -div#toolbar > .button { - border: 1px solid black; - padding: 2px; +/* The button of the menu floats over the document, in the corner, so that no + room is taken from the page. */ +button#menubutton { + position: fixed; + top: 8px; + right: 8px; + z-index: 2; + /* The glyph is centred by the box itself: a line height never puts it in + the middle of a square, the ink of a character sitting above its + baseline. */ + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + padding: 0; + border: 1px solid rgba(0, 0, 0, 0.25); + border-radius: 4px; + background: rgba(255, 255, 255, 0.85); + color: black; + font-size: 18px; + line-height: 1; cursor: default; +} +button#menubutton:hover { + background: white; +} +div#menu { + position: fixed; + top: 44px; + right: 8px; + z-index: 2; + min-width: 12em; + padding: 4px 0; + border: 1px solid rgba(0, 0, 0, 0.25); + border-radius: 4px; + background: white; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.25); + text-align: left; +} +div#menu > .entry { + display: block; + width: 100%; + box-sizing: border-box; + padding: 6px 12px; + border: 0; + background: none; color: black; + font: inherit; + text-align: left; text-decoration: none; + cursor: default; +} +div#menu > .entry:hover { + background: #e0e0e0; +} +/* The label opens the picker. The input is taken out of sight, but not out of + the page: "display: none" would take it from the keyboard as well, and the + entry could then only be reached with a mouse. */ +div#menu > #openlabel > input { + position: absolute; + width: 1px; + height: 1px; + opacity: 0; } -div#toolbar > .button:hover { - background: #CCCCCC; +/* The entry the keyboard is on is drawn as the one the mouse is on. */ +div#menu > .entry:focus, +div#menu > #openlabel:focus-within { + background: #e0e0e0; + outline: 2px solid #0060df; + outline-offset: -2px; } -/* The label opens the picker, so the input itself is not shown. */ -div#toolbar > #openlabel > input { - display: none; +@media (prefers-color-scheme: dark) { + button#menubutton { + border-color: rgba(255, 255, 255, 0.25); + background: rgba(43, 42, 51, 0.85); + color: white; + } + button#menubutton:hover { + background: #2b2a33; + } + div#menu { + border-color: rgba(255, 255, 255, 0.25); + background: #2b2a33; + } + div#menu > .entry { + color: white; + } + div#menu > .entry:hover { + background: #52525e; + } + div#menu > .entry:focus, + div#menu > #openlabel:focus-within { + background: #52525e; + outline-color: #00ddff; + } } diff --git a/programs/opendocumentviewer-webext/viewer.html b/programs/opendocumentviewer-webext/viewer.html index 5bf32fc4e..075f6c376 100644 --- a/programs/opendocumentviewer-webext/viewer.html +++ b/programs/opendocumentviewer-webext/viewer.html @@ -6,17 +6,25 @@ -

- download this document - -
diff --git a/programs/benchmark/js/HTMLBenchmark.js b/programs/benchmark/js/HTMLBenchmark.js index b92373337..132609407 100644 --- a/programs/benchmark/js/HTMLBenchmark.js +++ b/programs/benchmark/js/HTMLBenchmark.js @@ -27,6 +27,7 @@ define([ "Benchmark", "HTMLResultsRenderer", + "HTMLMatrixRenderer", "OpenDocument", "EnterEditMode", "MoveCursorToEndDirect", @@ -41,7 +42,7 @@ define([ "MoveCursorToEnd", "MoveCursorToStart", "SaveDocument" -], function (Benchmark, HTMLResultsRenderer, +], function (Benchmark, HTMLResultsRenderer, HTMLMatrixRenderer, OpenDocument, EnterEditMode, MoveCursorToEndDirect,InsertLetterA, RemovePositions, MoveCursorLeft, SelectEntireDocument, RemoveCurrentSelection, PreloadDocument, BoldCurrentSelection, AlignCurrentSelectionJustified, MoveCursorToEnd, MoveCursorToStart, SaveDocument) { @@ -73,17 +74,33 @@ define([ /** * Extract supported benchmark options from the url query parameters - * @return {!{fileUrl: !string, includeSlow: !boolean, colour: (string|undefined)}} + * @return {!{fileUrls: !Array., includeSlow: !boolean, + * colour: (string|undefined), matrix: !boolean}} */ function getConfiguration() { var params = getQueryParams(); return { - /** Test document to load. Relative or absolute urls are supported */ - fileUrl: params.fileUrl || "100pages.odt", - /** Include known slow actions in the benchmark. These can take 10 or more minutes each on large docs */ - includeSlow: params.includeSlow === "false" ? false : true, + /** + * Test documents to load, one after the other, separated by + * commas. Relative or absolute urls are supported. One document + * is measured unless others are named, as the four of them take + * minutes: "all.html" names them, see "README-Building.md". + */ + fileUrls: (params.fileUrl || "100pages.odt").split(","), + /** + * Include the known slow actions in the benchmark. They take a + * minute on a hundred pages and far more on a thousand, as one + * operation is made for each paragraph of the selection, and they + * are left out by "includeSlow=false" when the wait is too long. + */ + includeSlow: params.includeSlow !== "false", /** Background colour of the benchmark results. Useful for distinguishing different benchmark versions */ - colour: params.colour + colour: params.colour, + /** + * One table of an action to a line and a document to a column, + * rather than the actions of a document one under the other. + */ + matrix: params.layout === "matrix" }; } @@ -95,40 +112,95 @@ define([ var loadingScreenElement = document.getElementById('loadingScreen'), canvasElement = document.getElementById("canvas"), benchmarkResultsElement = document.getElementById("benchmarkResults").getElementsByTagName("tbody")[0], + benchmarkHeadElement = document.getElementById("benchmarkResults").getElementsByTagName("thead")[0], versionElement = document.getElementById("version"), config = getConfiguration(), - benchmark = new Benchmark(canvasElement), - renderer = new HTMLResultsRenderer(benchmark, benchmarkResultsElement); + documents = config.fileUrls.slice(), + matrix = null, + column = -1, + self = this; versionElement.textContent = webodf.Version; - renderer.setBackgroundColour(config.colour); - loadingScreenElement.style.display = "none"; - benchmark.actions.push(new PreloadDocument(config.fileUrl)); - benchmark.actions.push(new OpenDocument(config.fileUrl)); - benchmark.actions.push(new EnterEditMode()); - benchmark.actions.push(new MoveCursorToEnd()); - benchmark.actions.push(new MoveCursorToStart()); - benchmark.actions.push(new InsertLetterA(100)); - benchmark.actions.push(new RemovePositions(100, true)); - benchmark.actions.push(new MoveCursorToEndDirect()); - benchmark.actions.push(new InsertLetterA(1)); - benchmark.actions.push(new InsertLetterA(100)); - benchmark.actions.push(new RemovePositions(1, true)); - benchmark.actions.push(new MoveCursorLeft(1)); - benchmark.actions.push(new MoveCursorLeft(100)); - benchmark.actions.push(new RemovePositions(1, false)); - benchmark.actions.push(new RemovePositions(100, true)); - benchmark.actions.push(new SelectEntireDocument()); - benchmark.actions.push(new BoldCurrentSelection()); - benchmark.actions.push(new AlignCurrentSelectionJustified()); - benchmark.actions.push(new SaveDocument()); - if (config.includeSlow) { - benchmark.actions.push(new RemoveCurrentSelection()); + /** + * A line that says which document the rows under it belong to. + * @param {!string} fileUrl + * @return {undefined} + */ + function writeHeading(fileUrl) { + var row = document.createElement("tr"), + cell = document.createElement("th"); + cell.colSpan = 5; + cell.textContent = fileUrl; + cell.style.textAlign = "left"; + cell.style.paddingTop = "1em"; + row.appendChild(cell); + benchmarkResultsElement.appendChild(row); + } + + /** + * @param {!string} fileUrl + * @param {!function():undefined} callback + * @return {undefined} + */ + function runOne(fileUrl, callback) { + var benchmark = new Benchmark(canvasElement), + renderer; + + if (config.matrix) { + column += 1; + } else { + renderer = new HTMLResultsRenderer(benchmark, benchmarkResultsElement); + renderer.setBackgroundColour(config.colour); + writeHeading(fileUrl); + } + + benchmark.actions.push(new PreloadDocument(fileUrl)); + benchmark.actions.push(new OpenDocument(fileUrl)); + benchmark.actions.push(new EnterEditMode()); + benchmark.actions.push(new MoveCursorToEnd()); + benchmark.actions.push(new MoveCursorToStart()); + benchmark.actions.push(new InsertLetterA(100)); + benchmark.actions.push(new RemovePositions(100, true)); + benchmark.actions.push(new MoveCursorToEndDirect()); + benchmark.actions.push(new InsertLetterA(1)); + benchmark.actions.push(new InsertLetterA(100)); + benchmark.actions.push(new RemovePositions(1, true)); + benchmark.actions.push(new MoveCursorLeft(1)); + benchmark.actions.push(new MoveCursorLeft(100)); + benchmark.actions.push(new RemovePositions(1, false)); + benchmark.actions.push(new RemovePositions(100, true)); + benchmark.actions.push(new SelectEntireDocument()); + benchmark.actions.push(new BoldCurrentSelection()); + benchmark.actions.push(new AlignCurrentSelectionJustified()); + benchmark.actions.push(new SaveDocument()); + if (config.includeSlow) { + benchmark.actions.push(new RemoveCurrentSelection()); + } + + if (config.matrix) { + matrix.follow(benchmark, column); + } + benchmark.subscribe("complete", callback); + benchmark.start(); + } + + // The documents are measured one after the other, in one table: a run + // is read as a whole, and two runs are compared line by line. + function runNext() { + var fileUrl = documents.shift(); + if (fileUrl) { + runOne(fileUrl, runNext); + } + } + + if (config.matrix) { + matrix = new HTMLMatrixRenderer(benchmarkResultsElement, + benchmarkHeadElement, config.fileUrls); } - this.start = benchmark.start; + self.start = runNext; } return HTMLBenchmark; diff --git a/programs/benchmark/js/HTMLMatrixRenderer.js b/programs/benchmark/js/HTMLMatrixRenderer.js new file mode 100644 index 000000000..e5530eb24 --- /dev/null +++ b/programs/benchmark/js/HTMLMatrixRenderer.js @@ -0,0 +1,106 @@ +/** + * Copyright (C) 2026 Daniel Berthereau + * + * @licstart + * This file is part of WebODF. + * + * WebODF is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License (GNU AGPL) + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * WebODF is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with WebODF. If not, see . + * @licend + * + * @source: http://www.webodf.org/ + * @source: https://github.com/kogmbh/WebODF/ + */ + +/*global define, document*/ + +define(function () { + "use strict"; + + /** + * The four documents in one table: an action to a line, a document to a + * column, and the time it took in the cell. A run is then read across, from + * a page to a thousand, which is what a benchmark is for. + * @constructor + * @param {!HTMLTableElement} outputTable + * @param {!HTMLElement} outputHead + * @param {!Array.} fileUrls + */ + function HTMLMatrixRenderer(outputTable, outputHead, fileUrls) { + var rows = {}; + + function writeHead() { + var row = document.createElement("tr"), + cell = document.createElement("td"); + cell.className = "action"; + cell.textContent = "Action"; + row.appendChild(cell); + fileUrls.forEach(function (fileUrl) { + var column = document.createElement("td"); + column.className = "elapsed"; + column.textContent = fileUrl.replace(/\.odt$/, ""); + row.appendChild(column); + }); + outputHead.textContent = ""; + outputHead.appendChild(row); + } + + /** + * The line of an action is made when the first document reaches it, and + * the ones after it fill their own cell of that same line. + * @param {!number} index + * @param {!string} description + * @return {!HTMLTableRowElement} + */ + function rowOf(index, description) { + var row, cell, i; + if (!rows.hasOwnProperty(index)) { + row = document.createElement("tr"); + cell = document.createElement("td"); + // The name of the document is in the head of its column, so + // it is taken out of the line, that holds for all of them. + cell.textContent = (index + 1) + ". " + + description.replace(/\s+\S+\.odt$/, ""); + row.appendChild(cell); + for (i = 0; i < fileUrls.length; i += 1) { + row.appendChild(document.createElement("td")); + } + outputTable.appendChild(row); + rows[index] = row; + } + return rows[index]; + } + + /** + * @param {!Benchmark} benchmark + * @param {!number} column + * @return {undefined} + */ + this.follow = function (benchmark, column) { + benchmark.actions.forEach(function (action, index) { + var row = rowOf(index, action.state.description), + cell = row.cells[column + 1]; + cell.textContent = "…"; + action.subscribe("complete", function (state) { + cell.textContent = state.status + ? state.elapsedTime + : "failed"; + }); + }); + }; + + writeHead(); + } + + return HTMLMatrixRenderer; +}); diff --git a/programs/benchmark/libexec/bundle.js b/programs/benchmark/libexec/bundle.js new file mode 100644 index 000000000..c06cd39f5 --- /dev/null +++ b/programs/benchmark/libexec/bundle.js @@ -0,0 +1,92 @@ +/** + * Copyright (C) 2026 Daniel Berthereau + * + * @licstart + * This file is part of WebODF. + * + * WebODF is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License (GNU AGPL) + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * WebODF is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with WebODF. If not, see . + * @licend + * + * @source: http://www.webodf.org/ + * @source: https://github.com/kogmbh/WebODF/ + */ + +/*global require, process, console*/ + +// The modules of the benchmark are written for AMD, which the closure compiler +// carried until it dropped it: the option "--transform_amd_modules" is not one +// it knows any more. They are gathered here instead, each under the name of its +// file, with the few lines that resolve them at the end. Nothing is compiled: a +// benchmark measures the library, not itself. +// +// Usage: node libexec/bundle.js js benchmark.js +var fs = require("fs"), + path = require("path"); + +/** + * @param {!string} dir + * @param {!string} output + * @return {undefined} + */ +function bundle(dir, output) { + "use strict"; + var names = fs.readdirSync(dir).filter(function (name) { + return name.slice(-3) === ".js"; + }).sort(), + parts = [`(function () { + "use strict"; + var factories = {}, modules = {}; + function define(name, deps, factory) { + if (factory === undefined) { + factory = deps; + deps = []; + } + factories[name] = {deps: deps, factory: factory}; + } + function need(name) { + var module = factories[name]; + if (!modules.hasOwnProperty(name)) { + modules[name] = module.factory.apply(null, module.deps.map(need)); + } + return modules[name]; + } +`] + + names.forEach(function (name) { + var module = name.slice(0, -3), + source = fs.readFileSync(path.join(dir, name), "utf8"), + at = source.indexOf("define("); + if (at === -1) { + return; + } + // The call of the module is named after its file, as a loader of AMD + // names it after the address it read it from. + parts.push(`${source.slice(0, at)}define(${JSON.stringify(module)}, ` + + source.slice(at + "define(".length)); + }); + + // The page starts the benchmark itself, so the module of the entry is + // handed to it. It used to be named "module$HTMLBenchmark", the name the + // closure compiler gave a module of AMD. + parts.push(` window.HTMLBenchmark = need("HTMLBenchmark"); +}()); +`); + fs.writeFileSync(output, parts.join("")); +} + +if (process.argv.length !== 4) { + console.log("Usage: node libexec/bundle.js "); + process.exit(1); +} +bundle(process.argv[2], process.argv[3]); diff --git a/webodf/tools/updateJS.js b/webodf/tools/updateJS.js index 2171442ab..e3d7e867f 100644 --- a/webodf/tools/updateJS.js +++ b/webodf/tools/updateJS.js @@ -586,9 +586,14 @@ function Main(cmakeListPath) { path, license, licenses = {}, - // files for which jslint is not run + // files for which jslint is not run. The jslint that is kept here + // is the one of 2014, that reads the javascript of the library, + // which has to run in older engines as well; a script that only + // runs in node is written in the javascript of today, that jslint + // stops at. jslintExceptions = [ "lib/externs/JSZip.js", + "../programs/benchmark/libexec/bundle.js", "../programs/editor/plugins/bella/seedrandom.js"].map(pathModule.normalize), // files for which the license is not checked licenseExceptions = [ From 2819d7cfe45bb9ffe7b92f9351dd87ace8495090 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 221/385] Written on the next page what a page cannot hold and cannot cut. --- webodf/lib/odf/TextLayout.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 376111844..31b1f8598 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2922,6 +2922,12 @@ odf.TextLayout = function TextLayout() { } if (more) { sent.unshift(more); + } else if (over !== box.firstElementChild) { + // Nothing of it can be cut, a heading or a line of one + // word: it is written whole on the page that follows, + // unless the page holds nothing else. + sent.unshift(over); + box.removeChild(over); } if (sent.length === 0) { guard = 0; From 9574092d59199a81988dd728e98e3ad551aacea9 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 222/385] Clarified distinction between left/right page. --- webodf/lib/odf/TextLayout.js | 55 ++++++++++++++++++++++++++++++------ 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 587d0d90e..d95f0d90f 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -70,7 +70,9 @@ odf.TextLayout = function TextLayout() { header: {height: 0, gap: 0}, footer: {height: 0, gap: 0}, headerNode: null, - footerNode: null + footerNode: null, + headerLeftNode: null, + footerLeftNode: null }; /** * Read a length of the page layout, in pixels, and fall back on the given @@ -183,6 +185,12 @@ odf.TextLayout = function TextLayout() { : null, footerNode: masterPage ? domUtils.getDirectChild(masterPage, stylens, "footer") + : null, + headerLeftNode: masterPage + ? domUtils.getDirectChild(masterPage, stylens, "header-left") + : null, + footerLeftNode: masterPage + ? domUtils.getDirectChild(masterPage, stylens, "footer-left") : null }; // One margin for the four sides, or one by side. @@ -205,10 +213,10 @@ odf.TextLayout = function TextLayout() { // The header and the footer are written inside the margins of the // page, between its edge and the text: the text has that much less // room, and the margins of the layout hold it away from them. - if (dims.headerNode) { + if (dims.headerNode || dims.headerLeftNode) { dims.marginTop += dims.header.height + dims.header.gap; } - if (dims.footerNode) { + if (dims.footerNode || dims.footerLeftNode) { dims.marginBottom += dims.footer.height + dims.footer.gap; } return dims; @@ -382,6 +390,26 @@ odf.TextLayout = function TextLayout() { fields[i].textContent = String(pages); } } + /** + * The header or the footer a page carries. A master page may write one for + * the pages on the left and another for the pages on the right, which is + * how a book puts the number of the page on the outer edge: the first page + * is a right one, so the pages of an even number are the left ones. Where + * "style:header-left" is not written, the header of the master page is the + * one of every page, see the part 1 of the standard, "style:header-left". + * @param {!odf.TextLayout.PageDimensions} dims + * @param {!string} which "header" or "footer" + * @param {!number} page the number of the page, from one + * @return {?Element} + */ + function pageArea(dims, which, page) { + var left = which === "header" ? dims.headerLeftNode : dims.footerLeftNode, + right = which === "header" ? dims.headerNode : dims.footerNode; + if (page % 2 === 0 && left) { + return left; + } + return right; + } /** * Draw the header and the footer of every page. * @@ -398,6 +426,10 @@ odf.TextLayout = function TextLayout() { pages = countPages(pagesDiv), /**@type{!HTMLDivElement}*/ box, + /**@type{?Element}*/ + header, + /**@type{?Element}*/ + footer, top, n; while (pagesDiv.lastChild @@ -405,12 +437,15 @@ odf.TextLayout = function TextLayout() { === "webodf-pageFurniture") { pagesDiv.removeChild(pagesDiv.lastChild); } - if (!dims.headerNode && !dims.footerNode) { + if (!dims.headerNode && !dims.footerNode + && !dims.headerLeftNode && !dims.footerLeftNode) { return; } for (n = 0; n < pages; n += 1) { top = n * (dims.pageHeight + dims.pageSeparation); - if (dims.headerNode) { + header = pageArea(dims, "header", n + 1); + footer = pageArea(dims, "footer", n + 1); + if (header) { box = /**@type{!HTMLDivElement}*/(doc.createElementNS(htmlns, "div")); box.className = "webodf-pageFurniture"; @@ -423,10 +458,10 @@ odf.TextLayout = function TextLayout() { // two lines where one was asked for grows into the margin // rather than being cut. box.style.minHeight = dims.header.height + "px"; - fillPageArea(dims.headerNode, box, n + 1, pages); + fillPageArea(header, box, n + 1, pages); pagesDiv.appendChild(box); } - if (dims.footerNode) { + if (footer) { box = /**@type{!HTMLDivElement}*/(doc.createElementNS(htmlns, "div")); box.className = "webodf-pageFurniture"; @@ -436,7 +471,7 @@ odf.TextLayout = function TextLayout() { box.style.top = (top + dims.pageHeight - dims.marginBottom + dims.footer.gap) + "px"; box.style.minHeight = dims.footer.height + "px"; - fillPageArea(dims.footerNode, box, n + 1, pages); + fillPageArea(footer, box, n + 1, pages); pagesDiv.appendChild(box); } } @@ -478,6 +513,8 @@ odf.TextLayout.PageArea; header:!odf.TextLayout.PageArea, footer:!odf.TextLayout.PageArea, headerNode:?Element, - footerNode:?Element + footerNode:?Element, + headerLeftNode:?Element, + footerLeftNode:?Element }}*/ odf.TextLayout.PageDimensions; From d78c2562570b69636baa916b566e979379637708 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 223/385] Told that a document does not fit the schema, instead of an object. --- webodf/lib/xmldom/RelaxNG.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/webodf/lib/xmldom/RelaxNG.js b/webodf/lib/xmldom/RelaxNG.js index 4b207a56d..c468941ef 100644 --- a/webodf/lib/xmldom/RelaxNG.js +++ b/webodf/lib/xmldom/RelaxNG.js @@ -804,8 +804,12 @@ xmldom.RelaxNG = function RelaxNG() { walker.currentNode = walker.root; errors = childDeriv(null, rootPattern, walker); if (!errors.nullable) { - runtime.log("Error in Relax NG validation: " + errors); - callback(["Error in Relax NG validation: " + errors]); + // What is left is a pattern that was not matched, not a place: the + // validator derives the patterns as it walks and keeps no track of + // where it was, so it tells that the document does not fit the + // schema and no more. Writing the object itself only ever gave + // "[object Object]". + callback(["The document does not conform to the schema."]); } else { callback(null); } From b4f8b2b683a430d00e45bb81d890d5f6d34dc433 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 224/385] Read what an element holds rather than what it says of itself, to cut it. --- webodf/lib/odf/TextLayout.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 31b1f8598..6d5154347 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2496,9 +2496,10 @@ odf.TextLayout = function TextLayout() { next, /**@type{!ClientRect}*/ rect; - if (element.getBoundingClientRect().bottom <= bottom) { - return null; - } + // What the element itself says of its size is not read: a section + // and a list of the standard are drawn of no height at all while + // what they hold is drawn under them, and nothing of them would + // ever be cut. The children answer for it. while (node && !from && !inner) { rect = node.nodeType === Node.TEXT_NODE ? rangeOf(doc, node).getBoundingClientRect() From 7046e55df9d86d87c374eb3fc170a40941f6d9ed Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 225/385] Clarified distinction between first/next pages. --- webodf/lib/odf/TextLayout.js | 127 ++++++++++++++++++++++++++++------- 1 file changed, 101 insertions(+), 26 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index d95f0d90f..35b23777e 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -69,10 +69,10 @@ odf.TextLayout = function TextLayout() { pageSeparation: pageSeparation, header: {height: 0, gap: 0}, footer: {height: 0, gap: 0}, - headerNode: null, - footerNode: null, - headerLeftNode: null, - footerLeftNode: null + firstPage: {header: null, footer: null, headerLeft: null, + footerLeft: null, headerFirst: null, footerFirst: null}, + otherPages: {header: null, footer: null, headerLeft: null, + footerLeft: null, headerFirst: null, footerFirst: null} }; /** * Read a length of the page layout, in pixels, and fall back on the given @@ -123,6 +123,66 @@ odf.TextLayout = function TextLayout() { } return area; } + /** + * What a master page writes at the top and at the bottom of a page. + * @param {?Element} masterPage + * @return {!odf.TextLayout.PageFurniture} + */ + function readFurniture(masterPage) { + /** + * @param {!string} name + * @return {?Element} + */ + function child(name) { + return masterPage + ? domUtils.getDirectChild(masterPage, stylens, name) + : null; + } + return { + header: child("header"), + footer: child("footer"), + headerLeft: child("header-left"), + footerLeft: child("footer-left"), + headerFirst: child("header-first"), + footerFirst: child("footer-first") + }; + } + /** + * @param {!odf.TextLayout.PageFurniture} furniture + * @return {!boolean} + */ + function hasFurniture(furniture) { + return Boolean(furniture.header || furniture.footer + || furniture.headerLeft || furniture.footerLeft + || furniture.headerFirst || furniture.footerFirst); + } + /** + * The master page a document names after the first one: a title page is + * written with a master page of its own, that hands the pages that follow + * to another one by "style:next-style-name". + * @param {!odf.ODFDocumentElement} odfroot + * @param {?Element} masterPage + * @return {?Element} + */ + function nextMasterPage(odfroot, masterPage) { + var name = masterPage + && masterPage.getAttributeNS(stylens, "next-style-name"), + masterPages = odfroot.masterStyles.getElementsByTagNameNS(stylens, + "master-page"), + /**@type{!Element}*/ + page, + i; + if (!name || name === masterPage.getAttributeNS(stylens, "name")) { + return null; + } + for (i = 0; i < masterPages.length; i += 1) { + page = /**@type{!Element}*/(masterPages[i]); + if (page.getAttributeNS(stylens, "name") === name) { + return page; + } + } + return null; + } /** * The size of a page, read from the page layout the first master page * names. A text document has one master page in all but the rarest cases, @@ -180,18 +240,9 @@ odf.TextLayout = function TextLayout() { pageSeparation: pageSeparation, header: readPageArea(pageLayout, "header-style", "margin-bottom"), footer: readPageArea(pageLayout, "footer-style", "margin-top"), - headerNode: masterPage - ? domUtils.getDirectChild(masterPage, stylens, "header") - : null, - footerNode: masterPage - ? domUtils.getDirectChild(masterPage, stylens, "footer") - : null, - headerLeftNode: masterPage - ? domUtils.getDirectChild(masterPage, stylens, "header-left") - : null, - footerLeftNode: masterPage - ? domUtils.getDirectChild(masterPage, stylens, "footer-left") - : null + firstPage: readFurniture(masterPage), + otherPages: readFurniture(nextMasterPage(odfroot, masterPage) + || masterPage) }; // One margin for the four sides, or one by side. if (properties.getAttributeNS(fons, "margin")) { @@ -213,10 +264,17 @@ odf.TextLayout = function TextLayout() { // The header and the footer are written inside the margins of the // page, between its edge and the text: the text has that much less // room, and the margins of the layout hold it away from them. - if (dims.headerNode || dims.headerLeftNode) { + // The room a header takes is the room it takes on every page: the + // pages of a document are of one height, and a title page that carries + // no header is drawn with the same text area as the others. + if (dims.otherPages.header || dims.otherPages.headerLeft + || dims.otherPages.headerFirst || dims.firstPage.header + || dims.firstPage.headerLeft || dims.firstPage.headerFirst) { dims.marginTop += dims.header.height + dims.header.gap; } - if (dims.footerNode || dims.footerLeftNode) { + if (dims.otherPages.footer || dims.otherPages.footerLeft + || dims.otherPages.footerFirst || dims.firstPage.footer + || dims.firstPage.footerLeft || dims.firstPage.footerFirst) { dims.marginBottom += dims.footer.height + dims.footer.gap; } return dims; @@ -397,14 +455,23 @@ odf.TextLayout = function TextLayout() { * is a right one, so the pages of an even number are the left ones. Where * "style:header-left" is not written, the header of the master page is the * one of every page, see the part 1 of the standard, "style:header-left". + * + * A first page may carry a header of its own, "style:header-first", which + * the standard added in 1.3 and which the office suites of today write + * where a title page was written with a master page of its own before. * @param {!odf.TextLayout.PageDimensions} dims * @param {!string} which "header" or "footer" * @param {!number} page the number of the page, from one * @return {?Element} */ function pageArea(dims, which, page) { - var left = which === "header" ? dims.headerLeftNode : dims.footerLeftNode, - right = which === "header" ? dims.headerNode : dims.footerNode; + var furniture = page === 1 ? dims.firstPage : dims.otherPages, + first = which === "header" ? furniture.headerFirst : furniture.footerFirst, + left = which === "header" ? furniture.headerLeft : furniture.footerLeft, + right = which === "header" ? furniture.header : furniture.footer; + if (page === 1 && first) { + return first; + } if (page % 2 === 0 && left) { return left; } @@ -437,8 +504,7 @@ odf.TextLayout = function TextLayout() { === "webodf-pageFurniture") { pagesDiv.removeChild(pagesDiv.lastChild); } - if (!dims.headerNode && !dims.footerNode - && !dims.headerLeftNode && !dims.footerLeftNode) { + if (!hasFurniture(dims.firstPage) && !hasFurniture(dims.otherPages)) { return; } for (n = 0; n < pages; n += 1) { @@ -497,6 +563,16 @@ odf.TextLayout = function TextLayout() { } this.layout = layout; }; +/**@typedef{{ + header:?Element, + footer:?Element, + headerLeft:?Element, + footerLeft:?Element, + headerFirst:?Element, + footerFirst:?Element +}}*/ +odf.TextLayout.PageFurniture; + /**@typedef{{ height:!number, gap:!number @@ -512,9 +588,8 @@ odf.TextLayout.PageArea; pageSeparation:!number, header:!odf.TextLayout.PageArea, footer:!odf.TextLayout.PageArea, - headerNode:?Element, - footerNode:?Element, - headerLeftNode:?Element, - footerLeftNode:?Element + firstPage:!odf.TextLayout.PageFurniture, + otherPages:!odf.TextLayout.PageFurniture }}*/ odf.TextLayout.PageDimensions; + From d49d403820921a725d5f3f3a189425206b8638d4 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 226/385] Told in android what the viewer is, from the page that asks for a document. --- .../src/main/assets/index.html | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/programs/opendocumentviewer-android/src/main/assets/index.html b/programs/opendocumentviewer-android/src/main/assets/index.html index 0beabaa31..9c312f6f4 100644 --- a/programs/opendocumentviewer-android/src/main/assets/index.html +++ b/programs/opendocumentviewer-android/src/main/assets/index.html @@ -5,17 +5,30 @@ OpenDocument Viewer + + + - Touch to open a document - Text (.odt), spreadsheets (.ods) and presentations (.odp) of - LibreOffice and OpenOffice, in the OpenDocument format: the first format - of office documents approved as an international standard, and the only - one that belongs to no company. + Touch to open a + document + Text (.odt), spreadsheets (.ods) and + presentations (.odp) of LibreOffice and of every other office suite, in + the OpenDocument format: the first format of office documents approved as + an international standard, and the only one that is shareable, lasting + and independent of any company. + About + this viewer
- - From 9ed1d298c9b3c4b5061ffa1c621e1928516a9fa5 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 227/385] Broken a text into pages a few at a time, and given the first of them at once. --- webodf/lib/odf/OdfCanvas.js | 3 + webodf/lib/odf/TextLayout.js | 559 ++++++++++++++++++++--------------- 2 files changed, 330 insertions(+), 232 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index c38c7401f..0a566e479 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -3958,7 +3958,10 @@ // after them, and the fonts it asks for, may make a page // hold one line less, and they are broken again then, once. runtime.setTimeout(function () { + // A text that is still being broken sets its own pages + // right when it is done, so nothing is asked of it here. if (paginated && pagesDiv && pagesDiv.parentNode + && !textLayout.isBreaking() && !textLayout.pagesFit(odfnode)) { textLayout.repair(odfnode, /**@type{!HTMLDivElement}*/(pagesDiv)); diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 6d5154347..fac924739 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -108,6 +108,19 @@ odf.TextLayout = function TextLayout() { * @type{?PagePlan} */ lastPlan = null, + /** + * The breaking of a text into pages that is under way, if any: it is + * done a few pages at a time, so that a reader is given the first of + * them at once. + * @type{?odf.TextLayout.Filling} + */ + filling = null, + /**@type{?odf.ODFDocumentElement}*/ + fillingRoot = null, + /**@type{?HTMLDivElement}*/ + fillingDiv = null, + /**@type{!number}*/ + fillingRound = 0, /** * How many pages the text was broken into, when it is broken into * columns: there is no chain of boxes to count them there. @@ -1536,9 +1549,11 @@ odf.TextLayout = function TextLayout() { * @param {!PagePlan} plan * @param {!HTMLDivElement} pagesDiv * @param {!Object.} meta what the document says of itself + * @param {!number=} from the first page to draw, where the pages that + * went before it are already drawn * @return {undefined} */ - function drawPageFurniture(odfroot, plan, pagesDiv, meta) { + function drawPageFurniture(odfroot, plan, pagesDiv, meta, from) { var /**@type{!Document}*/ doc = /**@type{!Document}*/(pagesDiv.ownerDocument), /**@type{?string}*/ @@ -1563,15 +1578,20 @@ odf.TextLayout = function TextLayout() { /**@type{!number}*/ top = 0, /**@type{!number}*/ + first = 0, + /**@type{!number}*/ n; - removeBoxes(pagesDiv); - removeBoxes(behind); + first = from || 0; + if (first === 0) { + removeBoxes(pagesDiv); + removeBoxes(behind); + } // The body no longer paints the ground of the whole text: each page // is painted on its own, see the rule of "office|body" in // "webodf.css". A class would not do, as the engine of the styles // reads none on an element of another namespace. behind.setAttributeNS(webodfhelperns, "paginated", "true"); - for (n = 0; n < pages; n += 1) { + for (n = first; n < pages; n += 1) { dims = plan.at(n); // A page stands under the one before it when the text is one run // of text, and beside it when the text is broken into columns, @@ -2555,44 +2575,180 @@ odf.TextLayout = function TextLayout() { * @param {!PagePlan} plan * @return {!number} how many pages the text was broken into */ - function breakIntoPages(odfroot, plan) { - var text = /**@type{!Element}*/(odfroot.body.lastElementChild), - doc = /**@type{!Document}*/(text.ownerDocument), - htmlns = doc.documentElement.namespaceURI, - sheet = ownStyleSheet(doc), - /**@type{!Array.}*/ - waiting = [], - /**@type{!DocumentFragment}*/ - store, - /**@type{!number}*/ - chunk = 8, + /** + * Fill one page, and answer with the page that was filled. + * + * The paragraphs are taken from what waits to be written, several at a + * time and read once: a page holds many of them, and each measure has + * the browser lay the page out again. What was written too much is taken + * back and written one at a time, and what crosses the end of the page + * is cut there. + * @param {!odf.TextLayout.Filling} state + * @return {undefined} + */ + function fillOnePage(state) { + var doc = state.doc, + /**@type{!odf.TextLayout.PageDimensions}*/ + dims = /**@type{!PagePlan}*/(state.plan).at(state.page), + /**@type{!Element}*/ + box = /**@type{!Element}*/(doc.createElementNS(state.htmlns, + "div")), /**@type{!Array.}*/ - added = [], + added, /**@type{?Node}*/ taken, - /**@type{!number}*/ - guard = 0, + /**@type{?Node}*/ + node, /**@type{?Element}*/ - more = null, + rest, /**@type{?Element}*/ - over = null, - + more, + /**@type{?Element}*/ + over, /**@type{!Array.}*/ - sent = [], + sent, + /**@type{?Node}*/ + walk, + /**@type{?Node}*/ + next, /**@type{!number}*/ - held = 0, + held, /**@type{!number}*/ - top = 0, + guard, /**@type{!number}*/ - page = 0, - /**@type{!Element}*/ - box, - /**@type{!odf.TextLayout.PageDimensions}*/ - dims, - /**@type{?Node}*/ - node, - /**@type{?Element}*/ - rest, + n; + box.className = "webodf-pageBox"; + /**@type{!HTMLElement}*/(box).style.width = + (dims.pageWidth - dims.marginLeft - dims.marginRight) + "px"; + /**@type{!HTMLElement}*/(box).style.height = + (dims.pageHeight - dims.marginTop - dims.marginBottom) + "px"; + // A page is set at the place of the page it is, and not left to + // follow the one before it: the margin of the foot of a page and the + // margin of the head of the next fall into one another where margins + // are used, and the pages would stand closer than the sheets they + // are drawn on. + /**@type{!HTMLElement}*/(box).style.position = "absolute"; + /**@type{!HTMLElement}*/(box).style.left = dims.marginLeft + "px"; + /**@type{!HTMLElement}*/(box).style.top = (state.top + dims.marginTop) + + "px"; + state.top += dims.pageHeight + dims.pageSeparation; + state.text.appendChild(box); + while (state.waiting.length > 0) { + added = /**@type{!Array.}*/([]); + while (added.length < state.chunk && state.waiting.length > 0) { + node = /**@type{!Node}*/(state.waiting.shift()); + box.appendChild(node); + added.push(node); + } + if (overflows(box) && added.length > 1) { + while (added.length > 0) { + taken = /**@type{!Node}*/(added.pop()); + if (taken) { + box.removeChild(taken); + state.waiting.unshift(taken); + } + } + state.chunk = 1; + } + if (added.length === 0 || !overflows(box)) { + node = null; + } else { + node = /**@type{!Node}*/(added[added.length - 1]); + if (node.nodeType === Node.ELEMENT_NODE) { + held = String(node.textContent).length; + rest = cutElement(box, /**@type{!Element}*/(node), 8, + box.childNodes.length === 1); + if (rest && String(rest.textContent).length >= held + && held > 0) { + // Nothing of it was left on the page, so cutting it + // gains nothing: it is written whole, here if the + // page holds nothing else and on the next page + // otherwise, or it would be cut for ever and never + // written. + while (rest.firstChild) { + node.appendChild(rest.firstChild); + } + rest = null; + } + if (rest) { + state.waiting.unshift(rest); + } else if (box.childNodes.length > 1) { + box.removeChild(node); + state.waiting.unshift(node); + } + } else if (box.childNodes.length > 1) { + // What is not an element is written whole, on this page + // when the page is empty and on the next when it is not. + box.removeChild(node); + state.waiting.unshift(node); + } + node = null; + break; + } + } + // The page is read once it is filled: the first thing that crosses + // its end is cut there, and what was written after it goes to the + // next page with what was cut off. + guard = 2; + over = firstOverflowing(box); + while (guard > 0 && over) { + held = String(over.textContent).length; + more = cutElement(box, over, 8, over === box.firstElementChild); + if (more && String(more.textContent).length >= held + && held > 0) { + while (more.firstChild) { + over.appendChild(more.firstChild); + } + more = null; + } + sent = []; + walk = over.nextSibling; + while (walk) { + next = walk.nextSibling; + sent.push(walk); + box.removeChild(walk); + walk = next; + } + if (more) { + sent.unshift(more); + } else if (over !== box.firstElementChild) { + sent.unshift(over); + box.removeChild(over); + } + if (sent.length === 0) { + guard = 0; + } else { + for (n = sent.length - 1; n >= 0; n -= 1) { + state.waiting.unshift(sent[n]); + } + guard -= 1; + over = firstOverflowing(box); + } + } + // The pages that follow are filled by as many at a time as the page + // that was just filled took: a page of a hundred short paragraphs is + // not read a hundred times. + state.chunk = Math.max(4, Math.min(64, + Math.floor(box.childNodes.length / 2))); + state.page += 1; + } + /** + * Make ready to break a text into pages: the rules the pages are drawn + * by are written, and what is to be written is taken out of the document + * while it is laid out, as a text that waits in the document is laid out + * again at every measure. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!PagePlan} plan + * @return {!odf.TextLayout.Filling} + */ + function startPages(odfroot, plan) { + var text = /**@type{!Element}*/(odfroot.body.lastElementChild), + doc = /**@type{!Document}*/(text.ownerDocument), + sheet = ownStyleSheet(doc), + /**@type{!DocumentFragment}*/ + store = doc.createDocumentFragment(), + /**@type{!Array.}*/ + waiting = [], /**@type{!number}*/ i; for (i = sheet.cssRules.length - 1; i >= 0; i -= 1) { @@ -2604,19 +2760,10 @@ odf.TextLayout = function TextLayout() { }); sheet.insertRule("@namespace webodfhelper url(" + webodfhelperns + ");", sheet.cssRules.length); - sheet.insertRule("office|text {height:auto;width:auto;margin:0;" - + "padding:0;}", sheet.cssRules.length); - // A page is shut off from the pages that went before it: what is - // written in one of them is laid out on its own, so that a page that - // is being filled does not have the whole document laid out again at - // every measure. + sheet.insertRule("office|text {width:auto;margin:0;padding:0;" + + "position:relative;}", sheet.cssRules.length); sheet.insertRule(".webodf-pageBox {overflow:hidden;}", sheet.cssRules.length); - // What is to be written is taken out of the document while it is - // laid out: what waits in the text is laid out again at every - // measure, and a document of a thousand pages would be laid out a - // thousand times over. - store = doc.createDocumentFragment(); while (text.firstChild) { store.appendChild(text.firstChild); } @@ -2624,160 +2771,18 @@ odf.TextLayout = function TextLayout() { waiting.push(store.firstChild); store.removeChild(store.firstChild); } - while (waiting.length > 0 && page < maxPages) { - dims = plan.at(page); - box = /**@type{!Element}*/(doc.createElementNS(htmlns, "div")); - box.className = "webodf-pageBox"; - /**@type{!HTMLElement}*/(box).style.width = - (dims.pageWidth - dims.marginLeft - dims.marginRight) + "px"; - /**@type{!HTMLElement}*/(box).style.height = - (dims.pageHeight - dims.marginTop - dims.marginBottom) + "px"; - // A page is set at the place of the page it is, and not left to - // follow the one before it: the margin of the foot of a page and - // the margin of the head of the next fall into one another where - // margins are used, and the pages would stand closer than the - // sheets they are drawn on. - /**@type{!HTMLElement}*/(box).style.position = "absolute"; - /**@type{!HTMLElement}*/(box).style.left = dims.marginLeft + "px"; - /**@type{!HTMLElement}*/(box).style.top = (top + dims.marginTop) - + "px"; - top += dims.pageHeight + dims.pageSeparation; - text.appendChild(box); - while (waiting.length > 0) { - // Several are written at once and read once: a page holds - // many paragraphs, and each measure has the browser lay the - // page out again. What was written too much is taken back - // and written one at a time. - added = /**@type{!Array.}*/([]); - while (added.length < chunk && waiting.length > 0) { - node = /**@type{!Node}*/(waiting.shift()); - box.appendChild(node); - added.push(node); - } - if (overflows(box) && added.length > 1) { - while (added.length > 0) { - taken = /**@type{!Node}*/(added.pop()); - if (taken) { - box.removeChild(taken); - waiting.unshift(taken); - } - } - chunk = 1; - } - if (added.length === 0) { - node = null; - } else if (!overflows(box)) { - node = null; - } else { - node = /**@type{!Node}*/(added[added.length - 1]); - if (node.nodeType === Node.ELEMENT_NODE) { - held = String(node.textContent).length; - rest = cutElement(box, /**@type{!Element}*/(node), 8, - box.childNodes.length === 1); - if (rest - && String(rest.textContent).length >= held - && held > 0) { - // Nothing of it was left on the page, so cutting - // it gains nothing: it is written whole, here if - // the page holds nothing else and on the next - // page otherwise, or it would be cut for ever - // and never written. - while (rest.firstChild) { - node.appendChild(rest.firstChild); - } - rest = null; - } - if (rest) { - waiting.unshift(rest); - // What is left may still cross the end of the - // page, a line of it at a time: it is cut again - // until it fits, or three times at the most. - guard = 3; - while (guard > 0 && overflows(box)) { - more = cutElement(box, - /**@type{!Element}*/(node), 8, - box.childNodes.length === 1); - if (!more) { - guard = 0; - } else { - while (more.firstChild) { - rest.insertBefore(more.firstChild, - rest.firstChild); - } - guard -= 1; - } - } - } else if (box.childNodes.length > 1) { - // Nothing of it fits and nothing of it can be - // cut, so it is written whole on the next page: - // a page that holds it alone keeps it, or it - // would be sent from page to page for ever. - box.removeChild(node); - waiting.unshift(node); - } - } else if (box.childNodes.length > 1) { - // What is not an element is written whole, on this - // page when the page is empty and on the next when - // it is not. - box.removeChild(node); - waiting.unshift(node); - } - node = null; - break; - } - } - // The page is read once it is filled: the first thing that - // crosses its end is cut there, and what was written after it - // goes to the next page with what was cut off. - guard = 2; - over = firstOverflowing(box); - while (guard > 0 && over) { - held = String(over.textContent).length; - more = cutElement(box, over, 8, - over === box.firstElementChild); - if (more && String(more.textContent).length >= held - && held > 0) { - // Cutting it gains nothing, so it is written whole: it - // would be cut for ever otherwise. - while (more.firstChild) { - over.appendChild(more.firstChild); - } - more = null; - } - sent = []; - node = over.nextSibling; - while (node) { - taken = node.nextSibling; - sent.push(node); - box.removeChild(node); - node = taken; - } - if (more) { - sent.unshift(more); - } - if (sent.length === 0) { - guard = 0; - } else { - waiting = /**@type{!Array.}*/( - sent.concat(waiting) - ); - guard -= 1; - over = firstOverflowing(box); - } - } - // The pages that follow are filled by as many at a time as the - // page that was just filled took: a page of a hundred short - // paragraphs is not read a hundred times. - chunk = Math.max(4, Math.min(64, - Math.floor(box.childNodes.length / 2))); - page += 1; - } - // The text is as tall as the pages it was broken into, so that what - // is drawn after it stands under them. - sheet.insertRule("office|text {height:" + Math.max(0, top - - plan.at(Math.max(0, page - 1)).pageSeparation) + "px;}", - sheet.cssRules.length); - return Math.max(1, page); + return { + text: text, + doc: doc, + htmlns: doc.documentElement.namespaceURI, + plan: plan, + waiting: waiting, + chunk: 8, + page: 0, + top: 0, + sheet: sheet, + heightRule: -1 + }; } /** * Draw a text over pages, breaking it into columns. @@ -2973,6 +2978,92 @@ odf.TextLayout = function TextLayout() { } columnPages = boxes.length; } + /** + * Whether every page holds what was written on it. + * + * A page is filled by measuring it, and what is drawn after the pages — + * the headers and the feet, the fonts they ask for — may change the + * width of a line and make a page hold one line less: a reader that + * asks this after the pages are drawn is told whether they are to be + * set right. + * @param {!odf.ODFDocumentElement} odfroot + * @return {!boolean} + */ + function pagesHold(odfroot) { + var text = odfroot.body.lastElementChild, + /**@type{?Element}*/ + node = text + ? text.firstElementChild + : null, + /**@type{!boolean}*/ + fits = true; + while (node && fits) { + if (node.className === "webodf-pageBox" + && firstOverflowing(node)) { + fits = false; + } + node = node.nextElementSibling; + } + return fits; + } + /** + * Break a few pages, draw them, and take up the rest later. + * @param {!number} round the layout this belongs to, so that a layout + * that went before does not go on drawing + * @return {undefined} + */ + function fillSlice(round) { + var end = new Date().getTime() + 150, + /**@type{!PagePlan}*/ + plan, + /**@type{!number}*/ + from; + if (round !== fillingRound || !filling || !fillingRoot + || !fillingDiv) { + return; + } + from = filling.page; + while (filling.waiting.length > 0 && filling.page < maxPages + && new Date().getTime() < end) { + fillOnePage(filling); + } + columnPages = Math.max(1, filling.page); + // The text is as tall as the pages it was broken into, so that what + // is drawn after it stands under them. + plan = /**@type{!PagePlan}*/(filling.plan); + // The text is as tall as the pages it holds so far, so that what is + // drawn after it stands under them. The rule is written anew at each + // turn and not added to: a sheet of a thousand rules is read again + // for each of them. + if (filling.heightRule >= 0 + && filling.heightRule < filling.sheet.cssRules.length) { + filling.sheet.deleteRule(filling.heightRule); + } + filling.heightRule = filling.sheet.cssRules.length; + filling.sheet.insertRule("office|text {height:" + Math.max(0, + filling.top - plan.at(Math.max(0, filling.page - 1)) + .pageSeparation) + "px;}", filling.heightRule); + drawPageFurniture(fillingRoot, plan, fillingDiv, + readMeta(fillingRoot), from); + if (filling.waiting.length > 0 && filling.page < maxPages) { + runtime.setTimeout(function () { + fillSlice(round); + }, 0); + return; + } + // The pages are all broken: what the headers and the feet, and the + // fonts they ask for, took from a page is given back to the page + // that follows it. + filling = null; + runtime.setTimeout(function () { + if (round === fillingRound && fillingRoot && fillingDiv + && !pagesHold(fillingRoot)) { + trimPages(fillingRoot, plan); + drawPageFurniture(fillingRoot, plan, fillingDiv, + readMeta(fillingRoot), 0); + } + }, 0); + } /** * Draw a text over pages laid one under another, each page a box of its * own that holds what the page holds. @@ -2984,9 +3075,7 @@ odf.TextLayout = function TextLayout() { var /**@type{!Element}*/ text = /**@type{!Element}*/(odfroot.body.lastElementChild), /**@type{!PagePlan}*/ - plan, - /**@type{!number}*/ - pages; + plan; while (pagesDiv.firstChild) { pagesDiv.removeChild(pagesDiv.firstChild); } @@ -2995,14 +3084,19 @@ odf.TextLayout = function TextLayout() { plan = new PagePlan(odfroot); markPageBreaks(odfroot); columnPageOrigins = []; - pages = breakIntoPages(odfroot, plan); columnPageSize = { width: plan.at(0).pageWidth, height: plan.at(0).pageHeight }; - columnPages = pages; lastPlan = plan; - drawPageFurniture(odfroot, plan, pagesDiv, readMeta(odfroot)); + // The pages are broken a few at a time: the first of them are drawn + // at once, and a reader reads them while the rest are broken, rather + // than waiting on a document of a thousand pages. + filling = startPages(odfroot, plan); + fillingRoot = odfroot; + fillingDiv = pagesDiv; + fillingRound += 1; + fillSlice(fillingRound); } /** * Layout the text by resizing frames and updating the numbers of pages. @@ -3076,6 +3170,21 @@ odf.TextLayout = function TextLayout() { this.setStacked = function (enable) { stackedMode = enable; }; + /** + * Whether every page holds what was written on it. + * @param {!odf.ODFDocumentElement} odfroot + * @return {!boolean} + */ + this.pagesFit = function (odfroot) { + return pagesHold(odfroot); + }; + /** + * Whether a text is still being broken into pages. + * @return {!boolean} + */ + this.isBreaking = function () { + return filling !== null; + }; /** * Set the pages right without breaking the whole text again: what * crosses the end of a page is moved to the page that follows. @@ -3090,34 +3199,6 @@ odf.TextLayout = function TextLayout() { trimPages(odfroot, lastPlan); drawPageFurniture(odfroot, lastPlan, pagesDiv, readMeta(odfroot)); }; - /** - * Whether every page holds what was written on it. - * - * A page is filled by measuring it, and what is drawn after the pages — - * the headers and the feet, the fonts they ask for — may change the - * width of a line and make a page hold one line less: a reader that - * asks this after the pages are drawn is told whether they are to be - * set right. - * @param {!odf.ODFDocumentElement} odfroot - * @return {!boolean} - */ - this.pagesFit = function (odfroot) { - var text = odfroot.body.lastElementChild, - /**@type{?Element}*/ - node = text - ? text.firstElementChild - : null, - /**@type{!boolean}*/ - fits = true; - while (node && fits) { - if (node.className === "webodf-pageBox" - && firstOverflowing(node)) { - fits = false; - } - node = node.nextElementSibling; - } - return fits; - }; /** * Leave a lane beside each page for the notes of the annotations, of the * width a note is drawn at, or none. @@ -3172,6 +3253,20 @@ odf.TextLayout.PageShape; }}*/ odf.TextLayout.TabStop; +/**@typedef{{ + text:!Element, + doc:!Document, + htmlns:?string, + plan:!Object, + waiting:!Array., + chunk:!number, + page:!number, + top:!number, + sheet:!CSSStyleSheet, + heightRule:!number +}}*/ +odf.TextLayout.Filling; + /**@typedef{{ shapes:!Array., header:?Element, From 6b14316350ba439ca1339157622d02d8895914e2 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 228/385] Filled header with data from document fields. --- webodf/lib/odf/TextLayout.js | 80 ++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 35b23777e..e351ec080 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -34,6 +34,25 @@ odf.TextLayout = function TextLayout() { fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", + dcns = "http://purl.org/dc/elements/1.1/", + metans = "urn:oasis:names:tc:opendocument:xmlns:meta:1.0", + /** + * The fields a header or a footer carries that the metadata of the + * document answers, and where each one is read from. The rest of the + * fields keep the text the document was written with, which is what a + * document says of itself and what an office suite would show as well + * until it is edited again. + * @const + * @type{!Array.} + */ + metaFields = [ + {field: "title", ns: dcns, name: "title"}, + {field: "subject", ns: dcns, name: "subject"}, + {field: "description", ns: dcns, name: "description"}, + {field: "author-name", ns: dcns, name: "creator"}, + {field: "initial-creator", ns: metans, name: "initial-creator"}, + {field: "keywords", ns: metans, name: "keyword"} + ], /** * The gap between two pages, in pixels: the one the readers of pdf * draw, ten pixels, and the one the slides of a presentation are drawn @@ -424,6 +443,26 @@ odf.TextLayout = function TextLayout() { } return timeLeft; } + /** + * What the metadata of the document says of itself, for the fields a + * header or a footer may carry. A field that the metadata does not answer + * is left with the text the document was written with. + * @param {!odf.ODFDocumentElement} odfroot + * @return {!Object.} + */ + function readMeta(odfroot) { + var meta = {}, + node; + metaFields.forEach(function (entry) { + node = odfroot.meta + ? domUtils.getDirectChild(odfroot.meta, entry.ns, entry.name) + : null; + if (node && node.textContent) { + meta[entry.field] = node.textContent; + } + }); + return meta; + } /** * Copy what a master page writes in a header or in a footer, and put the * number of the page where the document asks for it. The nodes are of the @@ -432,21 +471,29 @@ odf.TextLayout = function TextLayout() { * @param {!HTMLDivElement} box * @param {!number} page the number of the page, from one * @param {!number} pages how many pages there are + * @param {!Object.} meta what the document says of itself * @return {undefined} */ - function fillPageArea(source, box, page, pages) { - var doc = box.ownerDocument, - fields, - i; - box.appendChild(doc.importNode(source, true)); - fields = box.getElementsByTagNameNS(textns, "page-number"); - for (i = 0; i < fields.length; i += 1) { - fields[i].textContent = String(page); - } - fields = box.getElementsByTagNameNS(textns, "page-count"); - for (i = 0; i < fields.length; i += 1) { - fields[i].textContent = String(pages); + function fillPageArea(source, box, page, pages, meta) { + var doc = box.ownerDocument; + /** + * @param {!string} name + * @param {!string} value + * @return {undefined} + */ + function fill(name, value) { + var fields = box.getElementsByTagNameNS(textns, name), + i; + for (i = 0; i < fields.length; i += 1) { + fields[i].textContent = value; + } } + box.appendChild(doc.importNode(source, true)); + fill("page-number", String(page)); + fill("page-count", String(pages)); + Object.keys(meta).forEach(function (name) { + fill(name, meta[name]); + }); } /** * The header or the footer a page carries. A master page may write one for @@ -485,9 +532,10 @@ odf.TextLayout = function TextLayout() { * that was left, one for each page. Nothing of the text is touched. * @param {!odf.TextLayout.PageDimensions} dims * @param {!HTMLDivElement} pagesDiv + * @param {!Object.} meta what the document says of itself * @return {undefined} */ - function drawPageFurniture(dims, pagesDiv) { + function drawPageFurniture(dims, pagesDiv, meta) { var doc = pagesDiv.ownerDocument, htmlns = pagesDiv.namespaceURI, pages = countPages(pagesDiv), @@ -524,7 +572,7 @@ odf.TextLayout = function TextLayout() { // two lines where one was asked for grows into the margin // rather than being cut. box.style.minHeight = dims.header.height + "px"; - fillPageArea(header, box, n + 1, pages); + fillPageArea(header, box, n + 1, pages, meta); pagesDiv.appendChild(box); } if (footer) { @@ -537,7 +585,7 @@ odf.TextLayout = function TextLayout() { box.style.top = (top + dims.pageHeight - dims.marginBottom + dims.footer.gap) + "px"; box.style.minHeight = dims.footer.height + "px"; - fillPageArea(footer, box, n + 1, pages); + fillPageArea(footer, box, n + 1, pages, meta); pagesDiv.appendChild(box); } } @@ -558,7 +606,7 @@ odf.TextLayout = function TextLayout() { } updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); - drawPageFurniture(dims, pagesDiv); + drawPageFurniture(dims, pagesDiv, readMeta(odfroot)); return maxTime > 0; } this.layout = layout; From de1bf464b333d82a56490024d231a7467984fe7f Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 229/385] Dropped the interface of sencha touch, that no product carried any more. --- programs/CMakeLists.txt | 2 - programs/touchui/CMakeLists.txt | 26 -- programs/touchui/ZoomIn.png | Bin 670 -> 0 bytes programs/touchui/ZoomOut.png | Bin 607 -> 0 bytes programs/touchui/app/app.js | 76 ------ programs/touchui/app/controller/Files.js | 118 --------- programs/touchui/app/model/FileSystem.js | 301 ----------------------- programs/touchui/app/store/FileStore.js | 66 ----- programs/touchui/app/views/FileDetail.js | 157 ------------ programs/touchui/app/views/FilesList.js | 83 ------- programs/touchui/app/views/OdfView.js | 203 --------------- programs/touchui/app/views/Viewport.js | 90 ------- programs/touchui/go-next.png | Bin 1473 -> 0 bytes programs/touchui/go-previous.png | Bin 1536 -> 0 bytes programs/touchui/index.html | 21 -- programs/touchui/scripts.js | 166 ------------- programs/touchui/sencha-touch.css | 21 -- programs/touchui/sencha-touch.js | 35 --- programs/touchui/welcome.odt | Bin 62780 -> 0 bytes programs/touchui/zoom-fit-best.png | Bin 932 -> 0 bytes programs/touchui/zoom-fit-height.png | Bin 947 -> 0 bytes programs/touchui/zoom-fit-width.png | Bin 934 -> 0 bytes webodf/tools/extjsexterns.js | 165 ------------- 23 files changed, 1530 deletions(-) delete mode 100644 programs/touchui/CMakeLists.txt delete mode 100644 programs/touchui/ZoomIn.png delete mode 100644 programs/touchui/ZoomOut.png delete mode 100644 programs/touchui/app/app.js delete mode 100644 programs/touchui/app/controller/Files.js delete mode 100644 programs/touchui/app/model/FileSystem.js delete mode 100644 programs/touchui/app/store/FileStore.js delete mode 100644 programs/touchui/app/views/FileDetail.js delete mode 100644 programs/touchui/app/views/FilesList.js delete mode 100644 programs/touchui/app/views/OdfView.js delete mode 100644 programs/touchui/app/views/Viewport.js delete mode 100644 programs/touchui/go-next.png delete mode 100644 programs/touchui/go-previous.png delete mode 100644 programs/touchui/index.html delete mode 100644 programs/touchui/scripts.js delete mode 100644 programs/touchui/sencha-touch.css delete mode 100644 programs/touchui/sencha-touch.js delete mode 100644 programs/touchui/welcome.odt delete mode 100644 programs/touchui/zoom-fit-best.png delete mode 100644 programs/touchui/zoom-fit-height.png delete mode 100644 programs/touchui/zoom-fit-width.png delete mode 100644 webodf/tools/extjsexterns.js diff --git a/programs/CMakeLists.txt b/programs/CMakeLists.txt index c5564f49c..61e95eb94 100644 --- a/programs/CMakeLists.txt +++ b/programs/CMakeLists.txt @@ -1,5 +1,3 @@ -add_subdirectory(touchui) - if(BUILD_QTJSRUNTIME) add_subdirectory(qtjsruntime) endif(BUILD_QTJSRUNTIME) diff --git a/programs/touchui/CMakeLists.txt b/programs/touchui/CMakeLists.txt deleted file mode 100644 index edfc1b10d..000000000 --- a/programs/touchui/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -set(TOUCHUI_FILES - app/app.js - app/controller/Files.js - app/model/FileSystem.js - app/views/FileDetail.js - app/views/FilesList.js - app/views/OdfView.js - app/views/Viewport.js - sencha-touch.css - sencha-touch.js - app/store/FileStore.js - ZoomOut.png - ZoomIn.png - go-previous.png - go-next.png - zoom-fit-width.png - zoom-fit-best.png - zoom-fit-height.png - PARENT_SCOPE -) - -COPY_FILES(TOUCHUIDEPS ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} ${TOUCHUI_FILES}) -COPY_FILES(TOUCHUIDEPS ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR} index.html scripts.js welcome.odt) -add_custom_target(touchuiDepencencies ALL DEPENDS ${TOUCHUIDEPS}) diff --git a/programs/touchui/ZoomIn.png b/programs/touchui/ZoomIn.png deleted file mode 100644 index 6041c6ff937666e4266abf66970328fdbc080e20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 670 zcmV;P0%84$P)f(71&&Iji~^qf^{lzW|Kj(oSogZJs2YSNh1S`&0}`neAekz zK%VCwTzs%Qyt=p)gJoce<2Z-jwE;wjU`w!5ZU+Ij1{+wFsk@G7Wh5BIn19i=(3uT3isA3K@PUDSRe{8RAukISBQQTW~tDMPL()U0NGF?s1adYJTXk z;d{5xos`{N%dP1v*ANhK4W@>{ zSg`3u)B6^W14fo-B!X)SvKedx3som5q7===Qtn%JZW-q1Bj>C*%P$YXI^bUD>_fCg zd}whTU_yir@LD5Y5a_z1=eOmI!%5t!n$J;iAtBHoky4|Y<^+phoGt0)GNIBD?}&HA zJK`Pjj<^l+n>=B{avlZnvx<9`Z2$lO07*qoM6N<$ Ef*6}H!TQ~YUOeb*9)qSL??OftZ04Yy8MKaOlalUtVwwSbl zQYwVU0_+i=GyG`}b^*(U5QoXN0Yn3^1guarNU#)ael5ZYlIRLeJ{XE@2zFFF(0@7_ zg0NKlSaWd{2BGaM0yE))@8p#=EzB67F1&(J-?;_n5?cngBd zM#^0KjnVdTD7kalB1*RMH?=g9yuNUFdZxDGOZ0g@{pnyrd;`JK(0pcHN&jz?LVOvP z_e7uiy%)oJN$8j)JWTEoQ(F$|Ev+rT5q*}H^%zAlj*orJzK$8)e5v}NRX^@_tuT(qs{D7e@n&|i@nCd8&2EPingq?dkDWh6clABm5|N8%%K3h|q~ tVZwGEV|%|Z)FOV{>0uyVR0;nGFaU{VsG5a2Ob!45002ovPDHLkV1ih@3se9A diff --git a/programs/touchui/app/app.js b/programs/touchui/app/app.js deleted file mode 100644 index e9e00bbf3..000000000 --- a/programs/touchui/app/app.js +++ /dev/null @@ -1,76 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global Ext, invokeString, document*/ -/** - * When the application has been initialized, this function is called, if - * it has been set. By default, it will start scanning the files in the - * files sytem. It can be overridden by e.g. PhoneGap to wait until the device - * is ready. - */ -var onApplicationLaunch = function (app) { - "use strict"; - app.startScanningDirectories(); -}; -Ext.application({ - name : 'WebODFApp', - models: ['FileSystem'], - views: ['Viewport', 'FilesList', 'FileDetail', 'OdfView'], - controllers: ['Files'], - stores: ['FileStore'], - launch: function () { - 'use strict'; - var app = this; - Ext.create('WebODFApp.view.Viewport'); - app.openUrl = function (url) { - var proxy = Ext.getStore("FileStore").getProxy(); - proxy.getRecord(url, function (record) { - var controller; - if (!record) { - alert("Cannot open " + url); - } else { - controller = app.getController('Files'); - controller.show(null, null, null, record); - } - }); - }; - this.startScanningDirectories = function () { - var proxy = Ext.getStore("FileStore").getProxy(); - proxy.startScanningDirectories(); - }; - onApplicationLaunch(this); - } -}); diff --git a/programs/touchui/app/controller/Files.js b/programs/touchui/app/controller/Files.js deleted file mode 100644 index 57c5787a3..000000000 --- a/programs/touchui/app/controller/Files.js +++ /dev/null @@ -1,118 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global Ext, runtime*/ -Ext.define('WebODFApp.controller.Files', { - extend: 'Ext.app.Controller', - - config: { - refs: { - mainView: 'mainview', - filesList: 'fileslist list', - fileDetail: 'filedetail', - openButton: '#openButton', - odfView: 'odfview', - title: 'titlebar' - }, - control: { - mainView: { - pop: 'pop', - push: 'push', - back: 'back' - }, - filesList: { - itemtap: 'show' - }, - openButton: { - tap: 'open' - } - } - }, - back: function () { - "use strict"; - this.odfView.hideCanvas(); - }, - push: function (view, item) { - "use strict"; - if (item.xtype === "filedetail") { - this.getOpenButton().show(); - } else { - this.getOpenButton().hide(); - } - }, - pop: function (view, item) { - "use strict"; - if (item.xtype === "odfview") { // going to filedetail - this.getOpenButton().show(); - } else { - this.getOpenButton().hide(); - } - this.getFilesList().deselectAll(); - }, - show: function (list, index, target, record, e) { - "use strict"; - // set the record in the details view and the file view - // this way, document starts loading in the background - var c = this; - if (!this.fileDetail) { - this.fileDetail = Ext.create('WebODFApp.view.FileDetail'); - } - if (!this.odfView) { - this.odfView = Ext.create('WebODFApp.view.OdfView'); - this.odfView.addCanvasListener(this.fileDetail.canvasListener); - } - this.odfView.hideCanvas(); - this.fileDetail.odfView = this.odfView; - this.fileDetail.setRecord(record); - this.getMainView().push(this.fileDetail); - runtime.setTimeout(function () { - c.odfView.setRecord(record); - }, 300); - }, - open: function (options) { - "use strict"; - var c = this; - if (!this.odfView) { - this.odfView = Ext.create('WebODFApp.view.OdfView'); - } - this.odfView.hideCanvas(); - this.odfView.setRecord(this.fileDetail.getRecord()); - this.getMainView().push(this.odfView); - runtime.setTimeout(function () { - c.odfView.showCanvas(); - }, 300); - } -}); diff --git a/programs/touchui/app/model/FileSystem.js b/programs/touchui/app/model/FileSystem.js deleted file mode 100644 index a6c22dde8..000000000 --- a/programs/touchui/app/model/FileSystem.js +++ /dev/null @@ -1,301 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global Ext, console, app, window, LocalFileSystem, JSON, FileReader, runtime*/ -Ext.define("WebODFApp.model.FileSystemProxy", (function () { - "use strict"; - var self = this, - scanner; - function Scanner(proxy) { - var todo = [], - done = false, - fileSystems, - files, - cachedList = [], - dirs = {}, - lastUpdate = 0, - lastUpdateTime = new Date(); - - function getFileId(fullPath) { - var i; - if (!files) { - return -1; - } - for (i = 0; i < files.length; i += 1) { - if (files[i].get('fullPath') === fullPath) { - return i; - } - } - return -1; - } - this.getFileId = getFileId; - function addFileEntry(entry, callback) { - function fail() { - callback(-1); - } - var id = getFileId(entry.fullPath); - if (id !== -1) { - return callback(id); - } - entry.file(function (file) { - var id = files.length; - files.push(Ext.create('WebODFApp.model.FileSystem', { - id: id, - fileName: entry.name, - fullPath: entry.fullPath, - size: file.size - })); - callback(id); - }, fail); - } - function parseCachedFileList(pos, callback) { - if (pos === cachedList.length) { - return callback(); - } - window.resolveLocalFileSystemURI(cachedList[pos], function (entry) { - addFileEntry(entry, function () { - parseCachedFileList(pos + 1, callback); - }); - }, function () { - parseCachedFileList(pos + 1, callback); - }); - } - function readCachedFileList(callback) { - window.resolveLocalFileSystemURI("cachedODFList.json", - function (fileentry) { - var reader = new FileReader(); - reader.onloadend = function (evt) { - cachedList = []; - try { - cachedList = JSON.parse(evt.target.result); - } catch (e) { - alert(e); - } - parseCachedFileList(0, callback); - }; - reader.readAsText(fileentry); - }, function () { - callback(); - }); - } - function writeCachedFileList() { - var i, - l = files.length; - cachedList.length = files.length; - for (i = 0; i < l; i += 1) { - cachedList[i] = files[i].get('fullPath'); - } - window.resolveLocalFileSystemURI("cachedODFList.json", - function (fileentry) { - fileentry.createWriter(function (writer) { - writer.write(JSON.stringify(cachedList)); - }, function (e) { - runtime.log(JSON.stringify(e)); - }); - }, function (e) { - runtime.log(JSON.stringify(e)); - }); - } - function filter(name) { - var suffix = name.substr(name.length - 4); - return suffix === ".odt" || suffix === ".odp" || suffix === ".ods"; - } - function errorCallback(err) { - console.log("FILE READ ERROR " + err + " " + todo.length); - done = true; - } - function load(entry, callback) { - function fail() { - callback(-1); - } - if (entry.isDirectory) { - entry.createReader().readEntries(function (entries) { - var i = 0; - for (i = 0; i < entries.length; i += 1) { - entry = entries[i]; - if (entry.isDirectory - && !dirs.hasOwnProperty(entry.fullPath)) { - todo.push(entry); - dirs[entry.fullPath] = entry; - } else if (filter(entry.name)) { - todo.push(entry); - } - } - callback(-1); - }, fail); - } else if (entry.isFile) { - addFileEntry(entry, callback); - } else { - fail(); - } - } - function addFileSystem(fileSystem) { - var dir = fileSystems[fileSystem.name] = {}; - todo.push(fileSystem.root); - function callback() { - var now = new Date(), - // a limit is needed, otherwise the # of files too large to - // be handled by sencha touch - done = todo.length === 0 || files.length > 2000, - store = Ext.getStore('FileStore'); - if (done || lastUpdate === 0 || (files.length - lastUpdate > 0 - && now - lastUpdateTime > files.length * 100)) { - store.load(); - lastUpdate = files.length; - lastUpdateTime = now; - } - if (done) { - writeCachedFileList(); - } else { - load(todo.shift(), callback); - } - } - load(todo.shift(), callback); - } - function addFileSystems() { - window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, - addFileSystem, errorCallback); - window.requestFileSystem(LocalFileSystem.TEMPORARY, 0, - addFileSystem, function () {}); - } - this.scan = function () { - if (fileSystems !== undefined) { - return; - } - fileSystems = {}; - readCachedFileList(function () { - addFileSystems(); - }); - }; - this.load = load; - this.files = files = []; - } - function finishOperation(proxy, operation, callback, scope) { - if (operation) { - var i = 0, - recs = operation.getRecords(), - len = recs.length; - - for (i; i < len; i += 1) { - recs[i].commit(); - } - operation.setSuccessful(); - - Ext.callback(callback, scope || proxy, [operation]); - } - } - return { - extend: "Ext.data.proxy.Proxy", - xtype: 'filesystemproxy', - constructor: function (config) { - this.initConfig(config); - scanner = new Scanner(this); - this.startScanningDirectories = function () { - scanner.scan(); - }; - this.getRecord = function (url, callback) { - var id = scanner.getFileId(url); - if (id !== -1) { - return callback(scanner.files[id]); - } - window.resolveLocalFileSystemURI(url, - function (fileentry) { - scanner.load(fileentry, function (id) { - Ext.getStore('FileStore').load(); - callback(scanner.files[id]); - }); - }, - function (evt) { - callback(null); - }); - }; - }, - - create: function (operation, callback, scope) { - finishOperation(this, operation, callback, scope); - }, - - read: function (operation, callback, scope) { - var me = this, - records = scanner.files; - if (!records) { - return; - } - // return model instances in a resultset - operation.setResultSet(new Ext.data.ResultSet({ - //total: records.length, - count: records.length, - records: records, - success: true - })); - - // announce success - operation.setSuccessful(); - operation.setCompleted(); - - // finish with callback - Ext.callback(callback, scope || me, [operation]); - }, - - update: function (operation, callback, scope) { - finishOperation(this, operation, callback, scope); - }, - - destroy: function (operation, callback, scope) { - finishOperation(this, operation, callback, scope); - } - }; -}())); - -Ext.define("WebODFApp.model.FileSystem", { - extend: 'Ext.data.Model', - config: { - idProperty: 'id', - fields: [ { - name: "id", - type: "auto" - }, { - name: "fullPath", - type: "string" - }, { - name: "fileName", - type: "string" - }, { - name: "size", - type: "int" - } ] - } -}); diff --git a/programs/touchui/app/store/FileStore.js b/programs/touchui/app/store/FileStore.js deleted file mode 100644 index 81b9e3f2b..000000000 --- a/programs/touchui/app/store/FileStore.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global Ext*/ -Ext.define('WebODFApp.store.FileStore', { - extend: 'Ext.data.Store', - config: { - storeId: 'FileStore', - model: 'WebODFApp.model.FileSystem', - autoLoad: true, - grouper: { - groupFn: function (record) { - "use strict"; - return record.get('fileName')[0].toUpperCase(); - } - }, - proxy: { - xtype: 'filesystemproxy' - }, - sorters: function (a, b) { - "use strict"; - a = a.get('fileName').toUpperCase(); - b = b.get('fileName').toUpperCase(); - if (a > b) { - return 1; - } - if (a < b) { - return -1; - } - return 0; - } - } -}); diff --git a/programs/touchui/app/views/FileDetail.js b/programs/touchui/app/views/FileDetail.js deleted file mode 100644 index ed4824bca..000000000 --- a/programs/touchui/app/views/FileDetail.js +++ /dev/null @@ -1,157 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global Ext, app, runtime, xmldom, odf*/ -runtime.loadClass("xmldom.XPath"); -runtime.loadClass("odf.Namespaces"); -Ext.define('WebODFApp.view.FileDetail', (function () { - "use strict"; - var panel, - xpath = xmldom.XPath, - fileDetail, - title, - image, - list, - emptyImageUrl = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAAXNSR0IArs4c6QAAAAtJREFUCB1jYGAAAAADAAFPSAqvAAAAAElFTkSuQmCC"; - function getTitle(body) { - var ps, - title; - ps = xpath.getODFElementsWithXPath(body, - ".//text:h", odf.Namespaces.resolvePrefix); - title = ""; - if (ps && ps.length) { - title = ps[0].nodeValue; - } else { - ps = xpath.getODFElementsWithXPath(body, - ".//text:p", odf.Namespaces.resolvePrefix); - if (ps && ps.length) { - title = ps[0].nodeValue; - } - } - return title; - } - function metaToJSON(body, meta) { - var json = [], - title = body && getTitle(body), - e = meta && meta.firstChild, - name; - if (title) { - json.push({name: "title", value: title}); - } - while (e) { - if (e.nodeType === 1 && e.textContent) { - if (e.localName === "user-defined") { - name = e.getAttributeNS( - "urn:oasis:names:tc:opendocument:xmlns:meta:1.0", - "name" - ); - } else { - name = e.localName; - } - json.push({ - name: name, - value: e.textContent - }); - } - e = e.nextSibling; - } - return json; - } - return { - extend: 'Ext.Panel', - xtype: 'filedetail', - config: { - title: 'File details', - layout: 'vbox', - items: [{ - id: "title", - dock: 'top', - xtype: 'toolbar' - }, { - id: 'details', - xtype: 'container', - layout: 'hbox', - flex: 1, - items: [{ - id: 'thumbnail', - xtype: 'image', - width: 256, - maxWidth: "50%" - }, { - id: 'metalist', - xtype: 'list', - store: { - fields: ["name", "value"], - data: [] - }, - itemTpl: "{name}: {value}", - flex: 1 - }] - }], - listeners: { - initialize: function () { - fileDetail = this.query("#details")[0]; - title = this.query("#title")[0]; - image = fileDetail.query('#thumbnail')[0]; - list = fileDetail.query('#metalist')[0]; - } - } - }, - updateRecord: function (record) { - if (record) { - fileDetail.setMasked({ - xtype: 'loadmask', - message: 'Loading...' - }); - title.setTitle(record.get('fileName')); - } - }, - canvasListener: function (odfcanvas) { - var view = this, - odfcontainer = odfcanvas.odfContainer(), - part = odfcontainer.getPart("Thumbnails/thumbnail.png"), - metajson = []; - metajson = metaToJSON(odfcontainer.rootElement.body, - odfcontainer.rootElement.meta); - part.onstatereadychange = function (part) { - image.setSrc(part.url || emptyImageUrl); - }; - part.load(); - list.getStore().setData(metajson); - fileDetail.unmask(); - } - }; -}())); diff --git a/programs/touchui/app/views/FilesList.js b/programs/touchui/app/views/FilesList.js deleted file mode 100644 index 05d3f1df9..000000000 --- a/programs/touchui/app/views/FilesList.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global Ext, app, filestore */ -Ext.define("WebODFApp.view.FilesList", { - extend: "Ext.Panel", - xtype: 'fileslist', - config: { - layout: 'fit', - items: [{ - xtype: 'list', - store: 'FileStore', -/* - store: { - fields: ['fileName', 'fullPath'], - grouper: { - groupFn: function (record) { - "use strict"; - return record.get('fileName')[0].toUpperCase(); - } - }, - data: [ - {fileName: 'Cowper', fullPath: '-'}, - {fileName: 'Everett', fullPath: '-'}, - {fileName: 'University', fullPath: '-'}, - {fileName: 'Forest', fullPath: '-'} - ] - }, -*/ -/* - listeners: { - 'itemtap': function (view, number, item) { - "use strict"; - var record = view.getStore().getAt(number); - if (record) { - Ext.app.dispatch({ - controller: 'Files', //app.controllers.files, - action: 'show', - id: record.getId() - }); - } - } - }, -*/ - itemTpl: '{fileName}
{fullPath}', - grouped: true, - indexBar: true - }] - } -}); diff --git a/programs/touchui/app/views/OdfView.js b/programs/touchui/app/views/OdfView.js deleted file mode 100644 index 12f8e7588..000000000 --- a/programs/touchui/app/views/OdfView.js +++ /dev/null @@ -1,203 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global Ext, runtime, webodfcore, odf, window, FileReader, PhoneGap, gui*/ -runtime.loadClass('odf.OdfCanvas'); - -Ext.define('WebODFApp.view.OdfView', (function () { - "use strict"; - var currentPath, - overridePath, - overridePathPrefix = "odf:", - data, - globalreadfunction, - globalfilesizefunction, - odfcanvas, - zoom = 1, - dom, - canvasListeners = [], - view; - function signalCanvasChange() { - var i; - for (i = 0; i < canvasListeners.length; i += 1) { - canvasListeners[i](odfcanvas); - } - } - function initCanvas() { - if (globalreadfunction === undefined) { - // overload the global read function with one that only reads - // the data from this canvas - globalreadfunction = runtime.readFile; - runtime.readFile = function (path, encoding, callback) { - if (path !== overridePath) { - globalreadfunction.apply(runtime, - [path, encoding, callback]); - } else { - callback(null, data); - } - }; - dom = Ext.getCmp('webodf').element.dom; - odfcanvas = new odf.OdfCanvas(dom); - odfcanvas.addListener("statereadychange", signalCanvasChange); - } - } - function load(path) { - if (path === currentPath) { - return; - } - currentPath = path; - overridePath = overridePathPrefix + path; - data = null; - // the url of a file can start with file:// or not depending on the - // operating system, notably this is different between iOS and android - var filepath = path; - if (filepath.substr(0, 7) !== "file://") { - filepath = "file://" + filepath; - } - window.resolveLocalFileSystemURI(filepath, function (file) { - var reader = new FileReader(); - // so far phonegap is very limited, ideally it would implement - // readAsArrayBuffer and slice() on the File object - // right now, it has a dummy function, hence breaking simple - // detection of which features are implemented - if (reader.readAsArrayBuffer - && (typeof PhoneGap === "undefined")) { - reader.onloadend = function (evt) { - data = evt.target.result; - odfcanvas.load(overridePath); - }; - reader.readAsArrayBuffer(file); - } else { - reader.onloadend = function (evt) { - var b = new webodfcore.Base64(); - data = evt.target.result; - data = data.substr(data.indexOf(",") + 1); - data = b.convertBase64ToUTF8Array(data); - odfcanvas.load(overridePath); - }; - reader.readAsDataURL(file); - } - }, function () { - runtime.log("COULD NOT RESOLVE " + path); - }); - } - function tapHandler(button) { - var id = button.getId(), - dom = Ext.getCmp('odfcontainer').element.dom, - width = dom.offsetWidth, - height = dom.offsetHeight; - if (id === 'zoomin') { - odfcanvas.setZoomLevel(odfcanvas.getZoomLevel() * 1.25); - } else if (id === 'zoomout') { - odfcanvas.setZoomLevel(odfcanvas.getZoomLevel() * 0.8); - } else if (id === 'fit-best') { - odfcanvas.fitToContainingElement(width, height); - } else if (id === 'fit-width') { - odfcanvas.fitToWidth(width); - } else if (id === 'fit-height') { - odfcanvas.fitToHeight(height); - } else if (id === 'next') { - odfcanvas.showNextPage(); - } else if (id === 'previous') { - odfcanvas.showPreviousPage(); - } - } - return { - extend: 'Ext.Container', - xtype: 'odfview', - id: 'odfcontainer', - config: { - scrollable: 'both', - items: [{ - id: 'webodf' - }, { - xtype : 'toolbar', - docked: 'bottom', - scrollable: false, - defaults: { - iconMask: false, - ui : 'plain', - handler: tapHandler - }, - items: [ - { id: 'previous', icon: 'go-previous.png'}, - { id: 'next', icon: 'go-next.png' }, - { id: 'zoomin', icon: 'ZoomIn.png'}, - { id: 'zoomout', icon: 'ZoomOut.png' }, - { id: 'fit-best', icon: 'zoom-fit-best.png' }, - { id: 'fit-height', icon: 'zoom-fit-height.png' }, - { id: 'fit-width', icon: 'zoom-fit-width.png' } - ], - layout: { - pack : 'center', - align: 'center' - } - }], - listeners: { - painted: function () { - // make sure the viewport is the right size - odfcanvas.setZoomLevel(odfcanvas.getZoomLevel()); - } - } - }, - updateRecord: function (record) { - view = this; - initCanvas(); - load(record.get('fullPath')); - }, - addCanvasListener: function (listener) { - canvasListeners.push(listener); - }, - hideCanvas: function () { - if (dom) { - dom.style.display = "none"; - } - if (view) { - view.setMasked({ - xtype: 'loadmask', - message: 'Loading...' - }); - } - }, - showCanvas: function () { - if (view) { - view.unmask(); - } - dom.style.display = "inline-block"; - odfcanvas.setZoomLevel(odfcanvas.getZoomLevel()); - } - }; -}())); diff --git a/programs/touchui/app/views/Viewport.js b/programs/touchui/app/views/Viewport.js deleted file mode 100644 index a3efbb909..000000000 --- a/programs/touchui/app/views/Viewport.js +++ /dev/null @@ -1,90 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global Ext, app*/ -Ext.define("WebODFApp.view.Viewport", { - extend: "Ext.navigation.View", - xtype: "mainview", - requires: [ - "WebODFApp.view.FilesList", - "WebODFApp.view.FileDetail" - ], - config: { - fullscreen: true, - autoDestroy: false, - navigationBar: { - items: [{ - xtype: 'button', - id: 'openButton', - text: 'Open', - align: 'right', - hidden: true - }] - }, - items: [ - { title: 'Files', xtype: 'fileslist' } - ] - } -/* - initComponent: function () { - - //put instances of cards into app.views namespace - Ext.apply(app.views, { - filesList: new app.views.FilesList(), - fileDetail: new app.views.FileDetail(), - odfView: new app.views.OdfView() - }); - //put instances of cards into viewport - Ext.apply(this, { - items: [ - app.views.filesList, - app.views.fileDetail, - app.views.odfView - ] - }); - app.views.Viewport.superclass.initComponent.apply(this, arguments); - }, - listeners: { - afterlayout: function () { - if (app.stores.filesystem.initialUrl) { - app.openUrl(app.stores.filesystem.initialUrl); - app.stores.filesystem.initialUrl = undefined; - } - } - } - }; -*/ -}); diff --git a/programs/touchui/go-next.png b/programs/touchui/go-next.png deleted file mode 100644 index c4da8a9a3d787dcded3a357a062e92ee9f59d71d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1473 zcmV;y1wQ(TP)lWjE>obx@^XPW9K&fEOrq7G_VIumIdU zKJJ;dj}1l#Alx*vj*DE*Mb`B(bH+nhxn%mdp((41M3hf>ZlgJ{0=zCt?!k44t_O$K z!-f}O<*PHTlF1`iDZwkr8)F7m044W4A0BnU^@tRGAu#)?hfy|r^0b1uabnW*Tj$)a z0PXUSHx%G!Nq|oR0!?2>O)YH9=wd9HJ7wtjQOVtt=6|)0gyi4UTTya+x~1Ys)v872S)6*!O~xkGE0qKnm^eWdp*L{R#CFG^ii?YVXwtZA+j0t@Q5m(|@=z=N|^ zsCQSCq9f~p6m$~|iV+b}MMqe#4%nidSxgkgjlo3T31q6wp1!^y3aH=8wJp)@@ zzkOlb^-ZV*y0R{rDx4`N3i!T25XguMoKxf!g(j_gD0}wlGk(DJGqg8c4`W9dczjA~ zP9o1ZIdT4$>F5Ou5f~&gSqEGiP#~%(hVLd(g=An%5g8QFyY&$zgdlQVJw*P_JPhBM5bw4CM;7yarZr`?(C$w43(7a*$O|A`0$^SKQK|uk6 z#8BZ$`vWF|_xlN;U3w!O)DN=k7*%f(ZP=C;pyyBQHG4sy1tLqpBtd4BJW8yqPNWiO z>u@gyf|p&ce7g#SeggDdi3ST>Zt1IN6Jxes>n^aU14{K&AAJTOm5jPXjIL~6K^)Gt z46d|v>`*Y4G*zv>*6$XaY|WXkEnkJSN}?b?g~UCDNET8|CXpA9BOZ^ziaH=&4yC_v zv`pbGmxUPVy z_vXp(lzQ}=HOp}$&9HRwf%Kw<$X@cp)n8w zl+k^s6=TTQ68kH6qIU0|6F}0a!52Zn@G5PAPRn#=?(?|LVJLQZ8RL}bZFctU zz2}^@_TFosJ4d5ieEok2tliohnm4mBZ0PLJlEyN7(g;+o{D?SF>&df`x5^8uv)Xt4 z)XO=at0+qP2~;fKp5xl_cf!TN$66nqO|IWhy?saTA)1%|5>zaEyOCV;yDM=u4F+BvTR(Cf0G~V94XnOwis%ez4ZBk$o78fTjQ}0^Q zf0qD&{RnYOX(+H}>3z3ThEJujSVDr~5BNy}T;8GtHzt5=$qAUxZ%UwQRc9?D{z+3^ zer?_KTugSzG$A*Ik;2#n0+(5Mc8qdoJj@l%M@;t<)BL2s6XuZT(j(7rqq+5!2SKDk z1fg9gYO&awoJ_W5{_H$|&J>+uag$V4CB}py-NF=>qIgcPy}6mV=aI)@F3fY`U2na1JsUm8HfK94K@Cq?uoC_io2#7L_j9CEn z#z7qi-m&3f&UGwZs6|tQ9KaS9(Mj`=Doqi+E)}mzFogh* z1^=o8E~9rb9{2=&0DIDG3ue3I(-{W36Ge#L7XIa&3~NJmAu&UxOF0ct6v8yQ$g z0%Jh3=D1}5XW}^wFRs{lGvZy+dmv7gR*=YjYSa@%Gp0SLI?Vei1#T39Bc8( zA!n1$osF^K6KZC_Pq}%y6buGwN)AyLhG{xUFb!%nG>v>2I_bI&ZJ;ZXWpF{jM!2S+ zfwZ5Gj8Xqk1OzTp3@n6cVj)V&z#qHTIdCr(FKpZG3l?^&idk}DI7)F-sM@8>EQbP_ z?j;L2cV!NMS@Is0Nhv|f)!(yu zIMn#u%7HUuPX_a{w-%O^W-%se%|Jx99XykU1rhxv5^{`*wHXLNu&(04d*lhxs~*fH z2nX+7Dl0FhzQf0>JX?7U>GsE3x=lUQ@EnEw~Wee{xLe&_rcM;x+j``Jb3Vx!tlWQ+SyGE zyPVikr8(#v+p;AQ`6a|^CTbt~{eW`4HD3VPO(e(vy|3YgA9mVs8yu_UtMg}0bj(@s zU{R63f^6GC+9f#Z?MM-N21B$rUa}42+WyJ!fsvoT*vqRH*X{eP^Zn|E#+Leq2Z) - - - - WebODF - - - - - - - - - - - - - - - - diff --git a/programs/touchui/scripts.js b/programs/touchui/scripts.js deleted file mode 100644 index c1fb0f04f..000000000 --- a/programs/touchui/scripts.js +++ /dev/null @@ -1,166 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global alert, app, window, runtime*/ -var LocalFileSystem = { - PERSISTENT: 0, - TEMPORARY: 1 -}; -function FileWriter(fullPath) { - "use strict"; - this.write = function (data) { - data = runtime.byteArrayFromString(data, "utf8"); - runtime.writeFile(fullPath, data, function () {}); - }; -} -function FileEntry(name, fullPath) { - "use strict"; - this.isFile = true; - this.isDirectory = false; - this.name = name; - this.fullPath = fullPath; - this.file = function (onsuccess, onerror) { - function File(fullPath) { - this.name = name; - this.fullPath = fullPath; - this.type = ""; - this.size = -1; - this.lastModifiedDate = -1; - } - var file = new File(fullPath); - try { - onsuccess(file); - } catch (e) { - alert("Error on determining file properties: " + e); - onerror(e); - } - }; - this.createWriter = function (onsuccess, onerror) { - onsuccess(new FileWriter(fullPath)); - }; -} -function FileReader() { - "use strict"; - var fr = this; - this.readAsArrayBuffer = function (file) { - var path = file.fullPath; - if (path.substr(0, 7) === "file://") { - path = path.substr(7); - } - runtime.readFile(path, 'binary', function (error, data) { - fr.onloadend({target: {result: data}}); - }); - }; - this.readAsText = function (file) { - var path = file.fullPath; - if (path.substr(0, 7) === "file://") { - path = path.substr(7); - } - runtime.readFile(path, 'utf8', function (error, data) { - fr.onloadend({target: {result: data}}); - }); - }; -} -var DirectoryReader; -function DirectoryEntry(name, fullPath) { - "use strict"; - this.isFile = false; - this.isDirectory = true; - this.name = name; - this.fullPath = fullPath; - this.createReader = function () { - var reader = new DirectoryReader(fullPath); - return reader; - }; -} -function DirectoryReader(fullPath) { - "use strict"; - this.readEntries = function (onsuccess, onerror) { - window.setTimeout(function () { - var entries = []; - entries[entries.length] = new FileEntry("welcome.odt", - "welcome.odt"); - entries[entries.length] = new FileEntry("Traktatenblad.odt", - "Traktatenblad.odt"); - entries[entries.length] = new FileEntry("DanskTest01.odt", - "DanskTest01.odt"); - entries[entries.length] = new FileEntry("plugfest-gouda.odp", - "plugfest-gouda.odp"); - entries[entries.length] = new FileEntry("OpenDocument-v1.2.odt", - "OpenDocument-v1.2.odt"); - entries[entries.length] = new FileEntry("OpenDocument-v1.2-part1.odt", - "OpenDocument-v1.2-part1.odt"); - entries[entries.length] = new FileEntry("OpenDocument-v1.2-part2.odt", - "OpenDocument-v1.2-part2.odt"); - try { - onsuccess(entries); - } catch (e) { - onerror(e); - } - }, 1); - }; -} -window.resolveLocalFileSystemURI = function (path, onsuccess, onerror) { - "use strict"; - var p = path.lastIndexOf("/"), - name = (p === -1) ? path : path.substr(p + 1); - onsuccess(new FileEntry(name, path)); -}; -window.requestFileSystem = function (filesystem, id, onsuccess, onerror) { - "use strict"; - var dirs = [], shared, subfolder, path; - try { - if (filesystem === LocalFileSystem.PERSISTENT) { - path = ""; - onsuccess({ - name: "root", - root: new DirectoryEntry("root", path) - }); - } else { - onerror("not defined"); - } - } catch (e) { - onerror(e); - } -}; -var device = {}; -/* - * override launch function to quickly open a file for testing -onApplicationLaunch = function (app) { - "use strict"; - app.openUrl("plugfest-gouda.odp"); -}; -*/ diff --git a/programs/touchui/sencha-touch.css b/programs/touchui/sencha-touch.css deleted file mode 100644 index 49243ee2b..000000000 --- a/programs/touchui/sencha-touch.css +++ /dev/null @@ -1,21 +0,0 @@ -/* -This file is part of Sencha Touch 2.0 - -Copyright (c) 2011-2012 Sencha Inc - -Contact: http://www.sencha.com/contact - -GNU General Public License Usage -This file may be used under the terms of the GNU General Public License version 3.0 as -published by the Free Software Foundation and appearing in the file LICENSE included in the -packaging of this file. - -Please review the following information to ensure the GNU General Public License version 3.0 -requirements will be met: http://www.gnu.org/copyleft/gpl.html. - -If you are unsure which license is appropriate for your use, please contact the sales department -at http://www.sencha.com/contact. - -Build date: 2012-06-04 15:34:28 (d81f71da2d56f5f71419dc892fbc85685098c6b7) -*/ -body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal}li{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal}q:before,q:after{content:""}abbr,acronym{border:0;font-variant:normal}sup{vertical-align:text-top}sub{vertical-align:text-bottom}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit}*:focus{outline:none}html,body{font-family:"Helvetica Neue", HelveticaNeue, "Helvetica-Neue", Helvetica, "BBAlpha Sans", sans-serif;font-weight:normal;position:relative;-webkit-text-size-adjust:none}body.x-desktop{overflow:hidden}*,*:after,*:before{-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);-webkit-user-select:none;-webkit-touch-callout:none;-webkit-user-drag:none}.x-ios.x-tablet .x-landscape *{-webkit-text-stroke:1px transparent}body{font-size:104%}body.x-android.x-phone{font-size:116%}body.x-android.x-phone.x-silk{font-size:130%}body.x-ios.x-phone{font-size:114%}body.x-desktop{font-size:114%}input,textarea{-webkit-user-select:text}.x-hidden-visibility{visibility:hidden !important}.x-hidden-display,.x-field-hidden{display:none !important}.x-hidden-offsets{position:absolute !important;left:-10000em;top:-10000em;visibility:hidden}.x-fullscreen{position:absolute !important}.x-desktop .x-body-stretcher{margin-bottom:0px}.x-mask{position:absolute;top:0;left:0;bottom:0;right:0;height:100%;z-index:10;display:-webkit-box;display:box;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;background:rgba(0, 0, 0, 0.3) center center no-repeat}.x-mask.x-mask-gray{background-color:rgba(0, 0, 0, 0.5)}.x-mask.x-mask-transparent{background-color:transparent}.x-mask .x-mask-inner{background:rgba(0, 0, 0, 0.25);color:#fff;text-align:center;padding:.4em;font-size:.95em;font-weight:bold;-webkit-border-radius:0.5em;border-radius:0.5em}.x-mask .x-loading-spinner-outer{display:-webkit-box;display:box;-webkit-box-orient:vertical;box-orient:vertical;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;width:100%;min-width:8.5em;height:8.5em}.x-mask.x-indicator-hidden .x-loading-spinner-outer{display:none}.x-mask .x-mask-message{text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0;-webkit-box-flex:0 !important;max-width:13em;min-width:8.5em}.x-draggable{z-index:1}.x-dragging{opacity:0.7}.x-panel-list{background-color:#eaf6fe}.x-html{-webkit-user-select:auto;-webkit-touch-callout:inherit;line-height:1.5;color:#333;font-size:.8em;padding:1.2em}.x-html body{line-height:1.5;font-family:"Helvetica Neue", Arial, Helvetica, sans-serif;color:#333333;font-size:75%}.x-html h1,.x-html h2,.x-html h3,.x-html h4,.x-html h5,.x-html h6{font-weight:normal;color:#222222}.x-html h1 img,.x-html h2 img,.x-html h3 img,.x-html h4 img,.x-html h5 img,.x-html h6 img{margin:0}.x-html h1{font-size:3em;line-height:1;margin-bottom:0.50em}.x-html h2{font-size:2em;margin-bottom:0.75em}.x-html h3{font-size:1.5em;line-height:1;margin-bottom:1.00em}.x-html h4{font-size:1.2em;line-height:1.25;margin-bottom:1.25em}.x-html h5{font-size:1em;font-weight:bold;margin-bottom:1.50em}.x-html h6{font-size:1em;font-weight:bold}.x-html p{margin:0 0 1.5em}.x-html p .left{display:inline;float:left;margin:1.5em 1.5em 1.5em 0;padding:0}.x-html p .right{display:inline;float:right;margin:1.5em 0 1.5em 1.5em;padding:0}.x-html a{text-decoration:underline;color:#0066cc}.x-html a:visited{color:#004c99}.x-html a:focus{color:#0099ff}.x-html a:hover{color:#0099ff}.x-html a:active{color:#bf00ff}.x-html blockquote{margin:1.5em;color:#666666;font-style:italic}.x-html strong,.x-html dfn{font-weight:bold}.x-html em,.x-html dfn{font-style:italic}.x-html sup,.x-html sub{line-height:0}.x-html abbr,.x-html acronym{border-bottom:1px dotted #666666}.x-html address{margin:0 0 1.5em;font-style:italic}.x-html del{color:#666666}.x-html pre{margin:1.5em 0;white-space:pre}.x-html pre,.x-html code,.x-html tt{font:1em "andale mono", "lucida console", monospace;line-height:1.5}.x-html li ul,.x-html li ol{margin:0}.x-html ul,.x-html ol{margin:0 1.5em 1.5em 0;padding-left:1.5em}.x-html ul{list-style-type:disc}.x-html ol{list-style-type:decimal}.x-html dl{margin:0 0 1.5em 0}.x-html dl dt{font-weight:bold}.x-html dd{margin-left:1.5em}.x-html table{margin-bottom:1.4em;width:100%}.x-html th{font-weight:bold}.x-html thead th{background:#c3d9ff}.x-html th,.x-html td,.x-html caption{padding:4px 10px 4px 5px}.x-html table.striped tr:nth-child(even) td,.x-html table tr.even td{background:#e5ecf9}.x-html tfoot{font-style:italic}.x-html caption{background:#eeeeee}.x-html .quiet{color:#666666}.x-html .loud{color:#111111}.x-html ul li{list-style-type:circle}.x-html ol li{list-style-type:decimal}.x-video{background-color:#000}.x-sortable .x-dragging{opacity:1;z-index:5}.x-layout-card-item{background:#eeeeee}.x-map{background-color:#edeae2}.x-map *{-webkit-box-sizing:content-box;box-sizing:content-box}.x-mask-map{background:transparent !important}.x-img{background-repeat:no-repeat}.x-video{height:100%;width:100%}.x-video > *{height:100%;width:100%;position:absolute}.x-video-ghost{-webkit-background-size:100% auto;background:black url() center center no-repeat}audio{width:100%}.x-panel,.x-msgbox,.x-panel-body{position:relative}.x-panel.x-floating,.x-msgbox.x-floating,.x-form.x-floating{padding:6px;-webkit-border-radius:0.3em;border-radius:0.3em;-webkit-box-shadow:rgba(0, 0, 0, 0.8) 0 0.2em 0.6em;background-image:none;background-color:#03111a}.x-panel.x-floating.x-floating-light,.x-msgbox.x-floating.x-floating-light,.x-form.x-floating.x-floating-light{background-image:none;background-color:#1985d0}.x-panel.x-floating > .x-panel-inner,.x-panel.x-floating .x-scroll-view,.x-panel.x-floating .x-body,.x-msgbox.x-floating > .x-panel-inner,.x-msgbox.x-floating .x-scroll-view,.x-msgbox.x-floating .x-body,.x-form.x-floating > .x-panel-inner,.x-form.x-floating .x-scroll-view,.x-form.x-floating .x-body{background-color:#fff;-webkit-border-radius:0.3em;border-radius:0.3em}.x-anchor{width:1.631em;height:0.7em;position:absolute;left:0;top:0;z-index:1;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACMAAAAPCAYAAABut3YUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPZJREFUeNpi/PX7LwOFwAyIG6HseiA+Ra5BjBQ6xg+IVwAxJ5T/HYgjgHgTOYYxUeCQUiBeh+QQBih7HVSOLiHDDMSTgTiTgLrpQJwLxH9p5RhOaLT4EakeFF3RQPyF2o6RhkaBGYkheRmIPYH4KbXSjC4QnyTDIch6danhGCcgPgwNGXKBNNQMb0ocEwXE24GYn4FyADJjI76Ej88x7UC8FIjZGKgHQDlxGtRsZmISMMjy+dBQoSXYBC0gv+NyDD80xzgx0AeAqg4fIH6NHk0qQHyMjg6B1WvHYDkNFjIgwS1ALMowMOAjEAeBHINe2Q0U+AUQYACQ10C2QNhRogAAAABJRU5ErkJggg==') no-repeat;-webkit-mask-size:1.631em 0.7em;overflow:hidden;background-color:#03111a;-webkit-transform-origin:0% 0%}.x-anchor.x-anchor-top{margin-left:-0.816em;margin-top:-0.7em}.x-anchor.x-anchor-bottom{-webkit-transform:rotate(180deg);margin-left:0.816em;margin-top:0.6em}.x-anchor.x-anchor-left{-webkit-transform:rotate(270deg);margin-left:-0.7em;margin-top:-0.1em}.x-anchor.x-anchor-right{-webkit-transform:rotate(90deg);margin-left:0.7em;margin-top:0}.x-floating.x-panel-light:after{background-color:#1985d0}.x-button{-webkit-background-clip:padding;background-clip:padding-box;-webkit-border-radius:0.4em;border-radius:0.4em;display:-webkit-box;display:box;-webkit-box-align:center;box-align:center;min-height:1.8em;padding:.3em .6em;position:relative;overflow:hidden;-webkit-user-select:none}.x-button,.x-toolbar .x-button{border:1px solid #999999;border-top-color:#a6a6a6;color:black}.x-button.x-button-back:before,.x-button.x-button-forward:before,.x-toolbar .x-button.x-button-back:before,.x-toolbar .x-button.x-button-forward:before{background:#999999}.x-button,.x-button.x-button-back:after,.x-button.x-button-forward:after,.x-toolbar .x-button,.x-toolbar .x-button.x-button-back:after,.x-toolbar .x-button.x-button-forward:after{background-image:none;background-color:#ccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f2f2f2), color-stop(3%, #d9d9d9), color-stop(100%, #bfbfbf));background-image:-webkit-linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf);background-image:linear-gradient(top, #f2f2f2,#d9d9d9 3%,#bfbfbf)}.x-button .x-button-icon.x-icon-mask,.x-toolbar .x-button .x-button-icon.x-icon-mask{background-image:none;background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #262626), color-stop(3%, #0d0d0d), color-stop(100%, #000000));background-image:-webkit-linear-gradient(top, #262626,#0d0d0d 3%,#000000);background-image:linear-gradient(top, #262626,#0d0d0d 3%,#000000)}.x-button.x-button-pressing,.x-button.x-button-pressing:after,.x-button.x-button-pressed,.x-button.x-button-pressed:after,.x-button.x-button-active,.x-button.x-button-active:after,.x-toolbar .x-button.x-button-pressing,.x-toolbar .x-button.x-button-pressing:after,.x-toolbar .x-button.x-button-pressed,.x-toolbar .x-button.x-button-pressed:after,.x-toolbar .x-button.x-button-active,.x-toolbar .x-button.x-button-active:after{background-image:none;background-color:#c4c4c4;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ababab), color-stop(10%, #b8b8b8), color-stop(65%, #c4c4c4), color-stop(100%, #c6c6c6));background-image:-webkit-linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6);background-image:linear-gradient(top, #ababab,#b8b8b8 10%,#c4c4c4 65%,#c6c6c6)}.x-button .x-button-icon{width:2.1em;height:2.1em;background-repeat:no-repeat;background-position:center;display:block}.x-button .x-button-icon.x-icon-mask{width:1.3em;height:1.3em;-webkit-mask-size:1.3em}.x-button.x-item-disabled .x-button-label,.x-button.x-item-disabled .x-hasbadge .x-badge,.x-hasbadge .x-button.x-item-disabled .x-badge,.x-button.x-item-disabled .x-button-icon{opacity:.5}.x-button-round,.x-button.x-button-action-round,.x-button.x-button-confirm-round,.x-button.x-button-decline-round{-webkit-border-radius:0.9em;border-radius:0.9em;padding:0.1em 0.9em}.x-iconalign-left,.x-icon-align-right{-webkit-box-orient:horizontal;box-orient:horizontal}.x-iconalign-top,.x-iconalign-bottom{-webkit-box-orient:vertical;box-orient:vertical}.x-iconalign-bottom,.x-iconalign-right{-webkit-box-direction:reverse;box-direction:reverse}.x-iconalign-center{-webkit-box-pack:center;box-pack:center}.x-iconalign-left .x-button-label,.x-iconalign-left .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-left .x-badge{margin-left:0.3em}.x-iconalign-right .x-button-label,.x-iconalign-right .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-right .x-badge{margin-right:0.3em}.x-iconalign-top .x-button-label,.x-iconalign-top .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-top .x-badge{margin-top:0.3em}.x-iconalign-bottom .x-button-label,.x-iconalign-bottom .x-hasbadge .x-badge,.x-hasbadge .x-iconalign-bottom .x-badge{margin-bottom:0.3em}.x-button-label,.x-hasbadge .x-badge{-webkit-box-flex:1;box-flex:1;-webkit-box-align:center;box-align:center;white-space:nowrap;text-overflow:ellipsis;text-align:center;font-weight:bold;line-height:1.2em;display:block;overflow:hidden}.x-toolbar .x-button{margin:0 .2em;padding:.3em .6em}.x-toolbar .x-button .x-button-label,.x-toolbar .x-button .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button .x-badge{font-size:.7em}.x-button-small,.x-button.x-button-action-small,.x-button.x-button-confirm-small,.x-button.x-button-decline-small,.x-toolbar .x-button-small,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-decline-small{-webkit-border-radius:0.3em;border-radius:0.3em;padding:.2em .4em;min-height:0}.x-button-small .x-button-label,.x-button.x-button-action-small .x-button-label,.x-button.x-button-confirm-small .x-button-label,.x-button.x-button-decline-small .x-button-label,.x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-button-small .x-badge,.x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-action-small .x-badge,.x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-confirm-small .x-badge,.x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-button.x-button-decline-small .x-badge,.x-toolbar .x-button-small .x-button-label,.x-toolbar .x-button.x-button-action-small .x-button-label,.x-toolbar .x-button.x-button-confirm-small .x-button-label,.x-toolbar .x-button.x-button-decline-small .x-button-label,.x-toolbar .x-button-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button-small .x-badge,.x-toolbar .x-button.x-button-action-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-action-small .x-badge,.x-toolbar .x-button.x-button-confirm-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-confirm-small .x-badge,.x-toolbar .x-button.x-button-decline-small .x-hasbadge .x-badge,.x-hasbadge .x-toolbar .x-button.x-button-decline-small .x-badge{font-size:.6em}.x-button-small .x-button-icon,.x-button.x-button-action-small .x-button-icon,.x-button.x-button-confirm-small .x-button-icon,.x-button.x-button-decline-small .x-button-icon,.x-toolbar .x-button-small .x-button-icon,.x-toolbar .x-button.x-button-action-small .x-button-icon,.x-toolbar .x-button.x-button-confirm-small .x-button-icon,.x-toolbar .x-button.x-button-decline-small .x-button-icon{width:.75em;height:.75em}.x-button-forward,.x-button-back{position:relative;overflow:visible;height:1.8em;z-index:1}.x-button-forward:before,.x-button-forward:after,.x-button-back:before,.x-button-back:after{content:"";position:absolute;width:0.773em;height:1.8em;top:-0.1em;left:auto;z-index:2;-webkit-mask:0.145em 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAiNJREFUeNrEWb9LQlEUvj5BcHoQvMnVKXD1D3CLwqBJbHJsazQaWoSCxgbHJiMIAiNok6AhCDdXVycnJ8EQOgeOYaG+d39998KH+HyP753zzjnfd325xfdSgVeV8B6BScuEV0IRSbxHeCMk/AVFXCA8ScQKSXxPqK0fQBBfE5r/D+Y8VzUT9jb94DPimqRYIYkrhGcpKhhxIqTxrpNcExdlQJTTTnRJnCc8ykhUSOIOoZ71ZFfEZ4S2zgUu+rguxZRHEnPbfKRVsOtUl0RtYpOLTYljIS2Z3nVk2DY9SbNCEt8RDm0rUpe4La1jvXSqmtum72raZI24KuNQIYl/nSGSOJb0Jq61M0pxhjwK9304hUjHGSKILzc5Q5drUzttdYY+I97pDH1FzG0zNFUb04gTG4kzJS5kdYauiZtZnaFr4ooKsCIVaDHxKAQxt1NBnGIVHfGCcEQYh3jGU8KBfMKLiyM+lgzAq/qT0ArVTg+Ei1B9fEPoovV4fcfQd2HedScX39GprwGTNjJn0maTELN6IuSzECLB6T5x2eM66jQgnIeSxa60GnS3uL56tr7b1Ai0JPVwYi6yho2U2lgfKym19VxjMRHzEGbvS9K+RBPzetGVUpf29lZHSl2/DMnLvwh1ZMQrKW3Ic4fvJOZS6ZMQW5hpmpT63DvtlFLfm7bBNruM2C2yXb7y3U6ZpRS5P/4jpUjihRTbCJ3q1eL3GMMfAQYAJmB6SBO619IAAAAASUVORK5CYII=') no-repeat;-webkit-mask-size:0.773em 1.8em;overflow:hidden}.x-button-back,.x-toolbar .x-button-back{margin-left:0.828em;padding-left:.4em}.x-button-back:before,.x-toolbar .x-button-back:before{left:-0.693em}.x-button-back:after,.x-toolbar .x-button-back:after{left:-0.628em}.x-button-forward,.x-toolbar .x-button-forward{margin-right:0.828em;padding-right:.4em}.x-button-forward:before,.x-button-forward:after,.x-toolbar .x-button-forward:before,.x-toolbar .x-button-forward:after{-webkit-mask:-0.145em 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAB4AAABGCAYAAADb7SQ4AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAXlJREFUaN7lmTFqAlEQhh8EhFSCYJXW1law9QAewMrWAwQWAmmtbPcGHiCQ1gPYCla2QsDKSsgmQecvFqImu2/fzry/2OLb9mt23vwz47Kvn5MwEFxM8DkLB6HHEIOd0GGIwUpoMcRgyRKDOUsMJizxpzBiiMFR6DPEeZl1GWKwFh4ZYvAmPDDEqmVWVQxmLPG3MGaIVcosVAz2whNDDDZCmyEG7yFlpiEGKUsMEpb4XKXMtMXeiVVb7J1YLcRgW1ZmVuLSxGopLkys1mLwwhL/mVhjie8Sayxx3kp7DPFVYo0tzhNriyEGU5Z40TjxtDE/F6WcDowHBE/msDFNImG0xZQRBAonDCvxhhH2vKZIZ9Ds+7EDfaWFnKZ4xhja5owxdcnYCAQv1p1Gi4sprn08cZbDt6ZYZasXIn5mLFHTjLCvVt1V+4rVt/M+4r3FPaJMbHaBKRKb3pyKxKZXtv/Er4yjZpRL6q042u34tzh4xV9H/FHnqBHKBQeEd6aqqwD6AAAAAElFTkSuQmCC') no-repeat}.x-button-forward:before,.x-toolbar .x-button-forward:before{right:-0.693em}.x-button-forward:after,.x-toolbar .x-button-forward:after{right:-0.628em}.x-button.x-button-plain,.x-toolbar .x-button.x-button-plain{background:none;border:0 none;-webkit-border-radius:none;border-radius:none;min-height:0;text-shadow:none;line-height:auto;height:1.9em;padding:0em 0.5em}.x-button.x-button-plain > *,.x-toolbar .x-button.x-button-plain > *{overflow:visible}.x-button.x-button-plain .x-button-icon,.x-toolbar .x-button.x-button-plain .x-button-icon{-webkit-mask-size:1.4em;width:1.4em;height:1.4em}.x-button.x-button-plain.x-button-pressing,.x-button.x-button-plain.x-button-pressed,.x-toolbar .x-button.x-button-plain.x-button-pressing,.x-toolbar .x-button.x-button-plain.x-button-pressed{background:none;background-image:-webkit-gradient(radial, 50% 50%, 0, 50% 50%, 24, color-stop(0%, rgba(182,225,255,0.7)), color-stop(100%, rgba(182,225,255,0)));background-image:-webkit-radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px);background-image:radial-gradient(rgba(182,225,255,0.7),rgba(182,225,255,0) 24px)}.x-button.x-button-plain.x-button-pressing .x-button-icon.x-button-mask,.x-button.x-button-plain.x-button-pressed .x-button-icon.x-button-mask,.x-toolbar .x-button.x-button-plain.x-button-pressing .x-button-icon.x-button-mask,.x-toolbar .x-button.x-button-plain.x-button-pressed .x-button-icon.x-button-mask{background-image:none;background-color:#fff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e6e6e6), color-stop(10%, #f2f2f2), color-stop(65%, #ffffff), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff)}.x-segmentedbutton .x-button{margin:0;-webkit-border-radius:0;border-radius:0}.x-segmentedbutton .x-button.x-first{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-segmentedbutton .x-button.x-last{-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-segmentedbutton .x-button:not(:first-child){border-left:0}.x-hasbadge{overflow:visible}.x-hasbadge .x-badge{-webkit-background-clip:padding;background-clip:padding-box;-webkit-border-radius:0.2em;border-radius:0.2em;padding:.1em .3em;z-index:2;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0;-webkit-box-shadow:rgba(0, 0, 0, 0.5) 0 0.1em 0.1em;box-shadow:rgba(0, 0, 0, 0.5) 0 0.1em 0.1em;overflow:hidden;color:#ffcccc;border:1px solid #990000;position:absolute;width:auto;min-width:2em;line-height:1.2em;font-size:.6em;right:0px;top:-0.2em;max-width:95%;background-image:none;background-color:#cc0000;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ff1a1a), color-stop(3%, #e60000), color-stop(100%, #b30000));background-image:-webkit-linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);background-image:linear-gradient(top, #ff1a1a,#e60000 3%,#b30000);display:inline-block}.x-tab .x-button-icon.action,.x-button .x-button-icon.x-icon-mask.action{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFI0lEQVRoBe2YW4hVVRjHZ0yzq6lFEaMlE0PShYRAJIl6iEqKHnqI6WJB0IvdICkfEk0aIyo0KFCph8giCitI7CkoohQL7SoZDaQmXSgKo4uWNf1+zt7DOXvOOXuvvc85bc+cD36ssy/r+77/Xmt9e+3TOzIy0jORbNJEEqvWruBOH/HuCHdHuMOeQOmmdO+ozaA5oxXPunSC2Re4MbgCNiB6vvqbKbx0giNxp9BeBU/BIJqnRecLN2UVrLDj4GIYgscRfSltYSuzYMUdA/0wCI8ieglM5XduK7vgWJhTegGshucRfQHkyj1XpziLNrfmOh2ug1dhMaJn0gbZZDpNpsexQb2y3azfKXCAwns4W5dMd7m2B2ANLCT/x/A/nKknN5mUhWFp1g4Z7vM14jrbBZvgEwi1tAdkDEf3ZrgI0S/RrkP4IdqGpuA+cJo0yw7iyNfJmzAcMrokfjp93HC4XrPYCdzkgPXDPPqvJN7eRh0VrBWqfKMuev6k3Qzr4SP4HWqOFIkZ73iYA/NhLpwPZ4LLS+FZzUp+GtwAA/heS/sGwv+irWnXc9bdTRF20/8eOBWmEKwnCectOrPhSlgF2+Bb+Bl+AxP8B/6FvLn8Td8fYQXMSubgsVZU8Cv4mAeNhC7k+jLYCopzrRURlvZA9P8WLIJJlcI5zi1Ypw+Dr4oqp3EAzlsbLCjfg1PeEUxLtlnXXU4/wQboq8gpl2BHx2l5UuyosuW8I6rQb8Bp1iwRefy4VN6FReaopU3pX7jnhwSO7MmVIiNnJ3L+DtgHCm3ltA0RH4/26rhKk1tdu4kr7yeuHkKgU3rMqI5ncfAQDIKbg14oi1nJv4OvTShthC9LjmTyGB8XwhZw+oQ8+Xbc68C8AOboK6+YYPpfDV+B06YdAkJiuMtzhvrOP1JYafMLpu/Z8CmEJNGOe60fz0J/cjZmWcP0G2+sWZ/aUnCqhFosOq7gyf6uOT888th+Ot0HmxF7MOkgt2AcXQNLkg5rHPv+dffjVvPX6PdeWtf7MJhUssD578ZtEGL6sY4MIfTjeh1zCWZ0Z+DwQXAkapkjtzviPdoPYB+JuJVMNfy7QQkR7MbGPfRaYhi7ruUSjLcbwe1k0tw2vgivwy6C70/ekPE4JK+N+HySWDuz+A5xXOnvlsqD6Lf/QjwBnxNc4a02YwzBeuIdyBosWDDT7RKcn1MRYA+/V8ImAv9Rcb5VP53ufoQ8AB8S0+PMFiwYz5fDzCjCF7SLCbojOm514zZ3HViYLIZVxmD4h8B0rtWtFXkEn4tTv22thPe2SawVeDs8TTz/NqoyhLqDGoC7wervt3lNCxKMY/fIc+BLuJXgn9G20pyuVuA1sJF4vt7GjHx8nZnT7XAXzIXnoK4FCcbLVHAqLW+DWF8v78Aq2EY8v7zGDK2+EmfBI3AtTAPNTU1dCxXs/a6ht+t6bM4FNykvw/0IdYSrDLHu8iyeQ7Cg6mLKQahgd0pbSOJwit/cl6Np6p+BrxGn6hNUp1z3m/tOWAH+DrIgwSTQcBcTFLnOzcRwSjZ6j/vdvQyCxRrSanu0mWvZqp3LjkbBuYTGnSac4CxreCQqJPFD+r/bhq+dtOSyCO7DyWzIcm9avKLXXb+FcskiYjlBfB0lP9KLJp+nv6N7ZL+cp7N9sgg+L6/zMvabcEWrK7iM07CZOXVHuJlPs4y+rNJ74JkyJpczp62N+vWOfpw0uqWzrnXXcGeN53g13REe/0w660x3hDtrPMer+Q9LNCcV91c+jgAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.add,.x-button .x-button-icon.x-icon-mask.add{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAABqUlEQVRoBe2awWnDUBBE843B4NxcQSAFOC4lJeTkoxtJDykgvRhcgCFNJCFgIs+ChEHSJX93YT6ZD4ssmR3NztNFH5Wu6+6iVynlEZpbp+4J3s5OjWm7DRxZuMMCdUB9oyzNmrJe01hEejMtM5exIh6bCI3JbFkDT27EckEDs5DI8iHCWcmy6IowC4ksHyKclSyLrgizkMjyIcJZybLoijALiSwfIpyVLItuOGFso/xiuEvAgJdeK0DqJrHEhtsTTh9ul9y/ChR2KE+Y1ruDt2ccI7d6PszcK+oFFblWELt3Cn6i/8epMW5/W+LKGrUZ/0NwboF5QxuPsfY8dmOxJs41cBOYHCZF2BFeE60i3AQmh0kRdoTXRKsIN4HJYVKEHeE10frvCNvr4RH1HojH3rGHr3hqA7VdkxPKvuKJ3AA4hn7BM3xxA5N71Fdv1gz/tax3P+hFHmsJwM/8wraMadqOh5GuXda76rVqNWb7wgeevQvRRQ1MBCPFiginxEokKsJEMFKsiHBKrESiIkwEI8WKCKfESiQqwkQwUqyIcEqsRKIiTAQjxcoVrP83/9czD9EAAAAASUVORK5CYII=')}.x-tab .x-button-icon.arrow_down,.x-button .x-button-icon.x-icon-mask.arrow_down{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.arrow_left,.x-button .x-button-icon.x-icon-mask.arrow_left{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGMDZEQTFBREFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGMDZEQTFBQ0FDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFGQzJEMjQxRjIyMDY4MTE4QTZEQzUxMDg5Q0Y0RTRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+FXGmxAAAAghJREFUeNrsm09ERFEUxt+rxBAxqyFm1SqiRYpMSpFapUVaRGpTRIpIbWLaFJEoRZtilChRWiRKsyklilYRERERERGZvsN57Wfmvnnnznkfv+WM+bn3e/ePN24mk3E0pcRRllC42FOWy4dc1w30R+fz3LFthEs1TelZ0KlBuAIcgmRgHS5gqlm2RsNTmqbvrUlZycLT4BhUiliWfEwEbII+UeuwT4nzqNZq2Gm1gTu/ZaUIj4NTEBW7tTTY1zUwKH4vbaive6BBw2kpAa6DkA1CeBicgZhVx8McUg5WWNi+83CWiXFfE9ZeAGQR6ukBqJKyu/Gzw7TcXEiS9UuYbiWWeU8ckXYqMT2lozyFW6SeOU0K1/FhPS75RsHUlKbj3KV0WRPC1Nd5sCuxr6anNPV12zFwk2jLCCdtk81XeAIsahL+BVOgH3xrEPayA5rAixZhyj2oB2ktwpR30A5WtQh7vR4DQ+BHg7CXLdAMXrUIU26411dahClvoBVsaBF2uMsjYFRCrwt5a7kOOnjUVQg7vE43cr9VCDu8I6Nep7QIO7z3HgCTvHYXvbCXJe71hxZhyjmv1w9ahCnP/DDb1yLs9boXzGgR9rIAusCnFmHKCff6UYsw5Ymlj7QIU75AN5gz9YVuLu8eB/S+dA+v1+l83pe2Sfg/BRe2OeGfPELhUDgUtip/AgwAw4tbozZtKFwAAAAASUVORK5CYII=')}.x-tab .x-button-icon.arrow_right,.x-button .x-button-icon.x-icon-mask.arrow_right{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGMDZEQTFCMUFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGMDZEQTFCMEFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFGQzJEMjQxRjIyMDY4MTE4QTZEQzUxMDg5Q0Y0RTRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+xvZexwAAAhhJREFUeNrsm8FHRFEUxu9rxhARsxqiVauYXWoTpTYtUkRqlWkz0WaiTW2iNi3atGhTm4k2E5GYSJRaZcZQtIqIISIiYhgyfZdv/oF59913X+cdfst5733u+c495743XqvVUpKiSwmLWPB/j2QnP/I8L9SH9lN3/KxwQlpKT4FtaR7eAhegR1LRmgEVMCCpSg+CGtNczLbUC8pgQ9I+rCv3LiiBbkmNxwJ93S+p08qCRzAhqbVMg2tQkNRLa1/vg6ILvrY5POTAXdi+tj0tDbOYjUoaDzPgBuQlzcMpcEhSkg4A8lztjBTBin6u0d8iBOvoYwXPSRGsuEcXuWcnJAhuR4G+TksRrGOMfXhWimDFjqzCyUuE4LavS5yxExIEt0OfopRN+DpKbx6MHAtHSfAeWPN7kWQEhDbAMjg1cTHXBdfBLHiSUKXvwZBJsS4LPgCT4NP0hV1L6SZYAcdB3cAlwe9gDlQlTEsP9Gs16Bu5IPgIjIOP/34AoP26Ss82bd00LA/r1Vzk1mM1whCsfTrPpsJ62E7pE/q1HpaPbAn+Betgib1xaGEjpb+Ywrcu7H9BC35m8//mSncTZEqfgRGXxAYpeJNp3FCOhemU/ub+euXqzGlS8AuYBq8unyiYSulLNv9OizUleIcr+6MiEF4n3x7ze2n9OkSfE5/bfmg/30v7ERxaWBcc5Yj/5BELjgXHgiMVfwIMAGPkXbHq6ClAAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.arrow_up,.x-button .x-button-icon.x-icon-mask.arrow_up{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDQUZBQUM3NEFDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDQUZBQUM3M0FDOTMxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkFGQzJEMjQxRjIyMDY4MTE4QTZEQzUxMDg5Q0Y0RTRFIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+ar3jxgAAAbFJREFUeNrs2j9ExGEcx/H71YmmpoiIaIq4KSKi6dabbo1oiqamm1qboimiNZpuuikiIqLppiPipqYjIuLp+/D95vy6X/frfr/n730e3sst53XP9x7u+V2ilKpM05qpTNkCGGCAAQYYYIABBhhggAEGeNSqpl9IkiQKWNbvfBc7PDdNIz1PPVK7Trd+OMPrRr8l9Uat2nT9+CyCW4yVnnnHowTXqa8UWHcdI3iNGozASscxgReo7h9YxTtfjwXcHoOVBjwJQYNPcmKlLk9EkODGP7FSO0TwOvU+IVjxZAQD1iPZK4CVGiGAZ6lOCVjFE7LhO/i0JKzUK3KImQY3S8ZKHZ4cr8A16sMQWPHkeANepF4MYqWmD2A9arcWsIonqOYafGYJK73yRDkB71nGSnd5r4jKBG9Sn47AunOb4CWq7xAr7dsA61G69wCreMK2TIMvPMFKfZ44I+ADz7DSQ9YhVgS87fiQGtdlmeBlvkNWnndYBljfGT8FgJVDbKco+CoQrBp6mrEyKfgoMOyvpxlZ4CT9vcXj0shWNe8nE8vCfzwABhhggAEGGGCATa1vAQYAZekAmr8OukgAAAAASUVORK5CYII=')}.x-tab .x-button-icon.compose,.x-button .x-button-icon.x-icon-mask.compose{-webkit-mask-image:url('data:image/png;base64,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')}.x-tab .x-button-icon.delete,.x-button .x-button-icon.x-icon-mask.delete{-webkit-mask-image:url('data:image/png;base64,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')}.x-tab .x-button-icon.organize,.x-button .x-button-icon.x-icon-mask.organize{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAEdUlEQVRoBe2aS2xMURjHjbbqUaLoI7RChQUiGo9YaEqkoolIkCASSki68dixsLIVYmHbkJA03UgkFRI2QgRBKl4RgtJFK0jUI+o5fv/p68ztmUlHzpzO9PZLfjP3fOfcO9//fOeee+69E4lGo6PCZKPDJFZaQyc4N1mGI5FIMfUVkAfZMPaVwE54yqn6i+8BllQwravgAEyEv5DppsQ8gYPw3hqsJi0bNJ4El0GZzSa6iHcbjLbpsp7DDGX5V8ByyDbLJ+CdUGQLPNGQnkzj3TDFspN68BNkwhDPIY5poG/T1lBYR+LOkuW4uSeR4KXssN48grF9h20NdeukYLRL96Y6vAD2wCwwbQyFvXARPpoVA85fKnXiN4HtvP2Gf0tPG3XWUKNYT4E6PxjvD3x1EDHPZZvgxTTSDBc8gMrKbql5gKHeJh7NM6/AFu91/EVmjHGTFmN+HA3qYSoE7SuO8+zcEawY4vJdfr8Z/ljiqMS3AV2RvjpTPc7V0A623rqJv8RsnynbxDUXXieJuy/LfRmmEzSd7wKtroL2Hcc5BL4LVmRCmbheEIfmHduVQ1muQV/3BN2bJZyqaANbdm/jL+xtm4nfxKcsP08Q/zX8MxV3TDXqx+PYBGUQNHVAI9AsYrsuB9sPVflDT5xH+O7OZn8kK9msJf6G3ooFOOr66+O2NOVL6A7oP/njmmREQcN5LGhy1cLJtBwK++FSLqrVSGvPcrCZGu8DZTqTBSs+zUkarTZTUrerYh50gHYY7rSpRxZCCYTByvouS2FQK42hE9w7S/tKsOaIt/AGfoMWO3OgFLyYb8FaGByHl6C1r27jlsAh8HaN14LD1+x8jN/KNVdqlAvhgq8YfJ/DLYjVUDatk8J905HObd+Cf1rEaHTp5sSL+RacaKWWyO+8E3wLdi4g1QOOCE61x7Kt/UiGsy1jqcY7kuFUeyzF9ok6WA8ZvJjLtbQWEI/hXpLIW4N1rLyiPHV5hP9MsM4or2V7hlH+702XghWE3gAcTRKN3mjY7AZOdZbNCnAug4wTrNXSItCrmmYSZ3tGTNVAo+1nvCLOyLyeT9WC7WlqXNtUCq7vlpTlGkQMeG+Vio9j6NbxMOjtn8u7udjzaJcH1H3uLViVikCzLftqEtsKbeAyNh3LuWAdVM+yr8JsU8hgt9mvGh6ATousEKwgdcvXCMWDFap2mOYBTWK6b3YtNvYDrs9hM0i9BTgB+YMRTbvp0AS6bzaP43I7LUPaDFBvHPVmIy+ZaOp1+TkJX8Dc3/V22gUrYF1jN4L1r0T4NSPXg+sZ2dZZXgRr5m6BymCW8en6rc54BrYAXfu8CFbQmoQ0c1eYoilXw0NQp7gWZzueN8H68S44DbG/IPA9H66AL7FR12tpYk9qetOwGfSaVjcMNVAFie6iqHJv6bws2YaUfLpctYP+S5WoTVr8vjOMvphN4FN4N69Dybs6yw+OCLZ0yrByhS7DmrRaoQE0Kw5707JOf/UvH/ZKewTG/kscFrHSGbpzOHSC/wHSRhVOrpN3ggAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.refresh,.x-button .x-button-icon.x-icon-mask.refresh{-webkit-mask-image:url('data:image/png;base64,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')}.x-tab .x-button-icon.reply,.x-button .x-button-icon.x-icon-mask.reply{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAES0lEQVRoBe2ZSWgUQRSGM24YTdSo4AYRTcxBEZJDJCoigrtGg6CIgihqogfRgEERguhB40UP6kHw4kEET4J4E9wPAdeg4ALigjuKcSMuMX7/mAmdSU/SXdM9PTPpBx/T3al67/31urq6K5G2trac3mR9epNYaQ0FZ3vFwwqHFc6yEQhv6SwraBc5YYW7DEmWXUhZhSORSC7UwKIgxzAlghE5CZFHoAEKgxTcz8/gCI3gfzHsh6l+xnLq2zfBaC0miXpYDvmgu+kXBGqeC0aohK2D7TAF+kPamKeCETseZdugGgZDSp4RxHFsnghGqKo4H/aB5uoASEtLWjBiZ6KsFlaAHlJpbUkJRmwl6rTcFKW1SktyRoIROhofdbARhlr8OTkMdBPNlWCE6iG0AA5AqRN1Nm1cxbTpn9Qlx8ERO4pIG0Br6yDDqH3pV4kvPdRewCd4C+/ZPdWx7xZxsk1LgqvIZDeUeZzRT/xJ8Dt4BQ/gGjSSVzO/3psEJ4JoY+A4fATNvVTwhjh34RSshMGJ8jO5biuWIJqrc6AJ/kIqhNrF+EFs3fqHYRoMMxFp7dNFME5Hwi5QMLskgrqmgb8M+hgZYRXh5riTYBxpFM9CUKKcxlWOSyHPjVi1jQqmYy7shQ/gNGjQ7f6Q6yWY7UY07XNK4CK0QtAiTOK/J29tLOQ7EU67nIGgtfU1mARMhz6a3zegtCfRHXOYxhXtndJBgGkOT9FQ1Z3oDsFqhBXAFngJpkGD7veN3NclEt1JcKwRHaaD3niCTt40vh6+q2N6rL+2gtUA03p8FL6AaeAg++ntsNwqNqor/kL8OZ2WgF71vEpeq8FvC36uDveJM8qqyenHwzg67oE1MAxMTeLOQyNod0SDqO2hCaDVIma6u3R9OAxq/9WxW9PT+wRsQ7RiE7Gbj4f4v9F8Fujxb1ptfR2tj/cbf04bfbbqZWgsFEM5LITNcBLc3HF6iM2IxXAlWJ0wJXEQfoFb4RJcEwtu8kv/PCiEGdAAevFQJbvL5Rh/j351uRbcLloVmA83ewgUn0TSgq2DRGzloVt9E9yDFoiPqfOvUBHN3erA7TFOtG6fBqdfVp4KtuZLDqr8DrgDdqIPcb2/UYXjAmmu1cLDBIGswX0THMuJHIrgDGglsMZu4nxI0oItgcbjUHP7MyRaanwXrHywvlAFj8E6v+dqZ8MTI9BzHO2DtaC9KY1wIEYurXCO4JrbjyA6CvzO80wwznS3tMAFDpfBKdArnkY4ECOXqwTWUqZvA1mJp4L/+4wKf8ZxDeyE26AlLBBD9HUC14GWr8mezWEc2/oiiNZM/TumGbRLkdQ6nChOT9eJWw3ffakwjjuMRF5wUg9b4QnE5hOHKTVNsSuO3qW9SosN/Yn4KmAQbnnl040f4pelVLCb5Pxq6/st7Vfipn5DwaYjlyn9wgpnSqVM8wwrbDpymdIvrHCmVMo0z15X4X9rh8wHLEjawQAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.search,.x-button .x-button-icon.x-icon-mask.search{-webkit-mask-image:url('data:image/png;base64,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')}.x-tab .x-button-icon.settings,.x-button .x-button-icon.x-icon-mask.settings{-webkit-mask-image:url('data:image/png;base64,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')}.x-tab .x-button-icon.star,.x-button .x-button-icon.x-icon-mask.star{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFfUlEQVRoBd2aXahVRRTHz/Ujv+2mZRGZB7W6mtpFikC7+UWUZiqBD0JPFdRL1EMFPfjoU4baS0FUD/UWZBEVShA+BCpmWApRSkgllNpDmZWZt9//eOay72afvWfWOTPn3rvgz8yeWbPW+s/XmT379AwODtZSSQ+CryVgA/gVfIx/pelEhFMBVlvBOaBeFo6Cean8y09KsnMg932TqCOs9M2UhMfhMJVsxtHcAmcbmekLCsqjFKUkvAYG1xSwmEHZqoLyKEVJCDOCNxH9HUCbVl6mULAuXxjrOQlhgl8Bbi0h0Uen3FBS37GqVIQHiHh2SdR16jTlo0t0woycpuxiUDSdHcFeMv3uIWYanTDB3wIWVZBQHP10zuQKvbarUxDWT1HRz1E++Ds99fLtgp6jEmbExhPNcs+IbkZPiCpRCRP5TPCQJ4MJ6A3QSUqjSWzC2ozuC4j+fnSnB+gHq8YmvJKIJgVEpRPX9QH6waqxCa8PjEhHT981H2j6qno0wqzF63BhOUxsom3Zb7aJqGsUjTAONFJlpysXQz7VuXpavrBTzzEJaz1adlzNjHs6RTBvJyZhjZTF/kTaWZZCnlvhsyWgQkPZQpagzsX1bFlAXjGtDdAPUu1p3PPQhCCXkdwG/mta0PWLds060AuAnqtEOjpdbQR3VymX1P9F3UfgGJA9X9F92c/ADaQ2P8V0DJ4/kDbeYKaSvgI2AN0+OGJK1VAbSIhTOXEOybYll2kte77yD4rqrHyb85S9Cl4HtReAyI11/A7HpRq5PSD6oR0f3Rad+H7S1DvV7UgS+tc1cU3n3V/AWJ/SX8BxVuMinow2rNNjlPQVeH0GFg378kDBfLAPXARjZbTPwmUXmOG+bgz71EKFfqKeAUWfREZbJxyCxyOOqEuHER4qrNUWovwy0CFktBHV4eNZMNvxyaaFhKWAaBt/HJwEo4W0luSKLMF8viVhp4iBeeBd8CcYqcQ1qi+CKS7uVmklYdcQY0+C42Ckkf6EmO51cVal3oRlCFkCdKgfCWtbo7obDO3AVWQbHHyUsjo40E6uq9cvQbdG+wN892fj8s0HjXDWKA51/t4JUo72H/jTDtybjSUkbyYsJ0gdfAtSjfTn+JoWQjCv2+57a4M1QaQSvZvrMsIs7RJejGcdUlLJUhzpZsYsZsJcCen6ZwCE3IaYA2021OfUdU3fJltmwni7Fvh+KDMF16KR3ux0lWuSdgjPxeNdJq/tNdKNqJaSSUyEmVK6JNPomtqbIh3eSKNsEmvAarfJ5LEzjbbR59MtpqyEb8eZjpndkhtxvNri3Er4YZxpx+yW6Jdhi8V5MOHm+n0QZ9afo0u0fQO8A5S3iPaQ1cTSG9w4f/SqesZBH/gRWI6T+gyyxfkgvw2cMdrS+/lTzpZvGnyWxsnTwHLRd4R2a/OBqQyoztKBe/P2qp6DCBOUptKHhuA+pU1fq2Co0/F0L9CVaghxXTbWW9ktKg8lrFfCrwODeh/9wgu1bEDo6OT2Fvgb+JLWq+nQEsnaa5UPJbwKBxc8A9KXPG1O3u+u6E4F24GvD3XMDjCxFcF8uTdhjGpHfwn49L42lCeAdyDZwGi3HpwAPr6+Q29htn1ZPoSwfuz3ewShXVcBNz62lzkvq6O9DjZHgQ9p72kdQljvob9VBPAN9Q+UEQmpw5b+Sf8e0FotI/4a9ZN8bIcQXlnh9AD1y3ychuhgU0tpJyhb14epn+ljN+Sk9S9G1ct50d8SdgF9x9EO3lHB5hXwPEYfA8dbGD9LuWZBtfj0inSQWUDTKzu1dAB5Dkz2tdOOHn70LvwVyMag/FYwzse295Rukq5j+G1wEOib66PAy5FPMD46+NPmqTV7CpwGGvkJPm2l8z8GWDNDloqpGQAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.trash,.x-button .x-button-icon.x-icon-mask.trash{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFBElEQVRoBe2aS4gdRRRA8+L/m0QIJkYNLlQUNOAvigpRcCEIcSsiCLoLLoILcaM7QVBX4koRshDxt9CFKCoiuvGDCP5QkxCiJhInRo2Ovzie80gPNWX1dL3uesM09IUz3V1169a9daur+031aG5ubkUpGY1GK7G1Dq4Cz9vKiIY74Sv8+72tkWQ7Ay4Bxo+Hu2E3/AuOZBf+ov2TsL6Ef5WNUsGazXvgEHQJMm77N/aeg3Mrh7seOweMM2bWYH+B2OES1/9g9w0oEnSngHHCYO+FGSgRXJ0NM/0idA565BRpKyxSt9J2B5xWY+Mw5Udq6uqKT6XimESlmX4d7sTnA4n6rKJjs7QSSgTrSno7nJyodtFyGr4AP4G6TeLIHweb4A44C0LR1xtgCzwP7aTtIkBvLlSfQjwNZyl7FNa0sU077V4DX0Js25X7cRjPzDb2Nd5FnK7xPbGXskdwxsxOLLRzdnwIj8GvkQFnypqobKLLrgGnOjMzP6cqJijzfn0NXPljmXRNWNC+dcBHM7HA2NELp10nwbaz5iC4OsdidTyrYp3a68ZFi7XJFfNsOBGcUmFnPpbiBWkVZefT7g+OXcTF0EUsFPtaje0Lw0LOzfoM49B4Gy36WMKwK+WDcC2cAmGwXK7YAAYdym9c+NiIdUOdnHODc6DjpPioix9LBvwtPE3QOzjWi7MjBS0M8CGY1huUA1ISg/4cNqXiqcqSwVqJ3AQ/QEmnpm3LR+IzsLYKMD4mA6bBOfAKuFpO28nS9v0Bcxckn9V1Ad9Pg2m/H5cONLT3Mf5fFGfX63hBQG8s7/LXxcdV0nvjMtgKp0MojuaroM60xYB8Z78ZTog6c515B1ylXey+ARe3/0tqFNCy0RjrkdvgOwhH0TeiB2A1uMBNGx9Ta+FZiP34mrIrQR39cECSUzqZYYIcR0mjJtmFwmHUvdenLjwmnUl7Eh05+LP40fjvoGTACYN1Rc6CecGhM7lw2lt+AA7Fg4fOespXgYO0j3pvnXmh3rY+/52+vrXtRSd841rQJ/WV1JVX9eNj14DnjeHnJVw8DBeAnX8A2ynfXwXN+cWUPQUOjNl6i7Jt1I9nCOe+1V0NT4AB/wkvw31QRIoFjDfnwRXgfVbJGZzsry44boTNUGVjlvOToPpV5FvbjXApKE7VLZ6UkpWlDGHH+96pV93/4TSsujGA8MeF51Xw6njuO3soKTth/UTnJQOeqONFlKsBW0SlfdVyDLh9NBkth4AzBqnXKkOGe52+DOeHDGcMUq9Vhgz3On0Zzg8ZzhikXqsMGe51+jKcHzKcMUi9Vhky3Ov0ZTg/ZDhjkHqtMmS41+nLcH7IcMYg9VplOWY4/Md88cEtHbDOVg5Xx9jpsM9Yx52JeAcw1ontTXRdcm9pFz3vBveHdNJN6YPVRhrnivtMlruZ5g7DFxBuXLut8j7sA/d43Yr5CIpJsYAJ7DN2/27Bsw1gwAb3I8wLOp+g4w6+nw/6HddOyszqWDg/Qv2bXFwH4+1SyhyUYtI1YLc85wXn/ORAagWdPVRKUqh3AJwtdTLeWq2rbCoP76cm3bjeLG6ELjZim03XJujyJqXF6rtmeDvGNzMN/ajEAZi2rKOD67t00jVgN7+3dnFgqdsu5XRc6tiS/eUGvBTTNengBIVZPuYG7LcYPjdluYk++bTw++pGyQ34bSy9B35Vs5zEYGfgJfg+x7H/ADoy2VfnrtXoAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.maps,.x-button .x-button-icon.x-icon-mask.maps{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAADl0lEQVRoBe2b24tNURzHjfutXEPycDAltwhJbuMSJUqSB/HiES/+AK9ePc6T8uCFkImQW5KGkdwSxYyMGkZu45bbDOPzyZyTrJnjnDkGrVm/+szas2bv397f33ftPS+/Vdba2toj5igj0NcfRkG/3qWIJdcIrs/AO6gDq7cKPkOjUNAmxr8ePJsix8NUWAvLoapowSQawIUzYCZUwAqohF3QAjtgGTyCy5x/nfEu1MNDCmAxuiS4Vy8ST4DZMB9WwiTIRUGC26q1gKtWwyyYBsPB5aLIL5CNTxzotDeWTeA5DUKuO4xXoQbxHpcUbSIzJFkDi0EzdLYnBNGuYJJ4ch+YAhvB5TAORsKvib4x97vwPpk2FjJuhibu85zxAlyCangBLRQib06u68t5vk4uVYVqgO+oqy9v5ASTRLd0LQNLYB24bAfBnw5zikX0HtuhGW5ANY9ylvEBvIY3FOArcz7rWHCpboBFMAxyGjguKIZy1jzYCqfAD5BLslB8J3dCP/AdOgo+fKHXd3Sebh+EctCMieBK6Oj8QuYrXZ7roQr88PiSD4b/IVyyfhB9jQy/uppTUijYhANLytJ1F/sxzL7POpg97vQdFfwVTNYtQsHdKpLg2O1ODieHI6tAWtKRGRrISQ4HJYlsIjkcmaGBnORwUJLIJpLDkRkayEkOByWJbCI5HJmhgZzkcFCSyCaSw5EZGshJDgcliWwiORyZoYGc5HBQksgmksORGRrISQ4HJYlsIjkcmaGBnORwUJLIJpLDkRkayEkOByWJbKLbOVx0r3E7httIbttwNvzddt//JWxIfQynYX8pgu2TbgBbjw9Ds53sNHJv49gOehu5bUe2DfjXojDVpWG/9iu4CEegBp7xfO+LFfyGC5+AiQ7BFXj/c8s+xw+Z24PwvYwKnQxLoQLccGEB7Hsu9t5ckjcU2QjuozgA5+Apz9PCmItCbvqWs2vhJpwBl8ZrEuVtOebPtiWLbf2ymyL0ZVT8XJgDbgHIgFsPOhPmr4d7oAnHue9txg6jI8EfueIaHIOrcAuafieSc/IG19vw7TYD6UEBbE4vhwxMB7cizIYhYPT6MeR+WjBFPoCToEgF1hb6bD8LNpHLwT0L56EOGkhUchc6edoNcruvQWoQ7/6GMTAa3E2zACxGNjRhH9wHV4zP9oGxqCjj7C0wA06Ay/YliRT/T4MCuGnEfQ4feJ5mfvdfaG+OXSWdju+VpAoIK3D9tAAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.locate,.x-button .x-button-icon.x-icon-mask.locate{-webkit-mask-image:url('data:image/png;base64,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')}.x-tab .x-button-icon.home,.x-button .x-button-icon.x-icon-mask.home{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAEK0lEQVRoBe2Zy28NURzHe/vwqEepYkFIQzxWaCOC2HhELEgQImhXIrqyIEXikVQi+gdIwx9AItg1NiJELMSGhKQbobY2VY9Srfp8m5lmTO/cOXN7Zu656f0ln8zMnTNnft/z+505j5sbGxurmk5WPZ3ESuu0E1xbigjncrka3jsbftClIvsU5RZ65aLK5Lj/C75SzSjHWCuJYLxqhPXwBgYhylq4sRaixChDP8EzGIJ4UwNnCR6tgFswANegKer93LsLim4herm/JKqO8O+ZRdhL42acOwunYAacg2Hu3ePYj3Ph1A1fU2ySmZSZeCiTjxaC1LAboRs6QGJl8+AKXIU1kLqlHmHEqlFboQv2gD40QdPHqx3qKdtJkD8Hb9o+TzXCXmT1cboB+cT6evTVPgIXeWYl6DoVSy3COF2Hx0rjTthp4L0a/4xXrofn33OeqH8avKMqFcE4O4uXb4ULsNfEEa+M0v00LIIuCKc/P03NrAtGrD5Iiuh10Dia1JTOR0EZsjjpw3HlrQpGbD0v3AzFig36e4CLkeAPNs6tCUbsHBxS+mpsLSayYT2KtLBqVgQjdgFe7QP1u9VWPbRc2ZQFe2LV5zSBWG7ZP+vVTUkwYhvx6DicB+fFqvWKFuyJ1QxJ00It48rCNNgnNi+N23hQaVw2YiU0cYQRq9Q9CJdBKV1q02zMeEaWSDBil1L5JTgBDeCCzcUJ8cXImfACOeqayjbBffgDfqu6cPyJP3dgVZTvwd9jdzuoSFmgicRDGAYXRIZ9+I5fPbA6KC7feUHBVKD5rJZ1EutaZMOiv+HjbWjJJ9T/LVIwDyqyh+ApuC7WFy/RCk4r5HyRwWNewRSW2N3wGv6CX2E5HBWcB9AaFOqfTxJMQa1lNewosqNQDiLDPmqv+hFsgzpfrI7/CeamVjwnQZEtV7G+eEX6MeyHGl/0hGB+1MJdYt+B/1C5H9UdX8J2qJ6IMBfz4Ri8hXIXGfZfmdoLWr5W1zJ7ktg2aId18BuiTHNvDVUumQSNxDikLSdtBzdok0yCD8MyiLNmCqhxXBL9An+egNI3yqRT9z+O92FO/O2UuOMuymoqF06bUl53489MQw21Gm8lWmkRa6R/oVaMfT6lAmrsUVMNRa2HU3I8k2orgjNp5hK+ZLwPp/x+fR+0ONfMp9BfJ+qLmulpyze1zMtC8AACbkI/xAneQZkO0JiZimUheAjPn0MfxAnWVo3RiEG5oiwLwXJsmGFDK5iCxrCnGZNSOzVLra+EPDZ9T6EMCFVZ3KWpI8XV7uBTFcEOBsWqS5UIW21OByurRNjBoFh1qRJhq83pYGWVCDsYFKsuVSJstTkdrGz8L0VTv1i+NVF2CyTJDC0LX7E8HIx7D/Vrb3wDaLvY1D5QsI/6jXZUEwk29cDlckki5bIOY9+mneB/GfbU3e4Ey5kAAAAASUVORK5CYII=')}.x-button.x-button-action,.x-toolbar .x-button.x-button-action,.x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round,.x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small{border:1px solid #002f50;border-top-color:#003e6a;color:white}.x-button.x-button-action.x-button-back:before,.x-button.x-button-action.x-button-forward:before,.x-toolbar .x-button.x-button-action.x-button-back:before,.x-toolbar .x-button.x-button-action.x-button-forward:before,.x-button.x-button-action-round.x-button-back:before,.x-button.x-button-action-round.x-button-forward:before,.x-toolbar .x-button.x-button-action-round.x-button-back:before,.x-toolbar .x-button.x-button-action-round.x-button-forward:before,.x-button.x-button-action-small.x-button-back:before,.x-button.x-button-action-small.x-button-forward:before,.x-toolbar .x-button.x-button-action-small.x-button-back:before,.x-toolbar .x-button.x-button-action-small.x-button-forward:before{background:#002f50}.x-button.x-button-action,.x-button.x-button-action.x-button-back:after,.x-button.x-button-action.x-button-forward:after,.x-toolbar .x-button.x-button-action,.x-toolbar .x-button.x-button-action.x-button-back:after,.x-toolbar .x-button.x-button-action.x-button-forward:after,.x-button.x-button-action-round,.x-button.x-button-action-round.x-button-back:after,.x-button.x-button-action-round.x-button-forward:after,.x-toolbar .x-button.x-button-action-round,.x-toolbar .x-button.x-button-action-round.x-button-back:after,.x-toolbar .x-button.x-button-action-round.x-button-forward:after,.x-button.x-button-action-small,.x-button.x-button-action-small.x-button-back:after,.x-button.x-button-action-small.x-button-forward:after,.x-toolbar .x-button.x-button-action-small,.x-toolbar .x-button.x-button-action-small.x-button-back:after,.x-toolbar .x-button.x-button-action-small.x-button-forward:after{background-image:none;background-color:#006bb6;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0398ff), color-stop(3%, #007ad0), color-stop(100%, #005c9d));background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d)}.x-button.x-button-action .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-action .x-button-icon.x-icon-mask,.x-button.x-button-action-round .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-action-round .x-button-icon.x-icon-mask,.x-button.x-button-action-small .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-action-small .x-button-icon.x-icon-mask{background-image:none;background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ffffff), color-stop(100%, #e5f5ff));background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#e5f5ff);background-image:linear-gradient(top, #ffffff,#ffffff 3%,#e5f5ff)}.x-button.x-button-action.x-button-pressing,.x-button.x-button-action.x-button-pressing:after,.x-button.x-button-action.x-button-pressed,.x-button.x-button-action.x-button-pressed:after,.x-button.x-button-action.x-button-active,.x-button.x-button-action.x-button-active:after,.x-toolbar .x-button.x-button-action.x-button-pressing,.x-toolbar .x-button.x-button-action.x-button-pressing:after,.x-toolbar .x-button.x-button-action.x-button-pressed,.x-toolbar .x-button.x-button-action.x-button-pressed:after,.x-toolbar .x-button.x-button-action.x-button-active,.x-toolbar .x-button.x-button-action.x-button-active:after,.x-button.x-button-action-round.x-button-pressing,.x-button.x-button-action-round.x-button-pressing:after,.x-button.x-button-action-round.x-button-pressed,.x-button.x-button-action-round.x-button-pressed:after,.x-button.x-button-action-round.x-button-active,.x-button.x-button-action-round.x-button-active:after,.x-toolbar .x-button.x-button-action-round.x-button-pressing,.x-toolbar .x-button.x-button-action-round.x-button-pressing:after,.x-toolbar .x-button.x-button-action-round.x-button-pressed,.x-toolbar .x-button.x-button-action-round.x-button-pressed:after,.x-toolbar .x-button.x-button-action-round.x-button-active,.x-toolbar .x-button.x-button-action-round.x-button-active:after,.x-button.x-button-action-small.x-button-pressing,.x-button.x-button-action-small.x-button-pressing:after,.x-button.x-button-action-small.x-button-pressed,.x-button.x-button-action-small.x-button-pressed:after,.x-button.x-button-action-small.x-button-active,.x-button.x-button-action-small.x-button-active:after,.x-toolbar .x-button.x-button-action-small.x-button-pressing,.x-toolbar .x-button.x-button-action-small.x-button-pressing:after,.x-toolbar .x-button.x-button-action-small.x-button-pressed,.x-toolbar .x-button.x-button-action-small.x-button-pressed:after,.x-toolbar .x-button.x-button-action-small.x-button-active,.x-toolbar .x-button.x-button-action-small.x-button-active:after{background-image:none;background-color:#0062a7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #004474), color-stop(10%, #00538d), color-stop(65%, #0062a7), color-stop(100%, #0064a9));background-image:-webkit-linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9);background-image:linear-gradient(top, #004474,#00538d 10%,#0062a7 65%,#0064a9)}.x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm,.x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round,.x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small{border:1px solid #263501;border-top-color:#374e02;color:white}.x-button.x-button-confirm.x-button-back:before,.x-button.x-button-confirm.x-button-forward:before,.x-toolbar .x-button.x-button-confirm.x-button-back:before,.x-toolbar .x-button.x-button-confirm.x-button-forward:before,.x-button.x-button-confirm-round.x-button-back:before,.x-button.x-button-confirm-round.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-round.x-button-back:before,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:before,.x-button.x-button-confirm-small.x-button-back:before,.x-button.x-button-confirm-small.x-button-forward:before,.x-toolbar .x-button.x-button-confirm-small.x-button-back:before,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:before{background:#263501}.x-button.x-button-confirm,.x-button.x-button-confirm.x-button-back:after,.x-button.x-button-confirm.x-button-forward:after,.x-toolbar .x-button.x-button-confirm,.x-toolbar .x-button.x-button-confirm.x-button-back:after,.x-toolbar .x-button.x-button-confirm.x-button-forward:after,.x-button.x-button-confirm-round,.x-button.x-button-confirm-round.x-button-back:after,.x-button.x-button-confirm-round.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-round,.x-toolbar .x-button.x-button-confirm-round.x-button-back:after,.x-toolbar .x-button.x-button-confirm-round.x-button-forward:after,.x-button.x-button-confirm-small,.x-button.x-button-confirm-small.x-button-back:after,.x-button.x-button-confirm-small.x-button-forward:after,.x-toolbar .x-button.x-button-confirm-small,.x-toolbar .x-button.x-button-confirm-small.x-button-back:after,.x-toolbar .x-button.x-button-confirm-small.x-button-forward:after{background-image:none;background-color:#6c9804;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a2e306), color-stop(3%, #7eb105), color-stop(100%, #5b7f03));background-image:-webkit-linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03);background-image:linear-gradient(top, #a2e306,#7eb105 3%,#5b7f03)}.x-button.x-button-confirm .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-confirm .x-button-icon.x-icon-mask,.x-button.x-button-confirm-round .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-confirm-round .x-button-icon.x-icon-mask,.x-button.x-button-confirm-small .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-confirm-small .x-button-icon.x-icon-mask{background-image:none;background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ffffff), color-stop(100%, #f7fee6));background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#f7fee6);background-image:linear-gradient(top, #ffffff,#ffffff 3%,#f7fee6)}.x-button.x-button-confirm.x-button-pressing,.x-button.x-button-confirm.x-button-pressing:after,.x-button.x-button-confirm.x-button-pressed,.x-button.x-button-confirm.x-button-pressed:after,.x-button.x-button-confirm.x-button-active,.x-button.x-button-confirm.x-button-active:after,.x-toolbar .x-button.x-button-confirm.x-button-pressing,.x-toolbar .x-button.x-button-confirm.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm.x-button-pressed,.x-toolbar .x-button.x-button-confirm.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm.x-button-active,.x-toolbar .x-button.x-button-confirm.x-button-active:after,.x-button.x-button-confirm-round.x-button-pressing,.x-button.x-button-confirm-round.x-button-pressing:after,.x-button.x-button-confirm-round.x-button-pressed,.x-button.x-button-confirm-round.x-button-pressed:after,.x-button.x-button-confirm-round.x-button-active,.x-button.x-button-confirm-round.x-button-active:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing,.x-toolbar .x-button.x-button-confirm-round.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed,.x-toolbar .x-button.x-button-confirm-round.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-round.x-button-active,.x-toolbar .x-button.x-button-confirm-round.x-button-active:after,.x-button.x-button-confirm-small.x-button-pressing,.x-button.x-button-confirm-small.x-button-pressing:after,.x-button.x-button-confirm-small.x-button-pressed,.x-button.x-button-confirm-small.x-button-pressed:after,.x-button.x-button-confirm-small.x-button-active,.x-button.x-button-confirm-small.x-button-active:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing,.x-toolbar .x-button.x-button-confirm-small.x-button-pressing:after,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed,.x-toolbar .x-button.x-button-confirm-small.x-button-pressed:after,.x-toolbar .x-button.x-button-confirm-small.x-button-active,.x-toolbar .x-button.x-button-confirm-small.x-button-active:after{background-image:none;background-color:#628904;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #3e5702), color-stop(10%, #507003), color-stop(65%, #628904), color-stop(100%, #648c04));background-image:-webkit-linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04);background-image:linear-gradient(top, #3e5702,#507003 10%,#628904 65%,#648c04)}.x-button.x-button-decline,.x-toolbar .x-button.x-button-decline,.x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round,.x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small{border:1px solid #630303;border-top-color:#7c0303;color:white}.x-button.x-button-decline.x-button-back:before,.x-button.x-button-decline.x-button-forward:before,.x-toolbar .x-button.x-button-decline.x-button-back:before,.x-toolbar .x-button.x-button-decline.x-button-forward:before,.x-button.x-button-decline-round.x-button-back:before,.x-button.x-button-decline-round.x-button-forward:before,.x-toolbar .x-button.x-button-decline-round.x-button-back:before,.x-toolbar .x-button.x-button-decline-round.x-button-forward:before,.x-button.x-button-decline-small.x-button-back:before,.x-button.x-button-decline-small.x-button-forward:before,.x-toolbar .x-button.x-button-decline-small.x-button-back:before,.x-toolbar .x-button.x-button-decline-small.x-button-forward:before{background:#630303}.x-button.x-button-decline,.x-button.x-button-decline.x-button-back:after,.x-button.x-button-decline.x-button-forward:after,.x-toolbar .x-button.x-button-decline,.x-toolbar .x-button.x-button-decline.x-button-back:after,.x-toolbar .x-button.x-button-decline.x-button-forward:after,.x-button.x-button-decline-round,.x-button.x-button-decline-round.x-button-back:after,.x-button.x-button-decline-round.x-button-forward:after,.x-toolbar .x-button.x-button-decline-round,.x-toolbar .x-button.x-button-decline-round.x-button-back:after,.x-toolbar .x-button.x-button-decline-round.x-button-forward:after,.x-button.x-button-decline-small,.x-button.x-button-decline-small.x-button-back:after,.x-button.x-button-decline-small.x-button-forward:after,.x-toolbar .x-button.x-button-decline-small,.x-toolbar .x-button.x-button-decline-small.x-button-back:after,.x-toolbar .x-button.x-button-decline-small.x-button-forward:after{background-image:none;background-color:#c70505;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f91f1f), color-stop(3%, #e00606), color-stop(100%, #ae0404));background-image:-webkit-linear-gradient(top, #f91f1f,#e00606 3%,#ae0404);background-image:linear-gradient(top, #f91f1f,#e00606 3%,#ae0404)}.x-button.x-button-decline .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-decline .x-button-icon.x-icon-mask,.x-button.x-button-decline-round .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-decline-round .x-button-icon.x-icon-mask,.x-button.x-button-decline-small .x-button-icon.x-icon-mask,.x-toolbar .x-button.x-button-decline-small .x-button-icon.x-icon-mask{background-image:none;background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ffffff), color-stop(100%, #fee6e6));background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#fee6e6);background-image:linear-gradient(top, #ffffff,#ffffff 3%,#fee6e6)}.x-button.x-button-decline.x-button-pressing,.x-button.x-button-decline.x-button-pressing:after,.x-button.x-button-decline.x-button-pressed,.x-button.x-button-decline.x-button-pressed:after,.x-button.x-button-decline.x-button-active,.x-button.x-button-decline.x-button-active:after,.x-toolbar .x-button.x-button-decline.x-button-pressing,.x-toolbar .x-button.x-button-decline.x-button-pressing:after,.x-toolbar .x-button.x-button-decline.x-button-pressed,.x-toolbar .x-button.x-button-decline.x-button-pressed:after,.x-toolbar .x-button.x-button-decline.x-button-active,.x-toolbar .x-button.x-button-decline.x-button-active:after,.x-button.x-button-decline-round.x-button-pressing,.x-button.x-button-decline-round.x-button-pressing:after,.x-button.x-button-decline-round.x-button-pressed,.x-button.x-button-decline-round.x-button-pressed:after,.x-button.x-button-decline-round.x-button-active,.x-button.x-button-decline-round.x-button-active:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressing,.x-toolbar .x-button.x-button-decline-round.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-round.x-button-pressed,.x-toolbar .x-button.x-button-decline-round.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-round.x-button-active,.x-toolbar .x-button.x-button-decline-round.x-button-active:after,.x-button.x-button-decline-small.x-button-pressing,.x-button.x-button-decline-small.x-button-pressing:after,.x-button.x-button-decline-small.x-button-pressed,.x-button.x-button-decline-small.x-button-pressed:after,.x-button.x-button-decline-small.x-button-active,.x-button.x-button-decline-small.x-button-active:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressing,.x-toolbar .x-button.x-button-decline-small.x-button-pressing:after,.x-toolbar .x-button.x-button-decline-small.x-button-pressed,.x-toolbar .x-button.x-button-decline-small.x-button-pressed:after,.x-toolbar .x-button.x-button-decline-small.x-button-active,.x-toolbar .x-button.x-button-decline-small.x-button-active:after{background-image:none;background-color:#b80505;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #860303), color-stop(10%, #9f0404), color-stop(65%, #b80505), color-stop(100%, #ba0505));background-image:-webkit-linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505);background-image:linear-gradient(top, #860303,#9f0404 10%,#b80505 65%,#ba0505)}.x-sheet,.x-sheet-action{padding:0.7em;border-top:1px solid #092e47;height:auto;background-image:none;background-color:rgba(3, 17, 26, 0.9);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(11,60,94,0.9)), color-stop(3%, rgba(6,31,49,0.9)), color-stop(100%, rgba(0,2,3,0.9)));background-image:-webkit-linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));background-image:linear-gradient(top, rgba(11,60,94,0.9),rgba(6,31,49,0.9) 3%,rgba(0,2,3,0.9));-webkit-border-radius:0;border-radius:0}.x-sheet-inner > .x-button,.x-sheet-action-inner > .x-button{margin-bottom:0.5em}.x-sheet-inner > .x-button:last-child,.x-sheet-action-inner > .x-button:last-child{margin-bottom:0}.x-sheet.x-picker{padding:0}.x-sheet.x-picker .x-sheet-inner{position:relative;background-color:#fff;-webkit-border-radius:0.4em;border-radius:0.4em;-webkit-background-clip:padding;background-clip:padding-box;overflow:hidden;margin:0.7em}.x-sheet.x-picker .x-sheet-inner:before,.x-sheet.x-picker .x-sheet-inner:after{z-index:1;content:"";position:absolute;width:100%;height:30%;top:0;left:0}.x-sheet.x-picker .x-sheet-inner:before{top:auto;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;bottom:0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(100%, #bbbbbb));background-image:-webkit-linear-gradient(#ffffff,#bbbbbb);background-image:linear-gradient(#ffffff,#bbbbbb)}.x-sheet.x-picker .x-sheet-inner:after{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bbbbbb), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(#bbbbbb,#ffffff);background-image:linear-gradient(#bbbbbb,#ffffff)}.x-sheet.x-picker .x-sheet-inner .x-picker-slot .x-body{border-left:1px solid #999999;border-right:1px solid #ACACAC}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-first .x-body{border-left:0}.x-sheet.x-picker .x-sheet-inner .x-picker-slot.x-last .x-body{border-left:0;border-right:0}.x-picker-slot .x-scroll-view{z-index:2;position:relative;-webkit-box-shadow:rgba(0, 0, 0, 0.4) -1px 0 1px}.x-picker-slot .x-scroll-view:first-child{-webkit-box-shadow:none}.x-picker-mask{position:absolute;top:0;left:0;right:0;bottom:0;z-index:3;display:-webkit-box;display:box;-webkit-box-align:stretch;box-align:stretch;-webkit-box-orient:vertical;box-orient:vertical;-webkit-box-pack:center;box-pack:center;pointer-events:none}.x-picker-bar{border-top:0.12em solid #006bb6;border-bottom:0.12em solid #006bb6;height:2.5em;background-image:none;background-color:rgba(13, 148, 242, 0.3);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(85,180,246,0.3)), color-stop(3%, rgba(37,159,244,0.3)), color-stop(100%, rgba(11,133,218,0.3)));background-image:-webkit-linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));background-image:linear-gradient(top, rgba(85,180,246,0.3),rgba(37,159,244,0.3) 3%,rgba(11,133,218,0.3));-webkit-box-shadow:rgba(0, 0, 0, 0.2) 0 0.2em 0.2em}.x-use-titles .x-picker-bar{margin-top:1.5em}.x-picker-slot-title{height:1.5em;position:relative;z-index:2;background-image:none;background-color:#1295f1;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5ab5f5), color-stop(3%, #2aa0f2), color-stop(100%, #0d87dc));background-image:-webkit-linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc);background-image:linear-gradient(top, #5ab5f5,#2aa0f2 3%,#0d87dc);border-top:1px solid #1295f1;border-bottom:1px solid #095b94;-webkit-box-shadow:0px 0.1em 0.3em rgba(0, 0, 0, 0.3);padding:0.2em 1.02em}.x-picker-slot-title > div{font-weight:bold;font-size:0.8em;color:#113b59;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0}.x-picker-slot .x-dataview-inner{width:100%}.x-picker-slot .x-dataview-item{vertical-align:middle;height:2.5em;line-height:2.5em;font-weight:bold;padding:0 10px}.x-picker-slot .x-picker-item{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-picker-right{text-align:right}.x-picker-center{text-align:center}.x-picker-left{text-align:left}.x-tabbar.x-docked-top{border-bottom-width:.1em;border-bottom-style:solid;height:2.6em;padding:0 .8em}.x-tabbar.x-docked-top .x-tab{position:relative;padding:0.4em 0.8em;height:1.8em;-webkit-border-radius:0.9em;border-radius:0.9em}.x-tabbar.x-docked-top .x-button-label,.x-tabbar.x-docked-top .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-top .x-badge{font-size:.8em;line-height:1.2em;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tabbar.x-docked-top .x-badge{font-size:.6em !important;top:-0.5em}.x-tabbar.x-docked-bottom{border-top-width:.1em;border-top-style:solid;height:3em;padding:0}.x-tabbar.x-docked-bottom .x-tab{-webkit-border-radius:0.25em;border-radius:0.25em;min-width:3.3em;position:relative;padding-top:.2em}.x-tabbar.x-docked-bottom .x-tab .x-button-icon{-webkit-mask-size:1.65em;width:1.65em;height:1.65em;display:block;margin:0 auto;position:relative}.x-tabbar.x-docked-bottom .x-tab .x-button-label,.x-tabbar.x-docked-bottom .x-tab .x-hasbadge .x-badge,.x-hasbadge .x-tabbar.x-docked-bottom .x-tab .x-badge{margin:0;padding:.1em 0 .2em 0;font-size:9px;line-height:12px;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}.x-tab .x-button-icon.bookmarks,.x-button .x-button-icon.x-icon-mask.bookmarks{-webkit-mask-image:url('data:image/png;base64,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')}.x-tab .x-button-icon.download,.x-button .x-button-icon.x-icon-mask.download{-webkit-mask-image:url('data:image/png;base64,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')}.x-tab .x-button-icon.favorites,.x-button .x-button-icon.x-icon-mask.favorites{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFfUlEQVRoBd2aXahVRRTHz/Ujv+2mZRGZB7W6mtpFikC7+UWUZiqBD0JPFdRL1EMFPfjoU4baS0FUD/UWZBEVShA+BCpmWApRSkgllNpDmZWZt9//eOay72afvWfWOTPn3rvgz8yeWbPW+s/XmT379AwODtZSSQ+CryVgA/gVfIx/pelEhFMBVlvBOaBeFo6Cean8y09KsnMg932TqCOs9M2UhMfhMJVsxtHcAmcbmekLCsqjFKUkvAYG1xSwmEHZqoLyKEVJCDOCNxH9HUCbVl6mULAuXxjrOQlhgl8Bbi0h0Uen3FBS37GqVIQHiHh2SdR16jTlo0t0woycpuxiUDSdHcFeMv3uIWYanTDB3wIWVZBQHP10zuQKvbarUxDWT1HRz1E++Ds99fLtgp6jEmbExhPNcs+IbkZPiCpRCRP5TPCQJ4MJ6A3QSUqjSWzC2ozuC4j+fnSnB+gHq8YmvJKIJgVEpRPX9QH6waqxCa8PjEhHT981H2j6qno0wqzF63BhOUxsom3Zb7aJqGsUjTAONFJlpysXQz7VuXpavrBTzzEJaz1adlzNjHs6RTBvJyZhjZTF/kTaWZZCnlvhsyWgQkPZQpagzsX1bFlAXjGtDdAPUu1p3PPQhCCXkdwG/mta0PWLds060AuAnqtEOjpdbQR3VymX1P9F3UfgGJA9X9F92c/ADaQ2P8V0DJ4/kDbeYKaSvgI2AN0+OGJK1VAbSIhTOXEOybYll2kte77yD4rqrHyb85S9Cl4HtReAyI11/A7HpRq5PSD6oR0f3Rad+H7S1DvV7UgS+tc1cU3n3V/AWJ/SX8BxVuMinow2rNNjlPQVeH0GFg378kDBfLAPXARjZbTPwmUXmOG+bgz71EKFfqKeAUWfREZbJxyCxyOOqEuHER4qrNUWovwy0CFktBHV4eNZMNvxyaaFhKWAaBt/HJwEo4W0luSKLMF8viVhp4iBeeBd8CcYqcQ1qi+CKS7uVmklYdcQY0+C42Ckkf6EmO51cVal3oRlCFkCdKgfCWtbo7obDO3AVWQbHHyUsjo40E6uq9cvQbdG+wN892fj8s0HjXDWKA51/t4JUo72H/jTDtybjSUkbyYsJ0gdfAtSjfTn+JoWQjCv2+57a4M1QaQSvZvrMsIs7RJejGcdUlLJUhzpZsYsZsJcCen6ZwCE3IaYA2021OfUdU3fJltmwni7Fvh+KDMF16KR3ux0lWuSdgjPxeNdJq/tNdKNqJaSSUyEmVK6JNPomtqbIh3eSKNsEmvAarfJ5LEzjbbR59MtpqyEb8eZjpndkhtxvNri3Er4YZxpx+yW6Jdhi8V5MOHm+n0QZ9afo0u0fQO8A5S3iPaQ1cTSG9w4f/SqesZBH/gRWI6T+gyyxfkgvw2cMdrS+/lTzpZvGnyWxsnTwHLRd4R2a/OBqQyoztKBe/P2qp6DCBOUptKHhuA+pU1fq2Co0/F0L9CVaghxXTbWW9ktKg8lrFfCrwODeh/9wgu1bEDo6OT2Fvgb+JLWq+nQEsnaa5UPJbwKBxc8A9KXPG1O3u+u6E4F24GvD3XMDjCxFcF8uTdhjGpHfwn49L42lCeAdyDZwGi3HpwAPr6+Q29htn1ZPoSwfuz3ewShXVcBNz62lzkvq6O9DjZHgQ9p72kdQljvob9VBPAN9Q+UEQmpw5b+Sf8e0FotI/4a9ZN8bIcQXlnh9AD1y3ychuhgU0tpJyhb14epn+ljN+Sk9S9G1ct50d8SdgF9x9EO3lHB5hXwPEYfA8dbGD9LuWZBtfj0inSQWUDTKzu1dAB5Dkz2tdOOHn70LvwVyMag/FYwzse295Rukq5j+G1wEOib66PAy5FPMD46+NPmqTV7CpwGGvkJPm2l8z8GWDNDloqpGQAAAABJRU5ErkJggg==')}.x-tab .x-button-icon.info,.x-button .x-button-icon.x-icon-mask.info{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAHOElEQVRoBdWbXYgVZRjHXdf8ysjUQl011lbRIFEjM6Uu0iyiEDG86EItKoIuuhDJCgoioouugqKbgi4CKwulILG0mxLTUtMyTWQNPzLTPszU1cx+v+OZw9nZM3POmZl3zQd+zMz7zvs8z//MvF+z2nLhwoU+oaylpWUQvvvDYGiDdjgP1dbKRSccglNwlpxOcwxiLUULRqTCRsNUmAk3wS3QiG3hpp2wCbbDYfLzhyjMChOM0FlkNR3mw61wFeSxv2j8FayBrQjfmMdZpa1POA84UuD7cBzsHyHQtzHm58nVtpnEErgvzIB34Rj8CyGEVvs0hrGMaey+WcQ3LZhAQ+FZsG/1htBq0Z4b09jmMLRZ0U0JJsA0eAccTeOJ9Pa1OZjLtGZENywYx0tgDzit9La4pHjmYk5LGhXdkGAcLoPDcCle4SSxUbk5mduyRkSnCsaJi4IV4GARBSj6eALfR8sxunLEMUdzbU0TniiYho7ED8GvULRI/UV9cDbnrsauheXQCVnjmas5J47gaYJdSPwAIfqsPlfEnwRl/eBBOAlZROvXnGfFfUfXNQXTYCKsg38gS+B6bT6MEogfiTcKNuaIa87mPjHu2+segrnRBf8bYN+ql3jW+ntrJVNK6OJGw+VkVt+2M3c1DIrHsZ9WjPVwCxcLYQ4MqVQUf/Jjikt3VnnX4eauhoVlTZVw3QRTOhmWwjhQfCi7ppZjkjOf62FCrfomysxdDUtBTRWrCCZYK6WLYAo4aoa0JxKcu2x9CsYk1DdTrAa1LCpru9g2ese58lddD+cgT/9ppK2j8ONR7HLf9Um8B0XOCmpR04QoVmnQosDp4BHYD40kXMQ9zsPfgSI/hyNQhN+4j/34VVu/0g9b/nXbKFgJf0O8weV+rSa1tam1b3kUm0SB77sj5KUw18OhTE1qm6RWBy07t0O4S7veto8J6FLwbng+YHC1qbE0GDtnrYXeGKzsHj7NT2AejKgMJn36DODaASZEF1KbGof4hJ2vXM45cIW2nwjwKDyA0HXgDicyl4RpC5LovixHtalxnCcd4PwX0hTjcvEFRO5ICBRyoWNINXYo2Ek+5DJyP/6fgZWI9XVNs3r1aW3r1alxjIJHQqjR+Vt8L0fnpxzrmU+45pKzXsMG69U4UsHDYWCDjRq9zYFpCzwGLi5K5qyA+KQpSMHt5VtDHNQ4XMEh+s5R/L4CuxSIUKeDO8BX1pG4lrlDmlqrosCy0jxcoL+KK5PvgFbEOka8CKsgbRd0u/dDUPMJh7ArcXon/A4PwwxwyvkKkuwuKi5bwYqaDbdBNAP8wvn3kGQ+4RDdq1u8UE/YINUjv313L/35bLfo5Qte+xs5va5WXdFlrrRMImnkLCreaRxtSnE2i7q8n3VS3Jeq1HhWwY6o7k1Dmn/r3ZgSYCZ1g1Lqi6hS41EFHwC/QIQ0P5D7vbiH8Tq7DnD7Frr/qvGAgvfBnxDSNqcsOJx7Xe2FNjXuU/BeOAah1rHn8f0FJJkDlk85pKlNjXsV7KPeA34KCWUuM5OsN760qE2NJxXcBevBfhbCOnFqsB5G/72aQj8vVVuIN01tauyKFvPbuHBhEGJ6+hK/SSLaqBsPmrFfhZe9KND0q7ZtjiM+Ye0guIXzPS/atuPQflzLxlI4Go6AOys/wq+Gn6EoU5Pa1Fj6G7Dfpp0nfeT+EkXaOZx9jf+kJ+xqbAPcxy1vwhnOd8MuKMrUtB7fauz2HcsgBuuAQVCEHcLJ8RRHrr42kExpWqRPu3mYDTektGmmyhVe9x+QYJU/mVK5AHwF/QblU8nLWnyMrY6Rds69T4Kvd964tleDWhZUx6yItRBzo+7A8QcUEXQVfkZVB6x1zj3GfQ587YqIqw81qKV/dcxugsuiJ3OT/cr+lzf4S/gYXB0wfk69HwX8YRxN88aL2pu7Gib3iBcv8BpbDJ0QOch6fB0fNf+1HOVXwD2wE7L6T2rXic/FNbXVLLw4mNmfTuRMZi/tx8djUDYHPgAHlaSks5abs7mX/lrYI3a8ILqmwTB4G9xWZQ1uu7egHQbC/aBQR+88PpPamqs5D4t0xI89+nD1DTT0A9waOANJQeqVu+j4Ddx3u26vd3/WenM01zHVGuLnqYK9GXNeXg15RGcV0Wg7czPHjrjA+HVdwVWifRX/j6LNydzqii1pif8CSdc4HApPg0u1IqeQRp9i/D5zMBdzqjkT1NLS0BOOGuLYv+E6lWyFolZjcSGNXBvbHMxlQJRfI8emBEcOCeKo+xq4A+nNp20sYxq7PcqnmWMmwVEAgs4FR0Y32CGF69sYxpobxc9yzP3feMo7nJtJxDnWV2w6RPtsTnOZQn1118JH8A0ik/bWVNe33IKjEAh3qei87Ue5eeDTnwTNilfkbvgM1oHb1oMIdX2c2woTXJ0J4h3c3NyPgikwA9zjjigT7Xf3ce0XCfF8M+wAv3icQmQXx0LtP/qKurS9uZqyAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.more,.x-button .x-button-icon.x-icon-mask.more{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAADJ0lEQVRoBe2YS2sUQRSFp5MgvmLU+CAMiBJFDBHcCeoPEFciuHMjroMK4lZBcONG0JW60U1UEgRx59IXuNMoKEElKL7GRwyIqNHxO0N66FT3UNU9IHRNFXz0VNW5t+vW6RcT1ev1Sie1rk4qVrWGgn13PDgcHPZsB8Il7ZmhqXKCw6kt8WwgOOyZoalygsOpLfFsIDjsmaGpcoLDqS3xbCA47JmhqXKCw6kt8Wyg6XAURV2wEy7BM5iFtzAKu2BB0dqJ7YEtcBYmQblfwzjshUVt5O4mfhjOwwQodw3GYA8snpd77n9pFXMYvoP+qDaZZewcVKXPAzE64Qn4CmZe9f/AFSiSu4e4IzANrXJfZ24gXjO/KxEcg9+QFZQcU/CSONh2RKsraMQhr85xE/psOeN5tCr2APyA5Bqzfl9D06tYtX3wC7KE5pg2ZX98UtsR7XZo5ayZW/1DENnyzi18CO1nyMqTNXYcrTapcitHkBLJiZW2RaGRuxcg6+Stxu6i73fI3Y3uZM7cU+hXQeVvzsBP6Dc5LupxztzaiEGH3AvR3S+Qe4dc0D2cp/Uj1oPI1pR7g030n+erWlTe9pMA3cu2Jre+2ERtzBdZe01BL3Ke9Al6vQZsTbfKQ5vImH9PXxtqa3qVPbWJjHk94J6r4DPGhK17A8EHm4j7UAWP2nTG/GX6NWMs1SW3rrCroLeLaxtDqDdG4368zbHVkzM5Polus+2hEs+j7YNxx9zv0FkfhoncvegvOuZ+iW6rYhtfTXTWgV7OyeLM3w+Y3xaf0PVIzAqwFf0IzW7XnLGOmLUg58y1JvsTzA83Y5o/eLcyMQISJAN0z56G9bE275HYNXAU7kAy9xv6p2Bj3pyxntjVcBDuQTL3FH19Dg/FWh0bXzUMNhsf23JkOQzCK9B1P4NY39OFG3kjgpeB8g/AR/gG0+3mJkeF9Lp9lkIVZkDfC1r3vPs8VTAir1uRd1mpNyQUXGr7HBYfHHbYpFJLgsOlts9h8cFhh00qtSQ4XGr7HBYfHHbYpFJLgsOlts9h8cFhh00qtSQ4XGr7HBYfHHbYpFJLOs7hf5j4Vg3iLoGkAAAAAElFTkSuQmCC')}.x-tab .x-button-icon.time,.x-button .x-button-icon.x-icon-mask.time{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAIPElEQVRoBdWae4gVVRzH97qr66vyhWbmurY+MA111dRMkLIXRuhG/pMVSUKGBGYPMTLDR0iaJBFUlIp/FJJlpWJS6vrAlCwTe1iaippSZipmPjL7fC/3XGbnzjkzc3fudTvwYWbO73d+jzlnzjkz96YuX75cUqiSSqWaYVs0hvZQBY3AW/7gYg/8A+fgPDFd5FiQkko6YZJUYj2hNwyDAXADlIOrHEO4A3bDVvgZ9hLfBY6JlUQSJkn14CAYAiNgFPh7kqpY5SDay2EjbCfxo7Fa25TVw/UBuw/BWvgT9HwUgl3YnQXX1ydWtc0rWRyr9zRcV8FpKESSfpuX8LMXnoDm+SYeO2GcXQfz4Cz4gyrGtSa3TaDHp1HcxGMljIN+sAGKkViYj+PEMRkax0k6csIYfgoOQVggxZa/R0ydoiYdaZZmFp6C0ZmgNTVu0YSzBQ6A1tuTYEqKk5ugA/SFkdAU4pbVNHiYpLWmu4vrztBSy83TcAai9pyeba2lz0E1tIFysD5vyMrgKugIY0GToW5MVJ/SWwltXPlIZh3SNNbdV9B/QRTH59GrhQehSZhjl5z2pucXc/4rRPEvHfV0B6dtm5CGI+B3iOLse/SehVgTiM23tx6bGuafwb8QJRY909ZlK7CHadATtOZFcfAmel28QSZ9jn0914/AYQiLScvW45Cen/yx5CSMYhNYA2GGtdGfDS38Rm3X6GpO0PNsKLPpBtXTbij8BGGxaWQODrThr0RxEuguuYzqeZ0Opf72tmt09TKxHU57+JLz7rY2QfXo3wpRkt6MXs7QrtPDKHSDfeBKVpPYjKBgXHW0mQVBz+HzrnZBMuwo6b3gilNb0Yn+9v6E30UpKCiv4WnoBD4ffuPea9q8YrE91asX9Rxb2loeBG9s/nO9YlZ6bWZf4dhc9EB4B2hJsBXtYd/AgAzHLfm0cfnYhvBlUE/aSlcE473CdMIkqyTvhU5eoe9cE8E8cvXulHwqxbvM3PRFeFzn8FqKbDTpdTQ6pof1BlQDtt5V7yzDySemYUM4Eo8mz4WgFwlb0RJbbYQm4e5U6JmwFe125tiEV7KepLWlFJp7goqW2WH0spbEkkacqOJ+UPfbylIMK+mGWl4lsLOO4DR69Tynv1y04DhSF5aiDcY7FllDqdbLSq0jmB7IKiXXkNYDrXFuK+sRHLMJG0I9o09zzEeOWDQ3DWI0lyphPbuqsJU1CFzDxdau2PVfhMSpiaupEh7uiEyJfsUNtE0IjqZFF2mmdi1R+j6eTriLI7T9yLT+/h/KBYLUHttWtPSWqYevtWlQfxjOOORJiJIaPRcJ5pAjIC1LnZVwL4fSEWSFTvhqh//IoszEtSekQYUSdpUTCLUsFbI8wOw5HvRNq75Fb3LOEpawa/Z2Gg4Q2mxpjdQ6v4KkBwa0i1Nl85G1EZZwVjGBE/Mx0GbqNgQfkvQECA3cZiSkPqWEtQG3lQoEiTxj2FkCW8E1SXVG/josJecqjnGLNlGuck4Jf+PQaIcsn4/vOSaZVLTE3Q0LwLVz095en3rXknQNlHMeWtBTLl1DFHdIri2ZtmZBaFnqo51bkmBT79660UE+vXV6DOZCVZh/dJrDUvC2956fRtYeSmaAV+A/vy/MWT5yfGr4PQNa9vw+/df6VDMRrB8NkWk0/gL+tuZ6G7JroOQeh5KU50Csz6lRbwB2NQyHwhYI+1Kqbe770D7IPvXaOmp+MAn6j5pDmkH6hywZ8yuY653I2gY5SaoO+y1hKujHMOPXdnwJnZwOoG52SNsJildFzlaCzYHqRyWVnMsOfsaAetsVyzTkdX674lrP7z5HO80F/U3CGlb6G4HLSS3ynLvqCj5fGX5ag37o/g38MX1HXc6Qzui7HolPTbv07MtFPzgKfgfm+m9kY/JNIp92+BsCmmhMDJrcJvltUaeXn689ekbfe3wSefrnWpOw9rHa3nmV/OebkLf2OyzkNf606XkNDsLbkPPrJHUa4hfAH6+51kipNnFm11cqtTa6Gko20zRsCEfiuREOgEku6LgKeXY58yasRTlsaGgjkr1bVzJp4tDHx8UQlKSp0+ozzhtnNmFVUh6DsI3At+hUeo0U+xz/KVgIJjHbcTU6dR4Df8Lat34cwdAGdDoWO9FMp5Tiezq4Hj/dAHVceinyxlkn4YxB7ViibADWo1fUnsafOmQW6KOErVdN/Yvo5PzKmZNwJmmtg6ah66gXgAHeO1ioc/y0g7kR49qIXqugWGwJl9EgyjOim6GJbCaE/mUoKIAoddgeDdvBdfONTDuuXja7gQlLmdIKwrZ5xol2ObqrYyC7BNicRq3HVm9YBPpUbHy5jifQe9Rl35pwJunBGNgV0ZkC0Z5V29BR0AHKXc79MvS1zdVmoy/Mg+PgStAr0yQ1BZw3PP1Qo2QtfEnQJLYY+liVggVHqF4O60DDXjsezax6ETf7Xo0iTUQ6toZb4Ha4E+IUbX1f4AbOD2sUmrAMkLR6egHo3TWfcopGO0G9oG2ieR2t4lw92g0qIZ+iz0XzSVYjIrz4h5XtGkvqgagTmXeoFfJcb0+B/8ey5mETBNVjvClMhjjPViES1s8qy6AiKE5XnXPSCmqIE23rBsIK0PNYiIRcNn/E53jI6/08dsLem4DTcbADdMddQSYh0we6t6BeW9pIkxZOrIUJrS3Cm6EG7gJ9TE+qaFbXLP8BbOZm76mv4XonbAIg8ZacV0B/GAvDQRNdPkVfOvQe+znsJ1HXh/tY9hNL2OuV5PWu2hyqQZsIra/6FCO6gClapn6AU7AbtDfXxuUknCHRSxwTLf8Bgi31NJnvpzwAAAAASUVORK5CYII=')}.x-tab .x-button-icon.user,.x-button .x-button-icon.x-icon-mask.user{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAEWElEQVRoBe2aS0gVYRiGO1lmF8nQQlETutGFokAiqEV0ISKwgmrdMtzUpnW7drWKbFGbQAKpJIhuUGIUFUkW0T1Jq4V2U4ui7GLPexpDD+ecuX1jHqcPHseZ+f9vvnf++e8n0d/fPyZONjZOYqU1doLHRV3CiURCz5gMxTANJsJg+8XJJ+iBt9BHNdO1SCwRZR1GbAFRl8F8WAFLoRwGLME/ffAM7kETvIYPxPWDo7lFIhiheURaCVtgBywHXXOzbhJcggZoRvR7twy+76uELSEAtQsqySPwGdQN+KWDPHuh2DI2+TIVm3T455M9G0Bk6ktRvd4NBZaiTQUT3AQnSNW/VAFBzl/iZw0kq56FcOtuaQHB7QIv9ZVkrqZ2YA9Mck3pMYGZYKeh2sBz1SJb2mqcmfk0E0xQ6l9rwNoKcWjm11JwEYFVW6t1/K218mspeB5B5VsFluKnIuU88Kml4PGBo3DPqBGZiVkKNgvKRFkGJ5aCv2Z4xoi6bCm4DWUaXERhZhMJS8FfolDq+DSbRFgKjrIOa8poYpaCTQKK2sl/wSHfcFSNlll1sSzhn7ys3pAvLFP275lu+L1uKVhBPfYbgMf0zz2mc01mKfgbT7vi+kT/CeT3sv9s6XNYCtbg4CJ0pX9U4Kv3yXk3cO6UjGaCWX5Rg/UArqY8I8yp1qdPQ08YJ4Pzmgl2nCqwc2DVyKjunuddqkE0MVPBBKYSuQ7tJtEhFj9apDczU8FOVB0ctZiuHYUw9obMjbxErW2bmblgApTQengVIkq1B83QEsJH2qzmgp2n3ObYCEGndZ3krbcuXcUWiWACldCjoA0yv6a8J6HJb0Yv6SMRrAcj+gmHA+B3aneDPHXk/8jR3LR3a2rOfnAlTmfDVPDb6Khrq8bPDI5PoRPxZpMSk+1SgtOKpTa8l8BC0JaLmAkloA1xr/aOhJqEtINGWeqW7jjHXrQHbRdw4WxSJf8L8Aeh2m1QaWoBfiUsA61PTwGtUYeZ1qlP1zhan3YraBSnz/0mdAUVHqiEESoxKs0a2AxloJIMI5DsWU0vQH2z2oZToAnFI7+fu2/BiF3PgzbCKqgC1bXhNH3S6rba4BocR7TquifzLBih5XjcCSrROaAGKbJWHt9uJuGq67fgAki4zrNaVsGIzCP3dNgE20B1VJ+uro8UUz3Xr39UvxugCeEZl3UzCkZsBZn1+W6HRaB6qtZ4pJp2PtTna+58DFoR3sVxqHFxyM8euFsIW6EeXoDeoPrBXEEbAlpqqoN1kD9YY6rYxSQ4DGoE9KOSXBGZLk4NYB7CfigZEP1XMBfVEJ0BJUznIFevaSBzEEolOimYkyo4AfocclVYtrjViB0C9SzJEdE+jrn+CWcTrHvdUKuRUSm0gPrZ0W7tGjjMhTiIVWFWSbAGEnGxhAT/y+HhsL9oiVWFjo3FqnRVqrETrG5pFmiSEAuTYC3TFMVCLSIzTg9H6wuIXR2OneDfMJq1NmzzbS8AAAAASUVORK5CYII=')}.x-tab .x-button-icon.team,.x-button .x-button-icon.x-icon-mask.team{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFI0lEQVRoBe2ZSYgdVRSG+yUmnagRQYU4NbZKNLYKWTgg4gQOaDYqJIIGl4LixhBwoy50LSIiulEjCkpAUBBRURpdGceFMQ7YtgkOJE4xTjGa9vuedUl1Vd2qevSrFqvrwJ97695zzj3/PXd6nd7MzMzIQpJFC4msXDvCbc94l+Euwy2bgW5JtyyhOTpdhnNT0rKGLsMtS2iOTpfh3JS0rOGQ+eLT6/VWMNYJ4NjUmN9T/xLs4WfqvPxO7TU9DkTdNmvBbeAskJ7kv/n+AjwKXiSW7yibFQk3BSIPZHdTl5xZzML238DDYFlTsQS/jZF1AGQ1mAZZkkXfe9FbGwJrqmz6lL4cEmOgjhyO0jq2gGVj0hhhAl9M1FeB3gDRn4Pu/5NwQnJ0ALKqrgKHDmgzkHpjGR4oioPKP1H96+Dn8GvpKyLqneV5Lp0XgnHggTMFJjlYPqAcpnyLsz/LHBLL0fRfCzwbvNN3gLeI5WXKaik7DbF2/20A28HPYF+CPZQfg9tj9vS5h18DRSdyrO0j9FeW+PQenwTe138AJ+d34OPFa215zDa0l15LOLgamM0DIBukbQ60JjhLl7RL+HWQtSv7jhLGz1FgM3DJZ30Yy69gYzqGonrVHr4eJ+OgB7Ji2xi4lGUW8+PsD0vOwNGNwInMirF42K0nlmXZzvR3LNARDN3fx6WVI3VJF50Fzvr7EZtY8zQdLtUiOYXGIrJpXUmvTDdk61HCKEqiagD9SSwnLCeX3RYwSJafRd/zoUj2FzVm2hyzMJ6gV0Y46Myl/BzjeqfnyMg36G5NJqpoTPvnLGWEnS0f9lVStL/7NgT/C5XNoHTW6XesV4En/1wlGo+Oo4QJ1ivoxxqju+fKCG2lf1uFH7P3eEl2K8xndRt3VKKEE4sPKWOHiCreg28TaPR1RN/X6GwEO0GReJ3cg95kUWeqzT8W6KtMpujcVaZQRfgFjL8qcbCDvndi/Zz0h4Hr6L8JHBHRW0L7DejdAU6K6Nj8CfBQi4mH4xYmrmy1sXlK/gCAAyfkQaAT91kWj9HW/6tJ8MO3NmeC+4CHlqdu1q7o25Xk5Hqynw+WBp+hpO1K4JItsnfr5GyCbSirCHstnQpcKulBXMK+o1frCPGgWAomwL2gLsm0z3S9ny38XARWgEXJOI7xNMiS9ns9MN5ZCQhEQ1lIGCOXmZf4ZeAW8C4IAblv3wBXAIn6sjkZ3Arc80FvGKW/nu4H/nhZDiR0IngI+LYPY3i43gWuAeNgFBQSn0UYJZejRH3CPQ8cMDi19Jp6AviuVfd48ADwRZXWG3Z9J/6fApeAJUm2TYRE02OZjPfA3WAM9HVDdvt2iXHI1HkoPQd2g7SjUHef+NyU7AXgFRD65qOcZrybQXgFmtUDIDu2xE3CBuCWWBxIU+8vk9MozdQukDUO3x4qm5IJOp36ZyW6waaJci/jrkviWEV9qiQOdd8Ebr/+T0fKkYvBp6AqOB2fnQz0SA39Kn9z6Z9mfPeze/UlUOXrB3Q2AW36a77KwP7tYCwh7Mupjk1TOmZuNInlyZqxuN8n3ItrQF1xryvRl9W/3Y3/60QGCTGF71h5JB0Tbn7vsDqyP6Vkva5dymxoVQ+lIE6+3+lJCH3Zcp+E78y2Fny7Evw7kstC8YA7BtQZRP1hiwTDKnuGun8aSiekaDxXwrbG/zOtaOT/ss3MLSjpCLc93V2Guwy3bAa6Jd2yhObodBnOTUnLGroMtyyhOTpdhnNT0rKGfwD3f6JVZi/xSQAAAABJRU5ErkJggg==')}.x-tabbar-light{background-image:none;background-color:#2583c4;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #56a7df), color-stop(3%, #2b91d7), color-stop(100%, #2175af));background-image:-webkit-linear-gradient(top, #56a7df,#2b91d7 3%,#2175af);background-image:linear-gradient(top, #56a7df,#2b91d7 3%,#2175af);border-top-color:#2175af;border-bottom-color:#195884}.x-tabbar-light .x-tab{color:#c1dff4}.x-tabbar-light .x-tab-active{color:white;border-bottom:1px solid #278bd1}.x-tabbar-light .x-tab-pressed{color:white}.x-tabbar-light.x-docked-bottom .x-tab{text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-light.x-docked-bottom .x-tab .x-button-icon{background-image:none;background-color:#6cb2e3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #acd4f0), color-stop(3%, #81bde7), color-stop(100%, #56a7df));background-image:-webkit-linear-gradient(top, #acd4f0,#81bde7 3%,#56a7df);background-image:linear-gradient(top, #acd4f0,#81bde7 3%,#56a7df)}.x-tabbar-light.x-docked-bottom .x-tab-active{background-image:none;background-color:#2175af;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #195884), color-stop(10%, #1d6699), color-stop(65%, #2175af), color-stop(100%, #2176b1));background-image:-webkit-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0;-webkit-box-shadow:#1d6699 0 0 0.25em inset;box-shadow:#1d6699 0 0 0.25em inset}.x-tabbar-light.x-docked-bottom .x-tab-active .x-button-icon{background-image:none;background-color:#1da2ff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #6ac2ff), color-stop(3%, #37adff), color-stop(100%, #0398ff));background-image:-webkit-linear-gradient(top, #6ac2ff,#37adff 3%,#0398ff);background-image:linear-gradient(top, #6ac2ff,#37adff 3%,#0398ff)}.x-tabbar-light.x-docked-top .x-tab-active{background-image:none;background-color:#2175af;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #195884), color-stop(10%, #1d6699), color-stop(65%, #2175af), color-stop(100%, #2176b1));background-image:-webkit-linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);background-image:linear-gradient(top, #195884,#1d6699 10%,#2175af 65%,#2176b1);color:white}.x-tabbar-dark{background-image:none;background-color:#0e4b75;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1676b9), color-stop(3%, #11598c), color-stop(100%, #0b3c5e));background-image:-webkit-linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e);background-image:linear-gradient(top, #1676b9,#11598c 3%,#0b3c5e);border-top-color:#0b3c5e;border-bottom-color:#061f31}.x-tabbar-dark .x-tab{color:#63b4ec}.x-tabbar-dark .x-tab-active{color:white;border-bottom:1px solid #105483}.x-tabbar-dark .x-tab-pressed{color:white}.x-tabbar-dark.x-docked-bottom .x-tab{text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-tabbar-dark.x-docked-bottom .x-tab .x-button-icon{background-image:none;background-color:#1985d0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4ca9e9), color-stop(3%, #1e93e4), color-stop(100%, #1676b9));background-image:-webkit-linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);background-image:linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9)}.x-tabbar-dark.x-docked-bottom .x-tab-active{background-image:none;background-color:#0b3c5e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #061f31), color-stop(10%, #092e47), color-stop(65%, #0b3c5e), color-stop(100%, #0c3e60));background-image:-webkit-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0;-webkit-box-shadow:#092e47 0 0 0.25em inset;box-shadow:#092e47 0 0 0.25em inset}.x-tabbar-dark.x-docked-bottom .x-tab-active .x-button-icon{background-image:none;background-color:#50b7ff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #9dd7ff), color-stop(3%, #6ac2ff), color-stop(100%, #37adff));background-image:-webkit-linear-gradient(top, #9dd7ff,#6ac2ff 3%,#37adff);background-image:linear-gradient(top, #9dd7ff,#6ac2ff 3%,#37adff)}.x-tabbar-dark.x-docked-top .x-tab-active{background-image:none;background-color:#0b3c5e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #061f31), color-stop(10%, #092e47), color-stop(65%, #0b3c5e), color-stop(100%, #0c3e60));background-image:-webkit-linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);background-image:linear-gradient(top, #061f31,#092e47 10%,#0b3c5e 65%,#0c3e60);color:white}.x-tabbar-neutral{background-image:none;background-color:#e0e0e0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ededed), color-stop(100%, #d3d3d3));background-image:-webkit-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);border-top-color:#d3d3d3;border-bottom-color:#bababa}.x-tabbar-neutral .x-tab{color:#7a7a7a}.x-tabbar-neutral .x-tab-active{color:black;border-bottom:1px solid #e8e8e8}.x-tabbar-neutral .x-tab-pressed{color:black}.x-tabbar-neutral.x-docked-bottom .x-tab{text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0}.x-tabbar-neutral.x-docked-bottom .x-tab .x-button-icon{background-image:none;background-color:#adadad;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d3d3d3), color-stop(3%, #bababa), color-stop(100%, #a0a0a0));background-image:-webkit-linear-gradient(top, #d3d3d3,#bababa 3%,#a0a0a0);background-image:linear-gradient(top, #d3d3d3,#bababa 3%,#a0a0a0)}.x-tabbar-neutral.x-docked-bottom .x-tab-active{background-image:none;background-color:#d3d3d3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bababa), color-stop(10%, #c7c7c7), color-stop(65%, #d3d3d3), color-stop(100%, #d5d5d5));background-image:-webkit-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0;-webkit-box-shadow:#c7c7c7 0 0 0.25em inset;box-shadow:#c7c7c7 0 0 0.25em inset}.x-tabbar-neutral.x-docked-bottom .x-tab-active .x-button-icon{background-image:none;background-color:#7a7a7a;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a0a0a0), color-stop(3%, #878787), color-stop(100%, #6d6d6d));background-image:-webkit-linear-gradient(top, #a0a0a0,#878787 3%,#6d6d6d);background-image:linear-gradient(top, #a0a0a0,#878787 3%,#6d6d6d)}.x-tabbar-neutral.x-docked-top .x-tab-active{background-image:none;background-color:#d3d3d3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bababa), color-stop(10%, #c7c7c7), color-stop(65%, #d3d3d3), color-stop(100%, #d5d5d5));background-image:-webkit-linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);background-image:linear-gradient(top, #bababa,#c7c7c7 10%,#d3d3d3 65%,#d5d5d5);color:black}.x-tab.x-item-disabled span.x-button-label,.x-tab.x-item-disabled .x-hasbadge span.x-badge,.x-hasbadge .x-tab.x-item-disabled span.x-badge,.x-tab.x-item-disabled .x-button-icon{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=50);opacity:0.5}.x-tab.x-draggable{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=70);opacity:0.7}.x-tab{-webkit-user-select:none;overflow:visible !important}.x-tab .x-button-label,.x-tab .x-hasbadge .x-badge,.x-hasbadge .x-tab .x-badge{overflow:visible !important}.x-tabbar > *{z-index:1}.x-toolbar{padding:0 0.2em;overflow:hidden;position:relative;height:2.6em}.x-toolbar > *{z-index:1}.x-toolbar.x-docked-top{border-bottom:.1em solid}.x-toolbar.x-docked-bottom{border-top:.1em solid}.x-toolbar.x-docked-left{width:7em;height:auto;padding:0.2em;border-right:.1em solid}.x-toolbar.x-docked-right{width:7em;height:auto;padding:0.2em;border-left:.1em solid}.x-title{line-height:2.1em;font-size:1.2em;text-align:center;font-weight:bold;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin:0 0.3em;max-width:100%}.x-title .x-innerhtml{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 .3em}.x-toolbar-dark{background-image:none;background-color:#1468a2;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1e93e4), color-stop(3%, #1676b9), color-stop(100%, #11598c));background-image:-webkit-linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);background-image:linear-gradient(top, #1e93e4,#1676b9 3%,#11598c);border-color:black}.x-toolbar-dark .x-title{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-dark.x-docked-top{border-bottom-color:black}.x-toolbar-dark.x-docked-bottom{border-top-color:black}.x-toolbar-dark.x-docked-left{border-right-color:black}.x-toolbar-dark.x-docked-right{border-left-color:black}.x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before{border:1px solid #061f31;border-top-color:#092e47;color:white}.x-toolbar-dark .x-button.x-button-back:before,.x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-button.x-button-back:before,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:before{background:#061f31}.x-toolbar-dark .x-button,.x-toolbar-dark .x-button.x-button-back:after,.x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-button,.x-toolbar .x-toolbar-dark .x-button.x-button-back:after,.x-toolbar .x-toolbar-dark .x-button.x-button-forward:after,.x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#11598c;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #1985d0), color-stop(3%, #1468a2), color-stop(100%, #0e4b75));background-image:-webkit-linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75);background-image:linear-gradient(top, #1985d0,#1468a2 3%,#0e4b75)}.x-toolbar-dark .x-button .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-dark .x-button .x-button-icon.x-icon-mask,.x-toolbar-dark .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar-dark .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask{background-image:none;background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ffffff), color-stop(100%, #e8f4fc));background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#e8f4fc);background-image:linear-gradient(top, #ffffff,#ffffff 3%,#e8f4fc)}.x-toolbar-dark .x-button.x-button-pressing,.x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar-dark .x-button.x-button-pressed,.x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar-dark .x-button.x-button-active,.x-toolbar-dark .x-button.x-button-active:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing,.x-toolbar .x-toolbar-dark .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed,.x-toolbar .x-toolbar-dark .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-button.x-button-active,.x-toolbar .x-toolbar-dark .x-button.x-button-active:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-dark .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#0f517e;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0a3351), color-stop(10%, #0c4267), color-stop(65%, #0f517e), color-stop(100%, #0f5280));background-image:-webkit-linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280);background-image:linear-gradient(top, #0a3351,#0c4267 10%,#0f517e 65%,#0f5280)}.x-toolbar-dark .x-form-label{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-light{background-image:none;background-color:#1985d0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4ca9e9), color-stop(3%, #1e93e4), color-stop(100%, #1676b9));background-image:-webkit-linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);background-image:linear-gradient(top, #4ca9e9,#1e93e4 3%,#1676b9);border-color:black}.x-toolbar-light .x-title{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-light.x-docked-top{border-bottom-color:black}.x-toolbar-light.x-docked-bottom{border-top-color:black}.x-toolbar-light.x-docked-left{border-right-color:black}.x-toolbar-light.x-docked-right{border-left-color:black}.x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer,.x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before{border:1px solid #0b3c5e;border-top-color:#0e4b75;color:white}.x-toolbar-light .x-button.x-button-back:before,.x-toolbar-light .x-button.x-button-forward:before,.x-toolbar .x-toolbar-light .x-button.x-button-back:before,.x-toolbar .x-toolbar-light .x-button.x-button-forward:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:before{background:#0b3c5e}.x-toolbar-light .x-button,.x-toolbar-light .x-button.x-button-back:after,.x-toolbar-light .x-button.x-button-forward:after,.x-toolbar .x-toolbar-light .x-button,.x-toolbar .x-toolbar-light .x-button.x-button-back:after,.x-toolbar .x-toolbar-light .x-button.x-button-forward:after,.x-toolbar-light .x-field-select .x-component-outer,.x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#1676b9;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #359ee7), color-stop(3%, #1985d0), color-stop(100%, #1468a2));background-image:-webkit-linear-gradient(top, #359ee7,#1985d0 3%,#1468a2);background-image:linear-gradient(top, #359ee7,#1985d0 3%,#1468a2)}.x-toolbar-light .x-button .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-light .x-button .x-button-icon.x-icon-mask,.x-toolbar-light .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar-light .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask{background-image:none;background-color:white;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ffffff), color-stop(100%, #e8f4fc));background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#e8f4fc);background-image:linear-gradient(top, #ffffff,#ffffff 3%,#e8f4fc)}.x-toolbar-light .x-button.x-button-pressing,.x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar-light .x-button.x-button-pressed,.x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar-light .x-button.x-button-active,.x-toolbar-light .x-button.x-button-active:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressing,.x-toolbar .x-toolbar-light .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-button.x-button-pressed,.x-toolbar .x-toolbar-light .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-button.x-button-active,.x-toolbar .x-toolbar-light .x-button.x-button-active:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar-light .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-light .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-light .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#156eac;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0f517e), color-stop(10%, #125f95), color-stop(65%, #156eac), color-stop(100%, #156fae));background-image:-webkit-linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae);background-image:linear-gradient(top, #0f517e,#125f95 10%,#156eac 65%,#156fae)}.x-toolbar-light .x-form-label{color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-toolbar-neutral{background-image:none;background-color:#e0e0e0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ededed), color-stop(100%, #d3d3d3));background-image:-webkit-linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);background-image:linear-gradient(top, #ffffff,#ededed 3%,#d3d3d3);border-color:#616161}.x-toolbar-neutral .x-title{color:#070707;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0}.x-toolbar-neutral.x-docked-top{border-bottom-color:#616161}.x-toolbar-neutral.x-docked-bottom{border-top-color:#616161}.x-toolbar-neutral.x-docked-left{border-right-color:#616161}.x-toolbar-neutral.x-docked-right{border-left-color:#616161}.x-toolbar-neutral .x-button,.x-toolbar .x-toolbar-neutral .x-button,.x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar-neutral .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before{border:1px solid #a0a0a0;border-top-color:#adadad;color:black}.x-toolbar-neutral .x-button.x-button-back:before,.x-toolbar-neutral .x-button.x-button-forward:before,.x-toolbar .x-toolbar-neutral .x-button.x-button-back:before,.x-toolbar .x-toolbar-neutral .x-button.x-button-forward:before,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:before,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:before,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-forward:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-back:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-forward:before{background:#a0a0a0}.x-toolbar-neutral .x-button,.x-toolbar-neutral .x-button.x-button-back:after,.x-toolbar-neutral .x-button.x-button-forward:after,.x-toolbar .x-toolbar-neutral .x-button,.x-toolbar .x-toolbar-neutral .x-button.x-button-back:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-forward:after,.x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-back:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-forward:after,.x-toolbar-neutral .x-field-select .x-component-outer:before,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-forward:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-back:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-forward:after{background-image:none;background-color:#d3d3d3;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #fafafa), color-stop(3%, #e0e0e0), color-stop(100%, #c7c7c7));background-image:-webkit-linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7);background-image:linear-gradient(top, #fafafa,#e0e0e0 3%,#c7c7c7)}.x-toolbar-neutral .x-button .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-neutral .x-button .x-button-icon.x-icon-mask,.x-toolbar-neutral .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer .x-button-icon.x-icon-mask,.x-toolbar-neutral .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before .x-button-icon.x-icon-mask{background-image:none;background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #262626), color-stop(3%, #0d0d0d), color-stop(100%, #000000));background-image:-webkit-linear-gradient(top, #262626,#0d0d0d 3%,#000000);background-image:linear-gradient(top, #262626,#0d0d0d 3%,#000000)}.x-toolbar-neutral .x-button.x-button-pressing,.x-toolbar-neutral .x-button.x-button-pressing:after,.x-toolbar-neutral .x-button.x-button-pressed,.x-toolbar-neutral .x-button.x-button-pressed:after,.x-toolbar-neutral .x-button.x-button-active,.x-toolbar-neutral .x-button.x-button-active:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressing,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressing:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressed,.x-toolbar .x-toolbar-neutral .x-button.x-button-pressed:after,.x-toolbar .x-toolbar-neutral .x-button.x-button-active,.x-toolbar .x-toolbar-neutral .x-button.x-button-active:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-active,.x-toolbar-neutral .x-field-select .x-component-outer.x-button-active:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressing:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-pressed:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-active,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer.x-button-active:after,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-active,.x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-active:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressing,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressing:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressed,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-pressed:after,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-active,.x-toolbar .x-toolbar-neutral .x-field-select .x-component-outer:before.x-button-active:after{background-image:none;background-color:#cccccc;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #b2b2b2), color-stop(10%, #bfbfbf), color-stop(65%, #cccccc), color-stop(100%, #cdcdcd));background-image:-webkit-linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd);background-image:linear-gradient(top, #b2b2b2,#bfbfbf 10%,#cccccc 65%,#cdcdcd)}.x-toolbar-neutral .x-form-label{color:#070707;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0}.x-toolbar.x-toolbar-neutral .x-toolbar-inner .x-button.x-button-pressing{background-image:-webkit-gradient(radial, 50% 50%, 0, 50% 50%, 24, color-stop(0%, rgba(122,191,239,0.7)), color-stop(100%, rgba(122,191,239,0)));background-image:-webkit-radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px);background-image:radial-gradient(rgba(122,191,239,0.7),rgba(122,191,239,0) 24px)}.x-toolbar.x-toolbar-neutral .x-toolbar-inner .x-button.x-button-pressing .x-button-icon.x-button-mask{background-image:none;background-color:#fff;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e6e6e6), color-stop(10%, #f2f2f2), color-stop(65%, #ffffff), color-stop(100%, #ffffff));background-image:-webkit-linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff);background-image:linear-gradient(top, #e6e6e6,#f2f2f2 10%,#ffffff 65%,#ffffff)}.x-navigation-bar .x-container{overflow:visible}.x-spinner .x-input-el,.x-field-select .x-input-el{-webkit-text-fill-color:#000;-webkit-opacity:1}.x-spinner.x-item-disabled .x-input-el,.x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:currentcolor}.x-toolbar .x-field-select .x-input-el{-webkit-text-fill-color:#fff}.x-toolbar .x-field-select.x-item-disabled .x-input-el{-webkit-text-fill-color:rgba(255, 255, 255, 0.6)}.x-toolbar .x-form-field-container{padding:0 .3em}.x-toolbar .x-field{width:13em;margin:.5em;min-height:0;border-bottom:0;background:transparent}.x-toolbar .x-field .x-clear-icon{background-size:50% 50%;right:-0.8em;margin-top:-1.06em}.x-toolbar .x-field-input{padding-right:1.6em !important}.x-toolbar .x-field-textarea .x-component-outer,.x-toolbar .x-field-text .x-component-outer,.x-toolbar .x-field-number .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-webkit-border-radius:0.3em;border-radius:0.3em;background-color:white;-webkit-box-shadow:inset rgba(0, 0, 0, 0.5) 0 0.1em 0, inset rgba(0, 0, 0, 0.5) 0 -0.1em 0, inset rgba(0, 0, 0, 0.5) 0.1em 0 0, inset rgba(0, 0, 0, 0.5) -0.1em 0 0, inset rgba(0, 0, 0, 0.5) 0 0.15em 0.4em}.x-toolbar .x-form-label{background:transparent;border:0;padding:0;line-height:1.4em}.x-toolbar .x-form-field{height:1.6em;color:#6e6e6e;background:transparent;min-height:0;-webkit-appearance:none;padding:0em .3em;margin:0}.x-toolbar .x-form-field:focus{color:black}.x-toolbar .x-field-select .x-component-outer,.x-toolbar .x-field-search .x-component-outer{-webkit-border-radius:0.8em;border-radius:0.8em}.x-toolbar .x-field-search .x-field-input{background-position:.5em 50%}.x-toolbar .x-field-select{-webkit-box-shadow:none}.x-toolbar .x-field-select .x-form-field{height:1.4em}.x-toolbar .x-field-select{background:transparent}.x-toolbar .x-field-select .x-component-outer:after{right:.4em}.x-toolbar .x-field-select.x-item-disabled .x-component-outer:after{opacity:.6}.x-toolbar .x-field-select .x-component-outer:before{width:3em;border-left:none;-webkit-border-top-right-radius:0.8em;border-top-right-radius:0.8em;-webkit-border-bottom-right-radius:0.8em;border-bottom-right-radius:0.8em;-webkit-mask:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAABCAYAAACc0f2yAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADJJREFUeNpi/P//PwMjIyMbAwMDOxRzAjEXFHMDMQ8a5kXC6HLcSHo5kcwEmU9TABBgAOcTBAFcRiSpAAAAAElFTkSuQmCC');-webkit-mask-position:right top;-webkit-mask-repeat:repeat-y;-webkit-mask-size:3em 0.05em}.x-toolbar .x-field-select .x-input-text{color:#fff}.x-android .x-field-search .x-field-input{padding-left:.2em !important;padding-right:2.2em !important}.x-indexbar-wrapper{-webkit-box-pack:end !important;box-pack:end !important;pointer-events:none}.x-indexbar-vertical{width:1.1em;-webkit-box-orient:vertical;box-orient:vertical;margin-right:8px}.x-indexbar-horizontal{height:1.1em;-webkit-box-orient:horizontal;box-orient:horizontal;margin-bottom:8px}.x-indexbar{pointer-events:auto;z-index:2;padding:.3em 0;min-height:0 !important;height:auto !important;-webkit-box-flex:0 !important}.x-indexbar > div{color:#155988;font-size:0.6em;text-align:center;line-height:1.1em;font-weight:bold;display:block}.x-phone.x-landscape .x-indexbar > div{font-size:0.38em;line-height:1em}.x-indexbar-pressed{-webkit-border-radius:0.55em;border-radius:0.55em;background-color:rgba(143, 155, 163, 0.8)}.x-list{position:relative;background-color:#f7f7f7}.x-list .x-list-inner{width:100%}.x-list .x-list-disclosure{position:absolute;bottom:0.44em;right:0.44em}.x-list .x-list-disclosure{overflow:visible;-webkit-mask:0 0 url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpFNkNCM0JGNTZFMjI2ODExQkNGQjkwMzk3MDc3MkZFQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo3M0MzQUU1QUFDQkQxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo3M0MzQUU1OUFDQkQxMURGOEQ2MUVDMjM0MzY2NTBDQSIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkU3Q0IzQkY1NkUyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkU2Q0IzQkY1NkUyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIi8+IDwvcmRmOkRlc2NyaXB0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') no-repeat;-webkit-mask-size:1.7em;background-image:none;background-color:#006bb6;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0398ff), color-stop(3%, #007ad0), color-stop(100%, #005c9d));background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);width:1.7em;height:1.7em}.x-list.x-list-indexed .x-list-disclosure{margin-right:1em}.x-list .x-item-selected .x-list-disclosure{background:#fff none}.x-list .x-list-item{position:relative;color:black}.x-list .x-list-item .x-list-item-label{min-height:2.6em;padding:0.65em 0.8em}.x-list .x-list-item.x-item-pressed .x-list-item-label{background:#b6e1ff none}.x-list .x-list-item.x-item-selected .x-list-item-label{background-image:none;background-color:#006bb6;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #0398ff), color-stop(3%, #007ad0), color-stop(100%, #005c9d));background-image:-webkit-linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);background-image:linear-gradient(top, #0398ff,#007ad0 3%,#005c9d);color:white;text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-list-header{position:relative}.x-list-header-swap{position:absolute;left:0;width:100%;z-index:1}.x-ios .x-list-header-swap{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0)}.x-list-normal .x-list-header{background-image:none;background-color:#5ab5f5;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a2d6f9), color-stop(3%, #72c0f6), color-stop(100%, #42abf4));background-image:-webkit-linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);background-image:linear-gradient(top, #a2d6f9,#72c0f6 3%,#42abf4);color:#0a6aac;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0;border-top:1px solid #5ab5f5;border-bottom:1px solid #0d87dc;font-weight:bold;font-size:0.8em;padding:0.2em 1.02em;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0}.x-list-normal .x-list-item .x-list-item-label{border-top:1px solid #dedede}.x-list-normal .x-list-item:last-child .x-list-item-label{border-bottom:1px solid #dedede}.x-list-normal .x-list-item:first-child .x-list-item-label{border-top:0}.x-list-normal .x-list-item.x-item-pressed .x-list-item-label{border-top-color:#b6e1ff;background-color:#b6e1ff}.x-list-normal .x-list-item.x-item-selected .x-list-item-label{border-top-color:#006bb6;border-bottom-color:#003e6a}.x-list-round .x-scroll-view{background-color:#EEEEEE !important}.x-list-round .x-list-disclosure{overflow:hidden;-webkit-mask:0 0 url('data:image/png;base64,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') no-repeat;-webkit-mask-size:1.5em;background-image:none;background-color:#419cdb;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #81bde7), color-stop(3%, #56a7df), color-stop(100%, #2b91d7));background-image:-webkit-linear-gradient(top, #81bde7,#56a7df 3%,#2b91d7);background-image:linear-gradient(top, #81bde7,#56a7df 3%,#2b91d7);width:1.5em;height:1.5em;bottom:0.5em}.x-list-round .x-list-header{color:#777;font-size:1em;font-weight:bold;padding-left:26px;line-height:1.7em;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee), color-stop(30%, rgba(238,238,238,0.9)), color-stop(100%, rgba(238,238,238,0.4)));background-image:-webkit-linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4));background-image:linear-gradient(top, #eeeeee,rgba(238,238,238,0.9) 30%,rgba(238,238,238,0.4))}.x-list-round .x-list-container{padding:13px 13px 0 13px}.x-list-round .x-list-container .x-list-header{padding-left:13px;background-image:none}.x-list-round.x-list-ungrouped .x-list-item-label,.x-list-round.x-list-grouped .x-list-item-label{border:solid #DDDDDD;border-width:1px 1px 0 1px;background:#fff}.x-list-round.x-list-ungrouped .x-list-item:first-child .x-list-item-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-ungrouped .x-list-item:last-child{margin-bottom:13px}.x-list-round.x-list-ungrouped .x-list-item:last-child .x-list-item-label{-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;border-width:1px}.x-list-round.x-list-grouped .x-list-header-item .x-list-item-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-list-round.x-list-grouped .x-list-footer-item{margin-bottom:13px}.x-list-round.x-list-grouped .x-list-footer-item .x-list-item-label{border-width:1px;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-dataview-inlineblock .x-dataview-item{display:inline-block !important}.x-dataview-nowrap .x-dataview-container{white-space:nowrap !important}.x-list-inlineblock .x-list-item{display:inline-block !important}.x-list-nowrap .x-list-inner{width:auto}.x-list-nowrap .x-list-container{white-space:nowrap !important}.x-list-paging{height:50px}.x-list-paging .x-loading-spinner{display:none;margin:auto}.x-list-paging .x-list-paging-msg{text-align:center;color:#006bb6;padding-top:10px;clear:both;-webkit-border-radius:6px;border-radius:6px}.x-list-paging.x-loading .x-loading-spinner{display:block}.x-list-paging.x-loading .x-list-paging-msg{display:none}.x-list-pullrefresh{display:-webkit-box;display:box;-webkit-box-orient:horizontal;box-orient:horizontal;-webkit-box-align:center;box-align:center;-webkit-box-pack:center;box-pack:center;position:absolute;top:-5em;left:0;width:100%;height:4.5em}.x-list-pullrefresh .x-loading-spinner{display:none}.x-list-pullrefresh-arrow{width:2.5em;height:4.5em;background:center center url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAA8CAYAAAAUufjgAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAjFJREFUeNrsmU8oREEYwOexdtNuKBfFwdVhCyfuysnFiXISS+1BLopyUpKLXETkRLaUi1LK3Q2lpPbiQLnIn03a/Hm+z86Ttv0zM++bfbOar36Hbad5v535Zp7v47iuy0wOpyoEHccRHV9L9NxPkUE/bhKCOKiOSPAdn69DsJ5I8E2HYA0QJRJ8Bb50CDYRCT7pEMQD0kwk+CByUFQEW4gE73UIhoA2IsFb4ENEMCQ5MdU1IxwygpT3oKNLMGyyYFVscdhusc8tDpu+xRG7xf95BW0O2kNiV1AgIvaQ2BzUJNgJNJYZGyUU7OG1cal4Bi68oqkDPszy2teEwJp5Cdyu/lZ1g8CwIYJ7wEF+2YmrNw90Byx3BizgKhaqizEP1wg7CLLxCEzy/CtauMeBlQDyEfNuGrgU6SyM8F9SyVgHdmRaH6tAb4XkToEp2d4M5mOK0TWMigU2koa8vJMRZPxEb2ss2LEVPMpPLlMRxBgDZjQJLgNbxb6Uab9tAn3EcifAeKkBMoLY+j0GWonk7oB+lmsFkwhidAGHBPmIeTcAnJcbKCuIMQEs+hScAzZEBqoIYuzyFVCJI36lMJ2CDfxibZeUu+EX/4uMIFP8ZyLejxkgK0hG5a8kP4IYSZbr1IuQVHmAX0HGX4VuGfZVJ6cQxPd1uoRcWqDW0SroFVzZAnJZ/h0LWhAjUUAw4XdSSsH8fExRTEgtGAOuOTETBb16Jk412e+bxOSwglYw6PgWYABvLk8P7zGJFwAAAABJRU5ErkJggg==') no-repeat;background-size:2em 3em;-webkit-transform:rotate(0deg);transform:rotate(0deg)}.x-list-pullrefresh-release .x-list-pullrefresh-arrow{-webkit-transform:rotate(-180deg);transform:rotate(-180deg)}.x-list-pullrefresh-wrap{width:20em;font-size:0.7em}.x-list-pullrefresh-message{font-weight:bold;font-size:1.3em;margin-bottom:0.1em;text-align:center}.x-list-pullrefresh-updated{text-align:center}html,body{width:100%;height:100%}.x-translatable{position:absolute !important;top:100% !important;left:100% !important;z-index:1}.x-translatable-container{position:relative}.x-translatable-wrapper{width:100%;height:100%;position:absolute;overflow:hidden}.x-translatable-stretcher{width:300%;height:300%;position:absolute;visibility:hidden;z-index:-1}.x-translatable-nested-stretcher{width:100%;height:100%;left:100%;top:100%;position:absolute;visibility:hidden;z-index:-1}.x-layout-fit,.x-layout-card{position:relative;overflow:hidden}.x-layout-fit-item,.x-layout-card-item,.x-layout-card-container{position:absolute !important;width:100%;height:100%;left:0;top:0}.x-layout-card-item{position:absolute !important;top:0;right:0;bottom:0;left:0}.x-layout-hbox,.x-layout-vbox{display:-webkit-box}.x-layout-hbox > *,.x-layout-vbox > *{-webkit-box-flex:0}.x-layout-hbox{-webkit-box-orient:horizontal}.x-layout-vbox{-webkit-box-orient:vertical}.x-layout-hbox > .x-layout-box-item{width:0 !important}.x-layout-vbox > .x-layout-box-item{height:0 !important}.x-table-inner{display:table !important;width:100%;height:100%}.x-table-inner.x-table-fixed{table-layout:fixed !important}.x-table-row{display:table-row !important}.x-table-row > *{display:table-cell !important;vertical-align:middle}.x-container,.x-body{display:-webkit-box}.x-body{overflow:hidden;-webkit-box-flex:1;min-width:100%;min-height:100%}.x-body > .x-inner,.x-container > .x-inner{-webkit-box-flex:1;min-width:100%;min-height:100%;position:relative}.x-docking-horizontal{display:-webkit-box;-webkit-box-flex:1;-webkit-box-orient:horizontal;min-width:100%;min-height:100%}.x-docking-vertical{display:-webkit-box;-webkit-box-flex:1;-webkit-box-orient:vertical;min-width:100%;min-height:100%}.x-centered{position:absolute !important;width:100%;height:100%;display:-webkit-box;-webkit-box-align:center;-webkit-box-pack:center}.x-floating{position:absolute !important}.x-centered > *{position:relative !important;-webkit-box-flex:0 !important}.x-size-change-detector{visibility:hidden;position:absolute;left:0;top:0;z-index:-1;width:100%;height:100%;overflow:hidden}.x-size-change-detector > *{visibility:hidden}.x-size-change-detector-shrink > *{width:200%;height:200%}.x-size-change-detector-expand > *{width:100000px;height:100000px}.x-scroll-view{position:relative;display:block}.x-scroll-container{position:absolute;overflow:hidden;width:100%;height:100%}.x-scroll-scroller{position:absolute;min-width:100%;min-height:100%}.x-ios .x-scroll-scroller{-webkit-transform:translate3d(0, 0, 0)}.x-scroll-stretcher{position:absolute;visibility:hidden}.x-scroll-bar-grid-wrapper{position:absolute;width:100%;height:100%}.x-scroll-bar-grid{display:table;width:100%;height:100%}.x-scroll-bar-grid > *{display:table-row}.x-scroll-bar-grid > * > *{display:table-cell}.x-scroll-bar-grid > :first-child > :first-child{width:100%;height:100%}.x-scroll-bar-grid > :first-child > :nth-child(2){padding:3px 3px 0 0}.x-scroll-bar-grid > :nth-child(2) > :first-child{padding:0 0 3px 3px}.x-scroll-bar{position:relative;overflow:hidden}.x-scroll-bar-stretcher{position:absolute;visibility:hidden;width:100%;height:100%}.x-scroll-bar-x{width:100%}.x-scroll-bar-x > .x-scroll-bar-stretcher{width:300%}.x-scroll-bar-x.active{height:6px}.x-scroll-bar-y{height:100%}.x-scroll-bar-y > .x-scroll-bar-stretcher{height:300%}.x-scroll-bar-y.active{width:6px}.x-scroll-indicator{background:#333;position:absolute;z-index:2;opacity:0.5}.x-scroll-indicator.default{-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-list-light .x-scroll-indicator,.x-dataview-light .x-scroll-indicator{background:#fff;opacity:1}.x-scroll-indicator-x{height:100%}.x-scroll-indicator-y{width:100%}.x-scroll-indicator.csstransform{background:none}.x-scroll-indicator.csstransform > *{position:absolute;background-color:#333}.x-scroll-indicator.csstransform > :nth-child(2){-webkit-transform-origin:0% 0%;background:none;content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAxhgAAAAA)}.x-scroll-indicator.csstransform.x-scroll-indicator-light > *{background-color:#eee}.x-scroll-indicator.csstransform.x-scroll-indicator-light > :nth-child(2){content:url(data:image/bmp;base64,Qk08AAAAAAAAADYAAAAoAAAAAQAAAAEAAAABABAAAAAAAAYAAAASCwAAEgsAAAAAAAAAAAAAvXcAAAAA)}.x-scroll-indicator.csstransform.x-scroll-indicator-y > *{width:100%}.x-scroll-indicator.csstransform.x-scroll-indicator-y > :first-child{height:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}.x-scroll-indicator.csstransform.x-scroll-indicator-y > :nth-child(2){height:1px}.x-scroll-indicator.csstransform.x-scroll-indicator-y > :last-child{height:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-scroll-indicator.csstransform.x-scroll-indicator-x > *{height:100%}.x-scroll-indicator.csstransform.x-scroll-indicator-x > :first-child{width:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}.x-scroll-indicator.csstransform.x-scroll-indicator-x > :nth-child(2){width:1px}.x-scroll-indicator.csstransform.x-scroll-indicator-x > :last-child{width:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.x-carousel{position:relative;overflow:hidden}.x-carousel-item{position:absolute;width:100%;height:100%}.x-carousel-item > *{position:absolute;width:100%;height:100%}.x-carousel-indicator{padding:0;-webkit-border-radius:0;border-radius:0;-webkit-box-shadow:none;background-color:transparent;background-image:none}.x-carousel-indicator{-webkit-box-flex:1;display:-webkit-box;display:box;-webkit-box-pack:center;box-pack:center;-webkit-box-align:center;box-align:center}.x-carousel-indicator span{display:block;width:0.5em;height:0.5em;-webkit-border-radius:0.25em;border-radius:0.25em;margin:0.2em}.x-carousel-indicator-horizontal{height:1.5em;width:100%}.x-carousel-indicator-vertical{-webkit-box-orient:vertical;box-orient:vertical;width:1.5em;height:100%}.x-carousel-indicator-light span{background-image:none;background-color:rgba(255, 255, 255, 0.1)}.x-carousel-indicator-light span.x-carousel-indicator-active{background-image:none;background-color:rgba(255, 255, 255, 0.3)}.x-carousel-indicator-dark span{background-image:none;background-color:rgba(0, 0, 0, 0.1)}.x-carousel-indicator-dark span.x-carousel-indicator-active{background-image:none;background-color:rgba(0, 0, 0, 0.3)}.x-form .x-scroll-container{background-color:#eeeeee}.x-form .x-scroll-container > .x-inner{padding:1em}.x-form-label{text-shadow:#fff 0 1px 1px;color:#333333;text-shadow:rgba(255, 255, 255, 0.25) 0 0.08em 0;padding:0.6em;display:none !important;background-color:#f7f7f7}.x-form-label span{font-size:.8em;font-weight:bold}.x-form-label-nowrap .x-form-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.x-field{min-height:2.5em;background:#fff}.x-field .x-field-input{position:relative;min-width:3.7em}.x-field .x-field-input,.x-field .x-input-el{width:100%}.x-field.x-field-labeled .x-form-label{display:block !important}.x-field:last-child{border-bottom:0}.x-label-align-left .x-component-outer,.x-label-align-right .x-component-outer{-webkit-box-flex:1;box-flex:1}.x-label-align-left:first-child .x-form-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em}.x-label-align-left:last-child .x-form-label{-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em}.x-label-align-right{-webkit-box-direction:reverse;box-direction:reverse}.x-label-align-right:first-child .x-form-label{-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-right:last-child{border-bottom:0}.x-label-align-right:last-child .x-form-label{-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-label-align-top,.x-label-align-bottom{-webkit-box-orient:vertical;box-orient:vertical}.x-label-align-top:first-child .x-form-label{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-label-align-bottom{-webkit-box-direction:reverse;box-direction:reverse}.x-label-align-bottom:last-child .x-form-label{-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-input-el{padding:.4em;min-height:2.5em;display:block;border-width:0;background:transparent;-webkit-appearance:none}.x-field-mask{position:absolute;top:0;right:0;bottom:0;left:0}.x-field-required label:after,.x-field-required .x-form-label:after{content:"*";display:inline}.x-item-disabled label:after,.x-item-disabled .x-form-label:after{color:#666 !important}.x-field-textarea textarea{min-height:6em;padding-top:.5em}.x-checkmark-base,.x-field-checkbox .x-input-el:after,.x-field-checkbox .x-input-el:checked:after,.x-select-overlay .x-item-selected .x-list-item-label:before,.x-select-overlay .x-item-selected .x-list-item-label:after{content:"";position:absolute;width:1.4em;height:1.4em;top:50%;left:auto;right:1.1em;-webkit-mask-size:1.4em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAE+klEQVRoBe2aS28URxRGsY0h2FmwCQuEWLHjvUNgZAQ4PMwrEkIRIGEgySKwB8QvYIvEP+ANO0CwsJAA88wGBEKBZJUVQkJCQrwJ5nxN31Z5pnpc7e4ZT9vT0peqqanquqfurVvlIW3Dw8NTJtPTPplgxdoCnugeb3m45eEJtgJTJwJPGw8cP8V6TfmC4/Z/H9uEAAZsIdqHZiMBn2UNbvigSw8M2AIAD6PtqBPpmYe+8t1NoL9GLfYf3bTKKhiWo9PoA9KV0dUgn/tRh8tXWg/Hnj0KUB8yz1JNnjXUuhFd264A/f0O7dKXpQ7EIiTPfkKuVyvrSlx3US+KPF26cMbwxeg8Gg3W4LWHFd6rUUepQprQnI/Rh9A25AtjmqseHVkK7w59UxpgYFdg7wH0CwqFpWvyrKI23GZ7OWluwgqwOnqOobVoWh4Tm97DwCpBHUFp2TiUX3v5QVMnLQzMmqAsUVWWyta3UX/TAmOcwjjk6KmE830W7GbU0ZTAGKYEJdj3yAcQ2qYw1jmsG9e0KF8122UDw/SHwFX0EYWC+fpZGG/hPcn1sqk8jGHas+dQ6KXCB6o2g91IPfKsObZpgDGsqAT1hXdpz25A7QZqZU1gBsxFSh5zbEA9yniOU5R5PSvvCnYTSsLYtdkLTGf9uKdD/gS6gI6jPndgUXXe24OKSFAK4zsoSVA+G6uAGaC758/oBrIs+Zb6rbg9up35Xpa1jffpUqEEldezysbJ0VPLjhHADOpEfUiw2gtuUtAKDiGtYNXeqDWJ7zveYQnqM3V3nqx1s2s97xmRoLzzWqMgkLLaTVQJa0ZoJe+hXjRmaMYKVlslr2dlp5wgu4PsiTyszmg5qgVr0CqvoZW2WFlKxhV5gxJsdIMKtYH+Eew6yksoNLy0soJeFzqR+vEI9gx6h9wFzFoPSlA+25g3SlChnnUNU3grkWmxRg0n+ihBnUR5w9j2bCbPGjzzR3sgbc+6gL66TV4zkTHHEqSfZSzr+94V0mbzKUF1GkSWknG5QktGyoj7qBdVeZo2S1Ch2yUNXOMVUcEJyrcQjOeP4vzQCu9BpBtOck5T70HybN4w1iJcR7ouem9QPjhfG+On7EBPUNrKhrYLWp7+FS1FCjtdKvJ6VvM/Q9o2uWC1AHq60QB6hELh0voJ+im6iHReF+FZwe5HP/g8lrXNzuEfeeFu9C9Kg8nSrr9lBZ9ljK/v37xjL5qRFSytf3K15KXy9EH0D/JN3ui2Qj1rC5AAq4FnJvoDPUSNBnTnUy4YQF1maFHlCOAYuouJFN6PkWtEo+ryrH5sL2TPVi5UFXAMrfDegxrtae3ZfWh6paFFffYCx9BKZLtQo/a0YLXIhSUo3yKlAsfQ8vSBBkALtrCjxwdqbTWBY2glst9REee0Lw/ULUEZpFuOChxD1yuRybNbUV0SlAtq9SDgGFp7ushEJlhdKuqWoAzSLYOBHeidGPkc+cIztE2wA6iuCcoFtXom4Bha4f0nGmv2FqyOnoaFscFG9rsfQusYq0T2G8qayASrbdEdOlfR/TJ72AzAaHla5/QD9BnVCucvfK/fjZXtx8WzZneu/+WBf53XOb0G6XetHjQXyfv2vKLyH7qLLqMhJn5DOW5PLmBZDfRUilloGUoD/ovvXgIrT4/rkxt4XK0fw+TtYxhT6iEt4FK7L8D4locDFqnUXSadh78Bx5bEl2CLG+8AAAAASUVORK5CYII=');margin-top:-0.7em}.x-radiomark-base,.x-field-radio .x-input-el:before,.x-field-radio .x-input-el:after{content:"";position:absolute;width:1.4em;height:1.4em;top:50%;left:auto;right:1.1em;margin-top:-0.7em;-webkit-mask-size:1.4em;-webkit-mask-image:url('data:image/png;base64,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')}.x-field-checkbox .x-input-el{position:relative}.x-field-checkbox .x-input-el:after{background-color:#dddddd}.x-field-checkbox .x-input-el:checked:after{background-color:#006bb6}.x-field-radio .x-input-el{position:relative}.x-field-radio .x-input-el:before{background-color:#d0d0d0}.x-field-radio .x-input-el:after{background-color:#dddddd;-webkit-mask-image:url('data:image/png;base64,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')}.x-field-radio .x-input-el:checked:before{background-color:#006bb6}.x-item-disabled.x-field-radio .x-input-el:checked:before{background:#84afcd}.x-item-disabled.x-field-radio .x-input-el:after{background:#eee}.x-item-disabled.x-field-checkbox .x-input-el:checked:after{background:#84afcd}.x-spinner .x-component-outer{display:-webkit-box;display:box}.x-spinner .x-component-outer > *{width:auto}.x-spinner .x-field-input{-webkit-box-flex:1}.x-spinner .x-field-input .x-input-el{-webkit-text-fill-color:#000;width:100%;text-align:center}.x-spinner .x-field-input input::-webkit-outer-spin-button,.x-spinner .x-field-input input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-spinner.x-item-disabled .x-input-el{-webkit-text-fill-color:#B3B3B3}.x-spinner.x-item-disabled .x-spinner-button{color:#aaa !important}.x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button{border:1px solid #c4c4c4;border-top-color:#d0d0d0;color:#1e1e1e}.x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:before{background:#c4c4c4}.x-spinner.x-item-disabled .x-spinner-button,.x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-forward:after{background-image:none;background-color:#f7f7f7;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #ffffff), color-stop(100%, #eaeaea));background-image:-webkit-linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea);background-image:linear-gradient(top, #ffffff,#ffffff 3%,#eaeaea)}.x-spinner.x-item-disabled .x-spinner-button .x-button-icon.x-icon-mask,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button .x-button-icon.x-icon-mask{background-image:none;background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #262626), color-stop(3%, #0d0d0d), color-stop(100%, #000000));background-image:-webkit-linear-gradient(top, #262626,#0d0d0d 3%,#000000);background-image:linear-gradient(top, #262626,#0d0d0d 3%,#000000)}.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-spinner.x-item-disabled .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active,.x-toolbar .x-spinner.x-item-disabled .x-spinner-button.x-button-active:after{background-image:none;background-color:#efefef;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d5d5d5), color-stop(10%, #e2e2e2), color-stop(65%, #efefef), color-stop(100%, #f0f0f0));background-image:-webkit-linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0);background-image:linear-gradient(top, #d5d5d5,#e2e2e2 10%,#efefef 65%,#f0f0f0)}.x-spinner .x-spinner-button{margin-top:.25em;margin-bottom:.25em;width:2em;padding:.23em 0 .27em;font-weight:bold;text-align:center;border:1px solid #dddddd !important;-webkit-border-radius:1em;border-radius:1em}.x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button{border:1px solid #b7b7b7;border-top-color:#c4c4c4;color:#111111}.x-spinner .x-spinner-button.x-button-back:before,.x-spinner .x-spinner-button.x-button-forward:before,.x-toolbar .x-spinner .x-spinner-button.x-button-back:before,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:before{background:#b7b7b7}.x-spinner .x-spinner-button,.x-spinner .x-spinner-button.x-button-back:after,.x-spinner .x-spinner-button.x-button-forward:after,.x-toolbar .x-spinner .x-spinner-button,.x-toolbar .x-spinner .x-spinner-button.x-button-back:after,.x-toolbar .x-spinner .x-spinner-button.x-button-forward:after{background-image:none;background-color:#eaeaea;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #f7f7f7), color-stop(100%, #dddddd));background-image:-webkit-linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd);background-image:linear-gradient(top, #ffffff,#f7f7f7 3%,#dddddd)}.x-spinner .x-spinner-button .x-button-icon.x-icon-mask,.x-toolbar .x-spinner .x-spinner-button .x-button-icon.x-icon-mask{background-image:none;background-color:black;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #262626), color-stop(3%, #0d0d0d), color-stop(100%, #000000));background-image:-webkit-linear-gradient(top, #262626,#0d0d0d 3%,#000000);background-image:linear-gradient(top, #262626,#0d0d0d 3%,#000000)}.x-spinner .x-spinner-button.x-button-pressing,.x-spinner .x-spinner-button.x-button-pressing:after,.x-spinner .x-spinner-button.x-button-pressed,.x-spinner .x-spinner-button.x-button-pressed:after,.x-spinner .x-spinner-button.x-button-active,.x-spinner .x-spinner-button.x-button-active:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing,.x-toolbar .x-spinner .x-spinner-button.x-button-pressing:after,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed,.x-toolbar .x-spinner .x-spinner-button.x-button-pressed:after,.x-toolbar .x-spinner .x-spinner-button.x-button-active,.x-toolbar .x-spinner .x-spinner-button.x-button-active:after{background-image:none;background-color:#e2e2e2;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c9c9c9), color-stop(10%, #d5d5d5), color-stop(65%, #e2e2e2), color-stop(100%, #e3e3e3));background-image:-webkit-linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3);background-image:linear-gradient(top, #c9c9c9,#d5d5d5 10%,#e2e2e2 65%,#e3e3e3)}.x-spinner .x-spinner-button-down{margin-left:.25em}.x-spinner .x-spinner-button-up{margin-right:.25em}.x-spinner.x-field-grouped-buttons .x-input-el{text-align:left}.x-spinner.x-field-grouped-buttons .x-spinner-button-down{margin-right:.5em}.x-android .x-spinner-button{padding:.40em 0 .11em !important}.x-phone .x-select-overlay{min-width:14em;min-height:12.5em}.x-select-overlay{min-width:18em;min-height:22em}.x-select-overlay .x-list-item-label{height:2.6em}.x-select-overlay .x-list-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.x-select-overlay .x-item-selected .x-list-label{margin-right:2.6em}.x-select-overlay .x-item-selected .x-list-item-label:before{background-color:rgba(0, 0, 0, 0.3);margin-top:-0.8em}.x-select-overlay .x-item-selected .x-list-item-label:after{background-color:#dddddd}.x-slider-field .x-component-outer,.x-toggle-field .x-component-outer{padding:0.6em}.x-slider,.x-toggle{position:relative;height:2.2em;min-height:0;min-width:0}.x-slider > *,.x-toggle > *{position:absolute;width:100%;height:100%}.x-slider.x-item-disabled{opacity:.6}.x-thumb{position:absolute;height:2.2em;width:2.2em}.x-thumb:before{content:"";position:absolute;width:1.85em;height:1.85em;top:0.175em;left:0.175em;border:1px solid #919191;-webkit-border-radius:0.925em;border-radius:0.925em;background-image:none;background-color:#dddddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff), color-stop(3%, #eaeaea), color-stop(100%, #d0d0d0));background-image:-webkit-linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);background-image:linear-gradient(top, #ffffff,#eaeaea 3%,#d0d0d0);-webkit-background-clip:padding;background-clip:padding-box}.x-thumb.x-dragging{opacity:1}.x-thumb.x-dragging:before{background-image:none;background-color:#d0d0d0;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f7f7f7), color-stop(3%, #dddddd), color-stop(100%, #c4c4c4));background-image:-webkit-linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4);background-image:linear-gradient(top, #f7f7f7,#dddddd 3%,#c4c4c4)}.x-slider:after{content:"";position:absolute;width:auto;height:0.8em;top:0.737em;left:0;right:0;margin:0 0.925em;background-image:none;background-color:#dddddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4c4c4), color-stop(10%, #d0d0d0), color-stop(65%, #dddddd), color-stop(100%, #dedede));background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);border:0.1em solid rgba(0, 0, 0, 0.1);border-bottom:0;-webkit-box-shadow:rgba(255, 255, 255, 0.7) 0 0.1em 0;-webkit-border-radius:0.4em;border-radius:0.4em}.x-toggle{width:4.4em;-webkit-border-radius:1.1em;border-radius:1.1em;overflow:hidden;border:1px solid #b7b7b7;background-image:none;background-color:#ddd;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #c4c4c4), color-stop(10%, #d0d0d0), color-stop(65%, #dddddd), color-stop(100%, #dedede));background-image:-webkit-linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);background-image:linear-gradient(top, #c4c4c4,#d0d0d0 10%,#dddddd 65%,#dedede);-webkit-box-flex:0}.x-toggle .x-thumb.x-dragging{opacity:1}.x-toggle .x-thumb:before{top:0.175em}.x-toggle-on{background-image:none;background-color:#92cf00;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #6e9c00), color-stop(10%, #80b500), color-stop(65%, #92cf00), color-stop(100%, #94d200));background-image:-webkit-linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200);background-image:linear-gradient(top, #6e9c00,#80b500 10%,#92cf00 65%,#94d200)}input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none}.x-field-number input::-webkit-outer-spin-button,.x-field-number input::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.x-field-search .x-field-input{position:relative}.x-field-search .x-field-input:before{content:"";position:absolute;width:0.86em;height:0.86em;top:50%;left:0.5em;-webkit-mask-image:url('data:image/png;base64,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');-webkit-mask-size:.86em;background-color:#ccc;-webkit-mask-repeat:no-repeat;margin-top:-0.43em}.x-field-search .x-field-input .x-form-field{margin-left:1.0em}.x-field-input .x-clear-icon{display:none;background:url('data:image/png;base64,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') no-repeat;background-position:center center;background-size:55% 55%;width:2.2em;height:2.2em;margin:.5em;margin-top:-1.1em;position:absolute;top:50%;right:-0.5em}.x-field-clearable .x-clear-icon{display:block}.x-field-clearable .x-field-input{padding-right:2.2em}.x-android .x-input-el{-webkit-text-fill-color:#000}.x-android .x-empty .x-input-el{-webkit-text-fill-color:#A9A9A9}.x-item-disabled .x-form-label span,.x-item-disabled input,.x-item-disabled .x-input-el,.x-item-disabled .x-spinner-body,.x-item-disabled select,.x-item-disabled textarea,.x-item-disabled .x-field-clear-container{color:#b3b3b3;-webkit-text-fill-color:#b3b3b3;pointer-events:none}.x-form-fieldset{margin:0 0 1.5em}.x-form-fieldset .x-form-label{border-top:1px solid white}.x-form-fieldset .x-form-fieldset-inner{border:1px solid #dddddd;background:#fff;padding:0;-webkit-border-radius:0.4em;border-radius:0.4em;overflow:hidden}.x-form-fieldset .x-field{border-bottom:1px solid #dddddd;background:transparent}.x-form-fieldset .x-field:first-child{-webkit-border-top-left-radius:0.4em;border-top-left-radius:0.4em;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em}.x-form-fieldset .x-field:last-child{border-bottom:0;-webkit-border-bottom-left-radius:0.4em;border-bottom-left-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em}.x-form-fieldset-title{text-shadow:#fff 0 1px 1px;color:#333333;margin:1em 0.7em 0.3em;color:#333333;font-weight:bold;white-space:nowrap}.x-form-fieldset-instructions{text-shadow:#fff 0 1px 1px;color:#333333;color:gray;margin:1em 0.7em 0.3em;font-size:.8em;text-align:center}.x-selectmark-base,.x-field-select .x-component-outer:after{content:"";position:absolute;width:1em;height:1em;top:50%;left:auto;right:0.7em;-webkit-mask-size:1em;-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDpGRTdGMTE3NDA3MjA2ODExOTJDQUMyNUQwRUE4NjdEQiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxQTFBMDFDQ0I5NEYxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMkRCMDIxMkI5NEUxMURGQUU1RjlGMEFERUNDQTVEMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IE1hY2ludG9zaCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjMwRTE0QzVBNDIyMjY4MTFCQ0ZCOTAzOTcwNzcyRkVCIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkZFN0YxMTc0MDcyMDY4MTE5MkNBQzI1RDBFQTg2N0RCIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+HfrH/AAAAeVJREFUeNrs2cFHBGEUAPA3zYqIiIhOnTpFRHSKrp26RqeuEV077R/QqWtE166dOkVERHRa9hQRnZalFcv0Hk/W1Mx+38z3vvlm5j3eZW+/9+abne+9KEkSaFPMQMtCwQpWsIIVrGAFK1jBClawgo2ik/4hiqJGwLKuvfpIc5xSkWqYr5hzU1s/mRNxXTPsJ+ZqluvXlwOmSj3XBDvG3M1rpAmYYoUrFzr4ZNqTawqm2MH8Dhh7ZXJUbcAUx4FinzBnJcAUl4FhP/jIgRSYKvkYCJaO2LbNv08RMMUy5nsA4COTLy0XYIqtil9iF6aflq7AwBWuAvuQ9ZKSBgNX2ieWjtKSzeXBNZgqfe8J+4W5aXtbcg0GrvibB/BhkeuhBJhigzsghT0veh+WAlMcCGHvMOMQwcCdcIntYy6WmXhIg2PuiAvsEHO97IhHGgzckb4D8L6LmZYPMHBnhiWwXVdDPF9g4A4Vwd66nFr6BAN3ygbbw1yoMzjmjplgB5hrrufSvsHAHesZDOD2JAbxVYCBOzfIAZ9JbR6qAgN3cPwP9kZy1VIlGLiTdluCmoOBO/pnS9Bk8DzmS3pL4BMcpZEe1qX0GI/atC4dQYXRMa1MU0IX4gpWsIIVrGAFK1jBCnYUPwIMAPUPAyFL+nRdAAAAAElFTkSuQmCC');margin-top:-0.5em}.x-field-select{position:relative}.x-field-select .x-component-outer:after{background-color:#dddddd;z-index:2}.x-field-select .x-component-outer:before,.x-field-select .x-component-outer:after{pointer-events:none;position:absolute;display:block}.x-field-select .x-component-outer:before{content:"";position:absolute;width:4em;height:auto;top:0;left:auto;right:0;bottom:0;-webkit-border-top-right-radius:0.4em;border-top-right-radius:0.4em;-webkit-border-bottom-right-radius:0.4em;border-bottom-right-radius:0.4em;background:-webkit-gradient(linear, 0% 0%, 100% 0%, from(rgba(255, 255, 255, 0)), color-stop(0.5, white));z-index:1}.x-msgbox{min-width:15em;max-width:20em;padding:0.8em;margin:.5em;-webkit-box-shadow:rgba(0, 0, 0, 0.4) 0 0.1em 0.5em;-webkit-border-radius:0.3em;border-radius:0.3em;border:0.15em solid #1985d0}.x-msgbox .x-icon{margin:0 0.8em 0 0.5em;background:#fff;-webkit-mask-size:100%}.x-msgbox .x-msgbox-info{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-warning{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-question{-webkit-mask-image:url('data:image/png;base64,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')}.x-msgbox .x-msgbox-error{-webkit-mask-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAFGUlEQVRoBe2bzW8VVRxAeS0UMZggaARtGgtNU5pIRCMaEsPChrgh7FhCjHtdEBKNLvwjdOHShSHGmEiMiVFw4cL4EcFoolRSuqBiRDQqCLRS6znDzPP1dub1fbbzLv6S05m57829vzN3Pu+8VhYWFtZ0KyqVygbqHoA74QEYhnmojX4WpuFHuAZz5HSdaVei0mlhJBW7Hx6GJ+AheAwaiS/50rfwGXwNF8nPDdGx6JgwonvJ6hE4CI/DXdBOXGHlz+EEnEb803Yqq65rD7cDFSn4NvwKHh/dwLpt42A7ubpuS7I03Ad74C24DP9AN0Rr67QN27JN2+5rRb5pYRraBC+Bx9ZKiNZKO2+bM/AKbG5WuilhGtgNb4Jn0zCRlV42B3PZ3Yx0w8JUfAQmwcvKSssVtWcu5nSkUemGhKnwKFyE1diFi2SzcnMyt6ONSNcVphJvCl4ATxZZA2WdmqO59tcTLxRmRc/Ez8AvUFbJMC9zNefCM3g9YW8kvocyHbOhYLhsrua8t6iXc4VZYRQ+hJsQVlr2ZXM299E86SXCfNEb/tfhTyi7XFF+5q7DhlB6kTBfqMCzMA1FlfVKuQ66JM8LmXgoPM4XTsIs9IpYUZ466DKeyTr1TJwETztegg7BLhhICnv7jw66HErdEpuqMEvb4Um4O/kkjj+66KRbEokwW2AtS/tgBzgfS+ii077UsbpL30fhBNwLsYVOuum4pg9zz8xj4P7u2FNsoZNuY7q6S3twPwUx9i5aSeim44DC68CxKB/sYw3ddFyn8BBsg5hOVugsCt10HFJ4BGLuXfSS0HFE80HYmBQt/XOdIseJfwfvaDzBlTGy3JRyHNzngTB0HFR4KxSdnS/w2ctwFhxZKHO4t3q1eRV82gtDx60Kb4E7wk/T5d+YTnIPqnjpI73EmnNe6LjFrVJvN3VXya7VeZWUpiyV1ceciyK5Dhd9GGW5W+S2iv+Fg+72eKh3TARfX/XFZfO1h+eg6JLjbec8Z+nSS6c5/k2+/ZAXOs55WboEvqfJu/nYTvlznAHPM3UItMxh5w3BgwVJ6nhJYa+xVyFP2Gv0MYghdLzgVpmCP2IwWsZBxymFz8FlKP1xSo6thm46nlPYrp6EvyDW0E3HqwrPwinwRVSsoZuOs75l83R9Bn4G52MLnXQ7o6s9bMzAR+B+HlvopJuOt4ZpMb/CvF3ulogtdDqVOlbHpZX8DnzQd5QjltBFJ92SyHZpX6p5YB+HH2A++bS3/+igy/HULbGpCqdu7zP9BLxU9XrooItO/wX24SvTnXz6MXgjnj199NrU3HXYucQvLHCZOAzT0GuiWb7mfjjXLbfw1qD886zUiz97MGdzX5vrlldoGbEZ3gAfq7ItV/apuZpz4W8wFx2/oTwrOkh/Am5A2WXN0VwHQ4/a5brCaU+PUMm7UGZpczPHkVq5vPllhWuk3ymptLLmtqxs4pK3FfLKqND3Ni+Ct2rekK/2Lm4O5mJOm/JyzitrqIezFal4PTwNp+EmrJa0bZuDuazP8mtk2pRwViGNDMNr4BPISva2bdmmbQ9n+TQzbUk4a4BGJ8Azo/fh3RS3btuwrYms/Vambf8bD0O4jgM/CgfAXcyfFoT36BS1FIq6634A78FXSLb1YNO2MEkkgbiD9l63x2E/2Ptj0Ky8kmfhJPirWB/tZhD1/rjt6JhwbSbIe3LzBfQ22AV7YAfck+K8MQWOSIjzX8A38BNcQ9Lxto7Gv+RtOqJ9fOwKAAAAAElFTkSuQmCC')}.x-msgbox .x-title{font-size:.9em;line-height:1.4em}.x-msgbox .x-body{background:transparent !important}.x-msgbox .x-toolbar{background:transparent none;-webkit-box-shadow:none}.x-msgbox .x-toolbar.x-docked-top{border-bottom:0;height:1.3em}.x-msgbox .x-toolbar.x-docked-bottom{border-top:0}.x-msgbox .x-field{min-height:2em;background:#fff;-webkit-border-radius:0.2em;border-radius:0.2em}.x-msgbox .x-form-field{min-height:1.5em;padding-right:0 !important;-webkit-appearance:none}.x-msgbox .x-field-input{padding-right:2.2em}.x-msgbox-text{text-align:center;padding:6px 0;line-height:1.4em}.x-msgbox-buttons{padding:0.4em 0;height:auto}.x-msgbox-buttons .x-button{min-width:4.5em}.x-msgbox-buttons .x-button-normal span{opacity:.7}.x-msgbox-dark .x-msgbox-text{color:rgba(190, 224, 247, 0.9);text-shadow:rgba(0, 0, 0, 0.5) 0 -0.08em 0}.x-msgbox-dark .x-msgbox-input{background-image:none;background-color:rgba(190, 224, 247, 0.9);background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, rgba(144,202,242,0.9)), color-stop(10%, rgba(167,213,244,0.9)), color-stop(65%, rgba(190,224,247,0.9)), color-stop(100%, rgba(192,225,247,0.9)));background-image:-webkit-linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));background-image:linear-gradient(top, rgba(144,202,242,0.9),rgba(167,213,244,0.9) 10%,rgba(190,224,247,0.9) 65%,rgba(192,225,247,0.9));border:0.1em solid rgba(25, 133, 208, 0.9)}.x-loading-spinner{font-size:250%;height:1em;width:1em;position:relative;-webkit-transform-origin:0.5em 0.5em}.x-loading-spinner > span,.x-loading-spinner > span:before,.x-loading-spinner > span:after{display:block;position:absolute;width:0.1em;height:0.25em;top:0;-webkit-transform-origin:0.05em 0.5em;-webkit-border-radius:0.05em;border-radius:0.05em;content:" "}.x-loading-spinner > span.x-loading-top{background-color:rgba(170, 170, 170, 0.99)}.x-loading-spinner > span.x-loading-top::after{background-color:rgba(170, 170, 170, 0.9)}.x-loading-spinner > span.x-loading-left::before{background-color:rgba(170, 170, 170, 0.8)}.x-loading-spinner > span.x-loading-left{background-color:rgba(170, 170, 170, 0.7)}.x-loading-spinner > span.x-loading-left::after{background-color:rgba(170, 170, 170, 0.6)}.x-loading-spinner > span.x-loading-bottom::before{background-color:rgba(170, 170, 170, 0.5)}.x-loading-spinner > span.x-loading-bottom{background-color:rgba(170, 170, 170, 0.4)}.x-loading-spinner > span.x-loading-bottom::after{background-color:rgba(170, 170, 170, 0.35)}.x-loading-spinner > span.x-loading-right::before{background-color:rgba(170, 170, 170, 0.3)}.x-loading-spinner > span.x-loading-right{background-color:rgba(170, 170, 170, 0.25)}.x-loading-spinner > span.x-loading-right::after{background-color:rgba(170, 170, 170, 0.2)}.x-loading-spinner > span.x-loading-top::before{background-color:rgba(170, 170, 170, 0.15)}.x-loading-spinner > span{left:50%;margin-left:-0.05em}.x-loading-spinner > span.x-loading-top{-webkit-transform:rotate(0deg);-moz-transform:rotate(0deg)}.x-loading-spinner > span.x-loading-right{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg)}.x-loading-spinner > span.x-loading-bottom{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg)}.x-loading-spinner > span.x-loading-left{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg)}.x-loading-spinner > span::before{-webkit-transform:rotate(30deg);-moz-transform:rotate(30deg)}.x-loading-spinner > span::after{-webkit-transform:rotate(-30deg);-moz-transform:rotate(-30deg)}.x-loading-spinner{-webkit-animation-name:x-loading-spinner-rotate;-webkit-animation-duration:.5s;-webkit-animation-iteration-count:infinite;-webkit-animation-timing-function:linear}@-webkit-keyframes x-loading-spinner-rotate{0%{-webkit-transform:rotate(0deg)}8.32%{-webkit-transform:rotate(0deg)}8.33%{-webkit-transform:rotate(30deg)}16.65%{-webkit-transform:rotate(30deg)}16.66%{-webkit-transform:rotate(60deg)}24.99%{-webkit-transform:rotate(60deg)}25%{-webkit-transform:rotate(90deg)}33.32%{-webkit-transform:rotate(90deg)}33.33%{-webkit-transform:rotate(120deg)}41.65%{-webkit-transform:rotate(120deg)}41.66%{-webkit-transform:rotate(150deg)}49.99%{-webkit-transform:rotate(150deg)}50%{-webkit-transform:rotate(180deg)}58.32%{-webkit-transform:rotate(180deg)}58.33%{-webkit-transform:rotate(210deg)}66.65%{-webkit-transform:rotate(210deg)}66.66%{-webkit-transform:rotate(240deg)}74.99%{-webkit-transform:rotate(240deg)}75%{-webkit-transform:rotate(270deg)}83.32%{-webkit-transform:rotate(270deg)}83.33%{-webkit-transform:rotate(300deg)}91.65%{-webkit-transform:rotate(300deg)}91.66%{-webkit-transform:rotate(330deg)}100%{-webkit-transform:rotate(330deg)}} diff --git a/programs/touchui/sencha-touch.js b/programs/touchui/sencha-touch.js deleted file mode 100644 index 1ae16ad61..000000000 --- a/programs/touchui/sencha-touch.js +++ /dev/null @@ -1,35 +0,0 @@ -/* -This file is part of Sencha Touch 2.0 - -Copyright (c) 2011-2012 Sencha Inc - -Contact: http://www.sencha.com/contact - -GNU General Public License Usage -This file may be used under the terms of the GNU General Public License version 3.0 as -published by the Free Software Foundation and appearing in the file LICENSE included in the -packaging of this file. - -Please review the following information to ensure the GNU General Public License version 3.0 -requirements will be met: http://www.gnu.org/copyleft/gpl.html. - -If you are unsure which license is appropriate for your use, please contact the sales department -at http://www.sencha.com/contact. - -Build date: 2012-06-04 15:34:28 (d81f71da2d56f5f71419dc892fbc85685098c6b7) -*/ -/* - -This file is part of Sencha Touch 2 - -Copyright (c) 2012 Sencha Inc - -Contact: http://www.sencha.com/contact - -Commercial Usage -Licensees holding valid commercial licenses may use this file in accordance with the Commercial Software License Agreement provided with the Software or, alternatively, in accordance with the terms contained in a written agreement between you and Sencha. - -If you are unsure which license is appropriate for your use, please contact the sales department at http://www.sencha.com/contact. - -*/ -(function(){var global=this,objectPrototype=Object.prototype,toString=objectPrototype.toString,enumerables=true,enumerablesTest={toString:1},emptyFn=function(){},i;if(typeof Ext==="undefined"){global.Ext={}}Ext.global=global;for(i in enumerablesTest){enumerables=null}if(enumerables){enumerables=["hasOwnProperty","valueOf","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","constructor"]}Ext.enumerables=enumerables;Ext.apply=function(object,config,defaults){if(defaults){Ext.apply(object,defaults)}if(object&&config&&typeof config==="object"){var i,j,k;for(i in config){object[i]=config[i]}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];if(config.hasOwnProperty(k)){object[k]=config[k]}}}}return object};Ext.buildSettings=Ext.apply({baseCSSPrefix:"x-",scopeResetCSS:false},Ext.buildSettings||{});Ext.apply(Ext,{emptyFn:emptyFn,baseCSSPrefix:Ext.buildSettings.baseCSSPrefix,applyIf:function(object,config){var property;if(object){for(property in config){if(object[property]===undefined){object[property]=config[property]}}}return object},iterate:function(object,fn,scope){if(Ext.isEmpty(object)){return}if(scope===undefined){scope=object}if(Ext.isIterable(object)){Ext.Array.each.call(Ext.Array,object,fn,scope)}else{Ext.Object.each.call(Ext.Object,object,fn,scope)}}});Ext.apply(Ext,{extend:function(){var objectConstructor=objectPrototype.constructor,inlineOverrides=function(o){for(var m in o){if(!o.hasOwnProperty(m)){continue}this[m]=o[m]}};return function(subclass,superclass,overrides){if(Ext.isObject(superclass)){overrides=superclass;superclass=subclass;subclass=overrides.constructor!==objectConstructor?overrides.constructor:function(){superclass.apply(this,arguments)}}var F=function(){},subclassProto,superclassProto=superclass.prototype;F.prototype=superclassProto;subclassProto=subclass.prototype=new F();subclassProto.constructor=subclass;subclass.superclass=superclassProto;if(superclassProto.constructor===objectConstructor){superclassProto.constructor=superclass}subclass.override=function(overrides){Ext.override(subclass,overrides)};subclassProto.override=inlineOverrides;subclassProto.proto=subclassProto;subclass.override(overrides);subclass.extend=function(o){return Ext.extend(subclass,o)};return subclass}}(),override:function(cls,overrides){if(cls.$isClass){return cls.override(overrides)}else{Ext.apply(cls.prototype,overrides)}}});Ext.apply(Ext,{valueFrom:function(value,defaultValue,allowBlank){return Ext.isEmpty(value,allowBlank)?defaultValue:value},typeOf:function(value){if(value===null){return"null"}var type=typeof value;if(type==="undefined"||type==="string"||type==="number"||type==="boolean"){return type}var typeToString=toString.call(value);switch(typeToString){case"[object Array]":return"array";case"[object Date]":return"date";case"[object Boolean]":return"boolean";case"[object Number]":return"number";case"[object RegExp]":return"regexp"}if(type==="function"){return"function"}if(type==="object"){if(value.nodeType!==undefined){if(value.nodeType===3){return(/\S/).test(value.nodeValue)?"textnode":"whitespace"}else{return"element"}}return"object"}},isEmpty:function(value,allowEmptyString){return(value===null)||(value===undefined)||(!allowEmptyString?value==="":false)||(Ext.isArray(value)&&value.length===0)},isArray:("isArray" in Array)?Array.isArray:function(value){return toString.call(value)==="[object Array]"},isDate:function(value){return toString.call(value)==="[object Date]"},isObject:(toString.call(null)==="[object Object]")?function(value){return value!==null&&value!==undefined&&toString.call(value)==="[object Object]"&&value.ownerDocument===undefined}:function(value){return toString.call(value)==="[object Object]"},isSimpleObject:function(value){return value instanceof Object&&value.constructor===Object},isPrimitive:function(value){var type=typeof value;return type==="string"||type==="number"||type==="boolean"},isFunction:(typeof document!=="undefined"&&typeof document.getElementsByTagName("body")==="function")?function(value){return toString.call(value)==="[object Function]"}:function(value){return typeof value==="function"},isNumber:function(value){return typeof value==="number"&&isFinite(value)},isNumeric:function(value){return !isNaN(parseFloat(value))&&isFinite(value)},isString:function(value){return typeof value==="string"},isBoolean:function(value){return typeof value==="boolean"},isElement:function(value){return value?value.nodeType===1:false},isTextNode:function(value){return value?value.nodeName==="#text":false},isDefined:function(value){return typeof value!=="undefined"},isIterable:function(value){return(value&&typeof value!=="string")?value.length!==undefined:false}});Ext.apply(Ext,{clone:function(item){if(item===null||item===undefined){return item}if(item.nodeType&&item.cloneNode){return item.cloneNode(true)}var type=toString.call(item);if(type==="[object Date]"){return new Date(item.getTime())}var i,j,k,clone,key;if(type==="[object Array]"){i=item.length;clone=[];while(i--){clone[i]=Ext.clone(item[i])}}else{if(type==="[object Object]"&&item.constructor===Object){clone={};for(key in item){clone[key]=Ext.clone(item[key])}if(enumerables){for(j=enumerables.length;j--;){k=enumerables[j];clone[k]=item[k]}}}}return clone||item},getUniqueGlobalNamespace:function(){var uniqueGlobalNamespace=this.uniqueGlobalNamespace;if(uniqueGlobalNamespace===undefined){var i=0;do{uniqueGlobalNamespace="ExtBox"+(++i)}while(Ext.global[uniqueGlobalNamespace]!==undefined);Ext.global[uniqueGlobalNamespace]=Ext;this.uniqueGlobalNamespace=uniqueGlobalNamespace}return uniqueGlobalNamespace},functionFactory:function(){var args=Array.prototype.slice.call(arguments),ln=args.length;if(ln>0){args[ln-1]="var Ext=window."+this.getUniqueGlobalNamespace()+";"+args[ln-1]}return Function.prototype.constructor.apply(Function.prototype,args)},globalEval:("execScript" in global)?function(code){global.execScript(code)}:function(code){(function(){eval(code)})()},});Ext.type=Ext.typeOf})();(function(){var a="4.1.0",b;Ext.Version=b=Ext.extend(Object,{constructor:function(d){var c=this.toNumber,f,e;if(d instanceof b){return d}this.version=this.shortVersion=String(d).toLowerCase().replace(/_/g,".").replace(/[\-+]/g,"");e=this.version.search(/([^\d\.])/);if(e!==-1){this.release=this.version.substr(e,d.length);this.shortVersion=this.version.substr(0,e)}this.shortVersion=this.shortVersion.replace(/[^\d]/g,"");f=this.version.split(".");this.major=c(f.shift());this.minor=c(f.shift());this.patch=c(f.shift());this.build=c(f.shift());return this},toNumber:function(c){c=parseInt(c||0,10);if(isNaN(c)){c=0}return c},toString:function(){return this.version},valueOf:function(){return this.version},getMajor:function(){return this.major||0},getMinor:function(){return this.minor||0},getPatch:function(){return this.patch||0},getBuild:function(){return this.build||0},getRelease:function(){return this.release||""},isGreaterThan:function(c){return b.compare(this.version,c)===1},isGreaterThanOrEqual:function(c){return b.compare(this.version,c)>=0},isLessThan:function(c){return b.compare(this.version,c)===-1},isLessThanOrEqual:function(c){return b.compare(this.version,c)<=0},equals:function(c){return b.compare(this.version,c)===0},match:function(c){c=String(c);return this.version.substr(0,c.length)===c},toArray:function(){return[this.getMajor(),this.getMinor(),this.getPatch(),this.getBuild(),this.getRelease()]},getShortVersion:function(){return this.shortVersion},gt:function(){return this.isGreaterThan.apply(this,arguments)},lt:function(){return this.isLessThan.apply(this,arguments)},gtEq:function(){return this.isGreaterThanOrEqual.apply(this,arguments)},ltEq:function(){return this.isLessThanOrEqual.apply(this,arguments)}});Ext.apply(b,{releaseValueMap:{dev:-6,alpha:-5,a:-5,beta:-4,b:-4,rc:-3,"#":-2,p:-1,pl:-1},getComponentValue:function(c){return !c?0:(isNaN(c)?this.releaseValueMap[c]||c:parseInt(c,10))},compare:function(g,f){var d,e,c;g=new b(g).toArray();f=new b(f).toArray();for(c=0;ce){return 1}}}return 0}});Ext.apply(Ext,{versions:{},lastRegisteredVersion:null,setVersion:function(d,c){Ext.versions[d]=new b(c);Ext.lastRegisteredVersion=Ext.versions[d];return this},getVersion:function(c){if(c===undefined){return Ext.lastRegisteredVersion}return Ext.versions[c]},deprecate:function(c,e,f,d){if(b.compare(Ext.getVersion(c),e)<1){f.call(d)}}});Ext.setVersion("webodfcore",a)})();Ext.String={trimRegex:/^[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+|[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000]+$/g,escapeRe:/('|\\)/g,formatRe:/\{(\d+)\}/g,escapeRegexRe:/([-.*+?^${}()|[\]\/\\])/g,htmlEncode:(function(){var d={"&":"&",">":">","<":"<",'"':"""},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+")","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){return d[f]})}})(),htmlDecode:(function(){var d={"&":"&",">":">","<":"<",""":'"'},b=[],c,a;for(c in d){b.push(c)}a=new RegExp("("+b.join("|")+"|&#[0-9]{1,5};)","g");return function(e){return(!e)?e:String(e).replace(a,function(g,f){if(f in d){return d[f]}else{return String.fromCharCode(parseInt(f.substr(2),10))}})}})(),urlAppend:function(b,a){if(!Ext.isEmpty(a)){return b+(b.indexOf("?")===-1?"?":"&")+a}return b},trim:function(a){return a.replace(Ext.String.trimRegex,"")},capitalize:function(a){return a.charAt(0).toUpperCase()+a.substr(1)},ellipsis:function(c,a,d){if(c&&c.length>a){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!==-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.String.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.String.escapeRe,"\\$1")},toggle:function(b,c,a){return b===c?a:c},leftPad:function(b,c,d){var a=String(b);d=d||" ";while(a.lengthH){for(C=e;C--;){F[z+C]=F[H+C]}}}if(J&&G===B){F.length=B;F.push.apply(F,I)}else{F.length=B+J;for(C=0;C-1;y--){if(A.call(z||C[y],C[y],y,C)===false){return y}}}return true},forEach:i?function(z,y,e){return z.forEach(y,e)}:function(B,z,y){var e=0,A=B.length;for(;ee){e=z}}}return e},mean:function(e){return e.length>0?a.sum(e)/e.length:undefined},sum:function(B){var y=0,e,A,z;for(e=0,A=B.length;e=c){f+=c}else{if(b*2<-c){f-=c}}}return Ext.Number.constrain(f,d,g)},toFixed:function(d,b){if(a){b=b||0;var c=Math.pow(10,b);return(Math.round(d*c)/c).toFixed(b)}return d.toFixed(b)},from:function(c,b){if(isFinite(c)){c=parseFloat(c)}return !isNaN(c)?c:b}}})();Ext.num=function(){return Ext.Number.from.apply(this,arguments)};(function(){var a=function(){};var b=Ext.Object={chain:function(d){a.prototype=d;var c=new a();a.prototype=null;return c},toQueryObjects:function(e,j,d){var c=b.toQueryObjects,h=[],f,g;if(Ext.isArray(j)){for(f=0,g=j.length;f0){h=n.split("=");v=decodeURIComponent(h[0]);m=(h[1]!==undefined)?decodeURIComponent(h[1]):"";if(!q){if(t.hasOwnProperty(v)){if(!Ext.isArray(t[v])){t[v]=[t[v]]}t[v].push(m)}else{t[v]=m}}else{g=v.match(/(\[):?([^\]]*)\]/g);s=v.match(/^([^\[]+)/);v=s[0];k=[];if(g===null){t[v]=m;continue}for(o=0,c=g.length;o0){return setTimeout(e,c)}e();return 0},createSequence:function(b,c,a){if(!c){return b}else{return function(){var d=b.apply(this,arguments);c.apply(a||this,arguments);return d}}},createBuffered:function(e,b,d,c){var a;return function(){if(!d){d=this}if(!c){c=Array.prototype.slice.call(arguments)}if(a){clearTimeout(a);a=null}a=setTimeout(function(){e.apply(d,c)},b)}},createThrottled:function(e,b,d){var f,a,c,h,g=function(){e.apply(d||this,c);f=new Date().getTime()};return function(){a=new Date().getTime()-f;c=arguments;clearTimeout(h);if(!f||(a>=b)){g()}else{h=setTimeout(g,b-a)}}},interceptBefore:function(b,a,c){var d=b[a]||Ext.emptyFn;return b[a]=function(){var e=c.apply(this,arguments);d.apply(this,arguments);return e}},interceptAfter:function(b,a,c){var d=b[a]||Ext.emptyFn;return b[a]=function(){d.apply(this,arguments);return c.apply(this,arguments)}}};Ext.defer=Ext.Function.alias(Ext.Function,"defer");Ext.pass=Ext.Function.alias(Ext.Function,"pass");Ext.bind=Ext.Function.alias(Ext.Function,"bind");Ext.JSON=new (function(){var useHasOwn=!!{}.hasOwnProperty,isNative=function(){var useNative=null;return function(){if(useNative===null){useNative=Ext.USE_NATIVE_JSON&&window.JSON&&JSON.toString()=="[object JSON]"}return useNative}}(),pad=function(n){return n<10?"0"+n:n},doDecode=function(json){return eval("("+json+")")},doEncode=function(o){if(!Ext.isDefined(o)||o===null){return"null"}else{if(Ext.isArray(o)){return encodeArray(o)}else{if(Ext.isDate(o)){return Ext.JSON.encodeDate(o)}else{if(Ext.isString(o)){return encodeString(o)}else{if(typeof o=="number"){return isFinite(o)?String(o):"null"}else{if(Ext.isBoolean(o)){return String(o)}else{if(Ext.isObject(o)){return encodeObject(o)}else{if(typeof o==="function"){return"null"}}}}}}}}return"undefined"},m={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\","\x0b":"\\u000b"},charToReplace=/[\\\"\x00-\x1f\x7f-\uffff]/g,encodeString=function(s){return'"'+s.replace(charToReplace,function(a){var c=m[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"'},encodeArray=function(o){var a=["[",""],len=o.length,i;for(i=0;i0){for(d=0;d0){if(l===k){return n[l]}m=n[l];k=k.substring(l.length+1)}if(m.length>0){m+="/"}return m.replace(/\/\.\//g,"/")+k.replace(/\./g,"/")+".js"},getPrefix:function(l){var n=this.config.paths,m,k="";if(n.hasOwnProperty(l)){return l}for(m in n){if(n.hasOwnProperty(m)&&m+"."===l.substring(0,m.length+1)){if(m.length>k.length){k=m}}}return k},require:function(m,l,k,n){if(l){l.call(k)}},syncRequire:function(){},exclude:function(l){var k=this;return{require:function(o,n,m){return k.require(o,n,m,l)},syncRequire:function(o,n,m){return k.syncRequire(o,n,m,l)}}},onReady:function(n,m,o,k){var l;if(o!==false&&Ext.onDocumentReady){l=n;n=function(){Ext.onDocumentReady(l,m,k)}}n.call(m)}};Ext.apply(b,{documentHead:typeof document!="undefined"&&(document.head||document.getElementsByTagName("head")[0]),isLoading:false,queue:[],isClassFileLoaded:{},isFileLoaded:{},readyListeners:[],optionalRequires:[],requiresMap:{},numPendingFiles:0,numLoadedFiles:0,hasFileLoadError:false,classNameToFilePathMap:{},syncModeEnabled:false,scriptElements:{},refreshQueue:function(){var k=this.queue,q=k.length,n,p,l,o,m;if(q===0){this.triggerReady();return}for(n=0;nthis.numLoadedFiles){continue}l=0;do{if(a.isCreated(o[l])){f(o,l,1)}else{l++}}while(l=200&&n<300)||n==304||(n==0&&q.length>0)){Ext.globalEval(q+"\n//@ sourceURL="+l);s.call(w)}else{}u=null}},syncRequire:function(){var k=this.syncModeEnabled;if(!k){this.syncModeEnabled=true}this.require.apply(this,arguments);if(!k){this.syncModeEnabled=false}this.refreshQueue()},require:function(F,t,n,q){var v={},m={},y=this.queue,C=this.classNameToFilePathMap,A=this.isClassFileLoaded,s=[],H=[],E=[],l=[],r,G,x,w,k,p,D,B,z,u,o;if(q){q=h(q);for(B=0,u=q.length;B0){s=a.getNamesByExpression(k);for(z=0,o=s.length;z0){r=function(){var K=[],J,L,I;for(J=0,L=l.length;J0){H=a.getNamesByExpression(w);o=H.length;for(z=0;z0){if(!this.config.enabled){throw new Error("Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing required class"+((E.length>1)?"es":"")+": "+E.join(", "))}}else{r.call(n);return this}G=this.syncModeEnabled;if(!G){y.push({requires:E.slice(),callback:r,scope:n})}u=E.length;for(B=0;B=2){if("1496x2048" in r){e(r["1496x2048"],"(orientation: landscape)")}if("1536x2008" in r){e(r["1536x2008"],"(orientation: portrait)")}}else{if("748x1024" in r){e(r["748x1024"],"(orientation: landscape)")}if("768x1004" in r){e(r["768x1004"],"(orientation: portrait)")}}}else{if(o>=2&&Ext.os.version.gtEq("4.3")){e(r["640x920"])}else{e(r["320x460"])}}},application:function(b){var a=b.name,e,d,c;if(!b){b={}}if(!Ext.Loader.config.paths[a]){Ext.Loader.setPath(a,b.appFolder||"app")}c=Ext.Array.from(b.requires);b.requires=["Ext.app.Application"];e=b.onReady;d=b.scope;b.onReady=function(){b.requires=c;new Ext.app.Application(b);if(e){e.call(d)}};Ext.setup(b)},factoryConfig:function(a,l){var g=Ext.isSimpleObject(a);if(g&&a.xclass){var f=a.xclass;delete a.xclass;Ext.require(f,function(){Ext.factoryConfig(a,function(i){l(Ext.create(f,i))})});return}var d=Ext.isArray(a),m=[],k,j,c,e;if(g||d){if(g){for(k in a){if(a.hasOwnProperty(k)){j=a[k];if(Ext.isSimpleObject(j)||Ext.isArray(j)){m.push(k)}}}}else{for(c=0,e=a.length;c=e){l(a);return}k=m[c];j=a[k];Ext.factoryConfig(j,h)}b();return}l(a)},factory:function(b,e,a,f){var d=Ext.ClassManager,c;if(!b||b.isInstance){if(a&&a!==b){a.destroy()}return b}if(f){if(typeof b=="string"){return d.instantiateByAlias(f+"."+b)}else{if(Ext.isObject(b)&&"type" in b){return d.instantiateByAlias(f+"."+b.type,b)}}}if(b===true){return a||d.instantiate(e)}if("xtype" in b){c=d.instantiateByAlias("widget."+b.xtype,b)}else{if("xclass" in b){c=d.instantiate(b.xclass,b)}}if(c){if(a){a.destroy()}return c}if(a){return a.setConfig(b)}return d.instantiate(e,b)},deprecateClassMember:function(b,c,a,d){return this.deprecateProperty(b.prototype,c,a,d)},deprecateClassMembers:function(b,c){var d=b.prototype,e,a;for(e in c){if(c.hasOwnProperty(e)){a=c[e];this.deprecateProperty(d,e,a)}}},deprecateProperty:function(b,c,a,d){if(!d){d="'"+c+"' is deprecated"}if(a){d+=", please use '"+a+"' instead"}if(a){Ext.Object.defineProperty(b,c,{get:function(){return this[a]},set:function(e){this[a]=e},configurable:true})}},deprecatePropertyValue:function(b,a,d,c){Ext.Object.defineProperty(b,a,{get:function(){return d},configurable:true})},deprecateMethod:function(b,a,d,c){b[a]=function(){if(d){return d.apply(this,arguments)}}},deprecateClassMethod:function(a,b,h,d){if(typeof b!="string"){var g,f;for(g in b){if(b.hasOwnProperty(g)){f=b[g];Ext.deprecateClassMethod(a,g,f)}}return}var c=typeof h=="string",e;if(!d){d="'"+b+"()' is deprecated, please use '"+(c?h:h.name)+"()' instead"}if(c){e=function(){return this[h].apply(this,arguments)}}else{e=function(){return h.apply(this,arguments)}}if(b in a.prototype){Ext.Object.defineProperty(a.prototype,b,{value:null,writable:true,configurable:true})}a.addMember(b,e)},isReady:false,readyListeners:[],triggerReady:function(){var b=Ext.readyListeners,a,c,d;if(!Ext.isReady){Ext.isReady=true;for(a=0,c=b.length;a0){return b+Ext.String.capitalize(a)}return a}},function(){var a=Ext.browser=new this(Ext.global.navigator.userAgent)});Ext.define("Ext.env.OS",{requires:["Ext.Version"],statics:{names:{ios:"iOS",android:"Android",webos:"webOS",blackberry:"BlackBerry",rimTablet:"RIMTablet",mac:"MacOS",win:"Windows",linux:"Linux",bada:"Bada",other:"Other"},prefixes:{ios:"i(?:Pad|Phone|Pod)(?:.*)CPU(?: iPhone)? OS ",android:"(Android |HTC_|Silk/)",blackberry:"BlackBerry(?:.*)Version/",rimTablet:"RIM Tablet OS ",webos:"(?:webOS|hpwOS)/",bada:"Bada/"}},is:Ext.emptyFn,name:null,version:null,setFlag:function(a,b){if(typeof b=="undefined"){b=true}this.is[a]=b;this.is[a.toLowerCase()]=b;return this},constructor:function(m,b){var k=this.statics(),j=k.names,c=k.prefixes,a,h="",d,g,f,l,e;e=this.is=function(i){return this.is[i]===true};for(d in c){if(c.hasOwnProperty(d)){g=c[d];f=m.match(new RegExp("(?:"+g+")([^\\s;]+)"));if(f){a=j[d];if(f[1]&&(f[1]=="HTC_"||f[1]=="Silk/")){h=new Ext.Version("2.3")}else{h=new Ext.Version(f[f.length-1])}break}}}if(!a){a=j[(m.toLowerCase().match(/mac|win|linux/)||["other"])[0]];h=new Ext.Version("")}this.name=a;this.version=h;if(b){this.setFlag(b)}this.setFlag(a);if(h){this.setFlag(a+(h.getMajor()||""));this.setFlag(a+h.getShortVersion())}for(d in j){if(j.hasOwnProperty(d)){l=j[d];if(!e.hasOwnProperty(a)){this.setFlag(l,(a===l))}}}return this}},function(){var a=Ext.global.navigator,e=a.userAgent,b,g,d;Ext.os=b=new this(e,a.platform);g=b.name;var c=window.location.search.match(/deviceType=(Tablet|Phone)/),f=window.deviceType;if(c&&c[1]){d=c[1]}else{if(f==="iPhone"){d="Phone"}else{if(f==="iPad"){d="Tablet"}else{if(!b.is.Android&&!b.is.iOS&&/Windows|Linux|MacOS/.test(g)){d="Desktop"}else{if(b.is.iPad||b.is.Android3||(b.is.Android4&&e.search(/mobile/i)==-1)){d="Tablet"}else{d="Phone"}}}}}b.setFlag(d,true);b.deviceType=d});Ext.define("Ext.env.Feature",{requires:["Ext.env.Browser","Ext.env.OS"],constructor:function(){this.testElements={};this.has=function(a){return !!this.has[a]};return this},getTestElement:function(a,b){if(a===undefined){a="div"}else{if(typeof a!=="string"){return a}}if(b){return document.createElement(a)}if(!this.testElements[a]){this.testElements[a]=document.createElement(a)}return this.testElements[a]},isStyleSupported:function(c,b){var d=this.getTestElement(b).style,a=Ext.String.capitalize(c);if(typeof d[c]!=="undefined"||typeof d[Ext.browser.getStylePrefix(c)+a]!=="undefined"){return true}return false},isEventSupported:function(c,a){if(a===undefined){a=window}var e=this.getTestElement(a),b="on"+c.toLowerCase(),d=(b in e);if(!d){if(e.setAttribute&&e.removeAttribute){e.setAttribute(b,"");d=typeof e[b]==="function";if(typeof e[b]!=="undefined"){e[b]=undefined}e.removeAttribute(b)}}return d},getSupportedPropertyName:function(b,a){var c=Ext.browser.getVendorProperyName(a);if(c in b){return c}else{if(a in b){return a}}return null},registerTest:Ext.Function.flexSetter(function(a,b){this.has[a]=b.call(this);return this})},function(){Ext.feature=new this;var a=Ext.feature.has;Ext.feature.registerTest({Canvas:function(){var b=this.getTestElement("canvas");return !!(b&&b.getContext&&b.getContext("2d"))},Svg:function(){var b=document;return !!(b.createElementNS&&!!b.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect)},Vml:function(){var c=this.getTestElement(),b=false;c.innerHTML="";b=(c.childNodes.length===1);c.innerHTML="";return b},Touch:function(){return this.isEventSupported("touchstart")&&!(Ext.os&&Ext.os.name.match(/Windows|MacOS|Linux/))},Orientation:function(){return("orientation" in window)&&this.isEventSupported("orientationchange")},OrientationChange:function(){return this.isEventSupported("orientationchange")},DeviceMotion:function(){return this.isEventSupported("devicemotion")},Geolocation:function(){return"geolocation" in window.navigator},SqlDatabase:function(){return"openDatabase" in window},WebSockets:function(){return"WebSocket" in window},Range:function(){return !!document.createRange},CreateContextualFragment:function(){var b=!!document.createRange?document.createRange():false;return b&&!!b.createContextualFragment},History:function(){return("history" in window&&"pushState" in window.history)},CssTransforms:function(){return this.isStyleSupported("transform")},Css3dTransforms:function(){return this.has("CssTransforms")&&this.isStyleSupported("perspective")&&!Ext.os.is.Android2},CssAnimations:function(){return this.isStyleSupported("animationName")},CssTransitions:function(){return this.isStyleSupported("transitionProperty")},Audio:function(){return !!this.getTestElement("audio").canPlayType},Video:function(){return !!this.getTestElement("video").canPlayType},ClassList:function(){return"classList" in this.getTestElement()}})});Ext.define("Ext.dom.Query",{select:function(h,b){var g=[],d,f,e,c,a;b=b||document;if(typeof b=="string"){b=document.getElementById(b)}h=h.split(",");for(f=0,c=h.length;f")}else{c.push(">");if((h=d.tpl)){h.applyOut(d.tplData,c)}if((h=d.html)){c.push(h)}if((h=d.cn||d.children)){g.generateMarkup(h,c)}f=g.closeTags;c.push(f[a]||(f[a]=""))}}}return c},generateStyles:function(e,c){var b=c||[],d;for(d in e){if(e.hasOwnProperty(d)){b.push(this.decamelizeName(d),":",e[d],";")}}return c||b.join("")},markup:function(a){if(typeof a=="string"){return a}var b=this.generateMarkup(a,[]);return b.join("")},applyStyles:function(a,b){Ext.fly(a).applyStyles(b)},createContextualFragment:function(c){var f=document.createElement("div"),a=document.createDocumentFragment(),b=0,d,e;f.innerHTML=c;e=f.childNodes;d=e.length;for(;b0){this.id=b=a.id}else{a.id=b=this.mixins.identifiable.getUniqueId.call(this)}this.self.cache[b]=this}return b},setId:function(c){var a=this.id,b=this.self.cache;if(a){delete b[a]}this.dom.id=c;this.id=c;b[c]=this;return this},setHtml:function(a){this.dom.innerHTML=a},getHtml:function(){return this.dom.innerHTML},setText:function(a){this.dom.textContent=a},redraw:function(){var b=this.dom,a=b.style;a.display="none";b.offsetHeight;a.display=""},isPainted:function(){var a=this.dom;return Boolean(a&&a.offsetParent)},set:function(a,b){var e=this.dom,c,d;for(c in a){if(a.hasOwnProperty(c)){d=a[c];if(c=="style"){this.applyStyles(d)}else{if(c=="cls"){e.className=d}else{if(b!==false){if(d===undefined){e.removeAttribute(c)}else{e.setAttribute(c,d)}}else{e[c]=d}}}}}return this},is:function(a){return Ext.DomQuery.is(this.dom,a)},getValue:function(b){var a=this.dom.value;return b?parseInt(a,10):a},getAttribute:function(a,b){var c=this.dom;return c.getAttributeNS(b,a)||c.getAttribute(b+":"+a)||c.getAttribute(a)||c[a]},destroy:function(){this.isDestroyed=true;var a=Ext.Element.cache,b=this.dom;if(b&&b.parentNode&&b.tagName!="BODY"){b.parentNode.removeChild(b)}delete a[this.id];delete this.dom}},function(a){Ext.elements=Ext.cache=a.cache;this.addStatics({Fly:new Ext.Class({extend:a,constructor:function(b){this.dom=b}}),_flyweights:{},fly:function(e,c){var f=null,d=a._flyweights,b;c=c||"_global";e=Ext.getDom(e);if(e){f=d[c]||(d[c]=new a.Fly());f.dom=e;f.isSynchronized=false;b=Ext.cache[e.id];if(b&&b.isElement){b.isSynchronized=false}}return f}});Ext.get=function(b){return a.get.call(a,b)};Ext.fly=function(){return a.fly.apply(a,arguments)};Ext.ClassManager.onCreated(function(){a.mixin("observable",Ext.mixin.Observable)},null,"Ext.mixin.Observable")});Ext.dom.Element.addStatics({numberRe:/\d+$/,unitRe:/\d+(px|em|%|en|ex|pt|in|cm|mm|pc)$/i,camelRe:/(-[a-z])/gi,cssRe:/([a-z0-9-]+)\s*:\s*([^;\s]+(?:\s*[^;\s]+)*);?/gi,opacityRe:/alpha\(opacity=(.*)\)/i,propertyCache:{},defaultUnit:"px",borders:{l:"border-left-width",r:"border-right-width",t:"border-top-width",b:"border-bottom-width"},paddings:{l:"padding-left",r:"padding-right",t:"padding-top",b:"padding-bottom"},margins:{l:"margin-left",r:"margin-right",t:"margin-top",b:"margin-bottom"},addUnits:function(b,a){if(b===""||b=="auto"||b===undefined||b===null){return b||""}if(Ext.isNumber(b)||this.numberRe.test(b)){return b+(a||this.defaultUnit||"px")}else{if(!this.unitRe.test(b)){return b||""}}return b},isAncestor:function(b,d){var a=false;b=Ext.getDom(b);d=Ext.getDom(d);if(b&&d){if(b.contains){return b.contains(d)}else{if(b.compareDocumentPosition){return !!(b.compareDocumentPosition(d)&16)}else{while((d=d.parentNode)){a=d==b||a}}}}return a},parseBox:function(b){if(typeof b!="string"){b=b.toString()}var c=b.split(" "),a=c.length;if(a==1){c[1]=c[2]=c[3]=c[0]}else{if(a==2){c[2]=c[0];c[3]=c[1]}else{if(a==3){c[3]=c[1]}}}return{top:c[0]||0,right:c[1]||0,bottom:c[2]||0,left:c[3]||0}},unitizeBox:function(c,a){var b=this;c=b.parseBox(c);return b.addUnits(c.top,a)+" "+b.addUnits(c.right,a)+" "+b.addUnits(c.bottom,a)+" "+b.addUnits(c.left,a)},camelReplaceFn:function(b,c){return c.charAt(1).toUpperCase()},normalize:function(a){return this.propertyCache[a]||(this.propertyCache[a]=a.replace(this.camelRe,this.camelReplaceFn))},fromPoint:function(a,b){return Ext.get(document.elementFromPoint(a,b))},parseStyles:function(c){var a={},b=this.cssRe,d;if(c){b.lastIndex=0;while((d=b.exec(c))){a[d[1]]=d[2]}}return a}});Ext.dom.Element.addMembers({appendChild:function(a){this.dom.appendChild(Ext.getDom(a));return this},removeChild:function(a){this.dom.removeChild(Ext.getDom(a));return this},append:function(){this.appendChild.apply(this,arguments)},appendTo:function(a){Ext.getDom(a).appendChild(this.dom);return this},insertBefore:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a);return this},insertAfter:function(a){a=Ext.getDom(a);a.parentNode.insertBefore(this.dom,a.nextSibling);return this},insertFirst:function(b){var a=Ext.getDom(b),d=this.dom,c=d.firstChild;if(!c){d.appendChild(a)}else{d.insertBefore(a,c)}return this},insertSibling:function(e,c,d){var f=this,b,a=(c||"before").toLowerCase()=="after",g;if(Ext.isArray(e)){g=f;Ext.each(e,function(h){b=Ext.fly(g,"_internal").insertSibling(h,c,d);if(a){g=b}});return b}e=e||{};if(e.nodeType||e.dom){b=f.dom.parentNode.insertBefore(Ext.getDom(e),a?f.dom.nextSibling:f.dom);if(!d){b=Ext.get(b)}}else{if(a&&!f.dom.nextSibling){b=Ext.webodfcore.DomHelper.append(f.dom.parentNode,e,!d)}else{b=Ext.webodfcore.DomHelper[a?"insertAfter":"insertBefore"](f.dom,e,!d)}}return b},replace:function(a){a=Ext.get(a);this.insertBefore(a);a.remove();return this},replaceWith:function(a){var b=this;if(a.nodeType||a.dom||typeof a=="string"){a=Ext.get(a);b.dom.parentNode.insertBefore(a,b.dom)}else{a=Ext.webodfcore.DomHelper.insertBefore(b.dom,a)}delete Ext.cache[b.id];Ext.removeNode(b.dom);b.id=Ext.id(b.dom=a);Ext.dom.Element.addToCache(b.isFlyweight?new Ext.dom.Element(b.dom):b);return b},createChild:function(b,a,c){b=b||{tag:"div"};if(a){return Ext.webodfcore.DomHelper.insertBefore(a,b,c!==true)}else{return Ext.webodfcore.DomHelper[!this.dom.firstChild?"insertFirst":"append"](this.dom,b,c!==true)}},wrap:function(b,c){var e=this.dom,f=this.self.create(b,c),d=(c)?f:f.dom,a=e.parentNode;if(a){a.insertBefore(d,e)}d.appendChild(e);return f},wrapAllChildren:function(a){var d=this.dom,b=d.childNodes,e=this.self.create(a),c=e.dom;while(b.length>0){c.appendChild(d.firstChild)}d.appendChild(c);return e},unwrapAllChildren:function(){var c=this.dom,b=c.childNodes,a=c.parentNode;if(a){while(b.length>0){a.insertBefore(c,c.firstChild)}this.destroy()}},unwrap:function(){var c=this.dom,a=c.parentNode,b;if(a){b=a.parentNode;b.insertBefore(c,a);b.removeChild(a)}else{b=document.createDocumentFragment();b.appendChild(c)}return this},insertHtml:function(b,c,a){var d=Ext.webodfcore.DomHelper.insertHtml(b,this.dom,c);return a?Ext.get(d):d}});Ext.dom.Element.override({getX:function(a){return this.getXY(a)[0]},getY:function(a){return this.getXY(a)[1]},getXY:function(){var a=window.webkitConvertPointFromNodeToPage;if(a){return function(){var b=a(this.dom,new WebKitPoint(0,0));return[b.x,b.y]}}else{return function(){var c=this.dom.getBoundingClientRect(),b=Math.round;return[b(c.left+window.pageXOffset),b(c.top+window.pageYOffset)]}}}(),getOffsetsTo:function(a){var c=this.getXY(),b=Ext.fly(a,"_internal").getXY();return[c[0]-b[0],c[1]-b[1]]},setX:function(a){return this.setXY([a,this.getY()])},setY:function(a){return this.setXY([this.getX(),a])},setXY:function(d){var b=this;if(arguments.length>1){d=[d,arguments[1]]}var c=b.translatePoints(d),a=b.dom.style;for(d in c){if(!c.hasOwnProperty(d)){continue}if(!isNaN(c[d])){a[d]=c[d]+"px"}}return b},getLeft:function(){return parseInt(this.getStyle("left"),10)||0},getRight:function(){return parseInt(this.getStyle("right"),10)||0},getTop:function(){return parseInt(this.getStyle("top"),10)||0},getBottom:function(){return parseInt(this.getStyle("bottom"),10)||0},translatePoints:function(a,g){g=isNaN(a[1])?g:a[1];a=isNaN(a[0])?a:a[0];var d=this,e=d.isStyle("position","relative"),f=d.getXY(),b=parseInt(d.getStyle("left"),10),c=parseInt(d.getStyle("top"),10);b=!isNaN(b)?b:(e?0:d.dom.offsetLeft);c=!isNaN(c)?c:(e?0:d.dom.offsetTop);return{left:(a-f[0]+b),top:(g-f[1]+c)}},setBox:function(d){var c=this,b=d.width,a=d.height,f=d.top,e=d.left;if(e!==undefined){c.setLeft(e)}if(f!==undefined){c.setTop(f)}if(b!==undefined){c.setWidth(b)}if(a!==undefined){c.setHeight(a)}return this},getBox:function(g,j){var h=this,e=h.dom,c=e.offsetWidth,k=e.offsetHeight,n,f,d,a,m,i;if(!j){n=h.getXY()}else{if(g){n=[0,0]}else{n=[parseInt(h.getStyle("left"),10)||0,parseInt(h.getStyle("top"),10)||0]}}if(!g){f={x:n[0],y:n[1],0:n[0],1:n[1],width:c,height:k}}else{d=h.getBorderWidth.call(h,"l")+h.getPadding.call(h,"l");a=h.getBorderWidth.call(h,"r")+h.getPadding.call(h,"r");m=h.getBorderWidth.call(h,"t")+h.getPadding.call(h,"t");i=h.getBorderWidth.call(h,"b")+h.getPadding.call(h,"b");f={x:n[0]+d,y:n[1]+m,0:n[0]+d,1:n[1]+m,width:c-(d+a),height:k-(m+i)}}f.left=f.x;f.top=f.y;f.right=f.x+f.width;f.bottom=f.y+f.height;return f},getPageBox:function(e){var g=this,c=g.dom,j=c.offsetWidth,f=c.offsetHeight,m=g.getXY(),k=m[1],a=m[0]+j,i=m[1]+f,d=m[0];if(!c){return new Ext.util.Region()}if(e){return new Ext.util.Region(k,a,i,d)}else{return{left:d,top:k,width:j,height:f,right:a,bottom:i}}}});Ext.dom.Element.addMembers({WIDTH:"width",HEIGHT:"height",MIN_WIDTH:"min-width",MIN_HEIGHT:"min-height",MAX_WIDTH:"max-width",MAX_HEIGHT:"max-height",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left",VISIBILITY:1,DISPLAY:2,OFFSETS:3,SEPARATOR:"-",trimRe:/^\s+|\s+$/g,wordsRe:/\w/g,spacesRe:/\s+/,styleSplitRe:/\s*(?::|;)\s*/,transparentRe:/^(?:transparent|(?:rgba[(](?:\s*\d+\s*[,]){3}\s*0\s*[)]))$/i,classNameSplitRegex:/[\s]+/,borders:{t:"border-top-width",r:"border-right-width",b:"border-bottom-width",l:"border-left-width"},paddings:{t:"padding-top",r:"padding-right",b:"padding-bottom",l:"padding-left"},margins:{t:"margin-top",r:"margin-right",b:"margin-bottom",l:"margin-left"},defaultUnit:"px",isSynchronized:false,synchronize:function(){var g=this.dom,a={},d=g.className,f,c,e,b;if(d.length>0){f=g.className.split(this.classNameSplitRegex);for(c=0,e=f.length;c0?a:0},getWidth:function(a){var c=this.dom,b=a?(c.clientWidth-this.getPadding("lr")):c.offsetWidth;return b>0?b:0},getBorderWidth:function(a){return this.addStyles(a,this.borders)},getPadding:function(a){return this.addStyles(a,this.paddings)},applyStyles:function(d){if(d){var e=this.dom,c,b,a;if(typeof d=="function"){d=d.call()}c=typeof d;if(c=="string"){d=Ext.util.Format.trim(d).split(this.styleSplitRe);for(b=0,a=d.length;b "+a,c.dom);return b?d:Ext.get(d)},parent:function(a,b){return this.matchNode("parentNode","parentNode",a,b)},next:function(a,b){return this.matchNode("nextSibling","nextSibling",a,b)},prev:function(a,b){return this.matchNode("previousSibling","previousSibling",a,b)},first:function(a,b){return this.matchNode("nextSibling","firstChild",a,b)},last:function(a,b){return this.matchNode("previousSibling","lastChild",a,b)},matchNode:function(b,e,a,c){if(!this.dom){return null}var d=this.dom[e];while(d){if(d.nodeType==1&&(!a||Ext.DomQuery.is(d,a))){return !c?Ext.get(d):d}d=d[b]}return null},isAncestor:function(a){return this.self.isAncestor.call(this.self,this.dom,a)}});Ext.define("Ext.dom.CompositeElementLite",{alternateClassName:["Ext.CompositeElementLite","Ext.CompositeElement"],requires:["Ext.dom.Element"],statics:{importElementMethods:function(){}},constructor:function(b,a){this.elements=[];this.add(b,a);this.el=new Ext.dom.Element.Fly()},isComposite:true,getElement:function(a){return this.el.attach(a).synchronize()},transformElement:function(a){return Ext.getDom(a)},getCount:function(){return this.elements.length},add:function(c,a){var e=this.elements,b,d;if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}else{if(c.isComposite){c=c.elements}else{if(!Ext.isIterable(c)){c=[c]}}}for(b=0,d=c.length;b-1){c=Ext.getDom(c);if(a){f=this.elements[b];f.parentNode.insertBefore(c,f);Ext.removeNode(f)}Ext.Array.splice(this.elements,b,1,c)}return this},clear:function(){this.elements=[]},addElements:function(c,a){if(!c){return this}if(typeof c=="string"){c=Ext.dom.Element.selectorFunction(c,a)}var b=this.elements;Ext.each(c,function(d){b.push(Ext.get(d))});return this},first:function(){return this.item(0)},last:function(){return this.item(this.getCount()-1)},contains:function(a){return this.indexOf(a)!=-1},removeElement:function(c,e){var b=this,d=this.elements,a;Ext.each(c,function(f){if((a=(d[f]||d[f=b.indexOf(f)]))){if(e){if(a.dom){a.remove()}else{Ext.removeNode(a)}}Ext.Array.erase(d,f,1)}});return this}},function(){var a=Ext.dom.Element,d=a.prototype,c=this.prototype,b;for(b in d){if(typeof d[b]=="function"){(function(e){c[e]=c[e]||function(){return this.invoke(e,arguments)}}).call(c,b)}}c.on=c.addListener;if(Ext.DomQuery){a.selectorFunction=Ext.DomQuery.select}a.select=function(e,f){var g;if(typeof e=="string"){g=a.selectorFunction(e,f)}else{if(e.length!==undefined){g=e}else{}}return new Ext.CompositeElementLite(g)};Ext.select=function(){return a.select.apply(a,arguments)}});Ext.define("Ext.ComponentManager",{alternateClassName:"Ext.ComponentMgr",singleton:true,constructor:function(){var a={};this.all={map:a,getArray:function(){var b=[],c;for(c in a){b.push(a[c])}return b}};this.map=a},register:function(a){var b=a.getId();this.map[a.getId()]=a},unregister:function(a){delete this.map[a.getId()]},isRegistered:function(a){return this.map[a]!==undefined},get:function(a){return this.map[a]},create:function(a,c){if(a.isComponent){return a}else{if(Ext.isString(a)){return Ext.createByAlias("widget."+a)}else{var b=a.xtype||c;return Ext.createByAlias("widget."+b,a)}}},registerType:Ext.emptyFn});Ext.define("Ext.ComponentQuery",{singleton:true,uses:["Ext.ComponentManager"]},function(){var g=this,j=["var r = [],","i = 0,","it = items,","l = it.length,","c;","for (; i < l; i++) {","c = it[i];","if (c.{0}) {","r.push(c);","}","}","return r;"].join(""),e=function(o,n){return n.method.apply(this,[o].concat(n.args))},a=function(p,t){var n=[],q=0,s=p.length,r,o=t!==">";for(;q\^])\s?|\s|$)/,c=/^(#)?([\w\-]+|\*)(?:\((true|false)\))?/,b=[{re:/^\.([\w\-]+)(?:\((true|false)\))?/,method:l},{re:/^(?:[\[](?:@)?([\w\-]+)\s?(?:(=|.=)\s?['"]?(.*?)["']?)?[\]])/,method:m},{re:/^#([\w\-]+)/,method:d},{re:/^\:([\w\-]+)(?:\(((?:\{[^\}]+\})|(?:(?!\{)[^\s>\/]*?(?!\})))\))?/,method:k},{re:/^(?:\{([^\}]+)\})/,method:j}];g.Query=Ext.extend(Object,{constructor:function(n){n=n||{};Ext.apply(this,n)},execute:function(o){var q=this.operations,r=0,s=q.length,p,n;if(!o){n=Ext.ComponentManager.all.getArray()}else{if(Ext.isArray(o)){n=o}}for(;r1){for(q=0,r=s.length;q1){r=q.length;for(p=0;p]*)\>)|(?:<\/tpl>)/g,actionsRe:/\s*(elif|elseif|if|for|exec|switch|case|eval)\s*\=\s*(?:(?:["]([^"]*)["])|(?:[']([^']*)[']))\s*/g,defaultRe:/^\s*default\s*$/,elseRe:/^\s*else\s*$/});Ext.define("Ext.app.Action",{config:{scope:null,application:null,controller:null,action:null,args:[],url:undefined,data:{},title:null,beforeFilters:[],currentFilterIndex:-1},constructor:function(a){this.initConfig(a);this.getUrl()},execute:function(){this.resume()},resume:function(){var b=this.getCurrentFilterIndex()+1,c=this.getBeforeFilters(),a=this.getController(),d=c[b];if(d){this.setCurrentFilterIndex(b);d.call(a,this)}else{a[this.getAction()].apply(a,this.getArgs())}},applyUrl:function(a){if(a===null||a===undefined){a=this.urlEncode()}return a},applyController:function(a){var c=this.getApplication(),b=c.getCurrentProfile();if(Ext.isString(a)){a=c.getController(a,b?b.getNamespace():null)}return a},urlEncode:function(){var a=this.getController(),b;if(a instanceof Ext.app.Controller){b=a.$className.split(".");a=b[b.length-1]}return a+"/"+this.getAction()}});Ext.define("Ext.app.Route",{config:{conditions:{},url:null,controller:null,action:null,initialized:false},constructor:function(a){this.initConfig(a)},recognize:function(b){if(!this.getInitialized()){this.initialize()}if(this.recognizes(b)){var c=this.matchesFor(b),a=b.match(this.matcherRegex);a.shift();return Ext.applyIf(c,{controller:this.getController(),action:this.getAction(),historyUrl:b,args:a})}},initialize:function(){this.paramMatchingRegex=new RegExp(/:([0-9A-Za-z\_]*)/g);this.paramsInMatchString=this.getUrl().match(this.paramMatchingRegex)||[];this.matcherRegex=this.createMatcherRegex(this.getUrl());this.setInitialized(true)},recognizes:function(a){return this.matcherRegex.test(a)},matchesFor:function(b){var f={},e=this.paramsInMatchString,a=b.match(this.matcherRegex),d=e.length,c;a.shift();for(c=0;c0){f.timeout=setTimeout(Ext.bind(i.handleTimeout,i,[f]),l)}i.setupErrorHandling(f);i[k]=Ext.bind(i.handleResponse,i,[f],true);i.loadScript(f);return f},abort:function(b){var c=this.statics().requests,a;if(b){if(!b.id){b=c[b]}this.abort(b)}else{for(a in c){if(c.hasOwnProperty(a)){this.abort(c[a])}}}},setupErrorHandling:function(a){a.script.onerror=Ext.bind(this.handleError,this,[a])},handleAbort:function(a){a.errorType="abort";this.handleResponse(null,a)},handleError:function(a){a.errorType="error";this.handleResponse(null,a)},cleanupErrorHandling:function(a){a.script.onerror=null},handleTimeout:function(a){a.errorType="timeout";this.handleResponse(null,a)},handleResponse:function(a,b){var c=true;if(b.timeout){clearTimeout(b.timeout)}delete this[b.callbackName];delete this.statics()[b.id];this.cleanupErrorHandling(b);Ext.fly(b.script).destroy();if(b.errorType){c=false;Ext.callback(b.failure,b.scope,[b.errorType,b])}else{Ext.callback(b.success,b.scope,[a,b])}Ext.callback(b.callback,b.scope,[c,a,b.errorType,b])},createScript:function(c,d,b){var a=document.createElement("script");a.setAttribute("src",Ext.urlAppend(c,Ext.Object.toQueryString(d)));a.setAttribute("async",true);a.setAttribute("type","text/javascript");return a},loadScript:function(a){Ext.getHead().appendChild(a.script)}});Ext.define("Ext.data.Operation",{config:{synchronous:true,action:null,filters:null,sorters:null,grouper:null,start:null,limit:null,batch:null,callback:null,scope:null,resultSet:null,records:null,request:null,response:null,withCredentials:null,params:null,url:null,page:null,node:null,model:undefined,addRecords:false},started:false,running:false,complete:false,success:undefined,exception:false,error:undefined,constructor:function(a){this.initConfig(a)},applyModel:function(a){if(typeof a=="string"){a=Ext.data.ModelManager.getModel(a);if(!a){Ext.Logger.error("Model with name "+arguments[0]+" doesnt exist.")}}if(a&&!a.prototype.isModel&&Ext.isObject(a)){a=Ext.data.ModelManager.registerType(a.storeId||a.id||Ext.id(),a)}return a},getRecords:function(){var a=this.getResultSet();return this._records||(a?a.getRecords():[])},setStarted:function(){this.started=true;this.running=true},setCompleted:function(){this.complete=true;this.running=false},setSuccessful:function(){this.success=true},setException:function(a){this.exception=true;this.success=false;this.running=false;this.error=a},hasException:function(){return this.exception===true},getError:function(){return this.error},isStarted:function(){return this.started===true},isRunning:function(){return this.running===true},isComplete:function(){return this.complete===true},wasSuccessful:function(){return this.isComplete()&&this.success===true},allowWrite:function(){return this.getAction()!="read"},process:function(d,b,c,a){if(b.getSuccess()!==false){this.setResponse(a);this.setResultSet(b);this.setCompleted();this.setSuccessful()}else{return false}return this["process"+Ext.String.capitalize(d)].call(this,b,c,a)},processRead:function(d){var b=d.getRecords(),g=[],f=this.getModel(),e=b.length,c,a;for(c=0;c]+>/gi,none:function(a){return a},asText:function(a){return String(a).replace(this.stripTagsRE,"")},asUCText:function(a){return String(a).toUpperCase().replace(this.stripTagsRE,"")},asUCString:function(a){return String(a).toUpperCase()},asDate:function(a){if(!a){return 0}if(Ext.isDate(a)){return a.getTime()}return Date.parse(String(a))},asFloat:function(a){a=parseFloat(String(a).replace(/,/g,""));return isNaN(a)?0:a},asInt:function(a){a=parseInt(String(a).replace(/,/g,""),10);return isNaN(a)?0:a}});Ext.define("Ext.data.Types",{singleton:true,requires:["Ext.data.SortTypes"],stripRe:/[\$,%]/g,dashesRe:/-/g,iso8601TestRe:/\d\dT\d\d/,iso8601SplitRe:/[- :T\.Z\+]/},function(){var b=this,a=Ext.data.SortTypes;Ext.apply(b,{AUTO:{convert:function(c){return c},sortType:a.none,type:"auto"},STRING:{convert:function(c){return(c===undefined||c===null)?(this.getAllowNull()?null:""):String(c)},sortType:a.asUCString,type:"string"},INT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?parseInt(c,10):parseInt(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"int"},FLOAT:{convert:function(c){return(c!==undefined&&c!==null&&c!=="")?((typeof c==="number")?c:parseFloat(String(c).replace(b.stripRe,""),10)):(this.getAllowNull()?null:0)},sortType:a.none,type:"float"},BOOL:{convert:function(c){if((c===undefined||c===null||c==="")&&this.getAllowNull()){return null}return c!=="false"&&!!c},sortType:a.none,type:"bool"},DATE:{convert:function(e){var c=this.getDateFormat(),d;if(!e){return null}if(Ext.isDate(e)){return e}if(c){if(c=="timestamp"){return new Date(e*1000)}if(c=="time"){return new Date(parseInt(e,10))}return Ext.Date.parse(e,c)}d=new Date(Date.parse(e));if(isNaN(d)){if(b.iso8601TestRe.test(e)){d=e.split(b.iso8601SplitRe);d=new Date(d[0],d[1]-1,d[2],d[3],d[4],d[5])}if(isNaN(d)){d=new Date(Date.parse(e.replace(this.dashesRe,"/")))}}return isNaN(d)?null:d},sortType:a.asDate,type:"date"}});Ext.apply(b,{BOOLEAN:this.BOOL,INTEGER:this.INT,NUMBER:this.FLOAT})});Ext.define("Ext.data.Validations",{alternateClassName:"Ext.data.validations",singleton:true,config:{presenceMessage:"must be present",lengthMessage:"is the wrong length",formatMessage:"is the wrong format",inclusionMessage:"is not included in the list of acceptable values",exclusionMessage:"is not an acceptable value",emailMessage:"is not a valid email address"},constructor:function(a){this.initConfig(a)},getMessage:function(a){var b=this["get"+a[0].toUpperCase()+a.slice(1)+"Message"];if(b){return b.call(this)}return""},emailRe:/^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/,presence:function(a,b){if(arguments.length===1){b=a}return !!b||b===0},length:function(b,e){if(e===undefined||e===null){return false}var d=e.length,c=b.min,a=b.max;if((c&&da)){return false}else{return true}},email:function(b,a){return Ext.data.validations.emailRe.test(a)},format:function(a,b){if(b===undefined||b===null){b=""}return !!(a.matcher&&a.matcher.test(b))},inclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)!=-1},exclusion:function(a,b){return a.list&&Ext.Array.indexOf(a.list,b)==-1}});Ext.define("Ext.data.identifier.Simple",{alias:"data.identifier.simple",statics:{AUTO_ID:1},config:{prefix:"ext-record-"},constructor:function(a){this.initConfig(a)},generate:function(a){return this._prefix+this.self.AUTO_ID++}});Ext.define("Ext.data.identifier.Uuid",{extend:"Ext.data.identifier.Simple",alias:"data.identifier.uuid",isUnique:true,config:{id:undefined,salt:null,timestamp:null,version:4},applyId:function(a){if(a===undefined){return Ext.data.identifier.Uuid.Global}return a},constructor:function(){var a=this;a.callParent(arguments);a.parts=[];a.init()},reconfigure:function(a){this.setConfig(a);this.init()},generate:function(){var c=this,e=c.parts,a=c.getVersion(),b=c.getSalt(),d=c.getTimestamp();e[0]=c.toHex(d.lo,8);e[1]=c.toHex(d.hi&65535,4);e[2]=c.toHex(((d.hi>>>16)&4095)|(a<<12),4);e[3]=c.toHex(128|((c.clockSeq>>>8)&63),2)+c.toHex(c.clockSeq&255,2);e[4]=c.toHex(b.hi,4)+c.toHex(b.lo,8);if(a==4){c.init()}else{++d.lo;if(d.lo>=c.twoPow32){d.lo=0;++d.hi}}return e.join("-").toLowerCase()},init:function(){var b=this,a=b.getSalt(),c=b.getTimestamp();if(b.getVersion()==4){b.clockSeq=b.rand(0,b.twoPow14-1);if(!a){a={};b.setSalt(a)}if(!c){c={};b.setTimestamp(c)}a.lo=b.rand(0,b.twoPow32-1);a.hi=b.rand(0,b.twoPow16-1);c.lo=b.rand(0,b.twoPow32-1);c.hi=b.rand(0,b.twoPow28-1)}else{b.setSalt(b.split(b.getSalt()));b.setTimestamp(b.split(b.getTimestamp()));b.getSalt().hi|=256}},twoPow14:Math.pow(2,14),twoPow16:Math.pow(2,16),twoPow28:Math.pow(2,28),twoPow32:Math.pow(2,32),toHex:function(c,b){var a=c.toString(16);if(a.length>b){a=a.substring(a.length-b)}else{if(a.length")}for(;c");for(j in k){if(k.hasOwnProperty(j)){d.push("<",j,">",k[j],"")}}d.push("")}if(h){d.push("")}a.setXmlData(d.join(""));return a}});Ext.define("Ext.direct.RemotingMethod",{config:{name:null,params:null,formHandler:null,len:null,ordered:true},constructor:function(a){this.initConfig(a)},applyParams:function(f){if(Ext.isNumber(f)){this.setLen(f)}else{if(Ext.isArray(f)){this.setOrdered(false);var d=f.length,b=[],c,e,a;for(c=0;c0){if(a){for(c=0,d=a.length;c0){k.apply(m,l)}if(a){k.call(m,e)}if(c.length>0){k.apply(m,c)}if(b){k.call(m,e)}if(o.length>0){k.apply(m,o)}}else{for(f=0;f0){k.apply(m,l)}}if(a){k.call(m,e)}for(f=0;f0){k.apply(m,c)}}if(b){k.call(m,e)}for(f=0;f0){k.apply(m,o)}}}if(m.length===0){return this}if(!h){h=[]}d.length=0;d.push.apply(d,h);d.push(null,this);this.doFire();return this},doFire:function(){var k=this.firingListeners,c=this.firingArguments,g=c.length-2,d,f,b,o,h,n,a,j,l,e,m;this.isPausing=false;this.isPaused=false;this.isStopped=false;this.isFiring=true;for(d=0,f=k.length;d0){this.isPaused=false;this.doFire()}if(a){a.resume()}return this},isInterrupted:function(){return this.isStopped||this.isPaused},stop:function(){var a=this.connectingController;this.isStopped=true;if(a){this.connectingController=null;a.stop()}this.isFiring=false;this.listenerStacks=null;return this},pause:function(){var a=this.connectingController;this.isPausing=true;if(a){a.pause()}return this}});Ext.define("Ext.event.Event",{alternateClassName:"Ext.EventObject",isStopped:false,set:function(a,b){if(arguments.length===1&&typeof a!="string"){var c=a;for(a in c){if(c.hasOwnProperty(a)){this[a]=c[a]}}}else{this[a]=c[a]}},stopEvent:function(){return this.stopPropagation()},stopPropagation:function(){this.isStopped=true;return this}});Ext.define("Ext.event.ListenerStack",{currentOrder:"current",length:0,constructor:function(){this.listeners={before:[],current:[],after:[]};this.lateBindingMap={};return this},add:function(h,j,k,e){var a=this.lateBindingMap,g=this.getAll(e),f=g.length,b,d,c;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();b=a[c];if(b){if(b[h]){return false}else{b[h]=true}}else{a[c]=b={};b[h]=true}}else{if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){d.options=k;return false}}}}d=this.create(h,j,k,e);if(k&&k.prepend){delete k.prepend;g.unshift(d)}else{g.push(d)}this.length++;return true},getAt:function(b,a){return this.getAll(a)[b]},getAll:function(a){if(!a){a=this.currentOrder}return this.listeners[a]},count:function(a){return this.getAll(a).length},create:function(d,c,b,a){return{stack:this,fn:d,firingFn:false,boundFn:false,isLateBinding:typeof d=="string",scope:c,options:b||{},order:a}},remove:function(h,j,e){var g=this.getAll(e),f=g.length,b=false,a=this.lateBindingMap,d,c;if(f>0){while(f--){d=g[f];if(d.fn===h&&d.scope===j){g.splice(f,1);b=true;this.length--;if(typeof h=="string"&&j.isIdentifiable){c=j.getId();if(a[c]&&a[c][h]){delete a[c][h]}}break}}}return b}});Ext.define("Ext.event.publisher.Publisher",{targetType:"",idSelectorRegex:/^#([\w\-]+)$/i,constructor:function(){var b=this.handledEvents,a,c,e,d;a=this.handledEventsMap={};for(c=0,e=b.length;cb){this.isEnded=true;return this.getEndValue()}else{return this.getStartValue()+((a/b)*this.distance)}}});Ext.define("Ext.fx.easing.Momentum",{extend:"Ext.fx.easing.Abstract",config:{acceleration:30,friction:0,startVelocity:0},alpha:0,updateFriction:function(b){var a=Math.log(1-(b/10));this.theta=a;this.alpha=a/this.getAcceleration()},updateStartVelocity:function(a){this.velocity=a*this.getAcceleration()},updateAcceleration:function(a){this.velocity=this.getStartVelocity()*a;this.alpha=this.theta/a},getValue:function(){return this.getStartValue()-this.velocity*(1-this.getFrictionFactor())/this.theta},getFrictionFactor:function(){var a=Ext.Date.now()-this.getStartTime();return Math.exp(a*this.alpha)},getVelocity:function(){return this.getFrictionFactor()*this.velocity}});Ext.define("Ext.mixin.Mixin",{onClassExtended:function(b,e){var a=e.mixinConfig,d,f,c;if(a){d=b.superclass.mixinConfig;if(d){a=e.mixinConfig=Ext.merge({},d,a)}e.mixinId=a.id;f=a.beforeHooks;c=a.hooks||a.afterHooks;if(f||c){Ext.Function.interceptBefore(e,"onClassMixedIn",function(h){var g=this.prototype;if(f){Ext.Object.each(f,function(j,i){h.override(i,function(){if(g[j].apply(this,arguments)!==false){return this.callOverridden(arguments)}})})}if(c){Ext.Object.each(c,function(j,i){h.override(i,function(){var k=this.callOverridden(arguments);g[j].apply(this,arguments);return k})})}})}}}});Ext.define("Ext.mixin.Selectable",{extend:"Ext.mixin.Mixin",mixinConfig:{id:"selectable",hooks:{updateStore:"updateStore"}},config:{disableSelection:null,mode:"SINGLE",allowDeselect:false,lastSelected:null,lastFocused:null,deselectOnContainerClick:true},modes:{SINGLE:true,SIMPLE:true,MULTI:true},selectableEventHooks:{addrecords:"onSelectionStoreAdd",removerecords:"onSelectionStoreRemove",updaterecord:"onSelectionStoreUpdate",load:"refreshSelection",refresh:"refreshSelection"},constructor:function(){this.selected=new Ext.util.MixedCollection();this.callParent(arguments)},applyMode:function(a){a=a?a.toUpperCase():"SINGLE";return this.modes[a]?a:"SINGLE"},updateStore:function(a,c){var b=this,d=Ext.apply({},b.selectableEventHooks,{scope:b});if(c&&Ext.isObject(c)&&c.isStore){if(c.autoDestroy){c.destroy()}else{c.un(d)}}if(a){a.on(d);b.refreshSelection()}},selectAll:function(a){var e=this,c=e.getStore().getRange(),d=c.length,b=0;for(;bg){e=g;g=c;c=e}for(d=c;d<=g;d++){a.push(b.getAt(d))}this.doMultiSelect(a,h)},select:function(c,e,b){var d=this,a;if(d.getDisableSelection()){return}if(typeof c==="number"){c=[d.getStore().getAt(c)]}if(!c){return}if(d.getMode()=="SINGLE"&&c){a=c.length?c[0]:c;d.doSingleSelect(a,b)}else{d.doMultiSelect(c,e,b)}},doSingleSelect:function(a,b){var d=this,c=d.selected;if(d.getDisableSelection()){return}if(d.isSelected(a)){return}if(c.getCount()>0){d.deselect(d.getLastSelected(),b)}c.add(a);d.setLastSelected(a);d.onItemSelect(a,b);d.setLastFocused(a);if(!b){d.fireSelectionChange([a])}},doMultiSelect:function(a,j,h){if(a===null||this.getDisableSelection()){return}a=!Ext.isArray(a)?[a]:a;var f=this,b=f.selected,e=a.length,g=false,c=0,d;if(!j&&b.getCount()>0){g=true;f.deselect(f.getSelection(),true)}for(;c0},refreshSelection:function(){var b=this,a=b.getSelection();b.deselectAll(true);if(a.length){b.select(a,false,true)}},onSelectionStoreRemove:function(c,b){var g=this,e=g.selected,f=b.length,a,d;if(g.getDisableSelection()){return}for(d=0;d0)?a[0]:b;return this.fromTouch(c)},fromTouch:function(a){return new this(a.pageX,a.pageY)},from:function(a){if(!a){return new this(0,0)}if(!(a instanceof this)){return new this(a.x,a.y)}return a}},constructor:function(a,b){if(typeof a=="undefined"){a=0}if(typeof b=="undefined"){b=0}this.x=a;this.y=b;return this},clone:function(){return new this.self(this.x,this.y)},copy:function(){return this.clone.apply(this,arguments)},copyFrom:function(a){this.x=a.x;this.y=a.y;return this},toString:function(){return"Point["+this.x+","+this.y+"]"},equals:function(a){return(this.x===a.x&&this.y===a.y)},isCloseTo:function(c,b){if(typeof b=="number"){b={x:b};b.y=b.x}var a=c.x,f=c.y,e=b.x,d=b.y;return(this.x<=a+e&&this.x>=a-e&&this.y<=f+d&&this.y>=f-d)},isWithin:function(){return this.isCloseTo.apply(this,arguments)},translate:function(a,b){this.x+=a;this.y+=b;return this},roundedEquals:function(a){return(Math.round(this.x)===Math.round(a.x)&&Math.round(this.y)===Math.round(a.y))},getDistanceTo:function(b){var c=this.x-b.x,a=this.y-b.y;return Math.sqrt(c*c+a*a)},getAngleTo:function(b){var c=this.x-b.x,a=this.y-b.y;return Math.atan2(a,c)*this.radianToDegreeConstant}});Ext.define("Ext.util.Region",{statics:{getRegion:function(a){return Ext.fly(a).getPageBox(true)},from:function(a){return new this(a.top,a.right,a.bottom,a.left)}},constructor:function(d,f,a,c){var e=this;e.top=d;e[1]=d;e.right=f;e.bottom=a;e.left=c;e[0]=c},contains:function(b){var a=this;return(b.left>=a.left&&b.right<=a.right&&b.top>=a.top&&b.bottom<=a.bottom)},intersect:function(g){var f=this,d=Math.max(f.top,g.top),e=Math.min(f.right,g.right),a=Math.min(f.bottom,g.bottom),c=Math.max(f.left,g.left);if(a>d&&e>c){return new Ext.util.Region(d,e,a,c)}else{return false}},union:function(g){var f=this,d=Math.min(f.top,g.top),e=Math.max(f.right,g.right),a=Math.max(f.bottom,g.bottom),c=Math.min(f.left,g.left);return new Ext.util.Region(d,e,a,c)},constrainTo:function(b){var a=this,c=Ext.util.Numbers.constrain;a.top=c(a.top,b.top,b.bottom);a.bottom=c(a.bottom,b.top,b.bottom);a.left=c(a.left,b.left,b.right);a.right=c(a.right,b.left,b.right);return a},adjust:function(d,f,a,c){var e=this;e.top+=d;e.left+=c;e.right+=f;e.bottom+=a;return e},getOutOfBoundOffset:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.getOutOfBoundOffsetX(b)}else{return this.getOutOfBoundOffsetY(b)}}else{b=a;var c=new Ext.util.Offset();c.x=this.getOutOfBoundOffsetX(b.x);c.y=this.getOutOfBoundOffsetY(b.y);return c}},getOutOfBoundOffsetX:function(a){if(a<=this.left){return this.left-a}else{if(a>=this.right){return this.right-a}}return 0},getOutOfBoundOffsetY:function(a){if(a<=this.top){return this.top-a}else{if(a>=this.bottom){return this.bottom-a}}return 0},isOutOfBound:function(a,b){if(!Ext.isObject(a)){if(a=="x"){return this.isOutOfBoundX(b)}else{return this.isOutOfBoundY(b)}}else{b=a;return(this.isOutOfBoundX(b.x)||this.isOutOfBoundY(b.y))}},isOutOfBoundX:function(a){return(athis.right)},isOutOfBoundY:function(a){return(athis.bottom)},restrict:function(b,d,a){if(Ext.isObject(b)){var c;a=d;d=b;if(d.copy){c=d.copy()}else{c={x:d.x,y:d.y}}c.x=this.restrictX(d.x,a);c.y=this.restrictY(d.y,a);return c}else{if(b=="x"){return this.restrictX(d,a)}else{return this.restrictY(d,a)}}},restrictX:function(b,a){if(!a){a=1}if(b<=this.left){b-=(b-this.left)*a}else{if(b>=this.right){b-=(b-this.right)*a}}return b},restrictY:function(b,a){if(!a){a=1}if(b<=this.top){b-=(b-this.top)*a}else{if(b>=this.bottom){b-=(b-this.bottom)*a}}return b},getSize:function(){return{width:this.right-this.left,height:this.bottom-this.top}},copy:function(){return new Ext.util.Region(this.top,this.right,this.bottom,this.left)},toString:function(){return"Region["+this.top+","+this.right+","+this.bottom+","+this.left+"]"},translateBy:function(a){this.left+=a.x;this.right+=a.x;this.top+=a.y;this.bottom+=a.y;return this},round:function(){this.top=Math.round(this.top);this.right=Math.round(this.right);this.bottom=Math.round(this.bottom);this.left=Math.round(this.left);return this},equals:function(a){return(this.top==a.top&&this.right==a.right&&this.bottom==a.bottom&&this.left==a.left)}});Ext.define("Ext.util.Sorter",{isSorter:true,config:{property:null,sorterFn:null,root:null,transform:null,direction:"ASC",id:undefined},constructor:function(a){this.initConfig(a)},applyId:function(a){if(!a){a=this.getProperty();if(!a){a=Ext.id(null,"ext-sorter-")}}return a},createSortFunction:function(b){var c=this,a=c.getDirection().toUpperCase()=="DESC"?-1:1;return function(e,d){return a*b.call(c,e,d)}},defaultSortFn:function(e,c){var g=this,f=g._transform,b=g._root,d,a,h=g._property;if(b!==null){e=e[b];c=c[b]}d=e[h];a=c[h];if(f){d=f(d);a=f(a)}return d>a?1:(d -1 || Ext.isDate(values) ? values : ""'}else{if(e=="#"){c="xindex"}else{if(e.substr(0,7)=="parent."){c=e}else{if((e.indexOf(".")!==-1)&&(e.indexOf("-")===-1)){c="values."+e}else{c="values['"+e+"']"}}}}if(f){c="("+c+f+")"}if(g&&this.useFormat){d=d?","+d:"";if(g.substr(0,5)!="this."){g="fm."+g+"("}else{g+="("}}else{d="";g="("+c+" === undefined ? '' : "}return g+c+d+")"},evalTpl:function($){eval($);return $},newLineRe:/\r\n|\r|\n/g,aposRe:/[']/g,intRe:/^\s*(\d+)\s*$/,tagRe:/([\w-\.\#]+)(?:\:([\w\.]*)(?:\((.*?)?\))?)?(\s?[\+\-\*\/]\s?[\d\.\+\-\*\/\(\)]+)?/},function(){var a=this.prototype;a.fnArgs="out,values,parent,xindex,xcount";a.callFn=".call(this,"+a.fnArgs+")"});Ext.define("Ext.data.Field",{requires:["Ext.data.Types","Ext.data.SortTypes"],alias:"data.field",isField:true,config:{name:null,type:"auto",convert:undefined,dateFormat:null,allowNull:true,defaultValue:undefined,mapping:null,sortType:undefined,sortDir:"ASC",allowBlank:true,persist:true,encode:null,decode:null,bubbleEvents:"action"},constructor:function(a){if(Ext.isString(a)){a={name:a}}this.initConfig(a)},applyType:function(c){var b=Ext.data.Types,a=b.AUTO;if(c){if(Ext.isString(c)){return b[c.toUpperCase()]||a}else{return c}}return a},updateType:function(a,b){var c=this.getConvert();if(b&&c===b.convert){this.setConvert(a.convert)}},applySortType:function(d){var c=Ext.data.SortTypes,a=this.getType(),b=a.sortType;if(d){if(Ext.isString(d)){return c[d]||b}else{return d}}return b},applyConvert:function(b){var a=this.getType().convert;if(b&&b!==a){this._hasCustomConvert=true;return b}else{this._hasCustomConvert=false;return a}},hasCustomConvert:function(){return this._hasCustomConvert}});Ext.define("Ext.data.identifier.Sequential",{extend:"Ext.data.identifier.Simple",alias:"data.identifier.sequential",config:{prefix:"",seed:1},constructor:function(){var a=this;a.callParent(arguments);a.parts=[a.getPrefix(),""]},generate:function(b){var c=this,d=c.parts,a=c.getSeed()+1;c.setSeed(a);d[1]=a;return d.join("")}});Ext.define("Ext.data.writer.Json",{extend:"Ext.data.writer.Writer",alternateClassName:"Ext.data.JsonWriter",alias:"writer.json",config:{rootProperty:undefined,encode:false,allowSingle:true,encodeRequest:false},applyRootProperty:function(a){if(!a&&(this.getEncode()||this.getEncodeRequest())){a="data"}return a},writeRecords:function(d,e){var a=this.getRootProperty(),f=d.getParams(),b=this.getAllowSingle(),c;if(this.getAllowSingle()&&e&&e.length==1){e=e[0]}if(this.getEncodeRequest()){c=d.getJsonData()||{};if(e&&(e.length||(b&&Ext.isObject(e)))){c[a]=e}d.setJsonData(Ext.apply(c,f||{}));d.setParams(null);d.setMethod("POST");return d}if(!e||!(e.length||(b&&Ext.isObject(e)))){return d}if(this.getEncode()){if(a){f[a]=Ext.encode(e)}else{}}else{c=d.getJsonData()||{};if(a){c[a]=e}else{c=e}d.setJsonData(c)}return d}});Ext.define("Ext.event.Dispatcher",{requires:["Ext.event.ListenerStack","Ext.event.Controller"],statics:{getInstance:function(){if(!this.instance){this.instance=new this()}return this.instance},setInstance:function(a){this.instance=a;return this}},config:{publishers:{}},wildcard:"*",constructor:function(a){this.listenerStacks={};this.activePublishers={};this.publishersCache={};this.noActivePublishers=[];this.controller=null;this.initConfig(a);return this},getListenerStack:function(e,g,c,b){var d=this.listenerStacks,f=d[e],a;b=Boolean(b);if(!f){if(b){d[e]=f={}}else{return null}}f=f[g];if(!f){if(b){d[e][g]=f={}}else{return null}}a=f[c];if(!a){if(b){f[c]=a=new Ext.event.ListenerStack()}else{return null}}return a},getController:function(d,f,c,b){var a=this.controller,e={targetType:d,target:f,eventName:c};if(!a){this.controller=a=new Ext.event.Controller()}if(a.isFiring){a=new Ext.event.Controller()}a.setInfo(e);if(b&&a!==b){a.connect(b)}return a},applyPublishers:function(c){var a,b;this.publishersCache={};for(a in c){if(c.hasOwnProperty(a)){b=c[a];this.registerPublisher(b)}}return c},registerPublisher:function(b){var a=this.activePublishers,c=b.getTargetType(),d=a[c];if(!d){a[c]=d=[]}d.push(b);b.setDispatcher(this);return this},getCachedActivePublishers:function(c,b){var a=this.publishersCache,d;if((d=a[c])&&(d=d[b])){return d}return null},cacheActivePublishers:function(c,b,d){var a=this.publishersCache;if(!a[c]){a[c]={}}a[c][b]=d;return d},getActivePublishers:function(f,b){var g,a,c,e,d;if((g=this.getCachedActivePublishers(f,b))){return g}a=this.activePublishers[f];if(a){g=[];for(c=0,e=a.length;c0}return false},addListener:function(d,e,a){var f=this.getActivePublishers(d,a),c=f.length,b;if(c>0){for(b=0;b0){for(b=0;b0){for(b=0;b0)){return true}delete d[f];if(--d.$length===0){delete this.subscribers[a]}return true},onBeforeComponentRenderedChange:function(b,d,g){var f=this.eventNames,c=g?f.painted:f.erased,e=this.getSubscribers(c),a;if(e&&e.$length>0){this.renderedQueue[d.getId()]=a=[];this.publish(e,d,c,a)}},onBeforeComponentHiddenChange:function(c,d){var f=this.eventNames,b=d?f.erased:f.painted,e=this.getSubscribers(b),a;if(e&&e.$length>0){this.hiddenQueue[c.getId()]=a=[];this.publish(e,c,b,a)}},onComponentRenderedChange:function(b,c){var d=this.renderedQueue,e=c.getId(),a;if(!d.hasOwnProperty(e)){return}a=d[e];delete d[e];if(a.length>0){this.dispatchQueue(a)}},onComponentHiddenChange:function(c){var b=this.hiddenQueue,d=c.getId(),a;if(!b.hasOwnProperty(d)){return}a=b[d];delete b[d];if(a.length>0){this.dispatchQueue(a)}},dispatchQueue:function(g){var l=this.dispatcher,a=this.targetType,b=this.eventNames,e=g.slice(),f=e.length,c,k,h,d,j;g.length=0;if(f>0){for(c=0;c0)){return true}delete c[i];c.$length--}else{if(!d.hasOwnProperty(i)||(!j&&--d[i]>0)){return true}delete d[i];d.$length--}}else{if(g===this.SELECTOR_ALL){if(j){a.all=0}else{a.all--}}else{if(!b.hasOwnProperty(g)||(!j&&--b[g]>0)){return true}delete b[g];Ext.Array.remove(b,g)}}a.$length--;return true},getElementTarget:function(a){if(a.nodeType!==1){a=a.parentNode;if(!a||a.nodeType!==1){return null}}return a},getBubblingTargets:function(b){var a=[];if(!b){return a}do{a[a.length]=b;b=b.parentNode}while(b&&b.nodeType===1);return a},dispatch:function(c,a,b){b.push(b[0].target);this.callParent(arguments)},publish:function(b,a,c){var d=this.getSubscribers(b),e;if(d.$length===0||!this.doPublish(d,b,a,c)){e=this.getSubscribers("*");if(e.$length>0){this.doPublish(e,b,a,c)}}return this},doPublish:function(f,h,x,u){var r=f.id,g=f.className,b=f.selector,p=r.$length>0,a=g.$length>0,l=b.length>0,o=f.all>0,y={},e=[u],q=false,m=this.classNameSplitRegex,v,k,t,d,z,n,c,w,s;for(v=0,k=x.length;v0){c=a.slice(0);a.length=0;for(b=0;b0){this.processEvent(this.mergeEvents(d));d.length=0}this.processEvent(e)}}if(d.length>0){this.processEvent(this.mergeEvents(d));d.length=0}}},mergeEvents:function(c){var b=[],f=c.length,a,e,d;d=c[f-1];if(f===1){return d}for(a=0;ah){for(d=0;dh){return}}for(d=0;da){this.end(d)}}},onTouchEnd:function(a){this.end(a)},start:function(){if(!this.isTracking){this.isTracking=true;this.isStarted=false}},end:function(a){if(this.isTracking){this.isTracking=false;if(this.isStarted){this.isStarted=false;this.fireEnd(a)}}}});Ext.define("Ext.event.recognizer.Pinch",{extend:"Ext.event.recognizer.MultiTouch",requiredTouchesCount:2,handledEvents:["pinchstart","pinch","pinchend"],startDistance:0,lastTouches:null,onTouchMove:function(c){if(!this.isTracking){return}var b=Array.prototype.slice.call(c.touches),d,a,f;d=b[0].point;a=b[1].point;f=d.getDistanceTo(a);if(f===0){return}if(!this.isStarted){this.isStarted=true;this.startDistance=f;this.fire("pinchstart",c,b,{touches:b,distance:f,scale:1})}else{this.fire("pinch",c,b,{touches:b,distance:f,scale:f/this.startDistance})}this.lastTouches=b},fireEnd:function(a){this.fire("pinchend",a,this.lastTouches)},fail:function(){return this.callParent(arguments)}});Ext.define("Ext.event.recognizer.Rotate",{extend:"Ext.event.recognizer.MultiTouch",requiredTouchesCount:2,handledEvents:["rotatestart","rotate","rotateend"],startAngle:0,lastTouches:null,lastAngle:null,onTouchMove:function(h){if(!this.isTracking){return}var g=Array.prototype.slice.call(h.touches),b=this.lastAngle,d,f,c,a,i,j;d=g[0].point;f=g[1].point;c=d.getAngleTo(f);if(b!==null){j=Math.abs(b-c);a=c+360;i=c-360;if(Math.abs(a-b)1){return this.fail(this.self.NOT_SINGLE_TOUCH)}}});Ext.define("Ext.event.recognizer.DoubleTap",{extend:"Ext.event.recognizer.SingleTouch",config:{maxDuration:300},handledEvents:["singletap","doubletap"],singleTapTimer:null,onTouchStart:function(a){if(this.callParent(arguments)===false){return false}this.startTime=a.time;clearTimeout(this.singleTapTimer)},onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onEnd:function(g){var c=this,b=this.getMaxDuration(),h=g.changedTouches[0],f=g.time,a=this.lastTapTime,d;this.lastTapTime=f;if(a){d=f-a;if(d<=b){this.lastTapTime=0;this.fire("doubletap",g,[h],{touch:h,duration:d});return}}if(f-this.startTime>b){this.fireSingleTap(g,h)}else{this.singleTapTimer=setTimeout(function(){c.fireSingleTap(g,h)},b)}},fireSingleTap:function(a,b){this.fire("singletap",a,[b],{touch:b})}});Ext.define("Ext.event.recognizer.Drag",{extend:"Ext.event.recognizer.SingleTouch",isStarted:false,startPoint:null,previousPoint:null,lastPoint:null,handledEvents:["dragstart","drag","dragend"],onTouchStart:function(b){var c,a;if(this.callParent(arguments)===false){if(this.isStarted&&this.lastMoveEvent!==null){this.onTouchEnd(this.lastMoveEvent)}return false}this.startTouches=c=b.changedTouches;this.startTouch=a=c[0];this.startPoint=a.point},onTouchMove:function(d){var c=d.changedTouches,f=c[0],a=f.point,b=d.time;if(this.lastPoint){this.previousPoint=this.lastPoint}if(this.lastTime){this.previousTime=this.lastTime}this.lastTime=b;this.lastPoint=a;this.lastMoveEvent=d;if(!this.isStarted){this.isStarted=true;this.startTime=b;this.previousTime=b;this.previousPoint=this.startPoint;this.fire("dragstart",d,this.startTouches,this.getInfo(d,this.startTouch))}else{this.fire("drag",d,c,this.getInfo(d,f))}},onTouchEnd:function(c){if(this.isStarted){var b=c.changedTouches,d=b[0],a=d.point;this.isStarted=false;this.lastPoint=a;this.fire("dragend",c,b,this.getInfo(c,d));this.startTime=0;this.previousTime=0;this.lastTime=0;this.startPoint=null;this.previousPoint=null;this.lastPoint=null;this.lastMoveEvent=null}},getInfo:function(j,i){var d=j.time,a=this.startPoint,f=this.previousPoint,b=this.startTime,k=this.previousTime,l=this.lastPoint,h=l.x-a.x,g=l.y-a.y,c={touch:i,startX:a.x,startY:a.y,previousX:f.x,previousY:f.y,pageX:l.x,pageY:l.y,deltaX:h,deltaY:g,absDeltaX:Math.abs(h),absDeltaY:Math.abs(g),previousDeltaX:l.x-f.x,previousDeltaY:l.y-f.y,time:d,startTime:b,previousTime:k,deltaTime:d-b,previousDeltaTime:d-k};return c}});Ext.define("Ext.event.recognizer.LongPress",{extend:"Ext.event.recognizer.SingleTouch",inheritableStatics:{DURATION_NOT_ENOUGH:32},config:{minDuration:1000},handledEvents:["longpress"],fireLongPress:function(a){var b=a.changedTouches[0];this.fire("longpress",a,[b],{touch:b,duration:this.getMinDuration()});this.isLongPress=true},onTouchStart:function(b){var a=this;if(this.callParent(arguments)===false){return false}this.isLongPress=false;this.timer=setTimeout(function(){a.fireLongPress(b)},this.getMinDuration())},onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onTouchEnd:function(){if(!this.isLongPress){return this.fail(this.self.DURATION_NOT_ENOUGH)}},fail:function(){clearTimeout(this.timer);return this.callParent(arguments)}},function(){this.override({handledEvents:["longpress","taphold"],fire:function(a){if(a==="longpress"){var b=Array.prototype.slice.call(arguments);b[0]="taphold";this.fire.apply(this,b)}return this.callOverridden(arguments)}})});Ext.define("Ext.event.recognizer.Tap",{handledEvents:["tap"],extend:"Ext.event.recognizer.SingleTouch",onTouchMove:function(){return this.fail(this.self.TOUCH_MOVED)},onTouchEnd:function(a){var b=a.changedTouches[0];this.fire("tap",a,[b])}},function(){});(function(){function b(d){var c=Array.prototype.slice.call(arguments,1);return d.replace(/\{(\d+)\}/g,function(e,f){return c[f]})}Ext.DateExtras={now:Date.now||function(){return +new Date()},getElapsed:function(d,c){return Math.abs(d-(c||new Date()))},useStrict:false,formatCodeToRegex:function(d,c){var e=a.parseCodes[d];if(e){e=typeof e=="function"?e():e;a.parseCodes[d]=e}return e?Ext.applyIf({c:e.c?b(e.c,c||"{0}"):e.c},e):{g:0,c:null,s:Ext.String.escapeRegex(d)}},parseFunctions:{MS:function(d,c){var e=new RegExp("\\/Date\\(([-+])?(\\d+)(?:[+-]\\d{4})?\\)\\/");var f=(d||"").match(e);return f?new Date(((f[1]||"")+f[2])*1):null}},parseRegexes:[],formatFunctions:{MS:function(){return"\\/Date("+this.getTime()+")\\/"}},y2kYear:50,MILLI:"ms",SECOND:"s",MINUTE:"mi",HOUR:"h",DAY:"d",MONTH:"mo",YEAR:"y",defaults:{},dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNumbers:{Jan:0,Feb:1,Mar:2,Apr:3,May:4,Jun:5,Jul:6,Aug:7,Sep:8,Oct:9,Nov:10,Dec:11},defaultFormat:"m/d/Y",getShortMonthName:function(c){return a.monthNames[c].substring(0,3)},getShortDayName:function(c){return a.dayNames[c].substring(0,3)},getMonthNumber:function(c){return a.monthNumbers[c.substring(0,1).toUpperCase()+c.substring(1,3).toLowerCase()]},formatCodes:{d:"Ext.String.leftPad(this.getDate(), 2, '0')",D:"Ext.Date.getShortDayName(this.getDay())",j:"this.getDate()",l:"Ext.Date.dayNames[this.getDay()]",N:"(this.getDay() ? this.getDay() : 7)",S:"Ext.Date.getSuffix(this)",w:"this.getDay()",z:"Ext.Date.getDayOfYear(this)",W:"Ext.String.leftPad(Ext.Date.getWeekOfYear(this), 2, '0')",F:"Ext.Date.monthNames[this.getMonth()]",m:"Ext.String.leftPad(this.getMonth() + 1, 2, '0')",M:"Ext.Date.getShortMonthName(this.getMonth())",n:"(this.getMonth() + 1)",t:"Ext.Date.getDaysInMonth(this)",L:"(Ext.Date.isLeapYear(this) ? 1 : 0)",o:"(this.getFullYear() + (Ext.Date.getWeekOfYear(this) == 1 && this.getMonth() > 0 ? +1 : (Ext.Date.getWeekOfYear(this) >= 52 && this.getMonth() < 11 ? -1 : 0)))",Y:"Ext.String.leftPad(this.getFullYear(), 4, '0')",y:"('' + this.getFullYear()).substring(2, 4)",a:"(this.getHours() < 12 ? 'am' : 'pm')",A:"(this.getHours() < 12 ? 'AM' : 'PM')",g:"((this.getHours() % 12) ? this.getHours() % 12 : 12)",G:"this.getHours()",h:"Ext.String.leftPad((this.getHours() % 12) ? this.getHours() % 12 : 12, 2, '0')",H:"Ext.String.leftPad(this.getHours(), 2, '0')",i:"Ext.String.leftPad(this.getMinutes(), 2, '0')",s:"Ext.String.leftPad(this.getSeconds(), 2, '0')",u:"Ext.String.leftPad(this.getMilliseconds(), 3, '0')",O:"Ext.Date.getGMTOffset(this)",P:"Ext.Date.getGMTOffset(this, true)",T:"Ext.Date.getTimezone(this)",Z:"(this.getTimezoneOffset() * -60)",c:function(){for(var j="Y-m-dTH:i:sP",g=[],f=0,d=j.length;f= 0 && y >= 0){","v = Ext.Date.add(new Date(y < 100 ? 100 : y, 0, 1, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","v = !strict? v : (strict === true && (z <= 364 || (Ext.Date.isLeapYear(v) && z <= 365))? Ext.Date.add(v, Ext.Date.DAY, z) : null);","}else if(strict === true && !Ext.Date.isValid(y, m + 1, d, h, i, s, ms)){","v = null;","}else{","v = Ext.Date.add(new Date(y < 100 ? 100 : y, m, d, h, i, s, ms), Ext.Date.YEAR, y < 100 ? y - 100 : 0);","}","}","}","if(v){","if(zz != null){","v = Ext.Date.add(v, Ext.Date.SECOND, -v.getTimezoneOffset() * 60 - zz);","}else if(o){","v = Ext.Date.add(v, Ext.Date.MINUTE, -v.getTimezoneOffset() + (sn == '+'? -1 : 1) * (hr * 60 + mn));","}","}","return v;"].join("\n");return function(l){var e=a.parseRegexes.length,m=1,f=[],k=[],j=false,d="";for(var h=0;h Ext.Date.y2kYear ? 1900 + ty : 2000 + ty;\n",s:"(\\d{1,2})"},a:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(am|pm|AM|PM)"},A:{g:1,c:"if (/(am)/i.test(results[{0}])) {\nif (!h || h == 12) { h = 0; }\n} else { if (!h || h < 12) { h = (h || 0) + 12; }}",s:"(AM|PM|am|pm)"},g:function(){return a.formatCodeToRegex("G")},G:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{1,2})"},h:function(){return a.formatCodeToRegex("H")},H:{g:1,c:"h = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},i:{g:1,c:"i = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},s:{g:1,c:"s = parseInt(results[{0}], 10);\n",s:"(\\d{2})"},u:{g:1,c:"ms = results[{0}]; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n",s:"(\\d+)"},O:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(3,5) / 60),","mn = o.substring(3,5) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{4})"},P:{g:1,c:["o = results[{0}];","var sn = o.substring(0,1),","hr = o.substring(1,3)*1 + Math.floor(o.substring(4,6) / 60),","mn = o.substring(4,6) % 60;","o = ((-12 <= (hr*60 + mn)/60) && ((hr*60 + mn)/60 <= 14))? (sn + Ext.String.leftPad(hr, 2, '0') + Ext.String.leftPad(mn, 2, '0')) : null;\n"].join("\n"),s:"([+-]\\d{2}:\\d{2})"},T:{g:0,c:null,s:"[A-Z]{1,4}"},Z:{g:1,c:"zz = results[{0}] * 1;\nzz = (-43200 <= zz && zz <= 50400)? zz : null;\n",s:"([+-]?\\d{1,5})"},c:function(){var e=[],c=[a.formatCodeToRegex("Y",1),a.formatCodeToRegex("m",2),a.formatCodeToRegex("d",3),a.formatCodeToRegex("h",4),a.formatCodeToRegex("i",5),a.formatCodeToRegex("s",6),{c:"ms = results[7] || '0'; ms = parseInt(ms, 10)/Math.pow(10, ms.length - 3);\n"},{c:["if(results[8]) {","if(results[8] == 'Z'){","zz = 0;","}else if (results[8].indexOf(':') > -1){",a.formatCodeToRegex("P",8).c,"}else{",a.formatCodeToRegex("O",8).c,"}","}"].join("\n")}];for(var f=0,d=c.length;f0?"-":"+")+Ext.String.leftPad(Math.floor(Math.abs(e)/60),2,"0")+(d?":":"")+Ext.String.leftPad(Math.abs(e%60),2,"0")},getDayOfYear:function(f){var e=0,h=Ext.Date.clone(f),c=f.getMonth(),g;for(g=0,h.setDate(1),h.setMonth(0);g28){e=Math.min(e,Ext.Date.getLastDateOfMonth(Ext.Date.add(Ext.Date.getFirstDateOfMonth(g),"mo",h)).getDate())}i.setDate(e);i.setMonth(g.getMonth()+h);break;case Ext.Date.YEAR:i.setFullYear(g.getFullYear()+h);break}return i},between:function(d,f,c){var e=d.getTime();return f.getTime()<=e&&e<=c.getTime()}};var a=Ext.DateExtras;Ext.apply(Ext.Date,a)})();Ext.define("Ext.fx.Easing",{requires:["Ext.fx.easing.Linear"],constructor:function(a){return Ext.factory(a,Ext.fx.easing.Linear,null,"easing")}});Ext.define("Ext.fx.easing.BoundMomentum",{extend:"Ext.fx.easing.Abstract",requires:["Ext.fx.easing.Momentum","Ext.fx.easing.Bounce"],config:{momentum:null,bounce:null,minMomentumValue:0,maxMomentumValue:0,minVelocity:0.01,startVelocity:0},applyMomentum:function(a,b){return Ext.factory(a,Ext.fx.easing.Momentum,b)},applyBounce:function(a,b){return Ext.factory(a,Ext.fx.easing.Bounce,b)},updateStartTime:function(a){this.getMomentum().setStartTime(a);this.callParent(arguments)},updateStartVelocity:function(a){this.getMomentum().setStartVelocity(a)},updateStartValue:function(a){this.getMomentum().setStartValue(a)},reset:function(){this.lastValue=null;this.isBouncingBack=false;this.isOutOfBound=false;return this.callParent(arguments)},getValue:function(){var a=this.getMomentum(),j=this.getBounce(),e=a.getStartVelocity(),f=e>0?1:-1,g=this.getMinMomentumValue(),d=this.getMaxMomentumValue(),c=(f==1)?d:g,h=this.lastValue,i,b;if(e===0){return this.getStartValue()}if(!this.isOutOfBound){i=a.getValue();b=a.getVelocity();if(Math.abs(b)=g&&i<=d){return i}this.isOutOfBound=true;j.setStartTime(Ext.Date.now()).setStartVelocity(b).setStartValue(c)}i=j.getValue();if(!this.isEnded){if(!this.isBouncingBack){if(h!==null){if((f==1&&ih)){this.isBouncingBack=true}}}else{if(Math.round(i)==c){this.isEnded=true}}}this.lastValue=i;return i}});Ext.define("Ext.fx.easing.EaseIn",{extend:"Ext.fx.easing.Linear",alias:"easing.ease-in",config:{exponent:4,duration:1500},getValue:function(){var c=Ext.Date.now()-this.getStartTime(),g=this.getDuration(),b=this.getStartValue(),a=this.getEndValue(),h=this.distance,e=c/g,d=Math.pow(e,this.getExponent()),f=b+(d*h);if(c>=g){this.isEnded=true;return a}return f}});Ext.define("Ext.fx.easing.EaseOut",{extend:"Ext.fx.easing.Linear",alias:"easing.ease-out",config:{exponent:4,duration:1500},getValue:function(){var f=Ext.Date.now()-this.getStartTime(),d=this.getDuration(),b=this.getStartValue(),h=this.getEndValue(),a=this.distance,c=f/d,g=1-c,e=1-Math.pow(g,this.getExponent()),i=b+(e*a);if(f>=d){this.isEnded=true;return h}return i}});Ext.define("Ext.mixin.Filterable",{extend:"Ext.mixin.Mixin",requires:["Ext.util.Filter"],mixinConfig:{id:"filterable"},config:{filters:null,filterRoot:null},dirtyFilterFn:false,filterFn:null,filtered:false,applyFilters:function(a,b){if(!b){b=this.createFiltersCollection()}b.clear();this.filtered=false;this.dirtyFilterFn=true;if(a){this.addFilters(a)}return b},createFiltersCollection:function(){this._filters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._filters},addFilter:function(a){this.addFilters([a])},addFilters:function(b){var a=this.getFilters();return this.insertFilters(a?a.length:0,b)},insertFilter:function(a,b){return this.insertFilters(a,[b])},insertFilters:function(h,c){if(!Ext.isArray(c)){c=[c]}var j=c.length,a=this.getFilterRoot(),d=this.getFilters(),e=[],f,g,b;if(!d){d=this.createFiltersCollection()}for(g=0;g=200&&a<300)||a==304||(a==0&&d.responseText.length>0),b=false;if(!c){switch(a){case 12002:case 12029:case 12030:case 12031:case 12152:case 13030:b=true;break}}return{success:c,isException:b}},createResponse:function(c){var g=c.xhr,a={},h,d,i,e,f,b;if(c.timedout||c.aborted){c.success=false;h=[]}else{h=g.getAllResponseHeaders().replace(this.lineBreakRe,"\n").split("\n")}d=h.length;while(d--){i=h[d];e=i.indexOf(":");if(e>=0){f=i.substr(0,e).toLowerCase();if(i.charAt(e+1)==" "){++e}a[f]=i.substr(e+1)}}c.xhr=null;delete c.xhr;b={request:c,requestId:c.id,status:g.status,statusText:g.statusText,getResponseHeader:function(j){return a[j.toLowerCase()]},getAllResponseHeaders:function(){return a},responseText:g.responseText,responseXML:g.responseXML};g=null;return b},createException:function(a){return{request:a,requestId:a.id,status:a.aborted?-1:0,statusText:a.aborted?"transaction aborted":"communication failure",aborted:a.aborted,timedout:a.timedout}}});Ext.define("Ext.Ajax",{extend:"Ext.data.Connection",singleton:true,autoAbort:false});Ext.define("Ext.data.reader.Reader",{requires:["Ext.data.ResultSet"],alternateClassName:["Ext.data.Reader","Ext.data.DataReader"],mixins:["Ext.mixin.Observable"],isReader:true,config:{idProperty:undefined,clientIdProperty:"clientId",totalProperty:"total",successProperty:"success",messageProperty:null,rootProperty:"",implicitIncludes:true,model:undefined},constructor:function(a){this.initConfig(a)},fieldCount:0,applyModel:function(a){if(typeof a=="string"){a=Ext.data.ModelManager.getModel(a);if(!a){Ext.Logger.error("Model with name "+arguments[0]+" doesnt exist.")}}if(a&&!a.prototype.isModel&&Ext.isObject(a)){a=Ext.data.ModelManager.registerType(a.storeId||a.id||Ext.id(),a)}return a},applyIdProperty:function(a){if(!a&&this.getModel()){a=this.getModel().getIdProperty()}return a},updateModel:function(a){if(a){if(!this.getIdProperty()){this.setIdProperty(a.getIdProperty())}this.buildExtractors()}},createAccessor:Ext.emptyFn,createFieldAccessExpression:function(){return"undefined"},buildExtractors:function(){if(!this.getModel()){return}var b=this,c=b.getTotalProperty(),a=b.getSuccessProperty(),d=b.getMessageProperty();if(c){b.getTotal=b.createAccessor(c)}if(a){b.getSuccess=b.createAccessor(a)}if(d){b.getMessage=b.createAccessor(d)}b.extractRecordData=b.buildRecordDataExtractor()},buildRecordDataExtractor:function(){var k=this,e=k.getModel(),g=e.getFields(),j=g.length,a=[],h=k.getModel().getClientIdProperty(),f="__field",b=["var me = this,\n"," fields = me.getModel().getFields(),\n"," idProperty = me.getIdProperty(),\n",' idPropertyIsFn = (typeof idProperty == "function"),'," value,\n"," internalId"],d,l,c,m;g=g.items;for(d=0;d=0){return Ext.functionFactory("obj","var value; try {value = obj"+(b>0?".":"")+c+"} catch(e) {}; return value;")}}return function(d){return d[c]}}}(),createFieldAccessExpression:function(g,b,c){var f=this,h=f.objectRe,e=(g.getMapping()!==null),a=e?g.getMapping():g.getName(),i,d;if(typeof a==="function"){i=b+".getMapping()("+c+", this)"}else{if(f.getUseSimpleAccessors()===true||((d=String(a).search(h))<0)){if(!e||isNaN(a)){a='"'+a+'"'}i=c+"["+a+"]"}else{i=c+(d>0?".":"")+a}}return i}});Ext.define("Ext.data.proxy.Proxy",{extend:"Ext.Evented",alias:"proxy.proxy",alternateClassName:["Ext.data.DataProxy","Ext.data.Proxy"],requires:["Ext.data.reader.Json","Ext.data.writer.Json","Ext.data.Batch","Ext.data.Operation"],config:{batchOrder:"create,update,destroy",batchActions:true,model:null,reader:{type:"json"},writer:{type:"json"}},isProxy:true,applyModel:function(a){if(typeof a=="string"){a=Ext.data.ModelManager.getModel(a);if(!a){Ext.Logger.error("Model with name "+arguments[0]+" doesnt exist.")}}if(a&&!a.prototype.isModel&&Ext.isObject(a)){a=Ext.data.ModelManager.registerType(a.storeId||a.id||Ext.id(),a)}return a},updateModel:function(b){if(b){var a=this.getReader();if(a&&!a.getModel()){a.setModel(b)}}},applyReader:function(b,a){return Ext.factory(b,Ext.data.Reader,a,"reader")},updateReader:function(a){if(a){var b=this.getModel();if(!b){b=a.getModel();if(b){this.setModel(b)}}else{a.setModel(b)}if(a.onMetaChange){a.onMetaChange=Ext.Function.createSequence(a.onMetaChange,this.onMetaChange,this)}}},onMetaChange:function(b){var a=this.getReader().getModel();if(!this.getModel()&&a){this.setModel(a)}this.fireEvent("metachange",this,b)},applyWriter:function(b,a){return Ext.factory(b,Ext.data.Writer,a,"writer")},create:Ext.emptyFn,read:Ext.emptyFn,update:Ext.emptyFn,destroy:Ext.emptyFn,onDestroy:function(){Ext.destroy(this.getReader(),this.getWriter())},batch:function(e,f){var g=this,d=g.getBatchActions(),c=this.getModel(),b,a;if(e.operations===undefined){e={operations:e,batch:{listeners:f}}}if(e.batch){if(e.batch.isBatch){e.batch.setProxy(g)}else{e.batch.proxy=g}}else{e.batch={proxy:g,listeners:e.listeners||{}}}if(!b){b=new Ext.data.Batch(e.batch)}b.on("complete",Ext.bind(g.onBatchComplete,g,[e],0));Ext.each(g.getBatchOrder().split(","),function(h){a=e.operations[h];if(a){if(d){b.add(new Ext.data.Operation({action:h,records:a,model:c}))}else{Ext.each(a,function(i){b.add(new Ext.data.Operation({action:h,records:[i],model:c}))})}}},g);b.start();return b},onBatchComplete:function(a,b){var c=a.scope||this;if(b.hasException){if(Ext.isFunction(a.failure)){Ext.callback(a.failure,c,[b,a])}}else{if(Ext.isFunction(a.success)){Ext.callback(a.success,c,[b,a])}}if(Ext.isFunction(a.callback)){Ext.callback(a.callback,c,[b,a])}}},function(){});Ext.define("Ext.data.proxy.Client",{extend:"Ext.data.proxy.Proxy",alternateClassName:"Ext.proxy.ClientProxy",clear:function(){}});Ext.define("Ext.data.proxy.Memory",{extend:"Ext.data.proxy.Client",alias:"proxy.memory",alternateClassName:"Ext.data.MemoryProxy",isMemoryProxy:true,config:{data:[]},finishOperation:function(b,f,d){if(b){var c=0,e=b.getRecords(),a=e.length;for(c;c0){if(o){h[e]=m[0].getProperty();h[b]=m[0].getDirection()}else{h[e]=n.encodeSorters(m)}}if(c&&f&&f.length>0){h[c]=n.encodeFilters(f)}return h},buildUrl:function(c){var b=this,a=b.getUrl(c);if(b.getNoCache()){a=Ext.urlAppend(a,Ext.String.format("{0}={1}",b.getCacheString(),Ext.Date.now()))}return a},getUrl:function(a){return a?a.getUrl()||this.getApi()[a.getAction()]||this._url:this._url},doRequest:function(a,c,b){},afterRequest:Ext.emptyFn});Ext.define("Ext.data.proxy.JsonP",{extend:"Ext.data.proxy.Server",alternateClassName:"Ext.data.ScriptTagProxy",alias:["proxy.jsonp","proxy.scripttag"],requires:["Ext.data.JsonP"],config:{defaultWriterType:"base",callbackKey:"callback",recordParam:"records",autoAppendParams:true},doRequest:function(a,f,b){var d=this,c=d.buildRequest(a),e=c.getParams();c.setConfig({callbackKey:d.getCallbackKey(),timeout:d.getTimeout(),scope:d,callback:d.createRequestCallback(c,a,f,b)});if(d.getAutoAppendParams()){c.setParams({})}c.setJsonP(Ext.data.JsonP.request(c.getCurrentConfig()));c.setParams(e);a.setStarted();d.lastRequest=c;return c},createRequestCallback:function(d,a,e,b){var c=this;return function(h,f,g){delete c.lastRequest;c.processResponse(h,a,d,f,e,b)}},setException:function(b,a){b.setException(b.getRequest().getJsonP().errorType)},buildUrl:function(f){var h=this,a=h.callParent(arguments),e=Ext.apply({},f.getParams()),c=e.filters,d,b,g,j;delete e.filters;if(h.getAutoAppendParams()){a=Ext.urlAppend(a,Ext.Object.toQueryString(e))}if(c&&c.length){for(g=0;g1){this.endAnimationCounter=0;this.fireEvent("animationend",this)}},applyInAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},applyOutAnimation:function(b,a){return Ext.factory(b,Ext.fx.Animation,a)},updateInAnimation:function(a){a.setScope(this)},updateOutAnimation:function(a){a.setScope(this)},onActiveItemChange:function(a,e,h,i,d){var b=this.getInAnimation(),g=this.getOutAnimation(),f,c;if(e&&h&&h.isPainted()){f=e.renderElement;c=h.renderElement;b.setElement(f);g.setElement(c);g.setOnBeforeEnd(function(j,k){if(k||Ext.Animator.hasRunningAnimations(j)){d.firingArguments[1]=null;d.firingArguments[2]=null}});g.setOnEnd(function(){d.resume()});f.dom.style.setProperty("visibility","hidden","!important");e.show();Ext.Animator.run([g,b]);d.pause()}}});Ext.define("Ext.fx.layout.card.Cover",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.cover",config:{reverse:null,inAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out"},outAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1},out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Cube",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.cube",config:{reverse:null,inAnimation:{type:"cube"},outAnimation:{type:"cube",out:true}}});Ext.define("Ext.fx.layout.card.Fade",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.fade",config:{reverse:null,inAnimation:{type:"fade",easing:"ease-out"},outAnimation:{type:"fade",easing:"ease-out",out:true}}});Ext.define("Ext.fx.layout.card.Flip",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.flip",config:{duration:500,inAnimation:{type:"flip",half:true,easing:"ease-out",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null}},outAnimation:{type:"flip",half:true,easing:"ease-in",before:{"backface-visibility":"hidden"},after:{"backface-visibility":null},out:true}},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Pop",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.pop",config:{duration:500,inAnimation:{type:"pop",easing:"ease-out"},outAnimation:{type:"pop",easing:"ease-in",out:true}},updateDuration:function(d){var c=d/2,b=this.getInAnimation(),a=this.getOutAnimation();b.setDelay(c);b.setDuration(c);a.setDuration(c)}});Ext.define("Ext.fx.layout.card.Reveal",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.reveal",config:{inAnimation:{easing:"ease-out",from:{opacity:0.99},to:{opacity:1}},outAnimation:{before:{"z-index":100},after:{"z-index":0},type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.card.Slide",{extend:"Ext.fx.layout.card.Style",alias:"fx.layout.card.slide",config:{inAnimation:{type:"slide",easing:"ease-out"},outAnimation:{type:"slide",easing:"ease-out",out:true}},updateReverse:function(a){this.getInAnimation().setReverse(a);this.getOutAnimation().setReverse(a)}});Ext.define("Ext.fx.layout.Card",{requires:["Ext.fx.layout.card.Slide","Ext.fx.layout.card.Cover","Ext.fx.layout.card.Reveal","Ext.fx.layout.card.Fade","Ext.fx.layout.card.Flip","Ext.fx.layout.card.Pop","Ext.fx.layout.card.Scroll"],constructor:function(b){var a=Ext.fx.layout.card.Abstract,c;if(!b){return null}if(typeof b=="string"){c=b;b={}}else{if(b.type){c=b.type}}b.elementBox=false;if(c){if(Ext.os.is.Android2){if(c!="fade"){c="scroll"}}else{if(c==="slide"&&Ext.browser.is.ChromeMobile){c="scroll"}}a=Ext.ClassManager.getByAlias("fx.layout.card."+c)}return Ext.factory(b,a)}});Ext.define("Ext.fx.runner.Css",{extend:"Ext.Evented",requires:["Ext.fx.Animation"],prefixedProperties:{transform:true,"transform-origin":true,perspective:true,"transform-style":true,transition:true,"transition-property":true,"transition-duration":true,"transition-timing-function":true,"transition-delay":true,animation:true,"animation-name":true,"animation-duration":true,"animation-iteration-count":true,"animation-direction":true,"animation-timing-function":true,"animation-delay":true},lengthProperties:{top:true,right:true,bottom:true,left:true,width:true,height:true,"max-height":true,"max-width":true,"min-height":true,"min-width":true,"margin-bottom":true,"margin-left":true,"margin-right":true,"margin-top":true,"padding-bottom":true,"padding-left":true,"padding-right":true,"padding-top":true,"border-bottom-width":true,"border-left-width":true,"border-right-width":true,"border-spacing":true,"border-top-width":true,"border-width":true,"outline-width":true,"letter-spacing":true,"line-height":true,"text-indent":true,"word-spacing":true,"font-size":true,translate:true,translateX:true,translateY:true,translateZ:true,translate3d:true},durationProperties:{"transition-duration":true,"transition-delay":true,"animation-duration":true,"animation-delay":true},angleProperties:{rotate:true,rotateX:true,rotateY:true,rotateZ:true,skew:true,skewX:true,skewY:true},lengthUnitRegex:/([a-z%]*)$/,DEFAULT_UNIT_LENGTH:"px",DEFAULT_UNIT_ANGLE:"deg",DEFAULT_UNIT_DURATION:"ms",formattedNameCache:{},constructor:function(){var a=Ext.feature.has.Css3dTransforms;if(a){this.transformMethods=["translateX","translateY","translateZ","rotate","rotateX","rotateY","rotateZ","skewX","skewY","scaleX","scaleY","scaleZ"]}else{this.transformMethods=["translateX","translateY","rotate","skewX","skewY","scaleX","scaleY"]}this.vendorPrefix=Ext.browser.getStyleDashPrefix();this.ruleStylesCache={};return this},getStyleSheet:function(){var c=this.styleSheet,a,b;if(!c){a=document.createElement("style");a.type="text/css";(document.head||document.getElementsByTagName("head")[0]).appendChild(a);b=document.styleSheets;this.styleSheet=c=b[b.length-1]}return c},applyRules:function(i){var g=this.getStyleSheet(),k=this.ruleStylesCache,j=g.cssRules,c,e,h,b,d,a,f;for(c in i){e=i[c];h=k[c];if(h===undefined){d=j.length;g.insertRule(c+"{}",d);h=k[c]=j.item(d).style}b=h.$cache;if(!b){b=h.$cache={}}for(a in e){f=this.formatValue(e[a],a);a=this.formatName(a);if(b[a]!==f){b[a]=f;if(f===null){h.removeProperty(a)}else{h.setProperty(a,f,"important")}}}}return this},applyStyles:function(d){var g,c,f,b,a,e;for(g in d){c=document.getElementById(g);if(!c){return this}f=c.style;b=d[g];for(a in b){e=this.formatValue(b[a],a);a=this.formatName(a);if(e===null){f.removeProperty(a)}else{f.setProperty(a,e,"important")}}}return this},formatName:function(b){var a=this.formattedNameCache,c=a[b];if(!c){if(this.prefixedProperties[b]){c=this.vendorPrefix+b}else{c=b}a[b]=c}return c},formatValue:function(j,b){var g=typeof j,l=this.DEFAULT_UNIT_LENGTH,e,a,d,f,c,k,h;if(g=="string"){if(this.lengthProperties[b]){h=j.match(this.lengthUnitRegex)[1];if(h.length>0){}else{return j+l}}return j}else{if(g=="number"){if(j==0){return"0"}if(this.lengthProperties[b]){return j+l}if(this.angleProperties[b]){return j+this.DEFAULT_UNIT_ANGLE}if(this.durationProperties[b]){return j+this.DEFAULT_UNIT_DURATION}}else{if(b==="transform"){e=this.transformMethods;c=[];for(d=0,f=e.length;d0)?k.join(", "):"none"}}}}return j}});Ext.define("Ext.fx.runner.CssTransition",{extend:"Ext.fx.runner.Css",listenersAttached:false,constructor:function(){this.runningAnimationsData={};return this.callParent(arguments)},attachListeners:function(){this.listenersAttached=true;this.getEventDispatcher().addListener("element","*","transitionend","onTransitionEnd",this)},onTransitionEnd:function(b){var a=b.target,c=a.id;if(c&&this.runningAnimationsData.hasOwnProperty(c)){this.refreshRunningAnimationsData(Ext.get(a),[b.browserEvent.propertyName])}},onAnimationEnd:function(g,f,d,j,n){var c=g.getId(),k=this.runningAnimationsData[c],o={},m={},b,h,e,l,a;d.un("stop","onAnimationStop",this);if(k){b=k.nameMap}o[c]=m;if(f.onBeforeEnd){f.onBeforeEnd.call(f.scope||this,g,j)}d.fireEvent("animationbeforeend",d,g,j);this.fireEvent("animationbeforeend",this,d,g,j);if(n||(!j&&!f.preserveEndState)){h=f.toPropertyNames;for(e=0,l=h.length;e0},refreshRunningAnimationsData:function(d,k,t,p){var g=d.getId(),q=this.runningAnimationsData,a=q[g];if(!a){return}var m=a.nameMap,s=a.nameList,b=a.sessions,f,h,e,u,l,c,r,o,n=false;t=Boolean(t);p=Boolean(p);if(!b){return this}f=b.length;if(f===0){return this}if(p){a.nameMap={};s.length=0;for(l=0;l");d.close();this.testElement=c=d.createElement("div");c.style.setProperty("position","absolute","!important");d.body.appendChild(c);this.testElementComputedStyle=window.getComputedStyle(c)}return c},getCssStyleValue:function(b,e){var d=this.getTestElement(),a=this.testElementComputedStyle,c=d.style;c.setProperty(b,e);e=a.getPropertyValue(b);c.removeProperty(b);return e},run:function(p){var F=this,h=this.lengthProperties,x={},E={},G={},d,s,y,e,u,I,v,q,r,a,A,z,o,B,l,t,g,C,H,k,f,w,n,c,D,b,m;if(!this.listenersAttached){this.attachListeners()}p=Ext.Array.from(p);for(A=0,o=p.length;A0){this.refreshRunningAnimationsData(d,Ext.Array.merge(I,v),true,G.replacePrevious)}c=a.nameMap;D=a.nameList;t={};for(z=0;z0){I=Ext.Array.difference(D,I);v=Ext.Array.merge(I,v);y["transition-property"]=I}E[s]=e=Ext.Object.chain(e);e["transition-property"]=v;e["transition-duration"]=G.duration;e["transition-timing-function"]=G.easing;e["transition-delay"]=G.delay;B.startTime=Date.now()}r=this.$className;this.applyStyles(x);q=function(i){if(i.data===r&&i.source===window){window.removeEventListener("message",q,false);F.applyStyles(E)}};window.addEventListener("message",q,false);window.postMessage(r,"*")},onAnimationStop:function(d){var f=this.runningAnimationsData,h,a,g,b,c,e;for(h in f){if(f.hasOwnProperty(h)){a=f[h];g=a.sessions;for(b=0,c=g.length;b component"})},reapply:function(){this.container.innerElement.addCls(this.cls);this.updatePack(this.getPack());this.updateAlign(this.getAlign())},unapply:function(){this.container.innerElement.removeCls(this.cls);this.updatePack(null);this.updateAlign(null)},doItemAdd:function(d,b){this.callParent(arguments);if(d.isInnerItem()){var c=d.getConfig(this.sizePropertyName),a=d.config;if(!c&&("flex" in a)){this.setItemFlex(d,a.flex)}}},doItemRemove:function(a){if(a.isInnerItem()){this.setItemFlex(a,null)}this.callParent(arguments)},onItemSizeChange:function(a){this.setItemFlex(a,null)},doItemCenteredChange:function(b,a){if(a){this.setItemFlex(b,null)}this.callParent(arguments)},doItemFloatingChange:function(a,b){if(b){this.setItemFlex(a,null)}this.callParent(arguments)},doItemDockedChange:function(a,b){if(b){this.setItemFlex(a,null)}this.callParent(arguments)},redrawContainer:function(){var a=this.container,b=a.renderElement.dom.parentNode;if(b&&b.nodeType!==11){a.innerElement.redraw()}},setItemFlex:function(c,a){var b=c.element,d=this.flexItemCls;if(a){b.addCls(d)}else{if(b.hasCls(d)){this.redrawContainer();b.removeCls(d)}}b.dom.style.webkitBoxFlex=a},convertPosition:function(a){if(this.positionMap.hasOwnProperty(a)){return this.positionMap[a]}return a},applyAlign:function(a){return this.convertPosition(a)},updateAlign:function(a){this.container.innerElement.dom.style.webkitBoxAlign=a},applyPack:function(a){return this.convertPosition(a)},updatePack:function(a){this.container.innerElement.dom.style.webkitBoxPack=a}});Ext.define("Ext.layout.Fit",{extend:"Ext.layout.Default",alternateClassName:"Ext.layout.FitLayout",alias:"layout.fit",cls:Ext.baseCSSPrefix+"layout-fit",itemCls:Ext.baseCSSPrefix+"layout-fit-item",constructor:function(a){this.callParent(arguments);this.apply()},apply:function(){this.container.innerElement.addCls(this.cls)},reapply:function(){this.apply()},unapply:function(){this.container.innerElement.removeCls(this.cls)},doItemAdd:function(b,a){if(b.isInnerItem()){b.addCls(this.itemCls)}this.callParent(arguments)},doItemRemove:function(a){if(a.isInnerItem()){a.removeCls(this.itemCls)}this.callParent(arguments)}});Ext.define("Ext.layout.Card",{extend:"Ext.layout.Fit",alternateClassName:"Ext.layout.CardLayout",isCard:true,requires:["Ext.fx.layout.Card"],alias:"layout.card",cls:Ext.baseCSSPrefix+"layout-card",itemCls:Ext.baseCSSPrefix+"layout-card-item",constructor:function(){this.callParent(arguments);this.container.onInitialized(this.onContainerInitialized,this)},applyAnimation:function(a){return new Ext.fx.layout.Card(a)},updateAnimation:function(b,a){if(b&&b.isAnimation){b.setLayout(this)}if(a){a.destroy()}},doItemAdd:function(b,a){if(b.isInnerItem()){b.hide()}this.callParent(arguments)},getInnerItemsContainer:function(){var a=this.innerItemsContainer;if(!a){this.innerItemsContainer=a=Ext.Element.create({className:this.cls+"-container"});this.container.innerElement.append(a)}return a},doItemRemove:function(c,a,b){this.callParent(arguments);if(!b&&c.isInnerItem()){c.show()}},onContainerInitialized:function(a){var b=a.getActiveItem();if(b){b.show()}a.on("activeitemchange","onContainerActiveItemChange",this)},onContainerActiveItemChange:function(a){this.relayEvent(arguments,"doActiveItemChange")},doActiveItemChange:function(b,c,a){if(a){a.hide()}if(c){c.show()}},doItemDockedChange:function(b,c){var a=b.element;if(c){a.removeCls(this.itemCls)}else{a.addCls(this.itemCls)}this.callParent(arguments)}});Ext.define("Ext.layout.HBox",{extend:"Ext.layout.AbstractBox",alternateClassName:"Ext.layout.HBoxLayout",alias:"layout.hbox",sizePropertyName:"width",sizeChangeEventName:"widthchange",cls:Ext.baseCSSPrefix+"layout-hbox"});Ext.define("Ext.layout.VBox",{extend:"Ext.layout.AbstractBox",alternateClassName:"Ext.layout.VBoxLayout",alias:"layout.vbox",sizePropertyName:"height",sizeChangeEventName:"heightchange",cls:Ext.baseCSSPrefix+"layout-vbox"});Ext.define("Ext.layout.Layout",{requires:["Ext.layout.Fit","Ext.layout.Card","Ext.layout.HBox","Ext.layout.VBox"],constructor:function(a,b){var c=Ext.layout.Default,d,e;if(typeof b=="string"){d=b;b={}}else{if("type" in b){d=b.type}}if(d){c=Ext.ClassManager.getByAlias("layout."+d)}return new c(a,b)}});Ext.define("Ext.mixin.Sortable",{extend:"Ext.mixin.Mixin",requires:["Ext.util.Sorter"],mixinConfig:{id:"sortable"},config:{sorters:null,defaultSortDirection:"ASC",sortRoot:null},dirtySortFn:false,sortFn:null,sorted:false,applySorters:function(a,b){if(!b){b=this.createSortersCollection()}b.clear();this.sorted=false;if(a){this.addSorters(a)}return b},createSortersCollection:function(){this._sorters=Ext.create("Ext.util.Collection",function(a){return a.getId()});return this._sorters},addSorter:function(b,a){this.addSorters([b],a)},addSorters:function(c,a){var b=this.getSorters();return this.insertSorters(b?b.length:0,c,a)},insertSorter:function(a,c,b){return this.insertSorters(a,[c],b)},insertSorters:function(e,h,a){if(!Ext.isArray(h)){h=[h]}var f=h.length,j=a||this.getDefaultSortDirection(),c=this.getSortRoot(),k=this.getSorters(),l=[],g,b,m,d;if(!k){k=this.createSortersCollection()}for(b=0;b>1;f=d(e,b[c]);if(f>=0){h=c+1}else{if(f<0){a=c-1}}}return h}});Ext.define("Ext.util.AbstractMixedCollection",{requires:["Ext.util.Filter"],mixins:{observable:"Ext.mixin.Observable"},constructor:function(b,a){var c=this;c.items=[];c.map={};c.keys=[];c.length=0;c.allowFunctions=b===true;if(a){c.getKey=a}c.mixins.observable.constructor.call(c)},allowFunctions:false,add:function(b,e){var d=this,f=e,c=b,a;if(arguments.length==1){f=c;c=d.getKey(f)}if(typeof c!="undefined"&&c!==null){a=d.map[c];if(typeof a!="undefined"){return d.replace(c,f)}d.map[c]=f}d.length++;d.items.push(f);d.keys.push(c);d.fireEvent("add",d.length-1,f,c);return f},getKey:function(a){return a.id},replace:function(c,e){var d=this,a,b;if(arguments.length==1){e=arguments[0];c=d.getKey(e)}a=d.map[c];if(typeof c=="undefined"||c===null||typeof a=="undefined"){return d.add(c,e)}b=d.indexOfKey(c);d.items[b]=e;d.map[c]=e;d.fireEvent("replace",c,a,e);return e},addAll:function(f){var e=this,d=0,b,a,c;if(arguments.length>1||Ext.isArray(f)){b=arguments.length>1?arguments:f;for(a=b.length;d=d.length){return d.add(c,f)}d.length++;Ext.Array.splice(d.items,a,0,f);if(typeof c!="undefined"&&c!==null){d.map[c]=f}Ext.Array.splice(d.keys,a,0,c);d.fireEvent("add",a,f,c);return f},remove:function(a){return this.removeAt(this.indexOf(a))},removeAll:function(a){Ext.each(a||[],function(b){this.remove(b)},this);return this},removeAt:function(a){var c=this,d,b;if(a=0){c.length--;d=c.items[a];Ext.Array.erase(c.items,a,1);b=c.keys[a];if(typeof b!="undefined"){delete c.map[b]}Ext.Array.erase(c.keys,a,1);c.fireEvent("remove",d,b);return d}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(a){return Ext.Array.indexOf(this.items,a)},indexOfKey:function(a){return Ext.Array.indexOf(this.keys,a)},get:function(b){var d=this,a=d.map[b],c=a!==undefined?a:(typeof b=="number")?d.items[b]:undefined;return typeof c!="function"||d.allowFunctions?c:null},getAt:function(a){return this.items[a]},getByKey:function(a){return this.map[a]},contains:function(a){return Ext.Array.contains(this.items,a)},containsKey:function(a){return typeof this.map[a]!="undefined"},clear:function(){var a=this;a.length=0;a.items=[];a.keys=[];a.map={};a.fireEvent("clear")},first:function(){return this.items[0]},last:function(){return this.items[this.length-1]},sum:function(g,b,h,a){var c=this.extractValues(g,b),f=c.length,e=0,d;h=h||0;a=(a||a===0)?a:f-1;for(d=h;d<=a;d++){e+=c[d]}return e},collect:function(j,e,g){var k=this.extractValues(j,e),a=k.length,b={},c=[],h,f,d;for(d=0;d=a;d--){b[b.length]=c[d]}}return b},filter:function(d,c,f,a){var b=[],e;if(Ext.isString(d)){b.push(Ext.create("Ext.util.Filter",{property:d,value:c,anyMatch:f,caseSensitive:a}))}else{if(Ext.isArray(d)||d instanceof Ext.util.Filter){b=b.concat(d)}}e=function(g){var m=true,n=b.length,h;for(h=0;h=e.length||(a&&e.getAutoSort())){return e.add(d,f)}if(typeof d!="undefined"&&d!==null){if(typeof g[d]!="undefined"){e.replace(d,f);return false}g[d]=f}this.all.push(f);if(b&&this.getAutoFilter()&&this.mixins.filterable.isFiltered.call(e,f)){return null}e.length++;Ext.Array.splice(e.items,c,0,f);Ext.Array.splice(e.keys,c,0,d);e.dirtyIndices=true;return f},insertAll:function(g,d){if(g>=this.items.length||(this.sorted&&this.getAutoSort())){return this.addAll(d)}var s=this,h=this.filtered,a=this.sorted,b=this.all,m=this.items,l=this.keys,r=this.map,n=this.getAutoFilter(),o=this.getAutoSort(),t=[],j=[],f=[],c=this.mixins.filterable,e=false,k,u,p,q;if(a&&this.getAutoSort()){}if(Ext.isObject(d)){for(u in d){if(d.hasOwnProperty(u)){j.push(m[u]);t.push(u)}}}else{j=d;k=d.length;for(p=0;p=0){e=a[b];c=f[b];if(typeof c!="undefined"){delete g.map[c]}Ext.Array.erase(a,b,1);Ext.Array.erase(f,b,1);Ext.Array.remove(d,e);delete g.indices[c];g.length--;this.dirtyIndices=true;return e}return false},removeAtKey:function(a){return this.removeAt(this.indexOfKey(a))},getCount:function(){return this.length},indexOf:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[this.getKey(b)];return(a===undefined)?-1:a},indexOfKey:function(b){if(this.dirtyIndices){this.updateIndices()}var a=this.indices[b];return(a===undefined)?-1:a},updateIndices:function(){var a=this.items,e=a.length,f=this.indices={},c,d,b;for(c=0;c=a;d--){b[b.length]=c[d]}}return b},findIndexBy:function(d,c,h){var g=this,f=g.keys,a=g.items,b=h||0,e=a.length;for(;b1){for(c=a.length;ba){if(d){var e=c.substr(0,a-2),b=Math.max(e.lastIndexOf(" "),e.lastIndexOf("."),e.lastIndexOf("!"),e.lastIndexOf("?"));if(b!=-1&&b>=(a-15)){return e.substr(0,b)+"..."}}return c.substr(0,a-3)+"..."}return c},escapeRegex:function(a){return a.replace(Ext.util.Format.escapeRegexRe,"\\$1")},escape:function(a){return a.replace(Ext.util.Format.escapeRe,"\\$1")},toggle:function(b,c,a){return b==c?a:c},trim:function(a){return a.replace(Ext.util.Format.trimRe,"")},leftPad:function(d,b,c){var a=String(d);c=c||" ";while(a.length/g,">").replace(/").replace(/</g,"<").replace(/"/g,'"').replace(/&/g,"&")},date:function(b,c){var a=b;if(!b){return""}if(!Ext.isDate(b)){a=new Date(Date.parse(b));if(isNaN(a)){if(this.iso8601TestRe.test(b)){a=b.split(this.iso8601SplitRe);a=new Date(a[0],a[1]-1,a[2],a[3],a[4],a[5])}if(isNaN(a)){a=new Date(Date.parse(b.replace(this.dashesRe,"/")))}}b=a}return Ext.Date.format(b,c||Ext.util.Format.defaultDateFormat)}});Ext.define("Ext.Template",{requires:["Ext.dom.Helper","Ext.util.Format"],inheritableStatics:{from:function(b,a){b=Ext.getDom(b);return new this(b.value||b.innerHTML,a||"")}},constructor:function(d){var f=this,b=arguments,a=[],c=0,e=b.length,g;f.initialConfig={};if(e>1){for(;cf)?1:((ba?1:(d0},isExpandable:function(){var a=this;if(a.get("expandable")){return !(a.isLeaf()||(a.isLoaded()&&!a.hasChildNodes()))}return false},appendChild:function(b,j,h){var f=this,c,e,d,g,a;if(Ext.isArray(b)){for(c=0,e=b.length;c0){Ext.Array.sort(d,f);for(c=0;cMath.max(c,b)||jMath.max(a,q)||eMath.max(p,n)||eMath.max(k,h)){return null}return new Ext.util.Point(j,e)},toString:function(){return this.point1.toString()+" "+this.point2.toString()}});Ext.define("Ext.util.SizeMonitor",{extend:"Ext.Evented",config:{element:null,detectorCls:Ext.baseCSSPrefix+"size-change-detector",callback:Ext.emptyFn,scope:null,args:[]},constructor:function(d){this.initConfig(d);this.doFireSizeChangeEvent=Ext.Function.bind(this.doFireSizeChangeEvent,this);var g=this,e=this.getElement().dom,b=this.getDetectorCls(),c=Ext.Element.create({classList:[b,b+"-expand"],children:[{}]},true),h=Ext.Element.create({classList:[b,b+"-shrink"],children:[{}]},true),a=function(i){g.onDetectorScroll("expand",i)},f=function(i){g.onDetectorScroll("shrink",i)};e.appendChild(c);e.appendChild(h);this.detectors={expand:c,shrink:h};this.position={expand:{left:0,top:0},shrink:{left:0,top:0}};this.listeners={expand:a,shrink:f};this.refresh();c.addEventListener("scroll",a,true);h.addEventListener("scroll",f,true)},applyElement:function(a){if(a){return Ext.get(a)}},updateElement:function(a){a.on("destroy","destroy",this)},refreshPosition:function(b){var e=this.detectors[b],a=this.position[b],d,c;a.left=d=e.scrollWidth-e.offsetWidth;a.top=c=e.scrollHeight-e.offsetHeight;e.scrollLeft=d;e.scrollTop=c},refresh:function(){this.refreshPosition("expand");this.refreshPosition("shrink")},onDetectorScroll:function(b){var c=this.detectors[b],a=this.position[b];if(c.scrollLeft!==a.left||c.scrollTop!==a.top){this.refresh();this.fireSizeChangeEvent()}},fireSizeChangeEvent:function(){clearTimeout(this.sizeChangeThrottleTimer);this.sizeChangeThrottleTimer=setTimeout(this.doFireSizeChangeEvent,1)},doFireSizeChangeEvent:function(){this.getCallback().apply(this.getScope(),this.getArgs())},destroyDetector:function(a){var c=this.detectors[a],b=this.listeners[a];c.removeEventListener("scroll",b,true);Ext.removeNode(c)},destroy:function(){this.callParent(arguments);this.destroyDetector("expand");this.destroyDetector("shrink");delete this.listeners;delete this.detectors}});Ext.define("Ext.event.publisher.ComponentSize",{extend:"Ext.event.publisher.Publisher",requires:["Ext.ComponentManager","Ext.util.SizeMonitor"],targetType:"component",handledEvents:["resize"],constructor:function(){this.callParent(arguments);this.sizeMonitors={}},subscribe:function(g){var c=g.match(this.idSelectorRegex),f=this.subscribers,a=this.sizeMonitors,d=this.dispatcher,e=this.targetType,b;if(!c){return false}if(!f.hasOwnProperty(g)){f[g]=0;d.addListener(e,g,"painted","onComponentPainted",this,null,"before");b=Ext.ComponentManager.get(c[1]);a[g]=new Ext.util.SizeMonitor({element:b.element,callback:this.onComponentSizeChange,scope:this,args:[this,g]})}f[g]++;return true},unsubscribe:function(h,b,e){var c=h.match(this.idSelectorRegex),g=this.subscribers,d=this.dispatcher,f=this.targetType,a=this.sizeMonitors;if(!c){return false}if(!g.hasOwnProperty(h)||(!e&&--g[h]>0)){return true}a[h].destroy();delete a[h];d.removeListener(f,h,"painted","onComponentPainted",this,"before");delete g[h];return true},onComponentPainted:function(b){var c=b.getObservableId(),a=this.sizeMonitors[c];a.refresh()},onComponentSizeChange:function(a,b){this.dispatcher.doDispatchEvent(this.targetType,b,"resize",[a])}});Ext.define("Ext.util.Sortable",{isSortable:true,defaultSortDirection:"ASC",requires:["Ext.util.Sorter"],initSortable:function(){var a=this,b=a.sorters;a.sorters=Ext.create("Ext.util.AbstractMixedCollection",false,function(c){return c.id||c.property});if(b){a.sorters.addAll(a.decodeSorters(b))}},sort:function(g,f,c,e){var d=this,h,b,a;if(Ext.isArray(g)){e=c;c=f;a=g}else{if(Ext.isObject(g)){e=c;c=f;a=[g]}else{if(Ext.isString(g)){h=d.sorters.get(g);if(!h){h={property:g,direction:f};a=[h]}else{if(f===undefined){h.toggle()}else{h.setDirection(f)}}}}}if(a&&a.length){a=d.decodeSorters(a);if(Ext.isString(c)){if(c==="prepend"){g=d.sorters.clone().items;d.sorters.clear();d.sorters.addAll(a);d.sorters.addAll(g)}else{d.sorters.addAll(a)}}else{d.sorters.clear();d.sorters.addAll(a)}if(e!==false){d.onBeforeSort(a)}}if(e!==false){g=d.sorters.items;if(g.length){b=function(l,k){var j=g[0].sort(l,k),n=g.length,m;for(m=1;me?1:(f0){g=f.data.items;r=g.length;for(k=0;k0){b.create=e;f=true}if(c.length>0){b.update=c;f=true}if(a.length>0){b.destroy=a;f=true}if(f&&d.fireEvent("beforesync",this,b)!==false){d.getProxy().batch({operations:b,listeners:d.getBatchListeners()})}return{added:e,updated:c,removed:a}},first:function(){return this.data.first()},last:function(){return this.data.last()},sum:function(e){var d=0,c=0,b=this.data.items,a=b.length;for(;c0){c=b[0].get(f)}for(;d0){a=c[0].get(f)}for(;da){a=e}}return a},average:function(e){var c=0,b=this.data.items,a=b.length,d=0;if(b.length>0){for(;ce){return 1}else{if(fa.data.index)?1:-1},applyFilters:function(b){var a=this;return function(c){return a.isVisible(c)}},applyProxy:function(a){},applyNode:function(a){if(a){a=Ext.data.NodeInterface.decorate(a)}return a},updateNode:function(a,c){if(c&&!c.isDestroyed){c.un({append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad",scope:this});c.unjoin(this)}if(a){a.on({scope:this,append:"onNodeAppend",insert:"onNodeInsert",remove:"onNodeRemove",load:"onNodeLoad"});a.join(this);var b=[];if(a.childNodes.length){b=b.concat(this.retrieveChildNodes(a))}if(this.getRootVisible()){b.push(a)}else{if(a.isLoaded()||a.isLoading()){a.set("expanded",true)}}this.data.clear();this.fireEvent("clear",this);this.suspendEvents();this.add(b);this.resumeEvents();this.fireEvent("refresh",this,this.data)}},retrieveChildNodes:function(a){var d=this.getNode(),b=this.getRecursive(),c=[],e=a;if(!a.childNodes.length||(!b&&a!==d)){return c}if(!b){return a.childNodes}while(e){if(e._added){delete e._added;if(e===a){break}else{e=e.nextSibling||e.parentNode}}else{if(e!==a){c.push(e)}if(e.firstChild){e._added=true;e=e.firstChild}else{e=e.nextSibling||e.parentNode}}}return c},isVisible:function(b){var a=b.parentNode;if(!this.getRecursive()&&a!==this.getNode()){return false}while(a){if(!a.isExpanded()){return false}if(a===this.getNode()){break}a=a.parentNode}return true}});Ext.define("Ext.data.TreeStore",{extend:"Ext.data.NodeStore",alias:"store.tree",config:{root:undefined,clearOnLoad:true,nodeParam:"node",defaultRootId:"root",defaultRootProperty:"children",recursive:true},applyProxy:function(){return Ext.data.Store.prototype.applyProxy.apply(this,arguments)},applyRoot:function(a){var b=this;a=a||{};a=Ext.apply({},a);if(!a.isModel){Ext.applyIf(a,{id:b.getStoreId()+"-"+b.getDefaultRootId(),text:"Root",allowDrag:false});a=Ext.data.ModelManager.create(a,b.getModel())}Ext.data.NodeInterface.decorate(a);a.set(a.raw);return a},handleTreeInsertionIndex:function(a,b,d,c){if(b.parentNode){b.parentNode.sort(d.getSortFn(),true,true)}return this.callParent(arguments)},handleTreeSort:function(a,b){if(this._sorting){return a}this._sorting=true;this.getNode().sort(b.getSortFn(),true,true);delete this._sorting;return this.callParent(arguments)},updateRoot:function(a,b){if(b){b.unBefore({expand:"onNodeBeforeExpand",scope:this});b.unjoin(this)}a.onBefore({expand:"onNodeBeforeExpand",scope:this});this.onNodeAppend(null,a);this.setNode(a);if(!a.isLoaded()&&!a.isLoading()&&a.isExpanded()){this.load({node:a})}this.fireEvent("rootchange",this,a,b)},getNodeById:function(a){return this.data.getByKey(a)},onNodeBeforeExpand:function(b,a,c){if(b.isLoading()){c.pause();this.on("load",function(){c.resume()},this,{single:true})}else{if(!b.isLoaded()){c.pause();this.load({node:b,callback:function(){c.resume()}})}}},onNodeAppend:function(n,c){var l=this.getProxy(),j=l.getReader(),b=this.getModel(),g=c.raw,d=[],a=j.getRootProperty(),m,h,f,k,e;if(!c.isLeaf()){m=j.getRoot(g);if(m){h=j.extractData(m);for(f=0,k=h.length;f0){this.sendRequest(b==1?a[0]:a);this.callBuffer=[]}}});Ext.define("Ext.util.TapRepeater",{requires:["Ext.DateExtras"],mixins:{observable:"Ext.mixin.Observable"},config:{el:null,accelerate:true,interval:10,delay:250,preventDefault:true,stopDefault:false,timer:0,pressCls:null},constructor:function(a){var b=this;b.initConfig(a)},updateEl:function(c,b){var a={touchstart:"onTouchStart",touchend:"onTouchEnd",tap:"eventOptions",scope:this};if(b){b.un(a)}c.on(a)},eventOptions:function(a){if(this.getPreventDefault()){a.preventDefault()}if(this.getStopDefault()){a.stopEvent()}},destroy:function(){this.clearListeners();Ext.destroy(this.el)},onTouchStart:function(c){var b=this,a=b.getPressCls();clearTimeout(b.getTimer());if(a){b.getEl().addCls(a)}b.tapStartTime=new Date();b.fireEvent("touchstart",b,c);b.fireEvent("tap",b,c);if(b.getAccelerate()){b.delay=400}b.setTimer(Ext.defer(b.tap,b.getDelay()||b.getInterval(),b,[c]))},tap:function(b){var a=this;a.fireEvent("tap",a,b);a.setTimer(Ext.defer(a.tap,a.getAccelerate()?a.easeOutExpo(Ext.Date.getElapsed(a.tapStartTime),400,-390,12000):a.getInterval(),a,[b]))},easeOutExpo:function(e,a,g,f){return(e==f)?a+g:g*(-Math.pow(2,-10*e/f)+1)+a},onTouchEnd:function(b){var a=this;clearTimeout(a.getTimer());a.getEl().removeCls(a.getPressCls());a.fireEvent("touchend",a,b)}});Ext.define("Ext.util.translatable.Abstract",{extend:"Ext.Evented",requires:["Ext.fx.easing.Linear"],config:{element:null,easing:null,easingX:null,easingY:null,fps:60},constructor:function(a){var b;this.doAnimationFrame=Ext.Function.bind(this.doAnimationFrame,this);this.x=0;this.y=0;this.activeEasingX=null;this.activeEasingY=null;this.initialConfig=a;if(a&&a.element){b=a.element;this.setElement(b)}},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){this.initConfig(this.initialConfig);this.refresh()},factoryEasing:function(a){return Ext.factory(a,Ext.fx.easing.Linear,null,"easing")},applyEasing:function(a){if(!this.getEasingX()){this.setEasingX(this.factoryEasing(a))}if(!this.getEasingY()){this.setEasingY(this.factoryEasing(a))}},applyEasingX:function(a){return this.factoryEasing(a)},applyEasingY:function(a){return this.factoryEasing(a)},updateFps:function(a){this.animationInterval=1000/a},doTranslate:function(a,b){if(typeof a=="number"){this.x=a}if(typeof b=="number"){this.y=b}return this},translate:function(a,c,b){if(!this.getElement().dom){return}if(Ext.isObject(a)){throw new Error()}this.stopAnimation();if(b){return this.translateAnimated(a,c,b)}return this.doTranslate(a,c)},animate:function(b,a){this.activeEasingX=b;this.activeEasingY=a;this.isAnimating=true;this.animationTimer=setInterval(this.doAnimationFrame,this.animationInterval);this.fireEvent("animationstart",this,this.x,this.y);return this},translateAnimated:function(b,g,e){if(Ext.isObject(b)){throw new Error()}if(!Ext.isObject(e)){e={}}var d=Ext.Date.now(),f=e.easing,c=(typeof b=="number")?(e.easingX||this.getEasingX()||f||true):null,a=(typeof g=="number")?(e.easingY||this.getEasingY()||f||true):null;if(c){c=this.factoryEasing(c);c.setStartTime(d);c.setStartValue(this.x);c.setEndValue(b);if("duration" in e){c.setDuration(e.duration)}}if(a){a=this.factoryEasing(a);a.setStartTime(d);a.setStartValue(this.y);a.setEndValue(g);if("duration" in e){a.setDuration(e.duration)}}return this.animate(c,a)},doAnimationFrame:function(){var c=this.activeEasingX,b=this.activeEasingY,d=this.getElement(),a,e;if(!this.isAnimating||!d.dom){return}if(c===null&&b===null){this.stopAnimation();return}if(c!==null){this.x=a=Math.round(c.getValue());if(c.isEnded){this.activeEasingX=null;this.fireEvent("axisanimationend",this,"x",a)}}else{a=this.x}if(b!==null){this.y=e=Math.round(b.getValue());if(b.isEnded){this.activeEasingY=null;this.fireEvent("axisanimationend",this,"y",e)}}else{e=this.y}this.doTranslate(a,e);this.fireEvent("animationframe",this,a,e)},stopAnimation:function(){if(!this.isAnimating){return}this.activeEasingX=null;this.activeEasingY=null;this.isAnimating=false;clearInterval(this.animationTimer);this.fireEvent("animationend",this,this.x,this.y)},refresh:function(){this.translate(this.x,this.y)}});Ext.define("Ext.util.translatable.CssTransform",{extend:"Ext.util.translatable.Abstract",doTranslate:function(a,c){var b=this.getElement().dom.style;if(typeof a!="number"){a=this.x}if(typeof c!="number"){c=this.y}b.webkitTransform="translate3d("+a+"px, "+c+"px, 0px)";return this.callParent(arguments)},destroy:function(){var a=this.getElement();if(a&&!a.isDestroyed){a.dom.style.webkitTransform=null}this.callParent(arguments)}});Ext.define("Ext.util.translatable.ScrollPosition",{extend:"Ext.util.translatable.Abstract",wrapperWidth:0,wrapperHeight:0,baseCls:"x-translatable",config:{useWrapper:true},getWrapper:function(){var e=this.wrapper,c=this.baseCls,b=this.getElement(),d,a;if(!e){a=b.getParent();if(!a){return null}if(this.getUseWrapper()){e=b.wrap({className:c+"-wrapper"},true)}else{e=a.dom}e.appendChild(Ext.Element.create({className:c+"-stretcher"},true));this.nestedStretcher=d=Ext.Element.create({className:c+"-nested-stretcher"},true);b.appendChild(d);b.addCls(c);a.addCls(c+"-container");this.container=a;this.wrapper=e;this.refresh()}return e},doTranslate:function(a,c){var b=this.getWrapper();if(b){if(typeof a=="number"){b.scrollLeft=this.wrapperWidth-a}if(typeof c=="number"){b.scrollTop=this.wrapperHeight-c}}return this.callParent(arguments)},refresh:function(){var a=this.getWrapper();if(a){this.wrapperWidth=a.offsetWidth;this.wrapperHeight=a.offsetHeight;this.callParent(arguments)}},destroy:function(){var b=this.getElement(),a=this.baseCls;if(this.wrapper){if(this.getUseWrapper()){b.unwrap()}this.container.removeCls(a+"-container");b.removeCls(a);b.removeChild(this.nestedStretcher)}this.callParent(arguments)}});Ext.define("Ext.util.Translatable",{requires:["Ext.util.translatable.CssTransform","Ext.util.translatable.ScrollPosition"],constructor:function(a){var c=Ext.util.translatable,e=c.CssTransform,d=c.ScrollPosition,b;if(typeof a=="object"&&"translationMethod" in a){if(a.translationMethod==="scrollposition"){b=d}else{if(a.translationMethod==="csstransform"){b=e}}}if(!b){if(Ext.os.is.Android2||Ext.browser.is.ChromeMobile){b=d}else{b=e}}return new b(a)}});Ext.define("Ext.behavior.Translatable",{extend:"Ext.behavior.Behavior",requires:["Ext.util.Translatable"],constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.translatable.refresh()},setConfig:function(c){var a=this.translatable,b=this.component;if(c){if(!a){this.translatable=a=new Ext.util.Translatable(c);a.setElement(b.renderElement);a.on("destroy","onTranslatableDestroy",this);if(b.isPainted()){this.onComponentPainted(b)}b.on(this.listeners)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getTranslatable:function(){return this.translatable},onTranslatableDestroy:function(){var a=this.component;delete this.translatable;a.un(this.listeners)},onComponentDestroy:function(){var a=this.translatable;if(a){a.destroy()}}});Ext.define("Ext.scroll.Scroller",{extend:"Ext.Evented",requires:["Ext.fx.easing.BoundMomentum","Ext.fx.easing.EaseOut","Ext.util.SizeMonitor","Ext.util.Translatable"],config:{element:null,direction:"auto",translationMethod:"auto",fps:"auto",disabled:null,directionLock:false,momentumEasing:{momentum:{acceleration:30,friction:0.5},bounce:{acceleration:30,springTension:0.3},minVelocity:1},bounceEasing:{duration:400},outOfBoundRestrictFactor:0.5,startMomentumResetTime:300,maxAbsoluteVelocity:6,containerSize:"auto",containerScrollSize:"auto",size:"auto",autoRefresh:true,initialOffset:{x:0,y:0},slotSnapSize:{x:0,y:0},slotSnapOffset:{x:0,y:0},slotSnapEasing:{duration:150}},cls:Ext.baseCSSPrefix+"scroll-scroller",containerCls:Ext.baseCSSPrefix+"scroll-container",dragStartTime:0,dragEndTime:0,isDragging:false,isAnimating:false,constructor:function(a){var b=a&&a.element;this.doAnimationFrame=Ext.Function.bind(this.doAnimationFrame,this);this.stopAnimation=Ext.Function.bind(this.stopAnimation,this);this.listeners={scope:this,touchstart:"onTouchStart",touchend:"onTouchEnd",dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd"};this.minPosition={x:0,y:0};this.startPosition={x:0,y:0};this.size={x:0,y:0};this.position={x:0,y:0};this.velocity={x:0,y:0};this.isAxisEnabledFlags={x:false,y:false};this.flickStartPosition={x:0,y:0};this.flickStartTime={x:0,y:0};this.lastDragPosition={x:0,y:0};this.dragDirection={x:0,y:0};this.initialConfig=a;if(b){this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){this.initialize();a.addCls(this.cls);if(!this.getDisabled()){this.attachListeneners()}this.onConfigUpdate(["containerSize","size"],"refreshMaxPosition");this.on("maxpositionchange","snapToBoundary");this.on("minpositionchange","snapToBoundary");return this},getTranslatable:function(){if(!this.hasOwnProperty("translatable")){var a=this.getBounceEasing();this.translatable=new Ext.util.Translatable({translationMethod:this.getTranslationMethod(),element:this.getElement(),easingX:a.x,easingY:a.y,useWrapper:false,listeners:{animationframe:"onAnimationFrame",animationend:"onAnimationEnd",axisanimationend:"onAxisAnimationEnd",scope:this}})}return this.translatable},updateFps:function(a){if(a!=="auto"){this.getTranslatable().setFps(a)}},attachListeneners:function(){this.getContainer().on(this.listeners)},detachListeners:function(){this.getContainer().un(this.listeners)},updateDisabled:function(a){if(a){this.detachListeners()}else{this.attachListeneners()}},updateInitialOffset:function(c){if(typeof c=="number"){c={x:c,y:c}}var b=this.position,a,d;b.x=a=c.x;b.y=d=c.y;this.getTranslatable().doTranslate(-a,-d)},applyDirection:function(a){var e=this.getMinPosition(),d=this.getMaxPosition(),c,b;this.givenDirection=a;if(a==="auto"){c=d.x>e.x;b=d.y>e.y;if(c&&b){a="both"}else{if(c){a="horizontal"}else{a="vertical"}}}return a},updateDirection:function(b){var a=this.isAxisEnabledFlags;a.x=(b==="both"||b==="horizontal");a.y=(b==="both"||b==="vertical")},isAxisEnabled:function(a){this.getDirection();return this.isAxisEnabledFlags[a]},applyMomentumEasing:function(b){var a=Ext.fx.easing.BoundMomentum;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},applyBounceEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},applySlotSnapEasing:function(b){var a=Ext.fx.easing.EaseOut;return{x:Ext.factory(b,a),y:Ext.factory(b,a)}},getMinPosition:function(){var a=this.minPosition;if(!a){this.minPosition=a={x:0,y:0};this.fireEvent("minpositionchange",this,a)}return a},getMaxPosition:function(){var c=this.maxPosition,a,b;if(!c){a=this.getSize();b=this.getContainerSize();this.maxPosition=c={x:Math.max(0,a.x-b.x),y:Math.max(0,a.y-b.y)};this.fireEvent("maxpositionchange",this,c)}return c},refreshMaxPosition:function(){this.maxPosition=null;this.getMaxPosition()},applyContainerSize:function(b){var c=this.getContainer().dom,a,d;if(!c){return}this.givenContainerSize=b;if(b==="auto"){a=c.offsetWidth;d=c.offsetHeight}else{a=b.x;d=b.y}return{x:a,y:d}},applySize:function(b){var c=this.getElement().dom,a,d;if(!c){return}this.givenSize=b;if(b==="auto"){a=c.offsetWidth;d=c.offsetHeight}else{a=b.x;d=b.y}return{x:a,y:d}},applyContainerScrollSize:function(b){var c=this.getContainer().dom,a,d;if(!c){return}this.givenContainerScrollSize=b;if(b==="auto"){a=c.scrollWidth;d=c.scrollHeight}else{a=b.x;d=b.y}return{x:a,y:d}},updateAutoRefresh:function(b){var c=Ext.util.SizeMonitor,a;if(b){this.sizeMonitors={element:new c({element:this.getElement(),callback:this.doRefresh,scope:this}),container:new c({element:this.getContainer(),callback:this.doRefresh,scope:this})}}else{a=this.sizeMonitors;if(a){a.element.destroy();a.container.destroy()}}},applySlotSnapSize:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},applySlotSnapOffset:function(a){if(typeof a=="number"){return{x:a,y:a}}return a},getContainer:function(){var a=this.container;if(!a){this.container=a=this.getElement().getParent();a.addCls(this.containerCls)}return a},doRefresh:function(){this.stopAnimation();this.getTranslatable().refresh();this.setSize(this.givenSize);this.setContainerSize(this.givenContainerSize);this.setContainerScrollSize(this.givenContainerScrollSize);this.setDirection(this.givenDirection);this.fireEvent("refresh",this)},refresh:function(){var a=this.sizeMonitors;if(a){a.element.refresh();a.container.refresh()}this.doRefresh();return this},scrollTo:function(c,h,g){var b=this.getTranslatable(),a=this.position,d=false,f,e;if(this.isAxisEnabled("x")){if(typeof c!="number"){c=a.x}else{if(a.x!==c){a.x=c;d=true}}f=-c}if(this.isAxisEnabled("y")){if(typeof h!="number"){h=a.y}else{if(a.y!==h){a.y=h;d=true}}e=-h}if(d){if(g!==undefined){b.translateAnimated(f,e,g)}else{this.fireEvent("scroll",this,a.x,a.y);b.doTranslate(f,e)}}return this},scrollToTop:function(b){var a=this.getInitialOffset();return this.scrollTo(a.x,a.y,b)},scrollToEnd:function(a){return this.scrollTo(0,this.getSize().y-this.getContainerSize().y,a)},scrollBy:function(b,d,c){var a=this.position;b=(typeof b=="number")?b+a.x:null;d=(typeof d=="number")?d+a.y:null;return this.scrollTo(b,d,c)},onTouchStart:function(){this.isTouching=true;this.stopAnimation()},onTouchEnd:function(){var a=this.position;this.isTouching=false;if(!this.isDragging&&this.snapToSlot()){this.fireEvent("scrollstart",this,a.x,a.y)}},onDragStart:function(l){var o=this.getDirection(),g=l.absDeltaX,f=l.absDeltaY,j=this.getDirectionLock(),i=this.startPosition,d=this.flickStartPosition,k=this.flickStartTime,h=this.lastDragPosition,c=this.position,b=this.dragDirection,n=c.x,m=c.y,a=Ext.Date.now();this.isDragging=true;if(j&&o!=="both"){if((o==="horizontal"&&g>f)||(o==="vertical"&&f>g)){l.stopPropagation()}else{this.isDragging=false;return}}h.x=n;h.y=m;d.x=n;d.y=m;i.x=n;i.y=m;k.x=a;k.y=a;b.x=0;b.y=0;this.dragStartTime=a;this.isDragging=true;this.fireEvent("scrollstart",this,n,m)},onAxisDrag:function(i,q){if(!this.isAxisEnabled(i)){return}var h=this.flickStartPosition,l=this.flickStartTime,j=this.lastDragPosition,e=this.dragDirection,g=this.position[i],k=this.getMinPosition()[i],o=this.getMaxPosition()[i],d=this.startPosition[i],p=j[i],n=d-q,c=e[i],m=this.getOutOfBoundRestrictFactor(),f=this.getStartMomentumResetTime(),b=Ext.Date.now(),a;if(no){a=n-o;n=o+a*m}}if(n>p){e[i]=1}else{if(nf){h[i]=g;l[i]=b}j[i]=n},onDrag:function(b){if(!this.isDragging){return}var a=this.lastDragPosition;this.onAxisDrag("x",b.deltaX);this.onAxisDrag("y",b.deltaY);this.scrollTo(a.x,a.y)},onDragEnd:function(c){var b,a;if(!this.isDragging){return}this.dragEndTime=Ext.Date.now();this.onDrag(c);this.isDragging=false;b=this.getAnimationEasing("x");a=this.getAnimationEasing("y");if(b||a){this.getTranslatable().animate(b,a)}else{this.onScrollEnd()}},getAnimationEasing:function(g){if(!this.isAxisEnabled(g)){return null}var e=this.position[g],f=this.flickStartPosition[g],k=this.flickStartTime[g],c=this.getMinPosition()[g],j=this.getMaxPosition()[g],a=this.getMaxAbsoluteVelocity(),d=null,b=this.dragEndTime,l,i,h;if(ej){d=j}}if(d!==null){l=this.getBounceEasing()[g];l.setConfig({startTime:b,startValue:-e,endValue:-d});return l}h=b-k;if(h===0){return null}i=(e-f)/(b-k);if(i===0){return null}if(i<-a){i=-a}else{if(i>a){i=a}}l=this.getMomentumEasing()[g];l.setConfig({startTime:b,startValue:-e,startVelocity:-i,minMomentumValue:-j,maxMomentumValue:0});return l},onAnimationFrame:function(c,b,d){var a=this.position;a.x=-b;a.y=-d;this.fireEvent("scroll",this,a.x,a.y)},onAxisAnimationEnd:function(a){},onAnimationEnd:function(){this.snapToBoundary();this.onScrollEnd()},stopAnimation:function(){this.getTranslatable().stopAnimation()},onScrollEnd:function(){var a=this.position;if(this.isTouching||!this.snapToSlot()){this.fireEvent("scrollend",this,a.x,a.y)}},snapToSlot:function(){var b=this.getSnapPosition("x"),a=this.getSnapPosition("y"),c=this.getSlotSnapEasing();if(b!==null||a!==null){this.scrollTo(b,a,{easingX:c.x,easingY:c.y});return true}return false},getSnapPosition:function(c){var g=this.getSlotSnapSize()[c],d=null,a,f,e,b;if(g!==0&&this.isAxisEnabled(c)){a=this.position[c];f=this.getSlotSnapOffset()[c];e=this.getMaxPosition()[c];b=(a-f)%g;if(b!==0){if(Math.abs(b)>g/2){d=a+((b>0)?g-b:b-g);if(d>e){d=a-b}}else{d=a-b}}}return d},snapToBoundary:function(){var g=this.position,c=this.getMinPosition(),f=this.getMaxPosition(),e=c.x,d=c.y,b=f.x,a=f.y,i=Math.round(g.x),h=Math.round(g.y);if(ib){i=b}}if(ha){h=a}}this.scrollTo(i,h)},destroy:function(){var b=this.getElement(),a=this.sizeMonitors;if(a){a.element.destroy();a.container.destroy()}if(b&&!b.isDestroyed){b.removeCls(this.cls);this.getContainer().removeCls(this.containerCls)}Ext.destroy(this.translatable);this.callParent(arguments)}},function(){});Ext.define("Ext.util.Draggable",{isDraggable:true,mixins:["Ext.mixin.Observable"],requires:["Ext.util.SizeMonitor","Ext.util.Translatable"],config:{cls:Ext.baseCSSPrefix+"draggable",draggingCls:Ext.baseCSSPrefix+"dragging",element:null,constraint:"container",disabled:null,direction:"both",initialOffset:{x:0,y:0},translatable:{}},DIRECTION_BOTH:"both",DIRECTION_VERTICAL:"vertical",DIRECTION_HORIZONTAL:"horizontal",defaultConstraint:{min:{x:-Infinity,y:-Infinity},max:{x:Infinity,y:Infinity}},sizeMonitor:null,containerSizeMonitor:null,constructor:function(a){var b;this.extraConstraint={};this.initialConfig=a;this.offset={x:0,y:0};this.listeners={dragstart:"onDragStart",drag:"onDrag",dragend:"onDragEnd",scope:this};if(a&&a.element){b=a.element;delete a.element;this.setElement(b)}return this},applyElement:function(a){if(!a){return}return Ext.get(a)},updateElement:function(a){a.on(this.listeners);this.sizeMonitor=new Ext.util.SizeMonitor({element:a,callback:this.doRefresh,scope:this});this.initConfig(this.initialConfig)},updateInitialOffset:function(b){if(typeof b=="number"){b={x:b,y:b}}var c=this.offset,a,d;c.x=a=b.x;c.y=d=b.y;this.getTranslatable().doTranslate(a,d)},updateCls:function(a){this.getElement().addCls(a)},applyTranslatable:function(a,b){a=Ext.factory(a,Ext.util.Translatable,b);a.setElement(this.getElement());return a},setExtraConstraint:function(a){this.extraConstraint=a||{};this.refreshConstraint();return this},addExtraConstraint:function(a){Ext.merge(this.extraConstraint,a);this.refreshConstraint();return this},applyConstraint:function(a){this.currentConstraint=a;if(!a){a=this.defaultConstraint}if(a==="container"){return Ext.merge(this.getContainerConstraint(),this.extraConstraint)}return Ext.merge({},this.extraConstraint,a)},updateConstraint:function(){this.refreshOffset()},getContainerConstraint:function(){var b=this.getContainer(),c=this.getElement();if(!b||!c.dom){return this.defaultConstraint}var h=c.dom,g=b.dom,d=h.offsetWidth,a=h.offsetHeight,f=g.offsetWidth,e=g.offsetHeight;return{min:{x:0,y:0},max:{x:f-d,y:e-a}}},getContainer:function(){var a=this.container;if(!a){a=this.getElement().getParent();if(a){this.containerSizeMonitor=new Ext.util.SizeMonitor({element:a,callback:this.doRefresh,scope:this});this.container=a;a.on("destroy","onContainerDestroy",this)}}return a},onContainerDestroy:function(){delete this.container;delete this.containerSizeMonitor},detachListeners:function(){this.getElement().un(this.listeners)},isAxisEnabled:function(a){var b=this.getDirection();if(a==="x"){return(b===this.DIRECTION_BOTH||b===this.DIRECTION_HORIZONTAL)}return(b===this.DIRECTION_BOTH||b===this.DIRECTION_VERTICAL)},onDragStart:function(a){if(this.getDisabled()){return false}var b=this.offset;this.fireAction("dragstart",[this,a,b.x,b.y],this.initDragStart)},initDragStart:function(b,c,a,d){this.dragStartOffset={x:a,y:d};this.isDragging=true;this.getElement().addCls(this.getDraggingCls())},onDrag:function(b){if(!this.isDragging){return}var a=this.dragStartOffset;this.fireAction("drag",[this,b,a.x+b.deltaX,a.y+b.deltaY],this.doDrag)},doDrag:function(b,c,a,d){b.setOffset(a,d)},onDragEnd:function(a){if(!this.isDragging){return}this.onDrag(a);this.isDragging=false;this.getElement().removeCls(this.getDraggingCls());this.fireEvent("dragend",this,a,this.offset.x,this.offset.y)},setOffset:function(i,h,b){var f=this.offset,a=this.getConstraint(),e=a.min,c=a.max,d=Math.min,g=Math.max;if(this.isAxisEnabled("x")&&typeof i=="number"){i=d(g(i,e.x),c.x)}else{i=f.x}if(this.isAxisEnabled("y")&&typeof h=="number"){h=d(g(h,e.y),c.y)}else{h=f.y}f.x=i;f.y=h;this.getTranslatable().translate(i,h,b)},getOffset:function(){return this.offset},refreshConstraint:function(){this.setConstraint(this.currentConstraint)},refreshOffset:function(){var a=this.offset;this.setOffset(a.x,a.y)},doRefresh:function(){this.refreshConstraint();this.getTranslatable().refresh();this.refreshOffset()},refresh:function(){if(this.sizeMonitor){this.sizeMonitor.refresh()}if(this.containerSizeMonitor){this.containerSizeMonitor.refresh()}this.doRefresh()},enable:function(){return this.setDisabled(false)},disable:function(){return this.setDisabled(true)},destroy:function(){var a=this.getTranslatable();Ext.destroy(this.containerSizeMonitor,this.sizeMonitor);delete this.sizeMonitor;delete this.containerSizeMonitor;var b=this.getElement();if(b&&!b.isDestroyed){b.removeCls(this.getCls())}this.detachListeners();if(a){a.destroy()}}},function(){});Ext.define("Ext.behavior.Draggable",{extend:"Ext.behavior.Behavior",requires:["Ext.util.Draggable"],constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.draggable.refresh()},setConfig:function(c){var a=this.draggable,b=this.component;if(c){if(!a){b.setTranslatable(true);this.draggable=a=new Ext.util.Draggable(c);a.setTranslatable(b.getTranslatable());a.setElement(b.renderElement);a.on("destroy","onDraggableDestroy",this);if(b.isPainted()){this.onComponentPainted(b)}b.on(this.listeners)}else{if(Ext.isObject(c)){a.setConfig(c)}}}else{if(a){a.destroy()}}return this},getDraggable:function(){return this.draggable},onDraggableDestroy:function(){var a=this.component;delete this.draggable;a.un(this.listeners)},onComponentDestroy:function(){var a=this.draggable;if(a){a.destroy()}}});(function(a){Ext.define("Ext.Component",{extend:"Ext.AbstractComponent",alternateClassName:"Ext.lib.Component",mixins:["Ext.mixin.Traversable"],requires:["Ext.ComponentManager","Ext.XTemplate","Ext.dom.Element","Ext.behavior.Translatable","Ext.behavior.Draggable"],xtype:"component",observableType:"component",cachedConfig:{baseCls:null,cls:null,floatingCls:null,hiddenCls:a+"item-hidden",ui:null,margin:null,padding:null,border:null,styleHtmlCls:a+"html",styleHtmlContent:null},eventedConfig:{left:null,top:null,right:null,bottom:null,width:null,height:null,minWidth:null,minHeight:null,maxWidth:null,maxHeight:null,docked:null,centered:null,hidden:null,disabled:null},config:{style:null,html:null,draggable:null,translatable:null,renderTo:null,zIndex:null,tpl:null,enterAnimation:null,exitAnimation:null,showAnimation:null,hideAnimation:null,tplWriteMode:"overwrite",data:null,disabledCls:a+"item-disabled",contentEl:null,itemId:undefined,record:null,plugins:null},listenerOptionsRegex:/^(?:delegate|single|delay|buffer|args|prepend|element)$/,alignmentRegex:/^([a-z]+)-([a-z]+)(\?)?$/,isComponent:true,floating:false,rendered:false,dockPositions:{top:true,right:true,bottom:true,left:true},innerElement:null,element:null,template:[],constructor:function(c){var d=this,b=d.config,e;d.onInitializedListeners=[];d.initialConfig=c;if(c!==undefined&&"id" in c){e=c.id}else{if("id" in b){e=b.id}else{e=d.getId()}}d.id=e;d.setId(e);Ext.ComponentManager.register(d);d.initElement();d.initConfig(d.initialConfig);d.initialize();d.triggerInitialized();if(d.config.fullscreen){d.fireEvent("fullscreen",d)}d.fireEvent("initialize",d)},beforeInitConfig:function(b){this.beforeInitialize.apply(this,arguments)},beforeInitialize:Ext.emptyFn,initialize:Ext.emptyFn,getTemplate:function(){return this.template},getElementConfig:function(){return{reference:"element",children:this.getTemplate()}},triggerInitialized:function(){var c=this.onInitializedListeners,d=c.length,e,b;if(!this.initialized){this.initialized=true;if(d>0){for(b=0;b0){c.pressedTimeout=setTimeout(function(){delete c.pressedTimeout;if(a){a.addCls(b)}},d)}else{a.addCls(b)}}},onRelease:function(a){this.fireAction("release",[this,a],"doRelease")},doRelease:function(a,b){if(!a.getDisabled()){if(a.hasOwnProperty("pressedTimeout")){clearTimeout(a.pressedTimeout);delete a.pressedTimeout}else{a.element.removeCls(a.getPressedCls())}}},onTap:function(a){if(this.getDisabled()){return false}this.fireAction("tap",[this,a],"doTap")},doTap:function(c,d){var b=c.getHandler(),a=c.getScope()||c;if(!b){return}if(typeof b=="string"){b=a[b]}d.preventDefault();b.apply(a,arguments)}},function(){});Ext.define("Ext.Decorator",{extend:"Ext.Component",isDecorator:true,config:{component:{}},statics:{generateProxySetter:function(a){return function(c){var b=this.getComponent();b[a].call(b,c);return this}},generateProxyGetter:function(a){return function(){var b=this.getComponent();return b[a].call(b)}}},onClassExtended:function(c,e){if(!e.hasOwnProperty("proxyConfig")){return}var f=Ext.Class,i=e.proxyConfig,d=e.config;e.config=(d)?Ext.applyIf(d,i):i;var b,h,g,a;for(b in i){if(i.hasOwnProperty(b)){h=f.getConfigNameMap(b);g=h.set;a=h.get;e[g]=this.generateProxySetter(g);e[a]=this.generateProxyGetter(a)}}},applyComponent:function(a){return Ext.factory(a,Ext.Component)},updateComponent:function(a,b){if(b){if(this.isRendered()&&b.setRendered(false)){b.fireAction("renderedchange",[this,b,false],"doUnsetComponent",this,{args:[b]})}else{this.doUnsetComponent(b)}}if(a){if(this.isRendered()&&a.setRendered(true)){a.fireAction("renderedchange",[this,a,true],"doSetComponent",this,{args:[a]})}else{this.doSetComponent(a)}}},doUnsetComponent:function(a){if(a.renderElement.dom){this.innerElement.dom.removeChild(a.renderElement.dom)}},doSetComponent:function(a){if(a.renderElement.dom){this.innerElement.dom.appendChild(a.renderElement.dom)}},setRendered:function(b){var a;if(this.callParent(arguments)){a=this.getComponent();if(a){a.setRendered(b)}return true}return false},setDisabled:function(a){this.callParent(arguments);this.getComponent().setDisabled(a)},destroy:function(){Ext.destroy(this.getComponent());this.callParent()}});Ext.define("Ext.Img",{extend:"Ext.Component",xtype:["image","img"],config:{src:null,baseCls:Ext.baseCSSPrefix+"img",mode:"background"},beforeInitialize:function(){var a=this;a.onLoad=Ext.Function.bind(a.onLoad,a);a.onError=Ext.Function.bind(a.onError,a)},initialize:function(){var a=this;a.callParent();a.relayEvents(a.renderElement,"*");a.element.on({tap:"onTap",scope:a})},hide:function(){this.callParent();this.hiddenSrc=this.hiddenSrc||this.getSrc();this.setSrc(null)},show:function(){this.callParent();if(this.hiddenSrc){this.setSrc(this.hiddenSrc);delete this.hiddenSrc}},updateMode:function(a){if(a==="background"){if(this.imageElement){this.imageElement.destroy();delete this.imageElement;this.updateSrc(this.getSrc())}}else{this.imageElement=this.element.createChild({tag:"img"})}},onTap:function(a){this.fireEvent("tap",this,a)},onAfterRender:function(){this.updateSrc(this.getSrc())},updateSrc:function(a){var b=this,c;if(b.getMode()==="background"){c=this.imageObject||new Image()}else{c=b.imageElement.dom}this.imageObject=c;c.setAttribute("src",Ext.isString(a)?a:"");c.addEventListener("load",b.onLoad,false);c.addEventListener("error",b.onError,false)},detachListeners:function(){var a=this.imageObject;if(a){a.removeEventListener("load",this.onLoad,false);a.removeEventListener("error",this.onError,false)}},onLoad:function(a){this.detachListeners();if(this.getMode()==="background"){this.element.dom.style.backgroundImage='url("'+this.imageObject.src+'")'}this.fireEvent("load",this,a)},onError:function(a){this.detachListeners();this.fireEvent("error",this,a)},doSetWidth:function(b){var a=(this.getMode()==="background")?this.element:this.imageElement;a.setWidth(b);this.callParent(arguments)},doSetHeight:function(b){var a=(this.getMode()==="background")?this.element:this.imageElement;a.setHeight(b);this.callParent(arguments)},destroy:function(){this.detachListeners();Ext.destroy(this.imageObject);delete this.imageObject;this.callParent()}});Ext.define("Ext.Label",{extend:"Ext.Component",xtype:"label",config:{}});Ext.define("Ext.Map",{extend:"Ext.Component",xtype:"map",requires:["Ext.util.Geolocation"],isMap:true,config:{baseCls:Ext.baseCSSPrefix+"map",useCurrentLocation:false,map:null,geo:null,mapOptions:{}},constructor:function(){this.callParent(arguments);this.element.setVisibilityMode(Ext.Element.OFFSETS);if(!(window.google||{}).maps){this.setHtml("Google Maps API is required")}},initialize:function(){this.callParent();this.on({painted:"doResize",scope:this});this.element.on("touchstart","onTouchStart",this)},onTouchStart:function(a){a.makeUnpreventable()},applyMapOptions:function(a){return Ext.merge({},this.options,a)},updateMapOptions:function(d){var a=this,c=(window.google||{}).maps,b=this.getMap();if(c&&b){b.setOptions(d)}if(d.center&&!a.isPainted()){a.un("painted","setMapCenter",this);a.on("painted","setMapCenter",this,{delay:150,single:true,args:[d.center]})}},getMapOptions:function(){return Ext.merge({},this.options||this.getInitialConfig("mapOptions"))},updateUseCurrentLocation:function(a){this.setGeo(a);if(!a){this.renderMap()}},applyGeo:function(a){return Ext.factory(a,Ext.util.Geolocation,this.getGeo())},updateGeo:function(b,a){var c={locationupdate:"onGeoUpdate",locationerror:"onGeoError",scope:this};if(a){a.un(c)}if(b){b.on(c);b.updateLocation()}},doResize:function(){var b=(window.google||{}).maps,a=this.getMap();if(b&&a){b.event.trigger(a,"resize")}},renderMap:function(){var d=this,f=(window.google||{}).maps,b=d.element,a=d.getMapOptions(),e=d.getMap(),c;if(f){if(Ext.os.is.iPad){Ext.merge({navigationControlOptions:{style:f.NavigationControlStyle.ZOOM_PAN}},a)}a=Ext.merge({zoom:12,mapTypeId:f.MapTypeId.ROADMAP},a);if(!a.hasOwnProperty("center")){a.center=new f.LatLng(37.381592,-122.135672)}if(b.dom.firstChild){Ext.fly(b.dom.firstChild).destroy()}if(e){f.event.clearInstanceListeners(e)}d.setMap(new f.Map(b.dom,a));e=d.getMap();c=f.event;c.addListener(e,"zoom_changed",Ext.bind(d.onZoomChange,d));c.addListener(e,"maptypeid_changed",Ext.bind(d.onTypeChange,d));c.addListener(e,"center_changed",Ext.bind(d.onCenterChange,d));d.fireEvent("maprender",d,e)}},onGeoUpdate:function(a){if(a){this.setMapCenter(new google.maps.LatLng(a.getLatitude(),a.getLongitude()))}},onGeoError:Ext.emptyFn,setMapCenter:function(d){var a=this,c=a.getMap(),b=(window.google||{}).maps;if(b){if(!a.isPainted()){a.un("painted","setMapCenter",this);a.on("painted","setMapCenter",this,{delay:150,single:true,args:[d]});return}d=d||new b.LatLng(37.381592,-122.135672);if(d&&!(d instanceof b.LatLng)&&"longitude" in d){d=new b.LatLng(d.latitude,d.longitude)}if(!c){a.renderMap();c=a.getMap()}if(c&&d instanceof b.LatLng){c.panTo(d)}else{this.options=Ext.apply(this.getMapOptions(),{center:d})}}},onZoomChange:function(){var a=this.getMapOptions(),c=this.getMap(),b;b=(c&&c.getZoom)?c.getZoom():a.zoom||10;this.options=Ext.apply(a,{zoom:b});this.fireEvent("zoomchange",this,c,b)},onTypeChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getMapTypeId)?c.getMapTypeId():b.mapTypeId;this.options=Ext.apply(b,{mapTypeId:a});this.fireEvent("typechange",this,c,a)},onCenterChange:function(){var b=this.getMapOptions(),c=this.getMap(),a;a=(c&&c.getCenter)?c.getCenter():b.center;this.options=Ext.apply(b,{center:a});this.fireEvent("centerchange",this,c,a)},destroy:function(){Ext.destroy(this.getGeo());var a=this.getMap();if(a&&(window.google||{}).maps){google.maps.event.clearInstanceListeners(a)}this.callParent()}},function(){});Ext.define("Ext.Mask",{extend:"Ext.Component",xtype:"mask",config:{baseCls:Ext.baseCSSPrefix+"mask",transparent:false,top:0,left:0,right:0,bottom:0},initialize:function(){this.callParent();this.on({painted:"onPainted",erased:"onErased"})},onPainted:function(){this.element.on("*","onEvent",this)},onErased:function(){this.element.un("*","onEvent",this)},onEvent:function(b){var a=arguments[arguments.length-1];if(a.info.eventName==="tap"){this.fireEvent("tap",this,b);return false}if(b&&b.stopEvent){b.stopEvent()}return false},updateTransparent:function(a){this[a?"addCls":"removeCls"](this.getBaseCls()+"-transparent")}});Ext.define("Ext.LoadMask",{extend:"Ext.Mask",xtype:"loadmask",config:{message:"Loading...",messageCls:Ext.baseCSSPrefix+"mask-message",indicator:true,listeners:{painted:"onPainted",erased:"onErased"}},getTemplate:function(){var a=Ext.baseCSSPrefix;return[{reference:"innerElement",cls:a+"mask-inner",children:[{reference:"indicatorElement",cls:a+"loading-spinner-outer",children:[{cls:a+"loading-spinner",children:[{tag:"span",cls:a+"loading-top"},{tag:"span",cls:a+"loading-right"},{tag:"span",cls:a+"loading-bottom"},{tag:"span",cls:a+"loading-left"}]}]},{reference:"messageElement"}]}]},updateMessage:function(a){this.messageElement.setHtml(a)},updateMessageCls:function(b,a){this.messageElement.replaceCls(a,b)},updateIndicator:function(a){this[a?"removeCls":"addCls"](Ext.baseCSSPrefix+"indicator-hidden")},onPainted:function(){this.getParent().on({scope:this,resize:this.refreshPosition});this.refreshPosition()},onErased:function(){this.getParent().un({scope:this,resize:this.refreshPosition})},refreshPosition:function(){var c=this.getParent(),d=c.getScrollable(),a=(d)?d.getScroller():null,f=(a)?a.position:{x:0,y:0},e=c.element.getSize(),b=this.element.getSize();this.innerElement.setStyle({marginTop:Math.round(e.height-b.height+(f.y*2))+"px",marginLeft:Math.round(e.width-b.width+f.x)+"px"})}},function(){});Ext.define("Ext.Media",{extend:"Ext.Component",xtype:"media",config:{url:"",enableControls:Ext.os.is.Android?false:true,autoResume:false,autoPause:true,preload:true,loop:false,media:null,volume:1,muted:false},initialize:function(){var a=this;a.callParent();a.on({scope:a,activate:a.onActivate,deactivate:a.onDeactivate});a.addMediaListener({canplay:"onCanPlay",play:"onPlay",pause:"onPause",ended:"onEnd",volumechange:"onVolumeChange",timeupdate:"onTimeUpdate"})},addMediaListener:function(d,b){var c=this,e=c.media.dom,f=Ext.Function.bind;if(!Ext.isObject(d)){var a=d;d={};d[a]=b}Ext.Object.each(d,function(h,g){if(typeof g!=="function"){g=c[g]}if(typeof g=="function"){g=f(g,c);e.addEventListener(h,g)}})},onPlay:function(){this.fireEvent("play",this)},onCanPlay:function(){this.fireEvent("canplay",this)},onPause:function(){this.fireEvent("pause",this,this.getCurrentTime())},onEnd:function(){this.fireEvent("ended",this,this.getCurrentTime())},onVolumeChange:function(){this.fireEvent("volumechange",this,this.media.dom.volume)},onTimeUpdate:function(){this.fireEvent("timeupdate",this,this.getCurrentTime())},isPlaying:function(){return !Boolean(this.media.dom.paused)},onActivate:function(){var a=this;if(a.getAutoResume()&&!a.isPlaying()){a.play()}},onDeactivate:function(){var a=this;if(a.getAutoResume()&&a.isPlaying()){a.pause()}},updateUrl:function(a){var b=this.media.dom;b.src=a;if("load" in b){b.load()}if(this.isPlaying()){this.play()}},updateEnableControls:function(a){this.media.dom.controls=a?"controls":false},updateLoop:function(a){this.media.dom.loop=a?"loop":false},play:function(){var a=this.media.dom;if("play" in a){a.play();setTimeout(function(){a.play()},10)}},pause:function(){var a=this.media.dom;if("pause" in a){a.pause()}},toggle:function(){if(this.isPlaying()){this.pause()}else{this.play()}},stop:function(){var a=this;a.setCurrentTime(0);a.fireEvent("stop",a);a.pause()},updateVolume:function(a){this.media.dom.volume=a},updateMuted:function(a){this.fireEvent("mutedchange",this,a);this.media.dom.muted=a},getCurrentTime:function(){return this.media.dom.currentTime},setCurrentTime:function(a){this.media.dom.currentTime=a;return a},getDuration:function(){return this.media.dom.duration},destroy:function(){var a=this;Ext.Object.each(event,function(c,b){if(typeof b!=="function"){b=a[b]}if(typeof b=="function"){b=bind(b,a);dom.removeEventListener(c,b)}})}});Ext.define("Ext.Audio",{extend:"Ext.Media",xtype:"audio",config:{cls:Ext.baseCSSPrefix+"audio"},onActivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.show()}},onDeactivate:function(){var a=this;a.callParent();if(Ext.os.is.Phone){a.element.hide()}},template:[{reference:"media",preload:"auto",tag:"audio",cls:Ext.baseCSSPrefix+"component"}]});Ext.define("Ext.Spacer",{extend:"Ext.Component",alias:"widget.spacer",config:{},constructor:function(a){a=a||{};if(!a.width){a.flex=1}this.callParent([a])}});Ext.define("Ext.Title",{extend:"Ext.Component",xtype:"title",config:{baseCls:"x-title",title:""},updateTitle:function(a){this.setHtml(a)}});Ext.define("Ext.Video",{extend:"Ext.Media",xtype:"video",config:{posterUrl:null,cls:Ext.baseCSSPrefix+"video"},template:[{reference:"ghost",classList:[Ext.baseCSSPrefix+"video-ghost"]},{tag:"video",reference:"media",classList:[Ext.baseCSSPrefix+"media"]}],initialize:function(){var a=this;a.callParent();a.media.hide();a.onBefore({erased:"onErased",scope:a});a.ghost.on({tap:"onGhostTap",scope:a});a.media.on({pause:"onPause",scope:a});if(Ext.os.is.Android4||Ext.os.is.iPad){this.isInlineVideo=true}},applyUrl:function(a){return[].concat(a)},updateUrl:function(f){var c=this,e=c.media,g=f.length,d=e.query("source"),b=d.length,a;for(a=0;a0){a.pop().destroy()}},setActiveIndex:function(b){var e=this.indicators,d=this.activeIndex,a=e[d],f=e[b],c=this.getBaseCls();if(a){a.removeCls(c,null,"active")}if(f){f.addCls(c,null,"active")}this.activeIndex=b;return this},onTap:function(f){var g=f.touch,a=this.element.getPageBox(),d=a.left+(a.width/2),b=a.top+(a.height/2),c=this.getDirection();if((c==="horizontal"&&g.pageX>=d)||(c==="vertical"&&g.pageY>=b)){this.fireEvent("next",this)}else{this.fireEvent("previous",this)}},destroy:function(){var d=this.indicators,b,c,a;for(b=0,c=d.length;bd.bottom||a.yd.right||a.x div",scope:this})},initialize:function(){this.callParent();this.doInitialize()},updateBaseCls:function(a,b){var c=this;c.callParent([a+"-container",b])},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,Ext.get(c),a,d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);Ext.get(c).un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,Ext.get(c),a,d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtouchmove",b,Ext.get(c),a,d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtap",b,Ext.get(c),a,d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemtaphold",b,Ext.get(c),a,d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemdoubletap",b,Ext.get(c),a,d)},onItemSingleTap:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemsingletap",b,Ext.get(c),a,d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=b.getViewItems().indexOf(c);b.fireEvent("itemswipe",b,Ext.get(c),a,d)},updateListItem:function(b,d){var c=this,a=c.dataview,e=a.prepareData(b.getData(true),a.getStore().indexOf(b),b);d.innerHTML=c.dataview.getItemTpl().apply(e)},addListItem:function(e,c){var h=this,d=h.dataview,a=d.prepareData(c.getData(true),d.getStore().indexOf(c),c),b=h.element,i=b.dom.childNodes,g=i.length,f;f=Ext.Element.create(this.getItemElementConfig(e,a));if(!g||e==g){f.appendTo(b)}else{f.insertBefore(i[e])}},getItemElementConfig:function(c,e){var b=this.dataview,d=b.getItemCls(),a=b.getBaseCls()+"-item";if(d){a+=" "+d}return{cls:a,html:b.getItemTpl().apply(e)}},doRemoveItemCls:function(a){var d=this.getViewItems(),c=d.length,b=0;for(;b=0;b--){c=a[f+b];c.parentNode.removeChild(c)}if(d.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(d){var g=this,b=g.dataview,c=b.getStore(),f=d.length,e,a;if(f){b.hideEmptyText()}for(e=0;eh._tmpIndex?1:-1});for(e=0;e(?:[\s]*)|(?:\s*))([\w\-]+)$/i,handledEvents:["*"],getSubscribers:function(b,a){var d=this.subscribers,c=d[b];if(!c&&a){c=d[b]={type:{$length:0},selector:[],$length:0}}return c},subscribe:function(g,f){if(this.idSelectorRegex.test(g)){return false}var e=g.match(this.optimizedSelectorRegex),a=this.getSubscribers(f,true),k=a.type,c=a.selector,d,i,j,b,h;if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=k[j];if(!b){k[j]=b={descendents:{$length:0},children:{$length:0},$length:0}}h=i?b.descendents:b.children;if(h.hasOwnProperty(d)){h[d]++;return true}h[d]=1;h.$length++;b.$length++;k.$length++}else{if(c.hasOwnProperty(g)){c[g]++;return true}c[g]=1;c.push(g)}a.$length++;return true},unsubscribe:function(g,f,k){var a=this.getSubscribers(f);if(!a){return false}var e=g.match(this.optimizedSelectorRegex),l=a.type,c=a.selector,d,i,j,b,h;k=Boolean(k);if(e!==null){d=e[1];i=e[2].indexOf(">")===-1;j=e[3];b=l[j];if(!b){return true}h=i?b.descendents:b.children;if(!h.hasOwnProperty(d)||(!k&&--h[d]>0)){return true}delete h[d];h.$length--;b.$length--;l.$length--}else{if(!c.hasOwnProperty(g)||(!k&&--c[g]>0)){return true}delete c[g];Ext.Array.remove(c,g)}if(--a.$length===0){delete this.subscribers[f]}return true},notify:function(d,a){var c=this.getSubscribers(a),e,b;if(!c||c.$length===0){return false}e=d.substr(1);b=Ext.ComponentManager.get(e);if(b){this.dispatcher.doAddListener(this.targetType,d,a,"publish",this,{args:[a,b]},"before")}},matchesSelector:function(b,a){return Ext.ComponentQuery.is(b,a)},dispatch:function(d,b,c,a){this.dispatcher.doDispatchEvent(this.targetType,d,b,c,null,a)},publish:function(g,k){var e=this.getSubscribers(g);if(!e){return}var p=arguments[arguments.length-1],o=e.type,b=e.selector,d=Array.prototype.slice.call(arguments,2,-2),l=k.xtypesChain,s,n,t,a,m,v,r,u,h,f,q,c;for(u=0,h=l.length;u0){s=e.descendents;if(s.$length>0){if(!a){a=k.getAncestorIds()}for(q=0,c=a.length;q0){if(!t){if(a){t=a[0]}else{v=k.getParent();if(v){t=v.getId()}}}if(t){if(n.hasOwnProperty(t)){this.dispatch("#"+t+" > "+f,g,d,p)}}}}}h=b.length;if(h>0){for(u=0;uf){d=e}}c.setValue(d);d=c.getValue();c.fireEvent("spin",c,d,g);c.fireEvent("spin"+g,c,d)},doSetDisabled:function(a){Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},reset:function(){this.setValue(this.getDefaultValue())},destroy:function(){var a=this;Ext.destroy(a.downRepeater,a.upRepeater,a.spinDownButton,a.spinUpButton);a.callParent(arguments)}},function(){});Ext.define("Ext.field.TextAreaInput",{extend:"Ext.field.Input",xtype:"textareainput",tag:"textarea"});Ext.define("Ext.field.TextArea",{extend:"Ext.field.Text",xtype:"textareafield",requires:["Ext.field.TextAreaInput"],alternateClassName:"Ext.form.TextArea",config:{ui:"textarea",autoCapitalize:false,component:{xtype:"textareainput"},maxRows:null},updateMaxRows:function(a){this.getComponent().setMaxRows(a)},doSetHeight:function(a){this.callParent(arguments);var b=this.getComponent();b.input.setHeight(a)},doSetWidth:function(b){this.callParent(arguments);var a=this.getComponent();a.input.setWidth(b)},doKeyUp:function(a){var b=a.getValue();a[b?"showClearIcon":"hideClearIcon"]()}});Ext.define("Ext.field.Url",{extend:"Ext.field.Text",xtype:"urlfield",alternateClassName:"Ext.form.Url",config:{autoCapitalize:false,component:{type:"url"}}});Ext.define("Ext.plugin.ListPaging",{extend:"Ext.Component",alias:"plugin.listpaging",config:{autoPaging:false,loadMoreText:"Load More...",noMoreRecordsText:"No More Records",loadTpl:['
','','','','',"
",'
{message}
'].join(""),loadMoreCmp:{xtype:"component",baseCls:Ext.baseCSSPrefix+"list-paging"},loadMoreCmpAdded:false,loadingCls:Ext.baseCSSPrefix+"loading",list:null,scroller:null,loading:false},init:function(c){var a=c.getScrollable().getScroller(),b=c.getStore();this.setList(c);this.setScroller(a);this.bindStore(c.getStore());if(b){this.disableDataViewMask(b)}c.updateStore=Ext.Function.createInterceptor(c.updateStore,this.bindStore,this);if(this.getAutoPaging()){a.on({scrollend:this.onScrollEnd,scope:this})}},bindStore:function(a,b){if(b){b.un({load:this.onStoreLoad,beforeload:this.onStoreBeforeLoad,scope:this})}if(a){a.on({load:this.onStoreLoad,beforeload:this.onStoreBeforeLoad,scope:this})}},disableDataViewMask:function(a){var b=this.getList();if(a.isAutoLoading()){b.setLoadingText(null)}else{a.on({load:{single:true,fn:function(){b.setLoadingText(null)}}})}},applyLoadTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},applyLoadMoreCmp:function(a){a=Ext.merge(a,{html:this.getLoadTpl().apply({cssPrefix:Ext.baseCSSPrefix,message:this.getLoadMoreText()}),listeners:{tap:{fn:this.loadNextPage,scope:this,element:"element"}}});return Ext.factory(a,Ext.Component,this.getLoadMoreCmp())},onScrollEnd:function(b,a,c){if(!this.getLoading()&&c>=b.maxPosition.y){this.loadNextPage()}},updateLoading:function(a){var b=this.getLoadMoreCmp(),c=this.getLoadingCls();if(a){b.addCls(c)}else{b.removeCls(c)}},onStoreBeforeLoad:function(a){if(a.getCount()===0){this.getLoadMoreCmp().hide()}},onStoreLoad:function(a){var d=this.addLoadMoreCmp(),b=this.getLoadTpl(),c=this.storeFullyLoaded()?this.getNoMoreRecordsText():this.getLoadMoreText();this.getLoadMoreCmp().show();this.setLoading(false);if(this.scrollY){this.getScroller().scrollTo(null,this.scrollY);delete this.scrollY}d.setHtml(b.apply({cssPrefix:Ext.baseCSSPrefix,message:c}))},addLoadMoreCmp:function(){var b=this.getList(),a=this.getLoadMoreCmp();if(!this.getLoadMoreCmpAdded()){b.add(a);b.fireEvent("loadmorecmpadded",this,b);this.setLoadMoreCmpAdded(true)}return a},storeFullyLoaded:function(){var a=this.getList().getStore(),b=a.getTotalCount();return b!==null?a.getTotalCount()<=(a.currentPage*a.getPageSize()):false},loadNextPage:function(){var a=this;if(!a.storeFullyLoaded()){a.setLoading(true);a.scrollY=a.getScroller().position.y;a.getList().getStore().nextPage({addRecords:true})}}});Ext.define("Ext.plugin.PullRefresh",{extend:"Ext.Component",alias:"plugin.pullrefresh",requires:["Ext.DateExtras"],config:{list:null,pullRefreshText:"Pull down to refresh...",releaseRefreshText:"Release to refresh...",loadingText:"Loading...",snappingAnimationDuration:150,refreshFn:null,pullTpl:['
','
','
','','','','',"
",'
','

{message}

','
Last Updated: {lastUpdated:date("m/d/Y h:iA")}
',"
","
"].join("")},isRefreshing:false,currentViewState:"",initialize:function(){this.callParent();this.on({painted:"onPainted",scope:this})},init:function(f){var d=this,b=f.getStore(),e=d.getPullTpl(),c=d.element,a=f.getScrollable().getScroller();d.setList(f);d.lastUpdated=new Date();f.insert(0,d);if(b){if(b.isAutoLoading()){f.setLoadingText(null)}else{b.on({load:{single:true,fn:function(){f.setLoadingText(null)}}})}}e.overwrite(c,{message:d.getPullRefreshText(),lastUpdated:d.lastUpdated},true);d.loadingElement=c.getFirstChild();d.messageEl=c.down(".x-list-pullrefresh-message");d.updatedEl=c.down(".x-list-pullrefresh-updated > span");d.maxScroller=a.getMaxPosition();a.on({maxpositionchange:d.setMaxScroller,scroll:d.onScrollChange,scope:d})},fetchLatest:function(){var b=this.getList().getStore(),c=b.getProxy(),a;a=Ext.create("Ext.data.Operation",{page:1,start:0,model:b.getModel(),limit:b.getPageSize(),action:"read",filters:b.getRemoteFilter()?b.getFilters():[]});c.read(a,this.onLatestFetched,this)},onLatestFetched:function(d){var j=this.getList().getStore(),b=j.getData(),c=d.getRecords(),a=c.length,g=[],h,f,e;for(e=0;ethis.maxScroller.y){this.onBounceBottom(c)}},applyPullTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},onBounceTop:function(d){var b=this,c=b.getList(),a=c.getScrollable().getScroller();if(!b.isReleased){if(!b.isRefreshing&&-d>=b.pullHeight+10){b.isRefreshing=true;b.setViewState("release");a.getContainer().onBefore({dragend:"onScrollerDragEnd",single:true,scope:b})}else{if(b.isRefreshing&&-d=1){a=Math.round((f-1)*b);e=this.applyLength(d-a);a=d-e;this.updateLength(e);g=c+a}else{g=c*f}}this.setOffset(g)},setOffset:function(c){var a=this.getAxis(),b=this.element.dom.style;c=Math.round(c);if(a==="x"){b.webkitTransform="translate3d("+c+"px, 0, 0)"}else{b.webkitTransform="translate3d(0, "+c+"px, 0)"}}});Ext.define("Ext.scroll.indicator.Default",{extend:"Ext.scroll.indicator.Abstract",config:{cls:"default"},setOffset:function(c){var b=this.getAxis(),a=this.element.dom.style;if(b==="x"){a.webkitTransform="translate3d("+c+"px, 0, 0)"}else{a.webkitTransform="translate3d(0, "+c+"px, 0)"}},applyLength:function(a){return Math.round(Math.max(0,a))},updateValue:function(f){var b=this.barLength,c=this.gapLength,d=this.getLength(),e,g,a;if(f<=0){g=0;this.updateLength(this.applyLength(d+f*b))}else{if(f>=1){a=Math.round((f-1)*b);e=this.applyLength(d-a);a=d-e;this.updateLength(e);g=c+a}else{g=c*f}}this.setOffset(g)}});Ext.define("Ext.scroll.indicator.ScrollPosition",{extend:"Ext.scroll.indicator.Abstract",config:{cls:"scrollposition"},getElementConfig:function(){var a=this.callParent(arguments);a.children.unshift({className:"x-scroll-bar-stretcher"});return a},updateValue:function(a){if(this.gapLength===0){if(a>1){a=a-1}this.setOffset(this.barLength*a)}else{this.setOffset(this.gapLength*a)}},setLength:function(e){var c=this.getAxis(),a=this.barLength,d=this.barElement.dom,b=this.element;this.callParent(arguments);if(c==="x"){d.scrollLeft=a;b.setLeft(a)}else{d.scrollTop=a;b.setTop(a)}},setOffset:function(d){var b=this.getAxis(),a=this.barLength,c=this.barElement.dom;d=a-d;if(b==="x"){c.scrollLeft=d}else{c.scrollTop=d}}});Ext.define("Ext.scroll.Indicator",{requires:["Ext.scroll.indicator.Default","Ext.scroll.indicator.ScrollPosition","Ext.scroll.indicator.CssTransform"],alternateClassName:"Ext.util.Indicator",constructor:function(a){if(Ext.os.is.Android2||Ext.browser.is.ChromeMobile){return new Ext.scroll.indicator.ScrollPosition(a)}else{if(Ext.os.is.iOS){return new Ext.scroll.indicator.CssTransform(a)}else{return new Ext.scroll.indicator.Default(a)}}}});Ext.define("Ext.scroll.View",{extend:"Ext.Evented",alternateClassName:"Ext.util.ScrollView",requires:["Ext.scroll.Scroller","Ext.scroll.Indicator"],config:{indicatorsUi:"dark",element:null,scroller:{},indicators:{x:{axis:"x"},y:{axis:"y"}},indicatorsHidingDelay:100,cls:Ext.baseCSSPrefix+"scroll-view"},processConfig:function(c){if(!c){return null}if(typeof c=="string"){c={direction:c}}c=Ext.merge({},c);var a=c.scroller,b;if(!a){c.scroller=a={}}for(b in c){if(c.hasOwnProperty(b)){if(!this.hasConfig(b)){a[b]=c[b];delete c[b]}}}return c},constructor:function(a){a=this.processConfig(a);this.useIndicators={x:true,y:true};this.doHideIndicators=Ext.Function.bind(this.doHideIndicators,this);this.initConfig(a)},setConfig:function(a){return this.callParent([this.processConfig(a)])},updateIndicatorsUi:function(a){var b=this.getIndicators();b.x.setUi(a);b.y.setUi(a)},applyScroller:function(a,b){return Ext.factory(a,Ext.scroll.Scroller,b)},applyIndicators:function(b,d){var a=Ext.scroll.Indicator,c=this.useIndicators;if(!b){b={}}if(!b.x){c.x=false;b.x={}}if(!b.y){c.y=false;b.y={}}return{x:Ext.factory(b.x,a,d&&d.x),y:Ext.factory(b.y,a,d&&d.y)}},updateIndicators:function(a){this.indicatorsGrid=Ext.Element.create({className:"x-scroll-bar-grid-wrapper",children:[{className:"x-scroll-bar-grid",children:[{children:[{},{children:[a.y.barElement]}]},{children:[{children:[a.x.barElement]},{}]}]}]})},updateScroller:function(a){a.on({scope:this,scrollstart:"onScrollStart",scroll:"onScroll",scrollend:"onScrollEnd",refresh:"refreshIndicators"})},isAxisEnabled:function(a){return this.getScroller().isAxisEnabled(a)&&this.useIndicators[a]},applyElement:function(a){if(a){return Ext.get(a)}},updateElement:function(c){var b=c.getFirstChild().getFirstChild(),a=this.getScroller();c.addCls(this.getCls());c.insertFirst(this.indicatorsGrid);a.setElement(b);this.refreshIndicators();return this},showIndicators:function(){var a=this.getIndicators();if(this.hasOwnProperty("indicatorsHidingTimer")){clearTimeout(this.indicatorsHidingTimer);delete this.indicatorsHidingTimer}if(this.isAxisEnabled("x")){a.x.show()}if(this.isAxisEnabled("y")){a.y.show()}},hideIndicators:function(){var a=this.getIndicatorsHidingDelay();if(a>0){this.indicatorsHidingTimer=setTimeout(this.doHideIndicators,a)}else{this.doHideIndicators()}},doHideIndicators:function(){var a=this.getIndicators();if(this.isAxisEnabled("x")){a.x.hide()}if(this.isAxisEnabled("y")){a.y.hide()}},onScrollStart:function(){this.onScroll.apply(this,arguments);this.showIndicators()},onScrollEnd:function(){this.hideIndicators()},onScroll:function(b,a,c){this.setIndicatorValue("x",a);this.setIndicatorValue("y",c)},setIndicatorValue:function(b,f){if(!this.isAxisEnabled(b)){return this}var a=this.getScroller(),c=a.getMaxPosition()[b],e=a.getContainerSize()[b],d;if(c===0){d=f/e;if(f>=0){d+=1}}else{if(f>c){d=1+((f-c)/e)}else{if(f<0){d=f/e}else{d=f/c}}}this.getIndicators()[b].setValue(d)},refreshIndicator:function(d){if(!this.isAxisEnabled(d)){return this}var a=this.getScroller(),b=this.getIndicators()[d],e=a.getContainerSize()[d],f=a.getSize()[d],c=e/f;b.setRatio(c);b.refresh()},refresh:function(){return this.getScroller().refresh()},refreshIndicators:function(){var a=this.getIndicators();a.x.setActive(this.isAxisEnabled("x"));a.y.setActive(this.isAxisEnabled("y"));this.refreshIndicator("x");this.refreshIndicator("y")},destroy:function(){var a=this.getElement(),b=this.getIndicators();if(a&&!a.isDestroyed){a.removeCls(this.getCls())}b.x.destroy();b.y.destroy();Ext.destroy(this.getScroller(),this.indicatorsGrid);delete this.indicatorsGrid;this.callParent(arguments)}});Ext.define("Ext.behavior.Scrollable",{extend:"Ext.behavior.Behavior",requires:["Ext.scroll.View"],constructor:function(){this.listeners={painted:"onComponentPainted",scope:this};this.callParent(arguments)},onComponentPainted:function(){this.scrollView.refresh()},setConfig:function(d){var b=this.scrollView,c=this.component,e,a;if(d){if(!b){this.scrollView=b=new Ext.scroll.View(d);b.on("destroy","onScrollViewDestroy",this);c.setUseBodyElement(true);this.scrollerElement=a=c.innerElement;this.scrollContainer=a.wrap();this.scrollViewElement=e=c.bodyElement;b.setElement(e);if(c.isPainted()){this.onComponentPainted(c)}c.on(this.listeners)}else{if(Ext.isString(d)||Ext.isObject(d)){b.setConfig(d)}}}else{if(b){b.destroy()}}return this},getScrollView:function(){return this.scrollView},onScrollViewDestroy:function(){var b=this.component,a=this.scrollerElement;if(!a.isDestroyed){this.scrollerElement.unwrap()}this.scrollContainer.destroy();b.un(this.listeners);delete this.scrollerElement;delete this.scrollView;delete this.scrollContainer},onComponentDestroy:function(){var a=this.scrollView;if(a){a.destroy()}}});Ext.define("Ext.Container",{extend:"Ext.Component",alternateClassName:"Ext.lib.Container",requires:["Ext.layout.Layout","Ext.ItemCollection","Ext.behavior.Scrollable","Ext.Mask"],xtype:"container",eventedConfig:{activeItem:0},config:{layout:null,control:{},defaults:null,items:null,autoDestroy:true,defaultType:null,scrollable:null,useBodyElement:null,masked:null,modal:null,hideOnMaskTap:null},isContainer:true,delegateListeners:{delegate:"> component",centeredchange:"onItemCenteredChange",dockedchange:"onItemDockedChange",floatingchange:"onItemFloatingChange"},constructor:function(a){var b=this;b._items=b.items=new Ext.ItemCollection();b.innerItems=[];b.onItemAdd=b.onFirstItemAdd;b.callParent(arguments)},getElementConfig:function(){return{reference:"element",className:"x-container",children:[{reference:"innerElement",className:"x-inner"}]}},applyMasked:function(a,b){b=Ext.factory(a,Ext.Mask,b);if(b){this.add(b)}return b},mask:function(a){this.setMasked(a||true)},unmask:function(){this.setMasked(false)},applyModal:function(a,b){if(!a&&!b){return}return Ext.factory(a,Ext.Mask,b)},updateModal:function(c,a){var b={painted:"refreshModalMask",erased:"destroyModalMask"};if(c){this.on(b);c.on("destroy","onModalDestroy",this);if(this.getTop()===null&&this.getBottom()===null&&this.getRight()===null&&this.getLeft()===null&&!this.getCentered()){this.setTop(0);this.setLeft(0)}if(this.isPainted()){this.refreshModalMask()}}else{if(a){a.un("destroy","onModalDestroy",this);this.un(b)}}},onModalDestroy:function(){this.setModal(null)},refreshModalMask:function(){var b=this.getModal(),a=this.getParent();if(!this.painted){this.painted=true;if(b){a.insertBefore(b,this);b.setZIndex(this.getZIndex()-1);if(this.getHideOnMaskTap()){b.on("tap","hide",this,{single:true})}}}},destroyModalMask:function(){var b=this.getModal(),a=this.getParent();if(this.painted){this.painted=false;if(b){b.un("tap","hide",this);a.remove(b,false)}}},updateZIndex:function(b){var a=this.getModal();this.callParent(arguments);if(a){a.setZIndex(b-1)}},updateBaseCls:function(a,b){var c=this,d=c.getUi();if(a){this.element.addCls(a);this.innerElement.addCls(a,null,"inner");if(d){this.element.addCls(a,null,d)}}if(b){this.element.removeCls(b);this.innerElement.removeCls(a,null,"inner");if(d){this.element.removeCls(b,null,d)}}},updateUseBodyElement:function(a){if(a){this.bodyElement=this.innerElement.wrap({cls:"x-body"});this.referenceList.push("bodyElement")}},applyItems:function(a,b){if(a){this.getDefaultType();this.getDefaults();if(this.initialized&&b.length>0){this.removeAll()}this.add(a)}},applyControl:function(c){var a,b,e,d;for(a in c){d=c[a];for(b in d){e=d[b];if(Ext.isObject(e)){e.delegate=a}}d.delegate=a;this.addListener(d)}return c},onFirstItemAdd:function(){delete this.onItemAdd;this.setLayout(new Ext.layout.Layout(this,this.getLayout()||"default"));if(this.innerHtmlElement&&!this.getHtml()){this.innerHtmlElement.destroy();delete this.innerHtmlElement}this.on(this.delegateListeners);return this.onItemAdd.apply(this,arguments)},updateDefaultType:function(a){this.defaultItemClass=Ext.ClassManager.getByAlias("widget."+a)},applyDefaults:function(a){if(a){this.factoryItem=this.factoryItemWithDefaults;return a}},factoryItem:function(a){return Ext.factory(a,this.defaultItemClass)},factoryItemWithDefaults:function(c){var b=this,d=b.getDefaults(),a;if(!d){return Ext.factory(c,b.defaultItemClass)}if(c.isComponent){a=c;if(d&&c.isInnerItem()&&!b.has(a)){a.setConfig(d,true)}}else{if(d&&!c.ignoreDefaults){if(!(c.hasOwnProperty("left")&&c.hasOwnProperty("right")&&c.hasOwnProperty("top")&&c.hasOwnProperty("bottom")&&c.hasOwnProperty("docked")&&c.hasOwnProperty("centered"))){c=Ext.mergeIf({},c,d)}}a=Ext.factory(c,b.defaultItemClass)}return a},add:function(a){var e=this,b,d,c,f;a=Ext.Array.from(a);d=a.length;for(b=0;b0&&c.isInnerItem()){f=c}}if(f){this.setActiveItem(f)}return c},doAdd:function(d){var c=this,a=c.getItems(),b;if(!a.has(d)){b=a.length;a.add(d);if(d.isInnerItem()){c.insertInner(d)}d.setParent(c);c.onItemAdd(d,b)}},remove:function(d,b){var c=this,a=c.indexOf(d),e=c.getInnerItems();if(b===undefined){b=c.getAutoDestroy()}if(a!==-1){if(!c.removingAll&&e.length>1&&d===c.getActiveItem()){c.on({activeitemchange:"doRemove",scope:c,single:true,order:"after",args:[d,a,b]});c.doResetActiveItem(e.indexOf(d))}else{c.doRemove(d,a,b);if(e.length===0){c.setActiveItem(null)}}}return c},doResetActiveItem:function(a){if(a===0){this.setActiveItem(1)}else{this.setActiveItem(0)}},doRemove:function(d,a,b){var c=this;c.items.remove(d);if(d.isInnerItem()){c.removeInner(d)}c.onItemRemove(d,a,b);d.setParent(null);if(b){d.destroy()}},removeAll:function(c,f){var a=this.items,e=a.length,b=0,d;if(c===undefined){c=this.getAutoDestroy()}f=Boolean(f);this.removingAll=true;for(;b=0;b--){c.insert(a,d[b])}return c}d=this.factoryItem(d);this.doInsert(a,d);return d},doInsert:function(d,f){var e=this,b=e.items,c=b.length,a,g;g=f.isInnerItem();if(d>c){d=c}if(b[d-1]===f){return e}a=e.indexOf(f);if(a!==-1){if(a "+a)[0]||null},down:function(a){return this.query(a)[0]||null},destroy:function(){var a=this.getModal();if(a){a.destroy()}this.removeAll(true,true);Ext.destroy(this.getScrollable(),this.bodyElement);this.callParent()}},function(){this.addMember("defaultItemClass",this)});Ext.define("Ext.Panel",{extend:"Ext.Container",requires:["Ext.util.LineSegment"],alternateClassName:"Ext.lib.Panel",xtype:"panel",isPanel:true,config:{baseCls:Ext.baseCSSPrefix+"panel",bodyPadding:null,bodyMargin:null,bodyBorder:null},getElementConfig:function(){var a=this.callParent();a.children.push({reference:"tipElement",className:"x-anchor",hidden:true});return a},applyBodyPadding:function(a){if(a===true){a=5}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyPadding:function(a){this.element.setStyle("padding",a)},applyBodyMargin:function(a){if(a===true){a=5}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyMargin:function(a){this.element.setStyle("margin",a)},applyBodyBorder:function(a){if(a===true){a=1}if(a){a=Ext.dom.Element.unitizeBox(a)}return a},updateBodyBorder:function(a){this.element.setStyle("border-width",a)},alignTo:function(m){var w=this.tipElement;w.hide();if(this.currentTipPosition){w.removeCls("x-anchor-"+this.currentTipPosition)}this.callParent(arguments);var f=Ext.util.LineSegment,d=m.isComponent?m.renderElement:m,a=this.renderElement,n=d.getPageBox(),k=a.getPageBox(),b=k.left,t=k.top,C=k.right,h=k.bottom,j=b+(k.width/2),i=t+(k.height/2),o={x:b,y:t},l={x:C,y:t},B={x:b,y:h},D={x:C,y:h},y={x:j,y:i},s=n.left+(n.width/2),q=n.top+(n.height/2),v={x:s,y:q},c=new f(y,v),g=0,A=0,e,z,r,p,x,u;w.setVisibility(false);w.show();e=w.getSize();z=e.width;r=e.height;if(c.intersects(new f(o,l))){x=Math.min(Math.max(s,b),C-(z/2));u=t;A=r+10;p="top"}else{if(c.intersects(new f(o,B))){x=b;u=Math.min(Math.max(q+(z/2),t),h);g=r+10;p="left"}else{if(c.intersects(new f(B,D))){x=Math.min(Math.max(s,b),C-(z/2));u=h;A=-r-10;p="bottom"}else{if(c.intersects(new f(l,D))){x=C;u=Math.min(Math.max(q-(z/2),t),h);g=-r-10;p="right"}}}}if(x||u){this.currentTipPosition=p;w.addCls("x-anchor-"+p);w.setLeft(x-b);w.setTop(u-t);w.setVisibility(true);this.setLeft(this.getLeft()+g);this.setTop(this.getTop()+A)}}});Ext.define("Ext.SegmentedButton",{extend:"Ext.Container",xtype:"segmentedbutton",requires:["Ext.Button"],config:{baseCls:Ext.baseCSSPrefix+"segmentedbutton",pressedCls:Ext.baseCSSPrefix+"button-pressed",allowMultiple:false,allowDepress:null,pressedButtons:[],layout:{type:"hbox",align:"stretch"},defaultType:"button"},initialize:function(){var a=this;a.callParent();a.on({delegate:"> button",scope:a,tap:"onButtonRelease"});a.onAfter({delegate:"> button",scope:a,hiddenchange:"onButtonHiddenChange"})},updateAllowMultiple:function(){if(!this.initialized&&!this.getInitialConfig().hasOwnProperty("allowDepress")){this.setAllowDepress(true)}},applyItems:function(){var e=this,f=[],d,b,c,a;e.callParent(arguments);a=this.getItems();d=a.length;for(b=0;b=0;b--){c=a.items[b];if(!c.isHidden()){c.addCls(e+"last");break}}},applyPressedButtons:function(a){var e=this,f=[],c,d,b;if(Ext.isArray(a)){d=a.length;for(b=0;bm){c.renderElement.setWidth(m)}}var j=this.spacer.renderElement.getPageBox(),k=f.getPageBox(),g=k.width-j.width,d=k.left,i=k.right,b,l,e;if(g>0){f.setWidth(j.width);b=g/2;d+=b;i-=b}l=j.left-d;e=i-j.right;if(l>0){f.setLeft(l)}else{if(e>0){f.setLeft(-e)}}f.repaint()},updateTitle:function(a){this.titleComponent.setTitle(a);if(this.isPainted()){this.refreshTitlePosition()}}});Ext.define("Ext.Toolbar",{extend:"Ext.Container",xtype:"toolbar",requires:["Ext.Button","Ext.Title","Ext.Spacer"],isToolbar:true,config:{baseCls:Ext.baseCSSPrefix+"toolbar",ui:"dark",title:null,defaultType:"button",layout:{type:"hbox",align:"center"}},constructor:function(a){a=a||{};if(a.docked=="left"||a.docked=="right"){a.layout={type:"vbox",align:"stretch"}}this.callParent([a])},applyTitle:function(a){if(typeof a=="string"){a={title:a,centered:true}}return Ext.factory(a,Ext.Title,this.getTitle())},updateTitle:function(b,a){if(b){this.add(b);this.getLayout().setItemFlex(b,1)}if(a){a.destroy()}},showTitle:function(){var a=this.getTitle();if(a){a.show()}},hideTitle:function(){var a=this.getTitle();if(a){a.hide()}}},function(){});Ext.define("Ext.MessageBox",{extend:"Ext.Sheet",requires:["Ext.Toolbar","Ext.field.Text","Ext.field.TextArea"],config:{ui:"dark",baseCls:Ext.baseCSSPrefix+"msgbox",iconCls:null,showAnimation:{type:"popIn",duration:250,easing:"ease-out"},hideAnimation:{type:"popOut",duration:250,easing:"ease-out"},zIndex:10,defaultTextHeight:75,title:null,buttons:null,message:null,prompt:null,layout:{type:"vbox",pack:"center"}},statics:{OK:{text:"OK",itemId:"ok",ui:"action"},YES:{text:"Yes",itemId:"yes",ui:"action"},NO:{text:"No",itemId:"no"},CANCEL:{text:"Cancel",itemId:"cancel"},INFO:Ext.baseCSSPrefix+"msgbox-info",WARNING:Ext.baseCSSPrefix+"msgbox-warning",QUESTION:Ext.baseCSSPrefix+"msgbox-question",ERROR:Ext.baseCSSPrefix+"msgbox-error",OKCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"OK",itemId:"ok",ui:"action"}],YESNOCANCEL:[{text:"Cancel",itemId:"cancel"},{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}],YESNO:[{text:"No",itemId:"no"},{text:"Yes",itemId:"yes",ui:"action"}]},constructor:function(a){a=a||{};if(a.hasOwnProperty("promptConfig")){Ext.applyIf(a,{prompt:a.promptConfig});delete a.promptConfig}if(a.hasOwnProperty("multiline")||a.hasOwnProperty("multiLine")){a.prompt=a.prompt||{};Ext.applyIf(a.prompt,{multiLine:a.multiline||a.multiLine});delete a.multiline;delete a.multiLine}this.defaultAllowedConfig={};var e=["ui","showAnimation","hideAnimation","title","message","prompt","iconCls","buttons","defaultTextHeight"],d=e.length,b,c;for(b=0;b=a-c&&b<=a+c)},onDragStart:function(f){var d=this.getDirection(),b=f.absDeltaX,a=f.absDeltaY,c=this.getDirectionLock();this.isDragging=true;if(c){if((d==="horizontal"&&b>a)||(d==="vertical"&&a>b)){f.stopPropagation()}else{this.isDragging=false;return}}if(this.isAnimating){this.getActiveCarouselItem().getTranslatable().stopAnimation()}this.dragStartOffset=this.offset;this.dragDirection=0},onDrag:function(j){if(!this.isDragging){return}var k=this.dragStartOffset,l=this.getDirection(),m=l==="horizontal"?j.deltaX:j.deltaY,a=this.offset,i=this.flickStartTime,c=this.dragDirection,b=Ext.Date.now(),h=this.getActiveIndex(),f=this.getMaxItemIndex(),d=c,g;if((h===0&&m>0)||(h===f&&m<0)){m*=0.5}g=k+m;if(g>a){c=1}else{if(g300){this.flickStartOffset=a;this.flickStartTime=b}this.dragDirection=c;this.setOffset(g)},onDragEnd:function(j){if(!this.isDragging){return}this.onDrag(j);this.isDragging=false;var a=Ext.Date.now(),i=this.itemLength,g=i/2,f=this.offset,m=this.getActiveIndex(),c=this.getMaxItemIndex(),h=0,l=f-this.flickStartOffset,b=a-this.flickStartTime,k=this.getIndicator(),d;if(b>0&&Math.abs(l)>=10){d=l/b;if(Math.abs(d)>=1){if(d<0&&m0&&m>0){h=1}}}}if(h===0){if(m0&&f>g){h=1}}}if(k){k.setActiveIndex(m-h)}this.animationDirection=h;this.setOffsetAnimated(h*i)},applyAnimation:function(a){a.easing=Ext.factory(a.easing,Ext.fx.easing.EaseOut);return a},updateDirection:function(b){var a=this.getIndicator();this.currentAxis=(b==="horizontal")?"x":"y";if(a){a.setDirection(b)}},setOffset:function(e){var k=this.orderedCarouselItems,c=this.getBufferSize(),g=k[c],j=this.itemLength,d=this.currentAxis,a,h,b,f;this.offset=e;e+=this.itemOffset;if(g){g.translateAxis(d,e);for(f=1,b=0;f<=c;f++){h=k[c-f];if(h){b+=j;h.translateAxis(d,e-b)}}for(f=1,b=0;f<=c;f++){a=k[c+f];if(a){b+=j;a.translateAxis(d,e+b)}}}return this},setOffsetAnimated:function(c){var b=this.orderedCarouselItems[this.getBufferSize()],a=this.getIndicator();if(a){a.setActiveIndex(this.getActiveIndex()-this.animationDirection)}this.offset=c;c+=this.itemOffset;if(b){this.isAnimating=true;b.getTranslatable().on(this.animationListeners);b.translateAxis(this.currentAxis,c,this.getAnimation())}return this},onActiveItemAnimationFrame:function(k){var j=this.orderedCarouselItems,c=this.getBufferSize(),h=this.itemLength,d=this.currentAxis,e=k[d],g,a,f,b;for(f=1,b=0;f<=c;f++){g=j[c-f];if(g){b+=h;g.translateAxis(d,e-b)}}for(f=1,b=0;f<=c;f++){a=j[c+f];if(a){b+=h;a.translateAxis(d,e+b)}}},onActiveItemAnimationEnd:function(b){var c=this.getActiveIndex(),a=this.animationDirection,e=this.currentAxis,f=b[e],d=this.itemLength,g;this.isAnimating=false;b.un(this.animationListeners);if(a===-1){g=d+f}else{if(a===1){g=f-d}else{g=f}}g-=this.itemOffset;this.offset=g;this.setActiveItem(c-a)},refresh:function(){this.refreshSizing();this.refreshActiveItem()},refreshSizing:function(){var a=this.element,b=this.getItemLength(),c,d;if(this.getDirection()==="horizontal"){d=a.getWidth()}else{d=a.getHeight()}this.hiddenTranslation=-d;if(b===null){b=d;c=0}else{c=(d-b)/2}this.itemLength=b;this.itemOffset=c},refreshOffset:function(){this.setOffset(this.offset)},refreshActiveItem:function(){this.doSetActiveItem(this.getActiveItem())},getActiveIndex:function(){return this.activeIndex},refreshActiveIndex:function(){this.activeIndex=this.getInnerItemIndex(this.getActiveItem())},refreshCarouselItems:function(){var a=this.carouselItems,b,d,c;for(b=0,d=a.length;b0){for(f=1;f<=c;f++){h=q-f;if(h>=0){a=this.getInnerItemAt(h);b=a.getId();o[b]=a;p[b]=c-f}else{break}}}if(qb){this.setActiveItem(b)}else{this.rebuildInnerIndexes(a);this.refreshActiveItem()}}},rebuildInnerIndexes:function(n){var c=this.innerIndexToItem,g=this.innerIdToIndex,j=this.innerItems.slice(),h=j.length,b=this.getBufferSize(),d=this.getMaxItemIndex(),l=[],e,k,f,a,m;if(n===undefined){this.innerIndexToItem=c={};this.innerIdToIndex=g={};for(e=0;e=0&&e<=d){if(c.hasOwnProperty(e)){Ext.Array.remove(j,c[e]);continue}l.push(e)}}for(e=0,h=l.length;e ."+Ext.baseCSSPrefix+"data-item",scope:this})},initialize:function(){this.callParent();this.doInitialize()},onItemTouchStart:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.on({touchmove:"onItemTouchMove",scope:b,single:true});b.fireEvent("itemtouchstart",b,a,b.indexOf(a),d)},onItemTouchMove:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtouchmove",b,a,b.indexOf(a),d)},onItemTouchEnd:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);a.un({touchmove:"onItemTouchMove",scope:b});b.fireEvent("itemtouchend",b,a,b.indexOf(a),d)},onItemTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtap",b,a,b.indexOf(a),d)},onItemTapHold:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemtaphold",b,a,b.indexOf(a),d)},onItemSingleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemsingletap",b,a,b.indexOf(a),d)},onItemDoubleTap:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemdoubletap",b,a,b.indexOf(a),d)},onItemSwipe:function(d){var b=this,c=d.getTarget(),a=Ext.getCmp(c.id);b.fireEvent("itemswipe",b,a,b.indexOf(a),d)},moveItemsToCache:function(j,k){var h=this,c=h.dataview,a=c.getMaxItemCache(),g=h.getViewItems(),f=h.itemCache,e=f.length,l=c.getPressedCls(),d=c.getSelectedCls(),b=k-j,m;for(;b>=0;b--){m=g[j+b];if(e!==a){h.remove(m,false);m.removeCls([l,d]);f.push(m);e++}else{m.destroy()}}if(h.getViewItems().length==0){this.dataview.showEmptyText()}},moveItemsFromCache:function(b){var l=this,e=l.dataview,m=e.getStore(),k=b.length,a=e.getDefaultType(),h=e.getItemConfig(),g=l.itemCache,f=g.length,j=[],c,n,d;if(k){e.hideEmptyText()}for(c=0;ci._tmpIndex?1:-1});for(c=0;c{text}
",pressedCls:"x-item-pressed",itemCls:null,selectedCls:"x-item-selected",triggerEvent:"itemtap",triggerCtEvent:"tap",deselectOnContainerClick:true,scrollable:true,inline:null,pressedDelay:100,loadingText:"Loading...",useComponents:null,itemConfig:{},maxItemCache:20,defaultType:"dataitem",scrollToTopOnRefresh:true},constructor:function(a){var b=this;b.hasLoadedStore=false;b.mixins.selectable.constructor.apply(b,arguments);b.callParent(arguments)},updateItemCls:function(c,b){var a=this.container;if(a){if(b){a.doRemoveItemCls(b)}if(c){a.doAddItemCls(c)}}},storeEventHooks:{beforeload:"onBeforeLoad",load:"onLoad",refresh:"refresh",addrecords:"onStoreAdd",removerecords:"onStoreRemove",updaterecord:"onStoreUpdate"},initialize:function(){this.callParent();var b=this,a;b.on(b.getTriggerCtEvent(),b.onContainerTrigger,b);a=b.container=this.add(new Ext.dataview[b.getUseComponents()?"component":"element"].Container({baseCls:this.getBaseCls()}));a.dataview=b;b.on(b.getTriggerEvent(),b.onItemTrigger,b);a.on({itemtouchstart:"onItemTouchStart",itemtouchend:"onItemTouchEnd",itemtap:"onItemTap",itemtaphold:"onItemTapHold",itemtouchmove:"onItemTouchMove",itemsingletap:"onItemSingleTap",itemdoubletap:"onItemDoubleTap",itemswipe:"onItemSwipe",scope:b});if(this.getStore()){this.refresh()}},applyInline:function(a){if(Ext.isObject(a)){a=Ext.apply({},a)}return a},updateInline:function(c,b){var a=this.getBaseCls();if(b){this.removeCls([a+"-inlineblock",a+"-nowrap"])}if(c){this.addCls(a+"-inlineblock");if(Ext.isObject(c)&&c.wrap===false){this.addCls(a+"-nowrap")}else{this.removeCls(a+"-nowrap")}}},prepareData:function(c,b,a){c.xindex=b+1;return c},onContainerTrigger:function(b){var a=this;if(b.target!=a.element.dom){return}if(a.getDeselectOnContainerClick()&&a.getStore()){a.deselectAll()}},onItemTrigger:function(b,a){this.selectWithEvent(this.getStore().getAt(a))},doAddPressedCls:function(a){var c=this,b=c.container.getViewItems()[c.getStore().indexOf(a)];if(Ext.isElement(b)){b=Ext.get(b)}if(b){b.addCls(c.getPressedCls())}},onItemTouchStart:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireAction("itemtouchstart",[f,d,h,a,g],"doItemTouchStart")},doItemTouchStart:function(c,b,e,a){var d=c.getPressedDelay();if(a){if(d>0){c.pressedTimeout=Ext.defer(c.doAddPressedCls,d,c,[a])}else{c.doAddPressedCls(a)}}},onItemTouchEnd:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(this.hasOwnProperty("pressedTimeout")){clearTimeout(this.pressedTimeout);delete this.pressedTimeout}if(a&&h){h.removeCls(f.getPressedCls())}f.fireEvent("itemtouchend",f,d,h,a,g)},onItemTouchMove:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);if(f.hasOwnProperty("pressedTimeout")){clearTimeout(f.pressedTimeout);delete f.pressedTimeout}if(a&&h){h.removeCls(f.getPressedCls())}f.fireEvent("itemtouchmove",f,d,h,a,g)},onItemTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtap",f,d,h,a,g)},onItemTapHold:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemtaphold",f,d,h,a,g)},onItemSingleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemsingletap",f,d,h,a,g)},onItemDoubleTap:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemdoubletap",f,d,h,a,g)},onItemSwipe:function(b,h,d,g){var f=this,c=f.getStore(),a=c&&c.getAt(d);f.fireEvent("itemswipe",f,d,h,a,g)},onItemSelect:function(a,b){var c=this;if(b){c.doItemSelect(c,a)}else{c.fireAction("select",[c,a],"doItemSelect")}},doItemSelect:function(c,a){if(c.container&&!c.isDestroyed){var b=c.container.getViewItems()[c.getStore().indexOf(a)];if(Ext.isElement(b)){b=Ext.get(b)}if(b){b.removeCls(c.getPressedCls());b.addCls(c.getSelectedCls())}}},onItemDeselect:function(a,b){var c=this;if(c.container&&!c.isDestroyed){if(b){c.doItemDeselect(c,a)}else{c.fireAction("deselect",[c,a,b],"doItemDeselect")}}},doItemDeselect:function(c,a){var b=c.container.getViewItems()[c.getStore().indexOf(a)];if(Ext.isElement(b)){b=Ext.get(b)}if(b){b.removeCls([c.getPressedCls(),c.getSelectedCls()])}},updateData:function(b){var a=this.getStore();if(!a){this.setStore(Ext.create("Ext.data.Store",{data:b}))}else{a.add(b)}},applyStore:function(b){var d=this,e=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(b){b=Ext.data.StoreManager.lookup(b);if(b&&Ext.isObject(b)&&b.isStore){b.on(e);c=b.getProxy();if(c){a=c.getReader();if(a){a.on("exception","handleException",this)}}}}return b},handleException:function(){this.setMasked(false)},updateStore:function(b,e){var d=this,f=Ext.apply({},d.storeEventHooks,{scope:d}),c,a;if(e&&Ext.isObject(e)&&e.isStore){if(e.autoDestroy){e.destroy()}else{e.un(f);c=e.getProxy();if(c){a=c.getReader();if(a){a.un("exception","handleException",this)}}}}if(b){if(b.isLoaded()){this.hasLoadedStore=true}if(b.isLoading()){d.onBeforeLoad()}if(d.container){d.refresh()}}},onBeforeLoad:function(){var b=this.getScrollable();if(b){b.getScroller().stopAnimation()}var a=this.getLoadingText();if(a){this.setMasked({xtype:"loadmask",message:a});if(b){b.getScroller().setDisabled(true)}}this.hideEmptyText()},updateEmptyText:function(c,d){var b=this,a;if(d&&b.emptyTextCmp){b.remove(b.emptyTextCmp,true);delete b.emptyTextCmp}if(c){b.emptyTextCmp=b.add({xtype:"component",cls:b.getBaseCls()+"-emptytext",html:c,hidden:true});a=b.getStore();if(a&&b.hasLoadedStore&&!a.getCount()){this.showEmptyText()}}},onLoad:function(a){var b=this.getScrollable();this.hasLoadedStore=true;this.setMasked(false);if(b){b.getScroller().setDisabled(false)}if(!a.getCount()){this.showEmptyText()}},refresh:function(){var b=this,a=b.container;if(!b.getStore()){if(!b.hasLoadedStore&&!b.getDeferEmptyText()){b.showEmptyText()}return}if(a){b.fireAction("refresh",[b],"doRefresh")}},applyItemTpl:function(a){return(Ext.isObject(a)&&a.isTemplate)?a:new Ext.XTemplate(a)},onAfterRender:function(){var a=this;a.callParent(arguments);a.updateStore(a.getStore())},getViewItems:function(){return this.container.getViewItems()},doRefresh:function(f){var a=f.container,j=f.getStore(),b=j.getRange(),e=a.getViewItems(),h=b.length,l=e.length,c=h-l,g=f.getScrollable(),d,k;if(this.getScrollToTopOnRefresh()&&g){g.getScroller().scrollToTop()}if(h<1){f.onStoreClear();return}if(c<0){a.moveItemsToCache(l+c,l-1);e=a.getViewItems();l=e.length}else{if(c>0){a.moveItemsFromCache(j.getRange(l))}}for(d=0;dh.y){c=g;break}f=g}return{current:f,next:c}},doRefreshHeaders:function(){if(!this.getGrouped()||!this.container){return false}var l=this.findGroupHeaderIndices(),f=l.length,g=this.container.getViewItems(),j=this.pinHeaderInfo={offsets:[]},a=j.offsets,h=this.getScrollable(),e,k,b,d,c;if(f){for(b=0;bd.offset)||(f&&h0&&d.offset-h<=c){var k=c-(d.offset-h);this.translateHeader(k)}else{this.translateHeader(null)}},translateHeaderTransform:function(a){this.header.renderElement.dom.style.webkitTransform=(a===null)?null:"translate3d(0px, -"+a+"px, 0px)"},translateHeaderCssPosition:function(a){this.header.renderElement.dom.style.top=(a===null)?null:"-"+Math.round(a)+"px"},setActiveGroup:function(b){var a=this,c=a.header;if(c){if(b&&b.header){if(!a.activeGroup||a.activeGroup.header!=b.header){c.show();if(c.element){c.setHtml(b.header.innerHTML)}}}else{if(c&&c.element){c.hide()}}}this.activeGroup=b},onIndex:function(o,c){var r=this,s=c.toLowerCase(),b=r.getStore(),q=b.getGroups(),f=q.length,h=r.getScrollable(),n,e,m,g,k,p;if(h){n=r.getScrollable().getScroller()}else{return}for(m=0;ms){g=e;break}else{g=e}}if(h&&g){p=r.container.getViewItems()[b.indexOf(g.children[0])];n.stopAnimation();var l=n.getContainerSize().y,j=n.getSize().y,d=j-l,a=(p.offsetTop>d)?d:p.offsetTop;n.scrollTo(0,a)}},applyOnItemDisclosure:function(a){if(Ext.isFunction(a)){return{scope:this,handler:a}}return a},handleItemDisclosure:function(f){var d=this,c=f.getTarget().parentNode,b=d.container.getViewItems().indexOf(c),a=d.getStore().getAt(b);d.fireAction("disclose",[d,a,c,b,f],"doDisclose")},doDisclose:function(f,a,d,c,g){var b=f.getOnItemDisclosure();if(b&&b.handler){b.handler.call(b.scope||f,a,d,c,g)}},findGroupHeaderIndices:function(){if(!this.getGrouped()){return[]}var h=this,k=h.getStore();if(!k){return[]}var b=h.container,d=k.getGroups(),m=d.length,g=b.getViewItems(),c=[],l=b.footerClsShortCache,e,a,f,n,j;b.doRemoveHeaders();b.doRemoveFooterCls();if(g.length){for(e=0;e class="x-list-item-leaf">'+a.getItemTextTpl(b)+""},this.getListConfig())}},function(){});Ext.define("Ext.form.FieldSet",{extend:"Ext.Container",alias:"widget.fieldset",requires:["Ext.Title"],config:{baseCls:Ext.baseCSSPrefix+"form-fieldset",title:null,instructions:null},applyTitle:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"top",baseCls:this.getBaseCls()+"-title"});return Ext.factory(a,Ext.Title,this.getTitle())},updateTitle:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}},applyInstructions:function(a){if(typeof a=="string"){a={title:a}}Ext.applyIf(a,{docked:"bottom",baseCls:this.getBaseCls()+"-instructions"});return Ext.factory(a,Ext.Title,this.getInstructions())},updateInstructions:function(b,a){if(b){this.add(b)}if(a){this.remove(a)}}});Ext.define("Ext.form.Panel",{alternateClassName:"Ext.form.FormPanel",extend:"Ext.Panel",xtype:"formpanel",requires:["Ext.XTemplate","Ext.field.Checkbox","Ext.Ajax"],config:{baseCls:Ext.baseCSSPrefix+"form",standardSubmit:false,url:null,baseParams:null,submitOnAction:false,record:null,method:"post",scrollable:{translationMethod:"scrollposition"}},getElementConfig:function(){var a=this.callParent();a.tag="form";return a},initialize:function(){var a=this;a.callParent();a.element.on({submit:"onSubmit",scope:a})},updateRecord:function(c){var a,b,d;if(c&&(a=c.fields)){b=this.getValues();for(d in b){if(b.hasOwnProperty(d)&&a.containsKey(d)){c.set(d,b[d])}}}return this},setRecord:function(a){var b=this;if(a&&a.data){b.setValues(a.data)}b._record=a;return this},onSubmit:function(b){var a=this;if(b&&!a.getStandardSubmit()){b.stopEvent()}else{this.submit()}},updateSubmitOnAction:function(a){if(a){this.on({action:"onFieldAction",scope:this})}else{this.un({action:"onFieldAction",scope:this})}},onFieldAction:function(a){if(this.getSubmitOnAction()){a.blur();this.submit()}},submit:function(a){var c=this,b=c.element.dom||{},d;a=Ext.apply({url:c.getUrl()||b.action,submit:false,method:c.getMethod()||b.method||"post",autoAbort:false,params:null,waitMsg:null,headers:null,success:null,failure:null},a||{});d=c.getValues(c.getStandardSubmit()||!a.submitDisabled);return c.fireAction("beforesubmit",[c,d,a],"doBeforeSubmit")},doBeforeSubmit:function(f,h,b){var e=f.element.dom||{};if(f.getStandardSubmit()){if(b.url&&Ext.isEmpty(e.action)){e.action=b.url}var a=this.query("spinnerfield"),d=a.length,c,g;for(c=0;c1;d.doChangeView(c,a,false)},onViewRemove:function(c){var d=this,b=d.backButtonStack,a;d.endAnimation();b.pop();a=b.length>1;d.doChangeView(c,a,true)},doChangeView:function(k,c,g){var r=this,o=r.leftBox,e=o.element,f=r.titleComponent,m=f.element,n=r.getBackButton(),l=r.getTitleText(),h=r.getBackButtonText(),q=r.getAnimation()&&k.getLayout().getAnimation(),p=q&&q.isAnimation&&k.isPainted(),d,i,a,j,b;if(p){i=r.createProxy(o.element);e.setStyle("opacity","0");n.setText(h);n[c?"show":"hide"]();a=r.createProxy(f.element.getParent());m.setStyle("opacity","0");r.setTitle(l);r.refreshTitlePosition();d=r.measureView(i,a,g);j=d.left;b=d.title;r.isAnimating=true;r.animate(e,j.element);r.animate(m,b.element,function(){m.setLeft(d.titleLeft);r.isAnimating=false});if(Ext.os.is.Android2&&!this.getAndroid2Transforms()){i.ghost.destroy();a.ghost.destroy()}else{r.animate(i.ghost,j.ghost);r.animate(a.ghost,b.ghost,function(){i.ghost.destroy();a.ghost.destroy()})}}else{if(c){n.setText(h);n.show()}else{n.hide()}r.setTitle(l)}},measureView:function(e,u,k){var w=this,j=w.element,v=w.leftBox.element,p=w.titleComponent.element,l=Math.min(j.getWidth()/3,200),q=v.getWidth(),c=j.getX(),m=j.getWidth(),n=p.getX(),d=p.getLeft(),s=p.getWidth(),r=e.x,t=e.width,a=e.left,h=Ext.os.is.Android2&&!this.getAndroid2Transforms(),i,b,f,x,o,g;g=c-r-t;if(k){i=g;b=Math.min(n-t,l)}else{b=g;i=Math.min(n-c,l)}if(h){f={element:{from:{left:i,opacity:1},to:{left:0,opacity:1}}}}else{f={element:{from:{transform:{translateX:i},opacity:0},to:{transform:{translateX:0},opacity:1}},ghost:{to:{transform:{translateX:b},opacity:0}}}}g=c-n+q;if((a+s)>n){o=c-n-s}if(k){p.setLeft(0);b=c+m;if(o!==undefined){i=o}else{i=g}}else{i=m-n;if(o!==undefined){b=o}else{b=g}}if(h){x={element:{from:{left:i,opacity:1},to:{left:d,opacity:1}}}}else{x={element:{from:{transform:{translateX:i},opacity:0},to:{transform:{translateX:d},opacity:1}},ghost:{to:{transform:{translateX:b},opacity:0}}}}return{left:f,title:x,titleLeft:d}},animate:function(b,a,e){var c=this,d;b.setLeft(0);a=Ext.apply(a,{element:b,easing:"ease-in-out",duration:c.getAnimation().duration});d=new Ext.fx.Animation(a);d.on("animationend",function(){if(e){e.call(c)}},c);Ext.Animator.run(d);c.activeAnimations.push(d)},endAnimation:function(){var a=this.activeAnimations,d,b,c;if(a){c=a.length;for(b=0;b0){if(b&&b.isAnimation){b.setReverse(true)}a.setActiveItem(d-1);a.getNavigationBar().onViewRemove(a,c[d],d)}},doRemove:function(){var a=this.getLayout().getAnimation();if(a&&a.isAnimation){a.setReverse(false)}this.callParent(arguments)},onItemAdd:function(b,a){this.doItemLayoutAdd(b,a);if(!this.isItemsInitializing&&b.isInnerItem()){this.setActiveItem(b);this.getNavigationBar().onViewAdd(this,b,a)}if(this.initialized){this.fireEvent("add",this,b,a)}},reset:function(){return this.pop(this.getInnerItems().length)}});Ext.define("Ext.picker.Slot",{extend:"Ext.dataview.DataView",xtype:"pickerslot",alternateClassName:"Ext.Picker.Slot",requires:["Ext.XTemplate","Ext.data.Store","Ext.Component","Ext.data.StoreManager"],isSlot:true,config:{title:null,showTitle:true,cls:Ext.baseCSSPrefix+"picker-slot",name:null,value:null,flex:1,align:"left",displayField:"text",valueField:"value",scrollable:{direction:"vertical",indicators:false,momentumEasing:{minVelocity:2},slotSnapEasing:{duration:100}}},constructor:function(){this.selectedIndex=0;this.callParent(arguments)},applyTitle:function(a){if(a){a=Ext.create("Ext.Component",{cls:Ext.baseCSSPrefix+"picker-slot-title",docked:"top",html:a})}return a},updateTitle:function(b,a){if(b){this.add(b);this.setupBar()}if(a){this.remove(a)}},updateShowTitle:function(a){var b=this.getTitle();if(b){b[a?"show":"hide"]();this.setupBar()}},updateDisplayField:function(a){this.setItemTpl('
'+Ext.baseCSSPrefix+'picker-invalid">{'+a+"}
")},updateAlign:function(a,c){var b=this.element;b.addCls(Ext.baseCSSPrefix+"picker-"+a);b.removeCls(Ext.baseCSSPrefix+"picker-"+c)},applyData:function(d){var f=[],c=d&&d.length,a,b,e;if(d&&Ext.isArray(d)&&c){for(a=0;a0){c[0].addCls(b+"first");c[c.length-1].addCls(b+"last")}this.updateUseTitles(this.getUseTitles())},onDoneButtonTap:function(){var a=this._value,b=this.getValue(true);if(b!=a){this.fireEvent("change",this,b)}this.hide()},onCancelButtonTap:function(){this.fireEvent("cancel",this);this.hide()},onSlotPick:function(a){this.fireEvent("pick",this,this.getValue(true),a)},onShow:function(){if(!this.isHidden()){this.setValue(this._value)}},setValue:function(k,a){var f=this,d=f.getInnerItems(),e=d.length,j,h,c,b,g;if(!k){k={};for(b=0;b{'+this.getDisplayField()+":htmlEncode}",listeners:{select:this.onListSelect,itemtap:this.onListTap,scope:this}}},a))}return this.listPanel},onMaskTap:function(){if(this.getDisabled()){return false}this.showPicker();return false},showPicker:function(){var b=this.getStore();if(!b||b.getCount()===0){return}if(this.getReadOnly()){return}this.isFocused=true;if(this.getUsePicker()){var e=this.getPhonePicker(),d=this.getName(),h={};h[d]=this.record.get(this.getValueField());e.setValue(h);if(!e.getParent()){Ext.Viewport.add(e)}e.show()}else{var f=this.getTabletPicker(),g=f.down("list"),b=g.getStore(),c=b.find(this.getValueField(),this.getValue(),null,null,null,true),a=b.getAt((c==-1)?0:c);if(!f.getParent()){Ext.Viewport.add(f)}f.showBy(this.getComponent());g.select(a,null,true)}},onListSelect:function(c,a){var b=this;if(a){b.setValue(a)}},onListTap:function(){this.listPanel.hide({type:"fade",out:true,scope:this})},onPickerChange:function(d,f){var e=this,g=f[e.getName()],b=e.getStore(),c=b.find(e.getValueField(),g,null,null,null,true),a=b.getAt(c);e.setValue(a)},onChange:function(f,h,e){var g=this,b=g.getStore(),d=(b)?b.find(g.getDisplayField(),e):-1,c=g.getValueField(),a=(b)?b.getAt(d):null,e=(a)?a.get(c):null;g.fireEvent("change",g,g.getValue(),e)},updateOptions:function(b){var a=this.getStore();if(!a){this.setStore(true);a=this._store}if(!b){a.clearData()}else{a.setData(b);this.onStoreDataChanged(a)}},applyStore:function(a){if(a===true){a=Ext.create("Ext.data.Store",{fields:[this.getValueField(),this.getDisplayField()]})}if(a){a=Ext.data.StoreManager.lookup(a);a.on({scope:this,addrecords:this.onStoreDataChanged,removerecords:this.onStoreDataChanged,updaterecord:this.onStoreDataChanged,refresh:this.onStoreDataChanged})}return a},updateStore:function(a){if(a){this.onStoreDataChanged(a)}},onStoreDataChanged:function(a){var c=this.getInitialConfig(),b=this.getValue();if(Ext.isDefined(b)){this.updateValue(this.applyValue(b))}if(this.getValue()===null){if(c.hasOwnProperty("value")){this.setValue(c.value)}if(this.getValue()===null){if(a.getCount()>0){this.setValue(a.getAt(0))}}}},doSetDisabled:function(a){Ext.Component.prototype.doSetDisabled.apply(this,arguments)},setDisabled:function(){Ext.Component.prototype.setDisabled.apply(this,arguments)},reset:function(){var b=this.getStore(),a=(this.originalValue)?this.originalValue:b.getAt(0);if(b&&a){this.setValue(a)}return this},onFocus:function(a){this.fireEvent("focus",this,a);this.isFocused=true;this.showPicker()},destroy:function(){this.callParent(arguments);Ext.destroy(this.listPanel,this.picker,this.hiddenField)}});Ext.define("Ext.picker.Date",{extend:"Ext.picker.Picker",xtype:"datepicker",alternateClassName:"Ext.DatePicker",requires:["Ext.DateExtras"],config:{yearFrom:1980,yearTo:new Date().getFullYear(),monthText:"Month",dayText:"Day",yearText:"Year",slotOrder:["month","day","year"]},initialize:function(){this.callParent();this.on({scope:this,delegate:"> slot",slotpick:this.onSlotPick})},setValue:function(b,a){if(Ext.isDate(b)){b={day:b.getDate(),month:b.getMonth()+1,year:b.getFullYear()}}this.callParent([b,a])},getValue:function(k){var h={},e=this.getItems().items,d=e.length,a,g,c,f,j,b;for(b=0;bf){e=m;m=f;f=e}for(d=m;d<=f;d++){g.push({text:d,value:d})}a=this.getDaysInMonth(1,new Date().getFullYear());for(d=0;d thumb",dragstart:"onThumbDragStart",drag:"onThumbDrag",dragend:"onThumbDragEnd"});this.on({painted:"refresh",resize:"refresh"})},factoryThumb:function(){return Ext.factory(this.getThumbConfig(),Ext.slider.Thumb)},getThumbs:function(){return this.innerItems},getThumb:function(a){if(typeof a!="number"){a=0}return this.innerItems[a]},refreshOffsetValueRatio:function(){var b=this.getMaxValue()-this.getMinValue(),a=this.elementWidth-this.thumbWidth;this.offsetValueRatio=a/b},refreshElementWidth:function(){this.elementWidth=this.element.dom.offsetWidth;var a=this.getThumb(0);if(a){this.thumbWidth=a.getElementWidth()}},refresh:function(){this.refreshElementWidth();this.refreshValue()},setActiveThumb:function(b){var a=this.activeThumb;if(a&&a!==b){a.setZIndex(null)}this.activeThumb=b;b.setZIndex(2);return this},onThumbDragStart:function(a,b){if(b.absDeltaX<=b.absDeltaY){return false}else{b.stopPropagation()}if(this.getAllowThumbsOverlapping()){this.setActiveThumb(a)}this.dragStartValue=this.getValue()[this.getThumbIndex(a)];this.fireEvent("dragstart",this,a,this.dragStartValue,b)},onThumbDrag:function(c,g,a){var d=this.getThumbIndex(c),f=this.offsetValueRatio,b=this.constrainValue(a/f);g.stopPropagation();this.setIndexValue(d,b);this.fireEvent("drag",this,c,this.getValue(),g);return false},setIndexValue:function(d,g,f){var c=this.getThumb(d),b=this.getValue(),e=this.offsetValueRatio,a=c.getDraggable();a.setOffset(g*e,null,f);b[d]=g},onThumbDragEnd:function(a,f){this.refreshThumbConstraints(a);var c=this.getThumbIndex(a),d=this.getValue()[c],b=this.dragStartValue;this.fireEvent("dragend",this,a,this.getValue(),f);if(b!==d){this.fireEvent("change",this,a,d,b)}},getThumbIndex:function(a){return this.getThumbs().indexOf(a)},refreshThumbConstraints:function(d){var b=this.getAllowThumbsOverlapping(),a=d.getDraggable().getOffset().x,c=this.getThumbs(),e=this.getThumbIndex(d),g=c[e-1],h=c[e+1],f=this.thumbWidth;if(g){g.getDraggable().addExtraConstraint({max:{x:a-((b)?0:f)}})}if(h){h.getDraggable().addExtraConstraint({min:{x:a+((b)?0:f)}})}},onTap:function(j){if(this.isDisabled()){return}var k=Ext.get(j.target);if(!k||k.hasCls("x-thumb")){return}var n=j.touch.point.x,h=this.element,c=h.getX(),d=n-c-(this.thumbWidth/2),o=this.constrainValue(d/this.offsetValueRatio),r=this.getValue(),q=Infinity,m=r.length,g,f,l,p,b,a;if(m===1){p=0}else{for(g=0;g=(a/2)){e+=(c>0)?a:-a}e=Math.max(d,e);e=Math.min(f,e);return e},setThumbsCount:function(e){var a=this.getThumbs(),f=a.length,c,d,b;if(f>e){for(c=0,d=f-e;c0,b=d.getMaxValueCls(),e=d.getMinValueCls();this.element.addCls(g?b:e);this.element.removeCls(g?e:b)},toggle:function(){var a=this.getValue();this.setValue((a==1)?0:1);return this},onTap:function(){if(this.isDisabled()){return}var b=this.getValue(),c=(b==1)?0:1,a=this.getThumb(0);this.setIndexValue(0,c,this.getAnimation());this.refreshThumbConstraints(a);this.fireEvent("change",this,a,c,b)}});Ext.define("Ext.field.Toggle",{extend:"Ext.field.Slider",xtype:"togglefield",alternateClassName:"Ext.form.Toggle",requires:["Ext.slider.Toggle"],config:{cls:"x-toggle-field"},proxyConfig:{minValueCls:"x-toggle-off",maxValueCls:"x-toggle-on"},applyComponent:function(a){return Ext.factory(a,Ext.slider.Toggle)},setValue:function(a){if(a===true){a=1}this.getComponent().setValue(a);return this},getValue:function(){return(this.getComponent().getValue()==1)?1:0},toggle:function(){this.getComponent().toggle();return this}});Ext.define("Ext.tab.Tab",{extend:"Ext.Button",xtype:"tab",alternateClassName:"Ext.Tab",isTab:true,config:{baseCls:Ext.baseCSSPrefix+"tab",pressedCls:Ext.baseCSSPrefix+"tab-pressed",activeCls:Ext.baseCSSPrefix+"tab-active",active:false,title:" "},template:[{tag:"span",reference:"badgeElement",hidden:true},{tag:"span",className:Ext.baseCSSPrefix+"button-icon",reference:"iconElement",style:"visibility: hidden !important"},{tag:"span",reference:"textElement",hidden:true}],updateTitle:function(a){this.setText(a)},hideIconElement:function(){this.iconElement.dom.style.setProperty("visibility","hidden","!important")},showIconElement:function(){this.iconElement.dom.style.setProperty("visibility","visible","!important")},updateActive:function(c,b){var a=this.getActiveCls();if(c&&!b){this.element.addCls(a);this.fireEvent("activate",this)}else{if(b){this.element.removeCls(a);this.fireEvent("deactivate",this)}}}},function(){this.override({activate:function(){this.setActive(true)},deactivate:function(){this.setActive(false)}})});Ext.define("Ext.tab.Bar",{extend:"Ext.Toolbar",alternateClassName:"Ext.TabBar",xtype:"tabbar",requires:["Ext.tab.Tab"],config:{baseCls:Ext.baseCSSPrefix+"tabbar",defaultType:"tab",layout:{type:"hbox",align:"middle"}},eventedConfig:{activeTab:null},initialize:function(){var a=this;a.callParent();a.on({tap:"onTabTap",delegate:"> tab",scope:a})},onTabTap:function(a){this.setActiveTab(a)},applyActiveTab:function(b,c){if(!b&&b!==0){return}var a=this.parseActiveTab(b);if(!a){return}return a},doSetDocked:function(a){var c=this.getLayout(),b=a=="bottom"?"center":"left";if(c.isLayout){c.setPack(b)}else{c.pack=(c&&c.pack)?c.pack:b}},doSetActiveTab:function(b,a){if(b){b.setActive(true)}if(a){a.setActive(false)}},parseActiveTab:function(a){if(typeof a=="number"){return this.getInnerItems()[a]}else{if(typeof a=="string"){a=Ext.getCmp(a)}}return a}});Ext.define("Ext.tab.Panel",{extend:"Ext.Container",xtype:"tabpanel",alternateClassName:"Ext.TabPanel",requires:["Ext.tab.Bar"],config:{ui:"dark",tabBar:true,tabBarPosition:"top",layout:{type:"card",animation:{type:"slide",direction:"left"}},cls:Ext.baseCSSPrefix+"tabpanel"},delegateListeners:{delegate:"> component",centeredchange:"onItemCenteredChange",dockedchange:"onItemDockedChange",floatingchange:"onItemFloatingChange",disabledchange:"onItemDisabledChange"},initialize:function(){this.callParent();this.on({order:"before",activetabchange:"doTabChange",delegate:"> tabbar",scope:this})},applyScrollable:function(){return false},updateUi:function(a,b){this.callParent(arguments);if(this.initialized){this.getTabBar().setUi(a)}},doSetActiveItem:function(d,j){if(d){var f=this.getInnerItems(),g=f.indexOf(j),i=f.indexOf(d),e=g>i,c=this.getLayout().getAnimation(),b=this.getTabBar(),h=b.parseActiveTab(g),a=b.parseActiveTab(i);if(c&&c.setReverse){c.setReverse(e)}this.callParent(arguments);if(i!=-1){this.forcedChange=true;b.setActiveTab(i);this.forcedChange=false;if(h){h.setActive(false)}if(a){a.setActive(true)}}}},doTabChange:function(a,d){var b=this.getActiveItem(),c;this.setActiveItem(a.indexOf(d));c=this.getActiveItem();return this.forcedChange||b!==c},applyTabBar:function(a){if(a===true){a={}}if(a){Ext.applyIf(a,{ui:this.getUi(),docked:this.getTabBarPosition()})}return Ext.factory(a,Ext.tab.Bar,this.getTabBar())},updateTabBar:function(a){if(a){this.add(a);this.setTabBarPosition(a.getDocked())}},updateTabBarPosition:function(b){var a=this.getTabBar();if(a){a.setDocked(b)}},onItemAdd:function(e){var k=this;if(!e.isInnerItem()){return k.callParent(arguments)}var c=k.getTabBar(),o=e.getInitialConfig(),d=o.tab||{},g=(e.getTitle)?e.getTitle():o.title,i=(e.getIconCls)?e.getIconCls():o.iconCls,j=(e.getHidden)?e.getHidden():o.hidden,n=(e.getDisabled)?e.getDisabled():o.disabled,p=(e.getBadgeText)?e.getBadgeText():o.badgeText,b=k.getInnerItems(),h=b.indexOf(e),l=c.getItems(),a=c.getActiveTab(),m=(l.length>=b.length)&&l.getAt(h),f;if(g&&!d.title){d.title=g}if(i&&!d.iconCls){d.iconCls=i}if(j&&!d.hidden){d.hidden=j}if(n&&!d.disabled){d.disabled=n}if(p&&!d.badgeText){d.badgeText=p}f=Ext.factory(d,Ext.tab.Tab,m);if(!m){c.insert(h,f)}e.tab=f;k.callParent(arguments);if(!a&&a!==0){c.setActiveTab(c.getActiveItem())}},onItemDisabledChange:function(a,b){if(a&&a.tab){a.tab.setDisabled(b)}},onItemRemove:function(b,a){this.getTabBar().remove(b.tab,this.getAutoDestroy());this.callParent(arguments)}},function(){});Ext.define("Ext.table.Cell",{extend:"Ext.Container",xtype:"tablecell",config:{baseCls:"x-table-cell"},getElementConfig:function(){var a=this.callParent();a.children.length=0;return a}});Ext.define("Ext.table.Row",{extend:"Ext.table.Cell",xtype:"tablerow",config:{baseCls:"x-table-row",defaultType:"tablecell"}});Ext.define("Ext.table.Table",{extend:"Ext.Container",requires:["Ext.table.Row"],xtype:"table",config:{baseCls:"x-table",defaultType:"tablerow"},cachedConfig:{fixedLayout:false},fixedLayoutCls:"x-table-fixed",updateFixedLayout:function(a){this.innerElement[a?"addCls":"removeCls"](this.fixedLayoutCls)}});Ext.define("Ext.viewport.Default",{extend:"Ext.Container",xtype:"viewport",PORTRAIT:"portrait",LANDSCAPE:"landscape",requires:["Ext.LoadMask"],config:{autoMaximize:false,autoBlurInput:true,preventPanning:true,preventZooming:false,autoRender:true,layout:"card",width:"100%",height:"100%"},isReady:false,isViewport:true,isMaximizing:false,id:"ext-viewport",isInputRegex:/^(input|textarea|select|a)$/i,focusedElement:null,fullscreenItemCls:Ext.baseCSSPrefix+"fullscreen",constructor:function(a){var b=Ext.Function.bind;this.doPreventPanning=b(this.doPreventPanning,this);this.doPreventZooming=b(this.doPreventZooming,this);this.doBlurInput=b(this.doBlurInput,this);this.maximizeOnEvents=["ready","orientationchange"];this.orientation=this.determineOrientation();this.windowWidth=this.getWindowWidth();this.windowHeight=this.getWindowHeight();this.windowOuterHeight=this.getWindowOuterHeight();if(!this.stretchHeights){this.stretchHeights={}}this.callParent([a]);if(this.supportsOrientation()){this.addWindowListener("orientationchange",b(this.onOrientationChange,this))}else{this.addWindowListener("resize",b(this.onResize,this))}document.addEventListener("focus",b(this.onElementFocus,this),true);document.addEventListener("blur",b(this.onElementBlur,this),true);Ext.onDocumentReady(this.onDomReady,this);this.on("ready",this.onReady,this,{single:true});this.getEventDispatcher().addListener("component","*","fullscreen","onItemFullscreenChange",this);return this},onDomReady:function(){this.isReady=true;this.updateSize();this.fireEvent("ready",this)},onReady:function(){if(this.getAutoRender()){this.render()}},onElementFocus:function(a){this.focusedElement=a.target},onElementBlur:function(){this.focusedElement=null},render:function(){if(!this.rendered){var a=Ext.getBody(),b=Ext.baseCSSPrefix,h=[],d=Ext.os,g=d.name.toLowerCase(),f=Ext.browser.name.toLowerCase(),e=d.version.getMajor(),c=this.getOrientation();this.renderTo(a);h.push(b+d.deviceType.toLowerCase());if(d.is.iPad){h.push(b+"ipad")}h.push(b+g);h.push(b+f);if(e){h.push(b+g+"-"+e)}if(d.is.BlackBerry){h.push(b+"bb")}if(Ext.browser.is.Standalone){h.push(b+"standalone")}h.push(b+c);a.addCls(h)}},applyAutoBlurInput:function(a){var b=(Ext.feature.has.Touch)?"touchstart":"mousedown";if(a){this.addWindowListener(b,this.doBlurInput,false)}else{this.removeWindowListener(b,this.doBlurInput,false)}return a},applyAutoMaximize:function(a){if(Ext.browser.is.WebView){a=false}if(a){this.on("ready","doAutoMaximizeOnReady",this,{single:true});this.on("orientationchange","doAutoMaximizeOnOrientationChange",this)}else{this.un("ready","doAutoMaximizeOnReady",this);this.un("orientationchange","doAutoMaximizeOnOrientationChange",this)}return a},applyPreventPanning:function(a){if(a){this.addWindowListener("touchmove",this.doPreventPanning,false)}else{this.removeWindowListener("touchmove",this.doPreventPanning,false)}return a},applyPreventZooming:function(a){var b=(Ext.feature.has.Touch)?"touchstart":"mousedown";if(a){this.addWindowListener(b,this.doPreventZooming,false)}else{this.removeWindowListener(b,this.doPreventZooming,false)}return a},doAutoMaximizeOnReady:function(){var a=arguments[arguments.length-1];a.pause();this.isMaximizing=true;this.on("maximize",function(){this.isMaximizing=false;this.updateSize();a.resume();this.fireEvent("ready",this)},this,{single:true});this.maximize()},doAutoMaximizeOnOrientationChange:function(){var a=arguments[arguments.length-1],b=a.firingArguments;a.pause();this.isMaximizing=true;this.on("maximize",function(){this.isMaximizing=false;this.updateSize();b[1]=this.windowWidth;b[2]=this.windowHeight;a.resume()},this,{single:true});this.maximize()},doBlurInput:function(b){var a=b.target,c=this.focusedElement;if(c&&!this.isInputRegex.test(a.tagName)){delete this.focusedElement;c.blur()}},doPreventPanning:function(a){a.preventDefault()},doPreventZooming:function(b){if("button" in b&&b.button!==0){return}var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)){b.preventDefault()}},addWindowListener:function(b,c,a){window.addEventListener(b,c,Boolean(a))},removeWindowListener:function(b,c,a){window.removeEventListener(b,c,Boolean(a))},doAddListener:function(a,d,c,b){if(a==="ready"&&this.isReady&&!this.isMaximizing){d.call(c);return this}this.mixins.observable.doAddListener.apply(this,arguments)},supportsOrientation:function(){return Ext.feature.has.Orientation},onResize:function(){var c=this.windowWidth,f=this.windowHeight,e=this.getWindowWidth(),a=this.getWindowHeight(),d=this.getOrientation(),b=this.determineOrientation();if((c!==e||f!==a)&&d!==b){this.fireOrientationChangeEvent(b,d)}},onOrientationChange:function(){var b=this.getOrientation(),a=this.determineOrientation();if(a!==b){this.fireOrientationChangeEvent(a,b)}},fireOrientationChangeEvent:function(b,c){var a=Ext.baseCSSPrefix;Ext.getBody().replaceCls(a+c,a+b);this.orientation=b;this.updateSize();this.fireEvent("orientationchange",this,b,this.windowWidth,this.windowHeight)},updateSize:function(b,a){this.windowWidth=b!==undefined?b:this.getWindowWidth();this.windowHeight=a!==undefined?a:this.getWindowHeight();return this},waitUntil:function(h,e,g,a,f){if(!a){a=50}if(!f){f=2000}var c=this,b=0;setTimeout(function d(){b+=a;if(h.call(c)===true){if(e){e.call(c)}}else{if(b>=f){if(g){g.call(c)}}else{setTimeout(d,a)}}},a)},maximize:function(){this.fireMaximizeEvent()},fireMaximizeEvent:function(){this.updateSize();this.fireEvent("maximize",this)},doSetHeight:function(a){Ext.getBody().setHeight(a);this.callParent(arguments)},doSetWidth:function(a){Ext.getBody().setWidth(a);this.callParent(arguments)},scrollToTop:function(){window.scrollTo(0,-1)},getWindowWidth:function(){return window.innerWidth},getWindowHeight:function(){return window.innerHeight},getWindowOuterHeight:function(){return window.outerHeight},getWindowOrientation:function(){return window.orientation},getOrientation:function(){return this.orientation},getSize:function(){return{width:this.windowWidth,height:this.windowHeight}},determineOrientation:function(){var b=this.PORTRAIT,a=this.LANDSCAPE;if(this.supportsOrientation()){if(this.getWindowOrientation()%180===0){return b}return a}else{if(this.getWindowHeight()>=this.getWindowWidth()){return b}return a}},onItemFullscreenChange:function(a){a.addCls(this.fullscreenItemCls);this.add(a)}});Ext.define("Ext.viewport.Android",{extend:"Ext.viewport.Default",constructor:function(){this.on("orientationchange","doFireOrientationChangeEvent",this,{prepend:true});this.on("orientationchange","hideKeyboardIfNeeded",this,{prepend:true});return this.callParent(arguments)},getDummyInput:function(){var a=this.dummyInput,c=this.focusedElement,b=Ext.fly(c).getPageBox();if(!a){this.dummyInput=a=document.createElement("input");a.style.position="absolute";a.style.opacity="0";document.body.appendChild(a)}a.style.left=b.left+"px";a.style.top=b.top+"px";a.style.display="";return a},doBlurInput:function(c){var b=c.target,d=this.focusedElement,a;if(d&&!this.isInputRegex.test(b.tagName)){a=this.getDummyInput();delete this.focusedElement;a.focus();setTimeout(function(){a.style.display="none"},100)}},hideKeyboardIfNeeded:function(){var a=arguments[arguments.length-1],b=this.focusedElement;if(b){delete this.focusedElement;a.pause();if(Ext.os.version.lt("4")){b.style.display="none"}else{b.blur()}setTimeout(function(){b.style.display="";a.resume()},1000)}},doFireOrientationChangeEvent:function(){var a=arguments[arguments.length-1];this.orientationChanging=true;a.pause();this.waitUntil(function(){return this.getWindowOuterHeight()!==this.windowOuterHeight},function(){this.windowOuterHeight=this.getWindowOuterHeight();this.updateSize();a.firingArguments[1]=this.windowWidth;a.firingArguments[2]=this.windowHeight;a.resume();this.orientationChanging=false},function(){});return this},applyAutoMaximize:function(a){a=this.callParent(arguments);this.on("add","fixSize",this,{single:true});if(!a){this.on("ready","fixSize",this,{single:true});this.onAfter("orientationchange","doFixSize",this)}else{this.un("ready","fixSize",this);this.unAfter("orientationchange","doFixSize",this)}},fixSize:function(){this.doFixSize()},doFixSize:function(){this.setHeight(this.getWindowHeight())},getActualWindowOuterHeight:function(){return Math.round(this.getWindowOuterHeight()/window.devicePixelRatio)},maximize:function(){var c=this.stretchHeights,b=this.orientation,a;a=c[b];if(!a){c[b]=a=this.getActualWindowOuterHeight()}if(!this.addressBarHeight){this.addressBarHeight=a-this.getWindowHeight()}this.setHeight(a);var d=Ext.Function.bind(this.isHeightMaximized,this,[a]);this.scrollToTop();this.waitUntil(d,this.fireMaximizeEvent,this.fireMaximizeEvent)},isHeightMaximized:function(a){this.scrollToTop();return this.getWindowHeight()===a}},function(){if(!Ext.os.is.Android){return}var a=Ext.os.version,b=Ext.browser.userAgent,c=/(htc|desire|incredible|ADR6300)/i.test(b)&&a.lt("2.3");if(c){this.override({constructor:function(d){if(!d){d={}}d.autoMaximize=false;this.watchDogTick=Ext.Function.bind(this.watchDogTick,this);setInterval(this.watchDogTick,1000);return this.callParent([d])},watchDogTick:function(){this.watchDogLastTick=Ext.Date.now()},doPreventPanning:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)},doPreventZooming:function(){var e=Ext.Date.now(),f=this.watchDogLastTick,d=e-f;if(d>=2000){return}return this.callParent(arguments)}})}if(a.match("2")){this.override({onReady:function(){this.addWindowListener("resize",Ext.Function.bind(this.onWindowResize,this));this.callParent(arguments)},scrollToTop:function(){document.body.scrollTop=100},onWindowResize:function(){var e=this.windowWidth,g=this.windowHeight,f=this.getWindowWidth(),d=this.getWindowHeight();if(this.getAutoMaximize()&&!this.isMaximizing&&!this.orientationChanging&&window.scrollY===0&&e===f&&d=g-this.addressBarHeight)||!this.focusedElement)){this.scrollToTop()}},fixSize:function(){var d=this.getOrientation(),f=window.outerHeight,g=window.outerWidth,e;if(d==="landscape"&&(f=g)){e=this.getActualWindowOuterHeight()}else{e=this.getWindowHeight()}this.waitUntil(function(){return e>this.getWindowHeight()},this.doFixSize,this.doFixSize,50,1000)}})}else{if(a.gtEq("3.1")){this.override({isHeightMaximized:function(d){this.scrollToTop();return this.getWindowHeight()===d-1}})}else{if(a.match("3")){this.override({isHeightMaximized:function(){this.scrollToTop();return true}})}}}if(a.gtEq("4")){this.override({doBlurInput:Ext.emptyFn})}});Ext.define("Ext.viewport.Ios",{extend:"Ext.viewport.Default",isFullscreen:function(){return this.isHomeScreen()},isHomeScreen:function(){return window.navigator.standalone===true},constructor:function(){this.callParent(arguments);if(this.getAutoMaximize()&&!this.isFullscreen()){this.addWindowListener("touchstart",Ext.Function.bind(this.onTouchStart,this))}},maximize:function(){if(this.isFullscreen()){return this.callParent()}var c=this.stretchHeights,b=this.orientation,d=this.getWindowHeight(),a=c[b];if(window.scrollY>0){this.scrollToTop();if(!a){c[b]=a=this.getWindowHeight()}this.setHeight(a);this.fireMaximizeEvent()}else{if(!a){a=this.getScreenHeight()}this.setHeight(a);this.waitUntil(function(){this.scrollToTop();return d!==this.getWindowHeight()},function(){if(!c[b]){a=c[b]=this.getWindowHeight();this.setHeight(a)}this.fireMaximizeEvent()},function(){a=c[b]=this.getWindowHeight();this.setHeight(a);this.fireMaximizeEvent()},50,1000)}},getScreenHeight:function(){return window.screen[this.orientation===this.PORTRAIT?"height":"width"]},onElementFocus:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){clearTimeout(this.scrollToTopTimer)}this.callParent(arguments)},onElementBlur:function(){if(this.getAutoMaximize()&&!this.isFullscreen()){this.scrollToTopTimer=setTimeout(this.scrollToTop,500)}this.callParent(arguments)},onTouchStart:function(){if(this.focusedElement===null){this.scrollToTop()}},scrollToTop:function(){window.scrollTo(0,0)}},function(){if(!Ext.os.is.iOS){return}if(Ext.os.version.lt("3.2")){this.override({constructor:function(){var a=this.stretchHeights={};a[this.PORTRAIT]=416;a[this.LANDSCAPE]=268;return this.callOverridden(arguments)}})}if(Ext.os.version.lt("5")){this.override({fieldMaskClsTest:"-field-mask",doPreventZooming:function(b){var a=b.target;if(a&&a.nodeType===1&&!this.isInputRegex.test(a.tagName)&&a.className.indexOf(this.fieldMaskClsTest)==-1){b.preventDefault()}}})}if(Ext.os.is.iPad){this.override({isFullscreen:function(){return true}})}});Ext.define("Ext.viewport.Viewport",{requires:["Ext.viewport.Ios","Ext.viewport.Android"],constructor:function(b){var c=Ext.os.name,d,a;switch(c){case"Android":d="Android";break;case"iOS":d="Ios";break;default:d="Default"}a=Ext.create("Ext.viewport."+d,b);return a}});Ext.define("Ext.event.recognizer.Swipe",{extend:"Ext.event.recognizer.SingleTouch",handledEvents:["swipe"],inheritableStatics:{MAX_OFFSET_EXCEEDED:16,MAX_DURATION_EXCEEDED:17,DISTANCE_NOT_ENOUGH:18},config:{minDistance:80,maxOffset:35,maxDuration:1000},onTouchStart:function(a){if(this.callParent(arguments)===false){return false}var b=a.changedTouches[0];this.startTime=a.time;this.isHorizontal=true;this.isVertical=true;this.startX=b.pageX;this.startY=b.pageY},onTouchMove:function(f){var h=f.changedTouches[0],b=h.pageX,g=h.pageY,c=Math.abs(b-this.startX),a=Math.abs(g-this.startY),d=f.time;if(d-this.startTime>this.getMaxDuration()){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(this.isVertical&&c>this.getMaxOffset()){this.isVertical=false}if(this.isHorizontal&&a>this.getMaxOffset()){this.isHorizontal=false}if(!this.isHorizontal&&!this.isVertical){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(i){if(this.onTouchMove(i)===false){return false}var h=i.changedTouches[0],l=h.pageX,j=h.pageY,g=l-this.startX,f=j-this.startY,c=Math.abs(g),b=Math.abs(f),m=this.getMinDistance(),d=i.time-this.startTime,k,a;if(this.isVertical&&bc){return this.fail(this.self.MAX_DURATION_EXCEEDED)}if(a>b){return this.fail(this.self.MAX_OFFSET_EXCEEDED)}},onTouchEnd:function(f){if(this.onTouchMove(f)!==false){var i=f.changedTouches[0],a=i.pageX,b=a-this.startX,h=Math.abs(b),d=f.time-this.startTime,g=this.getMinDistance(),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π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 VP7)gCNetuhr~j#5=kRIo{{a)gMvwpi diff --git a/programs/touchui/zoom-fit-best.png b/programs/touchui/zoom-fit-best.png deleted file mode 100644 index 623885a022926da4d55e2a8672462d89e5b19d99..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 932 zcmV;V16%xwP)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2iOG+ z3JN#>O3Zlx00SgRL_t(|+SQiNOB7)o#-DebRnwq4q?ZVymQMWzU1|+NJL`WCT}s1) z6-!^4{zlHb3no;ZaUAEhW!V7pBxFpcj!8C66A9BC2?_wq zwoxjTzzjxAk3sUzGMt>XiuKty00RU(o6X`!u?XNd5I8z8fK)1_gdq6`A=Pc5uN#mh zvfu#ngNA^Qj*Y=E46(Mnv=q68N|WRAa|c(?8#sH?fKYeh0j%iAHb>U`owfWngl-g=;C3 z8emb5fMI~nJd;kN)a=6HUI&ANgD_~_g)#3egY3>n`Z$)a^gz*G1EhwA#PiLU0~k5o z6tf2^3^j}rLI6#X8*st?4X99Isdx?Ok|5Oe z0Ks5=E#4)>ZUYE{`vr-A1nSq!ZNTt>#|jdD2h>Z*0e|?u-T`?D^(yzR0rd}xdI^Kz zfAJ2eM<5yqhwCrroC~W84WJ)Gy#-x5Tmg4F9XO67OtV-Mo9Z&7H2{bPG?*W}TrQ(n zED)4K{LmBbzha35wktbT0M+0Co_gyR#~vhhS|}8dOeVFXXti3%<#P7J*_jytD}a;{ zR&To#R=up9{73jkexoxtKldP$dAR_f77#!JYBsP{;vk7<&EiVkUQoN;7H95-=Qs0w zaq-#X`MLQg5*`r1Mf7(A*OzR3uW(Gfu+ZPb0_!IjxvjuAH}lA3(hIZq?$2s)J%Fz9 zp#-cpFma(9iuC#gkQz{Sp3bD7-n?;ZO2Wf6Y}+<(G#b3wZ1Ugp%&RJ=7Yb9&!UW<3 z6{cBymM$P)S@|U9^{?yBox9VIKt)0-UI6l*1FWvD^0l=!YkXpS8bBXnXqa9oVG`&< zH9O>nW%J_C5`XvpLv?g)bTSH@LDea867jV|{zz`%f6*_Jdo;uJuyNzYy;r~QyY}PMjn}7dy*+d0?74I2&!4|=>C&YuSFT*UcI`S4 z+_-+@#too*ZruW+TX*l?xeo*{e>`~g^Wn2MPhP%%_U!rd7cXACeEH(#D-d}7`t_SP zuit%m0|am1zI_J<@87@s^y57cd;o)wA3uEg^$`d@fx%}m_yPuBzkd1l{VNcBgMjbf zzC*x|?>~Ng|M}|&5c~v#UtsVX4E{jCUl8~Q0{{R2mk};$2Zp{_NswPK11A@^jEa@D zjjd-sRHYdAWDL@3gyW8df=G@ot9|?C zf!eAtkyG3^J}sH^#zFBzrJMJT-GaLgAon{&{! zkae%af}~HaQyGM|T3wmL>b4-qCE3G;CFU!KOkN%PLxDRs=ca8*e{i9oKic_JY}lQW zKA!Df)=F>Ni*k2{?>W%2S?Zq=bCA{}t1YclZ|l5@cxO=Q$oKSBiKWZyWeY4$oIP6< zo8r07@&i-bmA0#YGFN%8Rg#?Nf6BN@TJ7!#+DLctaa(QRopUT4lre4dJ{;IEK_BSt$TVF7(6O@ZQUHx3v IIVCg!0H;O`R{#J2 diff --git a/programs/touchui/zoom-fit-width.png b/programs/touchui/zoom-fit-width.png deleted file mode 100644 index 5bd06de6979a73e181830b111c019f62371d1dbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 934 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyjKx9jP7LeL$-D$|I14-?i-C%- zgD|6$#_S59AbW|YuPgfvRvs=+p46POc|bkQ0X`wFKq>qnG%PeEBsecWFDEyrwyvh5 zv;Ew~ONURKx_R^F?K`*c+`S{5_gvQMMpFe-$(xppRu3Wix?b>x9xN-f) zjT=D6+`0usx9&WCedpPiyLa#0d;0c15WM*I=-HcR&z?Vf_2K!87cXAEeDU(t%U7>n zzWwwH2wuN_{pQW*AK!oc`2O?P4+vRx(bt)hFmF2_|VbE-@aQV~0Jv{sOlDP!7$*4!>d)`)38Je(((G;BPif61r8 z@ucSswlskQlYWlUc&SNXx`9k%BXM-!u0 z)btg{nl4=EuA_?d}_ms4{P?n_P*DDDbwP58`IfOljN5_ z-XrF7_1#4eTYFFUdEEO$Q5TIRE#bLjII&mDG~IPwPB7+TDZ0FN;K_ q)T(e58%t(?`K;zSXTfBrfA;hLXB0=6^ - * - * @licstart - * This file is part of WebODF. - * - * WebODF is free software: you can redistribute it and/or modify it - * under the terms of the GNU Affero General Public License (GNU AGPL) - * as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. - * - * WebODF is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with WebODF. If not, see . - * @licend - * - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ - -/*global Packages HTMLStyleElement window XMLHttpRequest HTMLStyleElement Document*/ - -/*jslint nomen: false */ - -var Ext = {}; -Ext.data = {}; -/** - * @constructor - */ -Ext.data.Model = function (settings) {}; -/** - * @param {!string} fieldName - * @return {!string} - */ -Ext.data.Model.prototype.get = function (fieldName) {}; -/** - * @return {!boolean} - */ -Ext.data.Model.isExpanded = function () {}; -/** - * @constructor - */ -Ext.data.NodeInterface = function () {}; -/** - * @param {!string} attribute - * @param {*} value - * @param {boolean=} deep - * @return {Ext.data.NodeInterface} - */ -Ext.data.NodeInterface.prototype.findChild = function (attribute, value, deep) {}; -/** - * @param {!Ext.data.NodeInterface|!Object} node - * @return {!Ext.data.NodeInterface} - */ -Ext.data.NodeInterface.prototype.appendChild = function (node) {}; -/** - * @param {!string} id - * @return {Ext.Component} - */ -Ext.getCmp = function (id) {}; -Ext.tree = {}; -/** - * @constructor - */ -Ext.tree.Panel = function (settings) {}; -/** - * @return {!Ext.data.NodeInterface} - */ -Ext.tree.Panel.prototype.getRootNode = function () {}; -Ext.component = {}; -/** - * @constructor - * @extends {Ext.Component} - */ -Ext.component.Component = function (settings) {}; -/** - * @return {!Ext.Element} - */ -Ext.component.Component.prototype.getEl = function () {}; -/** - * @constructor - */ -Ext.Button = function (settings) {}; -/** - * @constructor - */ -Ext.Component = function (settings) {}; -/** - * @type {Object} - */ -Ext.Component.prototype.superclass = {}; -/** - * @type {!Ext.Element} - */ -Ext.Component.prototype.el; -/** - * @constructor - */ -Ext.Element = function (settings) {}; -/** - * @constructor - */ -Ext.Panel = function (settings) {}; -/** - * @type {!Element} - */ -Ext.Element.prototype.dom; -Ext.QuickTips = {}; -/** - * @return {undefined} - */ -Ext.QuickTips.init = function () {}; -/** - * @constructor - */ -Ext.Slider = function (settings) {}; -Ext.util = {}; -/** - * @constructor - */ -Ext.util.MixedCollection = function () {}; -/** - * @param {!Function} f - */ -Ext.util.MixedCollection.prototype.findBy = function (f) {}; -Ext.tab = {}; -/** - * @constructor - */ -Ext.tab.Panel = function (settings) {}; -/** - * @param {!Object} component - * @return {undefined} - */ -Ext.tab.Panel.prototype.add = function (component) {}; -/** - * @return {!Ext.Component} - */ -Ext.tab.Panel.prototype.getActiveTab = function () {}; -/** - * @param {!Ext.Component} tab - * @return {undefined} - */ -Ext.tab.Panel.prototype.setActiveTab = function (tab) {}; -/** - * @type {!Ext.util.MixedCollection} - */ -Ext.tab.Panel.prototype.items; -/** - * @constructor - */ -Ext.Toolbar = function (settings) {}; -/** - * @constructor - */ -Ext.Toolbar.TextItem = function (text) {}; -/** - * @constructor - */ -Ext.Viewport = function (settings) {}; -Ext.onReady = function (callback) {}; From 3d77c0ae17b729de17c86ceee8512539ecd9df80 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 230/385] Cut a table between two of its rows, and write its head again. --- webodf/lib/odf/TextLayout.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index fac924739..757ca0372 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2488,6 +2488,19 @@ odf.TextLayout = function TextLayout() { ? middle + 1 : Math.max(1, low)); } + /** + * Whether a node is a row of a table, of the kind that is written whole + * on one page. + * @param {!Node} node + * @return {!boolean} + */ + function isTableRow(node) { + return node.nodeType === Node.ELEMENT_NODE + && node.namespaceURI === tablens + && (node.localName === "table-row" + || node.localName === "table-rows" + || node.localName === "table-header-rows"); + } /** * Cut an element where the page ends, and answer what is left of it: a * copy of the element that holds what did not fit. @@ -2512,6 +2525,8 @@ odf.TextLayout = function TextLayout() { inner = null, /**@type{!Element}*/ tail, + /**@type{?Element}*/ + head, /**@type{?Node}*/ next, /**@type{!ClientRect}*/ @@ -2528,6 +2543,13 @@ odf.TextLayout = function TextLayout() { if (node.nodeType === Node.TEXT_NODE) { from = cutText(box, /**@type{!Text}*/(node), alone) || node; + } else if (isTableRow(node) + && !(alone && node === element.firstElementChild)) { + // A row of a table is written whole on one page or on + // the next, and never cut across, which would part the + // cells of one row from one another. A row taller than + // a page is cut all the same, as it is that or nothing. + from = node; } else if (depth > 0) { inner = cutElement(box, /**@type{!Element}*/(node), depth - 1, alone); @@ -2549,6 +2571,12 @@ odf.TextLayout = function TextLayout() { // of the child that crossed the end of the page, and everything that // follows that child. tail = /**@type{!Element}*/(element.cloneNode(false)); + // A table that is cut in two writes the rows of its head again at + // the top of what follows, as an office does. + head = domUtils.getDirectChild(element, tablens, "table-header-rows"); + if (head && element.namespaceURI === tablens) { + tail.appendChild(head.cloneNode(true)); + } if (inner) { tail.appendChild(inner); from = node From 65a781bbdafed3ea8c21d823042cc4e5f7a32536 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 231/385] Managed shapes of the master page on every page. --- webodf/lib/odf/TextLayout.js | 93 +++++++++++++++++++++++++++++++++--- 1 file changed, 86 insertions(+), 7 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index e351ec080..2a5990af0 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -34,6 +34,8 @@ odf.TextLayout = function TextLayout() { fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", + drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", + svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", dcns = "http://purl.org/dc/elements/1.1/", metans = "urn:oasis:names:tc:opendocument:xmlns:meta:1.0", /** @@ -88,10 +90,12 @@ odf.TextLayout = function TextLayout() { pageSeparation: pageSeparation, header: {height: 0, gap: 0}, footer: {height: 0, gap: 0}, - firstPage: {header: null, footer: null, headerLeft: null, - footerLeft: null, headerFirst: null, footerFirst: null}, - otherPages: {header: null, footer: null, headerLeft: null, - footerLeft: null, headerFirst: null, footerFirst: null} + firstPage: {shapes: [], header: null, footer: null, + headerLeft: null, footerLeft: null, headerFirst: null, + footerFirst: null}, + otherPages: {shapes: [], header: null, footer: null, + headerLeft: null, footerLeft: null, headerFirst: null, + footerFirst: null} }; /** * Read a length of the page layout, in pixels, and fall back on the given @@ -142,6 +146,61 @@ odf.TextLayout = function TextLayout() { } return area; } + /** + * The shapes a master page draws on every page: a watermark, a banner + * along an edge, a note in a margin. The standard allows them beside the + * header and the footer, and it is where they are written, as the margins + * of a page carry no area of their own. + * @param {?Element} masterPage + * @return {!Array.} + */ + function shapesOf(masterPage) { + var shapes = [], + node = masterPage && masterPage.firstElementChild; + while (node) { + if (node.namespaceURI === drawns) { + shapes.push(node); + } + node = node.nextElementSibling; + } + return shapes; + } + /** + * Draw the shapes of a master page on one page, where the shape itself + * says where it goes: what a master page draws is placed against the + * sheet, so the box is the sheet and the offsets are the ones written. + * @param {!Array.} shapes + * @param {!HTMLDivElement} box + * @return {undefined} + */ + function fillPageShapes(shapes, box) { + var doc = box.ownerDocument; + shapes.forEach(function (shape) { + var copy = doc.importNode(shape, true), + x = shape.getAttributeNS(svgns, "x"), + y = shape.getAttributeNS(svgns, "y"), + width = shape.getAttributeNS(svgns, "width"), + height = shape.getAttributeNS(svgns, "height"), + /**@type{!HTMLDivElement}*/ + place = /**@type{!HTMLDivElement}*/(doc.createElementNS( + box.namespaceURI, "div")); + // A node of the document is placed by a box of the page around it: + // an element of another namespace is no HTMLElement, so it carries + // no style of its own to write into, and the styles of the + // document are the ones that draw it. + place.style.position = "absolute"; + place.style.left = x || "0"; + place.style.top = y || "0"; + if (width) { + place.style.width = width; + } + if (height) { + place.style.height = height; + } + place.appendChild(copy); + box.appendChild(place); + }); + } /** * What a master page writes at the top and at the bottom of a page. * @param {?Element} masterPage @@ -158,6 +217,7 @@ odf.TextLayout = function TextLayout() { : null; } return { + shapes: shapesOf(masterPage), header: child("header"), footer: child("footer"), headerLeft: child("header-left"), @@ -173,7 +233,8 @@ odf.TextLayout = function TextLayout() { function hasFurniture(furniture) { return Boolean(furniture.header || furniture.footer || furniture.headerLeft || furniture.footerLeft - || furniture.headerFirst || furniture.footerFirst); + || furniture.headerFirst || furniture.footerFirst + || furniture.shapes.length > 0); } /** * The master page a document names after the first one: a title page is @@ -545,11 +606,15 @@ odf.TextLayout = function TextLayout() { header, /**@type{?Element}*/ footer, + /**@type{!Array.}*/ + shapes, top, n; while (pagesDiv.lastChild - && /**@type{!Element}*/(pagesDiv.lastChild).className - === "webodf-pageFurniture") { + && (/**@type{!Element}*/(pagesDiv.lastChild).className + === "webodf-pageFurniture" + || /**@type{!Element}*/(pagesDiv.lastChild).className + === "webodf-pageShapes")) { pagesDiv.removeChild(pagesDiv.lastChild); } if (!hasFurniture(dims.firstPage) && !hasFurniture(dims.otherPages)) { @@ -559,6 +624,19 @@ odf.TextLayout = function TextLayout() { top = n * (dims.pageHeight + dims.pageSeparation); header = pageArea(dims, "header", n + 1); footer = pageArea(dims, "footer", n + 1); + shapes = (n === 0 ? dims.firstPage : dims.otherPages).shapes; + if (shapes.length > 0) { + box = /**@type{!HTMLDivElement}*/(doc.createElementNS(htmlns, + "div")); + box.className = "webodf-pageShapes"; + box.style.position = "absolute"; + box.style.left = 0; + box.style.right = 0; + box.style.top = top + "px"; + box.style.height = dims.pageHeight + "px"; + fillPageShapes(shapes, box); + pagesDiv.appendChild(box); + } if (header) { box = /**@type{!HTMLDivElement}*/(doc.createElementNS(htmlns, "div")); @@ -612,6 +690,7 @@ odf.TextLayout = function TextLayout() { this.layout = layout; }; /**@typedef{{ + shapes:!Array., header:?Element, footer:?Element, headerLeft:?Element, From 3b64c38a90ea30fc145770925cbba1d2ce95ba33 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 232/385] Emptied the attic, whose tenants the viewers of today replace. --- .gitignore | 1 - attic/CMakeLists.txt | 1 - attic/README | 2 - attic/programs/CMakeLists.txt | 4 - attic/programs/ios/Default-Landscape~ipad.png | Bin 52135 -> 0 bytes attic/programs/ios/Default-Portrait~ipad.png | Bin 51794 -> 0 bytes .../ios/WebODF.xcodeproj/project.pbxproj | 518 -- .../programs/ios/WebODF/Classes/AppDelegate.h | 52 - .../programs/ios/WebODF/Classes/AppDelegate.m | 163 - .../ios/WebODF/Classes/MainViewController.h | 36 - .../ios/WebODF/Classes/MainViewController.m | 140 - .../ios/WebODF/Classes/MainViewController.xib | 118 - .../ios/WebODF/Classes/NSData+Base64.h | 33 - .../ios/WebODF/Classes/NSData+Base64.m | 299 - attic/programs/ios/WebODF/Classes/NativeZip.h | 13 - attic/programs/ios/WebODF/Classes/NativeZip.m | 87 - .../ios/WebODF/Classes/WebViewCache.h | 15 - .../ios/WebODF/Classes/WebViewCache.m | 74 - .../ios/WebODF/Classes/minizip/.gitattributes | 4 - .../ios/WebODF/Classes/minizip/crypt.h | 132 - .../ios/WebODF/Classes/minizip/ioapi.c | 177 - .../ios/WebODF/Classes/minizip/ioapi.h | 75 - .../ios/WebODF/Classes/minizip/mztools.c | 28 - .../ios/WebODF/Classes/minizip/mztools.h | 31 - .../ios/WebODF/Classes/minizip/unzip.c | 1597 ----- .../ios/WebODF/Classes/minizip/unzip.h | 354 -- attic/programs/ios/WebODF/Classes/zip.h | 15 - attic/programs/ios/WebODF/Cordova.plist | 63 - .../Resources/en.lproj/Localizable.strings | 25 - .../ios/WebODF/Resources/icons/icon-72.png | Bin 8844 -> 0 bytes .../ios/WebODF/Resources/icons/icon.png | Bin 6106 -> 0 bytes .../ios/WebODF/Resources/icons/icon@2x.png | Bin 19269 -> 0 bytes .../splash/Default-Landscape~ipad.png | Bin 52135 -> 0 bytes .../splash/Default-Portrait~ipad.png | Bin 51794 -> 0 bytes .../ios/WebODF/Resources/splash/Default.png | Bin 46308 -> 0 bytes .../WebODF/Resources/splash/Default@2x.png | Bin 50982 -> 0 bytes attic/programs/ios/WebODF/WebODF-Info.plist | 122 - attic/programs/ios/WebODF/WebODF-Prefix.pch | 7 - .../ios/WebODF/en.lproj/InfoPlist.strings | 2 - attic/programs/ios/WebODF/main.m | 32 - attic/programs/ios/welcome.odt | Bin 59294 -> 0 bytes attic/programs/ios/www/cordova-1.8.0.js | 5226 ----------------- attic/programs/ios/www/index.html | 51 - attic/programs/ios/www/nativezip.js | 102 - attic/programs/nativeQtClient/CMakeLists.txt | 45 - attic/programs/nativeQtClient/README | 1 - attic/programs/nativeQtClient/application.qrc | 18 - attic/programs/nativeQtClient/main.cpp | 10 - attic/programs/nativeQtClient/mainwindow.cpp | 173 - attic/programs/nativeQtClient/mainwindow.h | 46 - attic/programs/nativeQtClient/mainwindow.ui | 46 - attic/programs/nativeQtClient/odfpage.cpp | 1 - attic/programs/nativeQtClient/odfpage.h | 15 - attic/programs/nativeQtClient/odfview.cpp | 80 - attic/programs/nativeQtClient/odfview.h | 29 - attic/programs/nativeQtClient/scripts.js | 129 - attic/programs/playbook/CMakeLists.txt | 0 attic/programs/playbook/build_sign.bat | 23 - attic/programs/playbook/config.xml | 26 - .../js/common/custom_filereader_dispatcher.js | 53 - .../js/common/custom_filereader_ns.js | 44 - .../blackberry.custom.filereader/library.xml | 22 - .../custom/filereader/CustomFileReader.as | 34 - attic/programs/playbook/icon.png | Bin 19269 -> 0 bytes attic/programs/playbook/index.html | 28 - attic/programs/playbook/scripts.js | 182 - 66 files changed, 10604 deletions(-) delete mode 100644 attic/CMakeLists.txt delete mode 100644 attic/README delete mode 100644 attic/programs/CMakeLists.txt delete mode 100644 attic/programs/ios/Default-Landscape~ipad.png delete mode 100644 attic/programs/ios/Default-Portrait~ipad.png delete mode 100644 attic/programs/ios/WebODF.xcodeproj/project.pbxproj delete mode 100644 attic/programs/ios/WebODF/Classes/AppDelegate.h delete mode 100644 attic/programs/ios/WebODF/Classes/AppDelegate.m delete mode 100644 attic/programs/ios/WebODF/Classes/MainViewController.h delete mode 100644 attic/programs/ios/WebODF/Classes/MainViewController.m delete mode 100644 attic/programs/ios/WebODF/Classes/MainViewController.xib delete mode 100644 attic/programs/ios/WebODF/Classes/NSData+Base64.h delete mode 100644 attic/programs/ios/WebODF/Classes/NSData+Base64.m delete mode 100644 attic/programs/ios/WebODF/Classes/NativeZip.h delete mode 100644 attic/programs/ios/WebODF/Classes/NativeZip.m delete mode 100644 attic/programs/ios/WebODF/Classes/WebViewCache.h delete mode 100644 attic/programs/ios/WebODF/Classes/WebViewCache.m delete mode 100644 attic/programs/ios/WebODF/Classes/minizip/.gitattributes delete mode 100644 attic/programs/ios/WebODF/Classes/minizip/crypt.h delete mode 100644 attic/programs/ios/WebODF/Classes/minizip/ioapi.c delete mode 100644 attic/programs/ios/WebODF/Classes/minizip/ioapi.h delete mode 100644 attic/programs/ios/WebODF/Classes/minizip/mztools.c delete mode 100644 attic/programs/ios/WebODF/Classes/minizip/mztools.h delete mode 100644 attic/programs/ios/WebODF/Classes/minizip/unzip.c delete mode 100644 attic/programs/ios/WebODF/Classes/minizip/unzip.h delete mode 100644 attic/programs/ios/WebODF/Classes/zip.h delete mode 100644 attic/programs/ios/WebODF/Cordova.plist delete mode 100644 attic/programs/ios/WebODF/Resources/en.lproj/Localizable.strings delete mode 100644 attic/programs/ios/WebODF/Resources/icons/icon-72.png delete mode 100644 attic/programs/ios/WebODF/Resources/icons/icon.png delete mode 100644 attic/programs/ios/WebODF/Resources/icons/icon@2x.png delete mode 100644 attic/programs/ios/WebODF/Resources/splash/Default-Landscape~ipad.png delete mode 100644 attic/programs/ios/WebODF/Resources/splash/Default-Portrait~ipad.png delete mode 100755 attic/programs/ios/WebODF/Resources/splash/Default.png delete mode 100755 attic/programs/ios/WebODF/Resources/splash/Default@2x.png delete mode 100644 attic/programs/ios/WebODF/WebODF-Info.plist delete mode 100644 attic/programs/ios/WebODF/WebODF-Prefix.pch delete mode 100644 attic/programs/ios/WebODF/en.lproj/InfoPlist.strings delete mode 100644 attic/programs/ios/WebODF/main.m delete mode 100644 attic/programs/ios/welcome.odt delete mode 100644 attic/programs/ios/www/cordova-1.8.0.js delete mode 100644 attic/programs/ios/www/index.html delete mode 100644 attic/programs/ios/www/nativezip.js delete mode 100644 attic/programs/nativeQtClient/CMakeLists.txt delete mode 100644 attic/programs/nativeQtClient/README delete mode 100644 attic/programs/nativeQtClient/application.qrc delete mode 100644 attic/programs/nativeQtClient/main.cpp delete mode 100644 attic/programs/nativeQtClient/mainwindow.cpp delete mode 100644 attic/programs/nativeQtClient/mainwindow.h delete mode 100644 attic/programs/nativeQtClient/mainwindow.ui delete mode 100644 attic/programs/nativeQtClient/odfpage.cpp delete mode 100644 attic/programs/nativeQtClient/odfpage.h delete mode 100644 attic/programs/nativeQtClient/odfview.cpp delete mode 100644 attic/programs/nativeQtClient/odfview.h delete mode 100644 attic/programs/nativeQtClient/scripts.js delete mode 100644 attic/programs/playbook/CMakeLists.txt delete mode 100644 attic/programs/playbook/build_sign.bat delete mode 100644 attic/programs/playbook/config.xml delete mode 100644 attic/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js delete mode 100644 attic/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js delete mode 100644 attic/programs/playbook/ext/blackberry.custom.filereader/library.xml delete mode 100644 attic/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as delete mode 100644 attic/programs/playbook/icon.png delete mode 100644 attic/programs/playbook/index.html delete mode 100644 attic/programs/playbook/scripts.js diff --git a/.gitignore b/.gitignore index 1bb4cead4..e0a8ce28f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,6 @@ /webodf/tests/simple_slide.odp #android/bin #android/gen -nativeQtClient/nativeQtClient.pro.user programs/ios/WebODF.xcodeproj/project.xcworkspace programs/ios/WebODF.xcodeproj/xcuserdata programs/ios/www/ZoomIn.png diff --git a/attic/CMakeLists.txt b/attic/CMakeLists.txt deleted file mode 100644 index 4be50f553..000000000 --- a/attic/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(programs) diff --git a/attic/README b/attic/README deleted file mode 100644 index c01a8a30e..000000000 --- a/attic/README +++ /dev/null @@ -1,2 +0,0 @@ -This directory is the place where we keep code that is not currently supported but might be revived in the future if someone would like to revive it. -Reviving welcome. diff --git a/attic/programs/CMakeLists.txt b/attic/programs/CMakeLists.txt deleted file mode 100644 index 2fbfeb114..000000000 --- a/attic/programs/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -add_subdirectory(nativeQtClient) - -add_subdirectory(playbook) - diff --git a/attic/programs/ios/Default-Landscape~ipad.png b/attic/programs/ios/Default-Landscape~ipad.png deleted file mode 100644 index 06bb96b394f8360815781aada7d1c3704263726b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52135 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 diff --git a/attic/programs/ios/Default-Portrait~ipad.png b/attic/programs/ios/Default-Portrait~ipad.png deleted file mode 100644 index dbfed967af6dbda81c510e41d83cc9abf4ae9626..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51794 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

Cn*^&C zJ(~MDe`9t6pK=oY&@Ww6NjGiVs|v2q&oI^8dxWN+Duc&33Emq6WBaTKJ|!hp1b_La zJ(*`F&-bGn?QvUc)s;sgfp4xbjE>Wnlv=XHTA=Di#Ol>ZZM&hFsjDPe$vpB|PY!WV zFH`Cgs@XdC-Ih^a=Jc$BP$i=W%}Nk0I}&3bq0|uGUu|cdk0Fw z^_Bv_wHeZt`b*4Kv*coQDuO}JNaQm>a35nTSwUJ*t>tc_S`VylT3@^s9b!>+6wpER zlwmSSlPpN{!jjGT4ZTF*S)ZkvZW>Ppkwgq1O!<33n#r%uLIe2z@+?0to0gnf{q(tL zNS?{ED|=QIQmE^hGADCM=jtz+(;4I_yOQhm4wn#IZPA(vx%aBTR^pE~s))LNgZ=9c z`D+v0Tp3{;wky%FG6ufV&n#Z+(gp)13XRh-YsuX^R^PA8I9|7^a+(v9)vY?|GD$~& z8y>s$>U!1aq;_pba6Pt*UmaCHfmv#|fhqK_j4bBu{x8*CNeaq_qbD5cMEc_`;10yQU7o%{YKMGAgQ^s?2mg;2qp68((jO78JO+#%Etny zS4FLLIT(qJ@5F`ny)Rd3n7^C+VuVoGcD`~?-=)SoN+Aa(a|vr}1K;`9;EUbdY9^Kh zz$6LJy813;j{_Z79MR8cm8;c{5XyMfzELs;+IH?$vMuwu&^-A1gMi#N*_x`$n#kS zSg2?%4SB4iK4QWgfC!?~^l$ELDK*T$3G)-KJVB}dy3jJ@Ok|8Ocy3fY&-Q=`S-e?< zo}L*b0Y2CKNUx=es*Xx3R~Z%20 zHUT_J>y8E4*c?-4&O5K}E6q~F-MKm9z*y%Gpqra!a$-_c3xg}e1LuINERf-A>{k@> z38An(h)=^TdyA+?NZx4w`Z|7@ESpz_*&*VU-X|3iC;{oO!z1&ywl9{n^B2R$37@(m zFm`9C0C=J=u@H#p@(B^xQEc?bE(P8Ci`)?0>}T)+*2|!mXK>tNOV?Zy38Oxc{njsJP?m?QXb;c3F&h$-3w@cR`6~6 zt$Cw#Rm?Asa~@k9ugd*Oqm@cY?^|Sa>GbkVa6)S-Ub>TASR5AQ4@%LU2wkfca(6DQ zOpy+x{cga2`b8$mb%vVr#TOFJ+1skW9)Uau$o(I)tq0CMJK%^O*m@{ga6o?nYFZXH z$R^OLzLK*f5;%>hJ$(6fenxmpV>qK(c-u)1Vb{1aJaa*w4?Z1tVtAc<+rP$~UnuDr zCxh^48eb+|6fd#gOlI~U9wlBk75|f?-H{YA1MWPaIQEHrk4aQuYwJ|iD_uUq=+@-6rm!*Z zlUP!YB>o~HEZvF!IquEn3~l~>-ay3ROeVh8`0;5!0#Vjls>nj6!DO7_Sjo4i%4!Oz zbSA@J{w=#!9&Bhq{%x%fe8RoLt1igsrk*C5^e7`ET$Qt4JSEDJjA!hYYZ?b#Q&KUU zNj9AuOP2#%C&ZS2RNuhfa1nejFa!}FPqvZQE}7L?9$lbc3$zARi4`jo$uSf(%tveb zP!w>8j%VFAovY6qHmI!=*Na0K!(qg$!LJ_`?J+t`;W5vEb9d)FvTl2oXeqankVo^#(M^U?nUHeT>Ol7}&BW_;Q2z%AYy;@=SnEFhSe&(m}AoA1x< zQyDD7I#gz2arKzP0iX=*UWu9rIQpGmic2g^1DCf%{68~j_?x7NsW&fk6+9=InYyuUOo5=SQ(%$M6cBDJXeEm@7p2D} zH+#!=W=^XD;w@H7c;NZai1+pnTOYW?I37`q4PxNZ7kLX^{v{^v($<;15D0C}nR_L| zU;)BdL8zZniqIEVTS=7#S&N^Cf(XaqQSJt~b=xE{ z8cQMKui*=8zCCs+zVieq(JiHaVwasOzDG}>B9zJ%=9_LwmM<#%5d6mv?=wlv{i@P_ z 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 -#define CORDOVA_FRAMEWORK -#ifdef CORDOVA_FRAMEWORK - #import -#else - #import "CDVViewController.h" -#endif -#import "WebViewCache.h" - - -@interface AppDelegate : NSObject < UIApplicationDelegate > { - -} - -// invoke string is passed to your app on launch, this is only valid if you -// edit WebODF-Info.plist to add a protocol -// a simple tutorial can be found here : -// http://iphonedevelopertips.com/cocoa/launching-your-own-application-via-a-custom-url-scheme.html - -@property (nonatomic, retain) IBOutlet UIWindow* window; -@property (nonatomic, retain) IBOutlet CDVViewController* viewController; -@property (nonatomic, retain) IBOutlet WebViewCache* cache; - -@end - diff --git a/attic/programs/ios/WebODF/Classes/AppDelegate.m b/attic/programs/ios/WebODF/Classes/AppDelegate.m deleted file mode 100644 index 7d6358d86..000000000 --- a/attic/programs/ios/WebODF/Classes/AppDelegate.m +++ /dev/null @@ -1,163 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -// -// AppDelegate.m -// WebODF -// -// Created by KO GmbH on 6/13/12. -// Copyright __MyCompanyName__ 2012. All rights reserved. -// - -#import "AppDelegate.h" -#import "MainViewController.h" - -#ifdef CORDOVA_FRAMEWORK - #import - #import -#else - #import "CDVPlugin.h" - #import "CDVURLProtocol.h" -#endif -#import "WebViewCache.h" - -@implementation AppDelegate - -@synthesize window, viewController, cache; - -- (id) init -{ - /** If you need to do any extra app-specific initialization, you can do it here - * -jm - **/ - NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; - [cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways]; - - [CDVURLProtocol registerURLProtocol]; - - return [super init]; -} - -#pragma UIApplicationDelegate implementation - -/** - * This is main kick off after the app inits, the views and Settings are setup here. (preferred - iOS4 and up) - */ -- (BOOL) application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions -{ - NSURL* url = [launchOptions objectForKey:UIApplicationLaunchOptionsURLKey]; - NSString* invokeString = nil; - - if (url && [url isKindOfClass:[NSURL class]]) { - invokeString = [url absoluteString]; - NSLog(@"WebODF launchOptions = %@", url); - } - - CGRect screenBounds = [[UIScreen mainScreen] bounds]; - self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease]; - self.window.autoresizesSubviews = YES; - - CGRect viewBounds = [[UIScreen mainScreen] applicationFrame]; - - self.viewController = [[[MainViewController alloc] init] autorelease]; - self.viewController.useSplashScreen = YES; - self.viewController.wwwFolderName = @"www"; - self.viewController.startPage = @"index.html"; - self.viewController.invokeString = invokeString; - self.viewController.view.frame = viewBounds; - - // check whether the current orientation is supported: if it is, keep it, rather than forcing a rotation - BOOL forceStartupRotation = YES; - UIDeviceOrientation curDevOrientation = [[UIDevice currentDevice] orientation]; - - if (UIDeviceOrientationUnknown == curDevOrientation) { - // UIDevice isn't firing orientation notifications yet… go look at the status bar - curDevOrientation = (UIDeviceOrientation)[[UIApplication sharedApplication] statusBarOrientation]; - } - - if (UIDeviceOrientationIsValidInterfaceOrientation(curDevOrientation)) { - for (NSNumber *orient in self.viewController.supportedOrientations) { - if ([orient intValue] == curDevOrientation) { - forceStartupRotation = NO; - break; - } - } - } - - if (forceStartupRotation) { - NSLog(@"supportedOrientations: %@", self.viewController.supportedOrientations); - // The first item in the supportedOrientations array is the start orientation (guaranteed to be at least Portrait) - UIInterfaceOrientation newOrient = [[self.viewController.supportedOrientations objectAtIndex:0] intValue]; - NSLog(@"AppDelegate forcing status bar to: %d from: %d", newOrient, curDevOrientation); - [[UIApplication sharedApplication] setStatusBarOrientation:newOrient]; - } - - [self.window addSubview:self.viewController.view]; - [self.window makeKeyAndVisible]; - - NSString *path = @"./cache"; - NSUInteger diskCapacity = 1*1024*1024; - NSUInteger memoryCapacity = 0*1024*1024; - - cache = [[WebViewCache alloc] initWithMemoryCapacity: memoryCapacity - diskCapacity: diskCapacity diskPath: path]; - [NSURLCache setSharedURLCache:cache]; - - // copy welcome.odt to the Documents folder - - - NSFileManager *fileManager = [NSFileManager defaultManager]; - NSError *error; - NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); - NSString *documentsDirectory = [paths objectAtIndex:0]; - - NSString *txtPath = [documentsDirectory stringByAppendingPathComponent:@"welcome.odt"]; - - if ([fileManager fileExistsAtPath:txtPath] == NO) { - NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"welcome" ofType:@"odt"]; - [fileManager copyItemAtPath:resourcePath toPath:txtPath error:&error]; - } - - return YES; -} - -// this happens while we are running ( in the background, or from within our own app ) -// only valid if WebODF-Info.plist specifies a protocol to handle -- (BOOL) application:(UIApplication*)application handleOpenURL:(NSURL*)url -{ - if (!url) { - return NO; - } - - // calls into javascript global function 'handleOpenURL' - NSString* jsString = [NSString stringWithFormat:@"handleOpenURL(\"%@\");", url]; - [self.viewController.webView stringByEvaluatingJavaScriptFromString:jsString]; - - // all plugins will get the notification, and their handlers will be called - [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:CDVPluginHandleOpenURLNotification object:url]]; - - return YES; -} - -- (void) dealloc -{ - [super dealloc]; -} - -@end diff --git a/attic/programs/ios/WebODF/Classes/MainViewController.h b/attic/programs/ios/WebODF/Classes/MainViewController.h deleted file mode 100644 index 213b69572..000000000 --- a/attic/programs/ios/WebODF/Classes/MainViewController.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -// -// MainViewController.h -// WebODF -// -// Created by KO GmbH on 6/13/12. -// Copyright __MyCompanyName__ 2012. All rights reserved. -// -#define CORDOVA_FRAMEWORK -#ifdef CORDOVA_FRAMEWORK - #import -#else - #import "CDVViewController.h" -#endif - -@interface MainViewController : CDVViewController - -@end diff --git a/attic/programs/ios/WebODF/Classes/MainViewController.m b/attic/programs/ios/WebODF/Classes/MainViewController.m deleted file mode 100644 index 0cefa4eed..000000000 --- a/attic/programs/ios/WebODF/Classes/MainViewController.m +++ /dev/null @@ -1,140 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -// -// MainViewController.h -// WebODF -// -// Created by KO GmbH on 6/13/12. -// Copyright __MyCompanyName__ 2012. All rights reserved. -// - -#import "MainViewController.h" - -@implementation MainViewController - -- (id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil -{ - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - if (self) { - // Custom initialization - } - return self; -} - -- (void) didReceiveMemoryWarning -{ - // Releases the view if it doesn't have a superview. - [super didReceiveMemoryWarning]; - - // Release any cached data, images, etc that aren't in use. -} - -#pragma mark - View lifecycle - -- (void) viewDidLoad -{ - [super viewDidLoad]; - // Do any additional setup after loading the view from its nib. -} - -- (void) viewDidUnload -{ - [super viewDidUnload]; - // Release any retained subviews of the main view. - // e.g. self.myOutlet = nil; -} - -- (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation -{ - // Return YES for supported orientations - return [super shouldAutorotateToInterfaceOrientation:interfaceOrientation]; -} - -/* Comment out the block below to over-ride */ -/* -- (CDVCordovaView*) newCordovaViewWithFrame:(CGRect)bounds -{ - return[super newCordovaViewWithFrame:bounds]; -} -*/ - -/* Comment out the block below to over-ride */ -/* -#pragma CDVCommandDelegate implementation - -- (id) getCommandInstance:(NSString*)className -{ - return [super getCommandInstance:className]; -} - -- (BOOL) execute:(CDVInvokedUrlCommand*)command -{ - return [super execute:command]; -} - -- (NSString*) pathForResource:(NSString*)resourcepath; -{ - return [super pathForResource:resourcepath]; -} - -- (void) registerPlugin:(CDVPlugin*)plugin withClassName:(NSString*)className -{ - return [super registerPlugin:plugin withClassName:className]; -} -*/ - -#pragma UIWebDelegate implementation - -- (void) webViewDidFinishLoad:(UIWebView*) theWebView -{ - // only valid if ___PROJECTNAME__-Info.plist specifies a protocol to handle - if (self.invokeString) - { - // this is passed before the deviceready event is fired, so you can access it in js when you receive deviceready - NSString* jsString = [NSString stringWithFormat:@"var invokeString = \"%@\";", self.invokeString]; - [theWebView stringByEvaluatingJavaScriptFromString:jsString]; - } - - // Black base color for background matches the native apps - theWebView.backgroundColor = [UIColor blackColor]; - - return [super webViewDidFinishLoad:theWebView]; -} - -/* Comment out the block below to over-ride */ -/* - -- (void) webViewDidStartLoad:(UIWebView*)theWebView -{ - return [super webViewDidStartLoad:theWebView]; -} - -- (void) webView:(UIWebView*)theWebView didFailLoadWithError:(NSError*)error -{ - return [super webView:theWebView didFailLoadWithError:error]; -} - -- (BOOL) webView:(UIWebView*)theWebView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType -{ - return [super webView:theWebView shouldStartLoadWithRequest:request navigationType:navigationType]; -} -*/ - -@end diff --git a/attic/programs/ios/WebODF/Classes/MainViewController.xib b/attic/programs/ios/WebODF/Classes/MainViewController.xib deleted file mode 100644 index 9837f578c..000000000 --- a/attic/programs/ios/WebODF/Classes/MainViewController.xib +++ /dev/null @@ -1,118 +0,0 @@ - - - - 1280 - 11C25 - 1919 - 1138.11 - 566.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 916 - - - IBProxyObject - IBUIView - - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - PluginDependencyRecalculationVersion - - - - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - {{0, 20}, {320, 460}} - - - - 3 - MQA - - 2 - - - - IBCocoaTouchFramework - - - - - - - view - - - - 3 - - - - - - 0 - - - - - - 1 - - - - - -1 - - - File's Owner - - - -2 - - - - - - - MainViewController - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - - - 3 - - - - - MainViewController - UIViewController - - IBProjectSource - ./Classes/MainViewController.h - - - - - 0 - IBCocoaTouchFramework - YES - 3 - 916 - - diff --git a/attic/programs/ios/WebODF/Classes/NSData+Base64.h b/attic/programs/ios/WebODF/Classes/NSData+Base64.h deleted file mode 100644 index eb1ff485a..000000000 --- a/attic/programs/ios/WebODF/Classes/NSData+Base64.h +++ /dev/null @@ -1,33 +0,0 @@ -// -// NSData+Base64.h -// base64 -// -// Created by Matt Gallagher on 2009/06/03. -// Copyright 2009 Matt Gallagher. All rights reserved. -// -// Permission is given to use this source code file, free of charge, in any -// project, commercial or otherwise, entirely at your risk, with the condition -// that any redistribution (in part or whole) of source code must retain -// this copyright and permission notice. Attribution in compiled projects is -// appreciated but not required. -// - -#import - -void *NewBase64Decode( - const char *inputBuffer, - size_t length, - size_t *outputLength); - -char *NewBase64Encode( - const void *inputBuffer, - size_t length, - bool separateLines, - size_t *outputLength); - -@interface NSData (Base64) - -+ (NSData *)dataFromBase64String:(NSString *)aString; -- (NSString *)base64EncodedString; - -@end diff --git a/attic/programs/ios/WebODF/Classes/NSData+Base64.m b/attic/programs/ios/WebODF/Classes/NSData+Base64.m deleted file mode 100644 index 13f828d09..000000000 --- a/attic/programs/ios/WebODF/Classes/NSData+Base64.m +++ /dev/null @@ -1,299 +0,0 @@ -// -// NSData+Base64.m -// base64 -// -// Created by Matt Gallagher on 2009/06/03. -// Copyright 2009 Matt Gallagher. All rights reserved. -// -// Permission is given to use this source code file, free of charge, in any -// project, commercial or otherwise, entirely at your risk, with the condition -// that any redistribution (in part or whole) of source code must retain -// this copyright and permission notice. Attribution in compiled projects is -// appreciated but not required. -// - -#import "NSData+Base64.h" - -// -// Mapping from 6 bit pattern to ASCII character. -// -static unsigned char base64EncodeLookup[65] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - -// -// Definition for "masked-out" areas of the base64DecodeLookup mapping -// -#define xx 65 - -// -// Mapping from ASCII character to 6 bit pattern. -// -static unsigned char base64DecodeLookup[256] = -{ - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, xx, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx, - xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, xx, - xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, - xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, -}; - -// -// Fundamental sizes of the binary and base64 encode/decode units in bytes -// -#define BINARY_UNIT_SIZE 3 -#define BASE64_UNIT_SIZE 4 - -// -// NewBase64Decode -// -// Decodes the base64 ASCII string in the inputBuffer to a newly malloced -// output buffer. -// -// inputBuffer - the source ASCII string for the decode -// length - the length of the string or -1 (to specify strlen should be used) -// outputLength - if not-NULL, on output will contain the decoded length -// -// returns the decoded buffer. Must be free'd by caller. Length is given by -// outputLength. -// -void *NewBase64Decode( - const char *inputBuffer, - size_t length, - size_t *outputLength) -{ - if (length == -1) - { - length = strlen(inputBuffer); - } - - size_t outputBufferSize = (length / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE; - unsigned char *outputBuffer = (unsigned char *)malloc(outputBufferSize); - - size_t i = 0; - size_t j = 0; - while (i < length) - { - // - // Accumulate 4 valid characters (ignore everything else) - // - unsigned char accumulated[BASE64_UNIT_SIZE]; - bzero(accumulated, sizeof(unsigned char) * BASE64_UNIT_SIZE); - size_t accumulateIndex = 0; - while (i < length) - { - unsigned char decode = base64DecodeLookup[inputBuffer[i++]]; - if (decode != xx) - { - accumulated[accumulateIndex] = decode; - accumulateIndex++; - - if (accumulateIndex == BASE64_UNIT_SIZE) - { - break; - } - } - } - - // - // Store the 6 bits from each of the 4 characters as 3 bytes - // - outputBuffer[j] = (accumulated[0] << 2) | (accumulated[1] >> 4); - outputBuffer[j + 1] = (accumulated[1] << 4) | (accumulated[2] >> 2); - outputBuffer[j + 2] = (accumulated[2] << 6) | accumulated[3]; - j += accumulateIndex - 1; - } - - if (outputLength) - { - *outputLength = j; - } - return outputBuffer; -} - -// -// NewBase64Decode -// -// Encodes the arbitrary data in the inputBuffer as base64 into a newly malloced -// output buffer. -// -// inputBuffer - the source data for the encode -// length - the length of the input in bytes -// separateLines - if zero, no CR/LF characters will be added. Otherwise -// a CR/LF pair will be added every 64 encoded chars. -// outputLength - if not-NULL, on output will contain the encoded length -// (not including terminating 0 char) -// -// returns the encoded buffer. Must be free'd by caller. Length is given by -// outputLength. -// -char *NewBase64Encode( - const void *buffer, - size_t length, - bool separateLines, - size_t *outputLength) -{ - const unsigned char *inputBuffer = (const unsigned char *)buffer; - - #define MAX_NUM_PADDING_CHARS 2 - #define OUTPUT_LINE_LENGTH 64 - #define INPUT_LINE_LENGTH ((OUTPUT_LINE_LENGTH / BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE) - #define CR_LF_SIZE 0 - - // - // Byte accurate calculation of final buffer size - // - size_t outputBufferSize = - ((length / BINARY_UNIT_SIZE) - + ((length % BINARY_UNIT_SIZE) ? 1 : 0)) - * BASE64_UNIT_SIZE; - if (separateLines) - { - outputBufferSize += - (outputBufferSize / OUTPUT_LINE_LENGTH) * CR_LF_SIZE; - } - - // - // Include space for a terminating zero - // - outputBufferSize += 1; - - // - // Allocate the output buffer - // - char *outputBuffer = (char *)malloc(outputBufferSize); - if (!outputBuffer) - { - return NULL; - } - - size_t i = 0; - size_t j = 0; - const size_t lineLength = separateLines ? INPUT_LINE_LENGTH : length; - size_t lineEnd = lineLength; - - while (true) - { - if (lineEnd > length) - { - lineEnd = length; - } - - for (; i + BINARY_UNIT_SIZE - 1 < lineEnd; i += BINARY_UNIT_SIZE) - { - // - // Inner loop: turn 48 bytes into 64 base64 characters - // - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; - outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4) - | ((inputBuffer[i + 1] & 0xF0) >> 4)]; - outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i + 1] & 0x0F) << 2) - | ((inputBuffer[i + 2] & 0xC0) >> 6)]; - outputBuffer[j++] = base64EncodeLookup[inputBuffer[i + 2] & 0x3F]; - } - - if (lineEnd == length) - { - break; - } - - // - // Add the newline - // - //outputBuffer[j++] = '\r'; - //outputBuffer[j++] = '\n'; - lineEnd += lineLength; - } - - if (i + 1 < length) - { - // - // Handle the single '=' case - // - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; - outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4) - | ((inputBuffer[i + 1] & 0xF0) >> 4)]; - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i + 1] & 0x0F) << 2]; - outputBuffer[j++] = '='; - } - else if (i < length) - { - // - // Handle the double '=' case - // - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; - outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0x03) << 4]; - outputBuffer[j++] = '='; - outputBuffer[j++] = '='; - } - outputBuffer[j] = 0; - - // - // Set the output length and return the buffer - // - if (outputLength) - { - *outputLength = j; - } - return outputBuffer; -} - -@implementation NSData (Base64) - -// -// dataFromBase64String: -// -// Creates an NSData object containing the base64 decoded representation of -// the base64 string 'aString' -// -// Parameters: -// aString - the base64 string to decode -// -// returns the autoreleased NSData representation of the base64 string -// -+ (NSData *)dataFromBase64String:(NSString *)aString -{ - NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding]; - size_t outputLength; - void *outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength); - NSData *result = [NSData dataWithBytes:outputBuffer length:outputLength]; - free(outputBuffer); - return result; -} - -// -// base64EncodedString -// -// Creates an NSString object that contains the base 64 encoding of the -// receiver's data. Lines are broken at 64 characters long. -// -// returns an autoreleased NSString being the base 64 representation of the -// receiver. -// -- (NSString *)base64EncodedString -{ - size_t outputLength; - char *outputBuffer = - NewBase64Encode([self bytes], [self length], true, &outputLength); - - NSString *result = - [[[NSString alloc] - initWithBytes:outputBuffer - length:outputLength - encoding:NSASCIIStringEncoding] - autorelease]; - free(outputBuffer); - return result; -} - -@end diff --git a/attic/programs/ios/WebODF/Classes/NativeZip.h b/attic/programs/ios/WebODF/Classes/NativeZip.h deleted file mode 100644 index 8f7177916..000000000 --- a/attic/programs/ios/WebODF/Classes/NativeZip.h +++ /dev/null @@ -1,13 +0,0 @@ -#import - -@interface NativeZip : CDVPlugin { - NSString* callbackID; -} - -@property (nonatomic, copy) NSString* callbackID; - -- (void) load:(BOOL)base64 arguments:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; -- (void) loadAsString:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; -- (void) loadAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options; - -@end \ No newline at end of file diff --git a/attic/programs/ios/WebODF/Classes/NativeZip.m b/attic/programs/ios/WebODF/Classes/NativeZip.m deleted file mode 100644 index 7ed75475b..000000000 --- a/attic/programs/ios/WebODF/Classes/NativeZip.m +++ /dev/null @@ -1,87 +0,0 @@ -#import "NativeZip.h" -#import "minizip/unzip.h" -#import "NSData+Base64.h" - -@implementation NativeZip -@synthesize callbackID; - --(void) load:(BOOL)base64 arguments:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options -{ - self.callbackID = [arguments objectAtIndex:0]; - NSString *zipPath = [arguments objectAtIndex:1]; - NSString *entryPath = [arguments objectAtIndex:2]; - NSString *mimetype = nil; - if (base64 == TRUE) { - mimetype = [arguments objectAtIndex:3]; - } - - const char* path = [ zipPath cStringUsingEncoding:NSUTF8StringEncoding ]; - unzFile unzipFile = unzOpen(path); - NSString* jsString = nil; - BOOL error = TRUE; - if (!unzipFile) { - jsString = [[NSString alloc] initWithString: @"cannot open file"]; - [jsString autorelease]; - } else { - path = [ entryPath cStringUsingEncoding:NSUTF8StringEncoding ]; - int r = unzLocateFile(unzipFile, path, 2); - if (r != UNZ_OK) { - jsString = [[NSString alloc] initWithString: @"cannot find entry"]; - [jsString autorelease]; - } else { - unz_file_info info; - r = unzGetCurrentFileInfo(unzipFile, &info, 0, 0, 0, 0, 0, 0); - if (r != UNZ_OK) { - jsString = [[NSString alloc] initWithString: @"cannot determine size"]; - [jsString autorelease]; - } else { - r = unzOpenCurrentFile(unzipFile); - if (r != UNZ_OK) { - jsString = [[NSString alloc] initWithString: @"cannot open entry"]; - [jsString autorelease]; - } else { - char* contents = malloc(info.uncompressed_size); - r = unzReadCurrentFile(unzipFile, contents, info.uncompressed_size); - if (r != info.uncompressed_size) { - jsString = [[NSString alloc] initWithString: @"cannot uncompress file"]; - [jsString autorelease]; - } else { - if (base64) { - NSData* readData = [NSData dataWithBytes:(const void *)contents length:sizeof(unsigned char)*info.uncompressed_size]; - jsString = [NSString stringWithFormat:@"data:%@;base64,%@", mimetype, [readData base64EncodedString]]; - } else { - jsString = [[NSString alloc] initWithUTF8String: contents]; - [jsString autorelease]; - } - } - unzCloseCurrentFile(unzipFile); - free(contents); - error = FALSE; - } - } - } - unzClose(unzipFile); - } - - CDVPluginResult* pluginResult = [CDVPluginResult - resultWithStatus:CDVCommandStatus_OK - messageAsString: jsString - ]; - if (!error) { - [self writeJavascript: [pluginResult toSuccessCallbackString:self.callbackID]]; - } else { - [self writeJavascript: [pluginResult toErrorCallbackString:self.callbackID]]; - } - //free(jsString); [jsString release]; -} - --(void)loadAsString:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options -{ - [self load:FALSE arguments:arguments withDict:options]; -} --(void)loadAsDataURL:(NSMutableArray*)arguments withDict:(NSMutableDictionary*)options -{ - [self load:TRUE arguments:arguments withDict:options]; -} - -@end diff --git a/attic/programs/ios/WebODF/Classes/WebViewCache.h b/attic/programs/ios/WebODF/Classes/WebViewCache.h deleted file mode 100644 index 216a0bf2b..000000000 --- a/attic/programs/ios/WebODF/Classes/WebViewCache.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// WebCache.h -// KO Viewer -// -// Created by Tobias Hintze on 3/5/12. -// Copyright (c) 2012 KO GmbH. All rights reserved. -// - -#import - -@interface WebViewCache : NSURLCache - -- (NSData*)getSomeData:(NSString*)zip entry:(NSString*)entry; - -@end diff --git a/attic/programs/ios/WebODF/Classes/WebViewCache.m b/attic/programs/ios/WebODF/Classes/WebViewCache.m deleted file mode 100644 index 777bfa47a..000000000 --- a/attic/programs/ios/WebODF/Classes/WebViewCache.m +++ /dev/null @@ -1,74 +0,0 @@ -// -// WebCache.m -// KO Viewer -// -// Created by Tobias Hintze on 3/5/12. -// Copyright (c) 2012 KO GmbH. All rights reserved. -// - -#import "WebViewCache.h" -#import "minizip/unzip.h" - -@implementation WebViewCache - -- (NSCachedURLResponse*)cachedResponseForRequest:(NSURLRequest*)request -{ - [super removeAllCachedResponses]; - NSURL *url = [request URL]; - if ([url query]) { - NSData *somedata = [self getSomeData:[url path] entry:[url query]]; - NSHTTPURLResponse *response = [[NSHTTPURLResponse alloc] initWithURL:url - MIMEType:@"text/xml" - expectedContentLength:[somedata length] - textEncodingName:nil]; - NSCachedURLResponse *cachedResponse = [[NSCachedURLResponse alloc] - initWithResponse:response data:somedata]; - [response autorelease]; - [cachedResponse autorelease]; - return cachedResponse; - } - return [super cachedResponseForRequest:request]; -} - -- (NSData*)getSomeData:(NSString*)zip entry:(NSString*)entry -{ - NSLog(@"get some data: %@ %@", zip, entry); - const char* path = [ zip cStringUsingEncoding:NSUTF8StringEncoding ]; - unzFile unzipFile = unzOpen(path); - NSData *data = nil; - if (!unzipFile) { - NSLog(@"cannot open file %@", zip); - } else { - path = [ entry cStringUsingEncoding:NSUTF8StringEncoding ]; - int r = unzLocateFile(unzipFile, path, 2); - if (r != UNZ_OK) { - NSLog(@"cannot find entry %@", entry); - } else { - unz_file_info info; - r = unzGetCurrentFileInfo(unzipFile, &info, 0, 0, 0, 0, 0, 0); - if (r != UNZ_OK) { - NSLog(@"cannot determine size of %@", entry); - } else { - r = unzOpenCurrentFile(unzipFile); - if (r != UNZ_OK) { - NSLog(@"cannot open entry %@", entry); - } else { - char* contents = malloc(info.uncompressed_size); - r = unzReadCurrentFile(unzipFile, contents, info.uncompressed_size); - if (r != info.uncompressed_size) { - NSLog(@"cannot uncompress file %@", entry); - } else { - data = [NSData dataWithBytes:(const void *)contents length:sizeof(unsigned char)*info.uncompressed_size]; - NSLog(@"read file entry %li %@", info.uncompressed_size, entry); - } - unzCloseCurrentFile(unzipFile); - free(contents); - } - } - } - unzClose(unzipFile); - } - return data; -} - -@end diff --git a/attic/programs/ios/WebODF/Classes/minizip/.gitattributes b/attic/programs/ios/WebODF/Classes/minizip/.gitattributes deleted file mode 100644 index b15706354..000000000 --- a/attic/programs/ios/WebODF/Classes/minizip/.gitattributes +++ /dev/null @@ -1,4 +0,0 @@ -# Unset behaviour for some text-like files, as this is just a copy of original files, -# with obviously DOS line endings - -* binary diff --git a/attic/programs/ios/WebODF/Classes/minizip/crypt.h b/attic/programs/ios/WebODF/Classes/minizip/crypt.h deleted file mode 100644 index 622f4bc2e..000000000 --- a/attic/programs/ios/WebODF/Classes/minizip/crypt.h +++ /dev/null @@ -1,132 +0,0 @@ -/* crypt.h -- base code for crypt/uncrypt ZIPfile - - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - This code is a modified version of crypting code in Infozip distribution - - The encryption/decryption parts of this source code (as opposed to the - non-echoing password parts) were originally written in Europe. The - whole source package can be freely distributed, including from the USA. - (Prior to January 2000, re-export from the US was a violation of US law.) - - This encryption code is a direct transcription of the algorithm from - Roger Schlafly, described by Phil Katz in the file appnote.txt. This - file (appnote.txt) is distributed with the PKZIP program (even in the - version without encryption capabilities). - - If you don't need crypting in your application, just define symbols - NOCRYPT and NOUNCRYPT. - - This code support the "Traditional PKWARE Encryption". - - The new AES encryption added on Zip format by Winzip (see the page - http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong - Encryption is not supported. -*/ - -#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8)) - -/*********************************************************************** - * Return the next byte in the pseudo-random sequence - */ -static int decrypt_byte(unsigned long* pkeys, const unsigned long* pcrc_32_tab) -{ - unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an - * unpredictable manner on 16-bit systems; not a problem - * with any known compiler so far, though */ - - temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2; - return (int)(((temp * (temp ^ 1)) >> 8) & 0xff); -} - -/*********************************************************************** - * Update the encryption keys with the next byte of plain text - */ -static int update_keys(unsigned long* pkeys,const unsigned long* pcrc_32_tab,int c) -{ - (*(pkeys+0)) = CRC32((*(pkeys+0)), c); - (*(pkeys+1)) += (*(pkeys+0)) & 0xff; - (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1; - { - register int keyshift = (int)((*(pkeys+1)) >> 24); - (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift); - } - return c; -} - - -/*********************************************************************** - * Initialize the encryption keys and the random header according to - * the given password. - */ -static void init_keys(const char* passwd,unsigned long* pkeys,const unsigned long* pcrc_32_tab) -{ - *(pkeys+0) = 305419896L; - *(pkeys+1) = 591751049L; - *(pkeys+2) = 878082192L; - while (*passwd != '\0') { - update_keys(pkeys,pcrc_32_tab,(int)*passwd); - passwd++; - } -} - -#define zdecode(pkeys,pcrc_32_tab,c) \ - (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab))) - -#define zencode(pkeys,pcrc_32_tab,c,t) \ - (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c)) - -#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED - -#define RAND_HEAD_LEN 12 - /* "last resort" source for second part of crypt seed pattern */ -# ifndef ZCR_SEED2 -# define ZCR_SEED2 3141592654UL /* use PI as default pattern */ -# endif - -static int crypthead(passwd, buf, bufSize, pkeys, pcrc_32_tab, crcForCrypting) - const char *passwd; /* password string */ - unsigned char *buf; /* where to write header */ - int bufSize; - unsigned long* pkeys; - const unsigned long* pcrc_32_tab; - unsigned long crcForCrypting; -{ - int n; /* index in random header */ - int t; /* temporary */ - int c; /* random byte */ - unsigned char header[RAND_HEAD_LEN-2]; /* random header */ - static unsigned calls = 0; /* ensure different random header each time */ - - if (bufSize> 7) & 0xff; - header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t); - } - /* Encrypt random header (last two bytes is high word of crc) */ - init_keys(passwd, pkeys, pcrc_32_tab); - for (n = 0; n < RAND_HEAD_LEN-2; n++) - { - buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t); - } - buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t); - buf[n++] = zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t); - return n; -} - -#endif diff --git a/attic/programs/ios/WebODF/Classes/minizip/ioapi.c b/attic/programs/ios/WebODF/Classes/minizip/ioapi.c deleted file mode 100644 index 7f20c182f..000000000 --- a/attic/programs/ios/WebODF/Classes/minizip/ioapi.c +++ /dev/null @@ -1,177 +0,0 @@ -/* ioapi.c -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant -*/ - -#include -#include -#include - -#include "zlib.h" -#include "ioapi.h" - - - -/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */ - -#ifndef SEEK_CUR -#define SEEK_CUR 1 -#endif - -#ifndef SEEK_END -#define SEEK_END 2 -#endif - -#ifndef SEEK_SET -#define SEEK_SET 0 -#endif - -voidpf ZCALLBACK fopen_file_func OF(( - voidpf opaque, - const char* filename, - int mode)); - -uLong ZCALLBACK fread_file_func OF(( - voidpf opaque, - voidpf stream, - void* buf, - uLong size)); - -uLong ZCALLBACK fwrite_file_func OF(( - voidpf opaque, - voidpf stream, - const void* buf, - uLong size)); - -long ZCALLBACK ftell_file_func OF(( - voidpf opaque, - voidpf stream)); - -long ZCALLBACK fseek_file_func OF(( - voidpf opaque, - voidpf stream, - uLong offset, - int origin)); - -int ZCALLBACK fclose_file_func OF(( - voidpf opaque, - voidpf stream)); - -int ZCALLBACK ferror_file_func OF(( - voidpf opaque, - voidpf stream)); - - -voidpf ZCALLBACK fopen_file_func (opaque, filename, mode) - voidpf opaque; - const char* filename; - int mode; -{ - FILE* file = NULL; - const char* mode_fopen = NULL; - if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ) - mode_fopen = "rb"; - else - if (mode & ZLIB_FILEFUNC_MODE_EXISTING) - mode_fopen = "r+b"; - else - if (mode & ZLIB_FILEFUNC_MODE_CREATE) - mode_fopen = "wb"; - - if ((filename!=NULL) && (mode_fopen != NULL)) - file = fopen(filename, mode_fopen); - return file; -} - - -uLong ZCALLBACK fread_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - void* buf; - uLong size; -{ - uLong ret; - ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream); - return ret; -} - - -uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size) - voidpf opaque; - voidpf stream; - const void* buf; - uLong size; -{ - uLong ret; - ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream); - return ret; -} - -long ZCALLBACK ftell_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - long ret; - ret = ftell((FILE *)stream); - return ret; -} - -long ZCALLBACK fseek_file_func (opaque, stream, offset, origin) - voidpf opaque; - voidpf stream; - uLong offset; - int origin; -{ - int fseek_origin=0; - long ret; - switch (origin) - { - case ZLIB_FILEFUNC_SEEK_CUR : - fseek_origin = SEEK_CUR; - break; - case ZLIB_FILEFUNC_SEEK_END : - fseek_origin = SEEK_END; - break; - case ZLIB_FILEFUNC_SEEK_SET : - fseek_origin = SEEK_SET; - break; - default: return -1; - } - ret = 0; - fseek((FILE *)stream, offset, fseek_origin); - return ret; -} - -int ZCALLBACK fclose_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - int ret; - ret = fclose((FILE *)stream); - return ret; -} - -int ZCALLBACK ferror_file_func (opaque, stream) - voidpf opaque; - voidpf stream; -{ - int ret; - ret = ferror((FILE *)stream); - return ret; -} - -void fill_fopen_filefunc (pzlib_filefunc_def) - zlib_filefunc_def* pzlib_filefunc_def; -{ - pzlib_filefunc_def->zopen_file = fopen_file_func; - pzlib_filefunc_def->zread_file = fread_file_func; - pzlib_filefunc_def->zwrite_file = fwrite_file_func; - pzlib_filefunc_def->ztell_file = ftell_file_func; - pzlib_filefunc_def->zseek_file = fseek_file_func; - pzlib_filefunc_def->zclose_file = fclose_file_func; - pzlib_filefunc_def->zerror_file = ferror_file_func; - pzlib_filefunc_def->opaque = NULL; -} diff --git a/attic/programs/ios/WebODF/Classes/minizip/ioapi.h b/attic/programs/ios/WebODF/Classes/minizip/ioapi.h deleted file mode 100644 index e73a3b2bd..000000000 --- a/attic/programs/ios/WebODF/Classes/minizip/ioapi.h +++ /dev/null @@ -1,75 +0,0 @@ -/* ioapi.h -- IO base function header for compress/uncompress .zip - files using zlib + zip or unzip API - - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant -*/ - -#ifndef _ZLIBIOAPI_H -#define _ZLIBIOAPI_H - - -#define ZLIB_FILEFUNC_SEEK_CUR (1) -#define ZLIB_FILEFUNC_SEEK_END (2) -#define ZLIB_FILEFUNC_SEEK_SET (0) - -#define ZLIB_FILEFUNC_MODE_READ (1) -#define ZLIB_FILEFUNC_MODE_WRITE (2) -#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3) - -#define ZLIB_FILEFUNC_MODE_EXISTING (4) -#define ZLIB_FILEFUNC_MODE_CREATE (8) - - -#ifndef ZCALLBACK - -#if (defined(WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK) -#define ZCALLBACK CALLBACK -#else -#define ZCALLBACK -#endif -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode)); -typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size)); -typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size)); -typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream)); -typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin)); -typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream)); -typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream)); - -typedef struct zlib_filefunc_def_s -{ - open_file_func zopen_file; - read_file_func zread_file; - write_file_func zwrite_file; - tell_file_func ztell_file; - seek_file_func zseek_file; - close_file_func zclose_file; - testerror_file_func zerror_file; - voidpf opaque; -} zlib_filefunc_def; - - - -void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def)); - -#define ZREAD(filefunc,filestream,buf,size) ((*((filefunc).zread_file))((filefunc).opaque,filestream,buf,size)) -#define ZWRITE(filefunc,filestream,buf,size) ((*((filefunc).zwrite_file))((filefunc).opaque,filestream,buf,size)) -#define ZTELL(filefunc,filestream) ((*((filefunc).ztell_file))((filefunc).opaque,filestream)) -#define ZSEEK(filefunc,filestream,pos,mode) ((*((filefunc).zseek_file))((filefunc).opaque,filestream,pos,mode)) -#define ZCLOSE(filefunc,filestream) ((*((filefunc).zclose_file))((filefunc).opaque,filestream)) -#define ZERROR(filefunc,filestream) ((*((filefunc).zerror_file))((filefunc).opaque,filestream)) - - -#ifdef __cplusplus -} -#endif - -#endif - diff --git a/attic/programs/ios/WebODF/Classes/minizip/mztools.c b/attic/programs/ios/WebODF/Classes/minizip/mztools.c deleted file mode 100644 index 74e6c7577..000000000 --- a/attic/programs/ios/WebODF/Classes/minizip/mztools.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - Additional tools for Minizip - Code: Xavier Roche '2004 - License: Same as ZLIB (www.gzip.org) -*/ - -/* Code */ -#include -#include -#include -#include "zlib.h" -#include "unzip.h" - -#define READ_8(adr) ((unsigned char)*(adr)) -#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) ) -#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) ) - -#define WRITE_8(buff, n) do { \ - *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \ -} while(0) -#define WRITE_16(buff, n) do { \ - WRITE_8((unsigned char*)(buff), n); \ - WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \ -} while(0) -#define WRITE_32(buff, n) do { \ - WRITE_16((unsigned char*)(buff), (n) & 0xffff); \ - WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \ -} while(0) diff --git a/attic/programs/ios/WebODF/Classes/minizip/mztools.h b/attic/programs/ios/WebODF/Classes/minizip/mztools.h deleted file mode 100644 index 82d1597ad..000000000 --- a/attic/programs/ios/WebODF/Classes/minizip/mztools.h +++ /dev/null @@ -1,31 +0,0 @@ -/* - Additional tools for Minizip - Code: Xavier Roche '2004 - License: Same as ZLIB (www.gzip.org) -*/ - -#ifndef _zip_tools_H -#define _zip_tools_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#include "unzip.h" - -/* Repair a ZIP file (missing central directory) - file: file to recover - fileOut: output file after recovery - fileOutTmp: temporary file name used for recovery -*/ -extern int ZEXPORT unzRepair(const char* file, - const char* fileOut, - const char* fileOutTmp, - uLong* nRecovered, - uLong* bytesRecovered); - -#endif diff --git a/attic/programs/ios/WebODF/Classes/minizip/unzip.c b/attic/programs/ios/WebODF/Classes/minizip/unzip.c deleted file mode 100644 index 81aee6a14..000000000 --- a/attic/programs/ios/WebODF/Classes/minizip/unzip.c +++ /dev/null @@ -1,1597 +0,0 @@ -/* unzip.c -- IO for uncompress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - Read unzip.h for more info -*/ - -/* Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of -compatibility with older software. The following is from the original crypt.c. Code -woven in by Terry Thorsen 1/2003. -*/ -/* - Copyright (c) 1990-2000 Info-ZIP. All rights reserved. - - See the accompanying file LICENSE, version 2000-Apr-09 or later - (the contents of which are also included in zip.h) for terms of use. - If, for some reason, all these files are missing, the Info-ZIP license - also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html -*/ -/* - crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h] - - The encryption/decryption parts of this source code (as opposed to the - non-echoing password parts) were originally written in Europe. The - whole source package can be freely distributed, including from the USA. - (Prior to January 2000, re-export from the US was a violation of US law.) - */ - -/* - This encryption code is a direct transcription of the algorithm from - Roger Schlafly, described by Phil Katz in the file appnote.txt. This - file (appnote.txt) is distributed with the PKZIP program (even in the - version without encryption capabilities). - */ - - -#include -#include -#include -#include "zlib.h" -#include "unzip.h" - -#ifdef STDC -# include -# include -# include -#endif -#ifdef NO_ERRNO_H - extern int errno; -#else -# include -#endif - - -#ifndef local -# define local static -#endif -/* compile with -Dlocal if your debugger can't find static symbols */ - - -#ifndef CASESENSITIVITYDEFAULT_NO -# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES) -# define CASESENSITIVITYDEFAULT_NO -# endif -#endif - - -#ifndef UNZ_BUFSIZE -#define UNZ_BUFSIZE (16384) -#endif - -#ifndef UNZ_MAXFILENAMEINZIP -#define UNZ_MAXFILENAMEINZIP (256) -#endif - -#ifndef ALLOC -# define ALLOC(size) (malloc(size)) -#endif -#ifndef TRYFREE -# define TRYFREE(p) {if (p) free(p);} -#endif - -#define SIZECENTRALDIRITEM (0x2e) -#define SIZEZIPLOCALHEADER (0x1e) - - - - -const char unz_copyright[] = - " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll"; - -/* unz_file_info_interntal contain internal info about a file in zipfile*/ -typedef struct unz_file_info_internal_s -{ - uLong offset_curfile;/* relative offset of local header 4 bytes */ -} unz_file_info_internal; - - -/* file_in_zip_read_info_s contain internal information about a file in zipfile, - when reading and decompress it */ -typedef struct -{ - char *read_buffer; /* internal buffer for compressed data */ - z_stream stream; /* zLib stream structure for inflate */ - - uLong pos_in_zipfile; /* position in byte on the zipfile, for fseek*/ - uLong stream_initialised; /* flag set if stream structure is initialised*/ - - uLong offset_local_extrafield;/* offset of the local extra field */ - uInt size_local_extrafield;/* size of the local extra field */ - uLong pos_local_extrafield; /* position in the local extra field in read*/ - - uLong crc32; /* crc32 of all data uncompressed */ - uLong crc32_wait; /* crc32 we must obtain after decompress all */ - uLong rest_read_compressed; /* number of byte to be decompressed */ - uLong rest_read_uncompressed;/*number of byte to be obtained after decomp*/ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - uLong compression_method; /* compression method (0==store) */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - int raw; -} file_in_zip_read_info_s; - - -/* unz_s contain internal information about the zipfile -*/ -typedef struct -{ - zlib_filefunc_def z_filefunc; - voidpf filestream; /* io structore of the zipfile */ - unz_global_info gi; /* public global information */ - uLong byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/ - uLong num_file; /* number of the current file in the zipfile*/ - uLong pos_in_central_dir; /* pos of the current file in the central dir*/ - uLong current_file_ok; /* flag about the usability of the current file*/ - uLong central_pos; /* position of the beginning of the central dir*/ - - uLong size_central_dir; /* size of the central directory */ - uLong offset_central_dir; /* offset of start of central directory with - respect to the starting disk number */ - - unz_file_info cur_file_info; /* public info about the current file in zip*/ - unz_file_info_internal cur_file_info_internal; /* private info about it*/ - file_in_zip_read_info_s* pfile_in_zip_read; /* structure about the current - file if we are decompressing it */ - int encrypted; -# ifndef NOUNCRYPT - unsigned long keys[3]; /* keys defining the pseudo-random sequence */ - const unsigned long* pcrc_32_tab; -# endif -} unz_s; - - -#ifndef NOUNCRYPT -#include "crypt.h" -#endif - -/* =========================================================================== - Read a byte from a gz_stream; update next_in and avail_in. Return EOF - for end of file. - IN assertion: the stream s has been sucessfully opened for reading. -*/ - - -local int unzlocal_getByte OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - int *pi)); - -local int unzlocal_getByte(pzlib_filefunc_def,filestream,pi) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - int *pi; -{ - unsigned char c; - int err = (int)ZREAD(*pzlib_filefunc_def,filestream,&c,1); - if (err==1) - { - *pi = (int)c; - return UNZ_OK; - } - else - { - if (ZERROR(*pzlib_filefunc_def,filestream)) - return UNZ_ERRNO; - else - return UNZ_EOF; - } -} - - -/* =========================================================================== - Reads a long in LSB order from the given gz_stream. Sets -*/ -local int unzlocal_getShort OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unzlocal_getShort (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - -local int unzlocal_getLong OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream, - uLong *pX)); - -local int unzlocal_getLong (pzlib_filefunc_def,filestream,pX) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; - uLong *pX; -{ - uLong x ; - int i; - int err; - - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x = (uLong)i; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<8; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<16; - - if (err==UNZ_OK) - err = unzlocal_getByte(pzlib_filefunc_def,filestream,&i); - x += ((uLong)i)<<24; - - if (err==UNZ_OK) - *pX = x; - else - *pX = 0; - return err; -} - - -/* My own strcmpi / strcasecmp */ -local int strcmpcasenosensitive_internal (fileName1,fileName2) - const char* fileName1; - const char* fileName2; -{ - for (;;) - { - char c1=*(fileName1++); - char c2=*(fileName2++); - if ((c1>='a') && (c1<='z')) - c1 -= 0x20; - if ((c2>='a') && (c2<='z')) - c2 -= 0x20; - if (c1=='\0') - return ((c2=='\0') ? 0 : -1); - if (c2=='\0') - return 1; - if (c1c2) - return 1; - } -} - - -#ifdef CASESENSITIVITYDEFAULT_NO -#define CASESENSITIVITYDEFAULTVALUE 2 -#else -#define CASESENSITIVITYDEFAULTVALUE 1 -#endif - -#ifndef STRCMPCASENOSENTIVEFUNCTION -#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal -#endif - -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) - -*/ -extern int ZEXPORT unzStringFileNameCompare (fileName1,fileName2,iCaseSensitivity) - const char* fileName1; - const char* fileName2; - int iCaseSensitivity; -{ - if (iCaseSensitivity==0) - iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE; - - if (iCaseSensitivity==1) - return strcmp(fileName1,fileName2); - - return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2); -} - -#ifndef BUFREADCOMMENT -#define BUFREADCOMMENT (0x400) -#endif - -/* - Locate the Central directory of a zipfile (at the end, just before - the global comment) -*/ -local uLong unzlocal_SearchCentralDir OF(( - const zlib_filefunc_def* pzlib_filefunc_def, - voidpf filestream)); - -local uLong unzlocal_SearchCentralDir(pzlib_filefunc_def,filestream) - const zlib_filefunc_def* pzlib_filefunc_def; - voidpf filestream; -{ - unsigned char* buf; - uLong uSizeFile; - uLong uBackRead; - uLong uMaxBack=0xffff; /* maximum size of global comment */ - uLong uPosFound=0; - - if (ZSEEK(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0) - return 0; - - - uSizeFile = ZTELL(*pzlib_filefunc_def,filestream); - - if (uMaxBack>uSizeFile) - uMaxBack = uSizeFile; - - buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4); - if (buf==NULL) - return 0; - - uBackRead = 4; - while (uBackReaduMaxBack) - uBackRead = uMaxBack; - else - uBackRead+=BUFREADCOMMENT; - uReadPos = uSizeFile-uBackRead ; - - uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ? - (BUFREADCOMMENT+4) : (uSizeFile-uReadPos); - if (ZSEEK(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0) - break; - - if (ZREAD(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize) - break; - - for (i=(int)uReadSize-3; (i--)>0;) - if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && - ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06)) - { - uPosFound = uReadPos+i; - break; - } - - if (uPosFound!=0) - break; - } - TRYFREE(buf); - return uPosFound; -} - -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer - "zlib/zlib114.zip". - If the zipfile cannot be opened (file doesn't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ -extern unzFile ZEXPORT unzOpen2 (path, pzlib_filefunc_def) - const char *path; - zlib_filefunc_def* pzlib_filefunc_def; -{ - unz_s us; - unz_s *s; - uLong central_pos,uL; - - uLong number_disk; /* number of the current dist, used for - spaning ZIP, unsupported, always 0*/ - uLong number_disk_with_CD; /* number the the disk with central dir, used - for spaning ZIP, unsupported, always 0*/ - uLong number_entry_CD; /* total number of entries in - the central dir - (same than number_entry on nospan) */ - - int err=UNZ_OK; - - if (unz_copyright[0]!=' ') - return NULL; - - if (pzlib_filefunc_def==NULL) - fill_fopen_filefunc(&us.z_filefunc); - else - us.z_filefunc = *pzlib_filefunc_def; - - us.filestream= (*(us.z_filefunc.zopen_file))(us.z_filefunc.opaque, - path, - ZLIB_FILEFUNC_MODE_READ | - ZLIB_FILEFUNC_MODE_EXISTING); - if (us.filestream==NULL) - return NULL; - - central_pos = unzlocal_SearchCentralDir(&us.z_filefunc,us.filestream); - if (central_pos==0) - err=UNZ_ERRNO; - - if (ZSEEK(us.z_filefunc, us.filestream, - central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0) - err=UNZ_ERRNO; - - /* the signature, already checked */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of this disk */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK) - err=UNZ_ERRNO; - - /* number of the disk with the start of the central directory */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir on this disk */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK) - err=UNZ_ERRNO; - - /* total number of entries in the central dir */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((number_entry_CD!=us.gi.number_entry) || - (number_disk_with_CD!=0) || - (number_disk!=0)) - err=UNZ_BADZIPFILE; - - /* size of the central directory */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* offset of start of central directory with respect to the - starting disk number */ - if (unzlocal_getLong(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK) - err=UNZ_ERRNO; - - /* zipfile comment length */ - if (unzlocal_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK) - err=UNZ_ERRNO; - - if ((central_pospfile_in_zip_read!=NULL) - unzCloseCurrentFile(file); - - ZCLOSE(s->z_filefunc, s->filestream); - TRYFREE(s); - return UNZ_OK; -} - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ -extern int ZEXPORT unzGetGlobalInfo (file,pglobal_info) - unzFile file; - unz_global_info *pglobal_info; -{ - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - *pglobal_info=s->gi; - return UNZ_OK; -} - - -/* - Translate date/time from Dos format to tm_unz (readable more easilty) -*/ -local void unzlocal_DosDateToTmuDate (ulDosDate, ptm) - uLong ulDosDate; - tm_unz* ptm; -{ - uLong uDate; - uDate = (uLong)(ulDosDate>>16); - ptm->tm_mday = (uInt)(uDate&0x1f) ; - ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ; - ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ; - - ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800); - ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ; - ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ; -} - -/* - Get Info about the current file in the zipfile, with internal only info -*/ -local int unzlocal_GetCurrentFileInfoInternal OF((unzFile file, - unz_file_info *pfile_info, - unz_file_info_internal - *pfile_info_internal, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); - -local int unzlocal_GetCurrentFileInfoInternal (file, - pfile_info, - pfile_info_internal, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - unz_file_info_internal *pfile_info_internal; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - unz_s* s; - unz_file_info file_info; - unz_file_info_internal file_info_internal; - int err=UNZ_OK; - uLong uMagic; - long lSeek=0; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (ZSEEK(s->z_filefunc, s->filestream, - s->pos_in_central_dir+s->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET)!=0) - err=UNZ_ERRNO; - - - /* we check the magic */ - if (err==UNZ_OK) - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x02014b50) - err=UNZ_BADZIPFILE; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK) - err=UNZ_ERRNO; - - unzlocal_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date); - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK) - err=UNZ_ERRNO; - - lSeek+=file_info.size_filename; - if ((err==UNZ_OK) && (szFileName!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_filename0) && (fileNameBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek -= uSizeRead; - } - - - if ((err==UNZ_OK) && (extraField!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_extraz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,extraField,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek += file_info.size_file_extra - uSizeRead; - } - else - lSeek+=file_info.size_file_extra; - - - if ((err==UNZ_OK) && (szComment!=NULL)) - { - uLong uSizeRead ; - if (file_info.size_file_commentz_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0) - lSeek=0; - else - err=UNZ_ERRNO; - if ((file_info.size_file_comment>0) && (commentBufferSize>0)) - if (ZREAD(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead) - err=UNZ_ERRNO; - lSeek+=file_info.size_file_comment - uSizeRead; - } - else - lSeek+=file_info.size_file_comment; - - if ((err==UNZ_OK) && (pfile_info!=NULL)) - *pfile_info=file_info; - - if ((err==UNZ_OK) && (pfile_info_internal!=NULL)) - *pfile_info_internal=file_info_internal; - - return err; -} - - - -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. -*/ -extern int ZEXPORT unzGetCurrentFileInfo (file, - pfile_info, - szFileName, fileNameBufferSize, - extraField, extraFieldBufferSize, - szComment, commentBufferSize) - unzFile file; - unz_file_info *pfile_info; - char *szFileName; - uLong fileNameBufferSize; - void *extraField; - uLong extraFieldBufferSize; - char *szComment; - uLong commentBufferSize; -{ - return unzlocal_GetCurrentFileInfoInternal(file,pfile_info,NULL, - szFileName,fileNameBufferSize, - extraField,extraFieldBufferSize, - szComment,commentBufferSize); -} - -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ -extern int ZEXPORT unzGoToFirstFile (file) - unzFile file; -{ - int err=UNZ_OK; - unz_s* s; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - s->pos_in_central_dir=s->offset_central_dir; - s->num_file=0; - err=unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ -extern int ZEXPORT unzGoToNextFile (file) - unzFile file; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */ - if (s->num_file+1==s->gi.number_entry) - return UNZ_END_OF_LIST_OF_FILE; - - s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename + - s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ; - s->num_file++; - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} - - -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzipStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ -extern int ZEXPORT unzLocateFile (file, szFileName, iCaseSensitivity) - unzFile file; - const char *szFileName; - int iCaseSensitivity; -{ - unz_s* s; - int err; - - /* We remember the 'current' position in the file so that we can jump - * back there if we fail. - */ - unz_file_info cur_file_infoSaved; - unz_file_info_internal cur_file_info_internalSaved; - uLong num_fileSaved; - uLong pos_in_central_dirSaved; - - - if (file==NULL) - return UNZ_PARAMERROR; - - if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP) - return UNZ_PARAMERROR; - - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - /* Save the current state */ - num_fileSaved = s->num_file; - pos_in_central_dirSaved = s->pos_in_central_dir; - cur_file_infoSaved = s->cur_file_info; - cur_file_info_internalSaved = s->cur_file_info_internal; - - err = unzGoToFirstFile(file); - - while (err == UNZ_OK) - { - char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; - err = unzGetCurrentFileInfo(file,NULL, - szCurrentFileName,sizeof(szCurrentFileName)-1, - NULL,0,NULL,0); - if (err == UNZ_OK) - { - if (unzStringFileNameCompare(szCurrentFileName, - szFileName,iCaseSensitivity)==0) - return UNZ_OK; - err = unzGoToNextFile(file); - } - } - - /* We failed, so restore the state of the 'current file' to where we - * were. - */ - s->num_file = num_fileSaved ; - s->pos_in_central_dir = pos_in_central_dirSaved ; - s->cur_file_info = cur_file_infoSaved; - s->cur_file_info_internal = cur_file_info_internalSaved; - return err; -} - - -/* -/////////////////////////////////////////// -// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net) -// I need random access -// -// Further optimization could be realized by adding an ability -// to cache the directory in memory. The goal being a single -// comprehensive file read to put the file I need in a memory. -*/ - -/* -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; // offset in file - uLong num_of_file; // # of file -} unz_file_pos; -*/ - -extern int ZEXPORT unzGetFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; -{ - unz_s* s; - - if (file==NULL || file_pos==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_END_OF_LIST_OF_FILE; - - file_pos->pos_in_zip_directory = s->pos_in_central_dir; - file_pos->num_of_file = s->num_file; - - return UNZ_OK; -} - -extern int ZEXPORT unzGoToFilePos(file, file_pos) - unzFile file; - unz_file_pos* file_pos; -{ - unz_s* s; - int err; - - if (file==NULL || file_pos==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - /* jump to the right spot */ - s->pos_in_central_dir = file_pos->pos_in_zip_directory; - s->num_file = file_pos->num_of_file; - - /* set the current file */ - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - /* return results */ - s->current_file_ok = (err == UNZ_OK); - return err; -} - -/* -// Unzip Helper Functions - should be here? -/////////////////////////////////////////// -*/ - -/* - Read the local header of the current zipfile - Check the coherency of the local header and info in the end of central - directory about this file - store in *piSizeVar the size of extra info in local header - (filename and size of extra field data) -*/ -local int unzlocal_CheckCurrentFileCoherencyHeader (s,piSizeVar, - poffset_local_extrafield, - psize_local_extrafield) - unz_s* s; - uInt* piSizeVar; - uLong *poffset_local_extrafield; - uInt *psize_local_extrafield; -{ - uLong uMagic,uData,uFlags; - uLong size_filename; - uLong size_extra_field; - int err=UNZ_OK; - - *piSizeVar = 0; - *poffset_local_extrafield = 0; - *psize_local_extrafield = 0; - - if (ZSEEK(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile + - s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - - if (err==UNZ_OK) - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK) - err=UNZ_ERRNO; - else if (uMagic!=0x04034b50) - err=UNZ_BADZIPFILE; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) - err=UNZ_ERRNO; -/* - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion)) - err=UNZ_BADZIPFILE; -*/ - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK) - err=UNZ_ERRNO; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method)) - err=UNZ_BADZIPFILE; - - if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */ - err=UNZ_ERRNO; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - if (unzlocal_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */ - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && - ((uFlags & 8)==0)) - err=UNZ_BADZIPFILE; - - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK) - err=UNZ_ERRNO; - else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename)) - err=UNZ_BADZIPFILE; - - *piSizeVar += (uInt)size_filename; - - if (unzlocal_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK) - err=UNZ_ERRNO; - *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile + - SIZEZIPLOCALHEADER + size_filename; - *psize_local_extrafield = (uInt)size_extra_field; - - *piSizeVar += (uInt)size_extra_field; - - return err; -} - -/* - Open for reading data the current file in the zipfile. - If there is no error and the file is opened, the return value is UNZ_OK. -*/ -extern int ZEXPORT unzOpenCurrentFile3 (file, method, level, raw, password) - unzFile file; - int* method; - int* level; - int raw; - const char* password; -{ - int err=UNZ_OK; - uInt iSizeVar; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uLong offset_local_extrafield; /* offset of the local extra field */ - uInt size_local_extrafield; /* size of the local extra field */ -# ifndef NOUNCRYPT - char source[12]; -# else - if (password != NULL) - return UNZ_PARAMERROR; -# endif - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return UNZ_PARAMERROR; - - if (s->pfile_in_zip_read != NULL) - unzCloseCurrentFile(file); - - if (unzlocal_CheckCurrentFileCoherencyHeader(s,&iSizeVar, - &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK) - return UNZ_BADZIPFILE; - - pfile_in_zip_read_info = (file_in_zip_read_info_s*) - ALLOC(sizeof(file_in_zip_read_info_s)); - if (pfile_in_zip_read_info==NULL) - return UNZ_INTERNALERROR; - - pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE); - pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield; - pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield; - pfile_in_zip_read_info->pos_local_extrafield=0; - pfile_in_zip_read_info->raw=raw; - - if (pfile_in_zip_read_info->read_buffer==NULL) - { - TRYFREE(pfile_in_zip_read_info); - return UNZ_INTERNALERROR; - } - - pfile_in_zip_read_info->stream_initialised=0; - - if (method!=NULL) - *method = (int)s->cur_file_info.compression_method; - - if (level!=NULL) - { - *level = 6; - switch (s->cur_file_info.flag & 0x06) - { - case 6 : *level = 1; break; - case 4 : *level = 2; break; - case 2 : *level = 9; break; - } - } - - if ((s->cur_file_info.compression_method!=0) && - (s->cur_file_info.compression_method!=Z_DEFLATED)) - err=UNZ_BADZIPFILE; - - pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc; - pfile_in_zip_read_info->crc32=0; - pfile_in_zip_read_info->compression_method = - s->cur_file_info.compression_method; - pfile_in_zip_read_info->filestream=s->filestream; - pfile_in_zip_read_info->z_filefunc=s->z_filefunc; - pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile; - - pfile_in_zip_read_info->stream.total_out = 0; - - if ((s->cur_file_info.compression_method==Z_DEFLATED) && - (!raw)) - { - pfile_in_zip_read_info->stream.zalloc = (alloc_func)0; - pfile_in_zip_read_info->stream.zfree = (free_func)0; - pfile_in_zip_read_info->stream.opaque = (voidpf)0; - pfile_in_zip_read_info->stream.next_in = (voidpf)0; - pfile_in_zip_read_info->stream.avail_in = 0; - - err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS); - if (err == Z_OK) - pfile_in_zip_read_info->stream_initialised=1; - else - { - TRYFREE(pfile_in_zip_read_info); - return err; - } - /* windowBits is passed < 0 to tell that there is no zlib header. - * Note that in this case inflate *requires* an extra "dummy" byte - * after the compressed stream in order to complete decompression and - * return Z_STREAM_END. - * In unzip, i don't wait absolutely Z_STREAM_END because I known the - * size of both compressed and uncompressed data - */ - } - pfile_in_zip_read_info->rest_read_compressed = - s->cur_file_info.compressed_size ; - pfile_in_zip_read_info->rest_read_uncompressed = - s->cur_file_info.uncompressed_size ; - - - pfile_in_zip_read_info->pos_in_zipfile = - s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER + - iSizeVar; - - pfile_in_zip_read_info->stream.avail_in = (uInt)0; - - s->pfile_in_zip_read = pfile_in_zip_read_info; - -# ifndef NOUNCRYPT - if (password != NULL) - { - int i; - s->pcrc_32_tab = get_crc_table(); - init_keys(password,s->keys,s->pcrc_32_tab); - if (ZSEEK(s->z_filefunc, s->filestream, - s->pfile_in_zip_read->pos_in_zipfile + - s->pfile_in_zip_read->byte_before_the_zipfile, - SEEK_SET)!=0) - return UNZ_INTERNALERROR; - if(ZREAD(s->z_filefunc, s->filestream,source, 12)<12) - return UNZ_INTERNALERROR; - - for (i = 0; i<12; i++) - zdecode(s->keys,s->pcrc_32_tab,source[i]); - - s->pfile_in_zip_read->pos_in_zipfile+=12; - s->encrypted=1; - } -# endif - - - return UNZ_OK; -} - -extern int ZEXPORT unzOpenCurrentFile (file) - unzFile file; -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL); -} - -extern int ZEXPORT unzOpenCurrentFilePassword (file, password) - unzFile file; - const char* password; -{ - return unzOpenCurrentFile3(file, NULL, NULL, 0, password); -} - -extern int ZEXPORT unzOpenCurrentFile2 (file,method,level,raw) - unzFile file; - int* method; - int* level; - int raw; -{ - return unzOpenCurrentFile3(file, method, level, raw, NULL); -} - -/* - Read bytes from the current file. - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ -extern int ZEXPORT unzReadCurrentFile (file, buf, len) - unzFile file; - voidp buf; - unsigned len; -{ - int err=UNZ_OK; - uInt iRead = 0; - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if (pfile_in_zip_read_info->read_buffer == NULL) - return UNZ_END_OF_LIST_OF_FILE; - if (len==0) - return 0; - - pfile_in_zip_read_info->stream.next_out = (Bytef*)buf; - - pfile_in_zip_read_info->stream.avail_out = (uInt)len; - - if ((len>pfile_in_zip_read_info->rest_read_uncompressed) && - (!(pfile_in_zip_read_info->raw))) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_uncompressed; - - if ((len>pfile_in_zip_read_info->rest_read_compressed+ - pfile_in_zip_read_info->stream.avail_in) && - (pfile_in_zip_read_info->raw)) - pfile_in_zip_read_info->stream.avail_out = - (uInt)pfile_in_zip_read_info->rest_read_compressed+ - pfile_in_zip_read_info->stream.avail_in; - - while (pfile_in_zip_read_info->stream.avail_out>0) - { - if ((pfile_in_zip_read_info->stream.avail_in==0) && - (pfile_in_zip_read_info->rest_read_compressed>0)) - { - uInt uReadThis = UNZ_BUFSIZE; - if (pfile_in_zip_read_info->rest_read_compressedrest_read_compressed; - if (uReadThis == 0) - return UNZ_EOF; - if (ZSEEK(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->pos_in_zipfile + - pfile_in_zip_read_info->byte_before_the_zipfile, - ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - if (ZREAD(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->read_buffer, - uReadThis)!=uReadThis) - return UNZ_ERRNO; - - -# ifndef NOUNCRYPT - if(s->encrypted) - { - uInt i; - for(i=0;iread_buffer[i] = - zdecode(s->keys,s->pcrc_32_tab, - pfile_in_zip_read_info->read_buffer[i]); - } -# endif - - - pfile_in_zip_read_info->pos_in_zipfile += uReadThis; - - pfile_in_zip_read_info->rest_read_compressed-=uReadThis; - - pfile_in_zip_read_info->stream.next_in = - (Bytef*)pfile_in_zip_read_info->read_buffer; - pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis; - } - - if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw)) - { - uInt uDoCopy,i ; - - if ((pfile_in_zip_read_info->stream.avail_in == 0) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - return (iRead==0) ? UNZ_EOF : iRead; - - if (pfile_in_zip_read_info->stream.avail_out < - pfile_in_zip_read_info->stream.avail_in) - uDoCopy = pfile_in_zip_read_info->stream.avail_out ; - else - uDoCopy = pfile_in_zip_read_info->stream.avail_in ; - - for (i=0;istream.next_out+i) = - *(pfile_in_zip_read_info->stream.next_in+i); - - pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32, - pfile_in_zip_read_info->stream.next_out, - uDoCopy); - pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy; - pfile_in_zip_read_info->stream.avail_in -= uDoCopy; - pfile_in_zip_read_info->stream.avail_out -= uDoCopy; - pfile_in_zip_read_info->stream.next_out += uDoCopy; - pfile_in_zip_read_info->stream.next_in += uDoCopy; - pfile_in_zip_read_info->stream.total_out += uDoCopy; - iRead += uDoCopy; - } - else - { - uLong uTotalOutBefore,uTotalOutAfter; - const Bytef *bufBefore; - uLong uOutThis; - int flush=Z_SYNC_FLUSH; - - uTotalOutBefore = pfile_in_zip_read_info->stream.total_out; - bufBefore = pfile_in_zip_read_info->stream.next_out; - - /* - if ((pfile_in_zip_read_info->rest_read_uncompressed == - pfile_in_zip_read_info->stream.avail_out) && - (pfile_in_zip_read_info->rest_read_compressed == 0)) - flush = Z_FINISH; - */ - err=inflate(&pfile_in_zip_read_info->stream,flush); - - if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL)) - err = Z_DATA_ERROR; - - uTotalOutAfter = pfile_in_zip_read_info->stream.total_out; - uOutThis = uTotalOutAfter-uTotalOutBefore; - - pfile_in_zip_read_info->crc32 = - crc32(pfile_in_zip_read_info->crc32,bufBefore, - (uInt)(uOutThis)); - - pfile_in_zip_read_info->rest_read_uncompressed -= - uOutThis; - - iRead += (uInt)(uTotalOutAfter - uTotalOutBefore); - - if (err==Z_STREAM_END) - return (iRead==0) ? UNZ_EOF : iRead; - if (err!=Z_OK) - break; - } - } - - if (err==Z_OK) - return iRead; - return err; -} - - -/* - Give the current position in uncompressed data -*/ -extern z_off_t ZEXPORT unztell (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - return (z_off_t)pfile_in_zip_read_info->stream.total_out; -} - - -/* - return 1 if the end of file was reached, 0 elsewhere -*/ -extern int ZEXPORT unzeof (file) - unzFile file; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - if (pfile_in_zip_read_info->rest_read_uncompressed == 0) - return 1; - else - return 0; -} - - - -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field that can be read - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ -extern int ZEXPORT unzGetLocalExtrafield (file,buf,len) - unzFile file; - voidp buf; - unsigned len; -{ - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - uInt read_now; - uLong size_to_read; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - size_to_read = (pfile_in_zip_read_info->size_local_extrafield - - pfile_in_zip_read_info->pos_local_extrafield); - - if (buf==NULL) - return (int)size_to_read; - - if (len>size_to_read) - read_now = (uInt)size_to_read; - else - read_now = (uInt)len ; - - if (read_now==0) - return 0; - - if (ZSEEK(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - pfile_in_zip_read_info->offset_local_extrafield + - pfile_in_zip_read_info->pos_local_extrafield, - ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - if (ZREAD(pfile_in_zip_read_info->z_filefunc, - pfile_in_zip_read_info->filestream, - buf,read_now)!=read_now) - return UNZ_ERRNO; - - return (int)read_now; -} - -/* - Close the file in zip opened with unzipOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ -extern int ZEXPORT unzCloseCurrentFile (file) - unzFile file; -{ - int err=UNZ_OK; - - unz_s* s; - file_in_zip_read_info_s* pfile_in_zip_read_info; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - pfile_in_zip_read_info=s->pfile_in_zip_read; - - if (pfile_in_zip_read_info==NULL) - return UNZ_PARAMERROR; - - - if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) && - (!pfile_in_zip_read_info->raw)) - { - if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait) - err=UNZ_CRCERROR; - } - - - TRYFREE(pfile_in_zip_read_info->read_buffer); - pfile_in_zip_read_info->read_buffer = NULL; - if (pfile_in_zip_read_info->stream_initialised) - inflateEnd(&pfile_in_zip_read_info->stream); - - pfile_in_zip_read_info->stream_initialised = 0; - TRYFREE(pfile_in_zip_read_info); - - s->pfile_in_zip_read=NULL; - - return err; -} - - -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ -extern int ZEXPORT unzGetGlobalComment (file, szComment, uSizeBuf) - unzFile file; - char *szComment; - uLong uSizeBuf; -{ - unz_s* s; - uLong uReadThis ; - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - uReadThis = uSizeBuf; - if (uReadThis>s->gi.size_comment) - uReadThis = s->gi.size_comment; - - if (ZSEEK(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0) - return UNZ_ERRNO; - - if (uReadThis>0) - { - *szComment='\0'; - if (ZREAD(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis) - return UNZ_ERRNO; - } - - if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment)) - *(szComment+s->gi.size_comment)='\0'; - return (int)uReadThis; -} - -/* Additions by RX '2004 */ -extern uLong ZEXPORT unzGetOffset (file) - unzFile file; -{ - unz_s* s; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - if (!s->current_file_ok) - return 0; - if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff) - if (s->num_file==s->gi.number_entry) - return 0; - return s->pos_in_central_dir; -} - -extern int ZEXPORT unzSetOffset (file, pos) - unzFile file; - uLong pos; -{ - unz_s* s; - int err; - - if (file==NULL) - return UNZ_PARAMERROR; - s=(unz_s*)file; - - s->pos_in_central_dir = pos; - s->num_file = s->gi.number_entry; /* hack */ - err = unzlocal_GetCurrentFileInfoInternal(file,&s->cur_file_info, - &s->cur_file_info_internal, - NULL,0,NULL,0,NULL,0); - s->current_file_ok = (err == UNZ_OK); - return err; -} diff --git a/attic/programs/ios/WebODF/Classes/minizip/unzip.h b/attic/programs/ios/WebODF/Classes/minizip/unzip.h deleted file mode 100644 index c3206a058..000000000 --- a/attic/programs/ios/WebODF/Classes/minizip/unzip.h +++ /dev/null @@ -1,354 +0,0 @@ -/* unzip.h -- IO for uncompress .zip files using zlib - Version 1.01e, February 12th, 2005 - - Copyright (C) 1998-2005 Gilles Vollant - - This unzip package allow extract file from .ZIP file, compatible with PKZip 2.04g - WinZip, InfoZip tools and compatible. - - Multi volume ZipFile (span) are not supported. - Encryption compatible with pkzip 2.04g only supported - Old compressions used by old PKZip 1.x are not supported - - - I WAIT FEEDBACK at mail info@winimage.com - Visit also http://www.winimage.com/zLibDll/unzip.htm for evolution - - Condition of use and distribution are the same than zlib : - - This software is provided 'as-is', without any express or implied - warranty. In no event will the authors be held liable for any damages - arising from the use of this software. - - Permission is granted to anyone to use this software for any purpose, - including commercial applications, and to alter it and redistribute it - freely, subject to the following restrictions: - - 1. The origin of this software must not be misrepresented; you must not - claim that you wrote the original software. If you use this software - in a product, an acknowledgment in the product documentation would be - appreciated but is not required. - 2. Altered source versions must be plainly marked as such, and must not be - misrepresented as being the original software. - 3. This notice may not be removed or altered from any source distribution. - - -*/ - -/* for more info about .ZIP format, see - http://www.info-zip.org/pub/infozip/doc/appnote-981119-iz.zip - http://www.info-zip.org/pub/infozip/doc/ - PkWare has also a specification at : - ftp://ftp.pkware.com/probdesc.zip -*/ - -#ifndef _unz_H -#define _unz_H - -#ifdef __cplusplus -extern "C" { -#endif - -#ifndef _ZLIB_H -#include "zlib.h" -#endif - -#ifndef _ZLIBIOAPI_H -#include "ioapi.h" -#endif - -#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP) -/* like the STRICT of WIN32, we define a pointer that cannot be converted - from (void*) without cast */ -typedef struct TagunzFile__ { int unused; } unzFile__; -typedef unzFile__ *unzFile; -#else -typedef voidp unzFile; -#endif - - -#define UNZ_OK (0) -#define UNZ_END_OF_LIST_OF_FILE (-100) -#define UNZ_ERRNO (Z_ERRNO) -#define UNZ_EOF (0) -#define UNZ_PARAMERROR (-102) -#define UNZ_BADZIPFILE (-103) -#define UNZ_INTERNALERROR (-104) -#define UNZ_CRCERROR (-105) - -/* tm_unz contain date/time info */ -typedef struct tm_unz_s -{ - uInt tm_sec; /* seconds after the minute - [0,59] */ - uInt tm_min; /* minutes after the hour - [0,59] */ - uInt tm_hour; /* hours since midnight - [0,23] */ - uInt tm_mday; /* day of the month - [1,31] */ - uInt tm_mon; /* months since January - [0,11] */ - uInt tm_year; /* years - [1980..2044] */ -} tm_unz; - -/* unz_global_info structure contain global data about the ZIPfile - These data comes from the end of central dir */ -typedef struct unz_global_info_s -{ - uLong number_entry; /* total number of entries in - the central dir on this disk */ - uLong size_comment; /* size of the global comment of the zipfile */ -} unz_global_info; - - -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_info_s -{ - uLong version; /* version made by 2 bytes */ - uLong version_needed; /* version needed to extract 2 bytes */ - uLong flag; /* general purpose bit flag 2 bytes */ - uLong compression_method; /* compression method 2 bytes */ - uLong dosDate; /* last mod file date in Dos fmt 4 bytes */ - uLong crc; /* crc-32 4 bytes */ - uLong compressed_size; /* compressed size 4 bytes */ - uLong uncompressed_size; /* uncompressed size 4 bytes */ - uLong size_filename; /* filename length 2 bytes */ - uLong size_file_extra; /* extra field length 2 bytes */ - uLong size_file_comment; /* file comment length 2 bytes */ - - uLong disk_num_start; /* disk number start 2 bytes */ - uLong internal_fa; /* internal file attributes 2 bytes */ - uLong external_fa; /* external file attributes 4 bytes */ - - tm_unz tmu_date; -} unz_file_info; - -extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1, - const char* fileName2, - int iCaseSensitivity)); -/* - Compare two filename (fileName1,fileName2). - If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp) - If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi - or strcasecmp) - If iCaseSenisivity = 0, case sensitivity is defaut of your operating system - (like 1 on Unix, 2 on Windows) -*/ - - -extern unzFile ZEXPORT unzOpen OF((const char *path)); -/* - Open a Zip file. path contain the full pathname (by example, - on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer - "zlib/zlib113.zip". - If the zipfile cannot be opened (file don't exist or in not valid), the - return value is NULL. - Else, the return value is a unzFile Handle, usable with other function - of this unzip package. -*/ - -extern unzFile ZEXPORT unzOpen2 OF((const char *path, - zlib_filefunc_def* pzlib_filefunc_def)); -/* - Open a Zip file, like unzOpen, but provide a set of file low level API - for read/write the zip file (see ioapi.h) -*/ - -extern int ZEXPORT unzClose OF((unzFile file)); -/* - Close a ZipFile opened with unzipOpen. - If there is files inside the .Zip opened with unzOpenCurrentFile (see later), - these files MUST be closed with unzipCloseCurrentFile before call unzipClose. - return UNZ_OK if there is no problem. */ - -extern int ZEXPORT unzGetGlobalInfo OF((unzFile file, - unz_global_info *pglobal_info)); -/* - Write info about the ZipFile in the *pglobal_info structure. - No preparation of the structure is needed - return UNZ_OK if there is no problem. */ - - -extern int ZEXPORT unzGetGlobalComment OF((unzFile file, - char *szComment, - uLong uSizeBuf)); -/* - Get the global comment string of the ZipFile, in the szComment buffer. - uSizeBuf is the size of the szComment buffer. - return the number of byte copied or an error code <0 -*/ - - -/***************************************************************************/ -/* Unzip package allow you browse the directory of the zipfile */ - -extern int ZEXPORT unzGoToFirstFile OF((unzFile file)); -/* - Set the current file of the zipfile to the first file. - return UNZ_OK if there is no problem -*/ - -extern int ZEXPORT unzGoToNextFile OF((unzFile file)); -/* - Set the current file of the zipfile to the next file. - return UNZ_OK if there is no problem - return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest. -*/ - -extern int ZEXPORT unzLocateFile OF((unzFile file, - const char *szFileName, - int iCaseSensitivity)); -/* - Try locate the file szFileName in the zipfile. - For the iCaseSensitivity signification, see unzStringFileNameCompare - - return value : - UNZ_OK if the file is found. It becomes the current file. - UNZ_END_OF_LIST_OF_FILE if the file is not found -*/ - - -/* ****************************************** */ -/* Ryan supplied functions */ -/* unz_file_info contain information about a file in the zipfile */ -typedef struct unz_file_pos_s -{ - uLong pos_in_zip_directory; /* offset in zip file directory */ - uLong num_of_file; /* # of file */ -} unz_file_pos; - -extern int ZEXPORT unzGetFilePos( - unzFile file, - unz_file_pos* file_pos); - -extern int ZEXPORT unzGoToFilePos( - unzFile file, - unz_file_pos* file_pos); - -/* ****************************************** */ - -extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file, - unz_file_info *pfile_info, - char *szFileName, - uLong fileNameBufferSize, - void *extraField, - uLong extraFieldBufferSize, - char *szComment, - uLong commentBufferSize)); -/* - Get Info about the current file - if pfile_info!=NULL, the *pfile_info structure will contain somes info about - the current file - if szFileName!=NULL, the filemane string will be copied in szFileName - (fileNameBufferSize is the size of the buffer) - if extraField!=NULL, the extra field information will be copied in extraField - (extraFieldBufferSize is the size of the buffer). - This is the Central-header version of the extra field - if szComment!=NULL, the comment string of the file will be copied in szComment - (commentBufferSize is the size of the buffer) -*/ - -/***************************************************************************/ -/* for reading the content of the current zipfile, you can open it, read data - from it, and close it (you can close it before reading all the file) - */ - -extern int ZEXPORT unzOpenCurrentFile OF((unzFile file)); -/* - Open for reading data the current file in the zipfile. - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file, - const char* password)); -/* - Open for reading data the current file in the zipfile. - password is a crypting password - If there is no error, the return value is UNZ_OK. -*/ - -extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file, - int* method, - int* level, - int raw)); -/* - Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 - *method will receive method of compression, *level will receive level of - compression - note : you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL -*/ - -extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file, - int* method, - int* level, - int raw, - const char* password)); -/* - Same than unzOpenCurrentFile, but open for read raw the file (not uncompress) - if raw==1 - *method will receive method of compression, *level will receive level of - compression - note : you can set level parameter as NULL (if you did not want known level, - but you CANNOT set method parameter as NULL -*/ - - -extern int ZEXPORT unzCloseCurrentFile OF((unzFile file)); -/* - Close the file in zip opened with unzOpenCurrentFile - Return UNZ_CRCERROR if all the file was read but the CRC is not good -*/ - -extern int ZEXPORT unzReadCurrentFile OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read bytes from the current file (opened by unzOpenCurrentFile) - buf contain buffer where data must be copied - len the size of buf. - - return the number of byte copied if somes bytes are copied - return 0 if the end of file was reached - return <0 with error code if there is an error - (UNZ_ERRNO for IO error, or zLib error for uncompress error) -*/ - -extern z_off_t ZEXPORT unztell OF((unzFile file)); -/* - Give the current position in uncompressed data -*/ - -extern int ZEXPORT unzeof OF((unzFile file)); -/* - return 1 if the end of file was reached, 0 elsewhere -*/ - -extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file, - voidp buf, - unsigned len)); -/* - Read extra field from the current file (opened by unzOpenCurrentFile) - This is the local-header version of the extra field (sometimes, there is - more info in the local-header version than in the central-header) - - if buf==NULL, it return the size of the local extra field - - if buf!=NULL, len is the size of the buffer, the extra header is copied in - buf. - the return value is the number of bytes copied in buf, or (if <0) - the error code -*/ - -/***************************************************************************/ - -/* Get the current file offset */ -extern uLong ZEXPORT unzGetOffset (unzFile file); - -/* Set the current file offset */ -extern int ZEXPORT unzSetOffset (unzFile file, uLong pos); - - - -#ifdef __cplusplus -} -#endif - -#endif /* _unz_H */ diff --git a/attic/programs/ios/WebODF/Classes/zip.h b/attic/programs/ios/WebODF/Classes/zip.h deleted file mode 100644 index a4f071605..000000000 --- a/attic/programs/ios/WebODF/Classes/zip.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// Header.h -// WebODF -// -// Created by KO GmbH on 3/1/12. -// Copyright (c) 2012 __MyCompanyName__. All rights reserved. -// - -#ifndef WebODF_Header_h -#define WebODF_Header_h - -void readZipEntry(const char* zippath, const char* entrypath) {} - - -#endif diff --git a/attic/programs/ios/WebODF/Cordova.plist b/attic/programs/ios/WebODF/Cordova.plist deleted file mode 100644 index 4829e861a..000000000 --- a/attic/programs/ios/WebODF/Cordova.plist +++ /dev/null @@ -1,63 +0,0 @@ - - - - - UIWebViewBounce - - TopActivityIndicator - gray - EnableLocation - - EnableViewportScale - - AutoHideSplashScreen - - ShowSplashScreenSpinner - - MediaPlaybackRequiresUserAction - - AllowInlineMediaPlayback - - OpenAllWhitelistURLsInWebView - - ExternalHosts - - zipserver - - Plugins - - ZipClass - NativeZip - Logger - CDVLogger - Compass - CDVLocation - Accelerometer - CDVAccelerometer - Camera - CDVCamera - NetworkStatus - CDVConnection - Contacts - CDVContacts - Debug Console - CDVDebugConsole - File - CDVFile - FileTransfer - CDVFileTransfer - Geolocation - CDVLocation - Notification - CDVNotification - Media - CDVSound - Capture - CDVCapture - SplashScreen - CDVSplashScreen - Battery - CDVBattery - - - diff --git a/attic/programs/ios/WebODF/Resources/en.lproj/Localizable.strings b/attic/programs/ios/WebODF/Resources/en.lproj/Localizable.strings deleted file mode 100644 index 897268443..000000000 --- a/attic/programs/ios/WebODF/Resources/en.lproj/Localizable.strings +++ /dev/null @@ -1,25 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ - -// accessibility label for recording button -"toggle audio recording" = "toggle audio recording"; -// notification spoken by VoiceOver when timed recording finishes -"timed recording complete" = "timed recording complete"; -// accessibility hint for display of recorded elapsed time -"recorded time in minutes and seconds" = "recorded time in minutes and seconds"; \ No newline at end of file diff --git a/attic/programs/ios/WebODF/Resources/icons/icon-72.png b/attic/programs/ios/WebODF/Resources/icons/icon-72.png deleted file mode 100644 index 1aebf5d34b638026e1c7caa63e5821e372a00c45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8844 zcmV;7B6Hn|P)PyA07*naRCwC$yIHJl*>xQ@#$0RfeY)GfzUn z+n#RkHRs63+UMR^WU;^!Bsc-MAI`h?o_6oC#vF6ZIoBb63yz1s>raxYv)6y(59n|I zXa9VB(sRE0OaH;VzuHU}N4KZl{;m1558r=q=VHEL&&6mH{@$Bn9=>IC4vu}U!_x|Eb z0Qh(QTk(JU%YTl4|F8Wg-*p~uedSNkCSSH+`;|ZCH}`&F`p!@N-u>V4GhbZ%t-t>D zqj&$ww+`QY>!`i=`hNT3M@Objbri(`rdSg1By?N*M$;s6^Y+GcOl94G*n`GOo!e=kG zyjb>BfNy>71Z4=m_rW3jlu8VnU%f6NnuOx z!@X-$`Aq@z;48my{Q0-u{IN@)JbZo?58HO~2y8x|+xh)_clVpwqGRu7ma-kpC#mb& z{Nl1t$x@oOIc=8CZ@qh&JY*>)lZ$Pe?em{I=C|HER(o8pZUe~cb?z<`Gce5e`nhF3&N+HarjTZY8xCDh@pB13L{C{_| zKJ1Iu&ZccQS%T?`DG#KvX;ZuE(VSg)vp4B-*EZR~95U;=CW)4ckPZ(f*0k9KGt!KS zMv`Y2Tc(_NbTp$2#0ZECJDlJFxC1E}UcOx8{`~{I^UiCyT=snL{WE+1?81eFZtwOV z1F(4QEC2B?ee`njm-?Z7Gl(^_HgCRloFBe%VgNY|VGwAffwX4YSTo6#NXy30%%J(3 zU%MT7{x97=*`G1x=6tP5ZrYA1cb1wK)->xL&B?*ENo~rTf;{QkG@UeQJw!?=83J~G zF_?>$Km^T<{SXF__wVfS^kPGfgb9JeAchC0(}oB8Q{K6=$NjwtU%Xr~CGzZS&GU;5 zx-NsDk+l8$Kl9Ia^ILz~)l6T$SPru`S<@!wF5&e@hnP(ptd~8!1ct!@0^!1Z-k_Oe z3`5{E19b4{OFzQt$?v{(w8)m4e708CG);@tG_>3#OIfs>Qp$_PBoDzn>2jKOja{uv z$|+gtVdqx^1=xrWQTfhoUwE)L;e6KO>GLJR#bm~l<0+1gW;#Ba;b4D)^Yb-6dUAp1 zFP7+g$7`=0a=R_utP4|ONSvl-{$oID%~;&U=TDbho^R1KhQ2sne{_ty5B4<-1*x6^ z&d)d4-|sYEwA%Kr&kWGXkNwV{Ri6Gcca9dBscBAE(KJol&~j@jHL#S;a$atfCQXy~ z7oDY?EG0|5%Lp@yc78cn1W4B40V+zHt)rCS?V~xSlZLmBXE;8ZYBp=oG>NCDYrg;Z zoa@a%3Czj3S`SRgbos1c|n#@~;g#1|nV#;qarG_b!DJQ0snJj^pXeoiI{tTuMo^Py#*~xLT`9W(g zv$M+tl&lBcI@OuNjk%TP#?0I9|V zKr=$g_~AzvdgF7)ynSbZk3PJBjT9mTn4xJBU!HA{67}fKV?6%$DL2bOmJ_FwMuUMU z4i#qvXeseC0rd7ye)(QIn;i~ltZN!DHEBL|n{-`bYLZzpvuvOlU{<9!nFM-(ZOYi| zjPndGW)p6=1y`$qPfpix4-P|Mx$Mzzi-zKO=j}VZduzevdH}{WjOva+gCqa}L1Hpu z7#tsbaIS|B54l?Qyf|MYCyFEj!PR=uod*kSTwEN_FnhVuvnNY_Zq|qf?(a=>_3VmY z|HgCv=sS1Ob@{Ua^o1{d@rRrJgW1{}+&`J+l-tyFlQikNlv0x{=aeibSTZmfK@-S+ z5Z8lSUxM#FUEoNk%Tl$4@W$)}tfr?{zvm->@+QD=Z^7 za7_^b%-L|Y+~WE3rS3mC)&{e^?KkJzHm$Z zcEH6|;r`(aY0Mp;37}`I@?xQ<8o8rO?AaIa?)i$ph5}>h?=>EJ}?ZSqk}1z%K=cWK>$?x5P(LF8Q&}CgcqkP zO{b0S-QVZ?@4kdMDt01H&o&ItkF$%mJC{OxmIUJdLf4Fuqu-#p{##TMIjkLAUN^ZhAPw(p-o`>(xqWVt)Z zIoo2Itj*cNQcdAG8)yWRu`*}WAzFu zubd5v07#@{C?#-md(Ljr#A-cY?{N10Gw6-4{rnqdws0_-Hrc_Vy(tyQ`qN0zYKbr& zV}#Mn`0`@Q=_GSLZ5UNbc5Y?&G>$I?j52~D;n~X-4)!LpWavv^@IWbn;(~ikYLG-D zQZhC!+JB|{BnZ_clYqk zcTWKWM4~chBwna`BdF3+K+49KFPD1#^+Vphx2I=ME@6p~gVOkHX*^XSWy94~kM**L zG4R2=XWxIZ+Dzs@WGU?d79g!@Xp=UPAYB;C$qLr!j;l_Oga8djV!0{kCKxT0R;Nu*lZma=j-nqpe{A}w&jLkJ@c!jXK5$?n%NRx2+- zSTbB(Zg6?E)xp6G?n2)?6jjSoHZ(b*X$&dZ7=8vC&~*9x1L%vt@NYe&~ZBkg!}2=-P~~&6P!Xl|^Gu_La;yzK3Xr)vCvO z)#K#WqJBz!uEzRKsWBYi*~e@#(dqLgo_uir=?wZ`{@fp}$%W~j<;GNtV;YT{A-Eh0 zg$mN;wxDT3)jGY{;ADS-lx)|Z$MvPYs@miKyBKPlgy%0;$k}jo zIK@yLFzQ-=KnT=z0fK9C?!pvj=PPwx#(dGClz_V6xnA8oe{dn^1m3Vk zqlNzXYhD3sSEddnu-+6*Ck=9wIQq$I6;43e|O_*F)r1f>k+3@7~6&CXri&-c4c!ew94eT`!>)I$H zaDK7Ebk^w2w{C0yV5+N&jh=jPhV`l!s%EL{4Eu+Z@6DjQpL>e{aIn9Bdp_+>rfn*d zCZTH*CT+s3$(S|?r35~BvBlNeG3zq7rJkv-m$sh!bqE>J7uVIg;Aqj|Rf_0ZSib{i z?jEb|p&uOm;FwJtTB4$wKC#l~M&oy)CZUu7N!+=+kK1?l;Vu}7m(Q+r4yA~f>jE=qD8j)!fdtlr*dt|FM`>1(g#$Nj#M*RN@G1XK1GmjOu;oIANSk_L?GlVM@f_qSgMqQ{NA`xY%I59EvGI0@q`r4;M*|{3U8eS?310O@1mzw|$hxZR~=hgxS@L+EO5;{9u>AlCN@DkW= zi^3hrsHRER1uh`aptIAZ?%dngWKvl)E>uX6C4M?UUdp{9Yg!=sBDsgU4l05oLb6&E zpIr?~If(=;g-FVi>*4LGe&d6PZ69W~Gc;5(Vzn8#>5Go{J3f24t}V{0v4D78(nkox z;G?KYi)o8n(^>U4BvK;Ze(M(AeeVp9KRDC2FA5L(5F#Wqz-Sftu~#5SWTmo~(B;J{ z4i2W;thTD^DY3@;_XcS1-oxB|=>Y*D^y4#pNFCrVT3Ci4kJB;1NOqX27IPx^+0kbkYC{7;b{^{CtDQA6@8h ze}eZvI0JS~CP6t-^)h4UGpk)5PlLO=Agq?XX49<6w29TSM75L(K=C~RI{w1XOx@#t z4*8}pHfge$O>LX?(M4$1K)FfERyz#4a{v@Z+Hzg=>yNK?O;ovyz-|-)L7?xzsEskr zrWuEemWydqM>$cughQzeau;4+u5murWRlP|#I#Ggbv)y<=SyT>iy1~Hj5!S-vmK+@ z1qqd*XnDEO{=r16 z)tUhkw%elZ;5^vx^yKLUkdj8@UcuQFXru9{0Xzawoq$May&lv}lV-D4SC{KBDuDRj zA$E6ecTR3CI;GBwHSD^qW@6E`7Ox*SF=;Gl7O$U7w3v2EDJ!R}oRU&bky4`3M4Cj3 zASI|Dgnn>rwt){{tO!8s^}xqZmkNo?^`LEE7%tgprj5XKl2G$X-IlUTYer(T88q!O zrju4fUv>>b?Bb~gwszVQ;;7Q~{-7cHeu&M=V!r6&>T(^B0{RpNeXwp{fBNA{w+>kL z7PPCaxq8L`Mj-j&Vp>s-h)rKc3sO8_446gKGXXiqd+q;Jjj7>swH`2O4dKE^FPE6M z^>n(Nq*TjPg%mONY-*R_#&b)^nL5ANV1Lo!c(F`T4;oCHZCL6+ItV~6YLl5I_$S%EFo76EGQ9LvhN7ES0 zps3fZogD2tvDz7Is0wlIa|9JZBKp2WKa}XY6jww*icc&x_8z^{TFSQ@1D5L&ADnJt z(-#3z-%JsThzJiTVz(ML-jX5m$8L;lP%_EvTAxHhLve-I3fMgqF`5uTv75t>l?TV{ zv%8rQB-Azu=jUr#qW1PWmEt>=j0!!nj$?MJ`7B~Q?_I`932}9~4jN-RYr;$UWPqCa z!3k*-NM0{IoRUKdBAg0WRA5+FV~p96wowD@`ftVVWMj;<0;ELhV%f_Km`{?5$8|Q| zWuCDKuZXyzz|BLFLT1o%)gvcrK5GO>TE^; z6`*3XEiy`NV~Q9>6S_&o(5oI#qZ`yteF+3q8T0(bl_p(Q*QF@MBkFa>&N7k;vdRE! zmf8ifOW_y+8;0UhN;GZyWRa$&TdI*&6e)pT6e)vI5bg?jgcpEG5lIma(n(TAB2@dH z92*I=v13J1ucSlY>D4J~lt=By?=_jF(PAW>9SVLJ~-XB4V7hYE+RJXB4`z$EepY#m7iS zR2Cf_Om%sg&~FD3*oFS6X3{7R_5P}%4$1+z0GH&YxVx9{259l%?Gq@n6#b4Jaxb7| zg*&3SJb8pWU_}a3M3K26kYE**Yb2P)D5z6FRwe!}xwK^FSn5xJS54@bGY;xWbFV4MNCJb|ahW5AC`*tz9uvqN>kD-3cx5 z{9?`92Q4OzX|*2e9^SEWR#$yj8P&MlMGddR>^d_-k~Z63O~Y7YC+XKAB-D&N+LH(< zyfP`Oeug_Fhr)f(Cjn#!kdh(>(hcUWNQLx_up*D5KvI-MpoUktgD5x9?7ZQ4LA$Z} zIHYGC%4;|C+4fBJLh zykb4VtM}OfRPBqRf-(Z;Qj}r%?hs25r;>`?EzB~)J<(leCBibRNEf*$i6$?uNCifN zj{`1CV~bgUfsjEQB^qV|tg?uL#G3enqpiZuO74=`O?j^CCIxOR)wK{)l1FI09&~az zsUAonj$TZoXH$eDDoAw$&1hMwg>fkg5FQ@oV*nle&{qzj=oHaQ-q5XpUPMoDOMn%b z7q~2<7*SU|qL7loG87{=<3y*1SOmZXTB=LGtI;?nd&IUM%(yF=ymowIlRO9sKh#cwA}T0;9ach&VEK+UV|aOSFAjW1h|$uXytK;E%iY9O zDriycEGQ;104xSWzSk_XNQdPDQa@&Z>qiLkz$KD2<9OiB_3} zFv?7IUy&5z<<*9_4yQ~e4t>*wcF!UjT=H~HwCWB!hm21*=n_6duvLg;8AF-EvvC9h?_3OuGKYOZ;dK3 zuFDz`p;C&5VTiU#(f9pLikBj);}1o6l<=Gxdxw((gqNXs>5H$I8+R`^44U8j;i;rn z;XTY!HGq~xOX0;0EP|Q56e(GFF$k0w%E!{sSbJ3zphQrDr7;zSDy3*OykvE^6bu4O z5yxf#5mCpZv8yfdO1u5~cWEr^pjS$`2$9lywT<;8#r}SyCm*e&j^jKCI22)2Oy`YH zCMmqQ_nU3mZhGIWwjSZAl>$6T?f$3lUyn9!nN{he+>g*jNtad15R=w|4Wr5Cvq=|5#CpB;tBaMFVTkRj_Xsa$a!Yb~xa1`_ z)4g4RI+fHYe2|e0FK|m5xAO{SASt(`Ft`tu2R=Yfz-q&e%wrQu3WmrOf@RoFe`u&$ zRNq&$sIx`(+bt7=l2abM-p{%7K{b0_d+c4~Xxzye;SL{5{MuwFk#mm2gD$$(H0hFW z)_q)@FTD&UN-0tL!J(*(u`$)xtX34^`SctAdtIdP2^3X-+#=vkS}~^)mc(LkTF?hY zQ0}SL=7r(uW-F`JimMtE3z{0j1X-|Rk!qWPsm@4Ai01CRT5Z`iFM6R44{)@V0aR(fGNS<#?UH88ek?Xrl3VBgrPcjAF7yIx;ApO5SeQ7pvAa5Hh>f$ z6T#5PA^>!O%hlHQ=PemQkJxP|*lp3kn8~kOU`AjuZ8V*9yMj&QJ_LCw@$%&|qLhdT zU7TM=l} zpiyep*0{aPG`3uljc!I_QvHUQja%q<9)O|xwOT7Ku2$g5UN%KR8KUk)(M>XJ8^dhc zV$$Z?r&g#ksJ584n?aXXTlIYjD#D9vK1)FKuN5AG9J?l9L@2!6n8gt|j0_5> zq11%CLnL8tP7lBd7LL1S#xDpag(Z2(<5F1|4U9|$5eZCLR^z}$Bk7PC2m@(jy~ac^ zk(NM1qMV9C1d;{k6XV{z<+RH%BO~e_pJ8xpHrpCr5n3*LY*u}Q0tU!PWJ48r6E~|3 zr_;vT#-i^B;*~aZHJ3GC^L!~uB5Q=G7Mn2 zhG8p%MQpcnzhr7wxtsS+ZoOakh;TC1Qr=QZ-Ts`ZT}0U&bUEGMKRkSWK5gd7IBnZz zez?e?dyCC_-N&{sc6zp{eLjh$IJSM!Zl5y*B@=QYC1xqwdWYPgCjbBfI!Q!9RIRZU z)Kf96mVKFYQ*U#`dbzE=>ahi_a6;+?WXQL`=%{yq$vwA|Jx*Hdaz;ssW*J6fVj^IG zS-9o20<{u_e%P$h$8x*Q>lFR+{JnQC=ZonDnAR`9@hkD2o8dm~_+4Lp+pPJ@?DCWk zE^+5e-R$72-tT?>$;-{jx(|1cjh9H*8)nB_A_0?+8Eh6_7!fZao<>on$#bWN!D& za%0I-%8gRakyG|I+jc(dR_Iq(FaG|oo<9Q|zm3P2fA7EfrSr1)^J4q6mhzO~st%HG zvRRE0PT|Gm<(u;1{~6Zjzq)+(5C6gCJ&R{Bd4=_;-I>KL5_!zeN21;dt=Xf8)=*_O*Zezq|Y6 zf8_VPy1lu1NERA}DqdTXd{X?E2Z^ZV9X`+45yzHe3Csg}8WlqnAJLdpr(acd>(+gp=RW(j);H(y z$J*!I>aMO%#TfD@i^JIu)@yuo&N0TEYZL#E+ucunfp7l1zpHQj{-y8x%=qx7?>{iJ z-SOV7gZb?E?x@|I>pn zt{11Tne@xcv)BK}+yCqDzXbpv_{7ifwO{&cUw6IdKKyyU@vDFD>bvQUKll6}`Jq=2 zUjJHq{r~*W-`x3*KXkhm1H|ued*#!A`sKanU;R+7nh)N-dHn-V&dcqbt6P$;4Tj@u zgVgZ;TNgT?wejjJ*Y#_^@dN}yA$SO*Ch^YgEvxEev$K|UPI&E$k3lbhcMnTh{`^;d z`R9HH>wo+9H@|~s>-mrU<)4%W-xr~8n~dz>xjXyQv$IvZe`DO)z`EZS$WQ(8&tH4< zL^nDPKVo_CvC(+%qqlDFOqHq$El>7$x0<#9%T8>nis;0zeD%yiObXck?%1Z|nqT_r zkyRa*N>^G&S-<%5o~Lmt-MTC3{Q`XM6F>3M>E89fV#D3f zl{Ef%J)GVysOn)e$fN1d966f0j=`YDauqflRCfGyo#yLEDJP>PTdX?U-y5-XvbGIN zMgk;_6v3R0=jSWdb>jZ+7^`)sd-o0^!tCUve6E`OfuH}iU-(OJeD7y|_B%iRgP;F5 zyVq}ib}$^oSn%X zy)zlrqw%0FU_Bf(xeMlirSYIjN2i_Tlnj7HfbOyzhf^M%E|_y7K!W|ht_$Rx00A%F zJK%I{fG>UN3C~XELCcn_!7lUGm%92x|8;9?`=A=7_13iE*479oM;B<@f+`szf;;;o z4JMV`1MeH;&IfE*ICKcG(th1DiR~yKqlLhYG-Q{9gIGql7>-t2u zZftROvF4*EGael;Sc-EtTjRxh`#L>cGF)MnCS=NxoJKC@9kPU{4=*$tSGfD~A*Ry` z!zSbC=>pSfEmrpa()I8oKlF+<(;qzC-)ag{y(}E$RMnPpP0LlvxjvhDYI2pv!zS(S z4AR*}F$V4EbZth`UGxxlwg$X;ZOX&_2@m#$>N>~cr*pn>|BUN(Aq1vmG&8yfmdg%z z?(FjTctHRn6e1`WUjD!VZojyPH@|$0qsJH6-XFr6ib&9OSc!y?`2Hd}{lKTbSJmi~ zhr3%?yEU^l8d<7Csdl9*z$~V8HurpT)~4qVwo+A_l@2D5*Y_uU?$$PM-`FBa9-S`v z_M@35ql&M6`G_83l??#3p?d<58M$1xsOzMiogq(8m#}1j`Wiks7-1RW{@xHzA6;NF zu8`}b!Kg-Aby_c5)#FO}{eb-7ot+oDY8!{U!@TV|?`&JD>n2rIoh)Sovyqknvk)kf zr3C}V!@Utt&enMI(TrW|AP9rhb{qP(wy?B7# z{V`9DE|851iH{y$;NHu7Qk}4~JHl7Le1aEW*yi@(2($B+Z{MHsqc^8~KOn6h=9e5f zETslWX}wZv*PdeC85jn0Ba#v1stcR1Wy3o2H(ozQlMRVrT_-d-(IXTt=45z$wBRfE z_Vo7S3rHX!fP}P(r2&XwU1z*;|3vqm+sFK3&C(VmGdw+BVsQVQH}7s~)pj^JUGn&} z(fQeu=NBD6`klAASatXRAnWajEn?^0ZxDxLFQaA z8dS`w=bC^R4pLH&gRn$;30=%vK7VUl_aB}i=Y(F=1$i)B5=js!t>e+-bKbeTi?4j? z3Cy5oP~p+zxmJsgXXh=(lUffR%&2fg=g8GQnhe@+sgJ|)y_B25c$m|8P$$bN<(w_$ zY$+$Rl$cYpl#MARR@r#5EX>I;8Po(xz#srFAOduOod;aNgU1&dj~kGtfCLbhs8l7@ zO=eYR`TssxEh$pDeJ?rd?{6%2;WdxQMgpZaM7 zfZ^Wtk1!<#Eln1^)`s&4_cQ-}~q*5Z6>w?9q z!|u)yT@gwMr3hVdbS2;(0LYXKgQmjC$z0nzBTlylo16xcS^vH-Y@}>BK3?h3n`e0Q zi;wZ1Ae-?H0U%Y)huEJaRoN^hGZ#%gP=YjU6cD6|KuU(T3siLidqR1}ndBvK0zgw| zzV&Fv8;27LA~qg~n}a04Lufak+Y)^E_8D&6+(xPl%^;(y6H+2BF9QQg2|Rha!2LJR z-djTM|F>Thfck~+`OJ@}s@YP?c`&G&;h?SpDT9_AmW`G`OQabA1I?1r=Bt9|u21dJ z(E=$MC4nG&YUv#g4S;~III5g58PzyDUm=+h64b8*)u*x06EK#`R&||KR~hGLOK`KW zMuDvKmcZ0=Y#R0_3=^Sm(^sWyhQQ4X^Ds3~i8I<`@AHFazf64wF&M&}B(p zrYtV+8X%a=Fq^kDlEY#3ESWD+LAXl!jqMS{RU%L<@!0xIRQX6JUi-LVdW#bwXQ24}iu?9sw?g5d>Nf)RiFwfE3i%lpsB030-CS za#bJz<57+Es>n7udwFV-lKNvMp{h)eAD-j-jV-L(4%6unb)EI(?Gvq*Ysdq4pWA-# zNZx$)yT^c@Bdr67l=>iLBL>Ov^t7NdySh)|iYTt4R9pa{s!F{Hcs6Z$=R{)TbtC{f zJzL`1!9>M_SEt<^qGv}kB!z&0RMn;zUp~}oS#baLBXq5cW&)(aFu!+AdRK1bX0&I7 z52}pfM3XBhs4u_0Ku*N4F)daOcU?NN{zf+MFIKGtU^=QGh|i`_efsg8*$u*sIGe3l zRf&T^)`nnlDJW({xZobxnhtR7+7!<{zmG=`XPC`aSj^W-$<%Wj#6-RI=2^T8YmIx&X$378#ulwIG%O#0Jg>%>k@e7?nuvHAEC;I2wi0tNp+={$eg&L z$xBnvlk8QAUXrg7tFd%IWDvD;ac$ee&##vqGVDS5)UpssGZ|peWQ+z`!$GCflR4gc z>s0N!gFH}GNeF2%Z#5oO8jou&E|x(kB!wBiNhE*h&k6u?-P~?cD#!CeLh=Yny}FJX zQ)Sd3o9av16If%L0->#<$(wwnwL?Qes0EL{7%Di?u#*cc<^1NVX9u#T70k z0|r&Xw8=0+TjLs|L50<-!_(tAnmX%iZyZA*m_c=wAw{n$K>rR9i6EiHVy)@4j%HBB zYPkv^0+4@G38}ZQ-9dQ0Y)ecBRYXd0vP4W9255S4T2xAibcqmX_}^bU+lU*bKIjbe zM9~#TC{RT0ZZ+7QHms`zg-}XQT%|al9xrfmwgd!J8M=F8OHGsEop0b={_9a*f~BAk zA|=zw(M)>>V?B6dE~7%gH`mGCt?}K_u*%5hbz_=Nb8L@uELx9cOEsC%R2G&@W~P*K zkjCDh_g!O^lSXw$QyKQB1AO9Rw=uhDaXxQ(dcM-Sbr^ufvc+=QK_Mg~>dF8Kt921b z3dk5s*A~V5VNy+5b++7O!-=qbDL|k(a=IdjGGiY z!yKc=qN(f1xsq89S_-oifb|;Cdo`_F*L+#<}(G;J6(YZml-1Vf)ty`hKK+aeT5_Dvt>-Tnz%SeK#F&Py!*X> zZ2YCii-XC!Y42RK`pwhuf)XuO@!=P8%+~aWvxt;(1X2hVkVU|3Gl&YnNH7w69Zptb zG#s(2O;zd#G@BU*5mH?G2lcj85R#eBFV?tyV{7B;aCwm4!CTRH8qs?LDGZ9$s>Ebk zd0m^YSKYfKSuAfg+4f8E_G^!pDc4O{PVS<2oqJmlUgQLwW=@ltA%MQ&*x;i2aX=_w z#e-e(kc-~m;AOM8;SB&l|M*Fl;vyv@j!)(~I2hy6qjM$eTPR&du$QC|6rl(pT$G#1 z&rasCy*=vakD z(0GvgT{p|FK0UShd?lir!v#o-Ri~{<9i(JLuqV}!6i@^q?-w{6l0y+BylY!`_o!;~ zE08z7=STY5&dptguN7Xx!x8RsFA-i8?z(y{CBjP&I*KAf5&jO)arwGlcM%a94N|CI z@&4g}u({#5yzvb{#YUFn;$j`8xJJV&B0>OyL~H;%p+LCz5si?dDBKD7#cWw7)23Xd zYidSU-W=gAJd!Lt!b=KwfF9u`f>|z?xfAAMF#rb2DM7GHSK8B|K#wq7mY$@`8Hf;< zVsM#!5FkF23zSmi?y4)({32vfASB5{iXb9Lg+cCpG(!p(qO_|L!@=NLO}_Q-|FNtd z4nZ3#yo)GR@=|1}$h=4_axV%NMRW=y)Eb;Psx z!SB1KC{TEjhs(Uc-Ia<%@bFUP)+r(>x&(u7Y_|3NdScInmp!fo5sBjQ*^)Q+M|y~$ zuDC|jW)Rtz+9k%gVi-bNuR7H=r3lFsjH}diA|fJOiU==Gg-bn`HK`D!~Ib_d0ZkV_UYP3B(wnsL|?!P7raPbq<98$eDjqWiiyJ4j8e%<7nUmX)QPE+ zn8Ldh#Y~|TPMTnn)Xy1H-xkv(m`DqVi42oyh_Lm#wJHf+aT-8)@6m+lRdy3RY*H4X zKsX>p>0Dk)SQdd@*X?_M$;Zp)8FRhqTSl5x(iYck| zJyn!8g`279(utE6f@SrFKLj%o62Sl&lv#jA!Omt2JKP!aLFt%~sOX1_ct>y1N3!>N z3J=C6f4!*dy2wO8CDcpF#-O-+DeheW~~bwJ7iB=?e{kaCzvAoYXM5NN$L0Aan;CIhelHt7nawgr<7C@+M82(c&7o?W%+ zF)nKo!j&~JlTMB=;`-q@j*k>l-)1W!;87-%%A2O~Zrzska$QbN7bV;a`Hq@|VoM&a ztPr#mmMVjFf+dkz$`++F6*3AedPmKOESeM+VkkfhF@j(sEeTA3nFN=E-gPE-hV>JH z&9wo&!w_6*y(IR-ouH)ks&!xx;axN}qsrOqik_4CY&Q4fr_179A5k(28J(hh9lH)9 zykmG`Zvr*|Ed^7O$S7TMC&OW~OA_6TbRtBP`lksg04Bi_$VAX2rqYRB*IG_NMW5l? z*rJ|zVxyCrQtT&K8?zgcGn5!{_s*6t=Bo&IKRa9aa=vuyWu-`^n7PZNNTt)Igbeqe zn<_l$r3C6Ehk8Q!Qivv!wp9 z6{BAcSXacZU0aocrS1BMejCzha>DMkMpI`<8E%P=h*BcL6{RSmZwfC#1~ft`Az3k5*Hefk>#b#PPa#Grxp#)Jh%m8qOqC<56<7$Q zL|T@mOr{!414x6M^R%w2R2kNF(h^yDcam&6uG!QXg1BB4Tr675W^+NpdR^46yMW|I zDiId+REn&0EeDNpxm=5g=)0om6uv@iT0(hjB&7#As+e+R9TQ{;i3u4=&i*GyN$AqL zThH3IdFrjN%Sww>RTr^ZoUkiiDP{ctOb>j$I$xxV1-wLA ztx~dFN!pImZqd@N1eeMR5k*mo6djxG>s7Andnq@QlyjA;I;C8tDkUEc2N&VxtW!Q& zE>^9G?#XZdivJFNIa+<&AO6D2o+f`{S*lOwoZW~u1naG9^i&oxhWmMx)oW!n`vvb7 zzZ$-tEzTb<7x({jdDr0W-e;TeWmVaZ2{oME8oS7qX)k$0KfCc{e@H3;+Au g?{B}q{qAo67YQCy^R=1qw*UYD07*qoM6N<$f{obUy8r+H diff --git a/attic/programs/ios/WebODF/Resources/icons/icon@2x.png b/attic/programs/ios/WebODF/Resources/icons/icon@2x.png deleted file mode 100644 index b7ccb848e3949b55361f2fb30dfe3a39756aa387..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19269 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 diff --git a/attic/programs/ios/WebODF/Resources/splash/Default-Landscape~ipad.png b/attic/programs/ios/WebODF/Resources/splash/Default-Landscape~ipad.png deleted file mode 100644 index 06bb96b394f8360815781aada7d1c3704263726b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52135 zcmeEt%1ew)aW zLLvN2YD(E9zt(j~A(`oI$+fRvW;Q&_bk>9F;b4E!m_X2J?fW(0YEL9Ll;dGA^XDMy zH&n}|^)Ya7!;=655N52o(`$^E&wH_tX@c{)bREGjGa z+2^{kB=9S+zm2lA_A&_Y!tynw0iXQmU7a9J!-0f;m%ZuPAHm7M%oZU$G+~+Z2fo-o zNYRl%q~h9I!O7QGn}4R1!hR?|rl5#ZB9BbyS$+882CAaY+@17<|1{uB_l7&1gN0n_ z&$jWd>+82SWtjd@7f@r(LJhwiT=H-v{Pj_D4DE`xjFm~psEb$eUszE;6TLcNpP6%s zfS{vwOC4Bn+SikozfE`N9QeqzT%knDPV3`{^+|@(kNeuBY%Q4GORDRmOw;|vcE*_O z0Y+b#B;=sl3FcB{V#V^6*f2S*m0erRD|g9xQgS%<=KG_fxlzKYg7|Z&oew z=Cb-4X`X&GcmJ^=Yq~$!1y_CVm2E0|uI@bCLh<#Q{SI9@VM(lEnW87e)jd5z_Iv6R z1QcswJYzy%qZ23Rs8>4D#)Wv4*5ndz-U69Gfv~Q^Qs$1r9cGd7JMT@w zgk5czH`2wLn*ab4Kv_Xn&wud%YMf{jkOo7*P#};sOi1Y2^XH!9l_TZVMHS^pd6y!?=8mG`QmkTcmxJ9*LGDU=d9|bv zclzfMBWN#j3rj(PwD3z9aT$GkZ&K(SbFu#Th!JUl{PX#b7k1}c=RXJTf1m#$@IM6p zhrs_3`2P?Aw6S#?Apn4$)-507%@glzfWi&utTRlw^tTP=Y<-*cGEJ3-Aj8T&ZmgW6 zJglkBwh)~+-6}e7c~XW%YbsOtKt>v&`#=c}UjETEDa7Jy@D4WA`LAmZ>CIvP&m~9F zsKfpt>$0zxOK}_R5sMqGeo_+tXQx4!?Xgymzh&ptx0tZpURNbdoQC$rwBv50JUL6b z#wMMwAl|+~Za$dx>r9gL71({+WE;CRp&Ivvp5WQgeLv|J0hc#(=4{PsX_zAf+V5w! zGGBTMOZTR>qc^5`98@1P;L54;A|17RP8GhlI4jiR>#K-6gk2Sr5oz;V zv?Jp$8frocGXm2TKcgO=CzFW{P-F+eP)_fTTS2bCc4X_B_sOFZw)6@i)0)%@=lN>0 zR$p7x^7huOP`05jFj7@qysF$Rw@A)fcyQd6@4BKUCt)@TE$)7-m@o;I9D+ipISln; zkIw$?&mvpmFhS7mZj8pwYG_S}f9H}|@WlQT>1dCME%#S|uzv^u`0glQRaK3PS&OmB zavB9^V|+NDG(UI~%Pw zH>ovruUV?WK!Kc!lDhYq(rxUFzvmJn?2!QiPsl$3dmhrlXkS5JcWqP)-W%_&86; z$+<2GKYIBBjmQ(M7*UzrI@)LO!uDsIN{O4F!LAT~Z5GEZgUb?eNvI3&LGV#t>%)ZB zvb>qaTHlEiy6IiPmd(imr9o(c5|XZ9z~QK`sx>H9uoyFTIyQLPe*DrI2(B@1#bH95 z8hicl{tHg@$3n9l^QAVi&PJb*ql3#)l+cps&bTYg%-qzxB`}m3)g3j!%w;4H=~5*{ zf#oGg&demF2DZBFk5sZIWl}o(TwhiJk4#5s_IP7jM_HOc*Xv}hol6s@(t#4%m&cyQ zxda?T*D)?(RN*PbNtFaE9!~%wMeK z$hTwW#(%ZCRCM@OhW z8@#q*sC*(AK1zb!o9DkeMz1J^n(hB40?tFHXQXc;UBRAHaYZ^OvtA^E>QSLTO=BWL z;n9LE`9T*MPX*(u=_Ffdl>q@GNd(4wGTxfH34)hFaqV`PZlq~LLMN(W1g6=MdP|eg-jV@?{kIFmFBZyl3 zkh>^lfFD@wJ`>Uih9bh9cN5{3z$urSjJWA*dbLpy20ex1#~>EA(nAFaIE#-MC1W}v z5L*5%JxZBLb2iwb$=P@aR<2T%h%u^6R6GQHb;XjEuS#P$HWFmZ^(CtHhzEAy~?8Ik*$NC06{ zrHr&rh4sXd4F7;?_KwMlXGAi2CClAo&M0Kcq^8EB8F9-2{XA~>a%jDI>V@P{TD7ao zZP3%Q!HOQ+pH{FX12%la4rGisWYx@%avL705gfkB{eHE%&OF%A z-ds2@-CQMob^TN_VCt%X8!zAfIiXp!W0S|pS`B8P;Rd$@#^AP{1zXWyKqiZ56xiMA z=&U6AQKV(GpijclP|w96OPKwmbOakx0mY|QZa35WiV4#}rc%IO1Q@nKx&i8P2Woh)f z0O+%%#B!U@{w-JbXR6$sn(Dl+7C9!+j+gCqh@P3VKGVUOk?;{p<0OK}-_%JDk~W97 zgYW4wJ0c_mNtkOBe?=zxAlQwm!{lByy?8X2R@^I&bh5KECJZAKG8V`T_-VOt658tR zJJx|{4{`P(N+Y|3@a&2%IAno+0mJy--03Qp!=O;vPE13q*ejPEWk6gKfW86$E%Wem zqmEq3+b9jypcziUzUR7s(h~=1@i?puMIxoO+E*}2EO`BcfN@p2Y76oGL-tN23^xYD zj^lEymsf%F*L{Yeb~jsKOsAMcR-lz$%c^Il{Yy$lNSE}sJx>xK*N{K~Y0VgB#^>kP z48GRQUQrF7haYkbo|g;+Ka?IDQNKBZdrL^U_*cw*S-^WIoNg~0e4F|N^YBj4Tw!#& z$x6f0pL>N72TyLXr8TgBw^R7&rrpA6t_^&(35C@hwj(Km+7054-vYYwgzvlK0an>( zXO`E8E*4WY+b;L=t`~-Da6O%7Ef3c8xt^IZOKkW{MgCUmP(Qk0yU5LZX zjk0Q+j%Vt$Lr@#WL0wlO1VV;s0*SWW!L35|njQ64$FSEU$%I2eFm9fRBJKLlaiErPfDGl%q)8%%OHIV|k4+s!vu zg~ogG9nY;-ZdQGrjC*VXuXYt`I)cY2oSo{W#z5*_OVf|NC#e)d|)hp-7&`KkHu<%&+{N z+eWd5Ty=M>V7ud6pdX628!h4^wmp!WN1|A5P#$Ww%Cr+bkA>9u`kaHV`lS74$9N2> z<*jvvbj75cvUU#1?R1jXIVzn|op?&euqFA^OMlfkWGme%;0V zV7DtDtNGUcD+Dupy_T8xGFx(E<@lFhJZg*(ka%0!R)N#(;A?*LRzkvhrSaQp7rvB5 zb4_ykh^bdynrB_oEJN4mMPZTMACrBv%wT4u?CrwZ9qV}r)J`veTCG^CDy`?h zoArrkpq-WV8MwCGz5A1PF^6+~lmWqdK)TFaYaTE2&ZPez(fd3G&9*lKu9%DLrAuu4 z^O&+7e7w=kH#T`WGm0dW$+GZQe}R%Hy*FL2?yvG4N>%T#Uq;W((_ZXaxjr#!6_(VU z<*qTCIHa9(^+W#dI6u58f7&n*v&lAExs28E!nK0bZ`d_+kqyQzCq>|!8Vmxr?#?Du zL0fHZI@yYJUX*lN*g`yRAgW6hIu~1Z&alTkq@m>Oe?~g*l?0H|@Qhtz6c*B*+hV8? zEBA>hHAC$LG|uD|sjN@5&%zzutV|#fY9BHDzDc$2)2`nKlEXtxJnnga$^p^uqVjor zMvHV`m*$#ZQ&sV9ZeM_IXfXIqhbI)_Xy2CAlcTBf|mDMmk8SeU=o6^0c)kmD4D z*l`UW*IPc9S<8e}MC6QEh}>N>zl9X3tQ%U^B|^ zzod(+2NE>B&##R~#|;~9t`xR(lttZhrrAMIgI4IgXh(o%tGG|!OpI{fE(?vEPC1{e z2qSpIT?$cD>(zvX<9^j)ws4j{0gc|vj1Dz(4b}~9P`_-0@=#$@nAsFIndklksxu#7 z;7iF^3m+-U?r70>`P8co^W*!IR_x&4!p7Os#+2GT`%T$T_3gP$GV(6nO87P3(QF2# z*?dkK$)|GBBTIbR3*~(qU8j9@%w@=>lC%o-b)WfV$;LSp)vJdIg_Cd#nHZH{bte}` z6-uOj+!{`=0k5CydNGK;(|hrxK7M%`4>tRsc1mJk27XzEI&YGyN=!w8Bs(+euN^(# zzj$lI%#YAavMf?4R$w070dRcfF-l@dVzpCt@Uiyv^$@G%*NmD)l?lWWV`d;uVV2!I zA7$ZIUal+fDl0nDceOX5jNR@g%kFAdp1%9#RbC4tzyWCE>8DFHqv4y?qJV&C_F>(VVG++$*< zFQ*R4^eb3Hc7iA_)`)KCN!NeZ#(eC#D(9ZwpJxbyVH@gUf4MCN7HC5eouq4$A|T}8v( zVtb@)F^@JE=15Q;8e}iMmEpoIT&a(EdB@9P3{C=SwtaT^eZgVc222cX9L+?{o6KOQ zAop@1+W`7@7=z6Y8EWusD140x;pV=o%I#%hRC+a;oVL6fmt1{I7CIBJhelCF6?xo- zG-G5@ha19&B3DOu|4mbtJcEinSRFv(pWIcDifh!cmp7lG!{NHbPe+ z^%9b=@xQ-XDHW4>RFXYHU7Ero)+AN4RrI)uXBk% zBHV6H4q-`!LZa9+aC7jQDsFCbe(!XnIAl#Xdr=%dbZ-7YV==_MwcdsLO#_kJ&KN)Z zeW#-%{ebiCCE6fN_dbPRj-*h9XG0RZYN0l;iz7Kva&oz@bVc2*`u0Sm2RpjXZ3s9` zs4C@I9~G!Sv~D~N%T7Y8?he%vF0heJL#S`byh@aIolCTpFAeoO5{ak9D~IIuo_1q~ zbHxp~tKX8T24iFX6;QuS<7NpzJGayI{nVkU?e~Anih4D2jy?a=3$gHma0mRU_J(7| z_mqFKG`BQo)CUT_cDQ(C{5G6A83*YGr+p0Gl8#Nr?+%w3Oa?Ij;cfGFeJxRqluzv6 z!VMK)u@?OvyjQ!v*YshpMfYk8+{xuPzh^008`Z^&;t~;-7f!3 zdJI_Leg{;%40I9>3UFfrK6BXUzDgDX=#9{3#3q49#sETI`p^~+4fnQ=BBzFYKNvVa zqBpJD%wl#-!yF@<^^}{x9mtBuR(u>cO;_ZJnLNhEH8^*o^D52IXPr1bq3}SAo}X0t z!r?x*iFu}W)uia4&&+NaZBa$`d5f=yF}MBp#pys)w0zTGT9oz_GfYHKyd_~}5t{R; z{c@@$KD#~moy?XHDRclIUxSrGqT=~`vOs*YsIoMJ9qRLh7=!SGFH%{oTIc~aV$|Ju zn!>#W&g1%)Xh#ESEfI+btR2*{dD&Z;O#%XsTxFxAJfxGqq0?g_627sx}9twg)f8p4JI5m zIF+ZYL*2Z2BlA{`COk<&R#rt$&Jjkdc z=>AO%zMMp*8VBu1Y)HH!-*_1EW&u2zCjEMJT%&2eRTa9TRRgw`KZZ)a0E$8q>;b=@ zRg?KTF@%*EqS?cDh3vNx@ZlZAP|VKk5$Q!cP+}_RSXz6du*9UQs=1ldyuGEEh$4PV zuu})DvDc-LEn8OieooHO330}ci4r-zvZ1tm72AUJfR5$mO!kcuHnf(JP3i4TxYo=~ z_Oi44qK2|MPWD_?-<3mi>_Sl`J9rNHTUOpBstt-tv`y)=E)+2XZ2biBN2ilKVP8Il zg@Q{%{Z>^ggpT-*k$2sUV>X2*NQ8~(RLWqtC{&(7BOmgTS6M$U)gQUcCoc$p{S!7d_hV2o-LR;7a zDxOL{^(eQjyM`Qh(S%zSm`TY>J`H2=?%W|6gbTn;a}J>i>&vV=l5$wI`GVv4{4{P~ zl}%+?=^P-u!l)%y?dP*GRi2vky}ftt*MKyRD!~rBObu2)BK^*Cza`jF-#ye*HJz{8 z0jVqxyP6Aug5OuV`T4_dAEqYed>eH-A*Miz2N(H~-I}a;(X_81!5bwShogocp>`t8 zt}slLPtb9Dh&jw+YQ)U=@JOr9C9QkKV)`!gWTqF1@BVc(&CYOO{q(nG>Qz1Ju1#lG zQKG=pB8XU}50t0o&L6`SA19@-FONS2Xt^a#370QDcJK($V1CScTZfDm}DYx)<9@x%@6Rx_4JHouA*(_Gkr8Zi7lA+}>~=UO^41 zaT+%_H~XLhAq#tCM5FSdw=KoL2Vx`x`U|^w&_6oQ%cA@TALGnG@?+Mp4s>k4gfdP# zyz?N15SzyG!glNSZoCSl+)Bn$*I{tJ2`y{M^9B&Eu;900g^7e`%B2RXBI5du8{6NF z8u`mn>WnUq#V$x+Qv-!cdcP~$eWb`k1o+o@@4esOB6Z&1xV=+y(XB*uz3s>7aI7rvNUs?MN8y^yf;6*QLW1PAr%pYB zp56bR--y+#l-3TmOukR5ZXkMPv)<){vohbW@M`>Nq+cO4GvaL=A*%akXMY;;Ely{a_6UUhLbV0BB%DqwvPOJ2QlP;8o>T1v{ z3qQQ<8qg)uw_z~brYF}0S!B)i2F2}F%-2}x*ZEHKkl(a#uU)PGNBX(abvixU2W6Qo zwB@&@!+2Qc$M{*REYvPF0>9Ya)(K8*8UYD$-2*u~GW-!Pz{nXTn9#9)3dnfm*PAUm z*Q4$HpiUhQaRLx#Dv>PhY`Y-8dx>2c3J@;9ds3hwe_v6fmmGj$x*>;`dX$z_vozyQ zjn^ii?CHg!SjK~Iu_lDkGyrL8=j`om?iNo+{hIc=GDDD=Avh7<>VCLOB)zO%wZb`c zou^Ev#)kK)R}T@WRMQ?T8#UnSvxs>HkV@s7NLaAYN`7;*!S&%*?oqDJfqqJ}t7vS| z((YVniW3rAd?j9S+gD_PzSZqDbB1^yzmwPk(g#cA5&y-(KJ0_ znQ?t~7W|TvAN0+1`Pb_wq#N%iq=ppb?)=+ypOj3%5Baf0Qx`p+0wiwAlyYyY^YS#a z+UYJeuZ;)6Nj4a)9ZEoE_!GeH9FXMF173mUJ$+t5@YB*W61rjGe}3)s*ZBf+7wZz( zNv1<#y0d-oYqCk6!cEti`*uCqjK|oq&=K8lQU7Mkh(e)h5In$Sgf@x=X01 zv*Opw>`e#VZoOjAA0ran?&H0GQIVYHt!?F^77H`n{BD23_f|0PLN>%He2^k|D^wO?< z<4_Sa4JmTribx&O)g7kg+DdhHT$EIv=4-w64gH(RylV^1%!5$0xai12o3tvd>Aki7 zIi0D4fI7otT2_oQ$2FFh;X-uruE1a;Vz}u(sa;>93`sZ7uaQray#)~#{up@O%bVWB z{?oM3^XXYj<)3!;8CB?t41~L{ug8$oFR+daqjc_pX!OxxnH@?(jxi1iBwDxAX-Z#Q zc6npil#b{gP!|MD(NbpUR>N&H0VNu^?sb=*i1H)%30^iZG5Z;J$@%Sx zq|t%atI3Yll4|(w&!W^+V^??n{k4L{Ul-U+mM#T3t95|g_!xU>+9QlA_>|E6SAF49 z)0l%*b-7Y&++?>-^9t@{qT0etuWF@sZ=rmfws_XXyJ{Zjbo{GeLs1hkH(?QS`c10E z%bP3DbE7{CI3u<(-Cs#-Nu`z0kALl;0{)u%hYJm<4$DyV5tkh09W6Cenc2VGO3KgA z-eeZ!2gITw?tXI_2=ULw}aM_kWiKXZkt|) zMf>}ZwJG*aI=Oqq%1P-c_IXhnIS6fXdmz6mu@PnEU&5}W-;}Cnspv^pkt_bqan5o) zp3PIww*^rNz9zmw&XYs4I=dGVK}`1>8;u$;CVo_^QNiqC4XAP{e}7M>(U2J=xSX)7 z-xW@yRw8n5ri_9-K|FAyh>Vv{ZLeX8ArKYmr9wHKbMrC;vqW)$RU#4-gR2o>=rMk0 zT)AW7-=fD|>xVJBr|s>Z_{=S)mxJ|#g2=X*UD@82_}=rsT=WUN{&3OHE_$%hn|2xB zx>(_J*n=WGJeqmA+c){=jo&=9_2tb$c6Q78=?|JTJJ(PvmAGULDGr#LwuxC~x%P1> zlyS4f7y7HVIKo7;qy%Z-U61;;3R7Idry2J|y68()bo%MWmLV5I@=P->Jzt+%G)cpo zGct3MSkK0krL&0=+3Dq0G**)&;tFQ5ZB$I1@jMS}g+ZrLe$GiF6iE6|Y)`%%>#2o3 zQ=fH@d>W~dMb;T6=hKvxce1z6{&n+cz_D)>vGR$q`d0afyNe4*{PmHEo-=5K=yquO zi1>CI9hOI>%WXQ(lQEc-IIzc@H<_NkM+8Z#Ph64KBoCL}8P#n|2Ds3egSx;_gPq3R@j19?PV8!!hkWn?CtGZzrV zE|uw!lGtrCFCED+i!0I>JUtYxG~--aA6n)p(8;MPojx!Yp%R3V=~ziz2}*yjYl{d- z$;>8<>s%?APlBQ5ni!ot8m({7%fe2e_OHbDGzzSLoGwrK@~Vt21dg zTV;r^14dS0T@Bs(yC^L>%Lwsl!r8ma?hj6WY>J%pba)gsA|bK4OOWJHFqx^fO1~2*k1E4D1@wG`nBo z49e2anu8i$fHq3O&G5GdHcnB056|rp2i*Yua7+n ztI`X^4+`>BNJ*zlBa6yP_|z7S@(jTlTp;E7f&>cv>NM{ov~^>p`3s1{<%&jc$Jscn zZr;Llyu)p9GcB5)OkF~i(yU7qZ}|2bdfSrAXFv>?R5?|VaB^QqU!K@h03W;W6>8}x1P5kZ0avk_~9 zY#kd3a$ge>A$<{KX<^Fk6wPmeDJ~0SY{cWdUs8B>2N#bIKyT#V8Zu5EZH#b(u(O3P zUOF47)G=Zo@Z2AaJC9L@q<>;Z$lfc?zmRU_EynJIVEaP)$N|;)WHQEmG953!XV#5E z>)HY8Y(buXA>tI-2ArubK|W)Y$-HCwl`D*YY#YT4YsC}jOXOguFAxs;CeGZ`EsYJ< zHOmqeuhM}V^_N*8WS_M8rmHF{u1}7>vZbxK z3WJWz@WQ3tY{4&NaDrfoS>g$o3%zodmHSykO6$u$|l*fA(ALdhgtP=9e;KVdBBfrRwBDxq-YNh(PvkB)NW z%93uYIOhAO2v3jSl(-?pMotA_}fSE-bSc;x914h$|&k@)pG||94Y-0XR z`v4JK?qXtG>EzY{A2k@KF35G`rXvH4ED4e_PNmKln9rlqB`yQtm1UqKs%6^K#7+q_k68QnV*6`?oGEwu8AUQM;PI)(gP z^YPg+IEGBd8t!?mC5kAKJTdJAnTH(gOguP(Q!v-NpEjs->XH`VJ5ko z&>lvd==%4l(BiVu#Ms8CqB6zNL*k@<`P1`kkMkS>$QtgjcSN(ZgXGh?1?P>iKReT{3btD9BS%$RS>L)BDgpEfEexRUNpQ z9e%hos58$Tl-P020NmvUuYFo+HWkWjEz!Qwbn?AiPNKNczKxB%P%NPF)UD|GM+fDKWmjBg6jNL?)179B6 z)L7A&r8@l_PEW5g6JfozBT=d`mxoR@Y-}`Ir`Rs>+XazP4N@o64e9mCS$k4!JMu6> zkl+gi2HNz49@Lw|gSjdgaB-pG@u8$xEqXM0nCGd&EV-%3OHhLbcLf0*d6ZMbbz_}W zMehLjeE#AMTefdxlJLRX+_PkY|4{Wu?oL}h4V4drh5ty!5-sl7V&A+Aky=~fB@nVz z28`o(Ofm(>6|d4VTyrj#hIEaL=nAQxnQw*{X1w`%>q^q+>ZaMQFp%Ec-Q-_dEQ#GKm==dz$Bc_-iF~z`C~i-UPyBMw)mAl8bJV z`a93vB;vB;v7rZ$j{n6f$$tXoV&W&4#L9O_RZlMBUJ-qDcgD3JOV7}Dyw_i%HT1@9 z6nIcFWl(c3_pz%pR($>y1pT3+JaID97_L+Ba^kwrcy!F5(qqbNc>ZWww(-^g(i||F zGQu^R1g_VezTVDPtDepLjXgSs>ehbgPFPt$-pl`!?goF?REZr1YX`AGNBV#?UJ zoKd*OrpRaQ8zR(YBA-_?<8jl$B8mM$gx{sjm&_@iM;m1>$WV251gEKSwL^>8t&yqI zJr@%xLSeTs{6c)ud4Fgqwt-bu<;#?CL#XuZ*;&fdOQzOOfv!{0B>u$iDKnW^RP)?>Ne zEL&%!hnG>Y^mI4swi}*J7xnS}t5dKr`g{}USE)PimXIrqf#kJ(*Kq%?7*skikfVLJ z)=Ts<EXen7#|;sZ55xN^NkVgyn_XUx>etDYGcyVym8tg!a!>QwU>JNaifGw0b1#--F4;B z4jyz>(+5t{>Q$!49C7l-Puw|v{N_<*8f07%pF^ptiix?Hl%4zov40+xK^w93|1Lt zuw8!HiN%PQzYG%D9k3S#i6d%r;)T>-P;8HrWhlKtZ%izPlTDR2NiWWGi;nM2YDga2 zG})Wt38PS&gu4X>VI_|U#vAX%E-rd$GUn}0!YeH>n`zipU~r+Hpu6NfwuI1YqvU41 z>E!mb(8G#jY6+`N{(fJyR3zU-S#UM~9!DfF%kF!((a=TNvJgs{=D1m|sB|W%NHT)!Y_3$4%*6r1mch8Qd8q^tx7LC=+YFEZWV}^WY-Jb49hS~?^hMqC{;hL5BJn+2^uAGPEVj3U zS-40`@h<8r`rtTq=SEAa1vEWZ^kxa>&XGc?I{m{55kHm-`Uwr%GuB0Xtq2;?ytS_W zvyGZ<&9exS<3oz##acUxgaYGx2At`TS+pl-TWGUQgKvH7jd={QNUU4gur;ZOw{dKp zRZ7t$&!{^@@coa{bN)tip>bc+VHE@fx)fuDSMX}yX3hc0+v4r!su-l?8em;8b<=hi z8vWsnQK{B4jqcBJa$V~F0|S?i2X9A{UuG>Xi4PLpk;)GCcVb%Qm_B{qRHUStRX}n( z4J+-uL9XQeH4v26OAHVOWz>`}F*xlnw}oOVj^DCLq8&h6o8Qbs*4kFU`yUL_OQ0$X z+iy0~AFHJW-nI#8*o2kvk`=%p^c*j&4%KIzY*S_DH&ZM~r`Ya?oG_TTbMdiN;a@hI zM0SM0F8wswD4C5{*l>#`U;lh|yd_cCE~(SS*E#h!1~oovN%79+s^Q)@vt;|o>&xyX z&1fkq#A3+pb{XVWJ4_rJ=Q1ZsjAG+kQZ5U8#N=6(ttSgql=IgFRDbB%4bzyCm}(=$ z|EXnY?Z0;)08VhNMTbl7JTA~{y{eo~qp6vjz3e%KD^EUdTnaqNBTX9KCt34o2d;#^ zr;MlXeLqG2DcP5v9%|))%=ZZrydYw{E;EG_Pf}ZVWaTN691&}~9Wg8Td8NP63~${@ zy<;rbotg?#N-xs(b#t9tE`s*P_hq;;9q01$(gxknh}MYY5g}E+^hhFLMGbr*G!|f$ zC1#Eld3HN@+#s)`dyx@Nc*|lg;8i|PXT)yB;76v|9AY=bvMVk(uv)U+{Co5sQ9;SV zbORnHwA?BS9!Wdb(5gEx(4SA(-ET@M6;wIsN-R2mJF!E{y{QhmwL`o>OP~a_YqiSm zLR%W`D1fu|txI&~?=huCMGdbp4V`DvVvaM=D8v^-&=VGz9Y3(cGV4#Vnj4DUmYNtP z5;Q$+n+N)Ky3zZoBw|KslnS*|FODx=?lbFv#4I9&Iy^!xREPCzfIbrH(-OnUPnUXj z&CYhQSK7T5v#UG*C{0f}`ga8tc}MlpP@ts8xUbqtTT$<{EIf4~X}MrP)|&+7vzcD8 zy8Q*>$)_to21dA;c9|T$DnCukyY&&?p0=<&{~b5*HtqJftGN)#m+;6k zmDi4!)>>~VjqmZhj79~re;PnoBpUxI#zlP()(Q(JG`?pX=hsLg^YeijaUc1ef`Jja z4i*>VT7TaP9u`Q3enPgAqg{(jwlgH~*kaVCZnrwaj$xxuFIqdgjN8Xp&0MfWV#xZN z5sE);fLHT@&2v(HmGH<1DJ;b-8A*w(q)9A)pwvmq`Y-pXPOE=mS9Uvkj_&JG1HzqD%^$lkGJ1cVdFz8_3AV5Y5Q_#vIF z^HGjDGW2VGp>HkA+XqLFM}maT`!DL7w$$xb3V?2lFQ6DknLCeKfR+=IwsmfH)PdLE zZZNt0Q4t=()!k@Kop|O#ncW-ayS-r@VL6uo8d?IrdW-ckUZD!j?6(nN0mcsW&O5_Ku?hweU*BpE$m35s{S5W-$ zVEtaN7DUf??S?t^xg{N?ion@8h)@9ejycN-gZp8r*tj;Sa5 zQOQTO^^-cIG?WnU=?7wkFVPA?-!Aglu=o#HpT+hQ3FML`rj@V{y{=w}*I8wKO!9!} z@L|~VI=`vjywIO)T6TG_@24dA)xIk$f82l*nrr@izQZC!%@oub{ZcsdUZA#}7T)e^ zUxim2&XUlSf#j9cA={@rUrM)R7&009qciN{7A$Z9@9;JZ!fZ^sy_uL4P6pY7uFiqd zUC`DFf7IC~T&8Ozrl0HzHxFx9sm_cZ57=hG6O8$yL}5o$*w8PHn|AikjX~yBZcLX% zy*0mc9x9ljCi`}t&fJ=99vHqobVo5l@VfoiCZkbh`ebSAJw@jJP^PF7^A95XM}D7l zzCPoMOZ_oPZzbGN~ULUD{XCE&{4wW=60s| z7oEHaG5q_z4;t(UxnOc%V*}NsVo(&SXY{=v5<+200Lu{PZV7%tZ>F_Z0J)wDnvt*T zz1m%g&*GU#g@pl69XRG6CIt$^7XUK}*ec<)?Aubw(iPn4vM z%ixb^<$g;@nMoQuwDzu`%Z7w5f@wy9?oOVhc(--IN4tVM(i8XcrTZnA)+KIAivYPL zs{wq(x#5OdCuT(P3=NN8-O;ApVlLiS9&;WmGy8@(fg>JwAgWw{5x&$tuy4hyesuGz z-2B4}ME0N(uzCZGKF+f|_r=eXlI($B-%+7g$XXp#zy!=|gyT(NjE!TO`x6 zt%U%$f!cRQWV^NI7rMM0aAq#392l=Nw0C17xl&oy?gg^}xQOZn(b)rD4Y}+nJq9S# zgmFBFs^@iTUn=8$xU=qb=bebcGv2ZnpZ##Gj!y*=$_*u4s`a)|Zrn9q>I`ycu8PW< zG0U+NG=FA8KNKp1Wo2IFMu?k|1vdm)aS_))jMiQWE93c$Bk$k1&m4B2CDxPhiIQxY za1@ipmr^6Jog%Tu1rqcPS=&4*)2`h!sBM4QWB(XGGh2T%ed2;sEf4#9_0GKsfsON% zz6ugE-%oU8AsnnmCgnet7{gEdK1(nZKPOA7iM_trk0W*>vCVzrLw7BkLd2vUch`th zOyaMzP}(}+@u$sG?Wo(a*XDw8y6Wh&eby*vZhbyp1Ff1?@28R76YR3}V)84kO`p3h zN35hj^D@e1uF7h6EjT8yD?QE4xqRT1L&j?(EE`^E_v1jD$STF!QlsaTN)bO#mD~36 zM(X9@>F&Dv1Mm0)P0D|wd6^&^&+?y5kmhJWEG1YoyInMEAGq@moUI)aqJnGkmf5^N z4qk~Wm@a3XW(S3QzLc_-%BtEaB_jVkL~RYq8L`y|CWQ8ss&rpd)5@BD+ld<&CQgd`r)vM z_xoYj!&lnxB;?=GJCJE*<_5vloMiQKP6kVEt|k+XHco!VK{nikz1=;3uWoh(TFmZL zzj#CEx1+ipZc_(1T5()otxRvt-?2CURULsaC3|v^8!;o30j6c!Acc=c&p1)%GUoLH zQM&Hhlz%hYT^=RSUxoyuP@FQ+8~3yJUwZSmaL`iE&2w>3J^e-4-PZ>|0(mx!>GHj# z-byJgXfklTVEhzNz@fndco^Ss#U=A&-Rdvds4d&aEG?DqJ~lp%Zy#K09BMxN7g?&M zJO4$Ngu#z7JLlAaEq7Ax#f3a4?NdFK>faqQ&(c}S`p46hpR*r%#Vx9^*}(>Xo3&jy z*AYJ-O5nfC5kQ`W&?yJmBLa8o05<)vq*$BN^JIN(Ks;}i3Lb#kBzl{2E3Gc4r{;@9 zviGw_Hpv}6e)t4*iVf)jMx9_D$ja;r3{85er-totQAw~n0^b*0;%#w|61{7?g3|$m zf8L+hh0G^P-d84h=9!>pXoIKr1d$B;W?8nodZbA0H^2X@vptNxiFSX|nJKhY&`mQDQNupcL*vArvzlf<^;Z zR62#^9yp)|HIKSE%hAkVNj=~4r>W&M%iwnySNOk~Hxr_!u>P#b>2!Y4b^PBnyG&>L z-@v4cbb8mU<;atHBBdyfd^RK~j_M#UGV!jHTnTr{09E#H1kO8({+}1X6Z`6|K>1D{ zv8~XD^Bxvc=tDx{hw3C5mFk8vrC%b3@fr;(9DF`~Iq4bU3JbV{`J@j>%#^!o8rM8I z#@z}BCY9@G30=Ym?#)WG_fdvw+gnA>v24^@&z0fnSBO8m@Hd&!Dok46qtEUO*CH?P zFffq#pJDHY-t2|y$iCm;0%V%Qf$HXf9-F8qS|7DS02dcFjcd-CT!L_w|xovv%5oy+)TJBE>^BSmXAPoCq+^`j-t9|0Vt}AuFwcg{Bmr4OoGnvDg$CCrul0upfFPSqzvR z;)9kmffc>*E)g?2?B0f8Xnc4DRY!1O?4fClk$H`h zE)iAAJ8Rk`^^44T*};+3&OxrQvi0x-Q@fS)e=5(pCTPPQyZwkKMfGa;l#2~EzbN;3 zw1`WCT#POuL~TJ_IFB~GG%Y5-chB=qJKI~&Yz@((R`<=*Q;#9EIwwIl|(+vbK+86J?3p@QI_bf}{ zK{g(J$1QJi@NU6x3l4}z!e9zzyIE-;N?p4=s8a0vAM~e7b^df_yYuSNBfKZc)B;N! z4=)z+(Hqk3-Pl0@EXe(38D1H0%7j_@+Gc6oq{FMzsidGz`Uc85!=bA_{>$Rx$KFft z&_LXdE*b%n%n})%ONfbaVmjlWmA0U`5k$5U-BEyz-DZKtOx;9wP}JWe$wRL3;9H4J~{zh zQ|w7r>7!R-3~w7Y^9{Jw_UFHtBLnmSUT*~KmZf{6=*UAPz#;Joxs{`@=f2Ii=M!7P z>5?ONwf(~5`yV-}6Z}7}zA_-He*1c6=a$JBOK<=ehU!zxUoR=lj{`_uG5zwbtGzs6Tp_mHcv`DZmRQC@%OorPG6o*aR&s z7^w!|79F6%9{Fp8d)+}FxFrSTWmSAZMdN;Ur~lp`_7Om#ioST*rTS=Oa6|%*#aE)OP zo$hS;Pofx5Bq4#K0ufc=VgM!JFQ`K50Qmb7QA^8<&ZHbYyc|?~L@0S3qa;W>+?|(U zG1Ci?MkOxbj3r-buuNEc?zz1OGBlsIJIp;jpKf;t%Vx3A%mIv1JS|L=%Z}n zA}VTS7F|KR>`i9VT>0k=p1<=4^??)0eD}M#y~)>bD7ZrbrZc zQO`~lfyqU`5MI&`mLl&K@|gbPmcaMex!)g(pwu9L{)4dLms%JSZn;<4$`>U4qIq1Y zU%1HYN9G|m2fly#YOX`WQL!{wcPJSYVuv)JF$f%d=cYCjKR&mj4`y+z9LhOgpBRW< z#_}hB4OC0HtAI5Rz25L$+2D)MfqZydBitQbqkabW%fctvn^2=d_kX%BF(LSY`Q;ua z)D~)hn*23V5);L)3<0F-#Qwx_(eze`1SVZ|h&jTB_W70ezJc`iA`_okFc_CLkTTKm zB|b9rfE^nt7L15)aW)ma%F^Y*o^Zm`a!6kHX5q20D+w;C|2h4}I@gl%0%ANxPjLS% zEYZP;FZh_fT0QUkUx%RY8Q`yA+-+J|ZeBA^AR{Q2b3Sbqeik~=5PKs~k-KEXC70lY z5g7t1e2=*72%hFiFZW=sxwOHwyjWhb!)w(0@+q>_X4jmB6?cqm!*!IcRr$@@g)M7S zy_w>h0{0}=5vl!9nFO5Uj%rN0=e=I$c|CZtOOPh}{^>vOeoDV1g!M@G+z9q>;=>IX zvFkA|$bt?qUu8k%t3W@Q&W3xh+IEcmnA4sVX6X{W-mYU5-#7V(9K@LVuqZ|*K}}Av zq`9!6tAe*`$V3tb>`mVAdk`2lITll%*jXmr|8A?O-5^NE^{bmLL8E7;fdNNJhl^G< zZ_wLrd&@*gd{p{WeU81WfZNTuBg9_~XSCqIK>POoT5mZ&aQ1U8kQ} z)f*;&edaskSB?3;L5%!01nY;3#o~ieF7R~pf1dVC(L9?0aWHcuxc5kafm1Kg=0ev# zZaI+I5R+h|O11xP>y3z?yRa3ZKox1`Y;NY|5zltMM^@gr7{95lUyy%On+etw7*$6? z7sTh`MJB&xF?m{QrR^*kr0=}ugKIh$w8_rKtQn^UYe+QLsMqW5xe@A0xZVE)mT&2YD_?f~FB3j)No@o-a{(a=d|{}n)VA!`&X{l)L?sLs|&kzOBL z$0x7l$L6e1;LlOy)sZlTgS(?TB1b1KwJ^dl;@gYggr6A*t*cM713&!84RngpuNgaq zC*g?XW+I|dfvZe1}xowD7 zlS|8pEr8s)U`bh|6{(3-5|t(n+`nXE+q%$CyM^C4mE;mx1Osid4BpiXh#u-y+L0XXVGvyJ<|KHwGfBnSZ}{9;7iaLA8NJPxI5iymay$a=2IED zdp5=BN6gEJCP)yf_7dm*&HE7mkVEHtIWS-=KUJ4tKzj{A_-D|n3o_OypVaLvu6-<~S%6Q> z^&Q>fIlicTW;?9~h8WjQl!vIA%m;yq9jZz^(1Vdb=HMQHKeMX+iGNz zGxi=_NOApm;}am247ph63xvV>NIA^Dv~Js29lR8;16`s@{qErv(*HTv0E~=W6JxYG z#(g|g4_D4@6YD7|JA`{-A!Tn;j66Lbbpx+9i0kb!Dh@nG#DE~;3~M?yxC+BZ8g5c7 zZ`e91Y1$WW_$7XgIn|rPi0MrHffyoAVq$8IH4z)vx6S(-+z?kh#N|OiaPNlpi)Oaz zsogza4#*gv!!Fp3lC}SY9T+N5DjgM-+=A*`CDmpHG#lE!>Q}$!lMh$8)_G@gy!jSHSKEn&n;docGAT^+E;a=3H)F`OvQV zO$@TBexk(ukWuxqG_4NuYv5Yted*eSshKr z*?fj#R{aBaMh{l7OJt21)n-?ZpoqGeyhbLc&64?!u61FuS?5d@>Iz~^=w%N;1H2&j zP#D28J#ExO>ku;l44$Cs)dDr<-|nsR!OvN}?iQlmA_2Cg?~@%+bUFIG#dC&gq?J`= zcjgMbhfTLv;xjgKTpBuC52^v-&w7sWOYGT?RGK;NAl)W|Bmi{s@S-4GMe6^?*|d^j zMs9u2xdm8W7o#)2N`DVE;5JlM|Boz!l$o( zr2&prx-}y3t=eje`Wx}@z)+*j?PC<0K|!0GU3(yvXe8R3G9) zHkyKIcG$Qk0vaIMlfF2wjP6T$Mm4S+D)4=b1eU}^wT=_`#%dPGqdJy79y2WP>>eG4 zpJF45$kKOz?91>ZwfZ)!8)qTmNV|~7@E<^O1!Lbq9Pgs;@$**s5bDGN949{`BJ~}-6B^^pQRR1@+}%oL+Es?=hdYcqyKeO!!Dvbav#9ede+U4>Ud|t%01^uarcKSL3zg%lVZY*P z+p9U9+e2YL?~54>7+tyFT3!yvsbz##7=}(jmbQmoNKBH-TLw=g#$T zX%e=hLc&nzxm+scHew$1G~acxn3VY;)*A-r$W*oVM?@^Ly1We8=F$lgMP~&mkXL(C5~js`;QLfJC!7j91Fvw|g++wg)hRoZ zl}~pn_>)y=^n@uR6@lq*cwFcJ7S?TXPLLC!RDFBzvu*nJTlc)473a@?629*f!Mbi5 zoE>Zl^4dfOyovez)bK-5zoT|*GERinAZ6!#H>^oBEGPcMffkn}%FNnayp{ZizS#`2 z-^38CmPMv^YhH4A26K%}YkAR%Sbz2agJD&$6xe#Ctj4z&UWQx$m;f+q<@Xz>+agB4z&_aN*tA zKvw?l+FCK1rpDDO5!9yDNh6WoLmE3mifi1jj9ZT$w_JWtM3z8XbgS|b!ZDgn(VemV zfDFBnGU>7N$3A}>*N)sNXEQQ*WYh=;<@4u# zcQFyPX4qfbO`_n;%pK~uov|hn86O`n9*&ha`VO!pezdqhc5OWi**wr^-a__XdYWA+ zWqp6`E4S3#VgF%5x^`=A-H-D2)Oc~PUh(#d+icVMgn<{;h8%z7IFbyDYj)ON9&~o-uR|FS~Ja>rIrURr|;4_QF>d0X*#KGF{QO0|w^iYqCW#IW4NN6};mDP3P00 z8n3hciZ`g6&f2Hu%?&4ke$?Ea#%i7$Ddl#NnR}Z;Aqy{%cSI$?c6GY!oo6PYKpsqi zCJ!2=fA`n%6y}Um}i52m|jg3BiajDBuZA z(30u%0)A}U6E?-GlQ|mG>h=OK_5|gPe>gC;+NuaYYX9#FP(Ywrd&na&8cHp5s#DtnZ6uIfHLsZ5#(pT zQ-P-cL?z&P|C)F1qR6S{%}qY_D3O zpMqp7@^JD?Bf z((2a@T}A+(s=k3eanj8T zSA3B(UghVY!W#+W?$!74`O2J}ukp2uw7Cln-0@ML1<@ulrD(gqdJUk`XUm8IP#?kk za*=BGc+fqxfn6p=QKGEl9=~8e-|=-ei3c0IuQ#a&9*s1NGgy9>pL+dP{vJkZ1(#VK_6G~Lr7{Vy zASTOGIv#s4Fy$ykWR491Z=aal-E_Q*ejun*!2#-N8@jkS`h3=!_5%3rLW%FQk!EQ}C2ifNQ%^#7!L1l$* zUZ#Dtu%Q>n)b5{a6u;42T-{d2ABkf%lZI(J-1h*&G9&I~3F23b`*y};#f|`-KW$nev(H}My%^w3Zpxl|c#-rg}>$9W1(X;Oe`OU)U^Rihb2-De}w{svqb@%z6 zw=C6eD-}e8OfTk+j>VF8+$?YX5v{`e`kXU2CLLq2#hzZDlcW9lU8W>BXcKdGc7J}s zzVrEy`BkU0g|rCrtH)jm5y?LmZgoLdqb#_d+=U@_JMpi^0$*K__16KAZ#xj1sxUmn z5fXeqda4W)dWQ6i&>uzRo#$2<9SKw|yd8`?@#k{FQP*V&Z(={T)}tc)aaoA%ZJF{% zE23mja>54tUIH7LMBwQpM{Zj?z{8gY*=~$;b(r=Rs2a=1mqdaN*z8KbX-LbbTA$Ry zs>WLJYXwoGB12a?2mTn+R?TMoFX?2y*o;^Vky;aZxz_`vLU9?nVZfCq&L^hBWZ03C zK5ct=mF+P=b@yAT`Q!4*%uC=ho7#tTtds{9U!xs0-(k0>%v-)@QD7w9A`IDwMyhQ5 z=`9<&>-M!`0Cohao_cn~p0qXw#m+p#eOioI7T@P|Y1EvyHRs9328dE1TU?BuU$VE5 zIIVrS1}UPw2(?Tv57%hROygF+-3q~>qHUnKx127{GsZ!u&lhz$R|~D0$(AK9IMmU3P%92N+R+PXP4^R?`3akJPwE(H!5; z8410~bX?>DsHY!P&jFevuIhaS6RC5M8V`;ffwDgUiBU|l@mzeDtZVlyL_koU3&&CK z#=Hp@MT_$=hUaVNg##re9H@^Vf1IXV*)@kud(Z`{Hd68DYe6u~o9L-0qzC;_!I#bN zaX)~ZU&y9^3G3P9Qe_UikuqXbjv0`OAM>3sntCpBipixILWd!wTaA>64m%UUzE8U@ zjr?#*y3Hj%m{j$YyFUI|u=6*kxjsApu2>}i zzc;S99f}yfJwqG5okUZ;J#PE6;_Y8V6L7IHkQPumo`HPYl8)u(6eo9IJ@~XdGtFtN zw%tgsWXr`9wF^g^oP~xX&f-Fk2z+1XcYC`@{lt8OA0E2HyMNpla|HFz#wb#VeXiE35R@64r4O{dp2RCI9xfUZH? z8u7PowcUDNojX=OR!1&;fZ8ULmt}$jn+Zk^?-Esl;)?Q#-@#aP>=N2oT&nxt;h(O3 zjSdOH)fm55u7HBCF;GOzh|!h!qj*l`?l;E>0wJ#$|E9$eybYkgjWUQ0V*AmQ2jgKZ zh4HY1AI_3wg;cjjr`wb1nw{^c&h@z$4IEM@Dz_i)g899I=sVkDIdF|Py-=bFn9!aJAkBN>YDq{UF|3_~V5drO6!>I4qN1wz zL98%H-N8;-G{*e%R$ZI~hUX1x-Z-=c(P7{1jEY`+8lNWdA=t2`MOabeKeC}hWgsy{ zJ*1w;FE)qA@iN*QCv!XOnuW^|%FjD{r%^xK0F^z(7&(~H<#I^ZZT00`KY+v1ciqM1 zh*fB0MGVZio@BRIvhQS(i^y=h9`I7{>~BEG1w{-%0%o5=*)Q3aMj)^Abr}Nae8PpE0`#wYO-7cN3ef0OYhLizFm4d3D z@nBKPfHR|-Omuvw~yHYsS|jEd7UETh4a+%i`&up{2LlNCas?+k|Z$g}#)%Abx`~V)#7C z(DrkYLypgQ;9Z5>(qgsZ=OA8e_w%5kn#sfaB>6<-gmj#v3$8Y+ppwD?#{v{(*-)%# zg_wSNx^8#dyy*fPd_pmMh$e1XcGEMuk48$P0OeIyx>#KF9(*yT*5C{geAFGWhs_2Y zz+b}4@CnMlodFOROjTp$JFp-{yr>S~k>}SNhH|XAZr!baya0eHPn;Zr#ANrEzL%Pc z7)w5g#8-|@I!S2(w2k`Dz1^1L-@r=+KmQ@g%SPrgWvA;j^aC&l_ZboF=1g85*e0GQ z`HR&ta!moDbsX>xGkl9#t0ym^l>n}@L&Zm7C+=@ts5Wia8&)V;2Ob|PXSAHDsdC&; zFNYba^4tkf#r{ld%({onV%Q{}W;CNdX}nG+**C{kYr-9YSs#z1y%3B=3XEL57J=(@ z^*-1bap6++v^z1h9|>Van>8ty0H z+pBEtuvvqid*HvnQ{}uXVv}XsMW-(pT*C_>{YfM55FUh@@3H3fzw9dVOiGpC=(k~` zX6dL-7fj7KSqCPOKewxNr5Z$<-mVo<%XOAJdasx{hyZ!}{y^tn)azZoBu;S;Iw~Hs z`42u{ggnV)UuAz+G%)|7MhVdA2YpKd#9;9FfSvpHIx9i|wy()rz1`v>yi)m4rQr*z z(bkTY+!hW+xZ_$9Vn-Vnwu&O6`<;;*jPGmAr`%7#Zf{P1<(%H0pgpAh)y(`-N!ex1 zp;!;eY)(?c4*G5lJ$plZH)K2TtBJ@#Vx1|RILjI0nTL`1%`rw&66%>;d8+p=6# zv@QsJ`g29(=g0}I{LL@L$&8}31sIgN09nR^uuLc~C>g4ImNV&F_!H%$3ftR__i7`+ zgrHS%M!8iu@n7xwKN6N=e5C7_;jBhuB-$$#jJ#vKd@5Reg>4b22r^Yd{s?P{MzK=bif5h-CAXh%T6*wD9- zits-)+uO{SF{byI`JZ=l@1v?gz?Ig&6t3CY`O3A8?sOVeRg$IO2Aw)VE+SkGESA;oBp&zSY{LRoyBz8pa(if3CT9O@=3zpYXbysUrX zLz$0hy)KT}#H!gM+sFNlhRPIVM|Sn7fJFqUT8c8&9CT*!#_ov|(gUyeJRA`n|Iy-m zg`RKxezDy|Bk25#Vxwmi6UpW7+?`m%j$g)6>rEqusSdKBV5o|&u1!^vt3!}Qi5avM z8E@{3rWN73e-#g|EUw(3MdhCeU}|0f4~#v->qdS_w0SQsI6*lNBdXI&!P z2klFsNyAb_%8?7ph%L9Fp;Q3jwAeEti*9@c3ro+&;v1YoB<|5lko!Z z2g85aN&l?_w8(f|&9)hE#s(*#9RaBZdLHZfa;an4)YX?>v45|W9*dfQ1iB~_pb(%) zul>Nx-TZ3eTC8`e`P|2VjXjFcMSlJ03>rbk2s<4j43~*yZM65kZ+K4Bea&%}(*d?e z5s{*`xZ7kfQKaVyKBg?a#Q;=gg!d|vfHFX54)Fz4PlnT&nGz1YG!6sDFiX24g^2qz!6(`;`KAZ}?nD|AL}1lx(qhtb9W`Ser-KNI=~r|G*!#5fkn z;-E5QdlVJ53K-H^dVubRgi>b(uJX6|MF`jm2Fbj~CZO-7XC{tP;v;~{l48w7Zo|sj|o&p!4muL}Ie1JmZq67RR^&6osBVG$E+Q zW#tSbofA-3z*Wx0>auX*;#Cq=>eRyjR?4je)@r4jpU}F8!#w@$ITkZj?iHiUEsi4G zwC+v{Ye37uKJ{yZ$&)D-MRk-K52?3_sQzxB{ko>*dw%ZTyNzu-uwdftS@&E zYvjYFY6C**V0wfH4f)J(JbN8~@mbC+e%lKAf$^)uliVrfs}L~;#qrEaZGjt#hf+$9Gxd|8QNYJBYq=>DHz~N1|#e6MT;V+u@ z9}$M=$H$8a_cOXt_N*8ZKdExLS>yYn6p0<`n7`I*EAH1nGG?Rng+!ok zSU*m-V9!~A%C?$bl*aV;Ipl8|^Itdg1oer_AR|lFqj#Y*=77sq{qX^TEv8YWL7C5@ z>}4%OwjQ#qVK8flLTqCq-Q>59#$WbFg*=3&HHdUYPGZi6vKqX9ehjPF3PAhh& zQ&za2>;oLATC4eyo0n2cvj`LytTjI|9&g?^M_s*(0HX`Ujr-1v@2`<{NcP_OfX}6@ zhBCnC$AMTUU<1qMEi0bOU2>c{6 z3kFQ!E#o4>=|7ln>Vj|Id~98psEarbi>}c%gzRCLM*#F!%+eezqdbBHuR3MwHmpQ& z`9Z2|{3@vOg$7`m))z18JU8RV6}2MsM)0qjjvLtHxbFSG*3;MZU67;z5+Nu9Bm&Qw z1?&|#1y!Fwh()bg_aL5&`)toaj}ZK9D!{}9TV{X6qOC&s%I}eY`!|xKli=xL#gu3R zsuLG{D!S)6X~IW+;&54>7|=4UKwbp?u0CG!T%i!sS$>FG>|xZW6(5p2tt@T%f(SBC|-2otS*cx=mD4D2s2O z>Y(6h{8-G+&{0RL&)K^peTXJMgI2DPSd8?N09zLYg<$=i$Y*U(RgojWKJI^+)6o6% z9qRDOu?{}*k`4Km`l!Pv$03+zXnp}DR z#z@#_w-iu+p^~cenOE9DHaR`kjtn*7e#;PnGfw~ z)Uegir%4`U;!klRgM9}`fMi0>=_rFrvf3t1`8u=iU$PijBzQ(hRV(PbRlwX6vyHv) z(b2;)zR8E{q55Q(s+ksF{U*AXt9HHvrCqNrH^_b-c8?Px>TrUm$rA)tyZlMiq8tHx z9^reQiUzCp7Kl;9dp?fL->gc(kH1XNr!X0m&4G1p1b29d+f>Ai`Em%YeFOJBY_Y>n zS##tQ`F@V_uJv?Ytvi`plA0uk#EcM%&nz)@t z#muk#=Y}sZ+TB`ya>pscvhwl(Kbal|d|^d7V%K6wAA~tzv+5*>vpQ9q0n{+x_o=tnU(=+_k+1B5(N_$q`wCn$ z(NE>I#PEVna}U=)yBg`Qdu>D>PO(Az$%0Hdi%5V)6~;*LVrfxwbCZ=);&+F|UWDOz z$j~vQ6mpeEM)@+gj{sidwYIbYf*vPKU{vEP>h{?@aZw1eA&I z78kTCidyzRJ`UuR?O5tw=J6VzRb=UOJQSkIG4QVU~kkH2b<%dRm+A%CE5`~&u zYMCI94~5AzZ!8okldiR_akUukCH}_UkFm0v`}Fh(Wi#h|KKs)=ClAB#N;!=3By8EI zp^VOVyVPV=^ll#`l_aneGyR+vVYlLxRI&cPxpLc?GeOyBTH?=wsJp_S(E$?ZuuV9(~D%r$eVyznu%7M@W z%+xO^z6xo@!}_IfutRuLT$}1mc6w4U;~u11mI)NtIb6<`#XVqY+~SAW{$`g*X1D_9 zN7HNHnc{zg5}sDagq~UdI`q($p~V3_SxM#P01|Vb?8~9{Lo&@<-}KIlwcQPCytTQS z%ScUiF>x_-u@cbTDPmO!Y>$8){%-WPRRm+=NZ1j;gft&J1Czw`n^$YG;i&zRmrl4w z-mXqzc@Q6w1K^wupx64AXX@s&7aT=NA-Zl(}Bi$YLxa=n7-x{~sqgu!R z;n(H2e%bo~LhSUHbfCAoHv|x~NcZo>K|s$Eat|922oQM2gzKiC(^Wj`;q{f-kpL)Ar+N^f!9Y!Ucq;={~B6!e^}F6l}bs^@l|ARihCM)DH|TFj>Y8Sx=-hk+=+sy1g9S~Cr z*!P9jjzb5yu#`B2N6m5Gz*y12dI-i@MTstKtoO?XJb5c9->R_GlsREx>_{tkIh zBR-Pn>j@&$33ltqIp7f7M6v`80*yK*FFs|h;8Iij=;YLC| zXWiw|t0Oz-(d$9=qnc5rS4kNt9aQu2DV7l8eE#XZSWxp`-05}kz%fq(TtvE&%y})M z5Q$o$Q9mx?Db<>;2=;gdqGHeZ%E=Y~>GlOB%~O6-G**3qZ` zWFjkD{>(myXg6bqB@UlW*pi2Srjb|Di6e|f#pk<3OPlVR_-}qfed0ysA znTo7>)457(=a+2IE)tIBUK7{8b=pBJgB*vHB-O-g8cB^w4{F~yt4SSqVgvUu1;sKH z@>oGXD&Ar%B^f0;^dQZo0@RQRVjN`R@MnbY_^=}rq{+3vvwUak{pgh#Y0PUSxg1YM zU(OVj%a61B@-s6>8Zoo$0(BQ~zLIRaP%@o#eIf0B&O-f9*GeGPD%=7qFTi(@0S|HPETvw+dTHJv|qR5wTM>hV4Z&54`u1?prJF}v6s)VC^of-+ikJ!Lb} zg*iU&`H)Ad+tfWDWL~{FrNbncRtuA0|6C1b*L~`mIa8=ee{w}E(-EH9;YwTC%dbOp znPjD@ENc%ZX&+7%1FK&^6V-(10JlY|{{uy3lKGvpvIxVm(HQ{GnNd(iYjFKS4>aXn ziVQ6(6a&w%u^DjLWh0w4*ioVi3HwTnf}FVfZ~HEU%B7gy z(xpjCY6eP!?E$AyLzK-JU7-{6%8o7|uYeGDls`K0YJ|1*FWrT|lgcz0la~C904J$H^dBGk2R^Foc zut?C(RpgwpNLI(q{wB|YV?z1cDrKz+yYn=qjKgP1#K%J6mmxexX^fn&F(=;S6$Rz# zqBH3bF!`BEKPf|xe~-f4k;yEm{yo38DjXJ;g2Og|!We}5OQ+kVi~y^q%7)@0jj>(g zXlkq0Ht9D;PSzF8XmI>P2S3m~#?w)m=#geMR|5PynvIt0Y(BoGpuiY zAK#Is7o^zu6!O`c$t`F!?QEj-=?}Nx$X;Xc@S<&ahKs;tkSleg-jciWQ1Rl*#Ej2w z(Z5{xsEpE#yy^V_^DPu|S(fI60{EaG#)vs1+ z@T~4Dhu|sk!Se9wJDS6hIKfXCaXq1Hu_K{NtD9s>Y9W;$6RMB5tUCK%vS(h|aP-vk zlH~X7omfgRjValc02HN5q*1gLK1-j^T&5{PV&;=ECb@<2;R}>2G~a8RjY>C*=>z!K zm)zKInjMlCj`SBcH6js8&;h~Qq?QYvISCB%$nFaPyld{-A9_V>$|InUVRcI9xvJUx zolII_!bdI94jwy{$WfMpIBekQR^`CU`c5`R1`2|7{%7gRS7fde)ZYxQ*;Ia+!S|l+ z-BOVld?BTBM8-JqX-|GJO&lXYdkg`Njep} zM0k)I4q>*S3Z3D>f?>Q&S#5*f_~66**N?f}cW%Qu;EbATp3N(kUhuDTNbuQ$rG0VG zSQh@LTePk~Kk3yu1C#R4GC?0F^ZD&UGo)o=-`;?y;`7jb>K^j`u+shUiQ1&2L6D_g z+6IF*9fsU9p|r@@AqjnnX}_f>dBbdoElaeE0pwQ^T5~`?5~LAZO8Hf^&A1o;HAaC; z0T`_}9y!jo$F~ZejTszYLepd*U}N|+FD%|JrlnJBGi$fd6zA1l>N~^Vwk`H5+xFMJ zWTUQ>IR&6@25)5^S)_%kQ148WO=ME9Zf7LzV_VR>FtOP(mkOC*A1vDAJG4t>4XxFH z1LPoLW-S_7M_fSRw>cJq<9Tt%H-2tG{E2{zxv4VOpRYH-4#emg>c)e~hr5#KQ;po2 zE+$ee3NBkCRMaM}@2keXr_fb%@)QJ=mnZQ`y0ZW@f88V#p1>)CK8!{CUpjyEQ(Sg@ zqm(R|@B*$hfZhMOJ73tUc2A26_}z{dKe&+iXFZ{ZfS~ljEtKL7$AgjBd$F?tPgvf6 z^2^(_q%{Vf6|vjjqiLGqHp<%LQ}_*KS5k!UKXJyru8oT?ibc21gpa8yi`ErN>U_&t zPElt(-{3bDtCnN~2|h5W1~jvg{QeQ&ylcA*62us_?`Hawdp-1D&jc z{peo2Pjyrbko7`Qd0HJ`A5VVq-06n9xm`O<-+-qem_=5MrSXv-P^&yqP;} zl8aW}(4b@&_~et;JCrVy7|9bD`SRnJZ+`= zA)E4zQk3UoN$=JL;c6kjjjS%!8X7QQ)wWzWvc&)nzFyft05<#4vbsWphfMQWlZk;Hfi#PUF2Kv~9HiUu_-&zv6T#QC*-#MaCl5)bYZDN!u1;bc z=(Lc7`_`uHrs;^1j$P5^>mA=_v>@UXu~9``vA&x|G+gut`zI&pp8eUyyY1KKVrC|J zwN9*=LM0+Xg^pbb`!r)wW?m<=Z60`-&w@9j9G>du?QS#!z#ZcOJZVZMR-SzQLynGj zmC`6YAD26x+``z29FtrwR%;%i@YZtsIQ*{0c8^#MbI#$>j+=|u)rp)dJ@tfcUp7R( zj(uIF<;l}<@%0S8p0H|LdQE{8{5#CbhtnoxUycC%_v3j=rxE=5Q#Ag4HiCz&T>#kk zYXNVJ)C=BB9V{Brg3=8G$V?qq^gsYh(Fcv6{j^uJjE@dkXqvhFpAsQU3xCL4a?k)@-oa-T z7iIHkftPYne^5e4`|$*QEFta#lF)Dt1ot;$$#$UQXFf)Oe-=|W`#S_{D1J8(Kp&b= zDhPNQsFR_Nsy5^_^Z*BN&JQ=NxcVC}z*U#9-=(kuqQzavM)bPjDztvg0(FB=5+It@ zkB-S2!YyVH;OOi#f(==tMdmA=nWUq$TOflI*|`WQ)O>7B6n+^mL;VtR$wi@ib@zsr zlyd2X=Q-SO*D9yr0DD&E%S!+lPl|nuOTY zl!}Nv;M4*+>jj3`0mJ;)apu9XG)DyOtp;%qFg%j#8qX0x_kXW1X&~wN)$9ZBhnES()&_AlU9dogmK9Ox%)w;wjm+PpijuBcuWU48BUX;CnZ1lkaST2000DhxZ#{Q$~V zipXm&Uafw+LxUz0j&a-K6L22SzFWlg+?!~4!IGq9SN&c4aZVpoHk=jL$G~FwgWd9n zA&A0L+Hn4>ux#031IF??PNJGls^n?|yjW&lc`TfJ1yq^i8WQn3VY1!K>Xj^dybhFZ zCrV31#v8H>(hEaU$wSQ(KbmYI+#l^oiLa=*ixX;Sn@{~3o0f<~@M-QwT%si%w-v!K z&=vA{ZS+7C1|dQn1-Q2UsbM1s4z^1n*q)|LT`BGv+W9p^f?^$JAKug6cODp9{oIye{=-eWTGoaM+YDsJ zP*oE7xw$Y@@(2-%FDvrbDLF4j1(1!e))3v+y*96S@Le4&A|I8TzOg$-8un1Hz1S10 z!Mt20GbAYmz}>aQ7VC9UF_BFd8d8Ds@P|W}ZAulzfR4w$B8x5+o89?RVNm2yO>@0DSscC-HRM59%-UNA>UJ;4G2fwInmm?r z)%4}ti;{nZIokObZB+0AM}CYIKLdGx2+Q!(7&&4LU8cVaq5qh^I5J!K7?5;zQRu$P)%KCu+x zzE`T-6Y9}SS9MGx0M&jlIWPr)c*%QFyF2uHF-3m@2DOFN3GYn+pMH!THSOc}JRA#0 zS1o0~iaR-{HNF^a>}3#*srFKzCWJ+Y!N~+s4chDuTlvFZA~b2fgEeA>Iapr=CA3$i0V#gplS~~8$`Mhr$tWN0`D#~Eqpo@=0Ius z7YwavqBu0@md)oHz4;hBV0Avn4156f+8Zn|UP3loL7Ti&;s(qre8@et@9|m7lXdNY z^98~^9ni8&Q#4ctgUX-xo?gZ9la^;=U;~)`Nvy0rx0n0PpOe3QZe<{^i!fKU@{98v z&RVqJ%!#F_7bx|^x=+`Jffx{gD%O(5X-`+gcjIM24h81+mpn^0c!j-xhK2!!} zQ}CAqzUFvna*c_23_|AYX}Qt4`_upVF<$RQ3>X$}p6m52>cDe}<3kg_R62>LBV?7CPW!_sP+nvO}M-(jD{76_KMA=q1SvRysxrks72{ z`qTcV_xg<_667b9KrUd;>|*ZsrxwFP%qRVKJ>)(f-GvHHNfFn=zI>>ny9(LYUozNU zHqV7C<(@XZIx-)6hb zW@wv#_%fK~B?m?39V3eLh2}d{wqE(Se2v?BB+PIL6&%A1Zw-w)f>mV+|MEZ04JC{S z&JR$eDuNk?y^XDz)MAanwHhYPv@)LV+I7GL{#@2GvNmID|LK)QknH&; zb-26giOshnER2V^ig3`&ua2TBsUYLim&sa}{PJ=6Y)OQ(ClOl*8%y!c(E`=GD`w&3 zks6G_CUtobHM16hPAj}%U3id2EfN~sLF}T#sUfUN$wc725IfK5GpmaU<2R^|MD97x z7KSz!>c8N=5&f;1poQsz-=oRuR?{`DupmTI|e9IXhEzVfPdNj%Tyo zFEpl4QD#bo^ne{<%5jF`MgKX@xG3bkGd7kNy0F%J>$T1t&5f^Sam={tINy#hF6oQX z;Q47As4*M;uo`&S-sQ#gvegkBub5BhIXW-%A>VdOUkXyONb<$Jf6JM@|Cshvw-wa9 z#jAVgF_|g>rl;GHbcg)%A}qn#%=g_a)hcdk+7L)al7#Ni+BNu^1+`2kOZ#-2Zep#<+Qrr7~RX+yVUdIZ@RUuQ<< zfaJ7WkG<3`w>~}h%;Od5c`ZV{2qDhH!|Vh;*HvkqehJtymBMPhtKY50O$I=3h6?Zm z5RfW4)oN&j*FnPOLCDqt?Au4kFQm}jnbqE>_N_LUO~=@gl1sOM%w-p@+=Z;HQR0m7KJcLw;=tv;>1=`I5N^4b+G zuFVlm>}k1bSOGgfefGwv{B+Ywj*@a;lbs@~up#Cj-cQNzP;XHS81zCe4OuhtDmoxN zZ{{f;ZS)r5EGMgQaKGMv;WL8H4UEBG5Y1T#kYkU$a%9wa{LV#3BJIp}N4(JV1v*@FfJ)?XQaY)Rr|_olMgYj0R}RRiGvo3F&P>U%p+nx zE~8EcwJmhaHw6#Hk~MX%5h$%!#hB8`ebwOQLD)e}65gkHDaH{Q7XS!dKA!w}$u#rG zEYENE^vpX&MJB&hFk$|r@y^0+#hOz=A)#AS!YYBsA#aC3wgTgqV^hyS*O7uMm!G-3 z94bF3{4nASTt;wEgaf>$wWEdZGuK<>nW@GzE{JF7cY1xU_eZyMZ2N>`UDu4b>c-o1 zu2}enjW8r-z3I|t&aMJ$6G_wo3&e)PUafgtJt03Y z7xp~xzXu5!1AOnbb-pROetn`z&tBDK{$ZD_%?cqf_VQh0j-R`o%9EmltsEWuePM?U zOL+X|<-kjCsnlhUZ~NrVr78dzUrO^aZ7r$XErq>rh(75hUsfv*O}d;vHu>JBd+LjU zZv%P%h!gi1AvAYdG^?roGFOlm$U1mMaTZXvj-)?&1qQ~uQe807pn=8i39;HBF1rXkld$yKeLE^JL^`KTuKog zp2X|jp?3tqFERj_o4dmx%Z-C8Kd<)2U&prBjTB#EzHh4ZT;TXCnTukVxCqw2$RyA? zzyXS9{=8wOkdm5gyQTD^-p5U!NkJ!N-vMlBd0D(~G1TTU)%)jmOQ{_e4l-$mS*^Dp z9yv5UlS~ws-dxuC%5~ES<93*;-ECpGe=MApd{z6&$K>P|I`+B{Cw9y0Uu<={AI~&L zkG38^e4z8^=tX{+xuZF3mvPnLr~Tf%omzRF$^}qR3X^{8 zOv{tW`s6&CE9!n&Qp7K<$hmpBy(3TchGmdoVp1kJX?W5|Ta|KY9@k?#L{`}paqc%y z!`8YMjrk}du|)fGu~4qHwNRlh+H$&Q=;fer>K}4c4ih`JhQ|Ec&jaL=q9m};y<~Fu ze{oNK=HO7>B@=NPRWrqiq$Qpf?=fYpa! z7KJ?{nsxGd$sgi7%7q={gs-zRb=07Q+-s+o4l&(35cz}M9~K;1i`D};H8S&p|Z5-up7r;0A$8L@+9 z4{3qTUG;9tCj={sw=(=I{O5g#>8_>^6*nIZqCzhkiKZFCQ*lH~#Zt!nTs>Ed&d)5B z9z9DZKQ^#QTdO?omby}6(ld)=bt=DTr2V#6J8iTLDUFjf3K5d9h-eLo(u}4;lRjUM zwQQIXBVDvulZC-%lQ*e2(5_0ooR67`rciX{=*aOJ1coE*#ifCS3X=_s`-1}Vhr(2x z^3#urwudhj!Zj2+l1SBaz_*LeO9`r9CH>hht06O&NYLwL9Sg(YScQ%Vo^rGBIM2$? z9WlNe=+)jc`!XYFd;d^)Q!7rF;C6_QX{@1FIasrpMLwDuIPjirv(K=$plG%fd0L=r zovY4V+Y`Ydq>aj#>A?pM_ob=D7_(!eFBuwgVVEV#q_@5$>(oTP4ea=pzdrP^nDcb+ zs4j}9=%dE9sP;=5aAMdI?C;e1hHpq7adhitg3D+$!K#=Bpf}5SBf#)?%bu|aeEvKmz?ZE(Q>3&c)8(fY(99@LSsq-bxvs5pO$(sZF=p|UK_pq6Fkh%g zD|EhwXmJJU)qJ6!Os18Jm1CpI58Of=)x`cJdP(u3oA=7;q=i4$?L17MB4)pP))ejP zdu5mB8>CGXH25~PM=-o=_?m)NTod?I}z3?iHT&ufPt$+&*}U2@W%4NiviyE!u*RU+eT&Ek=eZh|_H zNqhu@Gm(kqo(8V2l2Sw7BZ6N3c^e$fMXQtCNPGy^8Oz5&>5a-9JBVJN4qhaW=&rn4 z@4nB_+pM+b+5L{B*6F=QPrD{zpLS zt92D58k{Q#zn=*xaotyQ?hwPHt=78^{@e!Clo=0~9g-Ulcq3O+0P#;l53<=KtUYMi zGv?6MuLG58#cQ(HoY`*%AMAhQIl1i5_hwueqXEy;TB!cD(lcg1Uu{&20`w4Z1<5mH znN_XuoPw*dG9vqXlbKIhRJLyLOKi>5x8|PwmqPI|H5%yKcr9?im_aPHW|rSN0g{ZCXV z?+iMMj_BqBo`j6S%o-7`b=+XrUa}cG_zv3NS2!$u$6j98MyR4KBYoU44!a{Vsq7s> z>Z3lp8urHvxDDi-9TvkzWnPNue?T2zTJ+`zZixCUIKZE7xjBr%@J-Mr)bOGh_{K-( zGM@U-45nc$o1b53SV{_q2ju$pq6bT@9KG&Let~94QFT21S^RhY3Fuz00djBX1v!ub z&PTP}jx;~F>ZJPc)j<2PgZsH{cIqv_kiu<&v}$|;WgD`y0w_@NxE+0?BY(doH?~2|RAN_zoH`9&%BET9#*Gw+r?G5l~)<>*CI?+Y|#KXT^0DiYAV9N5m-t?&mZFb*yB^17<->Z(iqEvQ;o4svdbTl z5=kHX*9fBf1&MJyN2CjKVy4(V4Kg(->Iyyzo)y2Fi=9;ZZQbdr6BaEd1Q#O_3tRK&yf z+nHLs3c?V?OMbMTE(>?;P5|qIls}i3->Irvt49fLANA8d?2os5{OeVqLhn}k$p>>& z+4|EqK?;Z<`GqXGDW7g1{YF=n(6o&W(B!eeNzC~wR#y|GKLH}xJ4i2Iq8t_VUHm(q z+&>5Xy(2%6qkj!n>r;dIqt%QG-hbdEwTC4LHf7)kTFb;;+E4uNOuIY-@)=tE8spkq zd>*_*w$k_mc_944{ezJ><8Wl4NKB00ekv>?qvRt^HIWN)=r1NF<9LUNCbL2|+_(Yv zZWol4mg#*ez&c{e zAq-(MTo<(9pb!7{7D?vgkd_N4-So7-K0^2z?DZNNet!PGmoLo$MDa3~CO7=}4Nv;$ z@;~j_`-g#vy)<~PN%w5tF$_A$?XJ6``Qyh!*nO|JD_!5A`$d!WXd(TG4%eo-t+fLN z>e=3h?fhb?{2ILbqbc82e1r9bTyzb~)f{Ss8Qxp~ywLi`PK#$ejUgVkz15bm_({&PM$KIT3PrA@#CcgTQ6a)~R&ichZRcB6`b zfI_i8g|iXqiUYOVW|ltT+)D6dn%^(vh*}e)i_E*CU@1nU*zHC>DiKYZJ{k5{kd|qsN zWJb$5dz|&t+5=QYJx^HV!$JBlap1c#WLpTb^HcT1wgC`5tqnK3OY|9LE&2&S<`d!o8AO=a`+P&Z6)>428 zYCkY-{w&X&;lT=;AY0)8t6b{FQ@@ysP{I6_Uac!M?6I{6F?OJAQHeT~l|k$2^2G2; zY@fO?nAT~vE278orHDxVvRmy$)RTM=&>2)9{4Js_LW6FN zr35Vmxh6vohVd^9jR>l^xLP@#E0Hf!y!zi|(mmlst_HI6XGBA@>kU0q^r4%@wqBDc z?`bGf+?yB73jF1nQY;p#n;&4@9uV!I2q-B*`?Xx@_yp8xI4OWpa@yc!DjGdCf(a&d zcEwqoHP(iz+d}azTOl|)cmt!RVaajvt=Q|PVV%W%TWUheD_R(G3iB-4XYA@seSbM*tshx1SQcB90KTiB6z#D}f+vbYYlzOMNJ`0_WILdO{7s)x4E&bYG&SgRpw zQ?5-~^#|wqAK9iyXW18CQrAD)5g8iVey09;z%>Qryw%fkiRO5mZE*WwvRuWbCWpZS zOLO%(Jh=gXV|){*JqJh>Wc_UgSbY^0V2I+cX!%6^uV1qc^i4nK(IC=+P6~^BIBrI7MV-^biP>H#?KYUMH z<8Dt^hI|nx^`l zf;$F|7}fDUQGd8!z5Fu5Vj9qtqOogDaNfY_#Y>0}&2|ERtv;Al%SKT=8HG|(KOdPIR~7bv!#brBh{e>}tj6u+ci zSr4$H%WH0P!~M-u(7-M1?e)B@w;4rYnZ!MOwH^Nx%vRoPLssZQZR_R218}qVSdGF z-HoIeMO=CK-HVg`Jtg#v%B;YyZeNoE=X^=s{FcMUE=7BerTzzj>f<7L;GG(z$a@lM zngcX_prGSb9+I=!i?HHMQ3e>GFTk2vw7xx=@f@#@N z1`SyqDFFOeKNZjPY|gw7;og_f*hj(Yia)NNjbA5&%@s|RhUj+B3A)sOW`_-rX1M`E z9Ynp5vzz!3S(#lw&AsGs^&GbG7ae;q$s=i??=;j!;Clypu)BFxasB_%0`OfO;z}Oh z%=jj-61D%iWELnHaO5P4+&92!q;Lm5*7owCSw{&u+U8xOI&ba>ks1Dzo7YO=v7I6I zFeG-xE6xPe*42eAs~@+$t!H?~)cIxcq@Sa|AY63&der`tmif%-S*K526+*WrV6ujx zwm9^-%CO0P4dyd-en|Y@y?itwu7gk~J$VuTu}Fa9Fhv01_%hfUz4uQtzIe~4>V=|= z@=z(8_Jc#lT?r9WT1Th6BKpXTw>tJW8;Mat&CR9sr&7xAZPzYEkQQ#Yo-o|iwJ*Jb z#-As4SUf(BYoOP@?$AiOqMZLAn!>x(Xy{lZ$A0rX8`mx<6w7tpq78$$(1>jeA#Lz6~Ln7(d4wi*NUA~!6G*amy1bHPou>{oxmW` z^=zP5W_Z+D-yD`Qp{!?`#=qfm7}J;*^;Qrv$A;nB!=UP5?hf;mSAloC#>bhRd8MW* zj|040I!vI4GxaSIZ1e!OnoHdd3V_i!3`P=4s`t7s}YeN_WWT`PvILkoL5OhiVka z^M6$h{GH;=JbUgZDY&BX$M1{W4=zUQgSd`n+GS*~v(a}m@7jPPoT*AOMRn}qX(E1> z2mBztLMFCVw)^m9AF{X}eLP_GE!EK|P?*VOt$?U2^BeCj!bW9UcycjsxteNRyzlb9 zMaWf=kL+fO>f-DhB0M{EeX8ya3Tm?c`vYw9MNae2zeL9>4u?4Gl%x?F3;bZM`!L%9 z2;Q53uGle96)WrL&}CLsogu8@5@3%feH$rFtY<-T{tefv&msUqhv}d}$Q?423h>>i zb7fp$(n{*Ks_HkVx~^>02jc0H^3+TJ(1+R##MZr`mY{}n-p?;3F66rty(^zVXfw8s zMLN8i>Q2-f-$+JgHu-|i=#7W&)lYw2r@ydUOcom*K_9PKkO{};=aX?E3)kZ*2Y9N3 z(r~63V)!xaKSm5Rr-mPRp|9Uysc!2I`?`vK!4SyEk!wO_5pq!7r-I}nUF$i+p*`bET zjLTK_l1mf-3bSv=T1D7=n(^FL;-~IDV6wQ#J}ci4q~3B|`|ADvl)XY0Lo%xeNvjFT zGR6gOZ9J(-mnm%$5e_Fo9Af*T`THvCyp(wySSAOzr0Ct-6L2_96r*xCINMJeKhsjMXalYG| zc2+QdrZkGAV;`0oMb%8=^}QDUc0K*E@cMfwqfG7(ue#BV+j^rV^>$Oo;})`I7it4Z zpA{avCCMjLojiZV3D=)0BDwT?4gukRlmLEVkYi`>oqgtrs{>5vvl%7Hr8jf)#k}>g zdsi1XgWfqSE94+@9hzn_M{`V|({+jZ7HaOahBZFA^_6F2o2g!W^h!Q>gBnmv3!-U` zzNAP8bi4}5*RezZ%6q<37)Q0)>c@mAT~MZ^t%u)3&vP^T{9Vz;*ZD($#2h_#t?|-mn8lqVPHh@tm2-<{ubPuh7$3&`i^t(cwj+)vHvXRYOh7ZS{Z8J~W?kuc2 zNg_i05?-gg3iW>LJha+)JJ+#odU1SW`ZEp%M;(#@sPTROA-Fou_irwX*IIQF`A zc?(OFYzH6Q471{Tb_F&;3bLSGKng%;w3QsNEYXW#2)*e&hAs>^rm?%dNux}rBY785 zgnbQb=x)K~^&O2f$_;+Bmi4C`ZNfnKoeN*jjkSq?%qNx$E7>k{cngAAZoY({Nc!OY zK)3cn!`q+rhx#6{NgorE324+-6b3>&Q7?Gh5@EFVR2Ii3cdX<}Tb=^E$cs0hJjE*y zZWcr?FTyRuK_4$oV<2qQ81J75&_ASFUv)>PGcQ~om>J&p4Ao&X>79H$&2!HMlDNjN z%$98OQB1Fu^M?5mEnUKH`m;javKl!nr1QlJvn46cJ3uizj`JiD>p?6Lo7=%HlhvIp zQV1lT+=TB&04xpQ`r&?ADn}s^uc)5ghr7s$uXE>?t(xuLg%kT<0A8tG`*A&F=N4dgfnB%)uXa~m%m)T}Ad+Ex z-^=$-4<65*z9yAn%zu+3Aw&{azpuYTIze7Ru$ve{!0HZZt?#_e~crBtIl#`7IQL{qNIU?V#Xwqj$odfe;SD(deN+Rof9nJR5z0vH;vnnhpss?=O99fBF{ohyH%e zEan&*hiearnL8FC528g$UQ;VMyH$fbG)R-mO$b?wJ8{v98+-s?p>P{@epYk-*NfV^qBOU+1IhnYv$z6YdD(O)TqU$m8y1iJ+!0tqJ7Mks zZElgPu-wme7c?KU#6HXWDPJZdIV{lX?0D2vr&x9adDLL69lR%h10+_mLpm@Ojf3&N zkbY4yYh=M)Si>5dnqSBsA(OnCLL;t2Z@Hnl95vj)K*gP;OSB4$7Atk(&4t_3o^D4N zMEdP@6i(DVJaR4b?F7*wt7*wa8sHb~V4hhb*l7p-m_Q zsYK#n(v0a%$MT#&uT5B=$Pb8-AFYUop_gfXrf*cGZ;J$(_P;cQhU>kVKc()xx3dh* zPWW!p%F#d;()uJ5zna>jCbIkT1rkr;;Rz>!T?vjjUSRVVKEKx}#;-9(?QiP`8c3m6 zC^)*gQQ7|+E*`+|jAp`7TV%L+72qsG<+?8>tE~Vc{h7NNJ{F8t^ChhAOs-8 z>6^Xf(YP{s{gW}NwjAo37$HYL00>{4L%#n7{P$Z&{=pg+z-npMI7P4hc-@WR z{(zFZbPE8!921R0Bf(B;y5zhCA~@~CDzeJq!Vt1*>96=%<)R8Etc_0@|pS1W9zkr9*ILB2z zvXhLSfrvvpev;c48r?!}m0;tgL{8WJY*+?fQ)rd;^*HLvvfa4_IRIe;qG69O1Emy8 z2c2Rl^;T`w=;G7{G6qHF)XIk@=C9hQOE4P1{>XPffAE`6_q1D76L^I%WchWC#@abK z8Pw}E+1HLe^hsNWzGl}ok7lTdWACik6V+=o1Jo&q%qtHQc9Z%E&tyJ*x{`x1UfB$h zNl$+ecF6-*zrX5n9kw4aX)W83*CN&4c2do6{*Joh4c$ZJUiq1TVxzUk-oVDidq$e5 zdMbwGhn*l>qQN-gkm4&SK-qAcD|n&M&R`hw{s&@|G~zjSFkw&Y#Df8`DE(kkjg@+k{H%Dp5G{RljwroikC?}PF zccHv>^7^Bib0(M zYUZ>##eI-XNBzJ@xC~xmMyYSggqdqt zH`ASmhN_!KgDS0TzuLu(j&khmu;Lx4B&OtH6=UOpoN}aBv8PL4ECDuj)St(33iQmr zM0>-$Zm~sV@wTn-W_nM^SL$V!)(nT1`Dve9U+{XJUcohGk3>93#Dkv&aK{=is6!hO zoqetR2^cR>DNZ&J>TC=S%qDzQ0DW%5C&;YGW$*9 zP=f2qq3kw~vtgdh+ye%dEPHIAr4z+4nLUVNIH122JljunsBjp>&64pbod)!1sk)X(TsyiLk%^z@f zG$Y)LCS^`G9y>%VUH<^!;WTc}cX;wp)D!QYotq0898s*PDt}8`!$9{{f4A3E1i{<= z9puVQMXy7Tp%O0#qb=A;rUg~uqWE^O-mKL0G8V;%_at^u~K~vea0G?MZ8uHx2&p078 zdLnl9q+ZjGa`LcrGMX`97vZ^XX}2WBOJK-GmiX9n@TJi89ntRHLg<$uMxzYCJX@7{ z#`luf_-a#<@(_m01Rt?AXRfx}xj&{uWb}0ETa0(og6%3A_VMNKWhZPO$(^*T@*X~d z`&p2A%b*#;3zT!w75XLpHU?-CCx3K-K}T6-8`A&t>;lG}sUwkvFFbiXiX=Ht2+2q9 z@>+E6S6k}lYtwaf*x;&wERc5VP@MeHut?Men^KKabCN85EhwQU@fd)A(_shr{PVs$u}6U_q;%)=IZwZ%&+28EL1F3qev8Tc5C^vy zBg1RR7ocG!cH**||78?Td19v?vqf+@;{vu$id0?J&hFDw$b=}SjK(Qu=6-VeqrZ|i z%aC^ZQa+QO5a-pA%U26iUMHvQX`2}H-_87U*qQ53gg&lA`7bopImGCJZwUhS}`31 zjEiEKhplnzg^{w*`%7l@gy&nJvB=Oj63iZ_c4{Y!@EKT|gzSyqXJ!&7CkdCD>191P z=&RrioU<>F{k+wMqhYN&gcc=gr!+14u6fTDw`(tf!xZ$r-=6pr>-QIGs+Wyc*OpT7 zcmf80ZiNfQ^5(Tsrko%TzA3kdLZK=MqkBPKfBa6_)78;wHukCYeBOXN9M-s(br^-1 z|LNE^8r5U$7hEm4ZFL46Gt~}uIeZ#40;wb87isB=!oIW(l@m83eqOnGctMvJz4nUk z(DC8Jxa%|>?&_UEO*n7rW!=;J)bL0W?m7YQET!EN#TFF#>(=m^D({h zv1KBpj)At(Rg^cHV_q)^%NFaLM<5ED*3c69V}Ip7 z>=YAB#wgc%A?(zGaffGJo`}bxrx!-ct4TlCF_&S);miic=yjjpKhR`b^lxEkkd)mu z*U(CYkY4cn-g6>U4&Goyr5Rlmgvy89XraPj$AN(T^AMC^AM_=vl2^V0RZ%flS%Ipg zJS*p_ps<7LiR=N5$t}O)(o1oQSH=~?Kbq+e+>SS{&feQF8vQkB8J7_i027my6%0H_ z#}QTZK=fy#L$tq&nVDq~1-dzO-Iw%{#GzwoM$B0?MZ}%eZO&O+#V-P&W8ABDTGu38 z{<#Voyimb^FI6B63c(~~FA>g3&O^4!J>J$ia4|0SyLSz)uf zz!!m`aJ#4>$&m?vSxP#%%$gr37rt+}exEk)D|-@S9jGJnsa#EfyEId&S^RY&f z_MRM^^!GmHDCjTF>_Z}B7MDIW)1yzry|zk@obkUis(GxKS@ zs<37^uWMd4?*?1RynO{}L=Nsg)j*O3)4z{+J2)()ayg#s*v^*m)0H)T{eT7a?*RMvwME^Pnw@nX{blnuvGo#-6Ry2!T+CPr6`MqTt{iy2Gx(#(@n z`HiF>jTQ&Mo=QtxQi{LDvRwnI_ABopIvu@gu%|TT@SHT*1y7Nm2hCA-<}s-VcAT&S zI&&twgq&@cuL+Y-u(bn74ly_7b&%)9Kwt;>bStTfQs1{G3LOT9#x5G>&y!9@g2br4 zqRx4} zk>aY4A0nb26z!38r%bZUpJJa(Vki4OkdJ&&E1?ax^Igqdka6;H`$;YghZ|@=ri5Fu35ZRW9%5IJ~{@`Q%`&YJdA-we$9?bj~jyGgsbgIBcK<`p3r^ov)_tK z(+8f0t2pBCXQX-gTcg?4WwD)<+G8**HJHr4B;kwXXW|Z4|6*;`0bS(vsKGj%c&4rY zGL(JG*ozV7^o9S3r^O2tpbxEB;iMc9D(WJ(SH33^=z5Qq1*F*DhJC z+{m{gM)*_avVu6Q8v>8o(Dor`s>shx#BVq?Xfon}d|#hG_fKcaO*3k+6V;`ZllIX+ z*OZfJrZ14%_t|dildCnU;0}PRh^>mors<<!|g2ZK`8^0R4-4;+mRWz(-MkUbG)yNohc+H`C zqsb-gsUiC8QVdbV{ehspBJ`5Uoxf#DNo4b4ry%_Nq>iP|19Of#KV+R>!)K!3ORR_1 zH*ziV`%wFVFhR-+eVR@F9L->%cz>x!aUoz7ltCLXhd??XVaUWvR04Dhx#h9#iVz-#^@~VB?EVrl{5uSVPKBhcrQKl#ZE6 zR=6yQ5+#VeJGZLU=U-B$-w3~=m=Yv^gC>#EpOAi`(n+zNvaT+u8x|Vpfh<}eE6`1} zk#@+(XzR%xISSoDrjDnEM!Wt*NA1Ig*Uo$7B@^em637T;*nT#7wD$C7f!efpix?JeLk)qLOWEc)QG~KT;$Wz zZV-(ro5PLh{Ff9J_M#-E@%2EvEB&utzH~=BxAOtcIq0=@n|2Wx)ZG(y8kL;2cZlhN zXtFkW3&yz|MRe$VjMcQv|6S(~I+Y?5w?L$L@(e3XhimQ0OaFk=5F}}t?WA0ooadVz zY_t^U`duOB5EcgJzJ*8__H`=NtEp1hlJz*Ror1-6@TzfAx+CoqwdlP65Ot`xMG{D6 zp49)LhS)Xt*%y{Tx0?t*Sftz4J?#eBr>T0jx8EOsXcQZ>5vZ$e3$ZY}7mm z+$4gaL78|KI{HgaB1WcLC{6Wo&O3KC<8_rBa-|O?LqhOFRL+1iwiEW>n}@M#E?(1*eCdA z)e29%9VMs!ON7I&*>2tF7xi+|W3qP3lVsxpU4EqstRZZ(krI^2XUe2&z^#k08LO|V zvXC8R1ktReg&0$^?t#uhp6_JJTB$}f0MZm;R|}m?Z?KblBY;4~St`G=Td$_(V6Jn} zfyuo8=+7AN=B)kcAhpnwbh4A{NADOc5)g2@hdf2#pt~?qL#N1hGOP%Iszwp93Af6J zNR6u74KLJ?Z}b${$#ijkJx^}InR{R!tha@jqC5Putw7v-3JMg%{fkq6lZenP7xLSh z9%z7GR|V{VNT0}ET?w#r7{=hhd4Jz;Yh|u{WljoR=MmSGUjP6w80u+jSTwk1r6?G^ zu=qrryc`O%MO@g8#0cNeY5`GpUiW0if7f2>;(sDP1R~Utb#;93)50Vi8;G!m9JE>) zf^rTEP57h6*U&iD>~lr_A@eN5es+-^YW+FLGn&*^_|yAvz=X#Rs%w)4V)LJ%Cc6A7 z_2Y!`5c=G&rRkh7fFP`bxMxV@#~U+P#|9{I?+G#_C2LPF<-61hcRnY1e1bCagtudc z*k!QgXV6~wpYX2v!$e;HB)eyS6n2FCV;3jSx^=uoTs@YGn(OLM%`&5G|2>Tk)DDpz z1EHDn#Hj_`nTT|Ld-c>pYRq!^mXz9^+BhLxU)dY zKnse4(h5@Of6BKYRKtR-Em6GKCxO|&1G2J4xZyGP%p7>gV(ioMY%M+4+Fk!%8AD)M z1i;Ndir5vmQ)8!Cv}gES(Qi*)H-5%tj8dwftBV>4ujctr^kmn}BZw^2+}#$kw{Acy zF7>&q34NjnwX~w!h4&WIy3QhtlF z#y5$`Ru_dV$ief!kmFyj^}omeUu-}^9xo(P?(PJDhsl%eH-LYA{NL+;7Wkh9{%3*z d&sv~{Ve2ALQSSDi;J=orr(>*LrRfm<{{S6paEbr` diff --git a/attic/programs/ios/WebODF/Resources/splash/Default-Portrait~ipad.png b/attic/programs/ios/WebODF/Resources/splash/Default-Portrait~ipad.png deleted file mode 100644 index dbfed967af6dbda81c510e41d83cc9abf4ae9626..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 51794 zcmeFY_dlH9_XUbXBqWGvL6k)AQKI+gy@aSkjM0hShbWN{y^df+?`@3U1;J>e*U@|L z4CZ=&UibbL_dCCwd7dAhAJ#s5?X}lF=cks2;tPB#d@L-i7s^T>b+E7=J^X#N_w>ob za)LMKg@uJPWGg49r7R~$ujT3tvURY+!t$PtN*J&wH6#sh+nLXbrGH*iVfH-5P$`x% zkx1aJBvRQSyUMZuV*2w8GiVY z$&=0()H}oMN>!QMeC}imyp)`z zJy;PkS=Y>xk{vkS)0cO*nmHw;jc(>;q2uUyeABI~=i}@Nx?}VLv68QGU;c2Dp8b1+ zk@jWY*p;6BB_>Djgk3V<{*nFw`;im;bFc>XnLddi|Fg_7k2;ZII_bI-7Q#o=^d9C_Rl1iSNlSgMP_grVyoI~#J2NMQe}*+Y07894Oe*kDy@?U=_&ar7#awY}eG;CQ z`SwTkP<)_ppf^xiN_!rF#b+)8gFhmye4^v0Y0w+fkTkUwXf+9o-u!AD zh}+(LCoh$+xrT*BkEQ%kM$db8Z^7`_+Kk8MC8_~4&G(kyb+|u|&%R=(c+sF*S>>%r zyl~BTTH_OMhv{mGQya9E!=sBxy64kD7F|IvrjJ5;pX}jTJ~0#E{WFm^szt&Sp$b#> zgf*2k+E*a@CEi*B?k{haF&M><`efEW;>78T4#QPJ3LkrtGiEmD{e~Jy9#ZZ9e*cHS z{~_>y2>c%c|A)Z;?-96C?eHeRTH?_!7nTSF1-O+=@NoJVqz#aP$W8w6K{?cTK3@0x z>!q9ha9wXGYEuoQL>A_uue)uWtf4&RK^q8jdwI}Tc6ZU*;>?kaURSssJ|HdauZw07&~%rw&( z&f$z1_TjQjj^Q!~b)ND}V^c}L`;A&L3iU+^$-dn);s%)V52TnR@_Yj2t7>xt90bF=PxOj} z`2o>XQ3`I;hw0Dp_HQatl0We>5|%6He&A&&JO%%g%EOYz!NQWdr&FLv*)*JYZlN$Ip@yFZ-PC%|8X1Dm6?upmv4Y8QAQ7R?ofz7vQI1ivs z>iR;i2~)`J0}(M)O2E#zPra8Qj2CfZ_Br%$anrE>4ZFCim*^)CPGRK7wJlB`<7uuh z_mUDtPPN_t^rwjz=q$KQm7LCUyRB@v95SHxL*3b-w{j}j{)RwM)pffHy?#$3f;5v`1tSJ%j+FjOw)H0S5*2Au<>YqpMbk1Je zH_SwBf((WLP)WA~1uKj5^ac}2L+g}25o>&qs|G0fKKBbKnAv^0v_-U;Aw; z*=Alb{~3J`ByW&ojKg>elw4Onm_E~3TVEsWW!pj(fLXQNTt`4m zs`a5yFdON82t;~yMTmo2!JD)RR zStY0%NjqK`ak{Se?jUSgw*vYi@F*M_x@y!bRc}DV5ZyHgox^WpF@+8^RC?#{ta?)t zdfI_UVnUiPWh5Wd`Mbtc5uHe05mz%xcd#hSR(mYT{a9UUIlQFu8@vfQgxg)VPL)bs z$yB)A{y>pqF=AmI=`yox3>z2>N!0mY%;(v7-t{B;8|;%Fat)-tnC=GR=HqAKx8`=O z02sT_EmSmk3VDKtaA7V-&bE*ki1H8wHvus;Xs~CGTC8IQlkvctnjO^XV?O+ z2@Lk=ZV$pIoz7YGZxxk0Kk`UdKOz>fUPLo~7>fVCH^y838lT};@J(KxE&6)c1Sy6J z%xdzA&dhimN}Q>NLmFJ+j5)@5e%-~~Xs+J(t+o|HWo$Q))|-=US6=L=JpO$meZ35i z>Ef@%e9rdr(p7NQEy1IH<7S}?6U<)5+Qk6KV`Jym0 z=cO)QHq5g{bk_6$%evgjVz{t(g}Y+A9}kmqP<%%4XO|;TA8gla7jJMC59OR8?qA_^ zveg1k3B|&ChJ|(e_wEe`qSQg1E3@f6-248zDDRYqG(Sa%i6USpjLZvD{|XZM79#S1 z9Y}**-gSn(t)awv)3k}MX+NZv-%W#D&2>n`IzAnky#F+nzp2#>?j{;nPr9ZEv~pTa zx$i=rh1FH#xel!b&;%37D5pw79*3@7XK3IA2e-L;u$4Lug@%g_@)|80C>h+6fj0AR z&m7ojB+Ahmb#!a5I>Ld9^cpJP68-PSxuw&vym9I9AVNNe;fr{5y$mgbSt!wy<9jqb zr0Gy-HwHZINEb)^zfu)g9$1s@UnEfHQdCp#5nyL=+JL-m*wrpFNit-Ne9J znbu<4_u_8^=IVnor_{}w9?8-C1es||b9TkuDA&a9LZB=Ouf`ME#xR%d6BV1o`(?}- z9;P?&{Lp&8N2+|njR(^?sfw8l^z+v9b*k}rNeX0`dG}26*=@kh4?_}SNj}&= z6H<}Lw<7ZJjdqDTL5hsCm484D+mS<)HAWHZA&8q3v0okh!>*^j>1Ig$5()u5MA2hEzd7>VrRTxI4DKG)8 zKH$e$CLM3<{+lJ)84<6VK;-##x_Vn>v>X6{hsW%Epy>fs@4Z*oFg!ip0#6EUoZV1w z3ViCDyI9?xvJ~>FdZ@)xS5+i@k@%_k-lm|`kqI=v)NON z+pNAxMbVdnWdZn}c82{x->a>U70vF6=Nw@cN5%A z3&Ji)n_J`+2Z8b;Xejevc|0S?uCdUppu&4e?rGT0?MVZ5$tK_~559gL8IB$#Mo+eq zegPX}$6{f%L&uVa{nt^gHx~x?8TG!~gF%jNEOMWgm%wTjIY7qFRxr0%^ zxVgqfXGjIuxX^HxJXOgtPH?l;f({hrWJ#e&uzrU=T*eBFWTlDWEO6y%n5JTOv-1&pZg(@&RsC%Ba*$H^ywrb#dJl8PAx+yTv zRk>GDoxrvs0YWOz2UX{-KI?Q~F3ubEzgg~MG`DxtKcAG&$u8o=Q=%#mr1`s3gHFrf zD0v9j!a;#d8{0pYCiZR9CIQsbS232!4kEzrPYh^2$062F5r4*Z*tRvFQk{h}@aejM zEY{~IlMHsk2cSYFoZ%yfp(7$2LKOewWPacMP0TE+*=vmh#NAl0JqT}N5Vd*kx{4*G z@+gpkt>`oc(XeJoDt|JRQM0<$-%~2K-5rM{!{iQ0IX+3|hnQ5Qx+N6_i#eSk=Kroi z9X_GbU$m&1P1+D~5&Ruv|C8$}WhkqW`eyR3f=2?cl+De^YkF@S~&Mb2MFH~ z2o*1kBF|ELh(;Yz%>qQRunA&9-|#ZJ*=4^#OvLBe1%d zB3DzTk-i_j@#oCZWwS0>9Xc!S_~zlxuM+Q`JzZtAHo3@k6{#RFpzzS!1!*@R4+;8o z0^`}QEuNO?YmQB@ePYM;5Pfv5t$AE;A?h<6??|jVP!Mk#wAX5?Pfo_E)F7L?qQ~w2 zI{^2T!SU16E*Va`;CzsZMXP91$(#D9FHWar{x!$R4gMm4AG=)^72VG7u^wE(tM}`w zW3c0$-+>YwyA741)Nr(^%mQVHpE-&hJWeu+^%tnjJWaXZVmqs*?)q?U|OCT zGCvTI1UGKB8kcQG`b|=xwE?@+W~C)4PF2n&rF)Ifu!(MNraMAn+A*fzuR3-?VHxbH z)^5XMo=AFzu1ey-%`i-#yf7Q9hP5I81?UZ|B1y7%*}2jRla-xsa^i#bTe#XwHiOxZ#>Socw!%_p?q)f83hV;1LW%s3O*{Nab ztQNA&Cf%BtnmXUAOfcj3aheqt!he&+nOG&=@ z7zZ<9)Mcc|3&4tCbR(CK1I8Jy8NHz^LufQiT(i{)>$=MEOvT7mQ!gPPB0@hx=02xY z`Py$ik%OvZ++PV^Z6IdW;l&cdHim)3@e>%AEhoblfv(_GW;?HViN_Fk?{WBWYn9a{ z-NeLh?>2XPeGdv!o%1AKep^=%GpvM@m_!sML|i=_-Zf1~XnfImy8A&)%!+6Jvu;)D znAoA@$O8olQeOQ;50OM1!?@MT%xw1pHicHemOOrMIEL?TFv3k24Q)&bv`#{M`%_bJ zz#(YhWQXX>;Bbm#U_m)6vqD<7B<0PQxRadXOnY705Tz;;#+C8~-%;`Crr6JPn0MbZJEu<3BH zbF6r|Djny7Atm9;$o`AY`Occ+30dJ;N48Yi)!Y)*l&KPz&-EYpy|($UWzP{`rzN9T zokCDf|C8I#$E*QYh;ig3JhvPrPcd1nT|$=~k^t7(g_>n1p;HYRt+h!Cnv^=^`_?og z5s*1C+K)s;qU9$4#0JEKeymq_wIGO0?DUY@+9#FGr2xR)OyWR zmtiyouwvK)70O!r#IppBJji>^I+UllId?8XEU9r%mB0BS4QZJ8y*q7ue5>*3o7zSX zf|zNY_zbkTBiunA3a4&XTnK|Rn0vv3S|(Bu{&Civq(A18(e`== zb?dw_{J=~Zw;~eY`I_Mt_@9=XgDsPg1W!Q9@UXFr*}hCA|1L~)-r0x-eN5FT(L}nX z*ZC?~KbfPSg21+#F={7B0rJsT(zTMYm?+;|WKT9qv{!6Y-Y^3wV{qyHE_euU%%fCb@L?W|QsbShB zn>is0Qt=J{3_o16*xthb<#Aw~(rJX<@U_z(3m2Flgbkb?xU?Lm3vgq!k=@kmZ;dm# z8d{8|5b4xm1%_P}K)3baH?-%aqg0^f6B`zKF7)fLy&Rk@?Zn?EZtn9{Qvj1XqnrW- zSjxr|+gDXlc&lm`SggA|slVa_{{pj4+_k4FGDoQ^oQpqmZgu@`5*2pXUI~+Tbe@`^ z``Z_gmnW3NXr7JsOz&AcIadUrn^aQ*&!qsum+P3VpI;cyZ>pREbzsy6~0{g|yioVy>PorxTJ28eZ) zNDA<}RMpR2mV}_?k==uq#UUoZc1o0uRsCE-?8F>u&| z8uWe}jHR9^9>x7!r)+ezq0C2cu4}LH=ZED{CW~L!ya8!p`|GBB5C$hcAMe znC_SL7GiUWS;7oJ%sy;@e;iUt1Q`iVQ6Q;(*`ZA9r`iIa%G4@Q!d~~C>)^Vv9nas2x3m8x#Zihr7-VaCa8l3;+<3c* zfUL*U24%)vXx?zMVY|kqN17xKV!Yzw7lH&{Q?fi&ZVPgA-5}r0HxY_9jUAx!&p=Lq z>4J^ZxeNm-OXsMWo3N6(HdvUXVe8EY;x@CupTn#_-oSSiUNLd!fU%-_LsWXt%gZwX zH708{Uei=lR|P1NW<&3dh&E=HM{E)4-06Vv-xZEKw+*=admqjQol#SFc)dHG;RTCR zcMIP?)Ws*=>}TB6e-j2WsV(b~#J04b+)hBn0-S)g5Q`5YwWs%8jR9w)t>q4bMdBF- zO=5|h+g8(a_OtEsMv}VlT?29fv4p9d{f#xfEZruogbMfq&DJ%AzWe9hCop#kdQ+dN zqMy>QBsy)ioZ?reOXgnNc!G_Flv@tW{q?1j!+-fcGpQb1YF5$hUJ59c3FP(pAWd2K zmc=r(^Y6CZqTlr&qLwUPDL`TvvC+ae&NqfYi`)5luU4%gd4j1AA9ze`KZvy~XZidC zJR|`Y);+SQ)YJ!F?YV!xrd7c>($=i+QP!G$=PUJk(^i`g_aED{TdoM8N`C;S$PowR zNn+{A0Mn_IS9Ie6d?2!qTY8p}o+&)A@2vsnMyXE!oQqp5*PQi)c>a<@d3s%w7}vmC z{V0xG*g3jSu8A3q%^ZHN3i3oAZ0{Qgd7KW#eOLaeJn7481g*8Exn)vb-wrMZm`)U+ zrjZCW2y()a)8l#(| z*=y-rZe})aQI>Pe?t9V6EJ>8pg^g^NEIE$5>@t4<+qD^d2eDg`7||M?O}F#C(nT>vMSgGpl4<}JVs8fhd!x1VwL zR+Sl(%YXOIT7z4p(SH1S`W_ae+ik)LU6lUKLf2in-|0@gnB5B#zFf(f7qJPr&Q80C zntd8~4Lpo1GmCL)^4?HaPtg)e!7WH*0zUUjxt+Cm(CL9L;f(@id12MG4$xmJVbvsA zU)d)=s1K96AKzx11^CESh_@Br(@%P#<|Z!#E6a>p5|YlvlO_WdUSa*eX90NCn6bMo zN_|^$3;?1fU8}XC`(Sb`s0zi|yPin9Y8&fjRbI&BRMMK3u@RFzo5+dao59vHt`vB! z&S(Z&a1fE~VAq(dc|cpl;tUON(>*TBT#h=Lk)txn z>6EvBMIPg?;;Hsj-e^Jk!$WeSlT!+0VH3kn3F^dD`#1fG{->8l6`P2m>HC4dbXG;}l z=~(=#X+a6#Al8g!DD4fIJa^fp=8pZEXSCnJAV;KA#i%C!Rl>H!hX+Y3&hOY8)%wE! zU(dJb;ESZ0?0}Ojk=OXfNX6aEoh%8#Cjw2kKV32v&!Z(zXY(bdZ9f-?B^oOA8zXr= z^No<}1d+b0>n~bvZ_^NvgGH%HA(T&{m>1E6(>b(C^(bc;FIH_|A7F+&oiaGLY0A{7 zA6*lm_iH5G`swgd)1=~<0ie6y+}-uL3C$(ptu=K3R`og@-|x6fGYbUE59(_+d@-A7 zsGf+K_4OZ*ca00UiF)DaIB2`;@Tmzs=&oja^4GWJPr0e-q;^Y!L`&|BkXXC@S+rG{ zv|&|L9?KnbN_Us=nQw?znZ9hI?w03G!m9uhGYh*$R;jZcFFZrY@KsgM{+NvB9!@S@ zFm6#QtgI&T}4u0H)F)r0hf7+ zpR3%uAy^N-$JGo_yS4rdnR5R^brbXZp~Z7E5ZcTJ@qF|<2kRqWHIyEp;uTP%lq0OK zcOlWwJV1sCUtMpVV`oP2F1NBa&DsQ<2k%F^!Qx0aQ1KS0>*U_^grq<#7#N`sQuW-u zSNIQ44af)(L08cuZeItuqPO%UJ&wllvV0COl^SpM(9!G`B8K`k89~V* zE(s|8b$ul-ndiaOxa4*iq#<4)G@TvQ?E||L7EPUx>1x8U6;`tNf4V_^s@Y_mXz5r&^cN-TIczlv^-K@M8N5{~Cis zCgpGP+YDwKKy6^0{I<&dmL>9P7dZ!P!rnl7&vZ-HYt|ZjTDnc1bf@p0$-2s~IoQ_P zpy3Cs$)4McS$U9bCkb(%6>o0qReGtWo*t{6Z3goK)o(oj8d|Tj9s>KcvgEU!D8ZJq z`PcGs+ZT6ft;ZR7jn{qOqN7D$$+Rh8GW^LkH{KMixKXP&(3!T?O^sX=sHSDI**Wt_ zK-mXgrMuh7j*JbP7Btc23Yi(h{KC2R-*~|dc4ueKiyxYJs4H1KSs&?t_Jq3^bY&~lW6-gGR9#7(jMaAQR=HPPDi#qCvaLLr%1S6sJnbcG`K}g@*l#HI=7hCyOqC*Jz zK6j|Q|7H=szpCAN0>1~0)kmNNB~WF<&6I%+2s~^ziuz+}46XViX$@Bx1{J81i=;fk ztZs=W8w$8gOBjv<4!h3OZ;dNkZ8KCj|_o*S5E|ri}z+{kw z3rdrjX5H1S%iDiDBjbC^&504xBwfOvx8|3Obmr1!9Pll)Qq1fgJ;!sUlH<@Kbau5mm5>IVlNJki%5Tb` z7Bg|XD%y({K|50p()iw?^|ufp+?S`$V|ix)*Yu{EH0jD7`=KRiA6CGrtalMHEHdz= za;~<6mJTXvXmB$|9@t7BA~($V8_tfn<@=tsk>}z0SoM9gQan%V%UeiScKvz^mcty) ziLon+G}Vhc5+pU3aV7VDD_4zwav0JKb-0JKgzS#>p5~_v4<@_cA>&(*woflA0@vjq z=G77f_7vpf2ZZNQUUWN$m<{yKxuu|}1iUHaYy_ab!Fhpb$Gpywfj+-r8SqMXE0Dbe z>BVr}pB=mx#Y0J%-d~WjJHKwaK5wfu(k_VU zwWf|i&S!vzV%DI=y`25;0qcNfr;66bwA=aYzPMs4Xaz4M%x0y%X7pzt)nPrb!^?jl*TWs21O0i;VM}D|Z}~S#gB^(d208VtPiJpM*Z}LO zRjhkMEu6V;mWE~2Y{lR*18S>sN5_ZBu# z{Y+ZM@O5nbn@3i7L3wxxUgefAEw127)7Hd`2pQdMPNbE^gHZngYI-;5nfA_wQfeVb8wIWtq{ zTV%jSu&p*7N(A{A*%WnS54EAc*XBScVBf@Co$0Y@!A5n?S|(%7Geu?y`oCOVJn=9>FQt66P~tL zPSzmwz>lFD@7md^Q5m})v1Lj4_PvT|Y$Dhw%8arlmH0nLYa+^S%QIYNXf51@lJLtQ zPomta4KLG+CLM9LHmiRCA}pzL8fWYvXsVQw?nIbLLnFQ0wv8t2Y-dASo)aIqL`AUx$aXLet!AizuD}njK=*vR8INj2L}^L8RtZ7?5r#D4j1RgmM!LP zx7<-jdbo8E_tT4SX3e#wQSjngIw8(zL3XE<1OeKJ1TZBIgY%Azv_9FVRa5s)gZe{=FbmYKcUw{3HJb$3 zJ^QXD_xN(LRNWy6`)P4V|p6k%6?`i@#sg-Pk%fpd~zwuW0 z>5%LmY#K=MD~ZI?(sWHuB%uWrz~;GLyzw2?qIS@6m! zSj0M?@!3<`b|I?JoKezrhpd9;sQz#SLe>GKEh>*xK2d($jiy5$G*k4BsaUC(JH|z>m&H`9+$+KG-hw7cvfJScFhC~( zvsf0;;vX>h5K9fZUu4X0_pNd7H6O3dn8rvcPxT5Kq3Jg1w?Cu3+Ag)A=y@i`4C9eI zKgCtXc8C?n{A!5be$kJnsWV(b2E3mhsTbDQ)iZIm*(m%-yysNpMP*?)&&UhbYPG z>w$Dc`~r5t(#jes|6FN0|6}j@N_d(_yaf zoyYRh)iudV#gqPf=$hW00xt)vgf*|9k{ z$yw;d1d0ye=j<_-py^Bl+4uY6c@u&`paI|dvGLQXlrwnX?N6@qPlH63aO3?oYM96Q z5-00qhuIvVr?JjaKC!(;p2OzQ@b-PqO`#N!_m`kvE|<_w>pt0E zIE-9s5&^`|;Th5V>eWk};{4{cWXEdhSGy0DxCPVKYS!wh5L3Hr%hV)cil5te82DD2 zE(u2hLN9KL@4n-YrQ8&wd1h0UZD2Mx4!u2QiC7;)=A3!2=w1p!s8c;Jjc%eUz>LZ_ zC2iiLo{BQQC(7J(OsGs|KDt2HEaN&tMjyynVV${sRW4?;PI5e~q@-~su<%0JYXzQL zF({I7X?QQ-WS=^p6bqxLV-C3^MuLo?`M(%KJM}subaBPziwt2K=NHx=&aF}2Sz!~! zxZQRWe#%)DvHK)eig3ddI4q(7Rd7;sJ+Wd-c$G( z@56TBLtXzzgP?`WY_So)1keDP?ZCsySIqGlY=8btUs)b;y;jm@aBY?Haw!a< zi+^xj{)oBe~4W&_dL_lDh2 zDBF&+|9!SbTEHm-<12Sg)?L>ZeRj=ksm)PD;e$9U#0rkpuh#iA*9cw-UeAOHIn(W2 zs}2|$XN+EGtZw_h3DXsO=KJ;^l#`lDs9)0Z+}QB$)|*0F=4PqOwB_ys*R-jsm}qhC zwbW%P>6YQM-d8b~i|D4Cm0{@ARA40s#E|WK@Try=^KbQE6a|`?5TkasIjUM)Z(}7QsXu(~9@EMsWABF-s2Z!RxFlN?SUajXNW`4V+ z2NL47-joCBHC`jN*A3a_3&NH{f%P10wu;a2sXW8U<$cIFa6PC^6NqflDksCAlr~2s z8v$b**M@T_=YQ*OBUk@CH0b)1CADrsX79=9a6MwKRdN0k_nJ}L-4igneIgY{04%(B z5h22{cG_nLmVEFbVqr#ea~XH#J|fgN<}R^5hYpm$#ewf;zT9x=9tT}UmFjTW?uH*xjj$9MXUg*m>NYj&YGKC1ec<-+7MJ(R z3njv*8dO16{4lZvU>V3uFJF+-H^6;!ggm9cwq6VAW z%MSm&^9*P4N(z8PPJ$`#I`x6t?$xozX>7UT(Ab;8N z|9(G~vv_vN3h4th}5WgJ?v8cT}p`}!sLAFepf-_c5#puP+saMIcnw`o6n zfD}TT0GD4srn?rXD1& zE;W-&5Jd0E{@SUK=Cp2=Rd^H?&H95x7+*_;N#Tg8*_~F#~lXhTcV2@OSxj5m=P=>|8K!OJ!>#oQMaMntTeq27{Z%7#9HYB(Fd-b>j=4S>6|M6sF67yq zv3pMW-6Hn{(JIf>izDdcKVl(SQ4cefWmHJ!e)x>Z3~o_T zfV%dmaQ3on!YcjWS>K;`2S1{BrR@ht{|QxPrKG4w4N;?&zgSpU;0A?-b&G`z5@GfL z211v#5v+JBdJLN)3vv2d(T}uu?pliNUet&>MP>Jx+a~aSi*Usx@zE0f^sQo-A5-}J zdM70pzsN@A^Do1{x1oQ4*-?HU3%}`%CK%gW`Cp&t&=af6hBH&@h6has5&n!NenVpP zYMi)?pC5C4R{s%)VTWT^R3%a8E6ul@$I*Pj9WJCwvLg7Gm&wPjZ9j!a`S>!`YTD8m zuVKJI=5IEO_6fO&@n7SOH0D+fzxKeMK3O~mCP&noJUZaDjc zQGDrlpynSG!O>a?Kg}CYBvbO1;%W0E0F8KKUGP+RiqecEEVwH)K!q79^$zQAsW-7U z6sz}>iJ9@2&FbD|bDC~J2u3OGQ1jc!rQGxH*a6sL``8C4!0LtuuCW-I)1h8fgYJ5d zK7`tsj8IWhF#xK9opJHQy4TdfF}cBnrW}ahm!od?HQoo0!(X?5D-NEZZ`_z|?l z_GMUiReeO9aG8r0Wuz6eaI~}EB57Ifa(_zw5dHQ(g6K>7i^N%7k_{Ta580%Y%3r>% z$Qt8({YW_Edo@NR^td0v&+?5A=t(>4UH2~f_3yu{H@bbfI95=D_uUdX z)%$t9;W0}$H6>0Lv2kd}wB27=xen?ff!=2Ev8f$@M{^+9wq?hfm@E9u&6SYe-&cEm z?{$*Q7kQqHeInkb%uz+G-NGeWUv;^jJXl+hkV$-oeDE-E+p)>Che+56@$xN7+@4+VOrwlOtx^1CiF7 zI5vL+20Eo5t!g!YA$%7Y`#JQBZNA{>;f+pN^2lM-$ATw3<}IP;X}xleBaKq^aIysrMS&sE4MFP?6Y0@s2;0?IaSs zmA0fIwv_rS{B)G=#{1-!hE8HuNx0GQz1CM#++nv^H?rpD;9Zfg;-~4W_=(T7_&D&` z{jzo2G%=!Z{3Sf9w(B!2BD(S%eV!qoOLC8=L$_>hW@2!52HijnFKWUbhM}0W&&5ev zWeTfGi^HTYZ+iZs-+KhZ;SsFT+&t)4A%GIHwSvG?d?~bM#qo{&E3dkgubUU~!u|fn z7ov}zbrC1|KC?s0CVgySzFb)wjHj^_J{mnlKgDu5;Dqdx$lyKe#U>^(6QS^E{85`9 z#2`;2Luq4!B|4&2{*Lk7W*mmw{(z-E*5}Wko5ffw_7{ar1KxqkKZY3%%<6FaD3PuN zFaDFH6S|Y#5EASg$`QW^E$d!<{hltc$WdVsX-@V^<)4LRkTLZ->nBML8pf{ss#F@) zm!*CIIDBolH4tI9+69Yq2>zTVe6IH;RR?)mgI)eD$Y*6u&a@@fukP%A|8 z-sTnNE)Y#QS7-mQTc1q|rD(DGM0S5i9KVw%(o0d%Vc+=bGTO10hC8y0?o*)H47gp; z1T3dW`GuUXXV15pJ`CI5+_zJFm$u4de7`jLPUf0Xl$CwjGgupvGjB2AeVo8xKEn4~h~&Oj(AD^XwbGV1|IXTf6-&$kDzrlYne zYCB!MSzJAgD9ZIn)X_jq?X>Jih}vA`KQXV%pY5uD(yk2>l`6(ovcvxPdMDHUrGC6S z$%lK4l6s*MwOT3PUl=C-b2y@;n2Bi4-pZ#ImA2Mk>sR%BGx4XErrIEwrDdQTNf57p z^8|a@oA6+7{OBA!R?2E4N1EgN2v$vudC_y6OWaP%sOW(kos*?!6iyuTQ4b--AD69r ze-Fxud0^&ZIL?rU=qaA0CMA$oKmKe#zM-gatnB&YLdcbx|8@1xfg$3YKSX(tIXKAN z=j3=>DdRwvRJMt?z_r7QNtHrQG9OQ*#TK5nM9@cj0duy)qphsL)QCqw%J>47H?8+K z@e~xM<>RNNN_73F>>&*^|Jf$7h z5N#GdWEdAUu0gQMMC5|Xx3uvr^t#P8I*&;e9zi+m5FSuPU(c6P4h zR|;bNj}!DhI7>zRtY6;zUe(q>GoVzKJ8ukN9mQLW*(@xiE7$cra^0Kv4ehp{b5{@yZTxYN-S|7&+mcgipAa? zmDdy$Edm#>)a0Dp-BZWqV$Kkcv!BXa;*sKhDYQLkVim#bxv9Dl479^OSS(uI$`*2wr=~EiFAo_s z7Npr1lD4By_ov7ocwKxRugA`m3H`7Xa|@|sWt$!{t1U8kftGB&S)rltK7M>Yh~GHK z9pMu;7)9dhgXg3%;z0Nn)4`tkok288#+A{f5DnUQSZ-54CLZ$s`WY!s1x57de@6i9mQK{SN9*Lfz8{13u|8*$awOC`q8TpYCA8v7Qa!rf2+)o%iQ-$*lY4W_Med1RBC*mx# zpU_ojL_NcaIMfDkrd5iSjz zHxRf~M}wcc2bwn0iiCf#Md(a`PTLP>aLgZ+L0zyZc4cMdRnA+3^0EyTIGJwqfX#;4 zM-dP+YU)qosmA0g*FW;p9tZK-)4ySV>g z?ON4{c7=Ld9I&^)4F-38!un_O_IA$N`br416Hv;TGHP=M`W+}=@+v_wU87esA)+vj z@%(Sph_r$MPjQhx&NrM-deE$&Awud7j$F&fc*a-z*5Q5lolyqZz}5*C6;qr};CC9W zP{JRW%YurW-lspF$eDYT{dl-|*42CHyi`Qs14AhhLOi-sQX&euQr6Cv;#akKPg{Q& zYLejas(&Z@!Rymq*VYtfP(fAiK*;+(gvea{p$`4vEYthygOsIAdqnr9#^owM40U^g zm21|_p39f=eQbR?pR1#uj^4n1DKt7Xr*JnlH_}Q*crU(V1RVcgMS8J^|DW)sBbykU zi$UsT)=wLRhB{0TxGv(amr7_98;EFMaAYSU&eyDcYJg1+Oao8cd}cm=tN6=5O-hq~ zUfHCb`Nw4}@CT<&PaZjW{?KN)E}AMzRy<&)ev}<+V}f3-;0?oAMyiWwoC0xvSPz)E zljsL;^szgsN#4;!g6`g;QO^xXQ00w|Ry13a67%S$86K0+wk|z?B*9D_qM7HvlF|!p z?F3-X3qG@xA07Mcrh)++s`BFo{la29=HeIc-yPZ+vCT`)H{lg?48n*@c3=dYmIqt=tPbYB6{*6+uDBFxK zz3c7l?8L`<*j`>*ScQqR-DFKzU*|8@4-^SUPHHF z_RsjlX4x#-g{u>P#Q*s6K5H4x(DO~9K&(BIV)JS##F6x*yz04pEkm!iR_0HJD4x5u z_HyONuK6V2XmmMv0j$q__p$Gn=>V%o4nc=4ZJDLmpOWzlEA+m4B71BE(nV|3ngMVX z?BDkCw<{EQ{I&`U7nGO-jDK+3%>bUREcb$eP_cGld9u}L%h3gDXj@Vi5J@OF-~4-` z3I{7g;}ijoc-SDHvCSWdD*9Pa)8T8K91=~*PdlA~6O=0eakJ!Rp=BrqFcRwvO2y%Y zO7@r)Aw$B?&ZWLKzQ6W%8B1$l=+}cIRhWbZ00p20iZUEd#*Wm}Tbeg~G&kNC#ouD+ zoH?hbf>+I|@Ofb|w(lb7U*cMf_tHNV$dnT6%985YZ?b>tPU@cXxO|mv0>^yVNT$q{9WQD_S+nM#*wxiyA9rPsFW7Dh%K<3jyCKhC2owPG*FBPNi z1rURrQ!M7S39$6voPZ`7qyEBh$+8@JB$=&Pf}oZA-_enNYersva$@#^8-98pD;;w z+X8kWc2ffzT5+zQ4<(jXw1o?`{Rq<_&3sBw(x_xOrDc`ur~D78Tl7q@loQAv+PVNv z@xQWyDedoGK)(=lLNeXkmm|!{(=}kRrC-`8io-EoUmW$E%yWw%1=^?$;`?&gyxm4) z!-Fy`CKQUBX@)fDKwvYI{+cwUKN>q&mHP{_5b{k4uwQcbiT}q38&Uh8t^ePz0dnwn zB_HJ>Mi1*drOkeNojJK8i9}_sVz7gGeIom98b>5|`e|T`+!g#`T3WQ;JT~pe?xZ`C zr;0NG$0nLNb4FVg8+7X!G<~4ho3w2IvSH+36TAO_Xp(P+9=WH zu#oBt(wfUulO5`qFzi}y)|Db8cWe$2i<)%-7hF|U{LNqer3SR;3;zf(&|0tifT#88 z_qVeou7Q6lbbM5>hvsrs`NL{-l#8$+v-nQVkRPeh53t zOEp=>4i@p@f_8U74`1e6@Eu;VLlkr(b?IQi0};G%Mb+;wXn!?~fBN~4X#6u6>%ykH z5BUWp@$p2t7E1QEFD>y23&^MU8E>QgxIS+m(oGzKNnX<_E2e3g62XHB3@RG4SG%_a zmis_y2-_R9y9m$?t??N)u^JK&Soz6kh#I0x&HWcxWMPZ(RxZr zRDCb|u*`FA%klkDe6b%%xPm4Ae&Iw0Tj@JS@ru&D_uzV8uY$`-7b?0qCsB}#`QDn1 zE6agACiK!akofvOfs}Q+jZ@&q_Wd&Q<+>Id!(XNP+G9tuScU^dsx}QDHdI+*Zr=~2 z*OvP4!@WNUFU7=$=dc?>{`e1l_1nPyT|~ra?iNpTccw#)Md|LnWo0fXIl)BXE!RrG zf3ss<*!lJ$zai4L01VxP;zw{objI!i@@q1f`(NxWN<#YG?xzJBo9bi=bGhAnKbV#D zN~{!xmHmi-JKeR zUh`(T;knDG>zjQDezy*YVU@^k3uucp`Y}UEaBb2nxjx0MVY$(PFc6L2dtT0&6F+6< zdcpcSt-;R6W;^$p{&DkSXfOm2JNvaE3v`ls!Q4H$41lu-D*DaxxQy55YqRnsOiG_0 zMDo;Q_#y*tNfO_@M#R??5HA|26jW2|%Uhu(Vbx z-Od+;D6;YoTn6_I@DGej{ZH{=V+F#Lq>H8Bb9TSXi{2ImhFbw! zhc9b6U~RFQA&1TW_2PsrkFp(0stp5*IH5$zw;~D~xyPRDMEZns( z*L^7AogxJv6(d?NbNBQeQJ|$8(^ZvS&Z)R6l7c$AM)LvF<2V7a3mK3W8ftyFB60`G z&;MrOeZihfktM)EV(pn9U;xbVH0ovbqhhh{v<28sQ*H$e%5_q>-rNmBTwK!iJI`kXt}&wC zmGzEhaJc8H0-wAYT&g^^8P1+?4JCY#`QjS_|iS z-e26J01IiaPWR=3!)$`xdqXINZr1xYhd`&Ia8DIKBl4KY1AyFI6gJUT40rK^$`@n& zciWHw{M>LSV{sugk53w6`BZf9EevY^CU#btxW9Z25b#`y-`3pqL`tgZ%IH_%uh@*W zWuO>k>2Mi?Bm*GQduWy(D2=$YocUgW_B#*uXzIXwWh!#E9~m-U*?TtoOiJmWKU1c{ zXmr}}I__}hV+6XG`|a*x67X+iwEEC&$m8Mi@?<57N*MWZla=@rF<$4Dr#r8Cb_DCW z1|=&*BSV5XW=YcthqnO)At0iZe1H9o(sshLcfk-;(EWY3%tUbVb1a@}>nSHNc{*LA zODXUI`j22~TDHuEZ9w>61SXUUA%lNN$H5r?V8@r(Nnh-EEVfK)=TfvBfD_FMPwfNX zYW%Yr zqq-49cinNT4d>-qzUT+9x4XYY-1))dH%Pr4983(b>CHra0Rf3Zot_snj9YoXo}air zb?wU}KS4(h9o;VT@oB3QufOC)JwAcKC8Sa|;^=U+$$fNug)L4Bt|m>FYb=4*P~W$E zVj&~3*uE@+ZE0Eg)i#HA0YVloJ5>JZDqeSX7{1pD?Qd`HU?e?*?s$XJh=t1h zS@PyL7%7_Z6m35CFL?2AHxD?An6zydum&YeXNXEvSjrkJYNG-wJ4Qwzf<25t1Sigu zB?XlKmOGq1ntQhD7S(jKIQ#U?QNb5gGI+44`VGw?Z3zXQdZ*09{&5igHeFpoBdpk} z(^)@e^oOmEn9Rl-jMwaqMK-1M?ob4(d0d8vbT=nkq3d(De3K!42W#`KbXFzxo@*t% z{@j?=$3?T@eAMXi=gWv^+d}mLsLkcUsY-7BPR`xP>S&x05Fx`gTL9x^Z2(chrIqS9 z!N(25MP8SB-)%o8P-3eE6yHKm&#AUUT?*GJyhoK#;g1h$^cCc0$^?yHi3US;8;rOJ zp+8}sDucYwt@xsThL$M`DUa+v^icmp_&a*-e*i$Hu(R>yw%U3oxRSNs6n{yP5x>ff zKxgp|G(hzfm+47i1AyD4I^(5#Z#F zbjP$a*_d#k;?7{Fco=3nvVc)Tb7*pd+!Uz0NuDPc9@0HH#NE@wn3aXkFA4l#Y26+? zHgq1!gffl18>U`XK-{xxKr*6Y@`3(=a0*h@Z)zK)glyEQp1~5ExD~(0;rbVI)o*1T zMgB`swKLyO`^GZrFq-J5zmB$*cAHWMA_UTT5ep@e?Dn)VG#}CTR?8I~xXx4l^wi#b z>;aqoc>t*H<_{zUuiwo@(F1RF^@RDH?Djz#J}1`e_z}oj4r(a*CG&z#GOman)+tP@ zl~n(h>uyZddQA0@ z&mdR8uc$eKBpP=r6?4DqB}~Bg|B}4k3P6FA_jU2iuOEC(&~!OhzY2rE{fBuG!ghmNx+U`Z1+;0 zg5Ze@H1J%IO8+l|fOY#6fMss2UM`j-?cO%#ziT2tDn(DtMe1SFcdCG29Tr>aK8pUC z6hVNOEYh)LyB!$Au2@w#xgsnu;Kpc{n-)6YLYi8SON3KPELhDV-nAth$_@WkWeqU< z?>7cR*;i$Ey;N|R{K-<2f~PkqH^&ZgiwSE(mwfeC=@Qq*(;L5sml^oUX?<7QClfU8zGYeKZbsxVhZM@K z9R-xk!#*7)@U3-rN9Xs;d>kZK+b3NmfejGLAgFh~gFX>Y6oaPgxWj6nae@PN+0R?hEE$PsSW*6+O&V#H;I#0-* zX`QuGh96d^xjDJ+zhsWGfgYY~kW)ar{R9K`yRB#U>?FQei{U=7B+|FLx_YPcx~tT^ zTOoaW!K$|N`Xd|E3k2yq`{l-eXk?rpaI5Ycz{qlaXfDa>%q(IX1o+c+Mhq{U_>KIi zBu9tZ|CFXBnz}(PkEFM^R5a`7%-x>j_vR!3%0s9SH)Oyol(pAe<#~8H+Zn?4KCp!= zbkXPATm`d^UUW~5F`OSAEp5d=(7Ic*;^>O6n{&mlk_P-s68e*{tzHiZyx*Wc4{CV6 zpK54dipA&2sui5%CCBc#fc1kC-Jarvrz0dk29$@$)TcUoPN{JifZ+j8Q1l7*zU(b&o9lw>*dtDV$jUiL z*L@~mMYYEDeuA;rbvoEXd;T6xxU5uSiorCBQnrsv-)sAi2wE(%6Uhc7SXnQN0}m*} zF!}P~73tK1gI>er7y?=rXkq2_EDnZ=!IR?fx{tiPGyy7@s+lPgy{6Tv_e17}7k55jTMKZ%*nC=k{}-NpXZE zUes?jXP~z`RLAF<2C+fr;@1DQMudA;7Ku@bjXp+yDX`LmY$kj>vMj*D9~wO+XG7)lS;t zjum|>8=aZZM6*xB$!rt4?Pl;#hv8qzZocLAY*gFThh88`^3j9O6xuLF3uZ-{mdHfF1FN3{@)GN?-=-i>5wxQFamB3Bc!&^AE(1 zu@aC9!1^7mfroT$qf(zK`c&%OiT|_0B9(0A8U&Ejr933D*%d7CJoh?s$mjL24C3=1 zx#;%1li}H{G5PDI!!S03cW`j`ZPJ`lN1x`8^WVKDdm4p>awNHlF<8{J%1DC9K~P7r z#Y(NPrmr;lK{l?Kwio5j9@bsmLj>*vqTveB6CD8if{6iPU`kb~GZxL*LQzciZKP`3)WdMIPmu~?2ciR0lAALX23kV*Lm$j-Ko%i+AP4Dc27 zbp}RDQbCu?Asq&Dc8cS(mv33{T{+mxmR3u9$J;r1e_kJJ3}fHFi}GeCK>v7GnTrVpWXkZ zJD6p7o{zqs^H9KHWN%Kte4^-Q-2wkF&_qyCp#fef=q}gp=*Wu{Qhhuc4z|}$z42T; zj08l=2x(s|emb~#0!sUpv;0`c8r7-X_3s(nWO?y7s!Tr}m};}6$#yPtP&a^0*O`ya zHH~_`*FQMO@0p$_Syi@#H+(CFa{(iVx@Q;k#-7C?*FD1@=@jzO+R*)syCG7IE0Krh zUT@o&@-eIM?~KgH3cnzOkpE-Npf-g+!7B{{*nE(h)@ zM`br^rKQ#K?a2>v$sA3mTG#fFsUC?EHc{#)AHVurn?#$k<9*#D#sUGGRg5oR;ot3- z4*d5ylm_2tey9v~2<&<8(4u*N^U7mjC9@s}q+*^X9nJG-=s2epgqy>k?VtDOm-GmA zUrOj?^jBp@UFpQcRI-TA(3t0q*`ic;Np*^&WVztTInqYc@3z_5UjHizpj|TZfKo9c z<1=~bvzXAS!m4d<{`I#J78i@p>tmT1?{KCzPshjKFGAc2ISBNters2PJX}<4?bpvu zR6LWwpoaV7JcC4lrbQ7?DYQ=<;=@Y-kjQH7e< z@3;Vf&X2=>?sTsF<;}3{%g&P9eLHE1!8+u#EWFm()E-vg*B*=!&>4*3*Xeb=ob=ee z{yN$>*{i_tx}*~ee)k#{8H}X=*Y8^(RyE#|PIZpz6=yf(Hl!N13Im2jjdyu8;rlY5 z*Uc!wkWg6m`#Rj)iH7Z;mZK>fj={!V(k>tS-pNW_SP0t_DO6@P!q{^LGgTByxTaD4 zj~8s$=5opM-ci*y(c7EjBa%=7>KO+B0Gu@Y3;W;iqkdlpIUOG?tsVXiGH_#wlDhzm z5wWbym7;;*jt)>Zn6FM_ZiGc%Z2ScY5)<9d$$fJ5mY1y={8p<#)pMOuP+q&s4gD7T z(c&0jJH`41Vy{0Pm;RAekpj>Tzh73~GyfKL9QHZuwq(I6A$rk0otVf{8L%Qgmt$G~ zoQEsXpg5%DWat*S3D{hv*==Eq-o-*2TOx#TbD4z@{gtf`Ltw2+F-qPW{F5^iCL0e( z1Bk{0<6WuL_52{CekxKY!Hi<71Uo|V24*(6e{L}IzwbOz;F0hLr zo)Q5Of952vDvcb%&9-eKA>xpmEj_`$K84&G5Q>bbt^vo%^CJN{jb!JjhuH1Qch|q* z5JKkGCPM~6XZx*;Ox!OBl2@vn z2%js`H=a6>%gDI6Ot=bZ@C6q)f&X@c!CQZ44t$8n4Kann<`9Z|$&#so6mcaIdoslp z6yO}s$l&KGT)_Wl7J%Fi%R639u07 z`6p>^AqoSNox>K9^Za}Amc^0E>vqsp0#z@iG@X(1i)U~bZj85E^bm49Gz<~F3E)CN zbNj>IT>MV7nbuhn+Ic=nFei~(b5V$OpMhyVMmjDogEXjM!B5~W^_vHBB@QI6--7>U zEke&%PW^{f=&iPDFtk;mI~G6#DWUeM8pH$Yqd$4(k1auAV{Cud`Z7)MmX(T{f*L4i zF#x98NO_lNckh4rhLmo!ywi_r>IS88TE*0~DyLxpSo%Ph$%sfni?X4r!Vo*#kli*; z`fe8ycsuIjQ2+_wt7)-n8(V`iD`|KouJ<}3zg)zvvjQ*?euTzOAKCg1UwQLeFf?C6 zd_5ya$MA1frtDMPjuA0zl=93d;H9Qv*H-Ay$A`skZ@sviK$jv*@6n$z{sV}jilQo~ zB^E^U=&|m^F{}L2G7xv)!30^wf}%n3HOOVSMxUYOYHLA}akUxd!G9quf+`Oxi0_80 z)01fn$CWlSp+FIVb-N0Mbp5YT_(KMKLGkhv9FEOEO5W-pYLvpZ7AB-e&XQp4HO0xe#jbkMnZK z;$-|P*g4sQHX+ge^nyQ*X2)}xxYK<17*!-7dflx95;5$xIt;nXta;|9g+brH%Pei^ z2v4bT@?Y-UGAOt?tcV|-O3@3TsU*(6E)SEl^ml6V4ZfO|Jiq*fxLDH?yX}xkBiTr; zB!xrTb;>Q7#>$n5rq*&Mhq&BL&I+~@a_Y28iwugg9&*ncE4-}`@oVgb+cW1Vv z(})9gX#F^UKH2=)nXiMs!wRZsfVPC8ND;PnB66-`BoQi~6dKFEU)8ArD==Z+jxY41 z#q@vVcg(TV=8Hj-ALv26mPlKi1Q)jG*LNnO_7o%Q@FL@=d$cg`#fQm>C5G5U|Clbd z*QDiC9`!6i=cUC!7YpaiyE<^{**$<3@ahOKMBcfsgw5(W9z(C~jPO$6C)Dzn#{;YI zi4Q%c0uTA~KBd+HDri+i%q07=N#7-^q8M$^sy^@{jdS{qoOUt74&Of~a=MGR_gV_C zS5xA39*+Ccs7Od-P1#KwLAG0KFJsN;w+@5oeN#A*+x^Y2n2puFW&22_+tmq(aOiFd zrp%KB%cvkH-}}E1A1C@7ro|j#;E*H$JsTf1$mjgla33e24ehFvp1^D0dpN~pInYZR0a#V?4>C?RKDTCcjA+XOOYbrQySJ@AOoSE@5wJ~F}zQ<#pG-bupE z?GCfNniYKzf&W02m@Er{E)k`QCW03lb|!+o3nkv+KAoxAgbOqr{-4Ph`P_~sN7oP? zP`k{OH%gc29}k?@ny6f(RAX_D%w9&1jU~V4xKFq+wXCx6@2@&v8_5tUn$YDEyhhcl zDa6{Dc~s@HSVQY-l_S6bJ_0CqQK)vh!HxTzeA8XgG$kK%kez$yCLTA>3FsnpMKjYWqrZ+>wIVc@K6=zr1sAxDv#BA=ck7ZMRf z&{Px2nwU)Q&CsUOZe>z`4rB`R7dUq4mxn zm3JckY2qm#146!-P)eJORx1~o4|6sQ2*I4}D)++ySsDC?>sH+T=l`kixeZO;=G+(Y zad5i@e0{r>umYYe0O5Mn*mxm*RvLK?Yq$KzH>*6RS z)q!u0VSH7dKOre6`3cW{j(XjA4NCjT67uNE-+S_8U}M^NbI*C(=abG*sc1L`sP$+|Z(q6ZijQGcJ+ zoQ&NKe23ih{7R`%Ip(lESu)%mf?lTAB=|UaQa+Xgpr3>U{>F0otaFeL03DXz);5U? z7+tCp%Am)F4cnqR_9fd`gNKkMWtuz}#A-kbPa2U=+muf?1UtEy3Fy^^4GPV+`NbdA zYWAj_Y?Xiq(i9Vs01<{&rE{EB@dPKYM<@VV|Me?!JKDTM4OwriCuB=GXMR?aw2Kfv za=>}nvxks83A`C(YNLNXZn7SQQosy32YqmEF@md)6HN1fDD#v5+Ck4BQ#So2q>Yw0 zpvi8eh5UWiJiI!!1~WAlb>1Ey#E`;XF6{_tXt#2duji1;z{!jovb>>`60ryZpd!~S z+pE=?GT?m>aP0#?T-HC!*36gcLzw-sk4)%%GWn5hQ$`SbD)fvwS8|_?+ z`M&`qr#2C|N|iBVKc7K~F(6YRZ4ZhK(oDd<+zHWUp1uQlgwSe++5Qr$MwM9fhazX< zAy|s=YKy#8=FbnpjjQgranCD}NtgQR?&no3a5i0qr|ZyDr(1fss=)5|ofL7-6Vce% zy^T!nMfM1W2&Q3R%S;X2#!MsR%~K; z5$Qzq0&w_V#;f+j|Ml->0cUGMN$)3A-F!PinQ_w&LRXoqratc6JNln*@QM`6ln1+n zmumKZaO|4ZcbXr@o*uLHnep(rWB%aH5~4hWQ|J#tnrOdM5G2XgAyxf^HnRjVYX^Ju z;D5;noZf?O0v~73#T4ldYrf)Hn06@57PGIdbb^5d8hp_+EavGaZWX36Y~8>k!pb0V z709?h)FJdVEs9RXXdB59O6T=@jajzO%iWoaLZ$OZ>t_+jbpiI)nrIf+9wCY$meiya z?i^-zm?#|51H;qCE?pLo9p}YR{gyHHJtlPPsDz&=;vpC1*XV@j-GIRRPV9ScSiV2; z1=;cI0E3S^Jc@yBGxu-C!jx&auY^hnB--jV3;$LM4~8dARE;y@ z%HPlreZ$D>(djkbdW9Y~Y*5XCVLG&E`&3^2AD@`|AGQnfcLMZ;ljTYB7)1gZcdRI% z5st5STd9$wlbj3bO~-2kafZm2o$2)a?%D3<%(S)XwZX~eo-ytkTR&}U*hC;WHqEt z3Lw#&%wgRm9hpT*E?(THD8RoyPjL47Sk~Syqnq%4a+at)lc}u}OBk9J606i?WYkZwR*j4M_stXdO<+0v(RSp8P3f#sieZkHs3d)b z`M=%0uZti}CkHYZ06X1YX)Xzd%Xp{f8?Rr6j77?buIiCqE$V$gHqD!P@~Fhf>AO6O zBR=ocLNooR%>=gg1&wFr5vG)HMlgeZg4h*db0nDMlS0X%16W&Ok%Iy5RiyjEi2DJ7 zM!lwmTT;}Qb=o%tns!Q4?Ns}~Jzgv#lp_+$LSFh6FrWK2YOG2W+)R*=exkW9nr~c2 zQ*Z4Qkk{h5xwWAm_eyXvmzCFFUj1R`)(WoQQiw4w=0xf<7SSpS2fy)X6)QAX^^#_9 z!7lKE6s)>gnd7Zai8Y(I2;0d& z8>m1mqb2Cl|3A-roEkwVurev9dJH`#)K_vTzBJhjv{@oP-eEh|uYL#%KsSNlqlmXj8X zR~0r(6&7(^Ou?ZFOwNIEb`}r(C`$M)gny-zNdXt^7}4uaod4zBuerJGW;@gLt=ji? zjS9{heti++NP1qIeFii<-$ZGG-?y0~Xm3UdZu8jyZoCmSZIZu8bXxdk`q&`%=PW|C z8*kl*NdpdAQ*|8ig>2jX1GmV7hltJ3zixMJDCdY2{n>FhVbD#j9oIC9I*PKEnXI1? zgOGDook}FXnFU_oQTPh6gA9$tB3_Znit)9gUfxkoA(Ed1LbnYpPEeiLBb=BaS!tvc zE*1Qu^N%ofezjeXi8eIK&jmvp{6zc5!s5S_fyJwkU|51_=o+)o2+iu?V%jks1pK!7Zyi4%it&h$DD5k9@(jb(D>a`z3tH zSwg6z2T;T}MW>wn*~yW)_^HLT4^Z5zH3Hwa>!L8yQSjygwo-?8`0lqZ@K4ws!p{>Z z++lOwwUx?2P`|APB#X3Dg%IzlQgO)G_3@u{g7aa-G|^^5F9{Tf*o|h;Z`(eRNQBk5 zcP*m^KfSJ*;uPlmmEq!*BE$ib%;y4H7Ck^HPb3kD67sVQn9O{$IB?l>o!P>_152@R#M5dJ{JR_n( zZ>tzDp&J4DwPrD-A*%4y&@kY{$d=6W2FPh*fqs38BA{|1ASkHNA`uHgn87VOYN!t1 zLMn=HuSv*$ixw6S+1XfV_c=%@ktDC90R8SQ_0rCJXzqECx z!;U@68-Z6IEFc4M7m1X!12dYBu98Ugs(Cff-pdeb%myn9X1;}J1bQY47!F(%1r@9b zwpJ8bTIym^NYBK|sYw&zJS!-Y5=yO^^qv$`SC&bx5i77>(Jtj%8_*>%tf$x+5MB}< z;ae&hHa4oBsl( zN(5!F(j&T(;Q2TmE{wAPn)raL5S=PQ8eM~itLsPfb)>oV9G4V2h?u{isFEnOQk?$C z8$Bo!Q!b6Pez^H|@Q@3d+G>QT8rU!0opAIpPgu!WB3f1>B1^iA+}`m?ifMAI)bNM+B;u{d?6>K=Y~7&UIYfcy6wU7pyJroN&)}cdquo<4ACx2A zWIIHw@ZWgGqt9f$>)vP5Wq92hrsnc7`-w)#-UlACO0YR);e5%Z;36K#mz}c6NLY;? zW>Q$WfX{J?GxnmsE)UtM(cMGr^LVwIWA^iSLRLjtpFuNtxx~MQ_Mzblfp<%X7F(3x zz@=#7O{(FJVpjhduIp(?(|@iO3P3r?SbbNFh7$)zC@2ovRV1a*Xs8w-ee-%JHn6=!KG2=@smRA`DZD=N*usOIMBwhF+6@iV;3keA^!rYU91 z$)6upv+?ozfL(yk7l>}YH(p<#2Y6XLo{LTfO_ z|FS&3y;Hn)DKBG_W}8RvHt7~MI)i-Wt@;H1?|cIH=2r4Uo@QyZaX*C2WHSa7-%@e* z5=Bm=kX+1$(nipujUukZjf{3|i7GWs=SO}TS+TU$ANY+o3MbxMWDu`}!5%Tb@ca@X zLHMl>YX`0ht4gFs1{Us^UGQygz?)>>tgcs` z242j#An%<-0x8pBM(fF`GFuA?5WihdV7qQQI5=!wN&vERZpn_C2ic>7} zX@MJ5T`DXO*?VSk54nv3uz@~v|059C!1xtT>c)*~{fPH+nLV_P@$_<7+P4Fmh5fFL zJYp1C$(fw6=Bl}huRmLO@(vJCXkSkd=f3$A|1Wr zj$7?FC~~6Ua<5X--fx^15Q;9uWFxz?yk=jc#oh4^+9MD94kcyD=GuADr53?F3-vHU zr!u&e!vA`pE^-BxDddIdDG~UkBQa8eZCBSs{KALr`u}fN&2!i=@i>;DIA4m1-mpxA zB(~VcONu^B{;HN=Qk_V3w#1vcmVNrA!M95{&6;jx^sZ;|J5>kAFZBe&=Ja1>ag=lmaz-hh%9}qp0t^1Q*X6VpAG++q||*ixV{l<*7+`{dzW&>ArtQr zk7+2r@EX=2*1%~t$h{Hs@ww!gK&aJx)@FNoE0*oO@w##nIVfL4j{6`O3!)XzH#2~S zz{kjY({1z#^&sg7(oe7iZsKMDo5KTJ2R=qZ9nU^UQod1s!1lP&u`Igj<>_AY$hG-Q za;s*H5k9u_68CIlX7cqDWo&umx2oP3qvC$VQjJHQ7xN@vE-9W}kNBDNJTH?KlVDU% z=vfBC*(G~{^&N;vS2a!PT)B!*!JFB(n*3)kM&3x3zk(l`DG+C;-U@~l!$zy z0+JE!XQ0Bx)y6m)PBgCj9mn56&S+eMbI{7YmZ#+W9QsjZe3bF5XE9#W*b}YUB1_1| zZzq=<^tol6-5E*qhMUNx@;0(B2!17(V5&GERfx(3DJ_e-+dsL(5GxuIkLo;cPirhG zcI*s%ISslujhS&wG4L9cGBRR7tZKDw42T~Ys>Ei=ar)baf<8Wjkl6u2vF77PZ<$D* zS|xs1_eofGAZ&Mc`xl#4Osv(BdF-&HL<_w6Pvr&t&|G1;-Ly2b-vO0uYs&3?IRf{5 zu=_7ca(*NBG;~C^hdiy^guAun@|5-NyiTs2QG7Pg1m3EALfu?7RYDe%2I@d-X_eTU zD*rNGTK2jP;9mdZbT0KCcc)Po{YUv+AoH;R%}0!i$G2Abr0x=Ft(9|(PZ+^fItbS~ zJlk2l&bDEm%dC4`u$i*dc@Nux3eTxVG`&()%xqkl-X6OY+ma}X`VF|!0A%Bj`ie7yYTO;MxiqA>D z(r#ZInF$xN74~7-92t+S1!7G(lPYRlJf%YT=C%-z&iv@jwYIlduceBNkEh{(e*@8f zoeeH1$fK5rRV8NtKH>#rB~rSu!QUG%)W20IJH5sy(~i#Og-VqFMzBx_fq=exxCfmZ zMNT;WQ&%Ag!5F^W9fXGrAAjOk8;jkFU%F{imXR-d6=kclJ*N?w_w4FBb)rg*b!l%2 zA@-Y}wq~Jb^_(d^%HDyy*U-1evbNF%9{ip4$t% zfvuZ}=I4W*m^b3yAnW0+eJbad`nT-!yeP&adWQbL%*(U zM~QTT>DPV&?8I%?rm5;eLWxUXMbOKLxh|=VWmw`XxpdvIe-i$#0L+92=sT?z;@5O2 z>!yKX`z^?JefE2{cBB|F;|ivCXlywUtI-uhl$lafIXiu`Qu z0#xKZmm)P6+V~a}ARKmvl;v7K(#;YXcCQ+DF1>jFxp2!X z6NGlpLg;xON3v8wpB#)=dpX_>=#)LBtF}!#?hZ1OEcXW0JR0a2|jT@HTU2vpf6=Z^@FDZ!0xj zHdp=1sK0B|_4{#?2h9q>+NuUqnG3X)m#Vacid7y;RK@<0cF?z5C{Fo_fQx?rP?R`E z9idYF!EaSs`QOqS zDd6vD>G_{b2E6!2%y_wt?3n58ok3nVzxM??Zz%_r5CfpWdZ3Aa0-%Yfqs<&#QX%tU zL`fi;=s$RlgSSdJCvbglPr9-@O_GXRBNoWAfkE{VLzwnl2!d)y{T^c88V1_a!6ge` zgbV;z`h*9IYmP-XrOObEBXM!C-kM^g~r=i(v z+cKBg?bbigOOw#%NVX=lv!5t2SVskv^ZyjYi{?^?7tw^~g4+((|7=W%X7E_Fx9Z#x z$ikVt$#gS&T*Z8JmFe($d@FgHp8U=!S?WCKJQaDBw|3)L8DNA|9_7@O{r9eWg`0ZL zCq=8vTCV5JD`3XNZ@(Y6d=RqV3?QXV@lr89vpMqh0{;05Ca^QRp9Bk% zf|d<@o?9awwasBvzi`Kl}01#G3y*Q+Z>C$9Yxc7)2Cf_FQYzUfXg{4 zI*UvTmZ%a|_}Dlx6L>z;o01>mB|>yPhCext5`@G2D{PW(ew8&E$GCU_4gmN5qu@Xjj0xK$3fF&`{RvR zl4kos(2Y8W;iCe8fpKYb5$h@oKO`9k(pjYjWUg%E_n3;SlhE9ZSH z=K=qzm4|-;8J%96-*%>&QN9TlvHYyfPnXGC(|8~-zHVWyR$4a-#5(WHlD9$Goe9IV)a= zyx;;Gy)Njc(IVskU57ZmC*XMe_B{J~*txg2aV(qZ4pfjhL+L5Qh)TSH5fUDY7Fb#K zD1)7+IgVMFyRJx1F5?t$%?exgXzllCtu4ngCw`AOT*$jx1hy72s#tU!C|X_SDmH}B zSmm(dH3prH*i$KdhUSAz(HAdWB5JNx|7p@?A2h4)w^&O|i2Mq~=*kI2%iB7@CGitk zcnN?koMj4T_i^*S;!i2#+%UWNDoP+`fhy*Gcrcrwvqz_{uj^c{_}P)D#$_^EF>5As z2ERAHLLbb|LG=8%Y&(?K)q)YkRTK(v>lifc8naFAV;siT8)_ zx&DZO^$|B}_@S^c_j#Mr_30|mkt-e*f7y#*pCAZ)6rgFvh^;LUdR;8(UqB$6B>L_+ zzdUmNR8$4fkQ|kyUmm>=j|8pO-`pJ>*J6dhh45(lP-Und%&~N5YUyZV%_@1ak_FT^ zv6ZF)Hor67)>Fpl2lk3W%q>Gx78_S2<5eVo-%E(@n6P=pJnv=1MWXrkU3DQZbI|${ zTn79V0m~2OUj+j}Zt`mH2H#&x>rJh+<2AeHK=k~bARs}R@CSX{#&zJZG5s) z`2Yio`z-NYq^dAqMN%WL4WEZ^;7D<{fB`q|){TSq`t(YZN^~0GDQ4XaMsvy6K4lk= zB5Dd>E++#ofQL(u59;L}Z7 zN}WE6^1oq--X7hTk)u|VPj%i(a;_t!o{doM$xVAQi{sZ;F_8*2ISwD^uX_Oh2$r0( ztE70SQC7x!?*>Ypcy@g{ORBKlOPCsmS9!)s5F6>*dpmab?vEmuDhZ_{(Vf+zQ?80G z(DkVVcfC_t{W*Dvmd8`|ic@opbeLz{3pMPv-v2uZN{ET`2aEDOsjq1h{65mR5>hjHKO^!d6Gm@3hpWr`PQmOWsS8K}Yi6Ey9pnUn z?V5tf-9x$B4`J*Q(4xC_)_K z{&eWfZi!*@=KnxMW~WaKn-ncMWIIC0}fjWn>Y6VE{%eyLzN9DTom*xd>&~*2V zltD5M+)&M~hBe7OG!V&T0Yx^DkcEMX6L7;3rP`P*&&azjM8nbZen{$4os8(blEfY1 zL~r)OvROi`D}nRSc{))(Lrkng&Fc#Wq#8A`E?EBOH;~It#|I0kmgGVrHFcp(sXwnP z3OdTyceas<<7K8hbqmB7n2ESirbgF0-7=u`Xf7E3;oI9TQ8OjIPTV((@s^wjVj{;3 z>}b|+908xxZ-|D_z?0s zh`4yTyUSRs#|~0vv{J$0{(%z1>JyY9IwptLR%lXsab%w#>-(9`A(Q$GRbGKICSa(o zw3}~Ckt#+i&VJB)cI;WN&2;I_$YK|XJsDQ(2c&3Rd|Pml%cBxGhi%P*_S!oA*_-7G zUC?1o>k`PwoU7)e^ZuI&f4}YdZp_7%%?5RtxdAJ|&W;CU*w)24FnzLWq@iPhLnTT# z_zkE!+pz9pOB2vr!&R4bewp_F+I!EaroXLQI02L*y(%4~SCuYE6Qnn((gH~Dp!574+f2ojOrYorTEF9Fitobx~D8SnS|>5lv4Lq;+(#?Jn&UDn!j&b9Xc zgjU-WJr~fDt0NwC?&o6l07PGCFQ`OFoH5S`nw_W~m2NPK3Ck?&YyaeN7SO-O&m+G_ zp_-Z7R{dwt>L@$?~JnQExR(D$W z(U>jo26To64+K%GlCS_&hZ1$Z~c_8 z8gAVk24=I69FU2MrlWtdOX|cF>xk@ko42FhezW;-AZS$mEy*fdTlZ%p!yl&5W2=Mt zq928!3e5L*s;7#4qdGi-3yuCTVXl|^H-pOn+;7Z%7=w`mqV`T4wP>Vid4K+AZh37@oxO#-8g_ZL}fbHl-SCGBoXFBUc~B0 zlKauxs^{gWUvX`rA#tTf%iT71jmwM+MoM#q4G$??gqy|eM3mT}2fzv=NxeNOKO04L zHh*ase5C#FXxohJ<^&PB z#6*w0hHbg3kD69lp^k7vSv|`GMU#A@^G)uAih!=SIgp(e4o+ST1 z@bqx|)@9_oZH^gC_~|9gZc^MVEf_Tt4ceK>xg|FC<1Tr2H=W^Fhvf1rlMj(WsU$#$ zEuJ5DydeM?$dmVrCH(j^okU6&kv02tpIv>JpLs2V-QETP9 zE>f&d%n$4Xi19fVOk8i#P7i-SRVKOqED7K@KhmrwoztiJTAoy*Kb)&ZzZc4`S1HJJ zm_7a~=%gatLu`vl>Y=e7SySoa=GQ7M4}#d8@uUQ8y4mAQ6I#yd3Rl{PF{Q<~>Ga@b zN7aetNyXEGuHm}tG_d2G+iEFErO$?4E;Vz{F6~7dPn6^D4|uce18+1Bie})-yt69p z3mVbgTZN&f1=b%l5Mh5=Uw2AckIJ*N&(0rMg`D^&jVa}DEaW87qYOmz6+fqmOvZ-9 zGK-XASHz-B*smEIL?*%~pYt7L8i2?NX8zov)#bH+2wH$1<-QDk)aTsZoW`4Ckdee% z(Qt=CqkNjj+Ir0MG25bld;P%Em>Gv9xpP-GM*iedT=xoO-gOiOSV0g0FP8}U%I=qI zcdy>}m|4lh0~skW>tF)B#TFz1Wq6An3?vJwG+&`|03_Xc3(cmBnk}Va?BMZ*+R8 z&e$%!Jm%DI^B7sps@NLn9-f%E`_|gw)_v=aG1qUVq8vakJdIxd6wC0&U5pSMS?994 zp>a4H`G%JJ06%z&&(?MyTu?=EEt6>JUgw0m%6l?a3UqFaY^7UFpmx z$eT6mIw`U{{*m4}iEnFAS=W?>2R;n7)F%~!C&hgnGO-iN)Xi3qHMSC)%`}<{lo1?|)D+st-vb#@yqGf9i&A(vl$?V|9t2IsRwr%``#+eQ$OHVECMx|ioFo$XczvFqM?aZy zFid`o4BBP$y9xw$gM-*oqCYFAjxXrN%2PYL+_$#P{Zu)RS?SwutvY^s>-m({kV&6~ zSu&4VW{$var~6Xy$~NYu-~l(FvHvh?qPVvvpW7z8q~9BxeT2VX^WO-WxA reader for OpenDocument files + Un lecteur de fichiers OpenDocument + +

+ OpenDocument Viewer opens the files of the open standard OpenDocument + and shows them, with no office suite to hand. +

+

It opens:

+
    +
  • texts (.odt, .fodt)
  • +
  • spreadsheets (.ods, .fods)
  • +
  • presentations (.odp, .fodp)
  • +
  • drawings (.odg) and formulas (.odf)
  • +
+

+ OpenDocument Format is the one standard of the office published by the + ISO and free to use: the viewer reads a file whatever wrote it. It is + light, and spares opening a suite of the office or sending the document + who knows where. +

+
+ +

+ Le Lecteur OpenDocument ouvre les fichiers au standard ouvert OpenDocument + et les affiche sans avoir besoin d’une suite bureautique. +

+

Il ouvre :

+
    +
  • les textes (.odt, .fodt)
  • +
  • les tableurs (.ods, .fods)
  • +
  • les présentations (.odp, .fodp)
  • +
  • les dessins (.odg) et les formules (.odf)
  • +
+

+ OpenDocument Format est la seule norme bureautique ISO publiée et libre : + le lecteur peut lire le fichier quel que soit le logiciel qui l’a écrit. + Le lecteur est léger et évite d’ouvrir une suite bureautique ou d’envoyer + les données on ne sait où. +

+
+ org.webodf.OpenDocumentViewer.desktop + https://webodf.org/ + https://github.com/webodf/WebODF/issues + + opendocumentviewer-desktop + + + Office + Viewer + + + + + + diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake index e837149e8..d8cd17fcb 100644 --- a/programs/opendocumentviewer-desktop/packaging.cmake +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -188,10 +188,18 @@ if (UNIX AND NOT APPLE) COMMAND ${CMAKE_COMMAND} -E make_directory ${VIEWER_PRODUCTS} COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} --prefix ${VIEWER_APPDIR}/usr + # LDAI_OUTPUT is the name the plugin of the AppImage reads + # today, OUTPUT the one it read before and warns against. The + # desktop file is named rather than left to be found: the tool + # takes the first one of the directory otherwise, which is this + # one alone today and would be another the day a second is + # installed. COMMAND ${CMAKE_COMMAND} -E env - OUTPUT=${VIEWER_APPIMAGE} + LDAI_OUTPUT=${VIEWER_APPIMAGE} ${VIEWER_QMAKE} ${LINUXDEPLOY} --appdir ${VIEWER_APPDIR} + --desktop-file + ${VIEWER_APPDIR}/usr/share/applications/org.webodf.OpenDocumentViewer.desktop --plugin qt --output appimage COMMAND ${CMAKE_COMMAND} -E echo "Wrote ${VIEWER_APPIMAGE}" DEPENDS opendocumentviewer-desktop From e94fd665b8b589b178b51be2e5da66f279cba0b2 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 299/385] Left the flatpak out where the machine cannot write it. --- .../packaging.cmake | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake index 00c7f15d1..337346cc3 100644 --- a/programs/opendocumentviewer-desktop/packaging.cmake +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -195,8 +195,18 @@ if (UNIX AND NOT APPLE) COMMENT "The AppImage of the viewer of the desktop") endif () - find_program(FLATPAK_BUILDER flatpak-builder) - find_program(FLATPAK flatpak) + # A machine where the tool cannot write the flatpak, for want of the + # rights its build dir asks for, leaves it out rather than stopping the + # build of everything else. + option(WEBODF_PACKAGE_FLATPAK "Make the flatpak of the viewer" ON) + if (WEBODF_PACKAGE_FLATPAK) + find_program(FLATPAK_BUILDER flatpak-builder) + find_program(FLATPAK flatpak) + find_program(OSTREE ostree) + else () + set(FLATPAK_BUILDER "") + set(FLATPAK "") + endif () # The manifest of the flatpak names the runtime of KDE, which carries qt # and its webengine, so nothing of qt is built here: the tool reads it and @@ -214,6 +224,7 @@ if (UNIX AND NOT APPLE) # one that will do is the least version of qt the viewer is built with, # see "find_package(Qt6 ...)" in the root: a machine that kept only an # older branch has nothing to build against, and is told so. + set(VIEWER_FLATPAK_REPO ${CMAKE_CURRENT_BINARY_DIR}/flatpak-repo) set(VIEWER_FLATPAK_RUNTIME_LEAST "6.4") set(WEBODF_FLATPAK_RUNTIME "" CACHE STRING "The branch of org.kde.Sdk the flatpak is built against, the newest installed one by default") @@ -283,15 +294,30 @@ if (UNIX AND NOT APPLE) endif () if (FLATPAK_BUILDER AND VIEWER_HAS_FLATPAK_SDK) + # The repository the flatpak is exported to refuses to write when + # less than a part of the disk is free, three hundredths of it by + # default, which is a hundred gigabytes on a disk of three terabytes: + # a size is asked for instead, as the flatpak of this viewer weighs + # some tens of megabytes. + if (OSTREE) + set(VIEWER_FLATPAK_ROOM + COMMAND ${OSTREE} init --repo=${VIEWER_FLATPAK_REPO} + --mode=archive-z2 + COMMAND ${OSTREE} config --repo=${VIEWER_FLATPAK_REPO} + set core.min-free-space-size 500MB) + else () + set(VIEWER_FLATPAK_ROOM "") + endif () add_custom_target(package-flatpak COMMAND ${CMAKE_COMMAND} -E make_directory ${VIEWER_PRODUCTS} - COMMAND ${FLATPAK_BUILDER} --force-clean --repo=${CMAKE_CURRENT_BINARY_DIR}/flatpak-repo + ${VIEWER_FLATPAK_ROOM} + COMMAND ${FLATPAK_BUILDER} --force-clean --repo=${VIEWER_FLATPAK_REPO} ${CMAKE_CURRENT_BINARY_DIR}/flatpak-build ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_ID}.yml COMMAND ${FLATPAK_BUILDER} --run ${CMAKE_CURRENT_BINARY_DIR}/flatpak-build ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_ID}.yml true - COMMAND flatpak build-bundle ${CMAKE_CURRENT_BINARY_DIR}/flatpak-repo + COMMAND flatpak build-bundle ${VIEWER_FLATPAK_REPO} ${VIEWER_PRODUCTS}/${VIEWER_ID}-${WEBODF_VERSION}.flatpak ${VIEWER_ID} DEPENDS opendocumentviewer-desktop COMMENT "The flatpak of the viewer of the desktop") @@ -301,11 +327,16 @@ if (UNIX AND NOT APPLE) if (FLATPAK_BUILDER) WEBODF_PRODUCT_MISSING("the flatpak" "${VIEWER_FLATPAK_SDK}") set(VIEWER_NO_FLATPAK - "${VIEWER_FLATPAK_SDK} is not installed: the flatpak is built against the runtime of KDE, which carries qt, and against the base app of qt, which carries its webengine. Install them with: flatpak install flathub org.kde.Platform//${VIEWER_FLATPAK_RUNTIME} org.kde.Sdk//${VIEWER_FLATPAK_RUNTIME} ${VIEWER_FLATPAK_BASE}") + "${VIEWER_FLATPAK_SDK} is not installed: the flatpak is built against the runtime of KDE, which carries qt, and against the base app of qt, which carries its webengine. Install them with: flatpak install --user flathub org.kde.Platform//${VIEWER_FLATPAK_RUNTIME} org.kde.Sdk//${VIEWER_FLATPAK_RUNTIME} ${VIEWER_FLATPAK_BASE}") else () - WEBODF_PRODUCT_MISSING("the flatpak" "flatpak-builder") - set(VIEWER_NO_FLATPAK - "flatpak-builder is not installed: the manifest is written in ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_ID}.yml, see https://docs.flatpak.org/") + if (WEBODF_PACKAGE_FLATPAK) + WEBODF_PRODUCT_MISSING("the flatpak" "flatpak-builder") + set(VIEWER_NO_FLATPAK + "flatpak-builder is not installed: the manifest is written in ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_ID}.yml, see https://docs.flatpak.org/") + else () + set(VIEWER_NO_FLATPAK + "The flatpak was left out by WEBODF_PACKAGE_FLATPAK=OFF: configure again with -DWEBODF_PACKAGE_FLATPAK=ON to make it.") + endif () endif () add_custom_target(package-flatpak COMMAND ${CMAKE_COMMAND} -E echo "${VIEWER_NO_FLATPAK}" From b3c03081f391d5f799c7ed35052afe653a7a802e Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 300/385] Copied the package of this build alone into the products. --- .../data/copy-packages.cmake | 19 +++++++++---------- .../packaging.cmake | 2 ++ 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/programs/opendocumentviewer-desktop/data/copy-packages.cmake b/programs/opendocumentviewer-desktop/data/copy-packages.cmake index 3816d12f9..fba57a631 100644 --- a/programs/opendocumentviewer-desktop/data/copy-packages.cmake +++ b/programs/opendocumentviewer-desktop/data/copy-packages.cmake @@ -1,12 +1,11 @@ -# Copy the packages CPack wrote into the products of the build. The name of a -# package is settled by CPack itself, so it is looked for rather than written -# again here, and what CPack leaves beside it is left where it is. -file(GLOB PACKAGES "${DIR}/*.${EXT}") -if (NOT PACKAGES) - message(FATAL_ERROR "No package of the kind ${EXT} was written in ${DIR}.") +# Copy the package CPack wrote into the products of the build. The one of this +# build is named, and not every package of the kind that is there: CPack +# leaves the packages of the builds that went before beside it, whose names +# hold their own version, and they are none of this build's business. +set(PACKAGE "${DIR}/${NAME}.${EXT}") +if (NOT EXISTS "${PACKAGE}") + message(FATAL_ERROR "No package was written as ${PACKAGE}.") endif () file(MAKE_DIRECTORY "${DEST}") -foreach (PACKAGE ${PACKAGES}) - file(COPY "${PACKAGE}" DESTINATION "${DEST}") - message("Wrote ${PACKAGE}") -endforeach () +file(COPY "${PACKAGE}" DESTINATION "${DEST}") +message("Wrote ${PACKAGE}") diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake index e7afcc33f..c6380ea02 100644 --- a/programs/opendocumentviewer-desktop/packaging.cmake +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -123,6 +123,7 @@ if (DPKG_DEB) --config ${CMAKE_BINARY_DIR}/CPackConfig.cmake COMMAND ${CMAKE_COMMAND} -DDIR=${VIEWER_CPACK_DIR} -DDEST=${VIEWER_PRODUCTS} -DEXT=deb + -DNAME=${CPACK_PACKAGE_FILE_NAME} -P ${CMAKE_CURRENT_SOURCE_DIR}/data/copy-packages.cmake DEPENDS opendocumentviewer-desktop COMMENT "The package of debian of the viewer of the desktop") @@ -140,6 +141,7 @@ if (RPMBUILD) --config ${CMAKE_BINARY_DIR}/CPackConfig.cmake COMMAND ${CMAKE_COMMAND} -DDIR=${VIEWER_CPACK_DIR} -DDEST=${VIEWER_PRODUCTS} -DEXT=rpm + -DNAME=${CPACK_PACKAGE_FILE_NAME} -P ${CMAKE_CURRENT_SOURCE_DIR}/data/copy-packages.cmake DEPENDS opendocumentviewer-desktop COMMENT "The package of fedora of the viewer of the desktop") From b579b430902a79b7993ac117bea256fe7bd26417 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 301/385] Written a heading on the page of the text it heads. --- webodf/lib/odf/TextLayout.js | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 6dd737986..ddc857bed 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2092,6 +2092,21 @@ odf.TextLayout = function TextLayout() { return head >= askedNumber(style.getPropertyValue("orphans"), 2) && tail >= askedNumber(style.getPropertyValue("widows"), 2); } + /** + * Whether a paragraph is written on the page of the one that follows it. + * + * "fo:keep-with-next" says it of a heading, that an office never leaves + * alone at the foot of a page. It is read from the style the browser + * worked out, under the name css gives it. + * @param {!Element} element + * @return {!boolean} + */ + function keepsWithWhatFollows(element) { + var style = runtime.getWindow().getComputedStyle(element); + return style + ? style.getPropertyValue("break-after") === "avoid" + : false; + } /** * Whether a node was marked as beginning a page of its own. * @param {!Node} node @@ -2568,6 +2583,8 @@ odf.TextLayout = function TextLayout() { held, /**@type{!number}*/ lines, + /**@type{?Element}*/ + keeper, /**@type{!number}*/ guard, /**@type{!{left:!number,top:!number}}*/ @@ -2709,6 +2726,17 @@ odf.TextLayout = function TextLayout() { over = firstOverflowing(box); } } + // A heading is not left alone at the foot of a page: what asks to + // be kept with what follows it is written on the page that follows, + // with the run of paragraphs that ask the same before it, unless + // nothing would be left on the page. + keeper = box.lastElementChild; + while (keeper && keeper !== box.firstElementChild + && state.waiting.length > 0 && keepsWithWhatFollows(keeper)) { + state.waiting.unshift(keeper); + box.removeChild(keeper); + keeper = box.lastElementChild; + } // The pages that follow are filled by as many at a time as the page // that was just filled took: a page of a hundred short paragraphs is // not read a hundred times. From 43d9210f097e4298d43ffc7735f67b230feac2d7 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 302/385] Drawn the pages of every size a document writes, in columns. --- webodf/CMakeLists.txt | 1 + webodf/lib/odf/TextLayout.js | 296 +++++++++++++++++++++++--- webodf/tests/manifest.json | 6 + webodf/tests/odf/PageLayoutTests.js | 311 ++++++++++++++++++++++++++++ webodf/tests/tests.js | 2 + 5 files changed, 589 insertions(+), 27 deletions(-) create mode 100644 webodf/tests/odf/PageLayoutTests.js diff --git a/webodf/CMakeLists.txt b/webodf/CMakeLists.txt index dd8db3fd6..fd9c7fd8d 100644 --- a/webodf/CMakeLists.txt +++ b/webodf/CMakeLists.txt @@ -61,6 +61,7 @@ set(TESTJSFILES tests/odf/StyleCacheTests.js tests/odf/FormattingTests.js tests/odf/LayoutTests.js + tests/odf/PageLayoutTests.js tests/odf/ListStyleToCssTests.js tests/odf/ObjectNameGeneratorTests.js tests/odf/MaliciousDocumentTests.js diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 96c35a77c..6c9503522 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -101,6 +101,12 @@ odf.TextLayout = function TextLayout() { * @type{!number} */ columnPages = 1, + /** + * Where each page begins across, when the text is broken into + * columns: the pages stand beside one another there. + * @type{!Array.} + */ + columnPageOrigins = [], /** * How many pages are drawn at the most. A document of a thousand pages * is already far more than a reader shows at once, and the bound is @@ -1389,6 +1395,23 @@ odf.TextLayout = function TextLayout() { var dims = self.at(page); return page === 0 ? dims.firstPage : dims.otherPages; }; + /** + * The changes of master page the document writes, each with the + * paragraph it begins at, or none for the first pages. + * @return {!Array.} + */ + this.sequence = function () { + return sequence; + }; + /** + * Say which page each change of master page begins at, where it is + * known rather than read from the pages that are drawn. + * @param {!Array.} pages + * @return {undefined} + */ + this.beginsAt = function (pages) { + starts = pages; + }; /** * Read from the pages that are drawn which page each change of master * page falls on, and answer whether that moved anything. @@ -1527,7 +1550,7 @@ odf.TextLayout = function TextLayout() { // of text, and beside it when the text is broken into columns, // one column to a page. left = columnsMode - ? n * (dims.pageWidth + dims.pageSeparation) + ? columnPageOrigins[n] || 0 : 0; top = columnsMode ? 0 @@ -1900,6 +1923,84 @@ odf.TextLayout = function TextLayout() { /**@type{!HTMLStyleElement}*/(element).sheet ); } + /** + * Take away the boxes that hold the runs of pages, giving the text back + * the paragraphs they hold. + * @param {!Element} text + * @return {undefined} + */ + function unwrapColumnRuns(text) { + var /**@type{!Array.}*/ + runs = [], + /**@type{?Element}*/ + node = text.firstElementChild; + while (node) { + if (node.className === "webodf-pageRun") { + runs.push(node); + } + node = node.nextElementSibling; + } + runs.forEach(function (run) { + while (run.firstChild) { + text.insertBefore(run.firstChild, run); + } + text.removeChild(run); + }); + } + /** + * Put each run of pages written on the same master page in a box of its + * own. + * + * A run of columns is of one width and of one height, and a document may + * write its pages on master pages of several sizes, a page laid on its + * side among pages laid upright: each run is broken into columns on its + * own, and the runs stand beside one another, so the pages of the + * document follow one another whatever their size. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!PagePlan} plan + * @return {!Array.} + */ + function wrapColumnRuns(odfroot, plan) { + var text = /**@type{!Element}*/(odfroot.body.lastElementChild), + doc = /**@type{!Document}*/(text.ownerDocument), + htmlns = doc.documentElement.namespaceURI, + sequence = plan.sequence(), + /**@type{!Array.}*/ + runs = [], + /**@type{!Array.}*/ + nodes = [], + /**@type{!Array.}*/ + begins = [], + /**@type{!Element}*/ + run, + /**@type{?Element}*/ + node; + unwrapColumnRuns(text); + sequence.forEach(function (entry, index) { + if (index > 0 && entry.paragraph) { + begins.push(/**@type{!Element}*/(entry.paragraph)); + } + }); + node = text.firstElementChild; + while (node) { + nodes.push(node); + node = node.nextElementSibling; + } + run = doc.createElementNS(htmlns, "div"); + run.className = "webodf-pageRun"; + text.appendChild(run); + runs.push(run); + nodes.forEach(function (element) { + if (begins.indexOf(element) !== -1 && run.firstChild) { + run = doc.createElementNS(htmlns, "div"); + run.className = "webodf-pageRun"; + text.appendChild(run); + runs.push(run); + } + run.appendChild(element); + }); + return runs; + } /** * Break the text into columns, one column to a page. * @@ -1909,19 +2010,22 @@ odf.TextLayout = function TextLayout() { * do. The columns stand beside one another, and each page is drawn over * the column that carries it. * @param {!odf.ODFDocumentElement} odfroot - * @param {!odf.TextLayout.PageDimensions} dims - * @return {!number} how many pages the text was broken into + * @param {!PagePlan} plan + * @param {!Array.} runs + * @return {!Array.} how many pages each run was broken into */ - function breakIntoColumns(odfroot, dims) { - var text = /**@type{!HTMLElement}*/(odfroot.body.lastElementChild), + function breakIntoColumns(odfroot, plan, runs) { + var text = /**@type{!Element}*/(odfroot.body.lastElementChild), doc = /**@type{!Document}*/(text.ownerDocument), sheet = ownStyleSheet(doc), + /**@type{!Array.}*/ + pages = [], /**@type{!number}*/ - width = dims.pageWidth - dims.marginLeft - dims.marginRight, + sofar = 0, /**@type{!number}*/ - height = dims.pageHeight - dims.marginTop - dims.marginBottom, + round = 0, /**@type{!number}*/ - pitch = dims.pageWidth + dims.pageSeparation, + first = 0, /**@type{!number}*/ i; for (i = sheet.cssRules.length - 1; i >= 0; i -= 1) { @@ -1933,23 +2037,118 @@ odf.TextLayout = function TextLayout() { }); sheet.insertRule("@namespace webodfhelper url(" + webodfhelperns + ");", sheet.cssRules.length); - // The gutter between two columns holds the margins of the two pages - // it parts, and the gap the reader sees between them. - sheet.insertRule("office|text {" - + "column-width:" + width + "px;" - + "column-gap:" + (pitch - width) + "px;" - + "column-fill:auto;" - + "height:" + height + "px;" - + "width:auto;" - + "margin:" + dims.marginTop + "px 0 0 " + dims.marginLeft - + "px;" - + "}", sheet.cssRules.length); + // The runs stand beside one another, and the text no longer holds + // the height of a page: each run holds its own. + // The runs stand beside one another on one line, so neither the + // body nor the text may hold them to the width of a page, and a run + // may not be sent to the next line. + sheet.insertRule("office|body {width:auto;}", sheet.cssRules.length); + // The margins of the page are set on each run, so the text itself + // no longer carries them: they would be taken twice, and the last + // lines of a page would be written in the margin of its foot. + sheet.insertRule("office|text {height:auto;width:auto;margin:0;" + + "padding:0;white-space:nowrap;}", sheet.cssRules.length); + sheet.insertRule(".webodf-pageRun {display:inline-block;" + + "vertical-align:top;white-space:normal;}", + sheet.cssRules.length); // What the document asks to be written on a new page begins a new // column, which the browser answers for on its own. - sheet.insertRule("*[webodfhelper|breakbefore] {" - + "break-before:column;" - + "}", sheet.cssRules.length); - return Math.max(1, Math.round(text.scrollWidth / pitch)); + sheet.insertRule("*[webodfhelper|breakbefore] {break-before:column;}", + sheet.cssRules.length); + runs.forEach(function (run, index) { + var /**@type{!odf.TextLayout.PageDimensions}*/ + dims = plan.at(sofar), + /**@type{!number}*/ + width = dims.pageWidth - dims.marginLeft - dims.marginRight, + /**@type{!number}*/ + height = dims.pageHeight - dims.marginTop - dims.marginBottom, + /**@type{!number}*/ + pitch = dims.pageWidth + dims.pageSeparation, + /**@type{!number}*/ + broken; + run.setAttributeNS(webodfhelperns, "webodfhelper:run", + String(index)); + // The gutter between two columns holds the margins of the two + // pages it parts, and the gap the reader sees between them. + sheet.insertRule(".webodf-pageRun[webodfhelper|run=\"" + index + + "\"] {" + + "column-width:" + width + "px;" + + "column-gap:" + (pitch - width) + "px;" + + "column-fill:auto;" + + "height:" + height + "px;" + // The margins of the page are the margins of the run, and + // the gap a reader sees between two pages is put after the + // last column of it, so that the run that follows begins + // beyond the edge of the page and not on it. + + "margin:" + dims.marginTop + "px " + + (dims.marginRight + dims.pageSeparation) + "px " + + dims.marginBottom + "px " + dims.marginLeft + "px;" + + "}", sheet.cssRules.length); + broken = Math.max(1, Math.round(run.scrollWidth / pitch)); + pages.push(broken); + sofar += broken; + }); + // A box of columns is only as wide as one column when the width is + // left to it, and the columns that follow the first hang out of it: + // the box is given the width of all its columns, so that the run + // that comes after it stands beside the last of them and not beside + // the first. The width is set, read again and set anew: a run that + // was given too few columns pours what is left into the last one. + /** + * @return {undefined} + */ + function setWidths() { + var /**@type{!number}*/ + count = 0; + first = sheet.cssRules.length; + pages.forEach(function (broken, index) { + var /**@type{!odf.TextLayout.PageDimensions}*/ + dims = plan.at(count), + /**@type{!number}*/ + width = dims.pageWidth - dims.marginLeft + - dims.marginRight, + /**@type{!number}*/ + pitch = dims.pageWidth + dims.pageSeparation; + sheet.insertRule(".webodf-pageRun[webodfhelper|run=\"" + + index + "\"] {width:" + + (broken * pitch - (pitch - width)) + "px;}", + sheet.cssRules.length); + count += broken; + }); + } + /** + * @return {!boolean} whether every run holds all its columns + */ + function widthsSettle() { + var /**@type{!number}*/ + count = 0, + /**@type{!boolean}*/ + settled = true; + pages.forEach(function (broken, index) { + var /**@type{!odf.TextLayout.PageDimensions}*/ + dims = plan.at(count), + /**@type{!number}*/ + pitch = dims.pageWidth + dims.pageSeparation, + /**@type{!number}*/ + asked = Math.max(1, + Math.round(runs[index].scrollWidth / pitch)); + if (asked > broken) { + pages[index] = asked; + settled = false; + } + count += broken; + }); + return settled; + } + setWidths(); + while (round < 2 && !widthsSettle()) { + while (sheet.cssRules.length > first) { + sheet.deleteRule(sheet.cssRules.length - 1); + } + setWidths(); + round += 1; + } + return pages; } /** * Tell the browser which paragraphs are written on a new page. @@ -1984,15 +2183,58 @@ odf.TextLayout = function TextLayout() { * @return {undefined} */ function layoutInColumns(odfroot, pagesDiv) { - var plan = new PagePlan(odfroot), + var /**@type{!Element}*/ + text = /**@type{!Element}*/(odfroot.body.lastElementChild), + /**@type{!PagePlan}*/ + plan, + /**@type{!Array.}*/ + runs, + /**@type{!Array.}*/ + perRun, + /**@type{!Array.}*/ + begins = [], + /**@type{!number}*/ + total = 0, + /**@type{!number}*/ + ground = 0, /**@type{!number}*/ - pages; + left = 0; while (pagesDiv.firstChild) { pagesDiv.removeChild(pagesDiv.firstChild); } + // The boxes of a layout that went before are taken away first: the + // paragraphs of the document are read to know where a master page + // changes, and they are read from the text itself. + unwrapColumnRuns(text); + plan = new PagePlan(odfroot); markPageBreaks(odfroot); - pages = breakIntoColumns(odfroot, plan.at(0)); - columnPages = Math.min(pages, maxPages); + runs = wrapColumnRuns(odfroot, plan); + perRun = breakIntoColumns(odfroot, plan, runs); + // Where each run begins, in pages and in pixels: a page is drawn + // over the column that carries it, and a run of another size moves + // the runs that follow it. + columnPageOrigins = []; + ground = odfroot.body.getBoundingClientRect().left; + perRun.forEach(function (pages, index) { + var /**@type{!odf.TextLayout.PageDimensions}*/ + dims = plan.at(total), + /**@type{!number}*/ + pitch = dims.pageWidth + dims.pageSeparation, + /**@type{!number}*/ + n; + // Where the run stands is read from the run itself: the boxes + // of the runs follow one another as the browser lays them out, + // and a page is drawn over the column that carries it. + left = runs[index].getBoundingClientRect().left - ground + - dims.marginLeft; + begins.push(total); + for (n = 0; n < pages; n += 1) { + columnPageOrigins.push(left + n * pitch); + } + total += pages; + }); + plan.beginsAt(begins); + columnPages = Math.min(total, maxPages); drawPageFurniture(odfroot, plan, pagesDiv, readMeta(odfroot)); } /** diff --git a/webodf/tests/manifest.json b/webodf/tests/manifest.json index 9a0f88428..6de06d03c 100644 --- a/webodf/tests/manifest.json +++ b/webodf/tests/manifest.json @@ -151,6 +151,12 @@ "odf.OdfUtils", "webodfcore.UnitTester" ], + "odf.PageLayoutTests": [ + "odf.Namespaces", + "odf.OdfCanvas", + "odf.OdfContainer", + "webodfcore.UnitTester" + ], "odf.StyleCacheTests": [ "odf.OdfContainer", "odf.StyleCache", diff --git a/webodf/tests/odf/PageLayoutTests.js b/webodf/tests/odf/PageLayoutTests.js new file mode 100644 index 000000000..9581ea1cf --- /dev/null +++ b/webodf/tests/odf/PageLayoutTests.js @@ -0,0 +1,311 @@ +/** + * Copyright (C) 2026 Daniel Berthereau + * + * @licstart + * This file is part of WebODF. + * + * WebODF is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License (GNU AGPL) + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * WebODF is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with WebODF. If not, see . + * @licend + * + * @source: http://www.webodf.org/ + * @source: https://github.com/webodf/WebODF/ + */ + +/*global runtime, webodfcore, odf*/ + +/** + * The pages a text is drawn over: their size, their number, and the paragraphs + * the document asks to be written on a new one. + * @constructor + * @param {!webodfcore.UnitTestRunner} runner + * @implements {webodfcore.UnitTest} + */ +odf.PageLayoutTests = function PageLayoutTests(runner) { + "use strict"; + var r = runner, + t, + officens = odf.Namespaces.officens, + webodfhelperns = "urn:webodf:names:helper"; + + /** + * Put the styles and the text of a document written as one string of xml in + * a container, and draw it over pages, one column to a page. + * @param {!string} xml the children of "office:document-content" + * @param {!function():undefined} callback + * @return {undefined} + */ + function draw(xml, callback) { + var container = new odf.OdfContainer( + odf.OdfContainer.DocumentType.TEXT + ), + root = container.rootElement, + parsed = runtime.parseXML( + "" + + xml + + "" + ), + doc = root.ownerDocument; + + /** + * @param {!Element} into + * @param {!string} name + * @return {undefined} + */ + function fill(into, name) { + var found = parsed.documentElement.getElementsByTagNameNS(officens, + name), + copy, + i; + while (into.firstChild) { + into.removeChild(into.firstChild); + } + for (i = 0; i < found.length; i += 1) { + copy = doc.importNode(found.item(i), true); + while (copy.firstChild) { + into.appendChild(copy.firstChild); + } + } + } + fill(root.styles, "styles"); + fill(root.automaticStyles, "automatic-styles"); + fill(root.masterStyles, "master-styles"); + fill(root.body.getElementsByTagNameNS(officens, "text")[0], "text"); + container.saveAs("pagelayouttests.odt", function () { + t.odfCanvas.addListener("statereadychange", function () { + callback(); + }); + t.odfCanvas.setPaginated(true); + t.odfCanvas.setPagesInColumns(true); + t.odfCanvas.setOdfContainer(container); + }); + } + + /** + * The sheets of the pages, from the first page to the last. + * @return {!Array.} + */ + function sheets() { + var found = t.odfCanvas.odfContainer().rootElement.ownerDocument + .getElementsByClassName("webodf-pageSheet"), + boxes = [], + i; + for (i = 0; i < found.length; i += 1) { + boxes.push(found.item(i).getBoundingClientRect()); + } + boxes.sort(function (a, b) { + return a.left - b.left; + }); + return boxes.map(function (box) { + return { + left: Math.round(box.left), + width: Math.round(box.width), + height: Math.round(box.height) + }; + }); + } + + /** + * A document of two page layouts, one upright and one laid on its side. + * @param {!string} body + * @return {!string} + */ + function twoPageLayouts(body) { + return "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + body + + ""; + } + + /** + * A document whose headings of the second rank lean on those of the first, + * which are written on a page of their own while they are not. + * @param {!string} body + * @return {!string} + */ + function headingsThatLean(body) { + return "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + body + + ""; + } + + /** + * @param {!string} style + * @param {!number} count + * @return {!string} + */ + function paragraphs(style, count) { + var text = "", + i; + for (i = 0; i < count; i += 1) { + text += "" + + "Line " + (i + 1) + " of the text of the test." + + ""; + } + return text; + } + + /** + * @param {!string} name + * @return {?Element} + */ + function paragraphOfStyle(name) { + var text = t.odfCanvas.odfContainer().rootElement.body + .getElementsByTagNameNS(officens, "text")[0], + found = text.getElementsByTagNameNS(odf.Namespaces.textns, "p"), + i; + for (i = 0; i < found.length; i += 1) { + if (found.item(i).getAttributeNS(odf.Namespaces.textns, + "style-name") === name) { + return /**@type{!Element}*/(found.item(i)); + } + } + return null; + } + + /** + * The pages of a run written on another master page are of the size that + * master page gives them, upright or laid on their side. + * @param {!function():undefined} callback + * @return {undefined} + */ + function pagesTakeTheSizeOfTheirMasterPage(callback) { + draw(twoPageLayouts(paragraphs("Standard", 40) + + "On its side." + + paragraphs("Standard", 10)), function () { + var boxes = sheets(); + t.pages = boxes.length; + r.shouldBe(t, "t.pages", "2"); + t.first = boxes[0].width + "x" + boxes[0].height; + r.shouldBe(t, "t.first", "'768x960'"); + t.second = boxes[1].width + "x" + boxes[1].height; + r.shouldBe(t, "t.second", "'960x768'"); + t.gap = boxes[1].left - (boxes[0].left + boxes[0].width); + r.shouldBe(t, "t.gap", "10"); + callback(); + }); + } + + /** + * A break is read from the first style of the line that speaks of one: a + * heading that leans on one written on a page of its own, and says for + * itself that it is not, is not. + * @param {!function():undefined} callback + * @return {undefined} + */ + function aBreakIsReadFromTheNearestStyle(callback) { + draw(headingsThatLean(paragraphs("Standard", 4) + + "First rank" + + "Second rank" + + "Third rank"), + function () { + var first = paragraphOfStyle("Heading1"), + second = paragraphOfStyle("Heading2"), + third = paragraphOfStyle("Heading3"); + t.first = first + ? first.getAttributeNS(webodfhelperns, "breakbefore") + : ""; + r.shouldBe(t, "t.first", "'true'"); + t.second = second + ? second.getAttributeNS(webodfhelperns, "breakbefore") + : "missing"; + r.shouldBe(t, "t.second", "null"); + t.third = third + ? third.getAttributeNS(webodfhelperns, "breakbefore") + : "missing"; + r.shouldBe(t, "t.third", "null"); + callback(); + }); + } + + this.setUp = function () { + t = {}; + t.odfCanvas = new odf.OdfCanvas( + webodfcore.UnitTest.provideTestAreaDiv() + ); + }; + this.tearDown = function () { + t.odfCanvas.destroy(function () { + return; + }); + t = {}; + webodfcore.UnitTest.cleanupTestAreaDiv(); + }; + this.tests = function () { + return []; + }; + this.asyncTests = function () { + return r.name([ + pagesTakeTheSizeOfTheirMasterPage, + aBreakIsReadFromTheNearestStyle + ]); + }; +}; +odf.PageLayoutTests.prototype.description = function () { + "use strict"; + return "Test the pages a text is drawn over, and where a new one begins."; +}; diff --git a/webodf/tests/tests.js b/webodf/tests/tests.js index 76ad871f2..37c65ccf8 100644 --- a/webodf/tests/tests.js +++ b/webodf/tests/tests.js @@ -44,6 +44,7 @@ runtime.loadClass("gui.TrivialUndoManagerTests"); runtime.loadClass("gui.UndoStateRulesTests"); runtime.loadClass("odf.FormattingTests"); runtime.loadClass("odf.LayoutTests"); +runtime.loadClass("odf.PageLayoutTests"); runtime.loadClass("odf.ListStyleToCssTests"); runtime.loadClass("odf.MaliciousDocumentTests"); runtime.loadClass("odf.ObjectNameGeneratorTests"); @@ -196,6 +197,7 @@ if (runtime.type() === "BrowserRuntime") { tests.push(xmldom.LSSerializerTests); tests.push(xmldom.XPathTests); tests.push(odf.LayoutTests); + tests.push(odf.PageLayoutTests); tests.push(odf.StyleCacheTests); tests.push(ops.SessionTests); tests.push(ops.OperationTests); From ad3342df85b22ec804e15f88da49ed846db67702 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 303/385] Given the text back the room a taller foot took from it. --- webodf/lib/odf/TextLayout.js | 68 ++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 3 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index f547d0b40..6586b9fa8 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3912,6 +3912,45 @@ odf.TextLayout = function TextLayout() { )); drawPageFurniture(odfroot, plan, pagesDiv, readMeta(odfroot)); } + /** + * How far the foot of a page reaches into the text of it. + * + * The foot is drawn under the text, in the margin: where it is taller + * than the margin left for it, it stands over the last lines, and this + * says by how much. + * @param {!Element} box the page + * @param {?Element} furniture what is drawn around the page + * @return {!number} nothing where the foot stands clear of the text + */ + function footOver(box, furniture) { + var bottom = box.getBoundingClientRect().bottom, + /**@type{!number}*/ + top = 0, + /**@type{!NodeList}*/ + parts, + /**@type{!ClientRect}*/ + rect, + /**@type{!number}*/ + i; + if (!furniture) { + return 0; + } + parts = furniture.getElementsByTagName("*"); + top = bottom; + for (i = 0; i < parts.length; i += 1) { + rect = /**@type{!Element}*/(parts.item(i)) + .getBoundingClientRect(); + // Only what is drawn under the middle of the page is the foot of + // it: a header stands over the text and takes nothing from it + // here. + if (rect.height > 0 + && rect.top > bottom - box.getBoundingClientRect().height + / 2) { + top = Math.min(top, rect.top); + } + } + return Math.max(0, Math.round(bottom - top)); + } /** * Give every page the size the plan gives it. * @@ -3925,13 +3964,36 @@ odf.TextLayout = function TextLayout() { * @return {undefined} */ function resizePages(plan, boxes) { + var doc = boxes.length > 0 + ? /**@type{!Document}*/(boxes[0].ownerDocument) + : null, + /**@type{?NodeList}*/ + drawn = doc + ? doc.querySelectorAll(".webodf-pageFurniture") + : null; boxes.forEach(function (box, index) { var dims = plan.at(index), + /**@type{!HTMLElement}*/ + page = /**@type{!HTMLElement}*/(box), /**@type{!string}*/ tall = (dims.pageHeight - dims.marginTop - - dims.marginBottom) + "px"; - if (/**@type{!HTMLElement}*/(box).style.height !== tall) { - /**@type{!HTMLElement}*/(box).style.height = tall; + - dims.marginBottom) + "px", + /**@type{!number}*/ + room; + if (page.style.height !== tall) { + page.style.height = tall; + } + // The foot of the page is drawn in the margin under the text, and + // the room it takes was worked out before it was drawn: a foot + // taller than that room, of a font the room was not measured + // with, would be drawn over the last line of the text. What it + // takes of the text is measured and given back to the foot. + room = drawn + ? footOver(box, /**@type{?Element}*/(drawn.item(index))) + : 0; + if (room > 0) { + page.style.height = (dims.pageHeight - dims.marginTop + - dims.marginBottom - room) + "px"; } }); } From 2ee50c5df5fda4d9aadc6add617f8a5bebcde7ba Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 304/385] Written a part at a stop on the left in the flow of its line. --- webodf/lib/odf/TextLayout.js | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 94f12963e..f38fafee0 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -1021,20 +1021,40 @@ odf.TextLayout = function TextLayout() { var /**@type{?odf.TextLayout.TabStop}*/ stop = index === 0 ? null - : stops[Math.min(index, stops.length) - 1]; + : stops[Math.min(index, stops.length) - 1], + /**@type{?odf.TextLayout.TabStop}*/ + before = index > 1 + ? stops[Math.min(index - 1, stops.length) - 1] + : null; if (!stop) { // The first part is written as the text is: it holds the // height of the line and wraps where the page ends. line.appendChild(piece); return; } + if (stop.type === "left" || stop.type === "char") { + // A part that begins at a stop on the left is written in the + // flow of the line, and what stands before it is held to the + // width of its own slot: a label longer than its slot pushes + // what follows to the right, as a tab of a text does, where + // a part laid against the stop would be written over it. + /**@type{!HTMLElement}*/(parts[index - 1]).style.display = + "inline-block"; + /**@type{!HTMLElement}*/(parts[index - 1]).style.minWidth = + Math.max(0, stop.at - (before + ? before.at + : 0)) + "px"; + piece.style.whiteSpace = "pre-wrap"; + line.appendChild(piece); + return; + } piece.style.position = "absolute"; piece.style.whiteSpace = "pre"; piece.style.top = "0"; piece.style.left = "min(" + stop.at + "px, 100%)"; if (stop.type === "center") { piece.style.transform = "translateX(-50%)"; - } else if (stop.type === "right") { + } else { piece.style.transform = "translateX(-100%)"; } line.appendChild(piece); From 42be9ec4599d380725fdbea63eb0a210e75a018a Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 305/385] Numbered a heading as its own level is written, and carried on the count. --- webodf/lib/odf/ListStylesToCss.js | 73 ++++++++++++++++++++++++++++--- webodf/lib/odf/TextLayout.js | 6 +++ 2 files changed, 72 insertions(+), 7 deletions(-) diff --git a/webodf/lib/odf/ListStylesToCss.js b/webodf/lib/odf/ListStylesToCss.js index dbdbe6604..957c7b086 100644 --- a/webodf/lib/odf/ListStylesToCss.js +++ b/webodf/lib/odf/ListStylesToCss.js @@ -255,7 +255,13 @@ // lists that actually have list items will all start with the counter value of 2 which is not desirable. // To fix this we apply another CSS rule here that overrides the counter increment rule above and // prevents incrementing the counter on the FIRST list item that has content (AKA a visible list label). - newRule = 'text|list[webodfhelper|counter-id="' + newListSelectorId + '"]'; + // A list that was cut where a page ends is written again on + // the page that follows, and what follows the cut is no + // first item of a list: the counter is held back on the + // first item of a list, and never on the first item of what + // is left of one, see "webodfhelper:continued" in + // "TextLayout.js". + newRule = 'text|list[webodfhelper|counter-id="' + newListSelectorId + '"]:not([webodfhelper|continued])'; newRule += ' > text|list-item:first-child > :not(text|list):first-child:before'; newRule += '{'; // Due to https://bugs.webkit.org/show_bug.cgi?id=84985 a value of "none" is ignored by some version of WebKit @@ -412,6 +418,39 @@ return styleName === matchingStyleName; } + /** + * The way the numbers of one level of a list are written. + * + * A label that shows more than one level shows each of them as its + * own level is written: the levels of a list are named beside one + * another in the style of the list, so the one that is asked for is + * read there. + * @param {!Element} node the level the label belongs to + * @param {!number} level the level the number belongs to + * @param {!string} fallback what to write where that level says + * nothing, the format of the label itself + * @return {!string} + */ + function formatOfLevel(node, level, fallback) { + var /**@type{?Element}*/ + walk = node.parentNode + ? /**@type{!Element}*/(node.parentNode).firstElementChild + : null, + /**@type{!string}*/ + format; + while (walk) { + if (walk.namespaceURI === textns + && String(walk.getAttributeNS(textns, "level")) + === String(level)) { + format = walk.getAttributeNS(stylens, "num-format") || ""; + return stylemap.hasOwnProperty(format) + ? stylemap[format] + : fallback; + } + walk = walk.nextElementSibling; + } + return fallback; + } /** * Gets the CSS content for a numbered list * @param {!Element} node @@ -426,7 +465,9 @@ /**@type{!string}*/ content = "", textLevel = node.getAttributeNS(textns, "level"), - displayLevels = node.getAttributeNS(textns, "display-levels"); + displayLevels = node.getAttributeNS(textns, "display-levels"), + /**@type{!number}*/ + shown; if (prefix) { // Content needs to be on a new line if it contains slashes due to a bug in older versions of webkit // E.g., the one used in the qt runtime tests - https://bugs.webkit.org/show_bug.cgi?id=35010 @@ -440,8 +481,15 @@ // we assume a different counter for each list level // and concatenate them for multi level lists // https://wiki.openoffice.org/wiki/Number_labels + // Each level of the label is written in the format of its + // own level and not in the format of the last of them: a + // level of letters under which the levels are numbered + // gives "F.2", where the format of the second level alone + // gave "1.1" for it. while (displayLevels > 0) { - content += " counter(" + (textLevel - displayLevels + 1) + listCounterIdSuffix + "," + stylemap[style] + ")"; + shown = textLevel - displayLevels + 1; + content += " counter(" + shown + listCounterIdSuffix + "," + + formatOfLevel(node, shown, stylemap[style]) + ")"; if (displayLevels > 1) { content += '"."'; } @@ -730,7 +778,16 @@ var lists = odfBody.getElementsByTagNameNS(textns, "list"), listCounter = new UniqueListCounter(styleSheet), list, - previousList, + /** + * The last list of each style, that a list which continues + * the numbering carries on from: the standard says the list + * that goes before it, and what goes before it is the last + * list written in the same style and not whatever list was + * written last, which is another list of another style as + * often as not. + * @type{!Object.} + */ + previousOfStyle = {}, continueNumbering, continueListXmlId, xmlId, @@ -773,14 +830,16 @@ // lists with different styles cannot be continued // https://tools.oasis-open.org/issues/browse/OFFICE-3558 - if (continueNumbering && !continueListXmlId && isMatchingListStyle(previousList, styleName)) { - listCounter.createCounterRules(contentRules, list, previousList); + if (continueNumbering && !continueListXmlId + && previousOfStyle.hasOwnProperty(styleName)) { + listCounter.createCounterRules(contentRules, list, + previousOfStyle[styleName]); } else if (continueListXmlId && isMatchingListStyle(listsWithXmlId[continueListXmlId], styleName)) { listCounter.createCounterRules(contentRules, list, listsWithXmlId[continueListXmlId]); } else { listCounter.createCounterRules(contentRules, list); } - previousList = list; + previousOfStyle[styleName] = list; } } diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 5676861a3..b3a0a5bb7 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2802,6 +2802,7 @@ odf.TextLayout = function TextLayout() { inner, /**@type{?Node}*/ next; + tail.setAttributeNS(webodfhelperns, "webodfhelper:continued", "true"); while (node && count < bound) { count += nodesIn(node, bound - count); if (count >= bound && node.firstChild @@ -2910,6 +2911,11 @@ odf.TextLayout = function TextLayout() { // of the child that crossed the end of the page, and everything that // follows that child. tail = /**@type{!Element}*/(element.cloneNode(false)); + // What is left of an element that was cut is no new element of the + // document: a list that goes on over a page holds no first item of + // its own, and its numbers go on where the page before them left, + // see "ListStylesToCss.js". + tail.setAttributeNS(webodfhelperns, "webodfhelper:continued", "true"); // A table that is cut in two writes the rows of its head again at // the top of what follows, as an office does. if (element.namespaceURI === tablens) { From f2bedb67650b10d2f79c114a15aaec32f76d686a Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 306/385] Read a page from what was written last, not from its head. --- webodf/lib/odf/TextLayout.js | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index ef24139e0..542d13ecd 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2359,19 +2359,27 @@ odf.TextLayout = function TextLayout() { /** * Whether what a box holds is taller than the box. * @param {!Element} box + * @param {?Node=} from the first node to read, the head of the box by + * default: what stands before it was read already. * @return {!boolean} */ - function overflows(box) { + function overflows(box, from) { var doc = /**@type{!Document}*/(box.ownerDocument), /**@type{!number}*/ edge = box.getBoundingClientRect().bottom, /**@type{?Node}*/ - node = box.firstChild, + node = from || box.firstChild, /**@type{!ClientRect}*/ rect; // Every child is read and not the last of them alone: a frame set // against the page stands where the page says, so the last child of // a page is not always the lowest of them. + // + // What was measured before and held is not measured again: a node + // that is written after another does not move it, so a page that is + // filled a few nodes at a time is read from the first of them and + // not from the head of the page, which would read a page of a + // hundred nodes a hundred times over. while (node) { rect = node.nodeType === Node.TEXT_NODE ? rangeOf(doc, node).getBoundingClientRect() @@ -2705,7 +2713,7 @@ odf.TextLayout = function TextLayout() { if (added.length === 0) { break; } - if (overflows(box) && added.length > 1) { + if (overflows(box, added[0]) && added.length > 1) { while (added.length > 0) { taken = /**@type{!Node}*/(added.pop()); if (taken) { @@ -2715,7 +2723,8 @@ odf.TextLayout = function TextLayout() { } state.chunk = 1; } - if (added.length === 0 || !overflows(box)) { + if (added.length === 0 + || !overflows(box, added[0])) { node = null; } else { node = /**@type{!Node}*/(added[added.length - 1]); @@ -2841,7 +2850,13 @@ odf.TextLayout = function TextLayout() { clearOwnRules(sheet); sheet.insertRule("office|text {width:auto;margin:0;padding:0;" + "position:relative;}", sheet.cssRules.length); - sheet.insertRule(".webodf-pageBox {overflow:hidden;}", + // A page holds what it holds and is of the size the plan gives it: + // the browser is told so, so that a page that is filled is laid out + // on its own and not with the pages that went before it. Without it + // every measure of the page being filled lays out the whole of the + // document again, and a document of eight hundred pages is laid out + // eight hundred times over. + sheet.insertRule(".webodf-pageBox {overflow:hidden;contain:strict;}", sheet.cssRules.length); while (text.firstChild) { store.appendChild(text.firstChild); From b2ecf81ede75a0ba9eea777ea49b0c8120fbc920 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 307/385] Read the same files in the description, the entry and the dialog. --- .../opendocumentviewer-desktop/data/Info.plist.in | 1 + .../data/opendocumentviewer.iss.in | 12 ++++++++++++ .../data/org.webodf.OpenDocumentViewer.desktop | 2 +- 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/programs/opendocumentviewer-desktop/data/Info.plist.in b/programs/opendocumentviewer-desktop/data/Info.plist.in index 68faab8fa..58506889a 100644 --- a/programs/opendocumentviewer-desktop/data/Info.plist.in +++ b/programs/opendocumentviewer-desktop/data/Info.plist.in @@ -57,6 +57,7 @@ org.oasis-open.opendocument.spreadsheet-flat-xml org.oasis-open.opendocument.graphics org.oasis-open.opendocument.graphics-template + org.oasis-open.opendocument.graphics-flat-xml diff --git a/programs/opendocumentviewer-desktop/data/opendocumentviewer.iss.in b/programs/opendocumentviewer-desktop/data/opendocumentviewer.iss.in index 388b38dd4..9c4760cfd 100644 --- a/programs/opendocumentviewer-desktop/data/opendocumentviewer.iss.in +++ b/programs/opendocumentviewer-desktop/data/opendocumentviewer.iss.in @@ -84,6 +84,18 @@ Root: HKA; Subkey: "Software\Classes\.otg\OpenWithProgids"; ValueType: string; \ Root: HKA; Subkey: "Software\Classes\.odf\OpenWithProgids"; ValueType: string; \ ValueName: "OpenDocumentViewer.Document"; ValueData: ""; \ Flags: uninsdeletevalue +Root: HKA; Subkey: "Software\Classes\.fodt\OpenWithProgids"; ValueType: string; \ + ValueName: "OpenDocumentViewer.Document"; ValueData: ""; \ + Flags: uninsdeletevalue +Root: HKA; Subkey: "Software\Classes\.fods\OpenWithProgids"; ValueType: string; \ + ValueName: "OpenDocumentViewer.Document"; ValueData: ""; \ + Flags: uninsdeletevalue +Root: HKA; Subkey: "Software\Classes\.fodp\OpenWithProgids"; ValueType: string; \ + ValueName: "OpenDocumentViewer.Document"; ValueData: ""; \ + Flags: uninsdeletevalue +Root: HKA; Subkey: "Software\Classes\.fodg\OpenWithProgids"; ValueType: string; \ + ValueName: "OpenDocumentViewer.Document"; ValueData: ""; \ + Flags: uninsdeletevalue [Run] Filename: "{app}\opendocumentviewer-desktop.exe"; \ diff --git a/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.desktop b/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.desktop index 3e06a2b94..fc7f04855 100644 --- a/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.desktop +++ b/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.desktop @@ -12,4 +12,4 @@ Terminal=false Categories=Office;Viewer; Keywords=OpenDocument;ODF;odt;ods;odp;LibreOffice; Keywords[fr]=OpenDocument;ODF;odt;ods;odp;LibreOffice;lecteur; -MimeType=application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-template;application/vnd.oasis.opendocument.formula; +MimeType=application/vnd.oasis.opendocument.text;application/vnd.oasis.opendocument.text-template;application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.oasis.opendocument.graphics;application/vnd.oasis.opendocument.graphics-template;application/vnd.oasis.opendocument.formula;application/vnd.oasis.opendocument.text-flat-xml;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.oasis.opendocument.presentation-flat-xml;application/vnd.oasis.opendocument.graphics-flat-xml; From 84608843a999eb612041163209fd904a8eab232b Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 308/385] Asked java for the checks alone, and downloaded its jars only where it runs. --- CMakeLists.txt | 21 ++++++++++++-- webodf/CMakeLists.txt | 55 +++++++++++++++++++++++++++---------- webodf/tests/CMakeLists.txt | 4 +++ 3 files changed, 63 insertions(+), 17 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a8f191db4..d5e227d44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -118,8 +118,18 @@ if (WEBODF_QTJSRUNTIME OR WEBODF_DESKTOP) endif () endif () -# java runtime is needed for Closure Compiler -find_package(Java COMPONENTS Runtime REQUIRED) +# Java runs the closure compiler and rhino, that check the types of the +# sources and run the tests in a second engine. Neither writes the library: +# terser does, with node. So java is looked for and not required, and a +# machine without it builds everything but the checks, which is what a build +# in a sandbox does, see the flatpak of the viewer. +find_package(Java COMPONENTS Runtime) +if (Java_JAVA_EXECUTABLE) + set(WEBODF_HAS_JAVA TRUE) +else () + set(WEBODF_HAS_JAVA FALSE) + message(STATUS "No java was found: the types of the sources are not checked, and the tests are not run in rhino.") +endif () # Node.js will be downloaded on Windows systems, so check for installed version is below # 22.22.2 is the oldest release of node jsdom runs on, that the tests need. @@ -144,6 +154,11 @@ else ( IS_DIRECTORY $ENV{WEBODF_DOWNLOAD_DIR} ) endif ( IS_DIRECTORY $ENV{WEBODF_DOWNLOAD_DIR} ) MESSAGE ( STATUS "external downloads will be stored/expected in: ${EXTERNALS_DOWNLOAD_DIR}" ) +# The two jars are downloaded for java to run them: a build without java, or +# one that was given a library and checks nothing, asks nothing of the +# network. A sandbox has no network at all, see the flatpak of the viewer. +if (WEBODF_HAS_JAVA AND NOT WEBODF_PREBUILT_LIBRARY) + # Closure Compiler ExternalProject_Add( ClosureCompiler @@ -175,6 +190,8 @@ ExternalProject_Add( # Same version as the build with node, see scripts/lib/rhino.js. set(RHINO ${EXTERNALS_DOWNLOAD_DIR}/rhino-all-1.9.1.jar) +endif () + # Node.js is expected to be installed, on every platform. Windows used to # download a single node.exe, but the build needs npm as well, that comes with diff --git a/webodf/CMakeLists.txt b/webodf/CMakeLists.txt index fd9c7fd8d..1cc8ae571 100644 --- a/webodf/CMakeLists.txt +++ b/webodf/CMakeLists.txt @@ -174,6 +174,16 @@ endforeach(JSFILE ${TESTJSFILES}) # -XX:+TieredCompilation reduces compilation time by about 30% set(SHARED_CLOSURE_ARGS -XX:+TieredCompilation -jar ${CLOSURE_JAR}) +# What the closure compiler writes is written by java alone: a machine +# without it builds the library and every product, and only the checks of the +# types are left out, see "find_package(Java ...)" in the root. +if (WEBODF_HAS_JAVA) + set(WEBODF_TYPE_CHECK webodf-compiled.js) +else () + set(WEBODF_TYPE_CHECK "") +endif () +if (WEBODF_HAS_JAVA) + # Do quick syntax check on javascript files of webodf lib and webodf tests. # This compile uses no optimization and runs simple syntax tests. That is why # this target is mentioned early in the list of dependencies. @@ -233,6 +243,8 @@ add_custom_command( DEPENDS ClosureCompiler ${LIBJSFILES} tools/externs.js webodf.css.js-target ) +endif () + # The library is written by the build with node, so that both builds produce # the same file. The closure compiler still reads the sources, in # "webodf-compiled.js" above, but only to check their types: it compiles with @@ -245,7 +257,7 @@ add_custom_command( COMMAND ${NODE} ARGS ${CMAKE_SOURCE_DIR}/scripts/build.js --output ${CMAKE_CURRENT_BINARY_DIR}/webodf.js --header ${HEADERCOMPILED_FILE} - DEPENDS ${NODE} webodf-compiled.js manifest.json-target + DEPENDS ${NODE} ${WEBODF_TYPE_CHECK} manifest.json-target ${CMAKE_SOURCE_DIR}/scripts/build.js ${CMAKE_SOURCE_DIR}/scripts/lib/bundle.js ${CMAKE_SOURCE_DIR}/scripts/lib/sources.js @@ -260,6 +272,7 @@ add_custom_command( ) add_custom_target(webodf.js-target DEPENDS webodf.js) +if (WEBODF_HAS_JAVA) # Compile the debug version of WebODF. This is also published as a product. add_custom_command( OUTPUT webodf-debug-compiled.js @@ -293,10 +306,16 @@ add_custom_command( ) add_custom_target(webodf-debug.js-target DEPENDS webodf-debug.js) -add_custom_target(syntaxcheck ALL - DEPENDS simplecompiled.js-target webodf.js-target - compiled.js-target -) +endif () + +if (WEBODF_HAS_JAVA) + add_custom_target(syntaxcheck ALL + DEPENDS simplecompiled.js-target webodf.js-target + compiled.js-target + ) +else () + add_custom_target(syntaxcheck ALL DEPENDS webodf.js-target) +endif () # The documentation is written by the build with node, with jsdoc 4, as the @@ -311,16 +330,22 @@ add_custom_command( ) add_custom_target(doc DEPENDS docs/index.html) -add_custom_command( - OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/simplenodetest.timestamp - COMMAND ${NODE} ${CMAKE_CURRENT_BINARY_DIR}/simplecompiled.js - COMMAND ${TOUCHFILE} ${CMAKE_CURRENT_BINARY_DIR}/simplenodetest.timestamp - DEPENDS ${NODE} simplecompiled.js copy_node_modules - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests -) -add_custom_target(test-simplenode ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/simplenodetest.timestamp) - -add_custom_target(webodf.js-tests DEPENDS syntaxcheck test-simplenode) +# The suite is run from the file the compiler wrote, which java writes: a +# machine without java runs the suite from the sources alone, in node and in +# the webengine of qt. +if (WEBODF_HAS_JAVA) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/simplenodetest.timestamp + COMMAND ${NODE} ${CMAKE_CURRENT_BINARY_DIR}/simplecompiled.js + COMMAND ${TOUCHFILE} ${CMAKE_CURRENT_BINARY_DIR}/simplenodetest.timestamp + DEPENDS ${NODE} simplecompiled.js copy_node_modules + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/tests + ) + add_custom_target(test-simplenode ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/simplenodetest.timestamp) + add_custom_target(webodf.js-tests DEPENDS syntaxcheck test-simplenode) +else () + add_custom_target(webodf.js-tests DEPENDS syntaxcheck) +endif () add_custom_command( OUTPUT ${WEBODFJS_DIR} diff --git a/webodf/tests/CMakeLists.txt b/webodf/tests/CMakeLists.txt index 87151ba85..8a806b341 100644 --- a/webodf/tests/CMakeLists.txt +++ b/webodf/tests/CMakeLists.txt @@ -38,6 +38,9 @@ add_dependencies(webodf.js-tests test-node) # neither. It runs in a directory of its own, as the one of node does, since a # test writes files, and it is told where the library is: rhino tells a script # no path of its own, see "libraryPaths" in "runtime.js". +# Rhino is run by java, so a machine without it runs the suite in node and in +# the webengine of qt alone, see "find_package(Java ...)" in the root. +if (WEBODF_HAS_JAVA) COPY_FILES(tests_rhinotests ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR}/_rhinotest ${TESTS_TESTFILES} ) @@ -71,6 +74,7 @@ add_custom_command( add_custom_target(test-simplerhino ALL DEPENDS _simplerhinotest/simplerhinotest.timestamp) add_dependencies(webodf.js-tests test-simplerhino) +endif () if (BUILD_QTJSRUNTIME) COPY_FILES(tests_qtjsruntimetest ${CMAKE_CURRENT_SOURCE_DIR} From c7403c2ec9cd5e317e61ab51cec944862a2fe728 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 309/385] Named the package that was written, not the one CPack names after. --- programs/opendocumentviewer-desktop/packaging.cmake | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake index c6380ea02..f3f913f02 100644 --- a/programs/opendocumentviewer-desktop/packaging.cmake +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -98,8 +98,11 @@ set(CPACK_PACKAGE_DESCRIPTION_SUMMARY set(CPACK_PACKAGE_VENDOR "webodf.org") set(CPACK_PACKAGE_CONTACT "webodf@nlnet.nl") set(CPACK_PACKAGE_HOMEPAGE_URL "https://webodf.org/") -set(CPACK_PACKAGE_FILE_NAME - "opendocumentviewer-${WEBODF_VERSION}-${VIEWER_ARCH}") +# The name is kept apart as well: "include(CPack)" sets the variable of CPack +# back to the name of a package of the sources, so what is read after it is +# not what the package was named. +set(VIEWER_PACKAGE_NAME "opendocumentviewer-${WEBODF_VERSION}-${VIEWER_ARCH}") +set(CPACK_PACKAGE_FILE_NAME ${VIEWER_PACKAGE_NAME}) # CPack leaves a directory of its own beside what it writes, so it writes # aside and the package alone is copied among the products. set(VIEWER_CPACK_DIR ${CMAKE_CURRENT_BINARY_DIR}/packages) @@ -123,7 +126,7 @@ if (DPKG_DEB) --config ${CMAKE_BINARY_DIR}/CPackConfig.cmake COMMAND ${CMAKE_COMMAND} -DDIR=${VIEWER_CPACK_DIR} -DDEST=${VIEWER_PRODUCTS} -DEXT=deb - -DNAME=${CPACK_PACKAGE_FILE_NAME} + -DNAME=${VIEWER_PACKAGE_NAME} -P ${CMAKE_CURRENT_SOURCE_DIR}/data/copy-packages.cmake DEPENDS opendocumentviewer-desktop COMMENT "The package of debian of the viewer of the desktop") @@ -141,7 +144,7 @@ if (RPMBUILD) --config ${CMAKE_BINARY_DIR}/CPackConfig.cmake COMMAND ${CMAKE_COMMAND} -DDIR=${VIEWER_CPACK_DIR} -DDEST=${VIEWER_PRODUCTS} -DEXT=rpm - -DNAME=${CPACK_PACKAGE_FILE_NAME} + -DNAME=${VIEWER_PACKAGE_NAME} -P ${CMAKE_CURRENT_SOURCE_DIR}/data/copy-packages.cmake DEPENDS opendocumentviewer-desktop COMMENT "The package of fedora of the viewer of the desktop") From 0a3f3e84a1e8eb6d2395d5ee80591f9f1de918ca Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 310/385] Left the text the room the furniture of the page takes. --- webodf/lib/odf/TextLayout.js | 103 ++++++++++++++++++++++++++++++----- 1 file changed, 90 insertions(+), 13 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index ddc857bed..ef24139e0 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -221,8 +221,22 @@ odf.TextLayout = function TextLayout() { "header-footer-properties"), area = {height: 0, gap: 0}; if (box) { - area.height = lengthInPx(box, "min-height", 0); - area.gap = lengthInPx(box, gap, 0); + // A header or a foot is written of the height it is given, and + // of the height it asks for at the least where it is given + // none: "svg:height" says the one and "fo:min-height" the + // other, and a document that writes both is drawn of the + // greater, as the room the text is left is the room the + // furniture does not take. + area.height = Math.max(lengthInPx(box, "height", 0, svgns), + lengthInPx(box, "min-height", 0)); + // The space between the furniture and the text gives way where + // the document asks for a dynamic spacing: the furniture grows + // into it, and the text is left the room all the same. Where it + // does not, the space is held and the text has that much less. + area.gap = box.getAttributeNS(stylens, "dynamic-spacing") + === "true" + ? 0 + : lengthInPx(box, gap, 0); } return area; } @@ -556,16 +570,6 @@ odf.TextLayout = function TextLayout() { // The room a header takes is the room it takes on every page: the // pages of a document are of one height, and a title page that carries // no header is drawn with the same text area as the others. - if (dims.otherPages.header || dims.otherPages.headerLeft - || dims.otherPages.headerFirst || dims.firstPage.header - || dims.firstPage.headerLeft || dims.firstPage.headerFirst) { - dims.marginTop += dims.header.height + dims.header.gap; - } - if (dims.otherPages.footer || dims.otherPages.footerLeft - || dims.otherPages.footerFirst || dims.firstPage.footer - || dims.firstPage.footerLeft || dims.firstPage.footerFirst) { - dims.marginBottom += dims.footer.height + dims.footer.gap; - } return dims; } this.readPageDimensions = readPageDimensions; @@ -1252,6 +1256,78 @@ odf.TextLayout = function TextLayout() { } return sequence; } + /** + * The room a header or a foot takes once it is written. + * + * A document says how tall its furniture is, and writes in it what it + * writes: a foot of two lines in a box of one is drawn of two all the + * same, and the text of the page is left that much less room. The + * height is measured on a copy drawn out of sight, of the width the + * page gives it. + * @param {!odf.ODFDocumentElement} odfroot + * @param {?Element} source or + * @param {!number} width of the text area, in pixels + * @return {!number} + */ + function roomTaken(odfroot, source, width) { + var doc = /**@type{!Document}*/(odfroot.ownerDocument), + htmlns = doc.documentElement.namespaceURI, + /**@type{!Element}*/ + box, + /**@type{!number}*/ + height; + if (!source || width <= 0) { + return 0; + } + box = /**@type{!Element}*/(doc.createElementNS(htmlns, "div")); + /**@type{!HTMLElement}*/(box).style.position = "absolute"; + /**@type{!HTMLElement}*/(box).style.visibility = "hidden"; + /**@type{!HTMLElement}*/(box).style.left = "-10000px"; + /**@type{!HTMLElement}*/(box).style.top = "0"; + /**@type{!HTMLElement}*/(box).style.width = width + "px"; + box.appendChild(doc.importNode(source, true)); + unstampStyleNames(odfroot, box); + expandSpaces(box); + odfroot.body.appendChild(box); + height = box.getBoundingClientRect().height; + odfroot.body.removeChild(box); + return height; + } + /** + * The margins of a page, once the furniture is written inside them. + * + * A header and a foot are written between the edge of the page and its + * text, so the text is left that much less room: the height the + * document gives them, or the height what they hold takes where that is + * the greater, and the space that parts them from the text where it + * does not give way. The room a header takes is the room it takes on + * every page: the pages of a document are of one height, and a title + * page that carries no header is drawn with the same text area as the + * others. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!odf.TextLayout.PageDimensions} dims + * @return {!odf.TextLayout.PageDimensions} + */ + function roomForFurniture(odfroot, dims) { + var width = dims.pageWidth - dims.marginLeft - dims.marginRight, + /**@type{?Element}*/ + head = dims.otherPages.header || dims.otherPages.headerLeft + || dims.otherPages.headerFirst || dims.firstPage.header + || dims.firstPage.headerLeft || dims.firstPage.headerFirst, + /**@type{?Element}*/ + foot = dims.otherPages.footer || dims.otherPages.footerLeft + || dims.otherPages.footerFirst || dims.firstPage.footer + || dims.firstPage.footerLeft || dims.firstPage.footerFirst; + if (head) { + dims.marginTop += Math.max(dims.header.height, + roomTaken(odfroot, head, width)) + dims.header.gap; + } + if (foot) { + dims.marginBottom += Math.max(dims.footer.height, + roomTaken(odfroot, foot, width)) + dims.footer.gap; + } + return dims; + } /** * The plan of the pages: the geometry of each master page a text goes * through, and the page each one begins at. A page takes the geometry of @@ -1265,7 +1341,8 @@ odf.TextLayout = function TextLayout() { sequence = masterPageSequence(odfroot), /**@type{!Array.}*/ geometry = sequence.map(function (entry) { - return readPageDimensions(odfroot, entry.master); + return roomForFurniture(odfroot, + readPageDimensions(odfroot, entry.master)); }), /**@type{!Array.}*/ // Until the pages are drawn, each change is taken to be one page From 481120af760dae3d90b1b9906209c532770ba78a Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 311/385] Written what the first page came to when the pages are drawn. --- .../assets/viewer.js | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/programs/opendocumentviewer-desktop/assets/viewer.js b/programs/opendocumentviewer-desktop/assets/viewer.js index e5954b621..9ef898d08 100644 --- a/programs/opendocumentviewer-desktop/assets/viewer.js +++ b/programs/opendocumentviewer-desktop/assets/viewer.js @@ -32,6 +32,50 @@ - parseFloat(style.paddingRight); } + // How the first page came out: the height of its text, how far its text + // reaches, and where the foot drawn on it begins. A foot that begins + // above the end of the text is drawn over the last line of it. + function pageReport() { + var box = document.querySelector(".webodf-pageBox"), + furniture = document.querySelector(".webodf-pageFurniture"), + drawn = document.querySelectorAll(".webodf-pageSheet").length, + edge, + bottom = 0, + top = Infinity, + i, + parts, + rect; + if (!box) { + return String(drawn) + " drawn, no page box"; + } + edge = box.getBoundingClientRect(); + for (i = 0; i < box.children.length; i += 1) { + rect = box.children[i].getBoundingClientRect(); + if (rect.height > 0) { + bottom = Math.max(bottom, rect.bottom); + } + } + if (furniture) { + parts = furniture.getElementsByTagName("*"); + for (i = 0; i < parts.length; i += 1) { + rect = parts[i].getBoundingClientRect(); + if (rect.height > 0 + && rect.top > edge.bottom - edge.height / 2) { + top = Math.min(top, rect.top); + } + } + } + return String(drawn) + " drawn, zoom " + zoom() + + ", box " + Math.round(edge.height) + + ", text ends " + Math.round(bottom - edge.top) + + ", foot begins " + (top === Infinity + ? "nowhere" + : Math.round(top - edge.top)) + + ", over by " + (top === Infinity + ? 0 + : Math.round(bottom - top)); + } + // What the first text of the document is drawn in, and what it is drawn on: // a text takes the colour of the ground when the document names none, so // this is what tells a white text on white paper. @@ -88,6 +132,10 @@ // the size it was written at, and a window that holds a page // whole leaves it at that size. canvas.addListener("pagesdrawn", function () { + // What the pages came to, written when the category + // "webodf.viewer" is turned on: it tells a foot drawn over + // the last line of a page apart from one that stands clear. + window.console.log("pages " + pageReport()); if (!refitting) { return; } From dd2b6ec68f6267a46ad412ac75fd8c48120d2898 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 312/385] Drawn a tab stop that stands off the page against its edge. --- webodf/lib/odf/TextLayout.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index f38fafee0..97d131532 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -1182,6 +1182,11 @@ odf.TextLayout = function TextLayout() { } else if (stop.type === "center") { at -= rect.width / 2; } + // A stop written for a page of another size stands + // past the edge of this one: what it holds is drawn + // against the edge instead, as an office draws it, + // rather than in the margin or off the page. + at = Math.min(at, right - rect.width); push = at - rect.left; } } From 6ef76f437d43e60925508b87b98c049620692684 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 313/385] Let the numbers of the lists run on from page to page. --- webodf/lib/odf/ListStylesToCss.js | 6 +++++- webodf/lib/odf/TextLayout.js | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/webodf/lib/odf/ListStylesToCss.js b/webodf/lib/odf/ListStylesToCss.js index 957c7b086..161f1a83b 100644 --- a/webodf/lib/odf/ListStylesToCss.js +++ b/webodf/lib/odf/ListStylesToCss.js @@ -289,8 +289,12 @@ } // Apply the counter increment to EVERY list item in this list that has content (AKA a visible list label) + // An item that was cut where a page ends is written again on the + // page that follows, and what is left of it is no new item of + // the list: it carries the number of the item it is the end of, + // and never one of its own. newRule = 'text|list[webodfhelper|counter-id="' + newListSelectorId + '"]'; - newRule += ' > text|list-item > :not(text|list):first-child:before'; + newRule += ' > text|list-item:not([webodfhelper|continued]) > :not(text|list):first-child:before'; newRule += '{'; newRule += contentRule; newRule += 'counter-increment: ' + newListCounterId + ';'; diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index b3a0a5bb7..288aef3fd 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3201,7 +3201,13 @@ odf.TextLayout = function TextLayout() { // every measure of the page being filled lays out the whole of the // document again, and a document of eight hundred pages is laid out // eight hundred times over. - sheet.insertRule(".webodf-pageBox {overflow:hidden;contain:strict;}", + // The page is laid out on its own — its size, its layout and what + // it paints are its own — but not its counters: "contain:strict" + // holds the styles as well, and the numbers of a list begin again + // at every page that way. The three that are of the layout are + // named instead. + sheet.insertRule(".webodf-pageBox {overflow:hidden;" + + "contain:size layout paint;}", sheet.cssRules.length); while (text.firstChild) { store.appendChild(text.firstChild); From d314e5e2f0a58d018afb6e0106c703a5a7e06d67 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 314/385] Measured the nodes a page was given in one reading, not one by one. --- webodf/lib/odf/TextLayout.js | 49 ++++++++++++++++++++++++++++++++---- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 542d13ecd..b598de244 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2356,6 +2356,25 @@ odf.TextLayout = function TextLayout() { } return null; } + /** + * Whether an element is drawn out of the flow of the text. + * + * A frame anchored to the page is set against the page and stands where + * the page says, so it is not read with what follows the text: the + * browser is asked, and only of the few elements that may be so. + * @param {!Element} element + * @return {!boolean} + */ + function isOutOfFlow(element) { + var style; + if (element.namespaceURI !== drawns) { + return false; + } + style = runtime.getWindow().getComputedStyle(element); + return style + ? style.position === "absolute" || style.position === "fixed" + : false; + } /** * Whether what a box holds is taller than the box. * @param {!Element} box @@ -2369,6 +2388,7 @@ odf.TextLayout = function TextLayout() { edge = box.getBoundingClientRect().bottom, /**@type{?Node}*/ node = from || box.firstChild, + range = doc.createRange(), /**@type{!ClientRect}*/ rect; // Every child is read and not the last of them alone: a frame set @@ -2380,12 +2400,31 @@ odf.TextLayout = function TextLayout() { // filled a few nodes at a time is read from the first of them and // not from the head of the page, which would read a page of a // hundred nodes a hundred times over. + if (!node) { + return false; + } + // The nodes are read in one measure and not one by one: a range that + // holds them all answers with the rectangle that holds what they are + // drawn as, which is the one the page is read against. A page filled + // by chunks of sixty-four nodes is measured once for the chunk and + // not sixty-four times. + range.setStartBefore(node); + range.setEndAfter(/**@type{!Node}*/(box.lastChild)); + rect = range.getBoundingClientRect(); + if ((rect.height > 0 || rect.width > 0) && rect.bottom > edge + 1) { + return true; + } + // What is drawn out of the flow of the text — a frame set against the + // page — stands where the page says and is none of the range: those + // are read on their own, and there are few of them. while (node) { - rect = node.nodeType === Node.TEXT_NODE - ? rangeOf(doc, node).getBoundingClientRect() - : /**@type{!Element}*/(node).getBoundingClientRect(); - if ((rect.height > 0 || rect.width > 0) && rect.bottom > edge + 1) { - return true; + if (node.nodeType === Node.ELEMENT_NODE + && isOutOfFlow(/**@type{!Element}*/(node))) { + rect = /**@type{!Element}*/(node).getBoundingClientRect(); + if ((rect.height > 0 || rect.width > 0) + && rect.bottom > edge + 1) { + return true; + } } node = node.nextSibling; } From 8065c2995d5c0f1c290feeaaea58f6bf5fd1406a Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 315/385] Read the documents an office writes, in the tests. --- webodf/CMakeLists.txt | 1 + webodf/tests/CMakeLists.txt | 3 + webodf/tests/manifest.json | 4 + webodf/tests/odf/OfficeDocumentsTests.js | 123 ++++++++++++++++++ webodf/tests/odf/README | 23 ++++ webodf/tests/odf/libreoffice-beehive.otp | Bin 0 -> 21188 bytes webodf/tests/odf/libreoffice-bpmn.otg | Bin 0 -> 38501 bytes .../tests/odf/libreoffice-business-letter.ott | Bin 0 -> 13424 bytes webodf/tests/odf/libreoffice-cv.ott | Bin 0 -> 25770 bytes webodf/tests/tests.js | 2 + 10 files changed, 156 insertions(+) create mode 100644 webodf/tests/odf/OfficeDocumentsTests.js create mode 100644 webodf/tests/odf/README create mode 100644 webodf/tests/odf/libreoffice-beehive.otp create mode 100644 webodf/tests/odf/libreoffice-bpmn.otg create mode 100644 webodf/tests/odf/libreoffice-business-letter.ott create mode 100644 webodf/tests/odf/libreoffice-cv.ott diff --git a/webodf/CMakeLists.txt b/webodf/CMakeLists.txt index 1cc8ae571..6a3338acd 100644 --- a/webodf/CMakeLists.txt +++ b/webodf/CMakeLists.txt @@ -66,6 +66,7 @@ set(TESTJSFILES tests/odf/ObjectNameGeneratorTests.js tests/odf/MaliciousDocumentTests.js tests/odf/OdfContainerTests.js + tests/odf/OfficeDocumentsTests.js tests/odf/OdfContainerSafetyTests.js tests/odf/OdfUtilsTests.js tests/odf/StyleInfoTests.js diff --git a/webodf/tests/CMakeLists.txt b/webodf/tests/CMakeLists.txt index 8a806b341..dcdfe37bf 100644 --- a/webodf/tests/CMakeLists.txt +++ b/webodf/tests/CMakeLists.txt @@ -9,6 +9,9 @@ FILE( GLOB_RECURSE TESTS_TESTFILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*/*.zip ${CMAKE_CURRENT_SOURCE_DIR}/*/*.odt ${CMAKE_CURRENT_SOURCE_DIR}/*/*.fodt + ${CMAKE_CURRENT_SOURCE_DIR}/*/*.ott + ${CMAKE_CURRENT_SOURCE_DIR}/*/*.otp + ${CMAKE_CURRENT_SOURCE_DIR}/*/*.otg ) COPY_FILES(tests_nodetests ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/webodf/tests/manifest.json b/webodf/tests/manifest.json index 6de06d03c..010fedcf9 100644 --- a/webodf/tests/manifest.json +++ b/webodf/tests/manifest.json @@ -151,6 +151,10 @@ "odf.OdfUtils", "webodfcore.UnitTester" ], + "odf.OfficeDocumentsTests": [ + "odf.OdfContainer", + "webodfcore.UnitTester" + ], "odf.PageLayoutTests": [ "odf.Namespaces", "odf.OdfCanvas", diff --git a/webodf/tests/odf/OfficeDocumentsTests.js b/webodf/tests/odf/OfficeDocumentsTests.js new file mode 100644 index 000000000..59a227326 --- /dev/null +++ b/webodf/tests/odf/OfficeDocumentsTests.js @@ -0,0 +1,123 @@ +/** + * Copyright (C) 2012-2013 KO GmbH + * + * @licstart + * This file is part of WebODF. + * + * WebODF is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License (GNU AGPL) + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * WebODF is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with WebODF. If not, see . + * @licend + * + * @source: http://www.webodf.org/ + * @source: https://github.com/webodf/WebODF/ + */ + + +/*global runtime, webodfcore, odf*/ + +/** + * The templates of LibreOffice, read as they are written. + * + * A test writes a small document and reads it back, which tells whether the + * library holds to itself; these are written by an office, and tell whether + * it still reads what an office writes. They are the templates LibreOffice + * ships, under the Mozilla Public License, see "README" beside them. + * @constructor + * @param {webodfcore.UnitTestRunner} runner + * @implements {webodfcore.UnitTest} + */ +odf.OfficeDocumentsTests = function OfficeDocumentsTests(runner) { + "use strict"; + var t, r = runner, + drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", + textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0"; + this.setUp = function () { + t = {}; + }; + this.tearDown = function () { + t = {}; + }; + /** + * Read one document and answer what it holds. + * @param {!string} path + * @param {!string} kind the name of the element of the body + * @param {!function():undefined} callback + * @return {undefined} + */ + function readOne(path, kind, callback) { + t.odf = new odf.OdfContainer(path, function (container) { + t.odf = container; + r.shouldBe(t, "t.odf.state", "odf.OdfContainer.DONE"); + t.kind = t.odf.getDocumentType(); + t.expected = kind; + r.shouldBe(t, "t.kind", "t.expected"); + // Every one of them is a template, which the mimetype says. + t.template = t.odf.isTemplate(); + r.shouldBe(t, "t.template", "true"); + callback(); + }); + } + function readTheLetterOfAnOffice(callback) { + readOne("odf/libreoffice-business-letter.ott", "text", function () { + // The letter is written of frames, that hold the sender and the + // logo, and of paragraphs. + t.paragraphs = t.odf.rootElement.body.getElementsByTagNameNS( + textns, + "p" + ).length; + r.shouldBe(t, "t.paragraphs > 5", "true"); + callback(); + }); + } + function readTheCurriculumOfAnOffice(callback) { + readOne("odf/libreoffice-cv.ott", "text", callback); + } + function readThePresentationOfAnOffice(callback) { + readOne("odf/libreoffice-beehive.otp", "presentation", function () { + t.pages = t.odf.rootElement.body.getElementsByTagNameNS( + drawns, + "page" + ).length; + r.shouldBe(t, "t.pages > 0", "true"); + callback(); + }); + } + function readTheDrawingOfAnOffice(callback) { + // A drawing holds its pages in "office:drawing", which was read as + // nothing at all before: the document was refused for want of a body + // it was taken to have none of. + readOne("odf/libreoffice-bpmn.otg", "drawing", function () { + t.pages = t.odf.rootElement.body.getElementsByTagNameNS( + drawns, + "page" + ).length; + r.shouldBe(t, "t.pages > 0", "true"); + callback(); + }); + } + this.tests = function () { + return []; + }; + this.asyncTests = function () { + return r.name([ + readTheLetterOfAnOffice, + readTheCurriculumOfAnOffice, + readThePresentationOfAnOffice, + readTheDrawingOfAnOffice + ]); + }; +}; +odf.OfficeDocumentsTests.prototype.description = function () { + "use strict"; + return "Read the documents an office writes."; +}; diff --git a/webodf/tests/odf/README b/webodf/tests/odf/README new file mode 100644 index 000000000..5ca99dc4b --- /dev/null +++ b/webodf/tests/odf/README @@ -0,0 +1,23 @@ +The documents of this directory are read by the tests beside them. + +Four of them are the templates LibreOffice ships, taken from the sources +of it as they are, under the Mozilla Public License, version 2.0: + + libreoffice-business-letter.ott extras/source/templates/officorr/Modern_business_letter_serif + libreoffice-cv.ott extras/source/templates/personal/CV + libreoffice-beehive.otp extras/source/templates/presnt/Beehive + libreoffice-bpmn.otg extras/source/templates/draw/bpmn + + https://git.libreoffice.org/core/+/refs/heads/master/extras/source/templates/ + +The sources keep a template unpacked, one directory to a template, and the +build of LibreOffice zips it: these were zipped the same way, "mimetype" +first and stored rather than deflated. What they hold is what the +repository holds. + +They are read by "OfficeDocumentsTests.js", which asks of each one what a +test of a document written here never asks: whether the library still +reads what an office writes. + +"opendocument-v1.3-part3.odt" is the standard itself, as OASIS publishes +it, and is read by "OdfContainerTests.js" and "LayoutTests.js". diff --git a/webodf/tests/odf/libreoffice-beehive.otp b/webodf/tests/odf/libreoffice-beehive.otp new file mode 100644 index 0000000000000000000000000000000000000000..cab381f77289f683ff13ebd750170dc4c84076b0 GIT binary patch literal 21188 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 c=2Y9oxfn+#<@EXuPHv&LB0AnQ&F8}}l literal 0 HcmV?d00001 diff --git a/webodf/tests/odf/libreoffice-bpmn.otg b/webodf/tests/odf/libreoffice-bpmn.otg new file mode 100644 index 0000000000000000000000000000000000000000..22bb1ed8ab7a64d2bae8cd8b70b7510a16566b3c GIT binary patch literal 38501 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 GrGEhsM)Gw4 literal 0 HcmV?d00001 diff --git a/webodf/tests/odf/libreoffice-business-letter.ott b/webodf/tests/odf/libreoffice-business-letter.ott new file mode 100644 index 0000000000000000000000000000000000000000..023b5617247bebc71a9fcf3e183e4e25ad679a3b GIT binary patch literal 13424 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 ISpN3@7Z>H>{r~^~ literal 0 HcmV?d00001 diff --git a/webodf/tests/odf/libreoffice-cv.ott b/webodf/tests/odf/libreoffice-cv.ott new file mode 100644 index 0000000000000000000000000000000000000000..4e80d9a7ee56a9c12287ed7a6794cb33cf0dc099 GIT binary patch literal 25770 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 k_rFc{|Hip|{ro=vf9fmCK|=j~0`qw;evYTh Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 316/385] Opened a drawing, that is a run of pages like a presentation. --- webodf/lib/odf/OdfCanvas.js | 3 ++- webodf/lib/odf/OdfContainer.js | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index a510973f2..77666b2ee 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -4048,7 +4048,8 @@ // another, and the box is left clear between two of them, so that // the ground of the reader is seen there and each slide is read on // its own. A slide paints itself from its page style. - if (container.getDocumentType() !== "presentation") { + if (container.getDocumentType() !== "presentation" + && container.getDocumentType() !== "drawing") { sizer.style.background = "white"; } // The #shadowContent master-page overlay is position:absolute with diff --git a/webodf/lib/odf/OdfContainer.js b/webodf/lib/odf/OdfContainer.js index 24c481599..0cc4fbea4 100644 --- a/webodf/lib/odf/OdfContainer.js +++ b/webodf/lib/odf/OdfContainer.js @@ -1155,9 +1155,13 @@ body; if (!contentElement) { body = self.rootElement.body; + // A drawing is written as a run of pages, as a + // presentation is, and is drawn the same way: the canvas + // reads both, see "OdfCanvas.js". contentElement = domUtils.getDirectChild(body, officens, "text") || domUtils.getDirectChild(body, officens, "presentation") - || domUtils.getDirectChild(body, officens, "spreadsheet"); + || domUtils.getDirectChild(body, officens, "spreadsheet") + || domUtils.getDirectChild(body, officens, "drawing"); } if (!contentElement) { throw "Could not find content element in ."; From be5720503a83df2dc1b2ad717747e1b951dd3f60 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 317/385] Given the sandbox the library that was built, rather than node to build it. --- CMakeLists.txt | 38 +++++++++++++++++-- .../data/org.webodf.OpenDocumentViewer.yml.in | 6 +++ .../packaging.cmake | 5 ++- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index d5e227d44..fe2f98dfc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -131,6 +131,17 @@ else () message(STATUS "No java was found: the types of the sources are not checked, and the tests are not run in rhino.") endif () +# A build that is given a library that was built already builds nothing of it: +# it neither runs node nor asks for it. That is what a build in a sandbox +# does, where there is neither node nor a network to install its tools from, +# see the flatpak of the viewer of the desktop. +set(WEBODF_PREBUILT_LIBRARY "" CACHE FILEPATH + "A webodf.js that was built already, to be used instead of building one") +if (WEBODF_PREBUILT_LIBRARY AND NOT EXISTS "${WEBODF_PREBUILT_LIBRARY}") + message(FATAL_ERROR + "WEBODF_PREBUILT_LIBRARY names ${WEBODF_PREBUILT_LIBRARY}, which is not there.") +endif () + # Node.js will be downloaded on Windows systems, so check for installed version is below # 22.22.2 is the oldest release of node jsdom runs on, that the tests need. # The tools of the build are tested with 24, the release under long term @@ -233,7 +244,9 @@ ENDIF(NODEJS_EXECUTABLE) # what it finds, so a node that was installed later, by nvm for instance, is # only seen once the entry is dropped: the path is named here, as it is often # an older one that is still in the cache. -if (NODEJS_VERSION VERSION_LESS REQUIRED_NODEJS_VERSION) +if (WEBODF_PREBUILT_LIBRARY) + message(STATUS "The library is taken from ${WEBODF_PREBUILT_LIBRARY}: node is not needed.") +elseif (NODEJS_VERSION VERSION_LESS REQUIRED_NODEJS_VERSION) message(FATAL_ERROR "Node.js is required in version " ${REQUIRED_NODEJS_VERSION} " or later, but " ${NODEJS_EXECUTABLE} " is " ${NODEJS_VERSION} @@ -515,7 +528,22 @@ endmacro(WEBODF_PRODUCT_MISSING) ############################# # the lib -add_subdirectory(webodf) +if (WEBODF_PREBUILT_LIBRARY) + # The library was built already and is taken as it is: nothing of it is + # read, checked or written here, and neither node nor java is asked for. + # A program of this build reads it where it would have been written. + add_custom_command( + OUTPUT ${CMAKE_BINARY_DIR}/webodf/webodf.js + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/webodf + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${WEBODF_PREBUILT_LIBRARY} ${CMAKE_BINARY_DIR}/webodf/webodf.js + DEPENDS ${WEBODF_PREBUILT_LIBRARY} + COMMENT "The library, taken from ${WEBODF_PREBUILT_LIBRARY}") + add_custom_target(webodf.js-target + DEPENDS ${CMAKE_BINARY_DIR}/webodf/webodf.js) +else () + add_subdirectory(webodf) +endif () # the programs/components if (WEBODF_PROGRAMS) @@ -538,7 +566,11 @@ endif () add_custom_target(tests COMMAND ${CMAKE_COMMAND} -E echo "" COMMAND ${CMAKE_COMMAND} -E echo "Every test of this build has run.") -add_dependencies(tests webodf.js-tests) +# A build that was given a library reads none of its sources, so there is +# nothing of the library to test here: only the programs are. +if (TARGET webodf.js-tests) + add_dependencies(tests webodf.js-tests) +endif () foreach (WEBODF_TEST_TARGET test-opendocumenttexteditor test-opendocumenttextcollab diff --git a/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.yml.in b/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.yml.in index 30b48106e..7472c1c25 100644 --- a/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.yml.in +++ b/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.yml.in @@ -30,6 +30,12 @@ modules: config-opts: - -DCMAKE_BUILD_TYPE=Release - -DWEBODF_DESKTOP=ON + # The library was built outside, by the build that writes this manifest: + # the sandbox has neither node nor java, nor a network to install their + # tools from, and it builds the viewer alone. + - -DWEBODF_PREBUILT_LIBRARY=../webodf.js sources: - type: dir path: '@CMAKE_SOURCE_DIR@' + - type: file + path: '@WEBODF_JS_FILE@' diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake index 337346cc3..223917e30 100644 --- a/programs/opendocumentviewer-desktop/packaging.cmake +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -224,6 +224,9 @@ if (UNIX AND NOT APPLE) # one that will do is the least version of qt the viewer is built with, # see "find_package(Qt6 ...)" in the root: a machine that kept only an # older branch has nothing to build against, and is told so. + # The library the sandbox is given, written by this build: the manifest + # names it beside the sources. + set(WEBODF_JS_FILE ${CMAKE_BINARY_DIR}/webodf/webodf.js) set(VIEWER_FLATPAK_REPO ${CMAKE_CURRENT_BINARY_DIR}/flatpak-repo) set(VIEWER_FLATPAK_RUNTIME_LEAST "6.4") set(WEBODF_FLATPAK_RUNTIME "" CACHE STRING @@ -319,7 +322,7 @@ if (UNIX AND NOT APPLE) ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_ID}.yml true COMMAND flatpak build-bundle ${VIEWER_FLATPAK_REPO} ${VIEWER_PRODUCTS}/${VIEWER_ID}-${WEBODF_VERSION}.flatpak ${VIEWER_ID} - DEPENDS opendocumentviewer-desktop + DEPENDS opendocumentviewer-desktop webodf.js-target COMMENT "The flatpak of the viewer of the desktop") WEBODF_PRODUCT_MADE(package-flatpak "${VIEWER_ID}-${WEBODF_VERSION}.flatpak") From 695133530570eec5cb76c70ea99a148f31ddfdde Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 318/385] Kept in the directory of the products what this build wrote alone. --- CMakeLists.txt | 13 +++++++++++-- scripts/cmake/keep-products.cmake | 18 ++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 scripts/cmake/keep-products.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index d9d9bb912..5636bd154 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -527,8 +527,18 @@ get_property(WEBODF_PRODUCT_FILES GLOBAL PROPERTY WEBODF_PRODUCTS) get_property(WEBODF_PRODUCT_TARGET_LIST GLOBAL PROPERTY WEBODF_PRODUCT_TARGETS) if (WEBODF_PRODUCT_FILES) set(WEBODF_PRODUCTS_DIR ${CMAKE_BINARY_DIR}/products) + get_property(WEBODF_PRODUCT_NAME_LIST GLOBAL PROPERTY WEBODF_PRODUCT_NAMES) + string(REPLACE ";" "," WEBODF_PRODUCT_NAMES_ARG "${WEBODF_PRODUCT_NAME_LIST}") + # What a build that went before left in the directory is taken away: the + # products carry the version they were built from, so they would pile up + # under names of their own, and a reader would not know which build a + # product is of. set(WEBODF_PRODUCT_STEPS - COMMAND ${CMAKE_COMMAND} -E make_directory ${WEBODF_PRODUCTS_DIR}) + COMMAND ${CMAKE_COMMAND} -E make_directory ${WEBODF_PRODUCTS_DIR} + COMMAND ${CMAKE_COMMAND} + -DDIR=${WEBODF_PRODUCTS_DIR} + "-DKEEP=${WEBODF_PRODUCT_NAMES_ARG}" + -P ${CMAKE_CURRENT_SOURCE_DIR}/scripts/cmake/keep-products.cmake) foreach (WEBODF_PRODUCT_FILE ${WEBODF_PRODUCT_FILES}) list(APPEND WEBODF_PRODUCT_STEPS COMMAND ${CMAKE_COMMAND} -E copy_if_different @@ -538,7 +548,6 @@ if (WEBODF_PRODUCT_FILES) COMMAND ${CMAKE_COMMAND} -E echo "" COMMAND ${CMAKE_COMMAND} -E echo "The products of this build are in ${WEBODF_PRODUCTS_DIR}:") - get_property(WEBODF_PRODUCT_NAME_LIST GLOBAL PROPERTY WEBODF_PRODUCT_NAMES) foreach (WEBODF_PRODUCT_NAME ${WEBODF_PRODUCT_NAME_LIST}) list(APPEND WEBODF_PRODUCT_STEPS COMMAND ${CMAKE_COMMAND} -E echo " ${WEBODF_PRODUCT_NAME}") diff --git a/scripts/cmake/keep-products.cmake b/scripts/cmake/keep-products.cmake new file mode 100644 index 000000000..05a495a6a --- /dev/null +++ b/scripts/cmake/keep-products.cmake @@ -0,0 +1,18 @@ +# Take out of the directory of the products what another build left there. +# +# The products carry the version of the sources they were built from, so a +# second build writes files of another name beside the ones of the first, and +# a reader is left to tell which is which. Only the products of this build are +# kept: DIR is the directory, KEEP the names to leave in it. +# The names come as one string parted by commas: a list of cmake is parted by +# ";", which the shell that runs the build would read as the end of a command. +string(REPLACE "," ";" KEEP "${KEEP}") +file(GLOB WEBODF_THERE ${DIR}/*) +foreach (WEBODF_ONE ${WEBODF_THERE}) + get_filename_component(WEBODF_NAME ${WEBODF_ONE} NAME) + list(FIND KEEP ${WEBODF_NAME} WEBODF_WANTED) + if (WEBODF_WANTED EQUAL -1) + message(STATUS "Taking away the product of another build: ${WEBODF_NAME}") + file(REMOVE_RECURSE ${WEBODF_ONE}) + endif () +endforeach () From 9466cbf65b0dd0b9e9a050d500e3e6244ac69b5f Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 319/385] Drawn the formulas a text holds. --- webodf/lib/odf/OdfCanvas.js | 67 +++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index e342a8a25..6198d45e1 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -216,6 +216,7 @@ /**@const@type {!string}*/svgns = odf.Namespaces.svgns, /**@const@type {!string}*/tablens = odf.Namespaces.tablens, /**@const@type {!string}*/chartns = odf.Namespaces.chartns, + /**@const@type {!string}*/mathns = odf.Namespaces.mathns, /**@const@type {!string}*/textns = odf.Namespaces.textns, /**@const@type {!string}*/xlinkns = odf.Namespaces.xlinkns, /**@const@type {!string}*/presentationns = odf.Namespaces.presentationns, @@ -3608,6 +3609,71 @@ applyImageClip(node, 'imageclip' + String(i), container, stylesheet); } } + /** + * Draw the formulas a text holds. + * + * A formula is a document of its own inside the package, written in + * MathML: it is read and put in the element that stands for it, which + * the browser draws, as it draws MathML of its own. An office writes + * an image of the formula beside it, under "ObjectReplacements", but + * a package need not hold one, and this document holds none. + * @param {!odf.OdfContainer} container + * @param {!Element} odffragment + * @return {undefined} + */ + function loadFormulas(container, odffragment) { + var objects = odffragment.getElementsByTagNameNS(drawns, "object"), + /**@type{!number}*/ + i; + /** + * @param {!Element} object + * @return {undefined} + */ + function loadFormula(object) { + var href = object.getAttributeNS(xlinkns, "href"), + /**@type{!string}*/ + path; + if (!href) { + return; + } + path = href.replace(/^\.?\//, "").replace(/\/$/, "") + + "/content.xml"; + container.getPartData(path, function (err, data) { + var /**@type{?Document}*/ + formula = null; + if (err || !data) { + return; + } + try { + formula = runtime.parseXML( + runtime.byteArrayToString(data, "utf8") + ); + } catch (e) { + formula = null; + } + if (!formula || !formula.documentElement + || formula.documentElement.namespaceURI + !== mathns) { + return; + } + while (object.firstChild) { + object.removeChild(object.firstChild); + } + object.appendChild( + object.ownerDocument.importNode( + formula.documentElement, + true + ) + ); + object.setAttributeNS(webodfhelperns, + "webodfhelper:formula", "true"); + }); + } + for (i = 0; i < objects.length; i += 1) { + loadFormula(/**@type{!Element}*/(objects.item(i))); + } + } + /** * Render embedded chart objects (draw:object -> chart sub-document) as * static SVG backgrounds on the object element. @@ -4291,6 +4357,7 @@ textLayout.layOutTabs(odfnode); loadImages(container, odfnode.body, css); loadCharts(container, odfnode.body, css); + loadFormulas(container, odfnode.body); loadVideos(container, odfnode.body); // WebODF's default graphic style lists "page" among its tags, so it // leaks a fill/border onto every draw:page. Reset it (low specificity) From 7c0cdbd714dcaf17b98ef67150b22f867cbe56b1 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 320/385] Left out the spacing under the last thing a page holds. --- webodf/lib/odf/TextLayout.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 6586b9fa8..d7d2bb72b 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3813,10 +3813,20 @@ odf.TextLayout = function TextLayout() { // added, as an office adds them, and not folded into one as the // browser folds the margins of two elements that follow one another: // a box that lays its children in a column keeps them apart. + sheet.insertRule(".webodf-pageBox, office|text, text|section," - + " text|table-of-content, text|index-body, text|index-title" + + " text|table-of-content, text|index-body" + " {display:flex;flex-direction:column;align-items:stretch;}", sheet.cssRules.length); + // The spacing under the last child of such a box is not folded into + // the edge of the box, as it is in a box that lays its children one + // under another: a page that ends on it would be one spacing too + // full, and the line above it moved to the next page for nothing. + sheet.insertRule(".webodf-pageBox > :last-child," + + " office|text > :last-child, text|section > :last-child," + + " text|table-of-content > :last-child," + + " text|index-body > :last-child {margin-bottom:0;}", + sheet.cssRules.length); sheet.insertRule(".webodf-pageBox {overflow:hidden;contain:strict;}", sheet.cssRules.length); while (text.firstChild) { From 21c2ec77cfcf3c6cfb615762ccbe446ab694fa34 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 321/385] Written a table whole where it may not be cut between its rows. --- webodf/lib/odf/TextLayout.js | 62 +++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 97d131532..8415020fa 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3020,6 +3020,47 @@ odf.TextLayout = function TextLayout() { ? tail : null; } + /** + * Whether a table may be cut between two of its rows. + * + * A table that says "style:may-break-between-rows" is false is written + * whole on one page, as an office writes it: it goes to the page that + * follows rather than being cut, unless the page holds nothing else and + * it is taller than a page, where it is cut all the same. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!Element} table + * @return {!boolean} + */ + function mayBreakBetweenRows(odfroot, table) { + var name = table.getAttributeNS(tablens, "style-name") || "", + /**@type{?Element}*/ + style, + /**@type{?Element}*/ + properties, + /**@type{!string}*/ + said = "", + /**@type{!number}*/ + depth = 0; + while (name !== "" && said === "" && depth < 16) { + style = styleOf(odfroot, name, "table"); + if (!style && plainStyleName(name) !== name) { + name = plainStyleName(name); + style = styleOf(odfroot, name, "table"); + } + if (!style) { + break; + } + properties = domUtils.getDirectChild(style, stylens, + "table-properties"); + said = properties + ? properties.getAttributeNS(stylens, "may-break-between-rows") + || "" + : ""; + name = style.getAttributeNS(stylens, "parent-style-name") || ""; + depth += 1; + } + return said !== "false"; + } /** * Cut an element where the page ends, and answer what is left of it: a * copy of the element that holds what did not fit. @@ -3031,9 +3072,11 @@ odf.TextLayout = function TextLayout() { * @param {!Element} element * @param {!number} depth how far the cut may reach into the element * @param {!boolean} alone whether the page holds nothing else + * @param {?odf.ODFDocumentElement=} odfroot the document, that says of a + * table whether it may be cut between two of its rows * @return {?Element} what did not fit, or nothing if all of it fits */ - function cutElement(box, element, depth, alone) { + function cutElement(box, element, depth, alone, odfroot) { var doc = /**@type{!Document}*/(box.ownerDocument), bottom = box.getBoundingClientRect().bottom, /**@type{?Node}*/ @@ -3052,6 +3095,15 @@ odf.TextLayout = function TextLayout() { next, /**@type{!ClientRect}*/ rect; + // A table that is written whole is not cut: it goes to the page + // that follows, unless the page holds nothing else, where it is cut + // rather than sent from page to page for ever. + if (!alone && element.namespaceURI === tablens + && element.localName === "table" + && odfroot !== undefined && odfroot !== null + && !mayBreakBetweenRows(odfroot, element)) { + return null; + } // What the element itself says of its size is not read: a section // and a list of the standard are drawn of no height at all while // what they hold is drawn under them, and nothing of them would @@ -3085,7 +3137,7 @@ odf.TextLayout = function TextLayout() { from = node; } else if (depth > 0) { inner = cutElement(box, /**@type{!Element}*/(node), - depth - 1, alone); + depth - 1, alone, odfroot); if (!inner) { from = node; } @@ -3276,7 +3328,7 @@ odf.TextLayout = function TextLayout() { held = String(node.textContent).length; lines = linesOf(/**@type{!Element}*/(node)); rest = cutElement(box, /**@type{!Element}*/(node), 8, - box.childNodes.length === 1); + box.childNodes.length === 1, state.root); if (rest && box.childNodes.length > 1 && !cutWhereAnOfficeWould( /**@type{!Element}*/(node), lines @@ -3444,6 +3496,7 @@ odf.TextLayout = function TextLayout() { } return { text: text, + root: odfroot, doc: doc, htmlns: doc.documentElement.namespaceURI, plan: plan, @@ -3617,7 +3670,7 @@ odf.TextLayout = function TextLayout() { held = String(over.textContent).length; lines = linesOf(over); more = cutElement(box, over, 8, - over === box.firstElementChild); + over === box.firstElementChild, odfroot); if (more && over !== box.firstElementChild && !cutWhereAnOfficeWould(over, lines)) { while (more.firstChild) { @@ -4002,6 +4055,7 @@ odf.TextLayout.TabStop; /**@typedef{{ text:!Element, + root:!odf.ODFDocumentElement, doc:!Document, htmlns:?string, plan:!Object, From 65aa5514103376800816b27540cbcfacf0dd4566 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 322/385] Worked out the labels of the lists once, and written them on the elements. --- webodf/lib/odf/ListStylesToCss.js | 322 ++++++++++++++++++++++-------- webodf/lib/odf/TextLayout.js | 19 +- 2 files changed, 246 insertions(+), 95 deletions(-) diff --git a/webodf/lib/odf/ListStylesToCss.js b/webodf/lib/odf/ListStylesToCss.js index 161f1a83b..29f1678ae 100644 --- a/webodf/lib/odf/ListStylesToCss.js +++ b/webodf/lib/odf/ListStylesToCss.js @@ -47,13 +47,6 @@ listCounterIdSuffix = "webodf-listLevel", /**@const @type{!Object.}*/ - stylemap = { - '1': 'decimal', - 'a': 'lower-latin', - 'A': 'upper-latin', - 'i': 'lower-roman', - 'I': 'upper-roman' - }, /**@const @type{!RegExp}*/ // Symbol/dingbat fonts whose glyphs are encoded as plain ASCII letters. @@ -376,6 +369,49 @@ }; } + /** + * A number written as the format of a level asks: "1" for the numbers, + * "a" and "A" for the letters, "i" and "I" for the numbers of Rome. + * @param {!number} value + * @param {!string} format + * @return {!string} + */ + function writtenAs(value, format) { + var letters = "abcdefghijklmnopqrstuvwxyz", + romans = [[1000, "m"], [900, "cm"], [500, "d"], [400, "cd"], + [100, "c"], [90, "xc"], [50, "l"], [40, "xl"], [10, "x"], + [9, "ix"], [5, "v"], [4, "iv"], [1, "i"]], + /**@type{!string}*/ + written = "", + /**@type{!number}*/ + left = value, + /**@type{!number}*/ + i; + if (format === "a" || format === "A") { + // A number past the letters is written with as many letters as + // it takes, "aa" after "z", which is how an office writes it. + while (left > 0) { + left -= 1; + written = letters.charAt(left % 26) + written; + left = Math.floor(left / 26); + } + return format === "A" + ? written.toUpperCase() + : written; + } + if (format === "i" || format === "I") { + for (i = 0; i < romans.length; i += 1) { + while (left >= romans[i][0]) { + written += romans[i][1]; + left -= romans[i][0]; + } + } + return format === "I" + ? written.toUpperCase() + : written; + } + return String(value); + } /** * @constructor */ @@ -423,90 +459,17 @@ } /** - * The way the numbers of one level of a list are written. + * The content of the label of a numbered list. * - * A label that shows more than one level shows each of them as its - * own level is written: the levels of a list are named beside one - * another in the style of the list, so the one that is asked for is - * read there. - * @param {!Element} node the level the label belongs to - * @param {!number} level the level the number belongs to - * @param {!string} fallback what to write where that level says - * nothing, the format of the label itself - * @return {!string} - */ - function formatOfLevel(node, level, fallback) { - var /**@type{?Element}*/ - walk = node.parentNode - ? /**@type{!Element}*/(node.parentNode).firstElementChild - : null, - /**@type{!string}*/ - format; - while (walk) { - if (walk.namespaceURI === textns - && String(walk.getAttributeNS(textns, "level")) - === String(level)) { - format = walk.getAttributeNS(stylens, "num-format") || ""; - return stylemap.hasOwnProperty(format) - ? stylemap[format] - : fallback; - } - walk = walk.nextElementSibling; - } - return fallback; - } - /** - * Gets the CSS content for a numbered list - * @param {!Element} node + * The label itself is worked out once and written on the element, + * see "numberLists": the counters of css are of the page and not of + * the document wherever a page holds its own styles, and a page that + * holds its own styles is laid out for much less. * @return {!string} */ - function getNumberRule(node) { - var style = node.getAttributeNS(stylens, "num-format"), - /**@type{!string}*/ - suffix = node.getAttributeNS(stylens, "num-suffix") || "", - /**@type{!string}*/ - prefix = node.getAttributeNS(stylens, "num-prefix") || "", - /**@type{!string}*/ - content = "", - textLevel = node.getAttributeNS(textns, "level"), - displayLevels = node.getAttributeNS(textns, "display-levels"), - /**@type{!number}*/ - shown; - if (prefix) { - // Content needs to be on a new line if it contains slashes due to a bug in older versions of webkit - // E.g., the one used in the qt runtime tests - https://bugs.webkit.org/show_bug.cgi?id=35010 - content += '"' + escapeCSSString(prefix) + '"\n'; - } - if (stylemap.hasOwnProperty(style)) { - textLevel = textLevel ? parseInt(textLevel, 10) : 1; - displayLevels = displayLevels ? parseInt(displayLevels, 10) : 1; - - // as we might want to display a subset of the counters - // we assume a different counter for each list level - // and concatenate them for multi level lists - // https://wiki.openoffice.org/wiki/Number_labels - // Each level of the label is written in the format of its - // own level and not in the format of the last of them: a - // level of letters under which the levels are numbered - // gives "F.2", where the format of the second level alone - // gave "1.1" for it. - while (displayLevels > 0) { - shown = textLevel - displayLevels + 1; - content += " counter(" + shown + listCounterIdSuffix + "," - + formatOfLevel(node, shown, stylemap[style]) + ")"; - if (displayLevels > 1) { - content += '"."'; - } - displayLevels -= 1; - } - } else if (style) { - content += ' "' + style + '"'; - } else { - content += ' ""'; - } - return 'content:' + content + ' "' + escapeCSSString(suffix) + '"'; + function getNumberRule() { + return "content: attr(odf-list-label);"; } - /** * Gets the CSS content for a image bullet list * @return {!string} @@ -564,7 +527,7 @@ followedBy; if (node.localName === "list-level-style-number") { - contentRule = getNumberRule(node); + contentRule = getNumberRule(); } else if (node.localName === "list-level-style-image") { contentRule = getImageRule(); } else if (node.localName === "list-level-style-bullet") { @@ -850,6 +813,188 @@ listCounter.initialiseCreatedCounters(); } + /** + * The level of a list style that answers for a level of a list. + * @param {!Element} style the "text:list-style" + * @param {!number} level from one + * @return {?Element} + */ + function levelOfStyle(style, level) { + var node = style.firstElementChild; + while (node) { + if (node.namespaceURI === textns + && String(node.getAttributeNS(textns, "level")) + === String(level)) { + return node; + } + node = node.nextElementSibling; + } + return null; + } + /** + * Write on one item of a list the label it carries. + * @param {!Element} item + * @param {!Element} style the "text:list-style" + * @param {!number} level from one + * @param {!Array.} held the number each level stands at + * @return {undefined} + */ + function labelOne(item, style, level, held) { + var rule = levelOfStyle(style, level), + /**@type{!string}*/ + written = "", + /**@type{!number}*/ + shows, + /**@type{!number}*/ + start, + /**@type{?Element}*/ + own, + /**@type{!string}*/ + format, + /**@type{!number}*/ + l; + if (!rule || rule.localName !== "list-level-style-number") { + return; + } + start = parseInt(item.getAttributeNS(textns, "start-value") + || rule.getAttributeNS(textns, "start-value") || "", 10); + if (isNaN(start)) { + held[level - 1] = (held[level - 1] || 0) + 1; + } else { + held[level - 1] = start; + } + held.length = level; + shows = parseInt(rule.getAttributeNS(textns, "display-levels") + || "1", 10); + if (isNaN(shows) || shows < 1) { + shows = 1; + } + written += rule.getAttributeNS(stylens, "num-prefix") || ""; + for (l = level - shows + 1; l <= level; l += 1) { + own = levelOfStyle(style, l); + format = own + ? own.getAttributeNS(stylens, "num-format") || "1" + : "1"; + written += writtenAs(held[l - 1] || 1, format); + if (l < level) { + written += "."; + } + } + written += rule.getAttributeNS(stylens, "num-suffix") || ""; + /**@type{!Element}*/(item.firstElementChild).setAttribute( + "odf-list-label", + written + ); + } + /** + * Write on every item of every list the label it carries. + * + * The numbers of the lists were counted by the counters of css, + * which are of the page and not of the document wherever a page + * holds its own styles: they are counted here instead, once, in the + * order the document is written, and written on the elements as + * "odf-list-label", which the rules of the labels read. + * + * What the standard says of the numbering is answered for: the + * format of each level and the levels a label shows, the prefix and + * the suffix of a level, the number a level starts at, and a list + * that carries on the numbering of the last list of its style. + * @param {!Element} odfBody + * @param {(!Object.|undefined)} listStyles + * @return {undefined} + */ + function numberLists(odfBody, listStyles) { + var lists = odfBody.getElementsByTagNameNS(textns, "list"), + /**@type{!Object.>}*/ + counts = {}, + /**@type{!number}*/ + i; + /** + * The style a list is written in, its own or the one of the list + * it stands in. + * @param {!Element} list + * @return {!string} + */ + function styleOfList(list) { + var walk = /**@type{?Element}*/(list), + /**@type{!string}*/ + name = ""; + while (walk && !name) { + if (walk.namespaceURI === textns + && walk.localName === "list") { + name = walk.getAttributeNS(textns, "style-name") || ""; + } + walk = /**@type{?Element}*/(walk.parentElement); + } + return listStyles && listStyles.hasOwnProperty(name) + ? name + : ""; + } + /** + * How deep a list stands among the lists, from one. + * @param {!Element} list + * @return {!number} + */ + function levelOfList(list) { + var walk = /**@type{?Element}*/(list.parentElement), + /**@type{!number}*/ + level = 1; + while (walk) { + if (walk.namespaceURI === textns + && walk.localName === "list") { + level += 1; + } + walk = /**@type{?Element}*/(walk.parentElement); + } + return level; + } + /** + * Write the labels of the items of one list. + * @param {!Element} list + * @return {undefined} + */ + function numberOne(list) { + var name = styleOfList(list), + level = levelOfList(list), + /**@type{!Element}*/ + style, + /**@type{!Array.}*/ + held, + /**@type{?Element}*/ + item; + if (!name || !listStyles) { + return; + } + style = listStyles[name].element; + held = counts.hasOwnProperty(name) + ? counts[name] + : []; + counts[name] = held; + // A list that does not carry on the numbering of the last + // list of its style begins where its style says. + if (level === 1 + && !list.getAttributeNS(textns, "continue-numbering") + && !list.getAttributeNS(textns, "continue-list")) { + held.length = 0; + } + item = list.firstElementChild; + while (item) { + if (item.namespaceURI === textns + && item.localName === "list-item" + && item.firstElementChild + && item.firstElementChild.localName !== "list") { + labelOne(item, style, level, held); + } + item = item.nextElementSibling; + } + } + if (!listStyles) { + return; + } + for (i = 0; i < lists.length; i += 1) { + numberOne(/**@type{!Element}*/(lists.item(i))); + } + } /** * Creates CSS styles from the given ODF list styles and applies them to the stylesheet * @param {!CSSStyleSheet} styleSheet @@ -873,6 +1018,7 @@ } applyContentBasedStyles(styleSheet, odfBody, styleFamilyTree); + numberLists(odfBody, styleFamilyTree); }; }; }()); diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 288aef3fd..1b08dc444 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3201,13 +3201,18 @@ odf.TextLayout = function TextLayout() { // every measure of the page being filled lays out the whole of the // document again, and a document of eight hundred pages is laid out // eight hundred times over. - // The page is laid out on its own — its size, its layout and what - // it paints are its own — but not its counters: "contain:strict" - // holds the styles as well, and the numbers of a list begin again - // at every page that way. The three that are of the layout are - // named instead. - sheet.insertRule(".webodf-pageBox {overflow:hidden;" - + "contain:size layout paint;}", + // A page holds what it holds and is of the size the plan gives it: + // the browser is told so, so that a page that is filled is laid out + // on its own and not with the pages that went before it. Without it + // every measure of the page being filled lays out the whole of the + // document again, and a document of eight hundred pages is laid out + // eight hundred times over. + // + // The styles of a page are its own as well, which holds the counters + // of css to the page: the labels of the lists are worked out once + // and written on the elements, so nothing of the document is counted + // by them any more, see "numberLists" in "ListStylesToCss.js". + sheet.insertRule(".webodf-pageBox {overflow:hidden;contain:strict;}", sheet.cssRules.length); while (text.firstChild) { store.appendChild(text.firstChild); From 2cfe061969093bb63379f454c8089bf7ac186ece Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 323/385] Set the height of the text on the text, not in the sheet of the layout. --- webodf/lib/odf/TextLayout.js | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index b598de244..809b3aa94 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3175,19 +3175,16 @@ odf.TextLayout = function TextLayout() { // is drawn after it stands under them. plan = /**@type{!PagePlan}*/(filling.plan); // The text is as tall as the pages it holds so far, so that what is - // drawn after it stands under them. The rule is written anew at each - // turn and not added to: a sheet of a thousand rules is read again - // for each of them. - if (filling.heightRule >= 0 - && filling.heightRule < filling.sheet.cssRules.length) { - filling.sheet.deleteRule(filling.heightRule); - } - filling.heightRule = filling.sheet.cssRules.length; - filling.sheet.insertRule("office|text {height:" + Math.max(0, + // drawn after it stands under them. It is written on the element + // itself and not in the sheet of the layout: a rule that is taken + // away and written anew at every turn tells the browser that every + // style of the document is to be worked out again, and a document of + // eight hundred pages is worked out anew eight hundred times. + filling.text.setAttribute("style", "height:" + Math.max(0, filling.top - plan.at(Math.max(0, filling.page - 1)) .pageSeparation) + "px;width:" + (pagesPerRow * (plan.at(0).pageWidth + plan.at(0).pageSeparation) - - plan.at(0).pageSeparation) + "px;}", filling.heightRule); + - plan.at(0).pageSeparation) + "px;"); drawPageFurniture(fillingRoot, plan, fillingDiv, readMeta(fillingRoot), from); if (filling.waiting.length > 0 && filling.page < maxPages) { From 573f7fb50ff476e5ca8b2f82c10b0a365d7a24db Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 324/385] Kept the documents the tests read apart from the tests themselves. --- webodf/tests/CMakeLists.txt | 10 +++++----- webodf/tests/{odf => documents}/README | 6 ++++-- .../{odf => documents}/libreoffice-beehive.otp | Bin .../tests/{odf => documents}/libreoffice-bpmn.otg | Bin .../libreoffice-business-letter.ott | Bin webodf/tests/{odf => documents}/libreoffice-cv.ott | Bin webodf/tests/{odf => documents}/loadsave.odt | Bin webodf/tests/{odf => documents}/malicious-js.fodt | 0 .../{odf => documents}/opendocument-v1.3-part3.odt | Bin .../tests/{odf/stylefodt => documents}/simple.fodt | 0 webodf/tests/{odf => documents}/unsafe.fodt | 0 webodf/tests/{ => documents}/visual-tests.fodt | 0 webodf/tests/odf/MaliciousDocumentTests.js | 2 +- webodf/tests/odf/OdfContainerSafetyTests.js | 2 +- webodf/tests/odf/OdfContainerTests.js | 6 +++--- webodf/tests/odf/OfficeDocumentsTests.js | 8 ++++---- webodf/tests/odf/StyleCacheTests.js | 2 +- 17 files changed, 19 insertions(+), 17 deletions(-) rename webodf/tests/{odf => documents}/README (81%) rename webodf/tests/{odf => documents}/libreoffice-beehive.otp (100%) rename webodf/tests/{odf => documents}/libreoffice-bpmn.otg (100%) rename webodf/tests/{odf => documents}/libreoffice-business-letter.ott (100%) rename webodf/tests/{odf => documents}/libreoffice-cv.ott (100%) rename webodf/tests/{odf => documents}/loadsave.odt (100%) rename webodf/tests/{odf => documents}/malicious-js.fodt (100%) rename webodf/tests/{odf => documents}/opendocument-v1.3-part3.odt (100%) rename webodf/tests/{odf/stylefodt => documents}/simple.fodt (100%) rename webodf/tests/{odf => documents}/unsafe.fodt (100%) rename webodf/tests/{ => documents}/visual-tests.fodt (100%) diff --git a/webodf/tests/CMakeLists.txt b/webodf/tests/CMakeLists.txt index dcdfe37bf..808fb281e 100644 --- a/webodf/tests/CMakeLists.txt +++ b/webodf/tests/CMakeLists.txt @@ -1,3 +1,7 @@ +# The documents the tests read are gathered in "documents/", beside the +# tests that read them and not among them: what is code is told from what +# is read, and the licence each document is under is written in one place, +# see "documents/README". FILE( GLOB_RECURSE TESTS_TESTFILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/manifest.json @@ -7,11 +11,7 @@ FILE( GLOB_RECURSE TESTS_TESTFILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*/*.js ${CMAKE_CURRENT_SOURCE_DIR}/*/*.xml ${CMAKE_CURRENT_SOURCE_DIR}/*/*.zip - ${CMAKE_CURRENT_SOURCE_DIR}/*/*.odt - ${CMAKE_CURRENT_SOURCE_DIR}/*/*.fodt - ${CMAKE_CURRENT_SOURCE_DIR}/*/*.ott - ${CMAKE_CURRENT_SOURCE_DIR}/*/*.otp - ${CMAKE_CURRENT_SOURCE_DIR}/*/*.otg + ${CMAKE_CURRENT_SOURCE_DIR}/documents/* ) COPY_FILES(tests_nodetests ${CMAKE_CURRENT_SOURCE_DIR} diff --git a/webodf/tests/odf/README b/webodf/tests/documents/README similarity index 81% rename from webodf/tests/odf/README rename to webodf/tests/documents/README index 5ca99dc4b..a8514e84c 100644 --- a/webodf/tests/odf/README +++ b/webodf/tests/documents/README @@ -1,4 +1,6 @@ -The documents of this directory are read by the tests beside them. +The documents of this directory are the ones the tests read: they are +kept apart from the tests themselves, that stand in "odf/", "gui/" and +"ops/" beside the parts of the library they try. Four of them are the templates LibreOffice ships, taken from the sources of it as they are, under the Mozilla Public License, version 2.0: @@ -20,4 +22,4 @@ test of a document written here never asks: whether the library still reads what an office writes. "opendocument-v1.3-part3.odt" is the standard itself, as OASIS publishes -it, and is read by "OdfContainerTests.js" and "LayoutTests.js". +it, and is read by "OdfContainerTests.js". diff --git a/webodf/tests/odf/libreoffice-beehive.otp b/webodf/tests/documents/libreoffice-beehive.otp similarity index 100% rename from webodf/tests/odf/libreoffice-beehive.otp rename to webodf/tests/documents/libreoffice-beehive.otp diff --git a/webodf/tests/odf/libreoffice-bpmn.otg b/webodf/tests/documents/libreoffice-bpmn.otg similarity index 100% rename from webodf/tests/odf/libreoffice-bpmn.otg rename to webodf/tests/documents/libreoffice-bpmn.otg diff --git a/webodf/tests/odf/libreoffice-business-letter.ott b/webodf/tests/documents/libreoffice-business-letter.ott similarity index 100% rename from webodf/tests/odf/libreoffice-business-letter.ott rename to webodf/tests/documents/libreoffice-business-letter.ott diff --git a/webodf/tests/odf/libreoffice-cv.ott b/webodf/tests/documents/libreoffice-cv.ott similarity index 100% rename from webodf/tests/odf/libreoffice-cv.ott rename to webodf/tests/documents/libreoffice-cv.ott diff --git a/webodf/tests/odf/loadsave.odt b/webodf/tests/documents/loadsave.odt similarity index 100% rename from webodf/tests/odf/loadsave.odt rename to webodf/tests/documents/loadsave.odt diff --git a/webodf/tests/odf/malicious-js.fodt b/webodf/tests/documents/malicious-js.fodt similarity index 100% rename from webodf/tests/odf/malicious-js.fodt rename to webodf/tests/documents/malicious-js.fodt diff --git a/webodf/tests/odf/opendocument-v1.3-part3.odt b/webodf/tests/documents/opendocument-v1.3-part3.odt similarity index 100% rename from webodf/tests/odf/opendocument-v1.3-part3.odt rename to webodf/tests/documents/opendocument-v1.3-part3.odt diff --git a/webodf/tests/odf/stylefodt/simple.fodt b/webodf/tests/documents/simple.fodt similarity index 100% rename from webodf/tests/odf/stylefodt/simple.fodt rename to webodf/tests/documents/simple.fodt diff --git a/webodf/tests/odf/unsafe.fodt b/webodf/tests/documents/unsafe.fodt similarity index 100% rename from webodf/tests/odf/unsafe.fodt rename to webodf/tests/documents/unsafe.fodt diff --git a/webodf/tests/visual-tests.fodt b/webodf/tests/documents/visual-tests.fodt similarity index 100% rename from webodf/tests/visual-tests.fodt rename to webodf/tests/documents/visual-tests.fodt diff --git a/webodf/tests/odf/MaliciousDocumentTests.js b/webodf/tests/odf/MaliciousDocumentTests.js index ce790aa57..1f9a61640 100644 --- a/webodf/tests/odf/MaliciousDocumentTests.js +++ b/webodf/tests/odf/MaliciousDocumentTests.js @@ -93,7 +93,7 @@ odf.MaliciousDocumentTests = function MaliciousDocumentTests(runner) { } function loadInjectionDocument(callback) { - t.odf = new odf.OdfContainer("odf/malicious-js.fodt", function(odf) { + t.odf = new odf.OdfContainer("documents/malicious-js.fodt", function(odf) { t.doc.importNode(odf.rootElement, true); t.root.appendChild(odf.rootElement); diff --git a/webodf/tests/odf/OdfContainerSafetyTests.js b/webodf/tests/odf/OdfContainerSafetyTests.js index 8cf34ad35..39219cece 100644 --- a/webodf/tests/odf/OdfContainerSafetyTests.js +++ b/webodf/tests/odf/OdfContainerSafetyTests.js @@ -115,7 +115,7 @@ odf.OdfContainerSafetyTests = function OdfContainerSafetyTests(runner) { * Tests that an odt file loads without executing embedded code. */ function loadSafely(callback) { - var path = r.resourcePrefix() + "odf/unsafe.fodt"; + var path = r.resourcePrefix() + "documents/unsafe.fodt"; t.odf = new odf.OdfContainer(path, function (container) { t.odf = container; r.shouldBe(t, "t.odf.state", "odf.OdfContainer.DONE"); diff --git a/webodf/tests/odf/OdfContainerTests.js b/webodf/tests/odf/OdfContainerTests.js index 6949a9c6d..be6c6484c 100644 --- a/webodf/tests/odf/OdfContainerTests.js +++ b/webodf/tests/odf/OdfContainerTests.js @@ -363,8 +363,8 @@ odf.OdfContainerTests = function OdfContainerTests(runner) { compareZipEntryList(odf1path, odf2path, callback); } function loadAndSave(callback) { - var path = "odf/loadsave.odt", - newpath = "odf/newloadsave.odt"; + var path = "documents/loadsave.odt", + newpath = "documents/newloadsave.odt"; t.odf = new odf.OdfContainer(path, function (o1) { t.odf = o1; r.shouldBe(t, "t.odf.state", "odf.OdfContainer.DONE"); @@ -398,7 +398,7 @@ odf.OdfContainerTests = function OdfContainerTests(runner) { // It answers the question the small documents of a test never do, which is // whether the library still reads what an office writes. function loadTheStandard(callback) { - t.odf = new odf.OdfContainer("odf/opendocument-v1.3-part3.odt", + t.odf = new odf.OdfContainer("documents/opendocument-v1.3-part3.odt", function (container) { t.odf = container; r.shouldBe(t, "t.odf.state", "odf.OdfContainer.DONE"); diff --git a/webodf/tests/odf/OfficeDocumentsTests.js b/webodf/tests/odf/OfficeDocumentsTests.js index 59a227326..67b2ad7b9 100644 --- a/webodf/tests/odf/OfficeDocumentsTests.js +++ b/webodf/tests/odf/OfficeDocumentsTests.js @@ -68,7 +68,7 @@ odf.OfficeDocumentsTests = function OfficeDocumentsTests(runner) { }); } function readTheLetterOfAnOffice(callback) { - readOne("odf/libreoffice-business-letter.ott", "text", function () { + readOne("documents/libreoffice-business-letter.ott", "text", function () { // The letter is written of frames, that hold the sender and the // logo, and of paragraphs. t.paragraphs = t.odf.rootElement.body.getElementsByTagNameNS( @@ -80,10 +80,10 @@ odf.OfficeDocumentsTests = function OfficeDocumentsTests(runner) { }); } function readTheCurriculumOfAnOffice(callback) { - readOne("odf/libreoffice-cv.ott", "text", callback); + readOne("documents/libreoffice-cv.ott", "text", callback); } function readThePresentationOfAnOffice(callback) { - readOne("odf/libreoffice-beehive.otp", "presentation", function () { + readOne("documents/libreoffice-beehive.otp", "presentation", function () { t.pages = t.odf.rootElement.body.getElementsByTagNameNS( drawns, "page" @@ -96,7 +96,7 @@ odf.OfficeDocumentsTests = function OfficeDocumentsTests(runner) { // A drawing holds its pages in "office:drawing", which was read as // nothing at all before: the document was refused for want of a body // it was taken to have none of. - readOne("odf/libreoffice-bpmn.otg", "drawing", function () { + readOne("documents/libreoffice-bpmn.otg", "drawing", function () { t.pages = t.odf.rootElement.body.getElementsByTagNameNS( drawns, "page" diff --git a/webodf/tests/odf/StyleCacheTests.js b/webodf/tests/odf/StyleCacheTests.js index c9289b39a..281f52517 100644 --- a/webodf/tests/odf/StyleCacheTests.js +++ b/webodf/tests/odf/StyleCacheTests.js @@ -33,7 +33,7 @@ odf.StyleCacheTests = function StyleTests(runner) { "use strict"; var r = runner, t; function simple(callback) { - var path = r.resourcePrefix() + "odf/stylefodt/simple.fodt"; + var path = r.resourcePrefix() + "documents/simple.fodt"; t.doc = new odf.OdfContainer(path, function (o) { t.doc = o; var styles = new odf.StyleCache(o.rootElement), From 6968528d6723986542c45e8ae3ecd9af5793adf6 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 325/385] Said nothing of what the AppImage cannot find and does not need. --- programs/opendocumentviewer-desktop/packaging.cmake | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake index d8cd17fcb..323f43d8d 100644 --- a/programs/opendocumentviewer-desktop/packaging.cmake +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -194,9 +194,20 @@ if (UNIX AND NOT APPLE) # takes the first one of the directory otherwise, which is this # one alone today and would be another the day a second is # installed. + # The tool of the AppImage looks for the metadata under the + # name it bore before, "appdata.xml", and warns where it finds + # none: the file is written under both names, the one of today + # and the one of yesterday. + COMMAND ${CMAKE_COMMAND} -E copy + ${VIEWER_APPDIR}/usr/share/metainfo/${VIEWER_ID}.metainfo.xml + ${VIEWER_APPDIR}/usr/share/metainfo/${VIEWER_ID}.appdata.xml COMMAND ${CMAKE_COMMAND} -E env LDAI_OUTPUT=${VIEWER_APPIMAGE} ${VIEWER_QMAKE} + # The plugin of qt looks for the modules of qml and says so + # where a program has none, which the viewer has not: it is + # told to leave qml alone. + QT_SKIP_MODULES=qml ${LINUXDEPLOY} --appdir ${VIEWER_APPDIR} --desktop-file ${VIEWER_APPDIR}/usr/share/applications/org.webodf.OpenDocumentViewer.desktop From 6743189ce3af3b58af30aec689a557e8f2e9578f Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 326/385] Told the plugin of qt where qmake is, or tell it nothing at all. --- .../opendocumentviewer-desktop/packaging.cmake | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake index 223917e30..e837149e8 100644 --- a/programs/opendocumentviewer-desktop/packaging.cmake +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -166,6 +166,18 @@ if (UNIX AND NOT APPLE) # The tool of the AppImage gathers the libraries an executable reads, and # the one of qt gathers what the webengine reads beside them, the # process of the engine among the rest. + # The plugin of qt is told where qmake is: it reads from it where the + # plugins of the platform, the images and the media stand, and it looks + # for "qmake" alone, which is the one of qt 5 where both are installed. + # An empty value is worse than none, as the plugin then looks no further + # and stops with "Could not find qmake". + find_program(QMAKE6 NAMES qmake6 qmake + PATHS /usr/lib/qt6/bin /usr/lib/x86_64-linux-gnu/qt6/bin) + if (QMAKE6) + set(VIEWER_QMAKE QMAKE=${QMAKE6}) + else () + set(VIEWER_QMAKE "") + endif () find_program(LINUXDEPLOY linuxdeploy) find_program(LINUXDEPLOY_QT linuxdeploy-plugin-qt) find_program(APPIMAGETOOL appimagetool) @@ -178,7 +190,7 @@ if (UNIX AND NOT APPLE) --prefix ${VIEWER_APPDIR}/usr COMMAND ${CMAKE_COMMAND} -E env OUTPUT=${VIEWER_APPIMAGE} - QMAKE=${QT_QMAKE_EXECUTABLE} + ${VIEWER_QMAKE} ${LINUXDEPLOY} --appdir ${VIEWER_APPDIR} --plugin qt --output appimage COMMAND ${CMAKE_COMMAND} -E echo "Wrote ${VIEWER_APPIMAGE}" From a7cf1ce91fe5c34aa5eed611fad41e8d4acf1016 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 327/385] Given a formula to every copy of the frame that holds it. --- webodf/lib/odf/OdfCanvas.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 6198d45e1..7d8441632 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -3545,6 +3545,8 @@ waitingForDoneTimeoutId, /**@type{!webodfcore.ScheduledTask}*/redrawContainerTask, shouldRefreshCss = false, + /**@type{!Object.}*/ + formulas = {}, /**@type{?odf.ListStyleToCss}*/ numbering = null, shouldRerenderAnnotations = false, @@ -3633,7 +3635,18 @@ var href = object.getAttributeNS(xlinkns, "href"), /**@type{!string}*/ path; - if (!href) { + if (!href + || object.getElementsByTagNameNS(mathns, + "math").length > 0) { + return; + } + if (formulas.hasOwnProperty(href)) { + // The formula was read already: a copy of it is put in + // this one too, as an element that was cut in two is + // written on two pages and each holds the formula. + object.appendChild( + object.ownerDocument.importNode(formulas[href], true) + ); return; } path = href.replace(/^\.?\//, "").replace(/\/$/, "") @@ -3656,6 +3669,7 @@ !== mathns) { return; } + formulas[href] = formula.documentElement; while (object.firstChild) { object.removeChild(object.firstChild); } @@ -4382,6 +4396,13 @@ // scale the document anew: a row of two pages is twice as wide as // one, and is only that wide once the last page is drawn. textLayout.whenDrawn(function () { + // An element that was cut in two is written on two pages, + // and the copy of it that holds a formula may have been made + // before the formula was read: what is empty is filled from + // what was read already. + if (odfcontainer) { + loadFormulas(odfcontainer, odfnode.body); + } fireEvent("pagesdrawn", []); }); From 14e12836bb272ed78802004daf89aa3507763153 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 328/385] Set the pages right as soon as the fonts have truly landed. --- webodf/lib/odf/OdfCanvas.js | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 47eb43fcf..9039db32e 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -4027,6 +4027,36 @@ }); return; } + // A engine may say its fonts are ready before it draws with + // them: the first pages are then broken with the letters of + // another font and hold a line too many, which is only seen when + // the pages are all broken. The pages are set right as soon as + // the fonts have truly landed, and not at the end of the whole. + if (fonts && fonts.ready) { + fonts.ready.then(function () { + var tries = 20; + /** + * @return {undefined} + */ + function whenBroken() { + if (!paginated || !pagesDiv || !pagesDiv.parentNode) { + return; + } + if (textLayout.isBreaking()) { + tries -= 1; + if (tries > 0) { + runtime.setTimeout(whenBroken, 250); + } + return; + } + if (!textLayout.pagesFit(odfnode)) { + textLayout.repair(odfnode, + /**@type{!HTMLDivElement}*/(pagesDiv)); + } + } + whenBroken(); + }); + } loadingQueue.whenDrained(function () { if (!paginated || !pagesDiv || !pagesDiv.parentNode) { return; From a4fba9649eb9e22805bbaea3b7b77ead00826bc9 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 329/385] Put a row of two pages in the middle of the reader. --- .../assets/viewer.js | 7 +++ programs/opendocumentviewer-webext/viewer.js | 3 + webodf/lib/odf/OdfCanvas.js | 6 ++ webodf/lib/odf/TextLayout.js | 55 ++++++++++++++++++- 4 files changed, 68 insertions(+), 3 deletions(-) diff --git a/programs/opendocumentviewer-desktop/assets/viewer.js b/programs/opendocumentviewer-desktop/assets/viewer.js index 05ad95511..ec256d1b0 100644 --- a/programs/opendocumentviewer-desktop/assets/viewer.js +++ b/programs/opendocumentviewer-desktop/assets/viewer.js @@ -81,6 +81,13 @@ failure.hidden = true; ways.hidden = true; canvas = new odf.OdfCanvas(container); + // A row of two pages is twice as wide as one, so the document is + // scaled to the window anew every time the pages are drawn: they + // are drawn a few at a time, and the last of them says how wide + // the document is. + canvas.addListener("pagesdrawn", function () { + canvas.fitSmart(available()); + }); // A text is drawn over pages, as it is printed, which the // library does not do on its own. canvas.setPaginated(true); diff --git a/programs/opendocumentviewer-webext/viewer.js b/programs/opendocumentviewer-webext/viewer.js index d7431f39a..917784e3d 100644 --- a/programs/opendocumentviewer-webext/viewer.js +++ b/programs/opendocumentviewer-webext/viewer.js @@ -195,6 +195,9 @@ }); canvas.addListener("statereadychange", fit); + // A row of two pages is twice as wide as one, so the document is scaled to + // the window anew every time the pages are drawn. + canvas.addListener("pagesdrawn", fit); window.addEventListener("resize", refit); // Thunderbird names the attachment of a message rather than an address: diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index cc7a600ea..9ad660372 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -4202,6 +4202,12 @@ sizer.insertBefore(shadowContent, sizer.firstChild); zoomHelper.setZoomableElement(sizer); + // A reader is told when the pages are all drawn, so that it can + // scale the document anew: a row of two pages is twice as wide as + // one, and is only that wide once the last page is drawn. + textLayout.whenDrawn(function () { + fireEvent("pagesdrawn", []); + }); // Once the slide is laid out, shrink any overflowing autofit text. shrinkAutofitText(odfnode.body, container, css); diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 8415020fa..3fdca90ed 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -103,6 +103,8 @@ odf.TextLayout = function TextLayout() { * @type{!number} */ pagesPerRow = 1, + /**@type{?function():undefined}*/ + drawnHandler = null, /** * Whether the first page stands on its own, on the right of the * first row, as the first page of a book does. @@ -3790,6 +3792,27 @@ odf.TextLayout = function TextLayout() { } return fits; } + /** + * Make the box that holds the document as wide as a row of pages. + * + * The elements of the document are of no namespace of html, where a + * "style" attribute is left alone by the browser, so the width is written + * on the first element of html above them: the box the reader draws in, + * which is shrunk to the document and put in the middle by the reader. + * @param {!Element} from the box that holds the pages + * @param {!number} width + * @return {undefined} + */ + function widen(from, width) { + var html = "http://www.w3.org/1999/xhtml", + node = /**@type{?Element}*/(from.parentElement); + while (node && node.namespaceURI !== html) { + node = node.parentElement; + } + if (node) { + /**@type{!HTMLElement}*/(node).style.width = width + "px"; + } + } /** * Break a few pages, draw them, and take up the rest later. * @param {!number} round the layout this belongs to, so that a layout @@ -3801,6 +3824,8 @@ odf.TextLayout = function TextLayout() { /**@type{!PagePlan}*/ plan, /**@type{!number}*/ + rowWidth, + /**@type{!number}*/ from; if (round !== fillingRound || !filling || !fillingRoot || !fillingDiv) { @@ -3830,11 +3855,20 @@ odf.TextLayout = function TextLayout() { // away and written anew at every turn tells the browser that every // style of the document is to be worked out again, and a document of // eight hundred pages is worked out anew eight hundred times. + rowWidth = pagesPerRow + * (plan.at(0).pageWidth + plan.at(0).pageSeparation) + - plan.at(0).pageSeparation; filling.text.setAttribute("style", "height:" + Math.max(0, filling.top - plan.at(Math.max(0, filling.page - 1)) - .pageSeparation) + "px;width:" + (pagesPerRow - * (plan.at(0).pageWidth + plan.at(0).pageSeparation) - - plan.at(0).pageSeparation) + "px;"); + .pageSeparation) + "px;width:" + rowWidth + "px;"); + // The box that holds the pages is as wide as a row of them, and not + // as wide as the text of one page: a reader that puts the document + // in the middle then puts the whole row in the middle. + fillingDiv.style.width = rowWidth + "px"; + // The document itself is as wide as the row too, as what holds it is + // shrunk to the width of the document, and a row that is wider than + // it would hang out of the reader instead of standing in the middle. + widen(fillingDiv, rowWidth); drawPageFurniture(fillingRoot, plan, fillingDiv, readMeta(fillingRoot), from); if (filling.waiting.length > 0 && filling.page < maxPages) { @@ -3865,6 +3899,9 @@ odf.TextLayout = function TextLayout() { tellPageCount( /**@type{!odf.ODFDocumentElement}*/(fillingRoot), fillingDiv, countPages(fillingDiv)); + if (drawnHandler) { + drawnHandler(); + } } }, 0); } @@ -3922,6 +3959,18 @@ odf.TextLayout = function TextLayout() { return maxTime > 0; } this.layout = layout; + /** + * Be told when the pages are all drawn. + * + * A text is broken into pages a few at a time, so what holds the pages is + * of its last width only once the last of them is drawn: a reader that + * scales the document to its window scales it again then. + * @param {?function():undefined} handler + * @return {undefined} + */ + this.whenDrawn = function (handler) { + drawnHandler = handler; + }; /** * Lay the tabs of every paragraph of a text at their stops. * From 8be382fb930b299b54cb11ca21bb518dbab8aeef Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 330/385] Numbered a list where it stands, not once the list it stands in is done. --- webodf/lib/odf/ListStylesToCss.js | 96 +++++++++++++++++++------------ 1 file changed, 58 insertions(+), 38 deletions(-) diff --git a/webodf/lib/odf/ListStylesToCss.js b/webodf/lib/odf/ListStylesToCss.js index 29f1678ae..9680cc29e 100644 --- a/webodf/lib/odf/ListStylesToCss.js +++ b/webodf/lib/odf/ListStylesToCss.js @@ -909,6 +909,22 @@ counts = {}, /**@type{!number}*/ i; + /** + * Whether a list stands inside another list. + * @param {!Element} list + * @return {!boolean} + */ + function standsInAList(list) { + var walk = /**@type{?Element}*/(list.parentElement); + while (walk) { + if (walk.namespaceURI === textns + && walk.localName === "list") { + return true; + } + walk = /**@type{?Element}*/(walk.parentElement); + } + return false; + } /** * The style a list is written in, its own or the one of the list * it stands in. @@ -931,68 +947,72 @@ : ""; } /** - * How deep a list stands among the lists, from one. + * Write the labels of one list and of the lists it holds, in the + * order the document is written: a list that stands under an + * item is numbered where that item stands and not once the whole + * of the list it stands in is numbered, or it would carry the + * number of the last item of it. * @param {!Element} list - * @return {!number} + * @param {!Element} style the "text:list-style" + * @param {!number} level from one + * @param {!Array.} held the number each level stands at + * @return {undefined} */ - function levelOfList(list) { - var walk = /**@type{?Element}*/(list.parentElement), - /**@type{!number}*/ - level = 1; - while (walk) { - if (walk.namespaceURI === textns - && walk.localName === "list") { - level += 1; + function numberOne(list, style, level, held) { + var /**@type{?Element}*/ + item = list.firstElementChild, + /**@type{?Element}*/ + under; + while (item) { + if (item.namespaceURI === textns + && item.localName === "list-item") { + if (item.firstElementChild + && item.firstElementChild.localName + !== "list") { + labelOne(item, style, level, held); + } + under = item.firstElementChild; + while (under) { + if (under.namespaceURI === textns + && under.localName === "list") { + numberOne(under, style, level + 1, held); + } + under = under.nextElementSibling; + } } - walk = /**@type{?Element}*/(walk.parentElement); + item = item.nextElementSibling; } - return level; + } + if (!listStyles) { + return; } /** - * Write the labels of the items of one list. + * Write the labels of a list that stands in no other list, and + * of everything it holds. * @param {!Element} list * @return {undefined} */ - function numberOne(list) { + function numberWhole(list) { var name = styleOfList(list), - level = levelOfList(list), - /**@type{!Element}*/ - style, /**@type{!Array.}*/ - held, - /**@type{?Element}*/ - item; - if (!name || !listStyles) { + held; + if (!name || standsInAList(list) || !listStyles) { return; } - style = listStyles[name].element; held = counts.hasOwnProperty(name) ? counts[name] : []; counts[name] = held; // A list that does not carry on the numbering of the last // list of its style begins where its style says. - if (level === 1 - && !list.getAttributeNS(textns, "continue-numbering") + if (!list.getAttributeNS(textns, "continue-numbering") && !list.getAttributeNS(textns, "continue-list")) { held.length = 0; } - item = list.firstElementChild; - while (item) { - if (item.namespaceURI === textns - && item.localName === "list-item" - && item.firstElementChild - && item.firstElementChild.localName !== "list") { - labelOne(item, style, level, held); - } - item = item.nextElementSibling; - } - } - if (!listStyles) { - return; + numberOne(list, listStyles[name].element, 1, held); } for (i = 0; i < lists.length; i += 1) { - numberOne(/**@type{!Element}*/(lists.item(i))); + numberWhole(/**@type{!Element}*/(lists.item(i))); } } /** From 4b39cde4b5bc09fe310a4be4d24ac784ab272fb7 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 331/385] Taken back what a page cannot hold, and not the whole of what it was given. --- webodf/lib/odf/TextLayout.js | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 809b3aa94..55d97249c 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2752,15 +2752,16 @@ odf.TextLayout = function TextLayout() { if (added.length === 0) { break; } - if (overflows(box, added[0]) && added.length > 1) { - while (added.length > 0) { - taken = /**@type{!Node}*/(added.pop()); - if (taken) { - box.removeChild(taken); - state.waiting.unshift(taken); - } - } - state.chunk = 1; + while (added.length > 1 && overflows(box, added[0])) { + // The chunk is more than the page holds: what is over is + // taken back one node at a time, from the end, and the rest + // is left where it is. Taking the whole chunk back and + // writing it again one node at a time reads the page once + // for every node of it. + taken = /**@type{!Node}*/(added.pop()); + box.removeChild(taken); + state.waiting.unshift(taken); + state.chunk = Math.max(1, added.length); } if (added.length === 0 || !overflows(box, added[0])) { From 184b6760779580b5b770b7e45863b4063317e693 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 332/385] Written what a test writes to a directory of its own. --- .gitignore | 10 ++++++---- webodf/CMakeLists.txt | 5 +++++ webodf/tests/CMakeLists.txt | 7 +++++++ webodf/tests/odf/LayoutTests.js | 2 +- webodf/tests/odf/OdfContainerTests.js | 12 ++++++------ webodf/tests/odf/PageLayoutTests.js | 2 +- webodf/tests/webodfcore/RuntimeTests.js | 2 +- webodf/tests/webodfcore/ZipTests.js | 6 +++--- 8 files changed, 30 insertions(+), 16 deletions(-) diff --git a/.gitignore b/.gitignore index 9d4617af5..1be0a3f5a 100644 --- a/.gitignore +++ b/.gitignore @@ -29,10 +29,12 @@ node_modules/* webodf/webodf.css.js # The documents the tests write beside the ones they read. -webodf/tests/test.odt -webodf/tests/fontFaceDeclsTest.odt -webodf/tests/simple_slide.odp -webodf/tests/odf/newloadsave.odt +# What an office leaves beside a document it has open. +.~lock.*# + +# What a test writes, that goes to a directory of its own, see +# "webodf/tests/CMakeLists.txt". +webodf/tests/out/ # The library is copied into the assets of the viewer of android. programs/opendocumentviewer-android/src/main/assets/webodf.js diff --git a/webodf/CMakeLists.txt b/webodf/CMakeLists.txt index 6a3338acd..998000363 100644 --- a/webodf/CMakeLists.txt +++ b/webodf/CMakeLists.txt @@ -337,6 +337,11 @@ add_custom_target(doc DEPENDS docs/index.html) if (WEBODF_HAS_JAVA) add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/simplenodetest.timestamp + # This suite alone runs in the sources, as it reads the library the + # compiler wrote and the documents the sources hold: what it writes + # goes to "tests/out/", that the sources ignore. + COMMAND ${CMAKE_COMMAND} -E make_directory + ${CMAKE_CURRENT_SOURCE_DIR}/tests/out COMMAND ${NODE} ${CMAKE_CURRENT_BINARY_DIR}/simplecompiled.js COMMAND ${TOUCHFILE} ${CMAKE_CURRENT_BINARY_DIR}/simplenodetest.timestamp DEPENDS ${NODE} simplecompiled.js copy_node_modules diff --git a/webodf/tests/CMakeLists.txt b/webodf/tests/CMakeLists.txt index 808fb281e..834b634e2 100644 --- a/webodf/tests/CMakeLists.txt +++ b/webodf/tests/CMakeLists.txt @@ -1,3 +1,6 @@ +# What a test writes goes to "out/" of the directory it runs in, and never +# beside the documents it reads: a test that saves a document and reads it +# back left it among the sources before, where the next build found it. # The documents the tests read are gathered in "documents/", beside the # tests that read them and not among them: what is code is told from what # is read, and the licence each document is under is written in one place, @@ -28,6 +31,7 @@ endforeach(JSFILE ${LIBJSFILES}) add_custom_command( OUTPUT _nodetest/nodetest.timestamp + COMMAND ${CMAKE_COMMAND} -E make_directory out COMMAND ${NODE} ${RUNTIMEJS} tests.js COMMAND ${TOUCHFILE} nodetest.timestamp WORKING_DIRECTORY _nodetest @@ -49,6 +53,7 @@ COPY_FILES(tests_rhinotests ${CMAKE_CURRENT_SOURCE_DIR} add_custom_command( OUTPUT _rhinotest/rhinotest.timestamp + COMMAND ${CMAKE_COMMAND} -E make_directory out COMMAND ${Java_JAVA_EXECUTABLE} -Dwebodf.lib=${CMAKE_CURRENT_SOURCE_DIR}/../lib -jar ${RHINO} ${RUNTIMEJS} tests.js @@ -68,6 +73,7 @@ COPY_FILES(tests_simplerhinotests ${CMAKE_CURRENT_SOURCE_DIR} add_custom_command( OUTPUT _simplerhinotest/simplerhinotest.timestamp + COMMAND ${CMAKE_COMMAND} -E make_directory out COMMAND ${Java_JAVA_EXECUTABLE} -jar ${RHINO} ${CMAKE_CURRENT_BINARY_DIR}/../simplecompiled.js COMMAND ${TOUCHFILE} simplerhinotest.timestamp @@ -101,6 +107,7 @@ if (BUILD_QTJSRUNTIME) add_custom_command( OUTPUT _qtjsruntimetest/qtjsruntimetest.timestamp + COMMAND ${CMAKE_COMMAND} -E make_directory out COMMAND ${TESTS_PLATFORM} $ ${RUNTIMEJS} tests.js COMMAND ${TOUCHFILE} qtjsruntimetest.timestamp WORKING_DIRECTORY _qtjsruntimetest diff --git a/webodf/tests/odf/LayoutTests.js b/webodf/tests/odf/LayoutTests.js index c4e1bc10c..15ea5b808 100644 --- a/webodf/tests/odf/LayoutTests.js +++ b/webodf/tests/odf/LayoutTests.js @@ -187,7 +187,7 @@ odf.LayoutTests = function LayoutTests(runner) { root = odfContainer.rootElement, oldContent = root.body.getElementsByTagNameNS(officens, tag)[0], extension = isText ? ".odt" : ".odp", - path = test.name + extension; + path = "out/" + test.name + extension; replaceChildren(root.styles, input.getElementsByTagNameNS(officens, "styles")); replaceChildren(root.automaticStyles, diff --git a/webodf/tests/odf/OdfContainerTests.js b/webodf/tests/odf/OdfContainerTests.js index be6c6484c..e04c3c2e7 100644 --- a/webodf/tests/odf/OdfContainerTests.js +++ b/webodf/tests/odf/OdfContainerTests.js @@ -172,7 +172,7 @@ odf.OdfContainerTests = function OdfContainerTests(runner) { function createNewSaveAsAndLoad(callback) { t.odf = new odf.OdfContainer(odf.OdfContainer.DocumentType.TEXT, null); r.shouldBe(t, "t.odf.state", "odf.OdfContainer.DONE"); - var path = "test.odt"; + var path = "out/test.odt"; t.odf.saveAs(path, function (err) { t.err = err; r.shouldBeNull(t, "t.err"); @@ -188,8 +188,8 @@ odf.OdfContainerTests = function OdfContainerTests(runner) { t.odf = new odf.OdfContainer(odf.OdfContainer.DocumentType.TEXT, null); r.shouldBe(t, "t.odf.state", "odf.OdfContainer.DONE"); t.odf.rootElement.settings = null; - var path = "test.odt"; - t.odf.saveAs("test.odt", function (err) { + var path = "out/test.odt"; + t.odf.saveAs("out/test.odt", function (err) { t.err = err; r.shouldBeNull(t, "t.err"); r.shouldBeNull(t, "t.odf.rootElement.settings"); @@ -206,7 +206,7 @@ odf.OdfContainerTests = function OdfContainerTests(runner) { t.odf = new odf.OdfContainer(odf.OdfContainer.DocumentType.TEXT, null); r.shouldBe(t, "t.odf.state", "odf.OdfContainer.DONE"); t.odf.rootElement.meta = null; - var path = "test.odt"; + var path = "out/test.odt"; t.odf.saveAs(path, function (err) { t.err = err; r.shouldBeNull(t, "t.err"); @@ -228,7 +228,7 @@ odf.OdfContainerTests = function OdfContainerTests(runner) { appendXmlsToNode(t.odf.rootElement.styles, args.styles); appendXmlsToNode(t.odf.rootElement.automaticStyles, args.automaticStyles); - var path = r.resourcePrefix() + "fontFaceDeclsTest.odt"; + var path = r.resourcePrefix() + "out/fontFaceDeclsTest.odt"; t.odf.saveAs(path, function (err) { t.err = err; r.shouldBeNull(t, "t.err"); @@ -364,7 +364,7 @@ odf.OdfContainerTests = function OdfContainerTests(runner) { } function loadAndSave(callback) { var path = "documents/loadsave.odt", - newpath = "documents/newloadsave.odt"; + newpath = "out/newloadsave.odt"; t.odf = new odf.OdfContainer(path, function (o1) { t.odf = o1; r.shouldBe(t, "t.odf.state", "odf.OdfContainer.DONE"); diff --git a/webodf/tests/odf/PageLayoutTests.js b/webodf/tests/odf/PageLayoutTests.js index 6d28ef8d3..76fe30199 100644 --- a/webodf/tests/odf/PageLayoutTests.js +++ b/webodf/tests/odf/PageLayoutTests.js @@ -85,7 +85,7 @@ odf.PageLayoutTests = function PageLayoutTests(runner) { fill(root.automaticStyles, "automatic-styles"); fill(root.masterStyles, "master-styles"); fill(root.body.getElementsByTagNameNS(officens, "text")[0], "text"); - container.saveAs("pagelayouttests.odt", function () { + container.saveAs("out/pagelayouttests.odt", function () { t.odfCanvas.addListener("statereadychange", function () { callback(); }); diff --git a/webodf/tests/webodfcore/RuntimeTests.js b/webodf/tests/webodfcore/RuntimeTests.js index d4d8bbbd7..5c6085e8f 100644 --- a/webodf/tests/webodfcore/RuntimeTests.js +++ b/webodf/tests/webodfcore/RuntimeTests.js @@ -63,7 +63,7 @@ webodfcore.RuntimeTests = function RuntimeTests(runner) { clean.push(content[i] & 0xff); } - filename = pre + "tmp" + Math.random(); + filename = pre + "out/tmp" + Math.random(); // now content has content different from what is on the server runtime.writeFile(filename, new Uint8Array(content), function (err) { t.err = err; diff --git a/webodf/tests/webodfcore/ZipTests.js b/webodf/tests/webodfcore/ZipTests.js index 8b0ec2bde..075d9e278 100644 --- a/webodf/tests/webodfcore/ZipTests.js +++ b/webodf/tests/webodfcore/ZipTests.js @@ -87,7 +87,7 @@ webodfcore.ZipTests = function ZipTests(runner) { } function testCreateZip(callback) { - var filename = r.resourcePrefix() + "writetest.zip", + var filename = r.resourcePrefix() + "out/writetest.zip", zip = new webodfcore.Zip(filename, null), data = runtime.byteArrayFromString( "application/vnd.oasis.opendocument.text", @@ -111,7 +111,7 @@ webodfcore.ZipTests = function ZipTests(runner) { } function testSave() { - var zip = new webodfcore.Zip("savetest.zip", null), + var zip = new webodfcore.Zip("out/savetest.zip", null), data = runtime.byteArrayFromString("hello", "utf8"); zip.save("a", data, false, new Date()); zip.save("b", data, false, new Date()); @@ -124,7 +124,7 @@ webodfcore.ZipTests = function ZipTests(runner) { } function testRemove() { - var zip = new webodfcore.Zip("savetest.zip", null), + var zip = new webodfcore.Zip("out/savetest.zip", null), data = runtime.byteArrayFromString("hello", "utf8"); zip.save("a", data, false, new Date()); zip.save("b", data, false, new Date()); From 5b451dcebc9dd3fa6ed63070b7eafcae6a46244c Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 333/385] Written the metadata of a store as a store reads it. --- .../opendocumentviewer-desktop/CMakeLists.txt | 1 + ....webodf.OpenDocumentViewer.metainfo.xml.in | 43 +++++++++++-------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/programs/opendocumentviewer-desktop/CMakeLists.txt b/programs/opendocumentviewer-desktop/CMakeLists.txt index 102269054..7acaa5d89 100644 --- a/programs/opendocumentviewer-desktop/CMakeLists.txt +++ b/programs/opendocumentviewer-desktop/CMakeLists.txt @@ -171,6 +171,7 @@ if (NOT APPLE) # AppImage and of the flatpak ask for. The version is the one of the # build, in the three numbers a release carries. set(OPENDOCUMENTVIEWER_METAINFO_VERSION ${WEBODF_MANIFEST_VERSION}) + string(TIMESTAMP OPENDOCUMENTVIEWER_METAINFO_DATE "%Y-%m-%d" UTC) configure_file(data/org.webodf.OpenDocumentViewer.metainfo.xml.in ${CMAKE_CURRENT_BINARY_DIR}/org.webodf.OpenDocumentViewer.metainfo.xml @ONLY) diff --git a/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.metainfo.xml.in b/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.metainfo.xml.in index 15fc3afc8..00e5b9468 100644 --- a/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.metainfo.xml.in +++ b/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.metainfo.xml.in @@ -10,17 +10,29 @@ Lecteur OpenDocument A reader for OpenDocument files Un lecteur de fichiers OpenDocument +

OpenDocument Viewer opens the files of the open standard OpenDocument and shows them, with no office suite to hand.

+

+ Le Lecteur OpenDocument ouvre les fichiers au standard ouvert + OpenDocument et les affiche sans avoir besoin d’une suite bureautique. +

It opens:

+

Il ouvre :

  • texts (.odt, .fodt)
  • +
  • les textes (.odt, .fodt)
  • spreadsheets (.ods, .fods)
  • +
  • les tableurs (.ods, .fods)
  • presentations (.odp, .fodp)
  • +
  • les présentations (.odp, .fodp)
  • drawings (.odg) and formulas (.odf)
  • +
  • les dessins (.odg) et les formules (.odf)

OpenDocument Format is the one standard of the office published by the @@ -28,24 +40,11 @@ light, and spares opening a suite of the office or sending the document who knows where.

-
- -

- Le Lecteur OpenDocument ouvre les fichiers au standard ouvert OpenDocument - et les affiche sans avoir besoin d’une suite bureautique. -

-

Il ouvre :

-
    -
  • les textes (.odt, .fodt)
  • -
  • les tableurs (.ods, .fods)
  • -
  • les présentations (.odp, .fodp)
  • -
  • les dessins (.odg) et les formules (.odf)
  • -
-

- OpenDocument Format est la seule norme bureautique ISO publiée et libre : - le lecteur peut lire le fichier quel que soit le logiciel qui l’a écrit. - Le lecteur est léger et évite d’ouvrir une suite bureautique ou d’envoyer - les données on ne sait où. +

+ OpenDocument Format est la seule norme bureautique ISO publiée et + libre : le lecteur peut lire le fichier quel que soit le logiciel qui + l’a écrit. Le lecteur est léger et évite d’ouvrir une suite bureautique + ou d’envoyer les données on ne sait où.

org.webodf.OpenDocumentViewer.desktop @@ -59,7 +58,13 @@ Viewer + + WebODF + + - + From aa2412029a3901902db44770e2a22357423b30bd Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 334/385] Taken the spacings from what a cut left holding nothing. --- webodf/lib/odf/TextLayout.js | 57 +++++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index ab2135e25..9c2ecee12 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3484,6 +3484,40 @@ odf.TextLayout = function TextLayout() { * @param {!PagePlan} plan * @return {!number} how many pages the text was broken into */ + /** + * Take the spacings from what a page ends on and that holds nothing. + * + * Cutting a paragraph between two of its words may leave nothing of it on + * the page it was cut on: the empty paragraph is drawn as its spacings + * and no more, and in a box that lays its children in a column those + * spacings are not folded into the edge of the box, so the page is a few + * pixels too full and the line above is moved on for nothing. + * @param {!Element} box the page + * @return {undefined} + */ + function unspaceEmptyTail(box) { + var node = box.lastElementChild, + /**@type{!number}*/ + guard = 8; + // The last thing on the page is looked for, and then everything it + // stands in that holds nothing either: a paragraph left empty by a + // cut holds the box its tabs were laid in, which is empty as well. + while (node && node.lastElementChild && guard > 0) { + node = node.lastElementChild; + guard -= 1; + } + guard = 8; + while (node && node !== box && guard > 0 + && node.getBoundingClientRect().height === 0) { + // An element of the document is of no namespace of html, where + // the browser leaves a "style" attribute alone: it is marked + // instead, and the rule of the mark takes its spacings away. + node.setAttributeNS(webodfhelperns, "webodfhelper:spaceless", + "true"); + node = node.parentElement; + guard -= 1; + } + } /** * Fill one page, and answer with the page that was filled. * @@ -3722,6 +3756,11 @@ odf.TextLayout = function TextLayout() { box.removeChild(keeper); keeper = box.lastElementChild; } + // Cutting a paragraph may leave nothing of it on the page it was cut + // on: the spacings of what holds nothing are taken away, or the page + // is a few pixels too full and the line above it is moved on for + // nothing. + unspaceEmptyTail(box); // A table written for a page of another size is drawn to the width // of the text of this one before the notes are drawn: it is taller // for being narrower, and what it pushes past the end of the page is @@ -3831,6 +3870,12 @@ odf.TextLayout = function TextLayout() { // page that follows: the spacing over its first child was already // written on the page before it, and writing it again pushes the // whole of it a little past the end of its page. + // What a cut left holding nothing is drawn as its spacings and no + // more: they are taken away, or the page it ends is that much too + // full, see "unspaceEmptyTail". + sheet.insertRule("[webodfhelper|spaceless]" + + " {margin-top:0 !important;margin-bottom:0 !important;}", + sheet.cssRules.length); sheet.insertRule("[webodfhelper|continued] > :first-child" + " {margin-top:0;}", sheet.cssRules.length); sheet.insertRule(".webodf-pageBox > :last-child," @@ -4219,7 +4264,9 @@ odf.TextLayout = function TextLayout() { } guard -= 1; // The notes of what was moved went with it, so the foot - // of the page is drawn again before it is read anew. + // of the page is drawn again before it is read anew, and + // what the cut left holding nothing keeps no spacing. + unspaceEmptyTail(box); layNotes(box); over = firstOverflowing(box); } @@ -4237,6 +4284,14 @@ odf.TextLayout = function TextLayout() { } i += 1; } + // What a cut left holding nothing keeps no spacing: the page it ends + // is a few pixels too full otherwise, and the line above it is moved + // to the page that follows for nothing. + i = from || 0; + while (i < boxes.length) { + unspaceEmptyTail(boxes[i]); + i += 1; + } columnPages = boxes.length; } /** From 736bc7cf3468ebc9dbf9ea810d1119a0759dd06d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 335/385] Set right at once the pages broken before the fonts landed. --- webodf/lib/odf/OdfCanvas.js | 4 ++++ webodf/lib/odf/TextLayout.js | 31 ++++++++++++++++++++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 9039db32e..69905c810 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -4035,6 +4035,10 @@ if (fonts && fonts.ready) { fonts.ready.then(function () { var tries = 20; + // The pages that were broken with the letters of another + // font are set right as the next slice is drawn, and not + // at the end of the whole text. + textLayout.fontsChanged(); /** * @return {undefined} */ diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index d7d2bb72b..ba3b7b817 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -103,6 +103,8 @@ odf.TextLayout = function TextLayout() { * @type{!number} */ pagesPerRow = 1, + /**@type{!boolean}*/ + fontsLanded = false, /**@type{?function():undefined}*/ drawnHandler = null, /** @@ -4045,9 +4047,12 @@ odf.TextLayout = function TextLayout() { * that follows, and a page is added at the end if the last one is full. * @param {!odf.ODFDocumentElement} odfroot * @param {!PagePlan} plan + * @param {!number=} from the first page to set right, from zero + * @param {!boolean=} keepLast whether the page being filled is left + * alone, as more of the text is still to be written * @return {undefined} */ - function trimPages(odfroot, plan) { + function trimPages(odfroot, plan, from, keepLast) { var text = /**@type{!Element}*/(odfroot.body.lastElementChild), doc = /**@type{!Document}*/(text.ownerDocument), htmlns = doc.documentElement.namespaceURI, @@ -4212,9 +4217,11 @@ odf.TextLayout = function TextLayout() { // the first of them were filled. resizePages(plan, boxes); placePages(plan, boxes, 0); - i = 0; + i = from || 0; while (i < boxes.length && boxes.length < maxPages) { - trimOne(boxes[i], i); + if (!keepLast || i < boxes.length - 1) { + trimOne(boxes[i], i); + } i += 1; } columnPages = boxes.length; @@ -4324,6 +4331,14 @@ odf.TextLayout = function TextLayout() { // shrunk to the width of the document, and a row that is wider than // it would hang out of the reader instead of standing in the middle. widen(fillingDiv, rowWidth); + // The fonts landed after the first pages were broken: they were + // broken with the letters of another font and hold a line too many. + // They are set right at once, and not at the end of the whole, so + // that the page a reader looks at is the one it will stay. + if (fontsLanded) { + fontsLanded = false; + trimPages(fillingRoot, plan, 0, true); + } drawPageFurniture(fillingRoot, plan, fillingDiv, readMeta(fillingRoot), from); if (filling.waiting.length > 0 && filling.page < maxPages) { @@ -4492,6 +4507,16 @@ odf.TextLayout = function TextLayout() { this.isBreaking = function () { return filling !== null; }; + /** + * Say that the fonts of the document have landed. + * + * The pages that were broken before that were broken with the letters of + * another font: they are set right as the next slice is drawn. + * @return {undefined} + */ + this.fontsChanged = function () { + fontsLanded = true; + }; /** * Set the pages right without breaking the whole text again: what * crosses the end of a page is moved to the page that follows. From 88463ff05b094f1658acc1258c18a1a23d9823e0 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 336/385] Said why the plugin of qt warns of the qml the viewer has none of. --- programs/opendocumentviewer-desktop/packaging.cmake | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake index 323f43d8d..72b118b32 100644 --- a/programs/opendocumentviewer-desktop/packaging.cmake +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -204,9 +204,12 @@ if (UNIX AND NOT APPLE) COMMAND ${CMAKE_COMMAND} -E env LDAI_OUTPUT=${VIEWER_APPIMAGE} ${VIEWER_QMAKE} - # The plugin of qt looks for the modules of qml and says so - # where a program has none, which the viewer has not: it is - # told to leave qml alone. + # The plugin of qt looks for the modules of qml a program + # asks for and says it found none: the viewer holds no qml of + # its own, and the qml of qt is carried all the same, as the + # engine of the web leans on it. The warning is looked for + # and left alone: there is nothing to scan, and skipping the + # module would take from the engine what it runs on. QT_SKIP_MODULES=qml ${LINUXDEPLOY} --appdir ${VIEWER_APPDIR} --desktop-file From b2b1e28e6451c5667203b6b17bcd7ce957ea21cc Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 337/385] Read where a page ends once, and taken back what is over at one go. --- webodf/lib/odf/TextLayout.js | 53 ++++++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 9 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 1b08dc444..66edbe8e3 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2584,6 +2584,35 @@ odf.TextLayout = function TextLayout() { ? style.position === "absolute" || style.position === "fixed" : false; } + /** + * How many of the nodes a page was given stand within it. + * + * The nodes are read where they stand and none of them is moved, so the + * page is laid out once for the whole of the reading: what is read after + * something is written is laid out anew, and taking the nodes back one + * at a time lays the page out once for each of them. + * @param {!Element} box + * @param {!Array.} added the nodes that were written on the page + * @return {!number} how many of them the page holds + */ + function firstOver(box, added) { + var doc = /**@type{!Document}*/(box.ownerDocument), + edge = box.getBoundingClientRect().bottom, + range = doc.createRange(), + /**@type{!ClientRect}*/ + rect, + /**@type{!number}*/ + i; + for (i = 0; i < added.length; i += 1) { + range.setStartBefore(added[i]); + range.setEndAfter(added[i]); + rect = range.getBoundingClientRect(); + if ((rect.height > 0 || rect.width > 0) && rect.bottom > edge + 1) { + return i; + } + } + return added.length; + } /** * Whether what a box holds is taller than the box. * @param {!Element} box @@ -3057,15 +3086,21 @@ odf.TextLayout = function TextLayout() { if (added.length === 0) { break; } - while (added.length > 1 && overflows(box, added[0])) { - // The chunk is more than the page holds: what is over is - // taken back one node at a time, from the end, and the rest - // is left where it is. Taking the whole chunk back and - // writing it again one node at a time reads the page once - // for every node of it. - taken = /**@type{!Node}*/(added.pop()); - box.removeChild(taken); - state.waiting.unshift(taken); + if (added.length > 1 && overflows(box, added[0])) { + // The chunk is more than the page holds: the first node of + // it that crosses the end of the page is looked for, and + // everything from there is taken back at once. + // + // The nodes are read where they stand, one reading of the + // page answering for all of them: taking them back one at a + // time reads the page again for each, as the browser lays + // out anew whatever is read after something is written. + held = firstOver(box, added); + while (added.length > held) { + taken = /**@type{!Node}*/(added.pop()); + box.removeChild(taken); + state.waiting.unshift(taken); + } state.chunk = Math.max(1, added.length); } if (added.length === 0 From 21bb3225222607e279a27696fc46762a7447d75b Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 338/385] Parted an element of thousands of nodes before writing it on a page. --- webodf/lib/odf/TextLayout.js | 86 ++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 55d97249c..40d023d12 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -153,6 +153,14 @@ odf.TextLayout = function TextLayout() { * @type{!number} */ maxPages = 2000, + /** + * How many nodes are written at once at the most, before what is + * left of an element is put aside: some pages of a dense text, so + * that a page is measured against a page and not against a book. + * @const + * @type{!number} + */ + nodesToAPage = 2000, /** * A4 in pixels at 96 dpi, and the margin LibreOffice writes, for a * document that declares no page layout at all. @@ -2539,6 +2547,72 @@ odf.TextLayout = function TextLayout() { } return true; } + /** + * How many nodes a node holds, counted no further than a bound. + * @param {!Node} node + * @param {!number} bound + * @return {!number} + */ + function nodesIn(node, bound) { + var count = 1, + /**@type{?Node}*/ + child = node.firstChild; + while (child && count < bound) { + count += nodesIn(child, bound - count); + child = child.nextSibling; + } + return count; + } + /** + * Take out of an element everything past the first so many nodes. + * + * A document holds elements that hold thousands of nodes: a table of + * contents is one of them, and a page of it was written by measuring the + * whole of what was left, page after page. The element is parted in two + * beforehand, by counting and not by measuring, so that a page is drawn + * against what a page may hold and not against everything that is left + * to write. + * + * What is taken out is put in a copy of the element, as a cut does, so + * that it is written in the style it was written in. + * @param {!Element} element + * @param {!number} bound how many nodes are left in it + * @return {?Element} what was taken out, or null where it held less + */ + function splitOff(element, bound) { + var count = 1, + /**@type{?Node}*/ + node = element.firstChild, + /**@type{!Element}*/ + tail = /**@type{!Element}*/(element.cloneNode(false)), + /**@type{?Element}*/ + inner, + /**@type{?Node}*/ + next; + while (node && count < bound) { + count += nodesIn(node, bound - count); + if (count >= bound && node.firstChild + && node.nodeType === Node.ELEMENT_NODE) { + // The bound falls inside this one: what it holds past the + // bound is taken out of it in the same way. + inner = splitOff(/**@type{!Element}*/(node), bound); + if (inner) { + tail.appendChild(inner); + } + node = node.nextSibling; + break; + } + node = node.nextSibling; + } + while (node) { + next = node.nextSibling; + tail.appendChild(node); + node = next; + } + return tail.firstChild + ? tail + : null; + } /** * Cut an element where the page ends, and answer what is left of it: a * copy of the element that holds what did not fit. @@ -2745,6 +2819,18 @@ odf.TextLayout = function TextLayout() { if (asksForANewPage(node) && box.firstChild) { break; } + // An element of thousands of nodes — a table of contents, + // a long section — is parted before it is written: a page is + // drawn against what a page may hold, and not against the + // whole of what is left to write, which was drawn again for + // every page of it. + if (node.nodeType === Node.ELEMENT_NODE + && nodesIn(node, nodesToAPage + 1) > nodesToAPage) { + rest = splitOff(/**@type{!Element}*/(node), nodesToAPage); + if (rest) { + state.waiting.splice(1, 0, rest); + } + } state.waiting.shift(); box.appendChild(node); added.push(node); From ab3b9bffcf402b7e74e3d8706093c2afbbd276af Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 339/385] Read the standard of schema of OpenDocument 1.4 for tests (800 pages). --- webodf/tests/documents/README | 5 +++-- .../documents/opendocument-v1.3-part3.odt | Bin 953195 -> 0 bytes .../documents/opendocument-v1.4-part3.odt | Bin 0 -> 1130019 bytes webodf/tests/odf/OdfContainerTests.js | 6 +++--- 4 files changed, 6 insertions(+), 5 deletions(-) delete mode 100644 webodf/tests/documents/opendocument-v1.3-part3.odt create mode 100644 webodf/tests/documents/opendocument-v1.4-part3.odt diff --git a/webodf/tests/documents/README b/webodf/tests/documents/README index a8514e84c..9994199c7 100644 --- a/webodf/tests/documents/README +++ b/webodf/tests/documents/README @@ -21,5 +21,6 @@ They are read by "OfficeDocumentsTests.js", which asks of each one what a test of a document written here never asks: whether the library still reads what an office writes. -"opendocument-v1.3-part3.odt" is the standard itself, as OASIS publishes -it, and is read by "OdfContainerTests.js". +"opendocument-v1.4-part3.odt" is the standard itself, as OASIS publishes +it: the schema of OpenDocument 1.4, of 800 pages and 32 tables, that +"OdfContainerTests.js" reads whole. diff --git a/webodf/tests/documents/opendocument-v1.3-part3.odt b/webodf/tests/documents/opendocument-v1.3-part3.odt deleted file mode 100644 index d53af61737a9107af327f33d01316ca29bebde13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 953195 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

N{L{Pa z8-%^_?hTbA6o{I^+{>GhrsA9Bbph!B;Gw`of%vQvQJsdGu5H`eLDXa!CXCr?)@#l1 z=_nyBnX6*!OtNxUrMXej44WMl zO<`$nAFP^-)`3{UnoTVKhK!n6vclrawClD)^CH%3Lw8-h=EN*5XIT?U5-n7*Zm>$x zC)1|(l@^}UG7&BjJd!tYYF=+i64Z{F6Y^VT>hQy5lDCYTIsDG}NHf>*H;6Ul9rk<2 z^*wEOuzYimRd37Ln1*fz?|IrDxtfREJLGm@FqHAH-e{n_j(O(|n+%EGh{2G3t+bN> zhqB=xq8h5fWBvOVRE1^0$n;rhNUVFWA|Rp#Fih+0c@YWpO$=Il-PL`#?T7!z3I9V0tEg2+?4P;r7U?L9BnLkRy zbtd&vaGghF8}OYy1|o1y(H6ec$d_l@C%{|sZ&nV_GFd4X{0_WGGDJ%H`4s}C46jYO zy<72h)BD;z$u%xF?$sd_KYfoMeu!J#ih(rjghx2_6H)8O=dxLIo%>wmjQ=JNoONS! z^GIwDHxnZu4x9KxA=Je0G0-HbXS%{nAwC<(d(n&J3XEX+)DS0-d#N*NAhe$aNL!rtzBmq z;JS7jraFSmk`zMmcgWn>+Glj^GCf1-07w>qpPnzSr;GE_vZl%C`@RO%8@gxct3)6< zseBFty?0H#rjIa*FvWBK!+D8XMNyaSt>mQCxp)GbT|){>w*Kq=jac=(jXf zSBO~2*!UG<;Ij5drHJ@!5boNFs2@9mJi|5j#3W@_MDRe~il`em5+kM!DPfr}?atTg*R#~(n@nbwJ7L8GAi;qZ`oTco0>vAmh!h=|W zJU#*O;xEK$AxUNc)Tyx^=xcxk@1;oEa~U+ic8Jtu1wOJ z*IzO?FH>W9j$By5&?GfIpc!wZ-I?ef|A&fS{0{&WKqB~XryqlCk8pzmtJTQ$q8IT( z14d{?!{bVq@dCVCBi%n>E9cw!^{hKjtnehr<;R^}pPw%-udlAk9I{EzZOabX?1&(7 z!zv?fE@st(5JZn>8Qmjy2j0p4Ejt=7iSEIqJy)e9=ZTi z8>nqNR2Tq&ZA>0i?7tOy~+>TEzp8%iwWvfKj) zFKGOI0-x0CA&a%~dkS*E9KWP+@Ymz3Zb7z)_P zZ&1`Nh$-PGWGmOa!ykcg!CPK~WH0XCrLlL|oHTt8S?k^eo#flX#0{3uv!3EuUqkW4 z9DYyK;!F-t>$;5K?p3eU^y1*EeI-V4ya&^uyu4R;YdBI0smtVTC28Fd1UlR5U(%J zvXUtnj)1FyTZMT2(ucUMDC6l#ss-L=D!6G2rYua0y3M2#oSR4Jr4*!(Ol#oTox#l_LDMq@)AQ4 z>2uZL>3}5Ha)$)?{}$89#l^HNt}l6-a6*R!va`;v?DCoK?=e7)71WA^FqVU$rFUpceJQ z`iDC4UcO${i*(aop@(rR7n!47(PR=mInoyx_(4Ed7tpm&^I?7tzGK>kOBZh-q@z#e z1$E7{{S30&5!NxTMV${(nGG%A^#uhxtRrN&U!s&%*0!V;U`kF}UoNK8tNE-niCapn zpRBYNnbw|)>guF-Bc}yc>rj@md8sWh4TI#aF1c%msNgv=tb^ynW)7rw@I+o>*9=%m zkkg8^4!IRGt!<6y$s{Wu|Fl!dT*iQ$RGyq)U(e1j=B3vHlH&V>q;fEUAe3_^u~%}q zY{m6R@|LZ}hAiYZOk*ltdvZ`OFw}!&tu9%!!huxO6T;Jmc6wvji|O@zc70K5Dkr7)2?=F3rD0m^%!%!< zj4oS}eHGXut93Ay8yDsx(=Z71$^!koegvL3UYo8*>&|R(aBJ75AUCP^MSkSP2vwJ_HOfD}crS(#hipB})58<+L*5RVjRt}8Y~?H%t)*zaL~leNy3Q2cjEAZzn^_O7K3Vdggn@rrnd!T1lJ9Z3=RbcS?iv2a1E$qN2|-kpq3w`7C!X(;Wji>%+bj_%1S8T;g{-|-rJ!CGX5r@jII757483wvCplBhRS#X&ofk2Y*r0=R zL6s9%bi@Y-Zgrieb~-RTPY2ulatM72^iO&1rG7+RKu9Yp3*%EbhK|Rv(}1h3eup&L zL}tKJ%j!oVGm`#<`PJq1`Ng6vg-uF1>8n2>H=sSDSultyn$ceA5Hd@#M;?U2WjaK< zD-*qi<2=aQ%JTN2c2wNn#eyYF z3;wYcer2ay+REIRe(QicP=gtL)>HICc2cv>rG3fZCs@LB}mDQvNa7GdZC){U`;bQR`UkLiO!h#du{YU#6F8M?sCtAbJXO zNx^`LviNW?H7;P4paqt&U$Bw~Bigob5?DP$m5at?jlk#+l`g8um8_s26^S!;`UAN@ zV>kz%U^4bdUf|RWPf8Nhyu^v~DAB`5-HS;Rvc3%WD;Jv?WRTmmn;HA*^liYeFdqW(-huIw_M;EX)L zhc{ciUQ}=AaFK<5;4OW9c0JA3EE&ZwUq#k}UCK+1)zJC{!_u`sRA6piFqX~1U`$k! ziI=s*6W|e*hVUlHf-DFeOHXi34{R=JJy|M# ztQfA;wOM7-x`5E80&ZG~vLVuV-VhO{2e@kp?rQtu(&)j|(J0KZN7dl1riZSGz+S>y#6`v^edG`qT^&tA8=rT8 zwAp!ITq*;osRp$xCC-#g%z&Da7CpJjz_-Y+m7q?9@Jdh@C%c!Z7g7j+pD=)gj(Eu& zqPfc`!}%^;_u<54LeWq(G`rEg!X~;W=~V|wp?A|8Yaz)4b_CK$&tVQ-0tQE0X>)w@SM-f+;?HNs!rNAbSc9%hd8{7}ds+ zQ<+6iGAIq;rX1XqpUQkj#}L!-AJw2t@yQD%s*eb!VbX#aKK$>X&bzjE%^l=?#1BW3 z_lFC}AaJC!OPcg1DNDCoA*hW{Z&nc7W5(hvzSTl7ELeiP;;1no?`a{g@&h8gW>QLJ z_^cWZD?TEMk=RQ(mV|*kh3tu-U_1I~WYrK%9K42)6cewNpD%qmAUC3ql0PdUp$KU* zNXQ90c@PYT^r_)rHs@-gk1i8(S~A$+j}`T5XBW!^m&_CO#)bnBbxO!MEU5`YUr-` z+$%w5FHv0vE>Z)W<@b@2<5KGNZ@?q{R-9RfIZ}rR1|M)Hb zpZ5HRuO^fEwGu2g+IO!%{NY8l+{j95O~{XdTk#xPoLBDxBe$8ZhwxXMI|kMw$GocvvslgPuNs6^Err(S(oxh5pmZYe`; zqBo+%T=zqVk)MpAVnlWIruIqq-f>yxZupnH!cz0(nswiTW&+%a*l+M+NhOG!>JPVT z&35SbVR;0Bq6p-R-W5YA7_gxTLUZVuKk7sAK~Qgi@@ z8#U@-Q*`VH(5wcUS?8K6((*t}9~a>V=nnS=FZ*<9Q$Wr6RUTDqp34@H*#flYjY1i| z;-)|T>75pQFk;p|1|al+j03A_&Dutqe!zciNREC#JQ~o~a86;`*qrofu#S!Hp_o_e z2rD-Z4V3G`<1;pG!zGWKuFe(fj27eSN!DMMMx-u zO-?}b7)kjn1w^J=^0KvIZNingF?|ovkf@ua9y-%KSNQ9lZfSeRZ2w|n5nn@c^JZbL zXzT|sr7D!GeY6va%;i`YhU!WqUd@A^I5BPDUP)MT$#szsK++VMeSHd0p_HF7thZpi}UlV>x+w$;Kfvw;|T>XCg&Hj z4+_m}uR<4-T;y?}39!(^n8nn*wXX1$Z>o)~U0djvj(&VIKoJfI9t5RNJX8Dt`I- z?{d-t{&8#L8O8(sELe<$vET~I?CnVV_J?=xw2z;@|Kp3+g-OwfHxTTOEOUpYyW6z< z;Qdgr?Tay5G}wb3S`A`rUt|uc@1WmHfgh)SQM1oPL0vBL1^kowUu*J>dNj(5!KS6uC77gr|C;d6jy;X7xQ^hdnGJZ+wSb53eF-PkPJ`mh-DT#@6+U z<&)V0qUMc)P{aoNhy_V|BmNKiE5{UP_*SUw}4?ekI5(as2QqZcyBvq2* zAs6H^y*OW7UN2^4K_01SkP`~>NGu7m2q4fSGQ0ha?MM=zxj0WVuA}Q*RFWI3fxB4y zy=59iofwDdY1)eTDCwP^HfaTh^-gF=wOfn6qz2+Be^S_ucE( zETRS|UKn?6r3K>jI@#Wl}{IRPyIG2yQqg|~;DZsSSU zR|FQwXXMDj)|}>8dQwe2sU4C*hLNfv_+Ro`NX?)M)_u1D z@bfDr0q}`tT2QQD#ssWe*iK+_LT1lVkUbv%6UtFmNwR7QulBgO}fh!Eo;B_*EZ+ zM%X>r=9lD=zOK=ygxN&+3hY7ZoMe%KY(Ur-xOHA%3x0eLw^+&RN<#qDS?>85F=X1$ z)8yHLXY;QLkfozDGB#?lJt?;QLD^9Ns9h^R^^bxQdPcI)&C8;CJJL!~-2!B>K@UQliN%9%Tk3;(n7qtoKG&X?N^$KE@?{k(?X2L3(&|NEp?UWhR+~1cS!Bo zz&IpfU#lHnfS&K_>Absx2OM;e z6$+ontvGfCMu9Px6F#Jt$)U1E^LSS@{sZV$1HIaJTv=v%_rL?|A`j$&ujWnGI5Evb zUzFE!@PpSv-4gC&v8$=18FDc-Na-9Jbjb?4YZ@mVR*me=pQ1 z*!PnlLq<-U=zND6ZPL?C zyH^=+(yXavOITHULKTk6x8RWdraM<>`Roh{Z>sAmwL|$}dRYDq{7*O3S0WGPb(WeT zdugKD(OaTCm+3CpRHp8mSYlN86nr^&wQpz*JLUy2EEA50oIP@>bCiWn5NJv|MFbhV zU8~}+3B{zL|p+FLYM)b>9!KYN{Iy=(`rvxxYT#6*{56j>$ z2h%0qYcf&LJoRaiKk;1bU1zuVsl>+f1(QkM>Q=!lUzc)9Cf=b}v+LP(R(5M8sg0hH zlF9cZnb}}F;%P0|iGdml(}ce<`x2RyrD|4TP@cK=gK)$ayn2<63`xU^8|j0nXN?8k zD2Wdcn}b1dtFE}!jzbRR?+`ni;Gs|L0Rwv8dunlNtG3^}mv#YXlyZzA5R0^rWWjKf@RnCLL zVIJb7s!5;P!J&7iXD)e+6#GM7^3)6r4T)%8?rcIfz<`bXEl>wO1yi^pZT8Lx`@^@fYu>p{k`S zg`jwx2ZOY_N>DR&+MTa%^xe{ASqU9-l8|~RuOie6q0Sorx*Aw;3{~{#2@+W(}E4v1ifGeCTHgoMreb=TXgwU72@eORf=#bKBxd!mDxh6 z0Kcdiwg}T>5SJR4-1IMLku5?PfF0*m1n7ddL6N)P zn#MMPbi$FDN`bDJg#qLggIw`&51L#poU3`%OlOECIScTN{w)t@wGNyUq_l%(j8ic% zqc3YqU65wL+7Y_cyYAdHIG+W5t_}j*SnKsY!;EIP*wF%1# zj{A@en|8%fnf)mb%C(R9LPFZWWX@+9B%AA)-Auna({5vrA(n*wM6#s>0Vbe*V$43W zlfaGwh06JryLfVSHNBY6F3!ttH>YBXPAF6;Yi@fS6O>w^J-ifBz6=MONU7W{9_%5^ zrn20UScIrz37jCQ4KW$g6X>|MC%?jN((^sCwA>?*s!lQgENUF-_H;xSf#%oDXQb7j5s&Z_M^7p1s= zo0i||3U@5arH~WA>lwanq0N9-=eyw7fiO#k+#jm26=du|Z#EnZD9Oz4qaY0G+2V&t<$qry|cU zXY=dnd|q~IJ0h&RU)I3<=+X~TO1EUSo%8GI z#d&$^x|Fx1uTGG??&_GDL|MP!W(Y~%6HjFjnOs(?Ao65y={6A!rcLT7_osg09=WhY zee({f=2e_iVdqOa5#F~%6_608`uz>Ex4_wIyg|+m`EIk-`Z9YYg7zZEFA@ZAu{P4> zFBN6`%Ub2_$Ly72(UXYSE6%FbUngGGNW&A@hn<$u6qV9SHhq<twsf}=3rqpho``B@dp<9rl&u1}en8y`nbftL*cdZ-3VR((` zyrpc(>AdHQ3p~FU<$*j&<+!gpFGk39qJlS{wxGDAMQ+orG(b}u3Uu9@crCj+l+dxQ z{#09E<29InC>U9#%OfTnaYiwZSejV9VPoSQT>Y>T<-`O9eeYPb7Dt%uGV)fSLB%-+ zMN&h$vDLuc(lr0s=~*O1&(?`o9grK8BnU-M+a}Dn<3oO#i zRfc}>NR$e1LBniX>`dRW!@K5&V|#}kay@OQA2kH#B8288Tsz7w7ZoY_XV^odhJ04ElN!keiJyNUKLyOV(29jq5xwLmOeC7Wu-i zUzL)*c)bp3+tkYT;?W*12vryE3Sv%uSGPSF6fWI^2lC>*cEo9vm^S2l$ZL7LDG^uT z$K~Hp$!U^egCp)p!d8sF-&-cVwF~RoaaUL|*t^c1xq?)yK%;4|O#CN!qB5H!?RW@+ zOW3&^Zl2HsmXM%xDqqwGeUgrDvf9h5s(d}eQ$4wymI>#i6z`{ShJW1JEP47Xj0>*$ z@I1N}L*z#M?pWxTKAKzO+U%n_LD5LpJe^5 zpJaXRCs~$CvR)(t*&=FDpiAhyViC2MutGyzyIW`HY>7Pmdf+J=46q&CR{J^0!zIKf9RBj2(Tp zMPN?B!|C+`9+HNC8e{DZJ$(IaG2zruZ;tkWHTustTdeVZ{p{=|?OKDr=?}D5&)n@T z#GiRv=N{W|yCqujN4nvI3+U@-j{VNjN&NuQiMi7^D6@|bXm4S?kR1Oh?3T_3o}F;S zU&&1sef;v(J@M}QVK~I|U_XzvU=PuMl6CunuOpXw(;Vxtv$6W>8F-n}mdIMN$U;ge z#GScG;(Nw*upx;Qs*|)qdScen<|bXjR>c-bW3=OW-M9$)BX!bYav#R}gX#4L%5D=%)_orGhGZLf20%AsU%y z4N@`J-vQo3ov6oXL&vzcu_Vr^xUHY^10Z{{*SMmlaKHII-EV$R_nZGyOQI&Cl-Js8 zzN)?EE8J_o^j_=YY_sf0<4FXO%HF5wM@k@Bs_`4{Vbwh0tRF^ucI5(D+NmztIO((- zM){=@%KH*!9C%kM1WG^UP{T5StQwEt;RfP2W0Zy?(B?@rf_T(#yvz3#3&o)`$Nf&juQp#Xp8f?tYYcdvSFCkNl% zlLBJvD{5x+XKLbKb=FUV!mAeC!FCsIo)6}2S0$g)dH_VxvPE|r5|9|XJfq8S8x4Z(gr zQE)98VDV*WB1sB%AreXi`=K?#o`=?P!G73lboQ&o*grMl-Y1_x9q}u&IJy_Vxl|6~ zcM!kQi)IkNwZw1TYxVm5jc%D6>hI=%$cx~57wRKKG%kb#9?OuHWCp>D1d-&K8jT&+ zwGCuFB>r%~yS?L)n{vr=gc6k3z4uJ9jfY=5*sw|P zKOXuL8y<`ZiD*|oBs@;OA7fHCBQ33sp>B}ES{o;_RunH1x;jpWec#!uV;(nlTCA&v zh@i>d;Dgj?s1+f+MWtiWdYoU0?x8$^3GNRDcuWSk@kG60SHzr}pG~u4&bm#}Tdw~} zhMHzCclq?X3G}SgKpKPOo2k!9S`UzKLjfZ>x@?u4#d%6#*XC^9L^7}$NG4Bi&XW60 zaY6*l*?I|NB1E)e&ZZKh=6IE9dSZX8`}8grGjic}6cmb}nPZ3$bMa_EzJCTuI?0L2 z3og*)G0Bww7=av@7l^^1L%vKPI%v#mI|is^XjFSEsmNf=HZPl4M_4jloGoTKIcuvr zE8#BrUN_A2MH1zVuzoln*|E`Wdn`+q&XB^m8oJjF&4p=kjV)HA1AM1{$|HQe5ZxFd ztzbOkGZ)IxmxGDXniOfF76$tyn!R%kQlPL~3u8(Id0GCb{oX=pNaICeOk4Z6Pv5;e z(>@|}rv3AOOy_3{=u2X4!{gM#w&9;!e`hV8z4{CEu=r~oa8M~$%4S2k)sr&?s==6c zL#&-ekD$14xQBZZ)xfxJL?)h?CCMqsv6%iP55@K3GNWX)fy9hUfjbk(1-lWF<r4kHWtJ_AW?a-Y&#}xEE&5h19t3KW!HUt{k>-6l;GRaB ziwvJ=3?r_tgN}$S%iQ}WrYzLksbh*P1zLEH@o=V*nr9DY^ko|L0P~f2w{?&%oTx$h zAC&*9Yp1HfVSvz>#9{3-3t-mAOu^UFy5WL&atu5UrelxI6_-5W6KUxqLQt{viILNW z1d4E*y+9Ej!KGz-TbgzU(L@N|*4%4Ln)9E@XC1Uq|$XL z2Q=OhQ=zl>U;xZvSxp^eD^?avn=;Plp^CIG8k+YG#m9I05?Rk)!Jo0K5!#=(WOcCq zVIHC*pI9~{uqUx>wt-QOH!?V+pWC@Q^hk9R8zFzY*C(iglbG#V|@`O9)4+aR6Zb z@B_na%}knj(={?uohhfCbi+u`4$+pT+_7yEN7+2_yeB^N+3}hI12VBenSA-Klge$| z1Xs`x=P6sBNKeYagTp@>YtT3ck4j+` zYEU$lzg)d(%a^)>gi5$Muvi+W89HHPtJ$DCq^6XS&a@F7>TMhK|-+rw^Y>t^!^ z8Sjp>q9CyqY1>bw#&3WDf6K^LkQfRYbgbj11yzUj!)RBtU!l!b_AKv+QLkpbfKRn? z%ApfRwc3PSr0oq<$Qrk`gcAKRwi=DHQ)*&Wbp;Y9N@I>d(t3YSo~8=!Eb*Bk(V63i zq$7|$miGqMzQ>d%tWB37=R0$?j#y4?;ti>-iw_o2qaFxUbc)m%FCGA!NqC9 z+LtlMMrF*yQ4=S-9UBtIjb8-D2YZ(kVEC<-5K&ZFv5)J8U5mH(KYR+jHLc_}Z{@q)Rd;qaR z^b!h98{Yw%71P}Wj8Rs{P747XVOI>wE_wuJ#UnqUSS1vjsfec~GXp<)aUdg)q_Iqd zBoQp*1hofel;3il^L}e$Qt=y@9S`kw7w$xBB%>BaH`0$60T6v>TE|fR+qn9EYZ_E3 z48~=}zk|Eha19HRhA_>K-Vee5I+9;mFlG2V^jz&?$n6>uH_3Tw!r$UUC6lwWXvi^# zdlz{a)JE*)3EU!&4Ak-{9qXA#a}@abpf3?d2NZVg)$F@;ZFO)rrhL6O5 z4du;FJi)(>4*?TuT+>C~km}xP{PaD3_yMgw)uS76Qb&4WArtdnrhk~J2>o_eVVng1 zx4eV8evmgMp%u?GaG2|&OJ{w9_lJ~k4R}lo=V8eArWB9!$9gy>tcJTP!l5CbR|vfL z4|(LRANtIQ$bjDB;hbj==e*i*#>4A=k8I@Xmi%xeqV!r3CopeiN1Q8jP3D9pe8UgW z9??<+hrMIRQoGPNI@5>qGo-uOS)SXR8x?Uq!1a$Yq}=MhvBm8L2u&UkfR>*2`oTW= z^z~;EQEdcr0Aj^}kVixDyO7=a^fn>9!==%r?4~o$GUsKx7CMpL`D0x@Yiz6J8Z~X{89_^Ws^`ljXAhS5X^Xo9)ces zp)|=gO%KUe{D&^9s}}PwS6_9qSe##9UR__5)K^UvVvQ2mr~0aE-ST2XL(Ad`&VOS1 zN0D1u_F=cAb@6D0JTG2PPc9I%=(SJNNifl*qbN73!8Nt%NsqL&{46`3C_LYZ1dJB( zGh5K5ADsgjJ4iRb8fhN8{Y`tk*;mEtfQZt5YY-I z93B$aG{(Fz${2hvV;!awt)jMF(R=bnpMvA8Qqr4nc71dXu0a43zI!G(JR;68m*m)i zEkv>@Fy9w!FkK5f2n&o7P4wWAYjrd_ntcNyf7R}^DYW`342PUKIJ=l%UtM3%re)?} z(r!E#Dw#vA19knc8MWh>PqyL%!Ys?xY`ywdDcb(>=mZz0`o%yG`z=aHDb zRL4~0u44DGLiGy%l-Hu_=c)<_Y3F2+@>!-15s-&B33h-125`CyjtTK3ehw=o@pmcO zFOMYe)a{#2kg|ZiCIGQl_XoQ{zk(4TQjAxDHzh$}`{USIhww)Jl!rG3(O#U8cHoWj zS#IrN7{ibT7bvxr>Fq83=mk&)*&%4~xkK~r!E4}ZgTM!_*Q50s89qz!0Uq!mwX12< zl}JhvehQL+$nbffziRz$QJ!5nazBSITAap>@y_!Y(zQY>2xwja@ke|>d z?mk4W0kFxSQJN1rj4%w#0qC}l0MxLJZ-{bl+ISn_bx8gIiM7KW95u_?I3s>cM8y?U z|05BenunE0dQOK&9`923sDTe>L?#&& zeYw8ei99PB>>+}`l0;i52?B)E<}p}UhcMMw^r5tL6CtZiy2XiVN5(~Y7V>M7SGk;_ zSwKRO0H^5qH})e7S0K>GbBar9#MzlxB1PL3+`1jnU>kS<$xkI)~`Lz2$&!*3_uRO;O?Ip-QHca-Bk)0Em5Re_7l7r%)Tb={jgTQK5x%?_El-qTU zb%LksC0_E?XAI^$jUQTMJR`~LKsmx)FmXMSQAo3CuS0lb#+jdifEthf;i>PKFM|3Y z_!$a|wBqOe8lD5khNOfvb)ZvoO4P6w%Nht8tZH$9bwqPxJ1ztabfCTp5%|a}Lp+UC z6M2GFIpw?~u~PLza)}1_ZdIGecI@|PgPFcV?~uKThf*pvk5WCc!;M)lD|0NeqVZJ) zo6v~em+_F{IE?~!lY;vKoRI$A7f6Ls=h{{2C~xYBN<=nMm4xUXDni%P$LjIh8#Iu+ z3`?WwIm-Astthi(cxV7^G@d|k;!*(vqevS9W2SaR#^d6ZEy6VXON>!L@X070#ea_l zB!unnKr`lS#X6N6)S}nKuTwaqD+U9=z0M}P8Es4hyrM=k(fbD9BdpF5;_ z8E(5!5pEk+AeS#XEuqVy$c3xEGDgXA#b+$ViiTSxoCh5DhB-=3mDR|3sx)zthqB2ya)Q>H z%F&VDt{te6g?QS8CP_p~^TjWr7ot1PB(gzN&>fj9s}LboD#{crD0v@Rde_RgkpXK} zTyRO)?^;h)koual(ZU z;ee*Ed0XdTt@urEmfZK?A^11mMQhy%vk$*~MIs@Sk_Uuka21D`piFBg-I&w>@K~4d zZ_=`@TjYg~Yi*n>IH-$`e*7GSI358E972FUZS$x+O5Zt?!OTu+wA(6|8 zq}&FfwKL77i0np^48&JXlR8XfC9o5Q-UK!Z4F1#chN(qE6~_#@;1V3Yz05iHlSab& z2NEL0_8bQ}rB4P0dv;blAmAfHzzcQf0U4m8u&AU6p;fW3&DxSRfREOgB#l2A?0d?k zCI{4O4D}Rym*Q{&pCdO4d-Mq`V@)3TlscVqDD64&Q97Rt=!MIrQPg9z&tNaRIM)Ds zj|uh^T;0nD6CR-XGCMX@8uw~n^AjPp-@s>UjMArP^gi{l;sFI4L%~LmKrr{tXZ)7# z#SGub<7#Nw;2}tyd3OR7nfj4ly|l;Rb$2c$ezq-^SV1ae&h zdAj@i_!&w1hiYiq%t1*e**(Y0Kyhq8t7rSTn6rEuLdJ~cz_775spsil zd4S3N+zf1t|4<1VMF_8mjVZDRZ0r{{W-Oluu`#h67&i8%EY*OGO$F~>sySXEg?l1_ zyX0?qyi;+0!b#~iVE0l@!0u%y0lRee$^e?bm|1M9&7oG~BqF>t784;tq}bB#G#)~1 zWw1zVTFq;T{Cl{(qd|l(LcmQC>PpA!(CNiTg_&dx1uTKr{X8AZ33Pe zUrz>_G~^K%A-D?ob>a=L1A%0@dt1b67*YDGrJN4#*zqfNAr(9Q2t|~jp3>5DEOLKBqk~N!X*YX7 z`Td^!?eXT#+aKTEzW>8)ma(uZ;K1H>@c8)0agxAiuV$08#k45TYTk~B)A$6W-eW%Q zsCBQkXd+5(mcQWB97`tlV)m?}&RskAPxuT(fH9p9S7pO%@u7W~hm+&X}7WdbM@lwF%fZ+{VF$LpZ z)r2t{E>K|hy)eO5b49Vpd~ul-g+caA9u4a|CF3Nu28!bh#ULQfOMoM{5Y|yEg zmOP%-Gg3TcIGCUQTPb;b4nW?lm6A8^gOySh=~Nsn!^C8mBeTlpNd1H4I7zL+U(d{u zS>Mf(!4zpu7{VM54#?iI&w{N)9(!d2uBpmF!=0b$cTK zv_MP0Hq64a31VvUFQ7F{CzF2xcJXMy6UcXp`@^q;&?Nl88>CRoUdK9B`#07LnHVmr zE4C8zN4u(x_!DxSPtLy`?3IgFe{5JJWp&2n(?UG|U5oPRTETffp0hE=2n$7|6n!8q zt3=2tl~n;TElDiKtBC6iXeV#8gdDnSj5OomlRAeUGJMmq3Dg>cBSx2aN~QYdGJYA*$-g4<~@ zHHKq3Zd8Dh2l4{6b|^@cn6?BcrDDrwz`Bz)~ z<-}E~UPMD8?WROZ(WqAyDd{#X;n>9(3V+aI+WbBu{D698@KJjxt8gBEH2_q`-qTw z3Xp-+f+E`QL&_;ZG-|Ng864@`%=O8#W0S~WaSKBhO9S?jXsYCVFR=>E)sOju z3l{BV&S`&@6WCiiM&XiSMW5IMJSD!v7uYDHK$N+$9T%-SaeNAFnlyeU7g|Cy?P|K zcf|Vc18pii1<{o=WQH-@x_6U7t%Y~H_OP>V%+=S=;E&m4F`Hh_&!^`Ttj{jka>l^p zn>My$;g#r%)5+p|KDnHpKT8w*yMtvRECnc{K%bFL$EJ^V{2Ms1Aj9zWvnhMCKw8Z4 zJKs3FoenNLaEYM@D7;O~0Z()A6yc5U>R14|i5cR51q5VLB~JhqA=D|i$6fC*+ioIP zVIzIxT^9C7NbwLn@F^`=P?J@y8<8>b&a^*<-@xSo-SQl`K@j`afKIeue*XLDm!JQk zJ^$gW$z=A;Nc-md@4kEeBHCJ0T>d#iyiP1eOpwQKJ0Q#4nKmKTBv$5;unz_!7Lj;0 z=VQFhZ-+*1MU4t9uZjVY(Siy>8DgKg-lSh+Aw!`09R!6F-aU7@e(-;m&x0a z_U#Yv-f15{egDT7lAAH|PzF?AhZD)K?gR(C>S2`*xj3GlUz}e}t``?qS7msb1m3pr z^tG+AJ95ki)6_D`IVVo`uVF;TlR%+}z|gP4^|csjZ@z!`?)3-lB?wZ8_v4x_wI z(#wz1tNORWs-Ay4(*E?r+mD}azkjcN_xi&hV(S`)9*;Yg7u=~Dy9_8Z<&2_+mo@8! zF6zr{CsNj;F6SpBAn?mUhltMRBLZ1R#Qe@ne;aURY)xww?9XbP@$I=m4&F;{`aVI> zyd81NG=u=r{SDnz+2IxCd&FoW6kr+uiMVkXtL&O?(F_wBQ}c`eMH;$>Ipyp}S_`Lh z9n%)^Slncpe>n=k`PCJ+ooDA|231N^XiEWj{^Ca4xXxh@u#VSi3ueq$H`)|b@SWoZ z8-HWoAv^5+x%UE0ZLAhAiAvz1WUWi(t1NT}8c`FEnbBD~UskiQq;Pu~OEiB0Mja-! z0s4eN>DSL3$GN{DzkD@)MyuW3*oR%P!lxN)I9$JD?Je8t)VIOeOK=3u-;n>W(SJt> z!oAXGDPE_+dJMmZ0IkE$&i&-<^|O~1zWQCIufD1D)tk((wn$$gckDX%Ua-(3KjY`@ zaiTMX*Kz(};K6m)YtukCWao~-L;3YHUetp%ShD0`DKlqX;3kM~7qT}JMD>E&_j*uo zrSGJM?vq9cexsb=H^?(wb04|&QciLFhhR;|AE$Og&PI@#u9*n;<;;KMz{#wS&8pW4 zp7UAml1kk*eCH%6ef}`jj#KSnrX6S6!(2PgwTFdvT)fb}YJmPXP0&BW47?y-#pe$* z{KxDC6YxX{Svm)5-Y%U7cE69^1v=ASlaeCL?`4y-QCnNP&W;AB99(kWnZ{7EWGeKC zCb%s~lDD`K)jI{RrVU8)CQ?g0tWoEB|`M@YOHY~^Zd~bU3 z!#PG>aGfZdAl~<41T%alIKg?~(L;3j-AU}Z@Zw~@={$98Aa*AHk(;=`{QURV;G$v5 z@+fq{>ppQV?)Db!l$~>jU_(WAJOBs_JomJfV<){#k74tCa}tXZqcY6SNzfYKK-%$C zHqIL?2*K-X9G0e`{qFz$KYs$ZFd6v*@%a2E1vH- z4-pTvcUTfXuczJP@h7L{OE^omtklWzW7rJuPGW_DL2)wD>GUKLvDXSk5ax;8If#bw z1fdy*HTsS-0~oL=v+R+t@PbVtWTD`Y?E+$=J^?7c-c6v(CU!|490*(ZMgu<*T3ev8!Cs=a6LVD{ycNgJY6Tt(cm;lP4;J2y-{Uvj$k`@tGP6Yp zmfGXl#>801N4VYobP`MW%Ryhcx^Ei){LfSLU0}g>8gh-Rh{1TvI4-o9=R(VKU7YcE zm&kB-yz&MXr13U0JQURB_y{-Q$CFsiwnKB6p9HZdB=o9!Dd=oG#{KZ=B$gOCB>d-p z<^*uF1JaX`RN7Iy|DbI@X#Pa=r>A0wae?Kb4G$`f9!>|bUY|%{IC&aL)0&*K)X6j4 z`$jI6SEEQFklDZ9f1rPFk-6FW_`w!GU-iX=bLvlKsJY}NjVXQyEiCO89 z^|z3>R)-7EtCb1C{kV-p$DtG?TN2uhC2-0m#Je|rgVY2DGRXbuBaw#WZ<1Q!;SuiT z|K%ihL}D+mU@sp}g7T-fmyiA1%XIICdztO+$G4aN*OS;0STlmWJHz3+^4N43*!b}R z4_#RvgQSK!oGa+WsaX;zmTZM*v*kEIPy1?Zqu5jWB$r_ny|`R-6X?A|GyJ{Nm&khd z3jXA`nCV5JPj#|M2xcK$>TqlSuy^>arKP#FOlRZj`|XjWjH6uz+56qEpMCs~-?JOg zv6tz>z(9D=E%v*9@V5^B;@@%e-y#>!r(-!I?f?7l|HuFQzy5dafBrxJxAy$oAO8LJ zp+=*sKwRaTgl-^ZXn3#5a8lcl8m=S(p&*Kj@9D-vb?{ z;c3q?g)g+}*_6G1L^}R{Hkr)XgM({*{cP*|`7Q)s%C=h!SygrPjw zN3utf^y5MzQ)J^QH_NA@YT8W-yQ;@G$h*l=y|;-smDB>;U^>E#oA6hH6oFKm3aWrH zGT4YVoMV%4nY|X{N#daamP(U8H#8UG&RhZ#q#f!?GH}OBM6XY*s*^PmAq90z%v4@qnFm9@-yyY2q35{2#OY6l3P@Z@$59;-+Z>33V z1>TdKivWG_HpG5VXGM@M9-b1b%R>5HEZ4lV{2TrqQoBZT%d>xZG@D~st*Scy#|njb z)oO%@jS9wZ@r0ol*VEbc_55-+FUuE}Oe_|qw8?y7LL(Hd{Co&b>Bz|3M2l$!>i`m~ zlC?mJwP6{$b`Ea1gqQ~_xlGzlRw~Q;%DK18d1re7UhalXVScc!ZT^H8q;AQ~DD#L~ zXzfGRH}M6HCu<-1~nCvlAWY}f7>i=9F_QE_J_C4QacgQ72JTiL>GljQS zJqU?BY|kVSlc9~2vC6GjsoXRXuKlUTGGRJR72{S|r4ehkKo1y6w~)kR`4&>(C*MRI zXym_7ss!>aWD8-~{wjc`Yx_+_1;+>9J$O;WjX#jL*y>kqj1bd`sTS~BW}}((3ITtg zglw7K-qMf4^}Cuet4cVKv!|{u7Z(?^%k#1V3@O8_ulCehx8nKyZsKzY&c~d2>`K-gXKraU`rI9M#?XxOE%Y@lnxH)O18~#IMDyIN`;$-4Sf^=8QaS?vL0(s=UkfyYxK?$BfcG-p;eLxqUI})V#n0;K z86B$w6V)xUjL?p>iV_~>w2RBD$<_J!#l@sdyGW`bC!}2jGt91IOHFdGRF3Lvbx=gq z@3cW7X;&dBnT|m*sjQexRg~)urfEsMR5tRwv~CjqCas=`5Gksj#7JycLy3%l$RTw2 zIt#rqQ1XU!=co<;xV7;D!SnF!)qMUheZlY2u^u42We6{wk*X;E6LOtT&c7Y(6;_G< zh+Ier(io&?b;j_0As({TCctM!W9CE$RK|V7u^cxI`Q))Y+SiXCO%c{E&{Mu;o!I0n zUapX4n#uT)+mkH&jSPVv!ZzMYcaLL8oR~qSf{n6wojr2><2bj+XRl_Hv+4O|=4N5+ zM5}9t34b8GCKf`=Z?kOZpKFD}aL^rS(5LUww_ItPoL zY=r*W;$Wv$?FlDHY?X>Z;NUkCc zIKkaX0y-W72dD|$2Y@2qRyqXCIU84gHYm!e+&SU=ax$4*U(Cwlc~b|9Cv;9ouBr2h zh7&?M*~HDUL%QvO=@%v!4PJ#gMKFK(-;he52m{@xo+2`{Jw9fPaS~xTc&39ZnOY2( zMVkB3a}HP&KhdMe$I%vl+MUt z+g8_Plm_O%Pzu~oe-;XJCZtguEQ6TH)~UQ)!1oQMAW z{PJ=#zZS^2k=`On#!-v0UszJ7pc+4KFB{f*vxcX6h4jDV3jJ!?i zm@Pqz2-988CX*MMX?s3~0{ELor^1WV^M4^;{?&?BlZet``o|O1e0p`=sA!K5T2ISb zPtjxy3Qu)~Co6VL^+j;|uv;Q`?5xLxU{>8RBO6H0i}JdX!iczh;@j1p^2SC)pQ7J_ z03lhn`M310khgUX)+$<=h$XLtI)Qf}unsO*8=@Yej;{Um=E{%UL=A$ZWkDi0Jyk^u zoVIO{@7yvgaEw0lQ`OL!Pm zkn2Tm?o~9M4<@D?Y;u)tN^kadoVa5jaK;S5=R>D47siyQk8O z2zxxzdzRgo%|!}cdZGoKNRiSLptzh)FE60dYZ*|a5am$-h41VKoahlwEFGWZ1Zxy1 zI=Ul#cCIDYW0xjxA%+YVZp#*K;cQgSbD>A{{?kbm!Ki%sDxTs-_FN*l*+#MrB)1fFb7Ny6cDUu4Jl~HV z%0lME%00)rt>ZEkqZ9Vy&h#-!^YEuYwWx^!ALKJVHvlBH0(qg7Ea5M z{->6RPb)g{}Tq8=*LTQ|TY{qiZ!KL4kR)R!` zuA~HYlMpUrL_|#DR7SXyF^PMW5>9yR2lVd}{fDG*tqTUF;ZNSyv`r`zo*@tTPx4|w zVbD{Qz?RWJ;9msvU0M&xykoepYdh0*9nlk}Zt(uRKShzsMtgwyN-&>u`rh0;4WQo$ z=qt?x>U~D{8F-JM%0s=vFbPIh%P0?AivT>l$SdJN_#ge71eK=B*?xrIJmf>pL>k%Z z*w#_g_j?P%NlnQhiTUbg?>c|WIC4-NPa5lp1e8uEC9&zLfKm^)$^kh*11i8|y-^Td zW?6Clva%;RBs6j@AUm3krS;Hx)NnekjruOr3&XTER+KHH(s24C(s;iW1Z~lq+fW5t zbUjUW4&cwv&W)WmrvI7Y|JR$)&a%lE;J;<~ zFPo6c72l!F2IDtb`@G`&qK^=Nt{`$@ZCZF72%#L>BafsZU4*1!NRJcL29!tn6^c4Y zM%V2zN8p2_4QbF2O-u`mdkKlrd0tw}(ZSP&o6t8Te1WDtUpdBsT&EU`h~cNSp6(zSeUE$MrB6*jNdWkp3x;g0+w3 zLqb|XK*nbo`hjEO%Yk0&%*nisKS=#^_PR=|K_*!KicyjzM4$t-;T6D{qXkVr`zw} zYu~;8@P`+{1ztRhutI4HIEIJ32s5(Eszf35Ew z?>BLdP>!49`;?U$eb z@hkj4yvQ`X%4Ulf+TKOjRH5j>l73V2Mv((cll{Cx53v5^w*1an0Y152!xI(s!)EJ3 zaJJ}9F&vjw`h)Gn+Y0&T( zn=)TtzI??SJH{Fd`oOvw{=xZ-($BGCXC?ZgwqNq*+*$#?YNkqn_rGl$Y$iin;5kkRE#zE6x0 zIh~s83LNO3X+$<4v_``rDo=m7=PEbBdHXTIw8~9!gj3K|d|7HA|CNpVb2hQ~K?bCS z@4cwGuM(?Go`6yCUPT%r|7?`gBIEH~dmb|TuOWS@Z(dX$@JI(Qi#pI=NG-99X#-|+N1`JAu>txj zq(8SGH6t|^>Pd3Qs62vE^309>TkV#q@BfYc{jKHb5P3z@(?wd~kmVmU zSR*!=*y2t}p0Ledu{Pu7jl@XJ<`&xKdAW2ec&y=ZcWf+>e~X8U+dcf5RJZB2p-a}} zZ`u5xvH3THDdPW%{VvlnCl-2p&YDT;y>HpyFXAgirW^P$guJg39gOAahJQnYfBE13 z%foE)UmmXi`jyP*Y}`l-ld~Uh@*i&cqAv$nx=EW9|BJjf z-(EIwC<2d&>xDGy%Y{e|}HSbNLP8F}WnW9a@1 zbxkk9B6N2{{=Y{59U%~WWaL?j`B~ug3ctte-8$^-+)vJ4Gh0;dtKVgQm%A2 zvaA9E@US}TwTTginC)Zmlz;t%qI*+`uXQ z@0^F`{AZC)i1Y0HGW$R-+tmrKv9rgw!kE*j?@R19n&op#;*@}FDo;kyk`L2hvb5Ak zwv+eOB>d`8&M|cup5QFgQoFLVob%P=o@L^1?fVpite}(*BH~0A7Mzfr!m=VYCI6#gxXQ}MJPAWqw~rDi_kR)WN-`SddP*c|^PeF8qc ztaNaWKT~#c4kV~PjOH^WYQRcS`*@GeVJeivxxVzC+b|u~4_YM>vg!b8`3>pGM5UFp=QC(@%UqVg@#dW*d6iGpV28RO)Vg0wXij zaS%--Q?$dv?_qR2tvT{`kU5#w!oGKS`Mk$CJNm=v&CbR}y8jerhump>ejGiV*8ETr z6oED7R-@%pHL~Esyh9IT{lR>c(`T-q8>5rhU66&@r1z2Vs~%j4x`90V1}GJLyZKwJ zUO>uBm^Pc0ZQ+SRSc(|Pg75$z(e;2m0i+%{SFq<%5-Uc zprB-6;Y;#(S-aXo8PRP(Xz`eop{lMK&Tgk`zx@375lveLSda)bM|6)|6nb}86K=kg#*Y%~syUP%rThbHS;m>b)1lVNHS6H7}5 z@~Ua9XhswBjpdm{a^cDB;(9WjT~5oA3n#M>M+t2*xv>dkL z7Km(ZICwVJ7lp2cXxOaC>Wn-rMys}}x}|q#`)(pJ5FPaI%KA4Ga258Ruzah%>_*Zp zWFZkYz@^*C1oMtn^9u!KexgcPN-dXn9f^=6s*<1~@PRkSrRX7r-A6v&Yf5Q5&Zl$iOhJ;q`o7ET2>--M6zGsmb7D9a2!0!TCIWayUX6qGVyvW0-6xV>?CF`drl7gy7HnZ1!TOxm(H zUW2Rlw}Gp6C}UEwj7f1R5mMYIQj?;Ek|Lyb$lrezI^h>1?alY^-o5^yeZ2ks`|j$9 zR4n5W?rA!3Dh+}(dQ~izR4x-u;tPQo$72BgdM2Xe=EQ|gXdjRqH~fp;viohYT$v04 z%;1)C-tY2ebM3m21*EoNL+6e}nL%w*#rhaGI5pZHU=wY!+XEa)?xap~E*Fc*^z?U8RFY($F3o z^pQsOk&@9Lw2|uCh=N-xY_9f>rMn3oggleiJZj%TNs!c{zCk%IzqhCRF}&6_@*#Ud z50$(l*1#Wf5H+|^qSsO(xcq21YA(?m3;DekjhoY?;s6YcZTNTI*(iQgpZFEVGL^YM zdF;<(u9I`%Ar>%EVc=cJ;4*%|2xptS!>%7u+1a$w*}BT9QXwCql`|0fLw^T?(#8fN z+vTljAdY<0+u4zcP8o+~0j+p%)M1d0X3Gr5rcgAwGQGyft`Uq#KvU)YzA_IUBd6sl zPWQ})VcO6}kHveP{?Rw+n-(gsHD%Y$jcTD37Ul=i&zAekN_Kz67bkGG5$PlHxHUX}WPieptHp{lB*R4*>( zS63JF>sjfoxTK4-WzS_YYUGrHSCvQZh~$O}gtX$&S@miN>xG%OW!ja>$X)fkz{4N& zCJVE7eR*~z%HR-9TpUfTe)fWX*koNuxmp?wXRbDJw&!C3PN9xT5T%Sw3}ChpXPQ(?{pi;k2mg;*VrZ`i2E7hFN&P8o8=s*cEz zn_qUMAk}D29@UqH(^WUk>b!w0t4qiCon3yJ#H_O?a z&Wd9T&9t@Y%jsm|Z?)a7?y`$<-_WX~eb7a>$T{oIUvwRpA82URHB(Evfkj7aNh@7* zQQjL`a-<6ebJC?(ALEKc>yv;up!2C)R*!D+xu+sv38BOCdt}ScclM{S_%NBn(tBh} z?_{*RV3|>MZ&++6xY!=>x5zh6W4&=-mTb%?F0)vHh5P)XjMsj$AP#2!X2 z9kD->AEONNxeq=4IQDwF zpCD`FkhJlMC2bVOs^K0`Blmy`hkdvTROu?vrGjDwMOXY@mft^&6J35qNQ7jeD?&L0 zw|HHs^gd>uipj5JGtG`PK#~oVW-F*+$I26($cE5}@;$;L(?ENlUR!W%>zJwghljJx znS&xJ6gm=Ga+5X)um%K}#1ss|teP-Wms~jWYJQP0V|fFlg_)`p!#MUeJ7h$Th(Wc34ReHro zLGloV8)Pwg6iTw4b4PY|G}S{x@=Sz{L6r4JlnKt)AjKMyVj`nI2(W4bOkD!gWZJ_V z0an!pQduhM&Ng2zzWQXwmGLl0uii6?@y|G2BgxKPb<>i&C;ExDlEefiD?=lHxuK7)rmFXf9!%mAic=!5#5BFo%JZ~9I zQ3Q~URvvpu;`Dn^)UkwLscMerm*V?(Lk)2m!$ zqIvf4#3C?#FKY?(s^nwd@|NLJoXN<;;@$8R%R-jy(m{u5Mu#aG_Ms4Dbp=L2Adng8 zEM^5YrFMXinWLE$kK#Og6zA1OF@DJVdt@WGLh0>9Gi_*FX1Rg|RS#AeC+Kxk5;|*h zFq2=sYR6r{*@wA`m%G?NItP;10Jj*RaQKuUvGmN=KKm#nv%f1v13EQA=b82qA?0!_ zG7ccS=4aFFnitd)6_V#^6DZ>`C%Tl2JmlVCU5YF4YvHfq-qlMODgaz z|ArMZkG33rhbW@tCNFN%upHy_z3HKmMwTLcsr#fC$g0JX3c5C2&s}W-zZg;H>gzc< z;SI_rzX^>evDcc^dW2U``>IdwkXO}qY{!0&Ho9-#p<8+(x-rEk-IY=oj#3$Nt>6G6 z1RtK4jc=^B=@k=r5NJCIqW z>KR)zpqP!c;1NUb#8WD~5)a9|CZCa&6MYyCOY$k16V#jVJFc1QR`&hJ9SYus&Yn2?LDEP3S48|NeBbicK^P&)M4gA#iz~2Q zhmNzy9fV-!&XZ4dj&>m07j=|4&=oI2O}{)B^pj?adB3k)c;hH>fCKz zE8!e8P}=JaE3&j_It8tyGb}(UzfwYZs`$`KIK7=wy6ep?(sZZF8NGzlyC9{!zL0M#JVHq=c% zxjZuB>;1!|i7#n4^^PE~L7=XKYIc845vz3o{E|$UpgwFymiAO#td(-Ar2@K_Di}Ri zY3ud2;9Fe{f9Kk6tuzyb3?*C50nM2Ov=YwM=ACg&`LScngZE#6@a(az@nZ0 zoUWEFfU2QTbCBi%kov?xwgT*1v{>mSoM{#*?P|D8-ma#d_#C%UvtPLRPb=lbxJ0Q| z!)9tMl$r-nv|G@z)ZbWB1tFMBg@;vZSJgG9s@dfAYZY-)n(J`@-f3j8%URm5xu;b zU)?M&ZsyaL7|}{F=~!b#?Z_#{P38g<*uq(O!r7G%&z5s)`Q8^i{n>?zm{bZqt)dw| ztmH9$@NtXb9rr-SJ7W_@too-NPcSdRj07qGKfF4bU?FmS>1^o(5`g*YWO{ZnUGQf# zOf&b8^z+LEuQB@i>SS?+XMwUz=+yd(dBvBP8+@wp6nRd9;eC8Qo8tfb@b(J+na)0> z|Gt?nZ{A)l-_4d6@4o%^{kt>V;R$PkRV($jJ0J09@g}^-B4m4uT>i+$UDyeJGYq~9 zZ8)5)u&E_R)qG0+!Q@=?e`kyN<@C*T@$Gy%f4_J)JKF`ysQQ=lY$0EdCZ5;XColEx9__v{FGM%y#iC|oF6%btvSwr62ye`{3$`Jz`M)2o zuCL!L=F9gN-@f^9xmb*3W6rN{F2222J)K<~lgMH`xn$T&84?UW)F~ zs~)^_IThWaSMzVnymNVh_wBp4Zx?SCZ|3jcU5;amPQQJN>ALwA!;Q-ii+Asix<$vB z#G=G$htFZraCK1c9Wg2sW;dP9=qyo+bT#bu*&zX6^X0Smk!V&E3Q7t2MoI`Bq)5-Z z=dl$+3X*#G_5+HzMu>cnR|)k_?ZJr{LMKGWD54aC-&5E@egnRF@R)p<#E2!pbeSKh zs2kxAVRE>VeA7VShvb0Ux5z(v4If_?#sM>dRx5l|=$S7|GVm6Sp|m#7B1N7+{>sF2 zKrc>*HoU-US`y>WXZ-n$KcDgEGyZ(WpU?R78Gkz_IGQ!-4@|*>ZmLBEbyo=$@fUQTsu%eKc@<;t>Z*BS22nGnV{KD4+7|KL3Rn1l zs~9Djzu3;V9jf4hZ_`_o1#Odp2=G$&*rU4swmn{}UuP*$3(9SxP~y zBxgS3RcW}XAtmXQ7R>SDQ#zi~dxdeRoLoE;P#|Cj`CdUYTONqL+xZ@iwuY|5$b~$% zQMfIV&$H~ajUJLJ0I$VItf&38JC{oU$E}7-_Y)IefT!+ zg8nA7?l+!8k|9+4^vbP6SUGZ$NT=Dbx;Q<4U^|vj;@J5`=JQ_Mt90pMExZ6TN=zuw zf_e2F`94lp!;7-%ryqe*mT35oWJBGhrYEq0mFn;I-K;$K?&y>~N4I<pe=TFhH1--G>(0?h!(;uLv{8jM|D3lmbgKzh4n< zoFNV$1?yy^4RO%sS&f2Oy~^;|phH2L_pP@@#F>YKj`V>%=;)oyJx|OKpd%Zrh<)?> zkKezi8wgmSp9}#|m#iB{Ktuf;5lk273JbfByLXQ@`0!DE!-w ztQL>0`qQRb@{?Yes=HqK)Wctkawh#cG|~+lgt*Yutng^tG)C#s1%J$@3Q7cQy(kK! z$tH}vU&0`<{S1eczL3QuLgcmKkt%V+;F9v#+wcif3S_^q)+oe$JbIvBSJZ!rIyGU5 zK|4V1F(dXw2PqZ4cQwCREUxC)Qy%Mcu*73I&Tp*YdvzrqTUQyhIrVEit_qH=1CbfT z7@gaXU!hU-nCZ}(pkM>A-JS5&)$iy~?vc4`h|5pyP(*AwOzp<*u%s^J{($RnH?(qx zzy-L1Rrq6hq|!S{K$WloaY{OFL6pMZe>51SWq^_h<@#d2oKA1ricnXe%p*c5Z7cjp z@JZV+3_4MSPFfC_!6rjula|FW$fP?mQ4oN(wLvpZp$xo`Vvy2vc@WY&EUkvLK~P9} zkOmETSa+QL^yV2xtK(!m?Yk|VR&CU+BU9tzd?Abyy1c!nzj{pukoSc($zL5x%<}ga<;ghUtP3mgew=bM|9uH78Gt)2iA1F_pJ8) zXf9ZtC0fg2(t#i7dTK`yv>Rq@t`C$s3WjKzadUy{4jEK^QtV;Jb?~5u%C{k;ZAiO# z`SO(&?6yq&DY z;`h~Nd5_R2pAy90{yY2po_&7NI!^c=T4Hlb|KZI{4ido{gkS!7I=T7FZ;s%p*1mI% zQgZ-t+_DVD_p6g6p4B;5sWGzVwVItYnYFY@iRHuE%jPLw)KBrE+Y}eA!oNoWiaHpV zOU(>{GK93S@KVei=Ocu9A(q@L;`~h)3fSN}vUeL|f#a^bwE$$uMNy!_hlizl*(|lr zd3{zN=_T*2%5NfZG&{(qTKwAw9^@w*)O8?n5*s(yN2C+y9>L#zV9o!ia!DNlEof2t zKQ^GCmSHN;^4D-9n$PRJHj$V#yX>v^Zy@mLaLf8kZO@rmjwW}V;gnB-Qz}qy)-a+p zp8Wh!IJ-2z?5*}}CiCgA%!642o-@~cqNx-N^E@W=oGXY$tmR51b?JG1)>K)>DMDli z#>q&0N^G+>G41nan&ZjUYZ&HJV3-Q3qt6a8E&}gQ{bjr%tAbEdybLjGsa8vPz`3GjKn9yJ`W}3f5x11OmzwjzkCY(vd-k9 z&V8iBqki7oW%D|J){T*BFc{^Cd^(&oKgoubHqVK2UdlHVjj^jQ#$cG~Q(&fA3`Z-^ z_a`(bVUBNRPrGqW4W^?4p-+Z)mL}S8&$d}n%|CP7>hj?J&+cnP<*|Tn}QG@L# zN95DtkoieAjIw!7l=Dlzq1c7{X&cPVg_|%YE%8AcJ8?F7=1CrOa7)6Bw3vEGLFhcUBoDfAOAQ7dPTrH@mf7?gZrLy)s<|cI zN7Ni{Jlmh_jeMy$HBE^(VR8$c6Myc+IBTiy%Qz`v$u(^A@O&ueny`te9@8+* zr^__8*mU4$MPx~zbmNd3tUD=zPliY4CfIPvrWsMqC)rkFm+_~ar^8&v2}9Ci`q?5o z-bV#c$sTp%ni>p08HrDaZRV!f@Xf|4QO-EoZeq4_<2dwmL8ca4Pq?!kFL}r_O!lZ7 z!_;8!$w+)M3^PB)hG8~NiE4()cN2q}qp5shpr$^~sm1QID+TxLx`y?LkSEJCcTX&! zr?#kG1GoIls}#l?+xOwyec=7Prwq#r=y3|2J^8&C;MK>!JF`C08p{Pv2SuTF5sLAf zr;l10iglMJ+(2HDnbE;db6bpQ3=C_1x~x@;S!!oT_O{4T@q=!RRD)59 zlQ$avSuB_x?So0;;ZKB4g!k8T;B$O~=w)xP@HBqXBtLq(Os&o&qsu{QXD6E?t4q51 z!PipVo6{vv$_+l9Tmuge&xd-hnQRyoeA=qe=gl;=*p7Cg|FAA*hGUPq@kkA}qm0C- z!zOc6Y&d1(lqhGGY&TJU`LsiZo;SbLV==Inlv1 zb8hfP-}q#?=A{->PK2C7CJ*@BiCc=0C(A7vaZiR*rju*9`xvA$8do?23)~aA!|iaI~+uLdj7*GOuS#eOXBlI0B7AoIGz_ zuG*Fs->per9XtAcG0}7Ni*DFltyQg-+_A}yF6jKgbSuT@#ToeYfB)X%X^t`JQNBeO zLh5R3$Fa8#@WUj8hgb zIADb0y`R7q;O~PFwF}ci#jM;Ev}}-UU2M!VaD!|hz4|;j?YZ6(vejca4#eRcutdNQ zzAGqkA0^BYU`z^eP7Qx&cjTvS%rSRl01H>DZQih*U?16j4Z10Q(Fxs%5G;vqD&#&D zbW=0k2HhBRW6+I3H^)UcEsRMqx+(E@hHjpAKHEo&ZszsqX5J0mDDhdjn}m@|62%rD z$YU1;-Y6L{!=MyC*7^Dhzjvu3 zTxBwyGwUO6{SHnfFfKbI28))D?|yp!A%<62UL8h-1%GpSoFkDC553_(FvkW+15()u zgT(d#z@)-lZU6@>F`ij(f(KQNQ4E%!Xfg^PGbs$gU~2Hr^lMh98~lTfs4MX9$Jabv0m^HZ_efiL`xl#JOXTL z=8qyix;~T9Bl|@hsfnU!(|$e3FMp{hi7<8G~RWI?6U3 z4uuYZ@LxNQL&qa-0hlw{Ol;du;@zPm+ytA3CBn~QS%wCKo;Y6Q z`1<);t}m8rWp*g0>$J--hH?+ica{yL1q;B2>o6vW@2~+X4l}B>yKG!q@9JUTKje|C z+T$YBR!Z5)>uP()77ulvXo?cngo(F$n1sP(zr*4Z0JuO$zfHo`B*IIN;!KhpdP82i z^!KQ1B6k>xb8t4qq>$w44{!fg7e99I(Ui1=91pIRD{?31>QbuS#=f-wPnw>qE5HHx{ z!-rqVzqq`dEw1NR7t50>&EM{QA7LConG^Jx>vZBJXv=?t57vZC#;cPVd$R!@Ebu!v zz4>Dn=ODa(bm&Fi!j~uQt(FAA-Vy>6;E_ltxrZ`)<0Isx%X%WWT&_evZQUZmJ3e=b z&To3q3owyEX!s|47skJh$prIFe~e41>`vE`55ImURU-!44MPf-dR-P6^XUW<K^z+`s+Yy*N^-8elFLG}|{?q30gg3s2f*cE{?9krruuwlN zQv&M`pTGa^%=(0|u=t<P|K_Gzy0xhTQQ?M2Z#SK;iOuw3?lk@1AR%Vc>Hj{p?l*Xv;R$}e!gsd^E5SYE zA4Och3-4v$;>Lg8i|TZX^Zci74sy-IaXrFnV{((pNOvAAv|17Ahlc=W!}4knwhU?j zqOc~J!ApxWyi{phIHgWZ@Wsnp+xfDN!hPUQ$llcI$W+@SW|3Fp@nmXVg08aW7Zin` z!$06LN67sniX1#0+9Xe1XY59^9HooXwE`C>qR0*Q+uO{^DfdWTB=vT4DiSn=SjvxA zL^RP?Dd)>PgfN%EEOqDG4`9m!ADgsZ$(i+m@J;qHw!#2(Nw_)qd3;)Q%c%O#th}$O z$Fv0`1LGn+6B@Fn>N?tBK8|;rwY6is`vrSUJ$B%VLjBLVKNNK>+C}KjL-&}hkh)5- zZieUm?WneGFsh<&FKNNUuK;nG3XQ9N|>_QK3 zvacEMuY4sh1A6;%)Dt+2EU1oO(7whQbBy;IwMNipFpu1Xk@pLDj^c|zH$&LRRo=Kk zyhrGT;OqGVmNq*8>=C%&N?sJeM;;jYx1mPAzFa57t?%Nho^z!dVmx`6JtGihcF;IX zI@z)J3rJx^-@V_2KFBJ}>kqC1L}4i07u^>1fIa;a?FRM|fQm4HC@^tz4DN)3{j@!<(XQH)m;21$_xUadP6CE$##etEQ* zI`KHR;T<1Ah#=aAF11dw03-5p)+g^TJ2fgzvq}M-C=1pB>`<_Qdb;jpjlwNTBK=jp zD?Ji;r`evVXFMbQ`A2 zgjHI5`>A5FHO3{0YBZ)&*gy2gV)dY_uBk&#VDp=c>D9$@*@C(%@a)*AOD!yJS_(bD z>o!c1aC-oGu`l~UFMU32z{-+vCyeRfU13Of9I!T!6~=(Iz6)Z&S~sw!zzd5kOzP-P zKgmO~-d&Hn~^Bn#O0=dmFz+ zegp5t`1DYJ&HE64#yk@<_5|Jo!gCKu!!d#q%n47l;)L6+ZT;id|2+N2um5Fz^QYfT zr}MX`*4rPy|NhMjqJ1OMlh9ZFJ*JmnN!vNpU4(oaw9Q;fW#3!zLkuz=#o$%!#hWaD z&Z9<=S)lIlBC2WQ=?iKbV>Fm-SQ}v2a6eq(i&B4lII{ziKz2A|sRG#L(fk3`JDg0+ROh4=zXFME?kXX9$H^WCM3MZ3WM`xN0dZ+u>tiQjIaXb9a`CYKgp5E zwl+LvK23CImz|n=FXj=jYs+!dp;RGDsvTR9URaiy(KxZTO?Ovpfu)|0>_8j1VD0mK ze4_*xb&jEGQVB%JAqEPFu|%$yMz@up%OjB9&a5@04FN@|HZ}Se13T`Yc>0n zvCbocFzs7|2FD-V7i@b8?ut>N9ig%79QQF?a0E|^7Ufy01F{qS)dBOJW!k2;^wrWD zo003$j)1fTcbEZO-2s;ZNAW1D7+Cl$kED9Lgh#^`FHA?;?kI%e5PR7osmo|k&c;r_ zX!X@&CLq^?+-C3+=9-QlI$!R+7@b;EjBM5s0t`kQ<9;#hw}W3fTSl(q#!2Q%J5waR z@C@+c3RvBYuz9+>GC;BuwXr{*q7RtgC?g|p6nIn;kD7^>YO?ufdFI#KcQQxH5X>(f z=>Znt;xm%dNqiw{Bfo^^> zUb@~^C+{owMZnfi%fGV9?)(deOoz3gPLDgxLOe^MnaAI69W>3@HBYgh&e0_(SqgX!A zu1{WnUl{2vTTBEYGJK!V_Gq}hFVf~8i>JK>36P)sTZIg~O>FmXHju*Cx^|qWVjcWc z=%6}Ci~*wDN78-dGhiXp>7m>4ch%>iYNzVTA3_Yp23)nMDm|!bP$3 z8qPN6_y2O9K4E66Y>9GNeFJVQ3s{61XSr+>e^2)7Pn>slTIXxQbzWSR*BLMA&1H3+ zmzQ*K6*|89G&Ggni0Et=7Sj95unj1>22y6v(=B!Q%Rl9LKUiqCkXA;u#~ zrL#Km$@ZWQ4*t3FlSHD!>aQh5h8?kB+xp;`m|7j;Gwa_8cWr8Xz68aw6}oP=y!pNa zm$`WW)5CZ}w6D+e#mQ@yhcb$j0tB;2?idQXAZRk&@m*Awp0v7eKyU>cZ}A6}om4}s zvf_kfOr#{C^;vu#E>2!o@hrjE_nrgQwyiCs_hfUOgN{)3vVa*GoXp|!Q7$|lu;yjB z$d|K}BCL}{yBS8JErcZ6&2c1J|8A*7YZqxHnI^TmDbQguPx1MfUp5IyDN>7i27JGy zxlHMvrt**+eA_2?WJqGXMRvflUgU4170FBL(-HfRWBWBtk(|f5#%jg4i`EFU01^(F zgg_whrPKW7gz|FEx#_K&c2@)*BVL4>x9i;EhMKJGPvD-(+YW`}4?bBf`!wM7KR_`bITg;yMANADKW zMFTXr4ZoI7Q>uz1;)LucDnx2=L5FRUiYlp*N{HMgUoJ%os+3?B(tIFrQ=UF<73wyJ zbX6YHBvOj$EG`e2%eu`X?AnXBSn32$Js*c>AM=0at|Lb1Ymg=T|q&DgM9Nhs7oN_v&i;?(Oyb!~ANo zc=P`9;_b!q?0&marKJ#{X*!)x$v>Ew8~X3;+vW7z%bUx~>vyy1;_~M0o3mZ8Rzp(( zL((hTx5%;gv`Pa>vgDv0VZdR8wv@}FpZC=FrOPehW-6-RTvXMY%cZD#b18C309uZ4 zNl?&jU$qy;O`e-Zo=~ZunwF9<>=N73VuV!d;?!o5RPNY0X8YuEyc!yppmXX1&4n>` zg<2T%F}l0YrwWo6kndB^2KXTB)gVMhi&q09Vh~49GDZ;>cRF?X=xXWms-WnLaL>W0MCo5C?6)C|73X@$sY>s&Q0dqb70L-nns zDqE?PXwAb=U)J`(4puG2cu_VMsxX>rf=%;n3Os2MY6=QG(U@Txv5^;T^pU)P>m3tc zBxo=(H>rliGz+_2Fc&kTo?6Zx3o3BbiyXpvnG;ve9ZZIY8*9e~C!kpk)mTdyBPEmLsM>I9=I6bk`WIO5)FDBiv+g01Pk`9(; zifsLoe>zJ6pZo*VSKr~$(C-lRpC``#Cd12Z+EV@Y0aKe<1w|0NV z%CC-Va0kPW#&CC}BOlETk}W-v@CPt#K@=WI5;klXEmyUJJ4Uq-;T`eInmFehM2s}e zdsi`1ZBwNf;rsboN+u5}MpT5Blf_x%1*Umni?SqpE-z5}hniPO8&0a^Mt*=-6hqJ9 zeeU)Nu{$)boL^mHJ0b5i{CJ0`D!}6GG|pbou&Qg@#||ZHCS9PAl3IKUmXoiQ3lb?<#MDF!+Ia{pqfPTmR)} z**R}yaQ@X*2hFG5Be$9p(r_-~%hMg4Rxx=m-% z^74BUkLJryN6COQ2>*T%bYs9v;*w&*z@$lNfamb)EwwiBA?II-78TR^*LvW1egL&f zFR%iIY7>>?*)eu*ztCJ%oXlK0)6UyHeJX@M=qCJu z`B&FtTX%>*JXKn4jh0z4|Do@i+qh{GVE6;~mASlI}CV;87GTC|o zFxFfvEaJA>45frLh~;hUxpcEJpC$M?dpW(lz}6#sQK(-1AjgSv1^Kg7K1YnZkclg4 z8QDD5d_y9$`=!Lw;xJX(q}*)^@6%cR#iPbUGp!%M3rH7>28?C>VI>YrC}q4f%}tT< z(QX+Ki=4D4KPz(;evAvb1)C4@Xx0%+?aEoGT}qZfBy{%2#9En0P6S1YSXqkt+? zfmg~w`o^rsBs4w^CFa%jVtI8jU0%*xl$aH5=UA1PZn(cae6gTa^ipl2?WO^l1QI~b zBRmwJXb9rmZ85J9V3qh-ZvDF7VZ67)d&YCfJ%wFBDou<>uM&Grm$CXe6Q8Q_j1xcE z4X`&(dv1*4-pY5kykONGs~Veb)BYTA=~Jr)IUYn>wHlo zQjR*WjpDIL_DGhX&L%OcDOGsIs0!AK#18T$_Q2pm6N-b3i|jbzcOmi>^HXFd;4Ihs zN)%om6wQ!ySLz0GNHcy6H}+xgUQaQ_-FWU_#v<^XECO>?9{WX3A16`x1%GYF1-n4* zaks0b8pr-7TE}y}tl9{2ly@_If!n_ac1C91l(J&nu#)%5BbDiX}vtTkmVz*sN$ zz-deRczj|=L|4(-i){AsSP~+rgL9a0_?D48kP`lY57gN4VOh%P#E5y}!EmD1B#q<2 ziRDw)2@{of{E_1q=Ss3Kaykn^jO2+t;8Bo!F-J}fxET^_UMdM^EHyJ2V52K2VibTE zsWCv9agi_R*E)Gtt{cLxTAcaW&#e1R7$f#yQRqi{TG?CA*BC;R?}ccUme- z&W>Q&T(o2Ao&Am#3C{)(p8sBA*}EOS86Q0=b*{>Zi_n?73oYE2&i)pq7dG~}+f7Z4 zAJ<_LpZ>Au`>(07&zC2!X^Cj%H8QUcpJCCifI6#m;0i;`3V2Hb2WDg)f!?!edngCD z`4g!P)$%h2IXf=SmO9a_(%J5sv4cGQ0YAh{O!cg$i97P0umna6RVh4_N|%KyACnr^ zjeijB-GYE&k2=X15mLL!n2b;(W{j9Qew~gZ$eH}X)G2ECQKQmkJXH{lv>8O&s4_p* zF!3nFvr!N>^hq~aqsH>oM5YlnM$|k@QIk8CIwcJ|XjIUQs9vEFG(!j)rJDUB2ag>T z6yywf&`r!J)c4mDX{1a^%H&0YVeN`pdv+3Za(246DPtGsK8CSB3C6A}M`s<++=1z* zz}d-@ZmeBRlFlYF4R1F$i03J0vSX=L&d`HK1&!8lTq9`4Cur&{+6VH3sgOUA#0t-y z7Y2C`YWAp`1kz)ZFA!=(kP$)8PXv_?rcQ@be$-e+jS&?cGE!&&DYVpOo`{x0QHT0lSNpo!k&GQm8x-9dBx?tyr%92To8$I^< z60t_&7>V;dC61{XXavtdf=8F7o^Gxr3jLDUfk)khjvi}$flwoIjL3PeA}2kVngtFy zYE0ZLjJSDT;zpPM0Bo&&oP^u7aCWw}bI-d89zDJURg#VLG1BLGN}uu()hdGWhYsY> zrQY&0MhuNl4CxB$$In?k&b$O-kGcsTZEge^p+@c)x$`XLPX1u(6gm8;(OZw!lvPIB zj858I)EVdX`m(Jeds`4eU=eXDNQNL#b2v&|?OoXKCVfo}1{= z=vT1L%a?UG*`m#lU~S}zkt@$tuB`RfZ{`LZ6PNSM1d2v~0iZ4~Q{Zzqv7*gWfRSh< zi;*nPQnI8+Qm1eshm6V>;~((M#EVA%fGx7)eN>Pz>`^x%qs=QIBh<(lBWIqaoXHak}gZZ!GH!1#~nT)yAm_va046u9+jZOhOJJ}TFP|~gVv1iW#jLaFA%t`cD>LrJa$`@_P z|JksW6ihZ!N4wO~=sBAIJzb;>U=e=P7=22UDvAVn>Y%A>*g^ z%%qJ*M*`ScWnVS^ted>i=1Pzw)d(CTaGtHe8N_cbJ#19u7`56n6FC~42_obqd2s`u zyNMcY&IF7^BW8@4d6r@(J(4;_3^`;}ycl1#=OtdQH2M)lXubFCXi}p`D}B{T=!lTs zRp^unH}c2GpJyt6ss~lCC@LO3DwQscRC-=gNslio>oobs`mWRAXRgNdS((!kM9EAVRUCratRSC&$|gF z9li{8BpZojBvN;YRM;2iPh5JH&$L$2l|Q9$(K7d}(Mzp)z0{g_l3LdaTq59`2|jf; z=*db?q$QFFLCq4WK+X_yCpX$QxwFTehgNbQl2$G9qciK{itOaNAA|wQUOmOHVV0AA zru+xF(B>|TJy4oh7>ioA@2vyUCcN9&L6MeI@?MObkWF#19}lD@nF{=#oxpQDj&Wa< z2Hqh#o6TZ1H;0rF-A9;wEF!j{i&P)WT@>z6lsrtTU7ft1PtTUqdPie6fb-Yc#1TGE z<)Ew(Ol~KUUl>{#b!en0KYzq?9^HE}qAR!ZqByB8T)G2F`?V;_!mXDi$fYe|5#dFM zwi41GlX7pud#;0IfBhz)9pdd5W2q5C&#Q1BSvwmlFyOU~Uv_Etb2>F?LnSciqg7(X zp34wnI)j3eui70uLx=iH!kyCYFk^@g_ZE5UjoRVCs^F7wsKeVZNy4qN9^d3Ta_~{H z{W!!-<_;15$hKz=c?I}J?hu$$yI*{~x2&&Q|E1@?I)M-K>2f~1oL(&#i_6Q4E5<;e z(5@Hkv4q91@MS`XYZgK~mDSKx;1u zU|z^d0JGftHo5+sS+JH7iuZoPr%}#j3jMs-ZlNx8#I!5*!H6ltWyqKNYY%`{ig6v?1 z?#Tfu2^0P)JyEsCOz1>mv51e<|4NV4e0gfU`|-Q)-uz^J`uO`FURb*bImpFa4bQa~ zBxsE}5TWTbBagr!_}WEZ;p7P;ADTZkbb)V1vF24u`(aB}?`BwCD#|0AFv4tNheaAN z65due{`{I{yqd0_z~bc|%1WYCDIquQt)Lwbip;R@KUgkWc>x)qApCespd~yeUA%nx z%1S?AP6pGR?$;nSXH{Ow|IYfxqU?ub?}As{fvC zl)qcSetV0enqRWF;fJ)J-?3f^Q>ebr+suCOzt|7>0j>Uqb`HOQ+sf~(l^F}LSOMQz{2Hs`1kym{8?QS=`W!j_JiLs%FjxaXDt@LuQtnjghu(! zKQ2@u#2hku&<~r+J+gA$qX~U#U5D;^z6h_BMhzb{Pjq|ZRO~76Dkp2h za=jHF$gA~w`-|s^8BD83#@eRT^XM)Dj^TRo&bJ>hQ~<3AeGF}MzGrjfK~N4sB(0Y; z*@580Cw@u3x?bEYF7OR_-gZeY-=>GUB+F{lR<<7(Zb&cF)eOQ!a77hfNu)J`(f$DW zeMlDu-z<1erzuSdT5-WlS>h(_j5p!l2m2D9Hl|Q;h$@(C ztWyn;Vr10KhNT*{wd@x;^ftS=nq6JoTr679TLtDlCiJFpOYqGI$nX}i-ADxf?L*B$ z9WzKAV3rikkinvT7=*#3!(!5wO^Nq<|PQ4`_+VQrdoq z#R0Y6VkrTl0-sqcc5HlZ*S{SLjwxe~Y#1xzyGG6L@YZNZCSG%GG*h3cJ+-dihF|Fo zkNotJBBbh;J0?VGU=0Qzb;d`GYxlW8v@mT2+wN4ljmpKQgP(5Y)E^r=DTq$X7A?kK zV|o$@9oZmoE{&^Ds^%qmWYs%9t&QkmfmYp|2$&b~mBOOG!XE*2Is2IS*AkCx;s{F| zw87PaHrol2HMmwN1#056Acfm5m)G-~+0A^}W}B=4ys_f88tvBMZ4e+t6;ti|VN{x^ zJ{$Ydz@bqojKt5M0Y?KXkHnY8D3UsZp&L~}k95iK9l1u6L>@~69ud-n0S_Z=V2DG; z-3Dq1SEtH_T!7GcbV*I4kW(gI&aSU7=NHRqo5NHYy^Ix<9MHk=)dZCiIR9_SVlbnR zkAgLpAMB<`R7|S~%X!%aN;&xe2J1p!G-zVk5_XiCj>iJG4r!knSL@z$>0&)@6;yeT z92Igk@Dl^Fj;eubVf99R1h7PvH+cj}hS9_h)+Nl8|3V%$sqro^5jPlaDvVtOIgvMk zTi^qGyxH4r1UNy1mJG zKg^r#T2wF#`g9E?rQnZ`0X{mI;yjsJ5w64?wvn)dGm; zLL5@2sd9DBh%HF8?6JH&Q{(1bAZ##cmK%4QEaS<9fRoaVl`w?>5otu6)!aZNsL#1L zmKn8%9DoX0RIVG6n5~{Gr2>v;ALQ8u#TJcrQq35sR$%9QA>w*@Jrxw!-BS)i5&}{^ zWCS9$^+bpW)L2%cI(S`%$jrj}Vb!Z<^}N2>3SUFK7dd(lSgspJdOe1eraTM+T`d}(!PS^FWM<5y%4&W2SlSR-GkIO&($_pv){MKj`xv%!dXB3u&SAI(3I&fDNnWc zKz4n0Dru?*st#GK3R!P?=tBD-8=ZH=sISkjDNFr0>O;#@J>IIK8REvbN#S9c`gF1Y z-z2M6qOs9e6e!atpO+QcMLGqPH~pi5a>NXxwy9Ox*DGv@mjmci_;1LWjA;-$}QxQYn*kyLBD$1_(8{N#BRbh!LnF5^7zyp;0oU5XO(0?s*uIQ2y=KhD?;FStiQ2 zr`FpazyJQti!58R?}}(G7;KzLq4n* zy`$;VamA8;!8cb|`2VM~i#EUDvailKU2uvvBfLD3_w}3n(UouRkFbfTaJS3Cybp2m zWlj!}bvsV7oNiduHnG48yjxc`RE z=xo@~ss9LuHri;%>$;8*^mhv($rPe_YcD9&rTE9M|6h!ED&E3gU<1N>z-Vnd5GNioB@Vj@2o(+7u)mW`k5^QQRg^Te*wE zJI{qXg2&7B?6>sdgCzwNQ}E$$#j`ZdSylcw=oI+8Vj8#-7gNe!7(H+tbf*irw*{sPPLjeq@b=8$UARM`rxU#_mVfa!WB~(7L&d zsmOZ>6Up7e@Za(tVg0ihQW9#M!J6lCQ9qZ9E_1n<7IPE*9t9|}ec9P4H#3NX+rv&I z7?Hb!!Rxi2YC}%8ii`_*9DhA^nHpcyR0?iAkqJp*rHil*Gi6z+NS6V#~v@)Azms z6*~SN#jzcE{)4qc(GGJ(&jE=2g0!Q1mg@cF#V3zDmzC!)bvn~9g&}3P+c3)Q!@}I< z8L%4?Qw1q56cbKd*o{P07_(y5`E2`0Xom{hE~>d>J`gW&RjOz`=Kn^w2bM~Iw1 zEV^{$pBbIy;P@HR8nJ_tT_vBJzrw-0HBlH>hx}|6^dNuDReM`dk;|q6!>bvRa<_*1 zgiX@7hyIyvgvcJ%EdqX?ORq`QIYfd%x;8vq6cJ7qtO0Sk2&5ez-Er$ts=7%mE-n{~ z#k{oyW#!5-)|*5S29sUnZN0=R-zb7GzrrAw?`+Qp$)yeK*||tL=#(nx0H>uJYeF~H zgl$TvydRZ96c4 z3h(jrc04HJy{7T0t0$|e}iBZKqm?Yjd7l)p{ z%Oc)oNPwrRH*IM~1M0hUb2huF_v6TH*=f??!5MzjQt06LWbp=Yp&^dO#BZ$L-|Yy7 z_ok^fM)z*qSAo&}mx+h3D_=SPWgq1^aBtIlM#vC6n2)o5Khk@AoWIPmbR__J>D7W} z&2>X(PtdW)0@Kf|kJM;m-^S!>Rk?tj@&*9H(Dt*0@U=-%b~|K8{0-h?XLD!YX<~5B z3!DhqF`@-#Zf)la+|%%fj-=7M6ukk4x$%qA+jvb{@*KQGjBcWEzup|WC8=N`y9k10 zlZQ#A*OS-t>Dl6<-XE$e5~=K=I6xNew#^701X@R6pE)=c9@*vyU%s8>6k=1{y#pC= z;!U{sX%)mZaZdq6u4<(Y?Y!zPOqF@@*7kh_w^2JNA*Vnv_(~C7VK9~{#LUCIqQTiivs6y+#r4<+PnG*XZ)ozpX{Tvcw3AM|VU#NfmNV8%DXB5Dyc1q-T!r%wAw!y>W zW00UVinN&rt6h!PR5+XVG8L}Emn?&^6YlY5K7U<$B5g1fA?TpNuu6_*n_+phLf*$% z@}mgU!t|%iVh8~@NU#QO=O_dl zf*Q*9Aeq1G-FYtLRqoW?!QMopKBQgU>8s$bKEX5SgYRu&57Gwn4)Miz>s+|c@d6k8 zt~nctag#L8z=mK?8CC#~D|{e;KflI!7=QkcPv8Be847c+2Md$L(^n>m?QGH-Mc#`1 zFyXV_$so)eY<}FK;2n3rX*BO%p1j7yV>Z0SS6c73RE!;7ilI)>sf?js+JAeutAYmk|Aw*Rht^b>*U~hv)9GB;KeVF15OUlq=6=ypvmDW z?+Q$423>7AW^b77%-A}%It$Y2I&*>SsbmBR-Pc;#fINW2d$bxU1U+NTuD>4#+6%ilD5Xg~kP7&D1-o^jAEU=IGQ(?gf zTpah6ABshWGW;#MX*i0dkiZVpB$iq>&g<(lnM`dyF>Y0ST~r(W{gH`1BnkyYMoc^j9ZaJJ{Pk``+Fsn-Krv)5ea%zpb4}-!5HxD;~#!!2kX7PM%Fi&iWlq` z56H$X%%{^Cd$5l%3)m#d?&bOU{r&yf{o*W)*5{vpI)|6ee|rBG^raK{Fq_UU&WoDU z$`o`8R~U^7wDn*_$Uuk%@tMED{- zms%v+;q+HSmj7CMokh)CNp zndn;fd#UgS=er{|(zOi8Sm}npiL@+9=X(fiR;vOz-wD5y)W!B}?$R%@(vhTV=r1+?gGu*0vcy#Q0OVivpH18IgSLQWIIEE3a4 zrvXusMya9Rs3XS%@_R{0+~5~2`lGBe1^kXxb|QvSQcD7g51f&F{0HI-w#W{Mh>97@ zhoet~RvH12{j&Fnl$bvAI*4);y0PIImGt5mLxF*|j}9KFp>Tl?!|gTMiXLk|8~9&z+EJrzjl z1vr*xmj-YgA8@2QNd#};*S+n2Ytf%jctPOCZTJ<7MCRVK^@99cz&UQg^(n?PxsOSa zXgMM=XR0AmHG)Wcp#b7QP*;uN#QJwSaxA>~1f|F#LL^l3G(%=ERdEvT(rnu>Azr{{ zi(<5W;8DvKOQlrjS3(o#;^C2G#DGRpbp!P=iy{>7LRzS^_hk1p6VWm;cHrQHSp=#u z9Ue=gkPyl5Am2a5pE6&b{B-&xHwQN>#@;U|t!=fBB3_s@Yw64q?VLSm?fQT-P#Z<8 zd6G*$B(_7xj-i@Wxig+bzBtl*&xM+)=|)s-sW|xnbZfs6FQr?}#M{)aqH)sSuUO3cw-kRzGS4kT;c5or_>GuB2@gtbI0& zx%eI#61n#d`h{IaICloz$wztI-ZStwPe@PLeq~_$7+^cyM>43LL5OD1PG8#C73S51yAt3J+_QxrI8k5}Yr-Tffw!tIc*> z)(44ky;zFEzB=hIC*sly3s!!3LT#uPg6(A(YDheP&6D(Xij}A$v)q>H0SYTXkis!d zI8Y(>8x`bh(cBx%rycXPt$+c22K4oI_|B9b=f&&4H00~)uAL{OC*r#?h;Kl|SEmT< z1Nijn`O+SUl5Z)jpeRz9uxxAE|^fzbL zA2%MUzmT2L{!pCu&-R)|*?gn~Jis9MtjFaEzd11B9!geZ%A=J7 z{}1G!C0{Y~`!gHN;mJM)hysS@c<;b`hEZIef8F^@n!^+ywF4q!zJkt&jqREgBA5;L z_MV~(a`XfuA_Hlcu476c(zw%$&O`K7snj7xA{j*m8~ zHH$#j1-}U1D7px$m217-HtGbzQ4+R@3`JJ59XVZ#GSOC>s>O&lBic-&93$SwCEnEP zIeQzZ$>n=uuV6N)Rx^7bFQR%Hsf)z)GE+}Y#JUYL^o!IXwl%g%K1+Q1oJ3>=+nHF`T4m zoN^;7I*W?l`L7CP&CV-@+oVNB&m34Ka(api6HaeLMQ6U%Ucb_aq7MsdbAS8}E}``Lh%RwvLK?2M+5rp>Wl0 z9n+IwPMP3sh)>^i@HEfu{KlktJ`Q+kUm1g4I%AirA`Mq_)t>G3Q17x9i+EEagroK(sDcJGtfq`U|E%yl{;g%Q|q;F3hf|LSDM z-fWOOi&3)vkVF#<*lm$*&!g7V?v5f0+8tq~{)vLtRoG z=)gJ>!Na5&k&u4jKRTgD+6k763%zlbs;9dv%)o-r#}`X&ID@s%fW|1}5HI@r=cG%7 zFQxdZTf!Oap*+s$=ciLc)NnY1k69FF1n9mNYtVLD!3Nidj16uyPlFWPxSlTNv-#ER z`lbzTlyS+Uh8r~-;L+fXZnPV~(eXGLz@Zp$G*7ny9GwBjWnWjXbcyymJnph$gFTc6 z93o_i0FI2P;Q$98b0@`y7i0*6@ow6l`>4=H^Bl-2H)hl6#ntj+wrD{c6hGMMIJlzIsbjKQXu6YU^Kw#ytTzr_gDE8LDWD8MP9EOy?kcT4u z910H*HwYZ5j9nCxz|U!7ylNby#`@0Nk8M|sZS46FVe53)5T)8 z#Q&5eB8|xJ5`F@C0A4k3niHSFoy}M-Zn++;mrj_UO$l}s7dBNS!le0?F za59^XSX5k7zc%=Z<@m()tZTw&3e2m$E7;Gaxn;8oH9qE7!dag|3=kEF%X4mg`nT^u z)NUck8io;Z;wAfpSF|Jd7<(7SzlC(eF$k3ybJj}Lys*VU1*2e_jTi9^JfFkNBH&1b9{-He3?C*tJB5Dw%Sr~I0)I80K31e{)S)d(=V$ut@S>d*BLs9`E+1Lp! zh08)PZqeEcNW@Sv$f)wu(*mXi;jrI=kYZ%USsIpj{aQJ|bwxCJbU}!WG+36oH`tWRg2#7*$WZ1l_`rMI|5**rqxV0XgHEOOg~i zBFNz4Y&IJWI1re5gATf*0~Nlrc!}_Ycn<#P?BhH>$UT-v2>tzMD})V&5%S}fQAnl2 z+YfD*-|kWi152)ouXc>P;O60e$YOOs(nXx-Mq>&5iqs#RB0lKhWI zpcmFYE3DAG(5Dt|nCl19O>*a(*lC79!P$f!XE0DzHW)Nqt)@0A_)wTB zJV9~O3|S=AUF~6NoFZ?##q(n)$bYDru0jtoQzndDehA@2HQM^?=Ma8KWG#f;p1g*S zFAIn8V|yL2Fgsrl>{8p(jqw%2i2N^&lSlrgPHis^Zjhk<2HS_srr-h z(GrPI=`0Smt)A84c1SL}`k9Nfx@Ao0;kNUpB0MALD{=_xUfW&}C+Xze+A+$+9>Y~2 z^|&R8`^b|8q^XT^GtbtAw$8OVAkp&OdvU|!4V{KXY%l6iUmn$l(oQ@mTc9oU~6Cc`ddu?}{GM>vBF24^M|j@8a3DcQk{H_qSV5V3hQ|EMenl2C$F(cIrXz zMQQ)|(?<%G@rKL1me_I$@|v$$T77xB!JJ&5mt)okadNzw)mK=mIyove9M*Da<;t5f zQyN}((=Iqfz;G;!hH1Cj!7%NHW8s!WrES-<>L|Rez1CV^GwX$qL2J3O;&od&{*XQ% zRTh0J-9|;0$v06xrNX&m4>RjyUl|m{9kBa7zb>$k@>hl4(FPeILtGR1INPoWcAfqO zU?IKUQcXx_J1rGL9z>sE{(%KQ#GJX_icDMLKb&H5wZqevE3%np)RjHkY#i0YtyJt+ zx}qTt7gwSo4q=wn;Rsr#=51j-g_Y@%nkU+*kh;kO1rEZ6vwL2{I;15-Z};F5Ndt-p zc{P%Vv{0pCQYi$wYM3skcwHB>#Z6l>yoxGntQw{o&cuCH(wLnD>@VCvL*l}zBg$v4 zGGS{UrvX3NOPci#GCn4C!~c1Yq6dM&!$W8Vb|LvqZuA((L>{_h!zbSoJz6>|pokfC zR>a+uK)j2ry+xA(KudM&Ufvs2XOm5g?fd-v64t;JIHXaf8jykmlCYfD*#g@jTbAXvfBGRqn8XrgUPG0(W=L^Sw|GnUM@uuZT>Qm69eq@MC>WC;jSXQ zzlbzUo!iFds8quqhgWwAh%tlJHR*`NAcXY3sxV%81y7a7bkOh!?(ZQ{y#mL6X4aW_ z5PboA%?4XohVSdXl}Gx$-TV)dISl5norQJ{Q3M(q>Npcw#a~m)GB>Ib48UCfZ!xH# zg^bR)D{tluz2EJ^C}*tV46BBJ6K^SCany%A^Ejt%P}?OX)`1=zP%<@lKgE z!%tzVN|O*q$}?$!oUu{ zH~{UuE52Ro%g9L&VFVDp3(Z(^3^w(J?%4F#8>FR265%iO4*+`M+vY|I;cFD2$a5y# zZ(8>dO8s$;ujUx9BhS@80^A8FyWSWgOZLWdU8G;e(r!5EYJ}8iJV-hbJ{jiN=KA8Z zuZHK3$|qlzc$)H8JMFX^M!FhIytCu@K8*CU8r~73zFzSvOMPU!UZ|aP(hJ`(YM|vH z7$JuY)G&8=1z*MOK`4ig81-rnY2ppQAE6UQbv>x*;o?Zty_3ie1`t!ZzW5fZKe9)0 zJCV@gboD}k&-fh&xu3%?NC2upRli^CZK)q#LArkP99fBdtsn>&FWw!Bk_p=Gl7~qW zPJ+Gf=XBWBFQrx3B4oCzuxp7NNP}H72W<*$p0$Sj%5wHmM3RqC0}+^V5~`<$+zLPZ z>AUZanUzLngmSrQmY3I8*RzYuN==4JQOAgBgir;I5N4b+|~SQw!B#2%SH25u5#ylL|3`yCFNNW`LvEb z=%A*iZtM8cv6)L;XQ3!|`n25N=z?m;BD5QRcWd+6m&Q}0u_7G-_j4_CmJe;LX{1y7sw%rZHpEqtvV^T2S^YA^B@g8xZvUhuC8CCexOB`S5SM#< zz_#C$g99~Fg55qzfi5uM@D4?h=dvHAK&e??m8ol>>J-F!7$BZSRXp&$1z?j4Cq>z+ zCo*%85m!xKE-tUGt{1bLNQ%I~GvfgFn(Tg5^!<9yK9-$%GO?gaxNE7ll{-k3Cmd_+j!f0{R^YMZm2PiOpq|eTeR6stN?A6^= z!3y%+!C)t(R3z5}XHVpnz`gU?704Mv1DqSJi24^A;VJ4!rA`()l`9U()v31+_^oe9 z`}RF%EiYJ#{x`XjQF!~|T^Ou!>#UeIMQD)GjdcKJvt%3-7Sq|y{CakE(H53h)~pWY zn2^_^N8vr4O_&;sO~uQyKYn}xpe={&(vf6=B(NpnbuOk;t^6Cwz3U9 zSFUl{piN@E$8ckOGIuYNddZ|->Pq=&+|JFlT{-3E+OFZ+-U@KcoxRhY{YF7rpIl{) z+?|~j^(d0merFdUsQu2Kk~7quy{3do`<*>sOax!SAa^?TBCfipclDp@7NF2NBFX54 zo6D=^e7U%84d^Uu3x-kxya`BMX1Y)ha3{(Yb-~mIh}0g}W(j^%EiA)5rFkBIsBsQE z1PYVIP;A4CHv?1onU$}mUWPyJQ1Fgbxe>2`bBt<8`AtmYDk`%LaSGNh3fCB7W6th5 z^zo{uypNS1oOQqPoDEci3h$vT7A#N7t@7Q(`0?6~Tpz{UzuAlMGaIxJ4#{Fiqgb}~ zZU-BXsFKQblG65RH3+WRAPqJU856BlA!FWzafu`8DjJ!Ksr;kKM_z=j6hA87QgWNBll;^gD*g@sP_Kb9r-fb2VMg zF59jd<@?B3gP?2j#$<~M;lMS=@6Zi$R2e@TSzK-eCN)fFlr3_+bRg{!)i^tbo>FAm zO-7aOAXPy|72+!Zf8qh{key^OwfI~fsP@jQQbXD>P_;DjHn57ft+z!JyriIzxJ9&z zaMX?b>#VKmJ`*c*6`tZ+5_@sa7fPG0}<^YmvboO`EhDHAmeY|f8a)b<}|DeAzfm;hqXRM|wM1`YExSrIt$`=sy*26VaC zZTC{Vky9E}-m3GCxsR0vHk9QeU&cGn!ylZ=@ z>uyTK0vu#*#$;reJnJ97{^#jGe*G`&n?L<#I-S2gwch^t{r7KPSTTYD!Hf_cAf8Dw z`*dQDp=D{`0mhuEP(HLzw{ZmPCKyx%Z+T>&XQ5l{v%EOyAGno~GKeJLBNeyuaqE{u zR3Hx8CDfKjY-8P+>RZ}mPJD2>$OkYOc!A^ZUHpIvgT%hQ1wItmcix&{7tCUR-V^T? z5E7U=_}MMuCc2}VjGAXzE|b^Qbbd9R&TiW3#Z|0IkH}b5*k!Pe)r~e@8sqa?0G&L*7TIf^*2OdrT2%iaOSd18iumf2WEyv*Q5+esjTmL?G) zj$Qkh1_o^H_zUTgf1BA&>Un?|=IE>0e(QSJbsFy$<)XacKpQAR*c&y{m{wPo_2@k@mpEgm}5mA;pA(C_elq znNuze=tp^3&^u-?BV-Usz{Xj-FHf_Zc%c}!Ob1((Y(iJ{{w&QI?Sz(Cz7a05+~KaW z3*$l*!D(4kvXt563=^MeNU%f-hNoE);1NkefucJUomnYmKN2m@_aDE1&&pInChA+n ze3fi+#ruSi^*{eTyTV6tndO7H#rHoCl1=S44`h$g(RePV1&E9A+57zccRUw*;dSWh z)ydWl_O{QyxA%BDBVaUl$ok1%uThd<0Tu=J-nG6%)*r$sKD9pLN&CNSC%lc>&yedS z@Uwqkyk$=kFYyuW+ghGYXVxc{Yl?<7(3c*Njej(|x#7j;_Yvj>Hd}!WFeaLRuq-Tr#&Ao{D-fY7f9rssK1>>q0cXo} zfW0NYh8>X~1ltz%8q!V^-ZbJ;>U{btSO;mu{bY>_9GB+e&sXLvzWX{qQ|TV2nICAr z{6YzVte_w4uW-GFT)}*EK-%K~>hi4!f`P)^y{2_6_>W({G**oae897RBwYol6;puic_OLGo-uJw(Jb`f%b z)Io(I-=e_M0{g4zbb{J%3<@hn^94D-1m&aDdwqSKv_8ngDK449; zae{V0ED|>dlKu>i;+m$@=$ORYCv}ACu z99lvulex4U875>OxG3@;K&?aUE^)YzoQ`^2MczarLzij9Re#>2=m9jJxdkOYMr>=8UC2h|Vbn4VQ1hmvuzm!8_W<3~SD?(zEq*14QACx% zX|NpM)+&9Ko>js?kuz!BtCbnaMW)+0QFTWub#ZBG((KVox$WZ>OyNuRNFKcOj-V?N zGzfIbjkg`Rc+SSU#g|bCwUT9wWHIu6G~Yw&nn1+}wHJ_{+5U=InKUsD<|oCFh!@P_ zN+yKF-`J!n>gyGfR7WsN$E^z3zFczY31(32Z+dfm)dsf8sBElYtGci+b4!{oD1B{2 z;HtE>Yl&w2j~nz6i4h}zl9xv_mdZ&N84cytvf~j3fW_1JQQCQ<_1t+p^973W-Z}+0 z9)OZDI19Oqf%MBeE3M*uFkvAW^Vx)B7(qf0}ha%+LkS2(y2ZDB} zT;gRUj%t(>8Ks<}=z6+bUS7=Rv$hcbvPNmFilW;Pi?wZ?mI4dwoo_pkDGFf`ov!a_ z^ecyTTwJYHyFW)m{{dZBHt+T-VOeEIMfX9yR({8VAS&g5mu+Mp)HGuWXDBVS^d%^jGCZm=wsmpjF!ts0ayh$M zT(@HEG8i8##;);vD{oSg1y#>Z?YPBiS{e_GtGM7j&qM!6bLeaE4LslurC!eHa2OmJ z>^p|?v~}K%=U{gXsvyR}C+VRX`XnFZacA$C22R8fh?9;{L@^4l6tnCMf7@=N)?Bhj z&28n=V)*;5{+XxUa4Vad2)d_`rs1(BHvl}S-#&{w;bf}`84Y)!KGaS)?S_+HAF23M zwPBi}U6W`s*%P|~It8_oFctV#I&qMn!Mf~`JhZ@W^F)ONPuWiTev z7?3m-K2NX6i;~2faPNZ|%%Yu~S>NG*0dQ^cWq}2^k}4+99=%%wTPe2#o{BUh9t6We z*WMPzot1sXF#u_4DHZ4yKV$KTS(P9=ZgCO+SM)&hGC;F$TsJ~-T-2EWG=^5-eV6u5 z0>jU&kJRVghfG8f?mI@OyaW(^nY@=3INDO9BGH%8ahzte=mo6KQ4}Xu6yB2wrJpF6 z;m)MAQ4EXe+Hl)&ejz)}F!RGGrI)lY&%sDAPDe%kBl6?JvvUt4AhSfqV$*r#?(-hl z^L7#FGcCKJr6c52Za+j??jMgH#GBl9Cb!))OAKdHG?^4lCPkA{x^rjLq-ZiJnxw|j zD@D_w5nb&VlLXRc8N(%12?uU1O7#i3KA4@TMZ-jl30+3>%oQUG1<`24dJa1d%*bR` zQ}syc3uz^Z2zhNvk}7e-s7lIXZ&R3T-~yg%7Pyzu?Spi^!cn2d^n~VWGT@eN2Z|k$ z!W5}eAyu^;(=|(U-Q*m!F6Q&uVtI4b>Y!Ej8S$a~j8(P3`@|Xmc;*02cG7XffW5G5i)r*n!BU5?531d*S z-6FrBkfORkMj;<2RoQ_`4gWMI!qr9D9IUJ$wBo(9p-q#L;NvL(nXcu;3tZ1ZadAya z%8P7Xa-%LS?kQPJ+y?r}MKRPtolS1-n7j;M)NX*@B83 zrqq>JlPl6F6?kzRJP%n-_e`rymXa@CZcUk%HK%@d>;MvXkYscPZ6kbKqbT2Ah-j7% z%I+U1Sn*h`IW{x6o3WPJ6y=IKe7!~`&PIUjh2@j9mtiea?~-w$k)s?N@z#Z)s>upR z)`sSwEI?rTNFMz54wfwvG#Kn<<88MPvUHyurx9j|&tpUibq8GR;BSdi9$b~Xm0`Q( zxgHWK)bss7{V_<W#S^zTZs!ZZUfAU)_mpzNPOAO3h1VY&#za#EK4mRT)mvSzW=pU-P1bJOMZJ z`So%!y(wRjseuR2?W+@rV(D}-7P>cmz{|l>r}LF8ND3+d;48+N)${z*5@fdhbr@kJ z&F+*m8Q>n@re2B!vUHjS)zU&0mnQ0=2?h?n8&~%l68Rub7kO#GR2(;3h@w4eU%J6e!F zAd5_od@OXV>lFYMwz`~77Z+ET^NYHKD&NhzGRkEK1=G)daW8aeU;?)CNwSH;{d!YX zI_9U-i?zcbJ?F5))ROWE)#(_99kSXDw|@go8RK!Bm7OvLYOeA~d5uzGCKQ!9$aE5Z zeXQv$N|#fb^tgU+^BB|oS9m^iO3SRm2KAif0t@aOvGq?s@5AJ`pWc7>{_SV$pREr+ z{rJ5F5SzUAS0D*6Hht^V!c^y~m&1h_<60LyEisVAS7RIR0^n+{YoXY&cL?;eVB&$- z$=!h3cA#D2t{S1A_g-{R{^`u$3|fT%eWlEw3WJcS2QW3IiAGDHJqb&3X~dvy6x8F6zBGYg7u{^BLZQol1FK zzm=&(ag+TQR1P_<>yDWtEFpPKt7f*$QdIJrjcU$6?~wBb3Ix3Q1&&D&wKfZdg`N1PR(`!0oR`ih{WuaKIUCP+Q%xYV$1pGV*s^y!-*brmkR%(Smtz=v;6JEMU8+Yd+SfJQ=tiHE zZnUSDyO1)bn;%g>cZ3>?*r;40O4tZ)AGo9T4^_SAa&SI6JhhAZsa;4{O2(r$?x6&H%9RYpAhxQf zLoMbf&5u}YUFs8CM74ZgqtBL>9U??_V)Tr}N6z746px?3%d+=pZ649V3d`F_DI;VP zIaUjZKvLyaF6ad%3kZK8Zvp9@<2g^vaV;P-MHY~9JA+t2(iIf4fOx^kEg*9x77#uu znk*nfL<;WyFFsKnG!&ttTjI)n)C#2Uw9>QKcb zM`7wX0-H3ZjsaNbGdFe2m6$r}`H%`zM}5n~nL32#rxTa%W$F-`@W;*dM`7wv!1ax( z<5`f zOWvYn6S}GSgM5;=ee_O@oRTq!iGYq$#6Iwc&!7Kj(f4IG7Cf%(ssR3sR?hr#c6svp z&p&;53xEBk8Iti*Nb&x5>m~Gbko3#Y6)njTqXAmwu7j7lY1zPz4Z&oAd! zH@w!-p+w7-jLdoZ#*}DzjY?VH$ezMa*}fW0_3&L-&QC`ug~z%{wR45Kfb|!&H5!V? z;B6nLxnUsp6jbzv!khRo1+fPafPy0O9j)J!o5s(%sy=j7D^{^g93=_tqa(njrbBL$ z#b`>P*2Y@ch&!3@#Z5t&;}w{`vgVEfW#qjgo+e+jKvgC1pX|KA^NAk%Sagv zLF{}P{E#|`vNEkHe+K>=(_*c5n)dtXNaFC|Qc^G0D8bDK}uEGnlwgkXQ^Jav%YJOM?gz zBAP)2BVh;tK}INIOoA6_fp}uP!R(J$=3!?})Q0mz2%R@NL)4QFKO~0^E}AE=;p0my zPdh1N0(Ie8ab~bEt-U*Rm}ZjK*TsK$$-^ltI>aOmX#lu<>_px!0d|K!kO#z?MV{~i zMbH#v5~i&mAtidlGHUVv!YwBQRJEbqa0ad>O|7#*&X++l8ncc#`D!w}(y|2uq+^C| zxT{({vzI5`xJ4$C%y0uqXt?If)R4a;3<}CkfweVF8GXQ6Lh6T zWAl8%gw-m4735S3>^pBwN`Ftbp_|hK7aq&2gnQ>#suDJgcDOk1HbpV@_oUX|?6*{H zoE5sf2hUGvUzyu~2iH`wp~=~pr&rU(^~Ln6)&0M0j2^3vnN=|@T4wQ&i4TDX38q%I zLsZPWD7^DrydoeGsJ$Rve)t-{iDx}4ZOZGTl5H>+D|8SBB`dUDGgPpt^WmOaxCy3H zkG9Eq!dIU zg^`Ch4UsMxt4bfqGpycmNJWB%VO!aFMVx_h@6*d2vmTuu(ObBE3{sc5tE>6-Y<7Kp zy=c44m2Z7xz07U!4E=%!Vf#f`&wZjWr>Ap>*CBh?e;Cc3uw6oi{X^|?kqwJ(Dm}N3u(F%-L=t6{fzfIbEzPHVTW&Q37m$M zqw)vR%v6M&7G|0wW)MD_jPvwp@)~ioVtR!D`YRxGud&@%SHp*zOM%DO9POR3k z3E!NC3#ly6#PG2=ZD-L0prctV+|VRXIuF^ibY z;6>`M!hf43uldZs2lY(g{k*5@87Noa`?6A>wO(N(@=S^7+YYwpY&_phbw>X`dvCTQ zxsfG^zTdAP5}1M#6CUA9>;>gTDpRVCE^Uyqs~RX21UktGr;<*(xJ0DaQ~$;VW}fFi z=2QAhuAO6M-03tUjdXgZq0yxbI%#%}EoWaSYMnqOD>S@_l1_yruce(A-I}vl|~(5SvcqUpw%7N z${36@#Z=r!nih@S2DbaS$1|HYO)&epKz||N%mALWej3JGxxVEkkXeKsgNQ)72I87a zFNz$(q{#{&vqWvnQc89Yx?Ww*@8&m`ttDzp{@D|9yJklT9IrB`X;R)*;Tv(9PSgq1 zrER%cgGgZ7m8V^KUz{K8vv6;mu7_Zh+TU*n%bFE0Pk*FiV{k9i1x<^V zuJFlk(Jt_zUX8&Nu^@@~@9RBN0gkJD9#|R4?kKC9tHtHz-Cb*!wUUl{LaJwV7s(bA z%_)N24t%F{1|}Zc+lUE06+Et29w%XSv{1;u7Mr??{e|QDGl3f`*4f0CDJy1JM+ z6518mQEq6tV1sB{bk7DC*XT4{)2f%$dPts=3E)41wApfMw7l6_-n>yzr6OPQr&FOH z5g=OR%<;N5&!!3&eoKtg+VBNr$f{Aqx$N~5AMjsW@}(?-Z>>*g(y@gGMZ z*8S@AoO;Yg4`My36un~*Z1n|({J{UwfpEd$YYbJVnr`^)je<0kC`dx`uH|?hGdFQ+ zUj9LzwD(R&sRM2lI$y!Pjp!3?fk-Lj)xD&8 zz$drGri8TU)%@@O`u`#Wbv$GMnAnp4olIz2Fz6B=k2P0-2fx7IZ*3dgNx%hD{$l2Ge&Anr z?)!7&AvSC`+Ii-l;^H}v@oXDJP#p)_-$q=Y!zFQPWl1_WE1we?+aPq(*U75+rR_kw z37h2zJ}S`@sd@7k#hV*~Qu@_V6+LSp(3)AWv;;pd-}S+`d3hqHj@7$D({qLLcNe_A z@N}LV1?fD|&h=-^am^)>?2)_-(mScA2+%0fM-Ja^;ZkTbbp2ftqsR>da(}_O@oVlc zyu(l{7Q_hGw?d?0z==ZDrCrhMk;costv>7(iF4HY-iH=PPFTHOF7K8^ z2wk)Zt7WNns=_Mna?#CO8(i(kYc-GG|Q zNOcJO2+Y*vZz>tXt$Q|I4<$wnMq{Se%(NnTecWh99#k)p0=`tDn7Nq1+y+v0G|5J0UI`san4$`H;R}JMn zwgjspq`chPt9w^35pdch*>M|sb?)Wm`c1vOXcOoB&73mJn!K zI>3%-)1{Pd@4%DHDE^1H-_RsyKTo?O8rBK()4-jzvoW9DAmlPrI)&}*9GHP94cwI% z^FSX$zt%zGqi@cnH;KCDkLh%4TTZ#=%&XOWakIROHg`D}f-T=gi{u=!Us3GK&`*k8G5Io$C2um>EWod>J{hLh!?vxbkQJIngdGDp}csTY&0| zzKEX+_*TJ@FclpLe(!w(5Iqr7u|0*3ML>+ci0cE758a(AcO7f6BVO#n7UB6M->Nlw zDbzsPnBfo_2>j0|{$||cL9+_F+mQsM5NYd84ejY*NviVyE|#P+!#K7Qq9D-#w#@Zy z=Tlw@!3Xk6NbkggJTPM^Arw~;Gg3{F?35Ly8V2ub!FW<}5%Z|quKj7ohWri3AxM8< zQ_yi;I&V4&WtUJaAe}AONtuDgfJL%RL-_M-IiMVX{Bs?cAraBO<=rh9-~lQ-Y0nD? zuU|J+3rE1tjlWTPVFy{z8sQX>OMxZC!6l3psL06s>RV4_NS0>-v5c;TsTwqjv9nJ& zOgu)xh`f;7FHnQ(25s=>t`>Kfm$x^IHa+Nus6kiro2$#Zx@|vVhz+~{3#FP6Asg@b zQNWZEx~!77z;=-t+NxPs>2mXFsN?RsKH#gyai^$;1u`Evdik@A;!Jux&I}+1p!s98 zE%HBCkV_n-D0QbDHd**OimN z#-&X)gpK>Ofkhs8W!^r%J35%^%Qh%n!glKpXQ(r7)jvvWe~ht~-E# zA#GK3q2>Ycm~xO-oBE;4F{$;EC@6mbTNcH^F7G6PzvX=-y$c`YKpD$Lf|#~>NV1X# zxx9+9t+mO8a@6dv78K<|r*0RkyW88F>$WbVl^Cn3hE6rKdda026*gIHgC|wFpy|9e zp>mq3J{@a%D>l0wxM$kxrmb$;>ZYx3+UlmQZrbX09IKm5M71`?X=9u=#%W{R=^Nt? zC?&c~Q+Kgm;@w4nu0qr_kJO4E&529;XTJ zw7w`55>4Zr9s_E@gM!;o7rXxc^)sWbYbNS}*hdlA@T`hzIF$&2<9P5u| z+GW7BZH!blp@tnjIG8Q4Ci|8-G(^dog3jG(8WzvO%76y4yJpp)O(5}q`XdSAKgUEM zFk*K{|1!QZp{E5o3R@?Nh(gDD9qo3G8Rin_cY*6;GjrQ{b_o^VnF%Cv2G99~cSeU^ z6Mm3D>pjdiA!9;*2tY&ljrozfcVMv#ONjX*k-K%V{|2grEo>n<2v1K=7(p*OvOZW)<7MMo8$zabJI9X;;L>CEL|%gIU39Mi&KOc;4qH)45}k|W zRVpQ=vIDt=AaBstMldE}{dN+f{DjSL%_s2h(l6)}dKd|5j{?iZ56Z=Ujw*e$u8oug za=W;?SbOYi!Cd7t`AJepQcI^B zq1Q27I)+QfaP@=wL}R!nD@e&=vT<$O8J^tGX}FhD&4EAJSfbO7WC?a4FAokmorW*E znlKg}grkFSbP$e0$aN6T7$%BF<>Si4PuBHnC zDPXv00I{pqPxW#qf@mGMs4+=M6F?CF zr3oMd?}W)8VDM$pzG+ysJ`=K6K0Zo`9$UnzlDx}dNFFn?s2eb^k6hH*jA%e@ld2?5 zX+_pWn$i}LP%~z>(x*$mDGsMi!KFP~(=m5ylf*RHQjn~@0T~kxKVjB%Jq&AtmlY02 zjl=53OTD1#hD=TGY8Md=wCaYW9wl|-p?6c=aLiSwaHF}mUfqz)L8NdEiyqdC`k;n0 zqc&I|_n5o0^N%XN;@pp!`!)A4b!_IIWuCX(!@N%`_c(PH<(}2d&5w3Bxlx2@Ny~VZ zZBR4p;o~AbT-$+`9`Nv$lV8OH1VMVRgVaiTv^H`oJzyKjm*3nLwj@2^LB82(0Z&^8 zs@h(^03Aq&#vL;>P6wIkAhRzm$ZU$CTDsALj^OGT!PUcbSI~2g9?bQb*zCS^4|+L~ zrcSu;Vs3J`1-DNc%2xzYKtC4&P+t3RdvzU{fc60xoVM;Et9nc$8uT+Ed*$P!l<2WV zoNDvC_b-WPXuIz=HoGcJM(Pvn8k zJsgj_3Y^0)!NS)=Uz&`jsz_#FRIQ7|DMr-9#yoJrpuA!~YI1DZKtYqBPw>AHQukRD zB%zfSf2jTp6rnHmM5yN6^WH7yrw# zOQ|HpS91k5rr91v$$INXQLbQMToy=KGh9g_^doX>CAgCr!UdlSdI`-_X0mzVRG)p-y;U3~cE0$#fK z<=c03w`cI@{BE(hARHHmCJi(z_E!0#@i3YVAM_#JcsiO9X7U4h9{GfxVb5rE(8w4yNB5O8s#Zadf^ny7SC z>8nu9dq#+eXV0FT0wPU|96L^Q5nI1)f~|AD+wA_|m#5#%H9`CNYr4rbo{tB( zRlbAE22-(Dp54fW7{C0hf1}Uf&HPv2!&h&9di(3cuXq)V^e%jdClD$6PdLBvcDM6f zi(R3w@)zf|@!{Q{%v})uIbw@uzA;{$wE=VD5J=N1_iz^m&#ui)MvkEZj&UVyajvP{ zBf+jdzj-5289o(InnnLAT%}QGjC72M2%nN7)I>gepfnQsFU-f0=^fHo9z1elkm{l_ z5#n=lq*}CWDMwgkE@W4uVuv$w+y*t^ruCL3OjdHl&4iX*XdN>Nk&c|58DbX$s-BfB5BLFddf;&&sSfU4PfNyacp6Ts&vHi}#4tvGw161=xXB+*^+45h|GY z5EN5-BCqxKDaBp|XJCc5jID^Rm)0M^BaECJKIhtkU(_XtY-1-Dc^Rxbhd}yp{pt-u zK<)~Wrp;8AF8F>&m1@M6MzO&VC(V&YLT;kiwT7g}4O6~)a|zU7;E)BSd(qW|=m-9f z&J)4=*#WiSsaUu~DXFbaHDS|Yzc@&`XB!iAX`)gV>1*+^Jdy1a3)ukJD3rE@w;Z`m zzn&DeEv`uWIeTwApm6{8+vV-;oP4*qU0h#ZUoNgM$tHA_(j-~dh40DMuJo7v6| z%yd4HWm*p6LDo650^Wrqr^jej$1EaM6O9>A&R}QlGH9JP2cOp-Oec zCe{Nlq7fT=O22Fz;1w~^{XF>Lg`8v0jACOO*zk>gMmUfggw)#s)Fp|i?}NtC(Jqil z2=p)WfsIZz4`4q8spQKwIDzC7rDRe3whl}d53G2f0-qm-Oi|(!OqcF0`bEIeopC&K zpAtU!Lz?o5fYCzv7!ae7KEzQZtk?@o+rZb4K%x#nIRuR|lQ@`Blm{nMxw%qGHHE0% z)`jm(s*CA$jTV^|KaNMCc0tRZ;p@LSS!UIg$KI^PEN zC>-GMs>q4f>0m67edNfquGx;ABgZ-|-oZe!(fLS6473h062s}TKU%F&%c2yxA%per zjujUfQvR7d`|0h9EP*rzvngOK$66fn4;#{5=@@BRwOe8-^aN6NgK4pi{D$)rUd{D* zp=AQgqDk&(Bv)WJG=Wu1U=<|e1q8}kB3pVcPiT8PA8SAxh1ixcS4MD&`0YO80_5p! zi4dO_1r}Q?O@%vC;fC;nfi_ALXte}dfzNVRaar!Vdn`o&I!u&zV>>K&UHz3iL3gEP zdRF3@oS>SrGm;GhF4!D{Nhal{QUmxKW^t!Hc*XymqiGc>JLOKTPQH&Hypc4?fZW>4fvYHzP*0h}=?Y7Scwf{KT>Ay>4kgv|S6 zvpyI+Vo)g-gyi1Wz=u7&KW)8x*M`n-QM{aAE*H0ptNChmd2@ZsPAj++T%XJUujF4` z-d$f_Ew67bYno7flXxEVb)&=t=FCkxb7N=Azab}dh8TSPYQf$-z&%!rG~({?+N31y z)f;k#p_N~Laqg9p4K@L57}Ahhn_qu^TGGX+U7i5|bX<1YRpu@6g0h}>p(HypN$~}BIsfv2l zb?9scZe5f~nSe#0)%J*S>=CVdq0JF$SwO$=5lYUm7&^3+v}R=c2)Y+<>VJ@D2z`P` z8iDJ_7n;}i{rhi!`~Km_zb;lSjo5RizG0!-c*)DgA-5o;*MQI`{EBudA;VadNO2hw ze@tx@9&31y9Z~SAg?nlq!NCyD^D?fbMJ{4`6dQ`v!bzD@ZZ4NMcbALH%SD?hrEGJV zsww5s^rDi+$PbPm#L5rPR8+(`Od7C00>;9+;Cl*24v)M(NM$k#95m|93n{&i#i+8E z)CE@EaGgy~+c;T!+P!&539NQPA{ShrFYnIl#V>}8WG8Gk5t#Hw!z!DMW3*UIK%$g7 zVO<5w8Z-6iR_bF5k^Lgf_|-5yB4wC4>5)H?7aRLTmQ}$S*p5)fR>Y3LUpAtB1fm3Q zQAfUnf?SZbM;o;xo9dW9(hvxuOm=I*Sl0iwnBUwki9~u>XsbwfQx)3QiER@WUvhYS z!=9!m;LLErY~qr?;Q;(4be@9HC6lB_gp6yLwryNpu8h57Lh-`@cPo3h=8POsZhLb4 zrywcf{qH9EuM-iV@y8tc-)?tKNY0-Vn$fxOAg~xHLS!Xl;6psYj!7gzhYojcybJs& z*+Q+zt+~(4RYu@@dtAP4K)8udKgRxDe$)o&NXd zVBLs6*5h(E{>uP+pFRY*6wv^_awq~{M$acb%Y>*2K+je02$_tn_{b&&6ir&|Md9v{ z-4$bQIwv`R_9}UGj04BNal;T#B4ajYJf9D6%z`_p_j7b}bS}g;D5G8SPN8aV^P$pU zXPLESpPBtq4Vnjv-NRY?p9J1_a&G066mRBV-{pu~xBItM93Y-yHKf@;;+;|>2N!Of z+EeC_lTA;%QB^VueC#`iMzy$&KXUil9Dh0@ack|rybt<)y5h(1xt&V5aC*b^{X75O z_`LLapnbfdcg*k~`weYQ$dmYki5I^?CPdY6z!;5gyh$MKfNs`ci!O3>q#Y+ot4#(R zcaGxkeg)O&Jr zR+{iea|Wp_-G|EjG5Yu1QJYE~cZSMmhl<;_%RcJ~ab9Zf=7$7SADEz6M!UqyxdoVFD@OBMi`dTrADtP^ zl}XNr!qeg+>W_S7|HiN(aPuRGZA#_1G7Ms(IPmXTi}c^o-$oOuKqxo%h2632j3k%I zw3*jJkb79N*ffqW)Ks+fKP~X}7ck>VotvDmEGY*RiKyeABIqEQ`&6J1KSu=NkOurZH~c~2a&qy!JJOWaV_y9V>W+(6%}6u)7<(IwEUIJrVDJnP zOL*nfZwwVPYl_xe^|lX}O>_nqk6xa7Km~cuCsRQ*3gyF1wV?KbAm=6xrzKwgskjPr zVwt4QaMI<{Dum`9=R^253VbPkcQMTaKbFzI0t%ZBAb~YTC4pTjDZg7_tDZ`C5-Xpx z+|VbrRHB5dkx3s-&sx*#^=l7KwE8eSUT!8^Hl3N=zNt0VeY`+nX028RpyGE^3Qgg# zG+yMm;AJ7sp1ooz_s4x{r!ufZ;y9GSPsyHT<;n!=N~FT|S*pU7)x{z0&PH9Px&!|> zBSeVX8ga}KQ^*f?qlnkZ{*Z*CCT*+|8WA}9Oz9!xl-f+kFK<-CAlW$esX~VKw&k0`|+({s?{l7QhzN6i7Dt%1sbMd9HN6T*FJd1=mL7 zX08WVS91s*Z^wPRPRgiL*00{xml;kdlReiQz9g?WBM2h=da3|wPougZ+Mn83qJo+E zfFS3z!0#*Fd~l(>QGCpdh~!Zq7D0NSC#Za2>(s}?8Qd|b02=Za_@S8G%h-rc7?Zpm zUQRl~FNv<}PtB#LO|S3|=SZ)EBH3QoHZy-YO@;D*26N5;8`7bW;ZMMU<(d$40;S5@^ViF^VGCA7txk z+%{izyISp*kRm&9y(#5r?sZHU{h?qpPWU_b@lPOF*W|uS$#nzCl%a5E!|~XI<+}|& z(AAqWuddclduOVyHubmGwz|FSf4WF_x6fg?Odtfwgr)Z`85%7exGpwv8G!Sfjl7!w zgR=?uo)OMCWh$ZPVjJWiojbtFdb6|oGjma0G7>~fIC(QOxlr5X!V@nnr~-gr2X!~U z9(HzOU3Zx7BkH2w*_f(}&|&OiOfk(YX(k-vNJ^OIqHCrYAFMVrqT@kRM@|u5^;;=| zGp0PCMG6(tFWJYAtBq5=JeqJi+O)O(Q-2hT*kXDtcK;{wJy|_9Ax%x*BdQqBneXQTW49C9$893A@D zXnE!wW#$kTuX3}=RR-TAs@s90S3AY^rcra5R=r1?CB9DrV)K^4X`3q2m?~8k>$vis zv-@CluxOu~j%~1CzaU-w2AU(N1Av#B_CiLD~4moAFhVPWJMQDwyIYUvdd>vsj8I)!jXu=(Uv&&dYjqAzSIFeGQci-++j8CA{fe zSSgt1U)`$m?D3%GDH)42M(8Np($Lz~y@EU=cWVNXC?oTUr4~8R=^Q%vpK1(rBNU<4&)>x~i_u zj%rzB@>Ub>n#B607SaK1o~ka7z}bLn(sDmn3+151?)vvO_6fwaP4a2owxbLNX`X{MQz~i%YN6bDFPa!@^>f9lC|lVO zF>+VF9>))`Cld&3DoI@(J5RFg>Q+Uor0#os3v@oOD7${Dv3oY1BgRjMN`cwr6-IU9 zoS87Vz%Tm&n^wDKat7LxQ{oU^DtnqPUkRPY$imK_+5S*4LFE3a< z7hN6|mlI)6PLiN+<%^}NhCz{8$1gv17XEvSGEo3zlkGbnaW!^gpuiA&FnxUUhHV{f zLgR|Soh){K1tzf;^q~$OG`Wvt)u2UEx@;p*c=$Qy{i=AS%gV@+Z&eh?r`+c02%OON zH&)PvVnoom0bZtT&kPDhxS!`|vQ-FFbZXia%AckIK}55m-j$~l;w#^cep`pP-%wfw zbu6E!ptd&)dFoMKOKGK8WwFEEIXTcocwwKktsAR3sJIFgm{;!+^m z&1eVCLvP^>PBZFjTh~y;=_Z>W=@oOMe5AfHTB-1Lco#bgQv*NMh5cdm&ZqKB^1$7U zW)@&LMKQ?8o;keH1I$vZFe(Cu$Y=5@Xa-)zM7mc|DXg}jaY+=qH#xo}B+xdcC`$l$ z^n#9nlLczGHV#Oe^^7{1mkkqj6J1ugYe9iDh1#kzNDqgh zRYF+-l$FLx5GO7GkAXd6aaM`IEH;3tiP|5KYDV}=eCESTEln;o6!;ygXc+W-<+@5y z!Nlbv`c(kiqGnRH=sUmB%Px$B``AYk1rryrl31WugHZ4+(E_uei~8NEU?e5l%dx|_ zeNH1x%;Kvi3SSdqc|l^~EMk4ObU}+(H&fNolB-$W9?MFmE8oStOH4L3Lf0~ls49C@37F%Z*TN%U2d@$$28;|+#I9Tu|K5fInw2^egEB`mt&J^uCo=pwJu=qH>&RcHd^O;iN`j+0iAi0?)$UhL<5V@aqby=9Fc*~aIi29s|C}Q-uy|60p{Hv zL!ZmuW*jVcW))d&%aLc9s;G1h@B z{c}w(qO?CJuz%-@(=X#oqIu2zIuGGf?kfW!5L}@4MnwyQIZUHp6>sQe2jG;ha49Yq zp1)vL%A$h%H>s?TeMJK4%9r?)=!BH$N!5 zVvD};AkC(Zyl#gd*wJSH006U1_|F>o$^7mGLgz07zWMcY=|NHbORDVLRW~truWF*X zxEr}s;h1l!wDR7?JAQFS7la4U)L)P-3!a_;Z|thsG_M^nz5>#a9`N+}8)Q2en}n4K z(*eLNQ0Xn#x@#T~Cp(c%Rs_po;GR#Qp6tPd+2xA8l;WiXX9&O1lLDC=t)<%0%PUb6 z1xu>9%`KGK9Hf?+jQbQeDBao6#Eo?$ak0k3@n73BR{iNZyNyipRAZQ`mY*ATd+HoV^-#wZR5r3t`eanH%3f49OPi%A#Bj=E8` zeRQweyN=39(l~sY7oZ%Q)}~lNDE|@Bb5o5G)dJe%>^J=J&3a0&V!PT{+66U@r=f;u zz+q4>8XPK$0bO_Mw4Q~{6>@G{Kb@F2CHDEgNW0z9{l(jwij>~~VlP(fT1(-LkiWNO z4rB#-yu9tcx*d6Ew?)lI;7>=qAJ=2nxMQzJ?q&wt@OzBojM!fcmZ!+6ba@m2UI5-- zVd#I}cNoVi$B00FG%YXK6HwI-AQfEKS+$c zURor=6!8Nw7#CZPe~6|L0(6hHW_GG-Rxx6R$rml@(&tZodARiZkvV#2p3UmmJaBK8 zHxDlYF41);Lj9uB!BX_n97;2S9&MO|Nyv@e+Zq=a>>{#PD_aeb;wp*<1kD-`O?1Hy zhoY)G*G_2OV4ob#nMilY0cfl2%_>}@*nO+HZ)5{RKJHudfM<3Oss9@&DW|)H&kR^dE3_^ilLaG4xUO&^Wr-T`cOFs6%&QarDvE;rlT2 zbl<2Wc(cp#3Q-LleI6QD8SA*jN^u$IP729hQ3ntjZm3G^lKg1n*@~n`>l%)yVIA?R zEnrpH8jHU#I%3?nU?D+8{R6%%KHx9}X6^h2q948g%sqQ}^euxDlLgNqw1)d1%UmIA zq%CxXE|Ij-<~oPcYNT;Yl5|-ixX$urTN^3U(Hc z0+z}V4oMW1Wg;OFaHXP`VVM)Pg1yO+F(L5)AYuoffC$Je+jTho!pm9XLlKa^!`$Xb z)gvnTINJmZHvftS=s_38LpuyaKuN?)nt}roKsR_noTrZcPTto9PLcGm;0q^2c)qLs z#)3jPODo-Vpsjab`%-Ga0(F)Oaia7UhQ82}@yBFD(r}<4G)f$UwHUYCO zF?@xrl>-{j{1=^R80dS4-^S?pL!b^A&MM5$B;4E6+0m0rug-28L5DiyF9fr#gM9LE zWhAKc7N3V@5E-(9w0OK92N~S-9IOkv$%pu(L*N(mc%EG7=*MdTNikgqezIz1gmlsV zi&cv9$>O;j&Qb}XW)d#>yst&RJY3v-n1Oa}7FwiXzC}EkI^9tC8#hoWpAPHpeJj1u zlUofw=;o_r@2;f9&VRkIywz~s>SkowLQqFU;-KTZ9(Gjfc*`nS)q0!MdUN;cZq?e^ zr`BvZWbo!8tPU@R4wcz}uo(|J=i^~%w9RAj7}C)MjJ%0mEAP!<0^+3dD_4#jMqL~h zvxM=%!qpUWnA6^FB0XSnlj2R|xg9P*UAVOhRK7nov>aY$WnCU$e_5>$lu^Tc2fwj! z+n3E&gdog!ceZXR#Uj8>)^NHWes%I)={#O4@2##r?h6fD7}iF8WEv!PYeCG|b!Q4z za6UJDPrA2F4oBWywgxmnN%IrRZ6E2^Mzlgh;Avj$Xk4l-F-?m<)bl#>Pq zk_PS@&HhM?nIF5kUm3Dn8kDCu!6?zf<7hkU>rT`Ea-&qO0X#Jw-e8UZ-QeWePO7QD z^r8G`kb4a|S;{Q3#aB)A6F9 za2X>yQx;!4MQ?}Z#9h7Wa&txJ3W=YekPSAhrZ@0SqPhd}P29^6n%WQwucGd4KZq{rLA@iWRA5xT<_SAe#fU zxLy0YB^L_sehyup467b@wU0eG^XRp^k0T6fw#$~{j#Z05#)n8FRV%k&()kRpWJMi(ji&V*Ye@n}d?XN(Fm)Ddcdx$Ir= zDdvU-hAw4<*U;lFhZ4+R0xF28pam)jHYQ<2aIj7WGB7^GuFN=NQya~}p~wx;NXJ7T zFm0~pp|@(e>bl{Y z9lqgvF4{d~nxy3e{m7IZRIq%yFP3DQwOTaG#~kZQb_I1Jtn$nQ0rEm6+32#OixIVp z5fZ8DV1$nc%P+oFy?4+0AL@10bLU)nmPE5p-W4;6@Ka4S4nf-RB{WhDNs=@!4{eDx zrLOe3mei_JXX*mD3A6688{0+xcZ!qq9b3&o#H%sXy_C?>uGr|91k& zecmqr*YSSP{bJni0zdOs`I*FtlhCS>16^Megxv-W#6G_dx@xBTxx2&cs+ow0+^V#H zSQx>>qT;!QKa;!Q(<#2~hyGy|{<;p1K=h&4G`W#(qo239NL(4gmVW)J|0h6j80*q@ zk|gddTP>^s$h#$)4H_HPzc>3OVn}?^5m-N0Z?j;yE1#=G@4xhgU%5WdS8G?!UtB=l zoz|2tn^0B|@OmP7=bQSwygUfuZXgtUS3GNn-VgNtFMFHyMi}=a&q>V0`G};$z==7b zV+KL<%LGl@_4){3M||&s6x9dO$JZhLJa54;A8SDuXL|Y>S!J$_HBpwjGM7eL=!>0e z4mx683Z0hvQb@5A+{3W5(;w*m!g|2U@!l=~TZd-`=T^;Kif>gLafRO$#5laP-PZfM z(6_>nw@j!H%`$bSAG7kM_J;f${e{2jI7t&48ysE(SjXO9ntJW(2`6g+XO1M^op3_) zx1`3b%u&W1JkDJrpA>GbIUt&SBu?Q1_+4t5Y+K|J8eod`Rmz$kp>SaCT}3QWepcMv zjTJ|;=f@hVN?BzDjrdwtv~|{=x|5e1Yqg+{^m+{VNnNieRbg?)+X&jDZb`O)rHl03 zjVei&SY$n*E}2(4cUQr2!T(N0pD*eb5<4OCuM@p!(~Ti7SgYp9%DM=m2YEw_%*Zo} zX9kKIp-dbB8pJe*k<`|E%CJ=+*0HH)@|LS=goKF9If)q$E>Y&n|9Q@l@RM>H)((H8|79 zLdU$<3&{QB0|g$NW@F%|(}2NtK@yU>%+1i)B#K_pXgug+kfPFoM@A7NY>vR#1_VZK zE+7w@_&6Qm^j)6cz=HGU^Pp2ATLW`Ej&Ss`^eMYC>kK2-`&J+AfZ289>6BCk0e!b= zDV_>muF^Yz1y}faIc=UZs)NWOp8SA5oIodCT-B@fystJCY;}GGP34ljM`1GX*hfvmaImVgy`qx>F4ZM zGS?Z`I{*{h{T4qGDrYu{jZ|04iRl&O)`@eJY{^*Ng|R|kl5vgv8c2LUX;MF6>d#xMuEXp@nb$W&w7X91$68 zoDu{55pRr-p)^A!E^do={ft=+{GL<-C0z~tb>RbqY%Ox8jX$-o9v@~Vqom4&cAzYO ze*8Y#gxT31nt;4YLzqiOprv`z@+LIkuA(&1v<|O@6AfH20fCL4C|Bu}KJC0!(bIY3H%e||PmqHoExEmY78j;TWmWm?ni(Iy{N zgG|&w6_lhdTV|WCY-G(Qof&-Ly7KgmI3Uts@iu>!PPj3_)u=BeRP&p#Y!P8;;pP}s zEOhOB;R_B#_kxN^;3ifgrU&yWw$dg{>UMP4p!&{Zely$RPntpylDi$Gir>=_(nqhX zFC0=-d#sazx#G|I6%PsG5hzuuH_xB39;zV}9Uu{_V#%U`dI?|?1xjR}l)^>bC8Ww@ek= z8)=|Rb3|{TM}D?IHn4C<`-b&X7IMigkRXGDRD~S>cWCMU&0)}yJ)hwFY4kQBN~l+- z=IjK47S&ohe@qcj!S!m`Yc};V9xYZMw``N{-BWc&YmOZ^|79{L-J)N=Wm2$4ItjZc zrsiYIQ~=lx7W+@cY`tEAnR2SPB(HQ$(TfN3iH~ar4%3=h2_YtfC^X^1+XpWU4mL8} zp%NK341w>kNX$V>k#e{{3mGnq!^|w7<`CnCWa1R66`_GHBB&+!aP7gcR|?-JOtaBT zj=@C!h;)GOndg`6MFQnyBWfb>!vsw)v6$#m+*CVaHxC%n#b6N7=b}TgabJVG zdqspR%*8iV-h8U$O~-9iz?-(=%xO7mdOA?CQNT$VR{8?^B53)W(1Ug^@@jo%a-jK4 zjW9eN6Ca^FK|P);ndK=GV8#51B7ikImo%s`v;Q|vLA(0Gnxj#OEDhIbJQ;B%K1F4TO5I|phHduy0kBOQ4BVE3)vbNG z>7Z(5$rj8H$iR zU)g~jZ$aHDnu6D3R1U-$nbPf1YgvXgctzO4hL>w&uz$T)Vyxd4k(N` zuJ>GsA9Ycy&s-)O9cwXw6cyUw+8~(pq7(4H1fZTjR<4{5BSp{Qw%7?}nn857yKj(Ahj`hwpM4Y4I4^KLRp&oeo z_Yhpasj4<%b)}RQ_(Bp%&ayM$JbIbA?nS3kjog~#)i|tW@JE&%f3{{|(i12+2U~QR z+{XZ6VVNq=KLM|m;Y<*Lcvp@uV06RTg1Y=?0|qHzld$q?#vy`vvS286ef@_I=Q@I< z>n?FzOI^~W{$#h^tn`!0O5*wx$zF;8SQY(eAcSs|twR0Nfhh(&@VP2j3)#HJq}KWQ zaS<(HIzkw*76Q@~lm0(wk0Z&cJX*- z#wfo?<)u(P?lCY}O@3{|YA@7XmTg6&TF?KtVEpBkEVETq54P38)@o2l8PsY9_6fSd z0s$!wEM5?RIp;Lm%=W7yBcfqGWW#F2Z7SH=PTwpU!UBu)mllQ+emveG2{Pm%{s|1$ z{(zvUk6Z?3>sTBjiGn4}ARL-qTny>eFk!0Bh5%ibxd97&1zs9nurJ&aciWqD>%e}* zoU$Fs%vRm~CRWTZq|}8Neh|88hDD{9o}J4Y#sQikBf-bfIHDJ4Q;^0=!AP~DP&i9x zo`j{Hr9>FNa%6X^=(}42yHbHP7n#X44u%^FLYniuSFrGvOPFtN_=$&=B6SuIo1a`x z7NTGsR*_|_OU5Y23RgJOXn;&jftr``KNn#a4Y-kDe1sXRoX`wT^fSgic;4cRI7y!w*RPa+8uH_BtF z#!peDew$uRUIFXFOA5Wvt=qEM2zf;x-@CeSvG4JvBB7@Xt*%q#5t@;3iix|sRFosYv_w~G zTIT^1Y`eOjdLVV>hX~>Z1$myO;+sa|y2Wdjp=WFm<{UpKyb{7fNrV;DrVz->Hk~jO zL#&1|RKsnU zRJ$t|`Y|9hBYJ(hxZQ1+sBg^PAyJ^D07s%>F4*t0l6$R)LlDvC`0l@x zNZ3v056NnQ%EbT+97il+j$O}?I43H(usIx%-{IRa0EIT^0*Lc$6N<*01pRP)f)Xo} z(c=o$Qi;bME8?hWz~Gth<=(V6GxVp=q@~K|d1JF{-~qsYsQy?tC>TnphV=pLmh$0x z9PX!q|2UPZpD6x`YcGzyAC@_UF$CEpRInfKH~)fIMM#Z_A2C0p153^wCNPO27lYqj zl#}X6#Q@N1=~ZfRj+m1ikNLFlQVi6<3vz75)5visi)3%5YpHcv$O)sopHk4w-F5u>vV}|ciFE;4buS_pi zH$2Afm_v$svzagz%QBDJ%j$nI(l5&BmJp2khu?pC3@+#q<+azfiAs+mQjiqzl383qM%{a+Kb5Tt8esKwxekyuPLUJfw>SCU=&vO6RjkWv1H;wVWG_V~3J*yAa@sznX1 zq;uguwzZgl;6GYB$H{F!X>4=^pN<)@{_})%+4Zd0G^@=keOn^pgyG{>@#-QJfo>dp zMX6d6&I?{2JkQ7C+$q8+ED(-wP9FuIsTQW5mdEJeSaaPKdAMf_$B;9(1oUr~*c(}B zH_)2pucQNx(QIX_H4j1_bR&vFFr%22?+Z>KAmX$J?>j(~$pa&X?@F}C48N1GQ{98k z5;W)GNzF4Qjmee=DQx=sK0(XT`L?EZ>EomLWBz;PD&(kixy3NV0s4|`QG}I6H97Lo z_@-lr-4L#wLI2BYgM<8I?$EdIk8p*y*w77+beIVihHt)qsaF?=Cwh*^ajTnx$MxjS z@DO)AuWH3#;_2ZsO~SpgyEOc_imE7OS9+*OPkJElNR<>6@zWI`wvJx$OO(jbhs;q< zHIOSfA{ouq*;Tl?DC>B;Q8tRIN?R*xK`VKsuo}4cA6TXV*QHq@5t3Mt{6wIYOh*|l{*QhCOwgtiE&?nbs5i; z8Bzx>6CoS&jl%+D45iw_P4Jk?CYc05kfDzyVeqD zoxYJKgyKgft-@Oq7Id-zpbMaKlC)cO@=gkG5<4Ab`Gg*TB}tW1XhS$Bq~2_YjEh#9 z+@;d5@77}Hf4fw`<^SoaqZ<`1c8W<}W(qK&ha0~eYEZ2*Udh-x70(knq`NKS4a8o2ZvWPDfN zF{{q6Cj~d5ac10GH=_(4xdYS`SZoaV6Ep|!$W_o)hA0q4#sUR(yH5@$sZw^B^(9I$j%2xmBy35A3WRN z8}1cX0cR}xc2gy_Lq(N)Z;4HfMR`hsh!c*w$p<@IfG< zR&6D2+W&uZTyHliw`6A1TLO(O+n)ZS6MNes0$4NR>KTpUdEL5XHwjojXD9ui-v4W| zgEyT-xX)@5ogy-Zes32_l+6%oUFXUm6oiZ9;FbuV<|U*~sE&x*7B5`%{|abxlNvqP z76sS$l``{P7*=;lQN2p9%Py|UzU<&EgmYqBD{O-{*w#+Td?loL?yL{fS3;M)308x% zjPhqG3>`0{aW_hUkl%Q#kQdj>WXDoB^{j;C(hktL^gzbk@W+Y7MvO6Rsz~Y9HqBYh zq*)p;D{?NY&RnIKviTERr^7~5a>)OE0L0U)nNTYvYUp4wvnf;k5y8pZVzJk2qBUgo zWRd}>C1T2n9TA=E0-y!&Y=;7mpPCGC0r>zy``v}>^g#vhoZ@=FW{0VP$-7^ZY&#>N z&qj5%VxuA0YH`GQxT#efCWD;5BYCUxJ#$iNCi7S)1Ty(J{U_BFZmR6Le4lF<)o-nP zHxSly!xathkV=L#ocNPYuN*Cz;sdhKgKW%1cgTD~Lvrc?wdJsJWJ^7}y@c66gvnZO zmFnpx9AqK(c%C^B`+A>i05+tu=HK7n2^f0S;UCG7NiYm8qWFu=yWiTKn6c04LiyKQl?|)Kz>zZZo z4MKMCT|>&HQC1?}HI5T(3(?8t5IpjC&3y$k|1S2(jtX+y5|*l19VO`w<0sW1ccLkW zTcrgZnu&Z~bKUVNZ`7yHKJKHxgXYivJ6wIubVE^}p&QA`9tym5=zz>*r8GevYBf0V zv@Zn}o2Fpi7s%N9_vxQ+wT+t&lYTn-e}|$Rb{B_LGHWpXkY8F#C z;NbZ9_{-E4FIXNO->)Mejn41=Wt%2!3kHwwWO6e~{g)u_{UhJHn^NKxlap)ih}L-m?*Ez0-ZI)zy_K9b=K_k$b<}TeQf1b?Bh4!1)Df69P#6gPgsLYT)mE@4S5J`(B8lSHMkOTp!K0x*g$`=YoYqRhw zzG*vKIsKO21dG83lf2EOb@&#ZbwNmKE5I!EtQiVuYLsvC!Vw=j6V^PItJBG;%jKl}z`hV@D+ca<-z&jIEoxpzfkPIj8qwR&59S4{X z&65l)d|7tL4Usa&Gw%Olih=ay2#e6~(szLS|5p`zwNB=-PHHk?akzGcez=;xXP4Nd zdq)V=DHeI_PO(&A`b54(a(Hcb%D6;)SoL+#J+e&6f%ZGi4ULd$8-B&iRy@&1x#Fk) zE7m10s7k;Kg~qr%DAT8ZV4m9Bf1mL)5!RGM0pF~u)9>I*;oCNEJpI=fV&^89i*5U? zB+ixTye#g#b80cOj5poe*XnQG8xM?@gLyk`zRK3aoHWPD%m<=<2>uvBBiA05=Q98h z-3uxo+vd1+jUsp7?GWkDa1Wp_iNEK0{4`@ONa7Z78U}ZFbl!@Xk6?(-t8bT_qpvJ< zK;8uq1{#cs-)hbY*QB$99y#3o9L0ddp(GeJp;>Sk$b}4=dw2~vEH{a9;$dSR~L6_ly9vQaBq874wADUag~NCuzuGPVSpG9`{oQ;W#$Cta&( zCd;*+8fYU5uz{2bOgGjB!4PPNiz~zzG;2FW9-O^8bhWp3zfs$C^zQ3}KI@{H1k6FjKy-=PUy^=f*m}|)(M}Hg{ZAM~pX#a&~TV1RSe7OFb-47qjQ;!-< zwB6P<_fFT(_HIl8)VxICa&fXnb6aLc-rczS9>Jq?<%a80|6qdlkq4#ekC}pss4V?j z*PS{cXuiGqswE^LGd4ZnH+)G9hoP9+f-*-&N05&@}OD~6$q;aZUSR0p1?(_5kv9KDD-3(Rq z+OskkNNVe}E)Su<;;|Ciaub9V+1yTckncA-W7p~4IYa(9TpL7;zt9PX-v|CSIS_M+ zXB0_2r;IDL5TeRTC|Fsz``vMn>L-Q+5d$aTWB@(Z!pO`ITqa?OrQR!(spER@y&Jbh z10XiQ_Nak-4uH66?NH0a^2Z6<9j~#LK*E{c=g5ZAmsM&BN0s~Mn7OYAd|a@w!_V%q z&KfO>>GdFApKr*o$$AycnzdJbbr=+AUq_rYznkW&Bc@JK-mqHxHr_Nv49PLfb z+GEQ+WPr3g@_KuDV}W-aq;~GbNAVC*U7$KSdk7mm!zwb$+u z5^ai(+o17Xj$)c(}^5@>u>qp z5fDaZ+0&#*P6AZRjnfx688Li z5#R;%i#9AM`qk5P&scO?7pV;v5_gq59`oWT_y<*#AGBI^w1Un8w%tYId~OXg;&dIL z=^@_M20N>V7Qu>!MlBNY_E_hSMrNx_!O)-PCpHd9cU4RrwB%b#h!m&bSE`vN;FsvWoB@bQZlvKC$W(LxQneDgfyqn@nrmc(npOALes-)w ze)M*?7YwE%XW73+cW$Wx^7D7u;djb=c40ofysqB*7>KJSuf?8r%O|~0{A{)GD?+Eh z$BmXFJLySYZ6f@P7v~t}cnV&YQ*k&7ze$=^r23s0VEr98FC^Zh?dxvs?CtE+CPkxW z+YfYdD`(Sl!V|5cH#7NBQqP5JGFf?9O{_26eWv_D0@m-hIric7apag@sOi8E{6gviF~X6(u6CZG`{P*3ZkER@BwV`=BNDw8Z| zh&ok+F?}fLMDObwtXWzUOa0;BJ2^5 zFK57BDPHl96N!z^1T)1gs)>&IV!@89LNQ?b*?8M zHqbZoeU9@XuYKh^q3@cE8aeU4s^q@l(fOsqAFv;9CJnWSXF;0t%hQqGeSdkdNia1h z1l1*%bM`NSe=u==Q@j^pAB@0maEN@z&!^)=yZoU?VS>=@Wlj00{~Bp|l&J9Wz(+6gs$*^RNHu5<+G{AG+VjU8J`8T3>c%^8v&p4H45L` z)vgtU->r0^p35)Hh$148W=By56m?->{yfu=QYRT={fdk7($UKAxS59r=F4jlLqi`$ zIU`24I^P@V7r>dpE%r@}N+mnz*zz#a@zG54wP?+tf}4pj7Kfm<=*c9J=DIwE@bO|? z1rV+q&(^tzS#Q&+w%fxBl&=ayf{xK+y&_Z(@&$yfWoA#18?S8ki|N9#j7EvlP$%GG zGM6p>iXFE0Cw3oPv?QeX+LK-erXaFGMqaCbL&xq19K|p+gn?&I4;tKV=Ru6Z05={E z2FaBf#;=Myjtk*w#`5#*aX<%kx!3S=9oPx?;NdxBhYIfWUSnJIpk=u2rAoegwp;1y z(}-Ysus3(_)8e{dfqC8jNVtsky+-I^z+{T4W=GKb-r{-ttZ~4EwoTQ0a@_shc#{N^cd_@BM==32yFAm5-c@*WLR6?Qpa#k z=AI-snyccZSJ=067!%eKa;Pm-V#B`s1q2+}RyruBM;#Q`&k|InM~YdTE#7;WFa^&V z1xGO3W{Zm7i>$lEeLjdi-=ZEdD)f$_HD1%nK0EoMU=yA(_mon7Ht(l= z*F)prk856iJB3z&SWCBa54Ox2$_jLjWbNK)%p4!MWZORy4EaWuG;&jzp?$n~^L4ph z;JEZ!j|hWRH|e2~g?+>KRYyW8H8Cr9n8aK?Jp6Tn_e4YG?Y+(Cnd>3-#C8g7q(T*W z1#d=%tC(XtHP54AS}0xY(8xe_Jv(xOQTdCM*k;HD;OO*5EM#74>LEqdo;s(h-r*m< zv^1$Bc^rx!u29?wdva2l%Tl;BHP0!FuUiR;)VWOI#_B_s)`>^;coJE7&KT4DLFslUq6oQJ6oVl5xfhAAT*|HykLY$I zfla#7p?IryfRKxOeWyWPdM zDwxYzN3)xc>u9gyGuw@5qod$_S_eN1jy)0L11r4kZl@vwOOzxFQWQCrT!X*fsJM$vf<;cMSLRg~p@Wh_-xnH(kDG9%hBJWH ze|YopsZ&nl1P|}UFB^-? z74BuLqnP#}3J#nSi>p*oKbv*9nX7yqHGr2EfDBQlva(ML98LQ|(VvWS>*dJ+UE;IO zA#w&YnE_wW*U1rr4NlXK8Os>x6&eyA_tGipHrCpQ^%vgq{ z|8C)R>@YO2vjM2-YcVOt-cdig*gzOMPKa|ca~gp)OSS3BbGg26UGiDux^lN{FSaTI zHvq&tibEF{6f=v=7=rF9Qz2|f&t|n(2Z8&hqIaUO5cam$gml+H~CO^*&X4n~*+oB4_}J8$tmE(=&EK#kWaCQQ`9~0eNfOQs;T_}YpA*03?Q{)A9InE67F@IQS*J61t zk&WykuInJ7{k*^}Yx+;*F0nrGaAKw&%T$|*kr4@KP&1iL40et`s(@0A3!RpTLJ3B3 zIZ_o159@}=b3UNLXbU;Da3b@I#-*3(V1)&hn>LyL8Xed}WMig*H{CF|;19v=gH~Yd zR_55?WYCV{&>=#GoVZDtv;UOJC7@JH8$)*|#$OK$)Y;zWciv#*Q*8@Z#$n)qT!T|(PxG^FFYmT%??yYdmXf}i+_>6IPK z`QK#S%tAnlxtU8Kj_GVJtU$ZVnHg`=UVB~nU`%KeHDk`ehpk#v*oA}{gz`$wv}oa;h+m4y$BODv`i=-QQ)TQpu|yw5(RcdM<#X`9|d|Y2#b$| zAI+$ny&^qkKgkP^%GyE{0UT9!%;DcAI`aI8O1TDbF1pdqGxyXopBvQJ1~x{*paq^# zB0G4Qgy7VQx18K`v$&nF=GTkX%G6~6>xAT{gL_`Txswuiq|WS#N-Slpk0`LT-Y_k% zj4Q9SZip6Fx{E7yEhp4Aw0a7IWH)o|vIxVU%gZmy+GONF8&h~mF>jMxOaosvT>ISk z05sOM4U5dQb})hq^i=wS>APE2V3+x)kv1WJBX5EjLr&_WX*p*g4q=-t`Xyob5xJh| zS%ScWnvu}-wlSYsh!H_81M6sHx@8Sj`|x2|?#;w@gCQw%HVdH{3i_bqcvi3_%AP$q z+-x3%TtOpf9FvGFp&1YAuFlVcuwVA?7>Z-=%t6CD_#6!8`dE%`esvr=a{d?`d@=_E zUz|CPBz3gVm+lQUA(U@0iGvP5*#=xUbA{C+wq^uHG1!4BOBcmo$}_v#J&d0&9-9T7^BEfHIavP)!a%{`S^ zY^Zl}NK`S0TQ4GYt+CH2oKxnAtiZzZ10y3nH1-*WegX<$j-uU4ollmR(BSPY&ABjr zh-_yP8Mhpz!$+ds(FPE?gce5&URvVWLwmKniRO?Q&4W6z)O607j5d1)j-EDaxXK8AxLaCx~$aMX||SncIrHT>_uTD6X|J z+}NP0n@~jq97f$Fk^$)DA*6;ZJwa}mGlP;jGuyGe(Wqr{+LUIhEp6}^1Yk8D6|vl$ zDOSBb7{ziBoue(-A;{VAD{|4*rXem7KjrSX2$^(W`R{L z^JM;mJY!ZC#+nCiRPLPO-X6#b@6xl2rQGVmOQzt`XhTWPpRv5XzFuD6&6jQdjItqN zs`df%5jY-Mv1gZP7)3>!sM*3(5@P zR+HQMvVrQs8;1sYMPvkc&CHFTitR+Hn#^)-P1jemPFRZ8gv#+X%LP{i5uXa)fj_f6 z*ZQdb(xa-w@)U52$?P@JTF6bE0UEt`I(s|a+R5MvJ1`(sPj%T2L|xeOnh!f|6Y}ts z&3yRcaB1bXNL3M`tuUGK4*ufHXIj~Tu!8L_iFwQ`D+Wp)Ct(DYQ$uo)EV6P~jNc0^ zc9gI_D9!%-3VkuJF~~Fq+6sbAL`R`UaI))h;GdBh5-h3FYDB)QVmn z91%va$-Y_6x$%}>&_WUty}th5@RRMDmQ{9rf(rX6B4Sy%$GX`N-nw-m2PqB`YeVjU z9i15;ojsPLBLDn7*heuLpZt>`6+j(Sge;<=v+#sWuqMC@$H9(gkgt&pj%Z_Qkz;k3 zt`5`HVY)g@S5a+I0kv5LJ?&7Kvqoy|P!qFBKI%|TvQdNX(5JXwJnc|jvPq}uQqr+a zpFFlzP+QTKbs&8zZx2+Ka+ZQMrZJFV-DU~Qw+^JAFv~zk55mqfEoT#Wc1t*`wV*h_c!HOlx^&Q!CPQ6`ZT#Fygd?i`|{C?iz}J zA4^C+xDi7}tQBgs0HlZCtD8id1%~OQ~wJZ?)^#T=(AF@JRt6IYVy85x{=bQ(W9YP4=WGCNw;t z-xxG-qTd*4R7qcP6-g8|T}??!RhX*>7)E6w6(7pWsLHbQI8bAXs1)aRUo~24jQ{?x z|8@4?|MkC(um0nI&gaW_XU4mqe)!?-Ya?=YCKy9(Ow$Km2ICqqbp#UI6H$Dyhq54u zkS0}){!l8ArBk3Bwz#X0SIvwe{6pv_DlX#SEU*?s$~5UD7|FA2utlY)a8o9@VjbM5 z2&IHV4MmVeg3!iN6D)d=Jlf-n*fPnkPiml=OA?`41Er%k!OOYvGfu)R8!i=$<8EwDQI^R88<%NP zyxZC4F7WnGgeuaOhwFW@T?cftl;MatN_k@ST#-+MoN>7j?Z|O%yiHx*v|+O81=yq0 z!M?Pqj>{Lw=F3AlQ96G5oHt=8Wh#}6Rv(jd96AVtMy~7Df{GA=7ja)$|$|R~BjBRGn%(GAC%>imrTsU&FyT z0iR&Pyg*^{Qr`7f<_OtO@_a#A0#gydQMp47|27_hh1#fc>!QA!eamXI<>@>NZa^9Y zc|T5l0o{hoq3gS=o8{g7x>5;^dMd~!eEkY4Ky=C%8m#h0v5GIMzqQLXnZWm&dM9P5 zrS`OE414uV7Xy_~yNp@;T~lpDKnu@fNPZaHC4sXbmsT5Vn)*9t@rGP|-*g8}1+SS7 zky@QErl*6po+n-6q`Ul~FiaA(hZ(eSs*yhE5Aw2yvS7(Pa3f0|4EHv<0}~~)%qp5x zHHCs|Z74_)wz35PKogMCF8N?0fxMiM%BaRxPE)UMuO_6wMe8L`Fn z?C}JMgWI6RhwkEo%J{Y1AC&TveIrmJ3Kfy!(97~-hPrsS79>U$Jr1r>{ar|rj%36I zd^~V)TQ&#!@UP}=>Q{;r=3NU@Q94i4+6_rj56?`a`CFWyaxI*OV0j(R+#u$Fi3KQ1 z83X7+U~$|t+9_rDgIAo7p;e#1d`xEE;ed7bQsN1}?#zsBTQRA| zcTS^{896bbSyPp(xDXJ-K;N5MZ8_(YTd6Zuft|cFIk>kw!b#mq<){km?7gYMzYUns z5N}%U5Pj2tHzxyqKz^l#q}tY>yva&VO$PX_W4q?eGK)5tx|N3)4S4ZH`!!T)^pTaZ z!yHu?h|&e3bb%;cAWBi$1~D040a2CDB(IYiJB(72-8zg=BSm#6hI75{f;JIh6yn?@^aZ$BPB0>5bALTZFGZYCk$PiEq_{h zpy(1io;Y>j;OJ5SqjH=BJE7T3H#Va%j2>$W5%NC^9t%IrB9C0|ItJAIwmfT67D(TU z#@I~jz$&$|vzLv7eYQY9wQU!^G(7{qg<_(KXG5VFn1s9#(>~{9k@89}oA3;($hgoI ztfpoh&_O6L6Kx#3bKW3@ie@lfIH#%o|YV+AzZr`P{P!dA2+=ObtY7m0$5Hl{c3Q z!qVs0*A?DB*(#N|9z`C>5HBxMy5xT{cR}>$!>p>AQm1{&X0YB(ey6EO5bPYy0P6Zx zsy}Unwua6w2xD5}2^%WyARqyFU9^t~yej35A-MUWOE)AdZ#f`CG4$fJDO<1a3Ne{9 zl7qX{C4rdnLF8w{Mz<5T+ z>JA*y%6NcZ5888&NS;Kb#rC)UuvO*`Ow06=`q->qz4vrC!Tt!ri-U9%1WUtcsK8_l zi~3fWRpHk~es$OUoz# zII7trhrf{V1D8B<|HV=@Xh$WiDS`{ZKeD|!FSc-gqt285d@_ZgZk z?xiYDKR?~SxOTDniP{W{bP8H;`lg?lUiJQ@RJJ2<8zkMiU_Bz80j~JJo$F;f(g358@s0G z?XwtA!%pCQmik{$B7Q|2f4Oj$)#cq{wYs^!Y71v6$GuE9oTZY-QrUgX;Z8R_cM#gQ ze^Pla6~vSxrSo7E-AFAQ9YHt}+8Lc4(_K_jSV^3`x1R<6EDm-xq7eT{UIJ2=5K{nf zWWguJUtHcP=+2qQld%W#n2ZR@cYvSJccMuPKrQPaCHLIUZx(k~%j>H}o7__tkWNVM zsXGNeMDc5D#4YJ~s`6yk5qTg*>txe|W%g76y0kpe8!vj)?Ii0FKiz$a@Db*`fJzZ;@#U zZ5S5xY#xMtb-w7`<$(_BhSspWDmM)Sy?3$#9WwBJ$BKhNL;8v{@ui=uLLd%q3@ti4h}O+!oXH@LAQ<>B||gRY#zSkYR(9TYQ&plyY@|YcnVpZj-#SL z3dXVH%?Jo!PRG2_QY8&_;O(DAkZIUF40bj56~-Lp&hm*E^lHvaNFLR)F7>)!7KJGj>K;5kx|VZq`hGxl{~>XzOhyp8Y>;t|YIJU~esqsn zBu{@N4}WnU2aH_ICgIlSX@)Q=%nXGN@e%gt0B?cixz@+B9lGWfd4sgFOwoFP$Fxk> ztw-%~k7^zF+W=}6<7X<4FAg*#bb&R(nzs-+EZj}|J=FR_4FderlM{jwIK#BN30+}; zfbhag21wqlmgIn5-nO+esYDb^HBi8I(ZpOT2bw>4t*5{a9NGwn9f#s+7&ttjJ{nsb zf5-2OzQ`pwnK*%(-QnXgZiR@CbqmIrUTQ*aegGlJrEURW) z7a~x7LtZjdmXlZu?wEpE&1$rT4wQ2gyHS%b# zwgG5WAx6-|tkmOiL*XN;^}V46j}f2NxmiAL&d z$Tx)j5NZomSci`cD$d7tXL9Bw;me^@VLQnx*9zOO!CpNEenRB7*9w4YTim1wEtOO#65Z-$mix=AGpQ$EQ?g)?-p!SYnQ&y|0dmrInT zf7XCHvS3nNi8je3-#Qj+v;%e71=N$7CKzJLc3M@E7h#8)zy(=+Y6T$yXBYT3O;s#s zmSUL!@*X7&GMurxJ_-Y61eZ;&oW||d?R<4JU$mCfD2LNbHA<$YoJQ@Dp*zh^g~*9$ zJPng7q|uHm93!RNfp97*Hr-^Ysb^9gSCkStRJw#lcX_HVAXse~)@LVN zmqjahCNEAY3tna*jVVGQ#v%qCwk+=2bAzYQ+->%V8J)?s$$;=~`1PxwzWgsxNHM_lB&B&Sk2l?QiY+))$ zXA~8dFE#x*pByWRnfV7Bco@8a2MxAsBLQ`sxn_fCoB8$cj>XJQAZwYfAJJe?ocVYb zm;)zj$dJwH_h~sI!#c1hU73_0_&+*NWcX+2!H=CMCmf7lRi~P;A)sG?XJm!$E@r2S znffcw%U;)=y16rJKzyIk6#64Ozv+u3xC#F|o;2(mm@w5BMbM__1 z{rA z6&3sJ5D=C|w!8`hnPhSCY3t2!V0vg0_Cr47Cc$Gf|b zIV~w9m){HNKxAZQRa8f0)}Iko)jtZ20!2|Sc2cC0q}*M(s(1Jog8{lXg8^zkvzUF) zo7CdRJjU2DGv2RuBPn-lbVa%-%IuigvF}{%7#0cU%68*du}Oj!(p^s<>>Rj|2I1e> zo0EUH`YO9`bNobHPnw&=xhb{9(bk3oR0%7s@!d8!e26CchrR8^1DwDPKW1)bN63TT zk0GaoNM;rS%$5IW^PtaXtf*0X?Vk^AVjO$pNfe6;_<>+v%2-KIo7`+q*QY!7q1QS~W8ju*?rY$! zEZ~tA$P-}BgKK_u=KKEB9scH@7iXkM;GK8aCEUBHV9#{Yrp70%lF)T6j09S}!~YuO z?+hK+XY^TVjMs^SJN^CC^4-JEtNqFBEmFSNfAuxjuijPuiiQva|0zs7(V4H&bNaZ@ zneDm_!$NC9ix^-Sp&K=h`q2hkmb+<8e`Kmm*`{(PFXp}7*tK04uG4rW=x^DfiSJ`3-BWZ)u%Y1RNg`G>&5 z?}NxbyI=deJ7h(B`OClxlU6@xr!q|6>t&Gdq!023%Q^%&`V0wDw4fe{PtP}8--Gk> z8>Cc#kcALUR4gqV|KbU0b~}GftKT{x5}gP?B{zoSMrIwSq;9LcfW3eeqVHfT-g_^6 zKi~y_Iolz_#Yp9hFH0wt8EC%4=eJ)QKiNmklCW@zT-i1p96~eBj)SK*PLDCY`CZWHE?zh;~b8& zA88`B=ItDBANH?-vz3psZ$%`qUE9=}NDW@UcpI~)VGf4Y=976eHi5s>%$;Fw$dP;L zoZZJ5Rf9D|X$eT9v1q=%3lFQE^U@i&mqGT$xnwYry%yu%+*6u4^$a<@+3G1{vGHj#?kq#q$NsCI4}SFPJMy1mHoFnpdowU2KfpPw6)C9HvmYm~ z8m@1dZmuX$I=Lj(0sR8mC2&?NAh-6eY}zm+CBiTM_2Y+3M=Sr};rF6krXuOT*V9i; ztFBH!Ql*7--oxcWq@%NY8CO7_fZXE~=;T}FOOom4?EZRoU2`R5zX#5`Z38W$`9!o> z)jPU2JJSk$Olc~l(`W2rTBN>R6-m5;nvFvEW9#p0gX%$il zJdL+PMr02lms*D_`Bd%+fcqf8*t!lH8u_46tn^m6bKE=AvJf{RjTQrA{s}uQij>zX zlfwgwpKROsufHu8v&HN@Jp|F=_|&J5??0T+8IMl=&faW{w?{JwCx#tahUw1Q&QN_i zde%1ZJ?9ss?0-DCP{M!hm#ceDqac>RaxOjzjpG>uk%P<0@8t4JGN2 zjz-v-fE#xrycLxXg7$-HzYwp$i`(3r>bC>xgVHQ#FNgNe%4tS@P@3iNNN6i{%EWz8 zzHYh9gvqUhn@+D>{LXO|*EO!}kPb}g&6H9lFc?&st1i1+RBL4a?@U*jNk!Xlu&EM0 zp}udTH~zWP^klTSd3FdB)?Y8Ozy7zO%{;MN&0~%^KskV%nMa?nn|UH-|H|a>n|Vt> zNNwfyZso}}CSo?!#)LK|v@tQLF`*U3@hgg4SD1IhTAmxrJ>SbW$8lYGc-Uo|7+T*F zEM$qNdJW?HG1a!{XLemnsDNdG6s>8!W=$(*L9J(LJxl9ZTF=sY7Ej`~fcn)8z&y%V zVDDYidSUw4jbKtXp6mGI_cZ0J^pIH->q1tGCRQLyOdVTjb!t3@;jeRLbLQ6pB!2e#9aa$omBED;zz3f0U!& zDg+JE_9Rw@!J;LFZ5KHs9_UZA$^`L;*mVhkfnw}kPvjHFKvpeb zO?%mxZkU6V0g^H^dqt~TTHP9tx>d}5dr4ZDK4UMJZhgjn9O}7%b@Ad;dgV)IUaJGC z!>(<5%FGVhKDIlSHQYV4gHkX`09rMy9~LX3$aFK-vbcXLc1vxKvh#6fs5S94CFk-`Co=JBl2V?^?>Dj9b4DkOAXVHIf0v z+8;q*1xY?@2lBHco;;swE^59Bi zM`xg)ob`}jj64Hnmpw99i$%gBRc{3T6H*ziLm2rxv_kIsFN-;h@r|Ub@iJ^)tJ$z2 zME*o&?iLleVo#*8MIQc?UDYS5u@55F{e= z5U>kN;p2RS00A+n5A&UT7AtU`cC~3&n|8J7qkP&yD4A~UAk+@RQ!pCjC=5EQoX?by za2O8h`LQX1{$w{Lgpb1!0<9(^WHAxKq?tWznUwFp`SIKDlqm|h_0j4HH**Om=r-n> zxPuQ_U! z+LS3|Eb5Ggn*Fz<6f+Vs<2R1$CK3ky%`RMo^WiB8+6p~6xgry%oxJj@BXc@3rz3MZ zGIzobC9(V3#^7htK`$Nj8iTFD@9Aq$D|p;|fxYt|1q)AY0^9yYu#K(nuEkn_%hbeL zpzZ_Fb5kiljpyjp&0NCKDPTS7c*z=A^bxzAC47`BPmngZUc0&VO~nS*R+qNAwAH1p zuG6);w0Wh?D{Wr&XkIm|5wF|Isy1%Ktu-D)%kj2$;N;e6Xe&#?sj^Mr?-KJ0{mpJy z37;#YB=8$l`l7Ydx2J&hv>~MpDQ!sUtJcPvg;S4F`aB4q0wdu($WQk16TSf=jMbR* z3A-{Qd@3YI4zEh{kNTFilhu%5zluLpxB%G8$Yx5bQ zcvgPm&&<-Z3o)(IGbTmL&Q~ov2?uJ)sU@eDoK1T{%S}GHDdFhHE_22Aj^ldoPDC`z z%bn=e-ug)43qMi_ajRiZ5bnfoDb|MvrAC|^R)Z(hoM$ecuquM{5rtG25)xMfdvBZ3 zJOAJ%iL04M>{3EFaWzknPFy`XVbOrbbh{PL%CLfTmO-`Ab;3rM4#SQy46E~5bv~=k zXVv+vFWtImS0lj4Fbxl>W1jth^s+~rt31|-E*j-ZB}In5<2liYt~;Fx9 z=~?oC-Ru$0E6oz4jh>S;dh&~r;1WM9eN%g@iG>jtG|?liqc2@=Ox6uL>occ2+~H7HiEPfq>UhL1ieBdNF?0V zq(boI(|O30$Qf8Xx7a+H$55<|r>*UM??-Pf2+)aU_;u9wdbGLDC7ha~YhS2PnSaV` zfpsCQlLe;hRBA)4!`AFr)2J6iOqbKt_L#QEv^}QnF>Q}&draG7{PvjqikdIcEE``v z%X0~ba>K(4hZU(kMnAF}V!}srQ$hqRFa#mm0vkN{uxV$Z?MUFuT-ol~J$yt~NM=tZ zD|w^WQQkTxGIWEJEnOr$V0y#De(whn8VcQhVgKfA3_1LEtUmHw&}q9Nbzq16N7Asb{sMOXsgxkAQsB&WgJjn2Y_VwZf#lhWJ&2K?ari;u zFplTqt&^Wtcmw*Pys++HP0Wio9rVya4;}OvH0WXZJET^vl@EgUgK58-Rm0 ze~za!Bl)Ifj%*R!9oodNSF?F&gj@gMuAwrQ^WgcxAYOW%$uX>Aqw_T+t2RpsXWvK! zI96`RCua4g3n9(wO+p5*N9iBIp>(cA-6=biDEDcnl6ER-r;@%qe586zBT8vahEJ0b zJT3wx-kIxvKZH@7cUpMFuG0t|8z~bc=DBHS&Ek05{0&?G2^p{(-;X>WzOW%f5h*YR ztR_fX(?zBl(pZpoVj7UE&0Xv{E|^TyA<21n*&{=0$Xx}2*g_{6lwX~}hx7Tx`Qmyp zzeKBhadk<#7^zv2;~fwiqgOI7-dtbKub0>7=htUtBELSku8oX-f+Nsprc<0Z7ykxv zE~y{=)!Bl+*`QG^7tIG%s*ZqJXlC-~+U{x>m%K}sw!Ebl5}Wqro{Ad20gC>>xnj`<8VG_+mDntNIVO zrt3neBc_3_VTc-_k-bfFLWSCk$xNDV%pO}ag2$2Rc!hWBhn_w6(tMVt#55$-I986C z;Nvn>AvpwS@IgAy_Rj}2ZRt559(hzT{M^Z;%0(JNiRlJ7N>rJh*@FgyIzhZ~RpZF& z+26x5<@~N6^z?i55XnV_4xqFX>;_uSmgDpU31&u<6+>7*J?z)ua!<6B^clN?B9tv% zK~g`uNoK@tY6;Ro2&Td>$%)!TU?P+~8l;_ds;m&!ivUmdfxowd$RVZxqRn6ZyKO~8 zgvHx}2q-fQ6SLNda6gE5y$5?eGk68C6!%i=Trv5VZsyCYR;NJ zZkU^zJGdAPFCEroEBN7vH7^97pvT6mLRkZ`QD76HO4@irY_c=gHr8!C+p@#Z42~1H zVA6gnDsM=r5y@`_Hswmk+Ge{$Bz5X-ERLa~cH3ok13NspNGo#4hQ!JmGmhHMzbG=4b7$&M- z=^J*1Pbgozmb_lnzVhf>Q;&&*WEJ`@d;z~T=x+&{ApXYC;$aU4A_)2*?*YaJwo9&m zra!W=Oag{IxMm3AC5OR8sD!kfgHPI_if2Z8B+jtJ31Y@=4uHU2XH^^C@-VpTobw_v zH2t=sWtnK4>4PG2_lQi7hYvngfZxVS zCZ97f2^+no4erdNv9etsfemqZn8C`40y8+$zToHIhq)0{_I!t~=@+fOwhE3-A z#ts=@0B?YJ)HSnl+}ObaaV*>2Obj#!-~qKvtSKXfnbbYQ@hos(V87Pti15>fZ_y6f zm==f=9}ZJJWe=YfRp*Qo7wXOJNkb4o!*e@;glJ#`?YNMuG&jw)&Q9ioe;MgB7Ct(W zz(0Iqhkx-znV5`z;2)2&i-L^bBo#o>pNE}?Pd`_uMsi=h^&LL5%LpZeoPM(R(!Q|9 zxoD}j5odcuN<82BYMlQt$Nx99snNhtvJZ%je)*Zs@{k^0ax$tkM&dS>N^MFtl<3hr zFp_RZDJ5lOZlw8PZ%WCG%+gXkYa>fePZF~#b+g)NN`k zed~Zti|3u|g?IkuZZSKjq$d3kL+@Wde#mr<=Q<8y(4G`6F}CH7USvMw`W&IXGrh>M zXqL^9*;i;kL+y^R*fq|7#d{*jC6F*6LO5?F6wKWrTA{#L`!?9skrCLI{{W}xv%C+9 zp)?beR2FHazhitQR<3CD33x1@ge#h^lrlKsDdMaEdmnF!K-RB^9LS2G#TElB%c!%A}4rDJG@nm`io(oCzPM}{*38C3u zXGxOV*C@Fwr_`S`gEjJ5%vu6Vn$FqyS2eUP&>7T1D70+Qo<=zfI2}o{Y{G3$tHhr4 z>BU|uoc2U=0Ng}i!9%Ghyz~0!pGZuqpj&2DQJH&r??WAzM;nK)9&i{7&!B5R!>Ixs z5z8Oe>QJ={sk))HMW)a+_Fi-?-SvB99U6a}8DBdA*bQ%yE&G%4(R8tZoKzkym^ndcp9Q^xcDo=$u0 zLsD(BWcZrLX1Sf8FBjKW*UQ^Bo26*noPy1Q^VncS=+hTp8f9r*?`-?#n{WT};r;jj za(=xyW38T%*`fZvq0@pROti~%+!Z6`pdGJM9+L%ikNj)^U}c<8B%>7{^n}9}5PAxY zzyI|=MJ58=4cRVHa}(h<9~88S==@3rq0$>IHVD#Gu*v_W*k%{mpTWIM{xbR)Ur|TA zsg}P(f|vZLCg&?X!<<$CaEiqNR;-@CrhSCKJ9ceVFukybpXX$nXFelAmtwfTtV1}`^WN_ z1=_4gL4|BS0bH%#_J!?LhlX|Rr;LMY=9D(y7kRC&qvK!w;X|et!SM_r}M!KmN;?GvjUH-RwaW+B7+X0@x9+|C%Pv zKKVHD##?Dgfv zwM zKkRMq8+!b~co(PHKg1OP&7$)WP5I9J3DD)ybX=lMqH)3d)3pufDWI`TA<#_i zYeHG4Q&8}@bOh=%?rw2q{5Id)?~~q;^4IzfovfO(bdJYDX5C?}E|e~AXIB^1cc%?< zpt4!L*X68ao;hruYkfMO@7$q`VuCQ*s=F-;&zqB`IEiaHgIFew&iA(Sd@rl#d&xE5 zm-!l9zp*`}+qld#Q)s4QO!7}x7FV-+ALb9>!Hc9YL8_`&irzk#Kt?^H!esmCETcGD$@qGomJN=Jty)uK8I!C4uG{qJ2?PjP8|Sd(%`(HwXzs zj;mOk#_b+)TSk4FI?TgA!MBkhePK#(`2iL$f58XW;$^G^0azy?$4W>PUsRE~44I+WvRSBl>1s|A7cgi)Be#&6_DzP--tX{Ab za|y=M@zh7uSlS?jbsS^*T)Y>7o?h^GP6Q_xAkvS25ax=);O)e534J-o zcV@hg(r#(GQd_rBkVZn+!cwFrY37uKOMaUv6)WkMK?3DM3zSzXP?U$iGJ$XenS0N?-B;tl}VC)etnmo*=;X zk|9>+76P!B8em@|z$y>c?E?q>SyWxqr+kpAI6#*pT4U*HU}=G;RDx)RKQMaUXz+ZE z;Hf+sNBFF$mZnenz*BKFE=RNm&r<@=UNq1Qe_-&u*5LUX!BctUiQK(OYtCiyGxr4_ zges0d6-n19dKxHN<}8&!n&%RPrPn%)|2o0+MtLBrsDpBApIt~5f=;b>zJN@qUKG(- z1zqZcT(1)~l}DEjp&d+V)#5CAW}ow+sN$GXf$-BpQ=L;Acm0}l@6w)9DLQid1A8%a zg2Jm5Ab1?cQo`}}#yq&uG)GZ-d2`jb>;gkV;Jt>-euP8iEOZbN zNxFH0nnBS9c0dN$_HagVY$Kyk`RFK7qc&Mt1Med(0yH}~oIi6~(eAA2(} z9|Ci~%?qz?0G40f_Z#*JWm#Y(K4LlQcxWLL(#eue@LiM+5CL!Izl0x~Vdy+~NcbbI zA^U5@6nh;#6V0p(w^W}gE;v&_J&JJm66Zktabue=L%^+7ivZ1WLCbwBH z$7>tLn67Lk5Cb6IA&dllb=TJSe&|Hbqx~Lj#|Jx5rmz?K!8&^jGJy)_ksW0a({*TF zUP?ApaOttp;ArasL;l|tDp{}|MSkhbJky-!H4tt#rfj;cD`I(FVAl-Dc6F2=XeLi zw&<1YiJusuM<-2SLz4J^iE~LVC4}hm-Wa*eKf@8OEZ;Q-$;vz7h4qQJK!jct+&gZ^Tnx zpFYw{UEB1OSqHTJ*poj>N4}JlRkAvm)S?AIVlm8SfP{3^JW+kx0^Q=cz_IWmn6_r> zQgWi$#cJ;Nwh1mJ{A%94gxxY_RS8s1>LQ+yEkP(E9np4IcIs=5{jRuocxgCgNi=ZE zqA_`g-O3K`=mwoC_s&%HN8B{Gv-4`0WsrWfb?Xqo&yRe4Lzp1Jwr1J3jV{}^ZChQo zZQHhO+jf_2+f}dbeY2R^%qAD{NqGfp9+gcdN$^obF-ZZh#p56h-OtS?bwu7u<7 zxDsK3vzr4uhP5g81}Gf^LIz{^XX8tXi9#wY9y%rh0U$G43`U~0R(clHR z4h@FrPC;y}hQ-ubdR<{7<&O=aFAdS`#=hWf$-OvQvUx!iT3jU=OH={-@-<5rugSgT z#5J|yDWRqvOPru~)m-riYncS3GRtjcMP9o)JyLiUC*>7YGU=?D+Ymtd=phZJ-~1zO z2wJ2`CV8gJYGj%NeVK0sodXA|%YX?7BO3=EuD6&C)!QIQAOdNJSx^OKY=KvX6dyqb z{CY+xd>7_Us9 zd#gKZh)!xWnbf75U!X~CooumMGt{(B>0>aN4A7#SFw0t4j%>uYgEl_Co7^)`Fj@77 zOaLF1?tt_E9`W0WG9&pHe4?%cE}$ppKqbl)GjWh1LoDG#U%+5IV4oct|2FL=iiD#& zT0`vTO7%EPsI(_Ae<{i9OE=DK?1otH8(4 z|7VDm^Dz*S2FatG=?(YA^@Nz1v3gFFMrJxc>b1>CZXB`wTHGb{G3zn@&>hD5WL!LJ zo1OOG-mS^s%i`I8G`x3BXWSBBY2N9GuJvD8TRC=6<7S#0p3G$0+E8r5`jDd@{n7P6 z@N0x5DsZ8Km8&zk8ga`67Xw<}80CKjdh z){K7WwchzjZ8w@`!ko`2o(Z#R8_o0jGjyD?A_^2dI2DyY8A@bof4+hT(N~qdOxG4A&j5cl#V#Rmd>v$RN zgiEj1?|X>0xxk=tHo+j-5Ert_ITQ{PW9LyzmIf=JCJN{bN|f*dF*Z>Z$izU5a>?|L zIPg-Z#@_|1LA3CegKPPW#q95M@PZb+2j03(Sxb6op9c-#LDmJ01bS}TB5rD=;O_>h zRCtFz&paZOg;-=aB{w?Y;&)ody2(O>!_p2>;6oP1Vm{sH>_*Vo$%Ks)crb0e||1xa~n%S;ek_)$t z3y8S+ZuX#N%h(f zB)=@LT|G@ZF?8$bX49oCzIl0gy8M`N;{S-Ml`;pmLkY|4g|O+StQbvT@)~HfMoo7o z$$5I`gpA@Mm2;pCwoiqBvdr<`F?`J7=rf~PK@jmm(=2f!bv$PNyl;SJb($Jh`hL9{ z#8XRysu8O4q|ttDa|>(Xf1NfqGWEbs9Spr@M~8fQF1lui-`SXYWntz%yVNxVhMtLC z^y0?Ra5D6GH$}&mSb`%TboM=d@ASTzv^5v1Cdnpid5&Nzcq}RsXg`+^51qu7kq7HvdPKG zHI^Pt!Q*Xvec!=$JsywR?#Sf2UZe0%*`lf0B4ozDm7g$r&~um~_cNbT`lQLjg2a*5 z@QV?M68}b&D*a}@DccJ%y^XiP+9!()y$~v}5abl6iX1hdutjZC8>yoTA~qlzWJnAv zWcULewO)GbYni@ahG2|kPa%9 zwFl zxaU2k0&(IKYfW~4LT2k`|6;M9keDU60r8a-vBJ}3SKXaY?3>HQHPp?)hb8>Wod=3( z?)Z})_T6;+WYXGRYFz$`8>Pf)8GB5yyNy>*yQ#Pm?Ll)iqo$)Jp4UoH;lyi3iuZ!u z8=B7Xj`_}SjgyPy1-Lfc<$mPfDconah8*j6N}QFKKPl^iXtvDjksBDmOsV%0^W9-| z4w){qBaN5CK;4H2K|JdKDMv`z*}6bnE#`_*T2=GRShe%|HD`4nDwuRZ()?6)U;nY7 zbao4^C$b5}z_w^J$q|MuqizBE)bi; zF>_-2ZtzSwdA1oithvuzf~tr=cnD_zM#n@K)nTEkRRk}i4ZsSm{ zyQEJbh3<_Np~g%o;U@}?v9t{plTW;EMFMhmw=O!CHOK}aa@-KG z{6xwH%kw*$TG|>L^vKLg!^@ye_n@@BN~SjZG%CXalBL}@T?W^2ZA`x*b^oVNk8w8R zavr8lR(WfzTcG_Ig@tReMb&qvAZ$4;zMu=%=N8O(O@9Rt4vl}H5t@Y#c(AU{MMC(i z`X;a#TFP>~Q5;oRkLHTu2>uEThw8@ipA&yDm!7&qpFyc^=sRp)BN3Q`RrP#SS=9uUoAw3t&wZuL~Nt3U}DGiDbMTO`wRY|UJ#A;CYv}Vy0 zA}mPuHzX%NL=+xgk-KcFWa@rBsoQ^0%qa5Bgy-Lq+h2q(sWS1nm&jIh@6-;l2dY#PT#k^-!5ES_%kCmhEUc51)jh!mK=fZ-035@9@>YYU`@K!S=50WIiSToQV+nh>zQ z$*yBcCoZ23ZBOvm>v^s%szEG^T<{XEc3_-Qb5aa(Lct*+->+HR=KrYhC6qW|<`oNC zI@^8$G^w+h!+@xd;j7F2l6Of5$&btr>2e$d*YPSjMg;`GJI#!?xtIZ~yg*N*TXLfR zNH+-+B9j_1zrR<1n0sCa`DRZ}9>VX=UTk-~KaT7uO@OT|q7@D7dJMLm?R2G^#=FxT0750w zdyf2Dzp-ZOJCa9uItEOCB12&r-je0l0thBgUuOpX_{H zL#;9J*X2S83HlgWJE4n-$nlBABT7>U`S>jqibRD~$sI{)!4W5|VehAyOxv!66~x=f z2_7OI81|VOnRsGTA=+g!tqpfFhT9<6{4*mEUlPaYO9UYwBcH%|@Q|zQHPF35+~o0! zYY~GFu#JN*8r#dC$NR^hUh^Irx(pGsXeF_}i$YI`U1@I^vFTcdWpLnL3>kUK99sa4 zFrpHaYs|xI#aiL%hco_6sDCBC;1-}HY!RbPaj=Q<6b$X~Nqu9V zb5hj*j3&;2uC~B%p@S7b7_*!+&6GyG@j`-z)zo#o9ZwqWQ1O1Z&t|_?m2c5EP}~WD zGg@qW#((9_f$N->?ro>o&&+~vc>V$Cj5s6Q8iG;wW>wIU#T^rjK!yk#SR$7sZVaE9 zfP&%jyuxuY>?j6zJd0@dPX_Nfwdp~n+Yy(yry^0M2x(KP3?wVCZrZkLLJO8xAAxI( zk9db(RYj?~AqQ5L^rPS7CSc>`nBYlJ_#;u|=%uj~iMT1`$#95c=vCMKwB#eo1c}aR z%#Ha*_pck15soP(>|(r70mBo$c4QsW3i{-W3$MEdWQx~(ypN_jQpDf$#oP%CRf}Tm zqVgj1?cUIR@p$=92j9r~vU)l#NhE63+b1WM7N4Du05OZsOPI=x7*`k$G;a(UyTFXv zZ_cc3EUIB6@>^VVb|Ulm#`y;Gghj%z2=$I~@?rJxZX+1U z0f7k9T40&b6H=Zm+kh<=6_-bYb!^A5fYpL#RuNiISM*vSK|w>Q$Dr~UUKI2d`m*;u z{8&ana{x;v(*AyVBrFHV#M=H7VDbBu=(Ec1v;#HxeewEs(c7IaU~f|5LJTf+`B48g zjOjcPv3oYsLLv-ByY+bxC`AzPb^eqEdsY|Rw~7aA^yWk~j1`kx-{>>O#wzTA zkrYZ>TSr%0M@M(JRi{qAxo7Nhk&mFM>Nd(4?r>A#zUBwJR`Y>iELjmdo?5-MWyBlV z?j>%oG151PCz~v3Ok4}#8(dq@*v`*8ejkn8UcXmNLI=OCODLUQ{o&xw#VrtC)!1XCd_A|p}Q#VDvsiG zNlyrnq|+Y$17gpIMrTmg1tOeYvDpTucA+}egG=GmG1;ebW?{aKd}jUwdB;4(Zu>`! z3pApRhBOn&t12xj3LzZ7UJ3~kGf5-B1Braxt#b?o2e`ksbbo+EF1!~2+$S$@c49__ z_C5woy}gazPLb>n<1c(UfgbNPRn$Vn;GU=#w=ii?{sGA=ir$$oG$?2!$_@A8?(*)< zksQVCv%ap|1IpRegr}tK3HjBhk=PIim&%K;$UbOWHWRr^sh&nB8GaETC(`Kpahj(5 z#{iFu&@@XZ#=nCHyhw6Q_MfTU-cCbjvN^!3-qU_AyWAbiR)w*z&~`nuv{$Ov? zu0TVpm$o3B5EzhB8;6-Ws-R?nAztr;hcMV`dNL&Bco^xz`{JL!B$~;Z@k;o8-vz#a zRtJn40KWx_j9StrUf`XtNKq(xaCSqO`5-E&NtsZ*)JjC4$73$n=qOZvRi3F`zR_MP zg=NTzWN^%QjK3!=e2|dD9>|$-dXW5$mLjH*4 zDZgO5^P?tXrE{UH2CxrDRIX1ge?FaBYLt|es-7LM;T;t*kE2jxf5E7^xMrwUB-w_RkulmIQ*1qKix`73-Q!K zh$D@E>4=%K8#n3Lg|9y->AEpPdX9FTcsv{s*y#H&!c)++=xz%Rf?0b!iS8Uxy0OD) z<0&~c$i^$#U&q35@w7c!cYtk8#qIfL0#CqMU1-@Ao**LOGA1h4&ZKUss!R=X@cM{u z+Sr;OQ!f&4*snTrnqbC#D2NT{$fw&$+$JxO8`rx;*7YTSj9 z2}|J<)a}Hm#`!Nm?oC+nIJnBEkJSZSI?Guo91&5aE554yWK}**aDmMC%ltaWd{LOA z_=lTixp*)?yfBpU2ji1NVjga-w6V3y>O0zn1p2tk%sCI&|52wxIdg6Bj$Qnt)R&+INV>vSs$$4$zm!Eg<vY^|U4_I+CceMpMsf^z5^d0vg>afQ24R!dlC0ntrUwqqGRR<>%IXMQz?5g$ z1CbE@P%AibH4H0D78}GKMqfq{k^?sSy7&v+HqKlh!kS)yz)l?Dxz-7xa_~~}HVF=R zPje>SdtTsC=KZa z`HHNKh)|__{^3cb>et3tNZoU5W(%|N1?8QwK86_WTmC0@MKhx=yyZ8&snQJSc(~>_ z_AQ5hX`}KG&1JYkE3QyRWwb=Iydfd~;`afUf0a*8=*tQr_3Mui;2cKCY52d0?Bb_ zBTf5RfdfiCeQmGfEohRX$e>IIr(mpt5`TGWx*A$&R)<)6c`_7ZcgDaH%V=b`s1YJ> z8NHp@9~GU&2+U2->f1T_`cg%&ADMU$W{-(Nm(A1i$JnxPwFyFDkl2515zPf|Hu|WJ z$W9KToMQEjmobWzRg2L9pf1fNcZNg2S&oW-u=C#TR>a$r><1iZl#ZHbAi<$>P>;Ebf8T8HWpJfGPM1A4qsFgWu?AiD7W(hEVRI_xqv~j8Vf(!1G+Ja8`$dy;#rS zA+<&s0w2e^jcUo;SD-NImr3GIWpxa?NkGX`sYw@8h1EPEU@I0GsT4{?PqndybI+TA zYM+NPwK0j0+~kRskyB?fC2#N=wd3P5x5L%(!tco)gj3hM0m{oM=j(%N!m23FSU}}t z<&d~CH~aVR*ZyMVi&=x5+76xQJ55K`#@dh1cX1PbjU)tJPbiZ_pWw9v#(R@|TSXri z3OSa$JS3yoo*RgjlCh*Gid}}$^jl<*mf@@L;o5fcNEp`m!R3EF0E)6)K3!A~HR^Qv zxI21!+q?T9GX1@xu^$FT&>$LhlG3iJdCI=i8r8xtu?2QKQnx?4b0dV6hL>s3jyle< zVd4uQnjb?G+Mj@Z*u)+%osfWJQUeg;2(ACAm} z-W!~ogFbZ3o2^DzHG_2>eD7RKRp2Z^GOf(iX3~QmvvmQrEM}X~y3^z&we?{!!{D^Uq`|LvfR+e|UsQ##?(rP+VreJ?Ki?5@o08NErN z9cd`K#~YEY(PJ2`vO<9&onPW^lsDKU&^4!mm;#i#22|Cpnx6;#S-ukbAy4uSZ1-~N z>Q0<1PnmS-_Ot~)t9##F+d_JByOXb|*R%&PpNh_^fb&kOI;C@s?GJZ{d-&!yQW@lA zCCMqeR^dU6-vbn=En^@ZVE5)>aOAm4;9cY@h&1U z!oEJezfVdn-sB>h=hsdMPh<|;^O#O@u{nW=NF5OvIxWRsm%is49Sq{89G}(0f~NYB zEV@C38;ETqBe<=tK^Xi6e2n^RTl{Z0dgG|L#lPi^zm2gy(ZN%9Y)?B0MH60&+%7wv zsTW16+C{Aeq)8Y+>`6EYPJu-bbEb%Eu6p3TCgBj5c-H$zo^l78e4f|c?Ft}=%ENa^ zFY%z;d%808boH`wTbJD^L1jj;pnv_9>TMj~)q87l#wiXOfQReo=(Bb>)x)DpkX8%i z<#f=k{E;9@M8+fNby5Fft@UGV?c~c{STiwt^O^(6Z~wT5 z;AcD{*JSKs4}X3DdhaOMow82avFTmj$aZD_RzhDvZm>MeFK|QD$79ZSC8|D7&?RvG zOP?W7Ab#qhDcjdyiT(h4tnnprSBw6(9q7I`%F)uy*AZ1Qp?v1!7WV-Dlz&UpVgAzTq+JDvCHn zgQ>J4=eCNtniHQ{pG^)9)`~~=%wacgX+wGaFOMQ$Ox%F~39ys>`Q>5gbyM*3hI}vx z_yzy~Da$o~nHFrjZ-h*g+OK7MlLS`>x5t-br5#XD&*>e51 zIU(3Ab@pp;cD0au+fhY1hRfHdGo;tYosHT@dJD)Ox?j=fAxIq}=0ZQ5X(ANhR>>z? zD{GSXZr)M}OtE4PBpQoJeuC&5^FYH{$L5c!AfwYu4t&wlxT+cBLYmRQjz%iN^8KpLTRnamk zG#}E++SRZHRe`JC*~+RJxweMRW;PXlwO**|x=a5|-ymg-Asd}phs`%8 zTDhW>oSr9FqbvW)FK?}x&4jq~h{WN@gxN=VRkKPwZhg2&uZk`nfB1zjkTqeu1QvW( z-srWv&;4J*`s<$g3@VWQ+tY5QFL%pAlKq%-2hj4>u#}(su>0-q`_;Vk(F`OIfq3JK z+du3@lE7Z7(x}{SY&E~+PA2$F(rvb)R}WL4KTj&b^A^P}=P6_j^sd3+?*tIvz?;+a zlsUf@7k|&Yeh@wAtbiii0mG9fv4G#$Hb01i8&#nqXnbxZHfrFHXIE+^tqPU*pbd05 zx>z|;EqP)Y`#Wt4VwX5k$l=Rl4~%v!;RlFdT%2{?fC}!E(4mm@W`W+m15{g1#8(t6 zt8IrwPFMz2kzu*uw);Bg3acLUZ+gprrBxM7+~RcXhwk=^EWR9iOGWo3i2_4)Hk>#LmZ{1v`ul1e6>B`0 z`Vv{BH1XB^hgi9KwRSfIE~q2u+9Kb;6iguoH3#~HfFUU10)L+;Tr30yr!jI{T1E?S z8k>8jw^XMqOiC8Dm(<=ihI%uIvJEx2-VqdIlj)jY6RE$|(fKC@C>-QP$$ldbaI>?##l<-($EpWIg#LHM_h!*)jH0!&Orftn?EkswE1@=D1yp zDz0Rh8S-JB9S9D#?p>)ynGRIdm&3<)BHIu6Z&8-W;e0nIVu^fHElJ_v`PKo;X)~o& zPo!PSeZ)9`X*}r;>}~!NVbCzL5Wm3Ha{%dQuhxY+G8O+C0OPR_dXlxb(A|@2zzSjx z+8Q65{CEg@E;118FChKE+wflfV8wpSF@22WdY4mnmr{iKgP~puHJPRWP5N9auZ)8FAiGij> z-jbc3)F?ZUo8xlIWKISAmCsHGQpUGw2Ck`0hHPny#r6vGBRpU^)q4B3%0h^6G6~-p zx4qfRu2iKh|Rg1<%hd+qkt_rP(RL6dxOX^ zKyD7*j2|UWSBDtJukvorkljGyerU&(uItRzubF3%|00Hx47hllxM^5IVrn-LKzwc& zS_*;Y13+<|u;0)murJ&m+Y9KHc1B9%{spj~{z-pVj6V$>)*-_hz>=wS^G`D)vNvee zSQU{Fp5c{bbJ;rg~vlM0$4(e&c(LcxdCb6M$*q(sA?^B!RW!%Kerz=Ni|hE<>0 z;%-+=;L7K1=72?oLyNaRcu&~_fQAPidC0Di!X(uNahre=QB=&74n;1ep8zfIiOB27 zZ5Nbp+oQ$KD>}jaJ_1eA#M2{~wbqKtdbG_N1=C2@DdvsB^&0mJ)d{9wGNjnb6~2tw+S)X=CzFwpEmFCW%XkgKG38-G zVZs)BoQ4kOIJIsWMzOk$aI`TbwUMfeiH$KW$Zey)7rZ^h6&8PkTUV0oKL$iuU?}Y3 zHW{=Me86uKm{1Yw{$&FpdbjKa6##A(C0wIMnY4*^w0clJzqkmPM<9-{RA=5+AgDFL zd)Af#I-d}9J*i0;kC(pPulud8`(|x|Y-Q@-{1z$pG_@Mpy7`B4OSbEH1|oNno@kSB zt#ra4rctAPhXps!;Jaf+9!u!XK&wpdcd{AWcg3hU(5Mk8nmfpTK*bH`@_VgQY+Y)~ z_C3PBH_^63`tPp^U(+k}Y2eSOMzwd#rE)PQ*4>i3x{l_$3JxGaC#V+`TZCfEpYR)! zgxEiuH(vngJJ9f4TzSh;<}|mj8$oeIFhuA7#UE~^ps?HO=sn&~tFEXk*mcd~UtaCh zNH055jkaH1A^5RKO;c_r8w$dv5Up^AT({PG@jb#AnV(DB3v=~*c*39=z2_6?{JUF{mwzx1U^ zW^Ddp6gw`yP{-yLH;nL`+cIrP$k}=SAiu{f2gVrjmEPPp=#?HusBeCxT>fF$X~K(w z9fNWhrzyNpU>nXv{~Sqwv#&t2Z@!4{!gX-|CN$D?L*|>dXobaE6X7gPk;i4%W;p$Q z*dW-2C}kt8DuL6cDh6TVY?DW*uaq~S8*nKp@KhZ^+rCjb+&gg(W%53ihd1cz<=6R1 zApY08FX<1%|6vM$O=}x+xxHU^U!}fpjNPHOXtQt>J~;c1b;pHgZ5X`*sRY1-1zuM{ zPIw49DM#SKf#jy;@PC=y@3)44 zDn6pEy`exgFnLtep-tBJD9Or<5|Lro=w3mBvZ`|7gk$BUP5-9eKm7(xH@{4qD85$M<=;6+ytohj7TzU;!Gmjt$k%yN%GV*>8^J?-Qy9zI%uWci{;c<^7%*mfi)so238_ki{{A5AQV9&s47H658 zJpe644aag1_16F$1(ez;EdgylN+bJA>xn{(p;~M>9OR%Yl&hQVE_V-)3=Ws3^tb*&Z07J=J_27f9%8pQCfups`7>(RTof*+f;kBI6qC?= ze5YuvWAsmNZOOiuO(Ta?kcHdqA{+-~KCd3mPI7d{BQ(5bBR(M)3GuEic9)|hs6R}* z$0NN`uVfo4qq$NDY{4DC<|BpWXS}a~2^n09mb)D#D*#+%2Y{ifyO+gU4`=KNwDeCW z=rp6DYlfR>NW%(ww}O>T@PgkB>%EByvsk*b)=6yBH$FF|+NwNUw_q#yyF^Kip08nf zB3Oox(GPY6pqxqY%{`W0t5XgP1xk;&>G2=T zJl2}&lkC?7yb3$srXS4k#!F|zKV+F*&2y&jWA2?Iy_}Ii#*`22A*gSD-2;Sfv$on< zfLo=OOq*!6CFHZBQuX*Um1VRbk>Ml4Ui5jwmx#dY{$dR?3fRF>1m^bALQ#^D0lCr6 z3WE3+6~Rw_VmOabZkv2m4q~aIZ2SoV$OV*BtLNn11Xq!V))dpU2zD&3VJvWRjcV*P z#8VlUGD-6xh0#a^53e1S`QG~8E`-G6?4-=KOZ#F|8P@0t9p)_z0$=5=#$7s2+HS$; zZM%bOH(SJ?@g&ElH9*8jS%}*!{=K=HrkI<*LCc_bGE7AvCzj-boD-uw22s7Z(Q0|l z>rcgvigwDPy0kg}Fa+!=EKDy^W*duzmGewvEoPuG(Wg@~&P0%ylK^HzSPu#g+$LeO zlzYmcD5WR?00*&)X1u5C{;>_Z{oQmmq^Z&ch&uVZLC!+Jt?l@-)e`s%5HX1eLr%J_k7 zq*o!=RP!*4tAMVscu1sBX4U=HE+3RVCtG)i9?ezZ3~V^b=QDW>fb%2PxZ--cRr6GE z4fxG612BlEuvWP#W^i0#vqQ*|m2tqCgVc{V!K>JmO;RH%87aH8Am2|67km@8!B@fy z7<1Kbrvn$xlU+Dtsz-ym#-?@#y?VGla=^QavD1srmhx%L)sD9xyRZwaRx9Ur2wu$A z2Mm{SvZ7v>GlS4P+Jf0kTh#eQKf$^9U0Mpg{l~Cr36b_Oa#3`08`wU4$bLd3L{>YA z4!E;o)+Fc?PXIgcQ!Z*Me3A1fO#|{;P%{!qo2UxCyOsW$71r&7PoRzNJK2*22u`+( z-vz#ANvr{ES002H>8rh;LrhL}1FmLlbRq{reTa2@Mx!>;nSrBa{6AOvQ9|LRviIzi zB#EQ-yVaQ%w>L_>C zz=#b7^gm`V;4`gGo3RbW>V32lM*!GXWRf$d_8gS$8X!X$AdPJ9YbE>Sc%!>hq3YJD zyU16-&IZaH%Xq>Pd=?fw%gliHrsjHD_uE@Sy-&-6l$u}LwE-GCHr$1Q2z34GIwTE~ zdSX!XA^UzErS^l}8h1qyOGK^YY8@5QuZSXMK!GuI;xy^3i`m^ zACCTfYXrWv=bUU0%=ncIX{@ym)#o=whi8boxn`MI{bb2@y=8n}J$E>>X{uqqLD+-; z*97qQ1^2^l#gzJ2`69Wl!5t;y`~~!EANTXfnqcJ$87YDF+e|gK{?`IvMr$E`t7uy& z!6lVa!udi3X-SVu7VByM>j04dbpS9QjKkU@Qgx;8p^PSz1}{Dzc-=CT1m;fup~>h) zi#w6*vk7X#pfGBKLx2??arP@V^{DUYP>Eob*!rCKOyNDz5FJte5`imT*aw|Odhm!S zm1#!eA|fmAawg&p(UufH8>ZlxQ-P+NL#MD_Zo)D5)~&5O%^95|ey1@R8u{qf z%!eMwfnXnMhLYiyQGf?`sLJK$f`J5KL zoJ!eeaxq7as8fy`3N-xRjL7U+GxNK&iYcG>16vHLsqdMWsGCaydfc5S@{ymH-ml!B zho5)8sGql=&z%wUov%ID8@}$ZMXdu@@SDl-yWi6jz4NQ|&c8vGocp$Tqt)|&PBcll z==wI-lCL;s;}10o9zhQqpo<=+hEpa{F*l0WtP=ca8e%c$`*{V^^>{dFy(uXRA2x)- zKZzV3&TRbPDj$|=OuCEe=XCFjSrW71|T1*ARLQn~ISi-TYKLtG!AVAYZUzz+PosaQt3~rdu zuOjIevbPF0n6||X5$RVK#65K!yh~RALAsp`$YkNu)#gQrVIvf2nEuf<$>H4>HLo*f zF?5Q3Gp)Ih>B3H#``iTE(h$De0Jcoe9`3YI4m`d?>i7WXnT7 zj(O4N)e$(@t~3cr?d1Rym-m`Rl~@E_Ow+g}TzZazG+?+4z%QGKh~So!F)N=mF}fO- z5s#buO#&)pZi-v*zMBEqZRKfpO%)^jLa6AW_(g>&9#2hiH}Yl3+vz76SvbaMk>RW> zkieM9sFC1;NS>jb3y8@+crCa|ryG>ch!o+MS2oy{!s+9=tBMUwZVvMpzRBb70#=*) z7dqae4i8j4@?$#E&inv+$gUfqy#l+IE+Z1QEm&PfE`&-xd9DXMrne^(RJ5)%?+=_MjUdJ*_To zO$MQg``~037~EatL&oB%6Gp`({UH7gPg6I~?VR4s4+YmZI+grr_haBnxuqs(*^Y^+ zFCNY}oWabap{UMxiRL1yy3m+Nc{Ld^!dgfm#muJ}1 zTF%!(25rm`DTr^JWH8?j`LUpV&esP;eXl9EuZcju-#rsPCkO4$*0=7;{b!4(+zaNl!P0dQZZTXM9){r+5*=&!0ZXMp*+Sxxbo9dktAzbWgQ{55r( z{*7=c7hI2`cIs3uOA9`A#V#C`Jr4nU*KnJryTk~Ja-3%&ias>59PC)$vx8aH+r^kK z!q&!jmP-4k#6JkqFQ!dbMlcd)_EFXfg|T&TAT4dxKA7Tc^_0sFi9CzRbZu|CDTL|Y zCeyU1JBy0o$z3sM7(`x*rL^;KhTaxQVgwF9b!Q?xo$dV z(eQ=Ci4wQ#K{IqNX!(0gT)dIT(Z&+rbzh0J z6gBO(qGgv=fmgTeueEtPP0olw>+bxtmin!qj&3BG%VF63!uw${ORhTD%A%mVdA@cp zlu)=aIpfwqwh4~@H8JbYn|>_h@NnRy+ce&EA44L9<1->xLS#rfG>8SYZ?ZaGW3K3f z!F-oH?%^&6JX&ZOtn1(O4?Af)YKn%>r0zVjhalXjV&RnBM^u(ttjOF)Toxn0{Sgxk z$wu9`n!G_1hTKRNJKFU=#U_8~c`#ZL>^3CpUCk!{OfO(=#xK^Lp}7HVK`245)cKGv z+Cthbwn&@$3qJJ8wf2;MJ9a1 z^yHNKPURsC5EwcY0?=u!LFln}d~?&c9Q54?WT6w83yv;##8`K=L^ASN+1PfP>X9W% zs4^xshpEcc!}xi&|7uL}0&3vnRR7;%GrQTNpVZO?%Dyc#Mft@DzqsE7u> zcR3W)5%gX$J5P~h?EfSb4X;2(R6Ae}%t}H%32e{z7HYh$^SSi}>3wkQEa(fST;kH` zH~U#5)b*U;F+FD@$tv|^zoP{1W0GhsdIBiOk>Gv}(H;mhi77HVt&CYfFuM~GnQ~?` zEEM`LaG!N(!q5>#mI7Keo_T5YNcYehGye{0K+=n4Ik6oM)HNoNpm7~C6mSatDF!`Z zl53-!cFnIJ)LxYzBZkw+&!bSH_PoG#XHcEyj{s}&hs?&jVGBV9RR7>2kGOmS=>-Nq zPprJ#6>&4NF68MEs;-G%u7AWDcxwJJX3x0`BH3-ZRU+T)Jf7Emp)2y3`b+IlMD&(q z()0nkz%W9Tkx`PN#@PP%g05|?13L2hMeQlD*!S&Hi|u!4&G6N4qS#4l>IpjAsv6_n zl8EA()(Jo|x1oqKndF)ROMWAEl}|)mv<;XgOWgX>_DN-<=g@IGn&K-9EMwenvxdp4 z2o;#b1OPtj5Lh-Mpu+CfE*}(VF#?2j78nTglNF=!nSzeXH9wp0s471ToMZuB9Z_Tv zHzCpkPJs9i?eA%SGr6ew29#6w0>F)BWqL1=RrRr0^LoiA>RcF?;SecWgPW-WsqU2y zU&a9GE=Q6~&b`J%LAYpjQp{?BT$%7n>k*#5DvZ}`w`GkLn-^$U+6iv4cv=Gp!EUi= zA9}RkeliYdW8>gJw`IxBb*yK+*Vir_VigSKmwi*$|g1m2@WoP-mPCpzS{8*{Bx<@mOqu{qsUxkQonaPkYV3+X`7<6pT=UO(!&+2R1XYofcC&AI6iu zesNl#lvpbCTkI{JIlTWkd;(TyulIJiBqhGLJ}#X|^WHgp$L0isjE`sFh?&J7xid2? zvFbLR9tr&C@EEo6nJ|6gy@0V_9}meY|50CxCNGdSj-NtyU8j0j)H_5NiU^b;+##Bi z^Jhs5LCCZy*)rH=sQTYX;<*H>49*u^b+3Z8B}36+cK`{@`~jGNc$jq8TC2155NN#%s~erL{o4#ItaF{#`#V{?u%RKc!*=&{9< z`{r>c8mD87(|Y(PNs$`%%2ZORN0kFO@0cLx)iNNY={~e%=Q^UXvlPaN%Cv#aih^+z zSTS(eGHC-ytD?D_G8kAJFJhrJDy4>E4` zuvmcTWvjTnHBfxBH--g2$3hxgB(lcq&FeR&kWCrpgY!fg;>kn#PRlCea!pb1sUMz* zB5u(;klaJVSC_}!6*ND?fHK0XqrdGDSmo1ZcnwD_<`W@61DNG|S@UMi_#R|%gef_*( z$32d2oVlUb`v7lJpV&=f-T@e0*P<1v2oux)>T|d2Qm@#Bzf=@qPRc+aBv7%5SJpUH z;@}BKRm3l_C`E&kHI|Zyn~oUsyJa9@zGx0Yg-Q>7ldd$NEJ%=eVW9ZG+>v{`~<>h__e902D zcXzwldyFtM;tkS0ql%S16@K=}@P3Lt#OzA{S_Xez?v`ded(3!2GQ470^R40p229d* z0!u65VpL;I$4g!p`VGLOphX0W9uBe0@~|GZAK!4iJ7rb|9tawGK^`t>ea+H zHTYZ}aGQw08V&8cYk6DcpMgHykN=e{`k2e1qx2laUgptY?ad$*QiGKptWi6j}pn^ghvKW2t2SEn*6P(pK(SP{2u_5Ky1I8 z=emhZ9$Cl;0YT0F&t9;TRw6WUCBZS=omNM;vTM_ND!i9vfaJn7r8!a(CS4bE;08Kz zw|G!f`M9cNBs08;y2a~=8!586_RN584k5{l%U`U5i?70u*KnoGfBo%NyM0b5@#+0W za+zLZ?ISkw{G@U+$)|)8PK?>6HLQy30DFcLg)EIdXB%rS*;n}Gk^7hB`Vte?>dO`7 zo73XUg)5E7F2u9^VEa2e3XZuw{F0TC@e}~o`o{~0zk{^FUoto}%;6K35 zZ<6B%`7ijC6wxqH3#o!y)h4Nl)%i{{da8D6l?fV;X#-JuhAnhEqAEK z>Ico-hB4<2<@}$r^fnJXny8U z+Ty0GeT1@avzH<(IRUATKRXijp@d! z#8Tk7NM;N-;SAugtz(u~<*}7(X-P;eI>wgPk=@b~PA)o1u(Y($(599)wX~`AqD(D` zI$FbMwT`BBv~J9zbu?Zb?Ls_#IduJfT>cmT&8(?)A)--Ji%HN&BZt=4`j#Jr;qqEs@+_>BlC4ZUH*Xps!q>d~b0skIdW1b$*f{lR>JI;NIz&5T9uP&5esNDMwOQ zKSHjVy=_Kq+qh4$sw`ifQxdb7DARF0ps`q zJ0go_Zsdp&^gHP!juV9Cg!Otmll7u5qmnt-yr5ieQzj%6a3GP{>iGP?kbEg2FbhlL z?@h~zj#*HqkCGEq8k{9WYte_F>}VVK zhlg$PuAk~J*#TQPf?G$Vc6Gcy=&oc*?fd8z&>7Z1J41NEUHsaJ{6ZBk0jl|y9p1$Q zh;?LYe1F~euI~gI0l@2vfm9*9jIblVW+Mf3?|~h^#RHF&2o2Y-5v~ij$SC!pB!Ed_ zK(#-m*dM{^u~heLoPB*U5FaRu#~|@M5=e$W*#TKJ?nns`aBSm?fwX6Pcs#C26=ehp z%!a*yboK_H&w=TM01SOy8I*KLZw(q}@^!;v@FZPFFle_>7?M5pIz-z>u!+Er#L4){ ze)?C@{BLOFzmF*W`${~BdhpieOYf_{V3s#s$ZM20mBeXd;N*o5qm-#&MeVlf(H!VJ z|Jq~23*_Pf*L0DJ{`iV-*r8lB)LKoR#`4#T<=O{7FqmuqyDBsnkFXv*$MV-`G^Y1p zCpeyY#*W~k(bOVI8oOT~c4rw-qjs;T-9Gi&G0%tA;?YvHI#CF>gG}vR3f9RZcB~eS zoE8YuQ2h#_I%PkN)cqoL+stdlnis0YW2lc))7@{)l^r=2h3f1hcBmGOsTK&*Q2pAV zI>&w*s(Xa$4l}QzniHz8#Y2;i(=D=g(lo^6Gc!ncA*KbSQ&KcSzdnSH8BfD=ukhSF z?HZeTu~|IY_&7xa-wSaF0c^^*L%`k$5pf3HCk#9ek4p^h!JlYwd8E#BHk~5G7MMOl zE4jjg9wx~j2-*0D!0-;c6Y80;3(q$KDmi zwmFb|$>wr>hu#PdYsHsrru|?RzMNGgamvxwMjT^K_r804 z@IB=?lI;wS;$pT~&Mu`4#PU54TXf1tk@Q5bIbBps0*(PhNOPF(k(JQL7?RH7l~~lA zzvUiCPh3^#FC9*`cw!yS*u^dDc)$X&)$bD0OAh@?WJ@e1L2O_9Aj|)C zsM=Ylt{w*1>Aj2tI-&znS{9ePC_uA=i_J_+Qi>fJWvCh78u3?m}YwOxF;| z6Z&8@p$LCf;{$Q}5EmAHkNCncbu;7r2ARuXWcfQMLU=JDh9KC7>1*))+D1EihgwQ3 z%J?NPw<{JwCRS%B^d4zji)Mkd_N@c<2KWJS1|Y4?bi9nkh@FL=kA@K#@!K<_Z_Br7 z*(66siaSJ+Q0=x*{Rc#vW|}t+;@aLrp;4JKk~B~6|5$V{E7uRQ|K+o9-CWG)m&?DL zU(YWu&o6GSuVkWo;?hC`eIQk1GJIV8mKF7x$Y)3X3gX8p1!AutfJ)+AoFMg)DcsQ! z6-u*mU+V|x-3i%06j!paT3D9902-pl3(-Wg70(l`Lb#3VgcT@A}ac;^R3` zOP=y6aiSUHZG?_Uk;~f8F@=WXS?&QQ#4w)`y13@bcDrU5oiOI*xkf4MrQ86>R~>WI z$oE2!PdvrC3Q(R**Uf<*JmAAS(bVe(@&<;wG`qUOY6TK;)^xNDYP{=viM?8<+B$vWM*PbO$od?BbPI}Dq0Qj)e&!o}np zK4g>|maQguoY+VyJh*01K*!gCgn7nMj)f^hBxtCUQeHF~%8qN4&zZ?@wXA$r96p;E z^=Isu0a$KGrDim8n>Fjs8;k(eDUmNi!DTz~JmwRhbQnCR#72JjQ%kECBCV=IJ*9*@ zN#bVXxb76|oLNbeKIM}na)VW6LI(!?oq2@X8@LEfycYMjPPaIg+pMl)^zkBlF+U)Tpu$Sevy0w zTl(bWD61GPY($mPCbPll!S?F}7}(e^(q=($Pe>cT7 zh~%{@*%)*J%auu;>`BBLNwhueR-WldTy@)ZoqZ^A1G{t}`w( zk@X%Bl8au0%q}Q?g_*Cy%YgQG;VE6N!c#owg=a9%!lOJ7mA)kQWA;&{`y*SzBiCOJ zKKRsG*(nM66_V0k6aO%KSDKldS#xjNdaRAL00Z+fbiyy5#g*ypYLo)(L#~%l%#?MI zq3oR8N#OIi45?zmVLX!3;Fq(->|9p{7p)9#e1|B2MFGPI^A70nW`vaaM;n=cp6^Yw zAu;^QgqD#7z1qOM5XMz1b4>}jTk}i)p1E#Pg`L7y-IbKXm2H%yTVvy+ZE)~N)wSE% z`Lg;rPwFC#e;Fn|j&QC`CnV8eMJ5mo9MKr=__;0r)r>D=QUL#XdTJw!Ys_? z7poaZI_*T@64K?A_si(b%3}r~=IFFbs(M*464Z_$t5cBTkaCzOW27h@K&+yYCAgJB zdtyqdbpc{corIa>6yz-1c1j0OQ0M6;sFrfNK&Mo~I~3^Tp?y46Ia#TXJsnCZ$7VmF zx}{(}d$_yGb)t4GdBcwkO9vrda1a97jFN*8{$}G?_MPc@P)|Os<5qgk;|c6UE`wvD zirDd(iOakdZnojF7i(-5I*&8slbrf-ojs%YmXzzu z*+M82XFOIUgArN1krc^=@&>tIT<9X7FIyzYKDw|E>=6AI^Uoc^E6d*c?%Iya$<=+$ zCm`e=VrU?p*NZ(Sm^6NG2jG!|bROzXgzEBv?V=Gs+OdB(Cxv2X?;dAWy6v-J=tE$MnT)B!(h0Lw7;7b&gYWOeuUYp z6+(8wAmwmHsBbnNLHu$Mp%eBab?_JZM&sr==T+`Q)PVP(430_jqrK$je6H+ZLwvC@ z^OeTcG_l}v&1J?t*P^`^uSNSj(2WRPNN-*NX}2M87pZN(I2zyr$w%iGxEjU<&shZb z;KlmxVUKhvd`Yrl`GJ?FGjs;-u2uf&T&4LF(z>p^>m_l~^({0-?swIfD~O8Ey4mNI zoatzlNzb&4*et8Q`*djcnE0`cB4BQOKO#OQ3614y=t^iWturp6F<9&=E|n{(LHp-} zDR2;=*j#v6VS`6fb8%ZKP^A-)=E>(rQhZLBqxdu}J)V7vvt-?XInp$Sp;VTM-lcUOjt#$wj24V7r6B>(hMJ@3Z3xM=<@k`)GcJT%?k$jq)Q>OM-xksZWX5+}5EsLDEAi09Ki=VSS*D&ck_wWHQIP!-%d zHqO=qd!FL!SyJ{nfoixtxz2PYT#br7p`v(7SrynQs)XB#TxMkKxeBfTHjbzoZtqB_ zE8%K1RE~z?8Btk)k$U}0C*nF|U%ywsFna=#s^@@TB`Ny{K0SN=V3%%%d9k?nsxO4m z5T^{{#IN%!=ulz>$)1ZPZn%qm68K1HIPv7uQ=SezLl<3Ct9nn6Y{axjsmsExHyNYMUfhMY+H`0Dbb>6 zY+%K<2As9u_~4y&F(oy{UvQ8?PP4R=Q69JtZ|K@{z0{s-(zHKco!u8|)8!QHOr5%n zPYd&n^jdY}u=RBHFu6UW2I5(>SMb4n9xvk^|1!Rb@j0V^}71lxT}xR$tWIv z)E?xqc#vftv%w7ZfYu*zm*YiQPgnYs&)p;M7(|)KQ;3-X!3HLHW_->YUdVv4k>z4T z^^AR?&`hbuOr>2$szpO3v+w{#qf`$dokfl9 zlOl80;4|IOPv(9N1+)!w75XmD+=$ODR8Js|TP8n^uQd~!n1r^IGKyJk;sOMy6mpsE zO|?^{Wsu|p>JzD$ zCUO0P(KYQ=GBsY$viM|RucehR2$wo>wMx~UwklOm zNi{udYini92xbIF3^IyjWGebszs50}dAWX)19t$tGYF92B{I3^OqY^m01m+6{=wmw zNKdqW=P3J@K5g5lcOz5+2Id(bCWTpH@~>53ZfLca{P}C%xRJ+8^*F8NGFT1%Q%oW< z^L#cWlywGZ#El{1!jO#sD>ws0b!nYr;A)c1erE#3^4PsMEma1!3hwzsSOb3oO}hJM zs9$UZcm3%X<#1u;>;3{-%fm1T9q%2~n?hng7!Uf<@&nOw_4Y@(`;#1otVy_L@EV$v z3iE2Q2B?suV`e50xG(Z|;Ij}_{z5`ECXnxJes4ScAJO4o7N(J@@X+a%Z{3ubw+g*2 zv9~2MEj-D((^pf+V$4m9V@(bGFUi)bSQy9o=C2lPj3QHA zz%G);T&dQ|TN(4$zqc`VAKAvIUlv1+bF}w`+ZYMMH)3H7`k}tVIoG{;_C?s1&%(Nx z$3?w$v9~T(7(-XBi+SwcTNf+CSp{APXKj)ra97ptI} z-oB{HzL>WPy?wE_FLFJsz|n3%-KDuXk^LzT2`W3Hg@lyX{(a%{%Pd?Tuw65X2VV50 z%Zp~c?5WPQePe65wMk~yes{~4PpZ3$oR~a5$qVADo*$=9)G1$8uTy?%sZO~F>E~CV z{W|3*p;+EW!}ZN|SF4l{YOH$Mw1UiAkG@EG6N)l#_ItZ$RlDc3dV+?ew5(WZJK0>N zvf|0cDwh>cHdv(yc(Sdk1=*ABRjL-BY%EeM`xzD~7ug0K_V9A@@JWM+pdmp3j7`^x3LIILY9R(FhwN*J}3%SDJ27JkiEE|)Y9 zCc}Ar=g^I^<&6ow7hSfzmv6PnHw7L>N{c@yTB}lRJkeBz66lGRw(4f8e5LY4W7Vp~ zCmO3(tUTFR^^gP-PCJ zRjPzbaF9$pDoSye+J#c{R=$dS3Hc?}UWMZ7azbBf1=KBOu6mSXvXX_+WdMZi1aVwb zI;^BGsos}V@7y`GFR9*_RL@dSeM$AyDEgA>&6iZ))?cHNv$~=(-hB=Dz6N|1+WQ*t zXDRP%!1s3dOSikvRE8_nSL|JcOexbq!^Pe!UNbgY>YY>37kYo*h2ER=lj#e+3r~Mv z=>1YNA*of&DxJmaE%Yuzs-SXisnENadJeSm6H&JYJ_-p1u}SvF!O~C0rZ4yY{Pb8~ z?!7;b)i3o`dc8MU?p=g%K^<@j<=%6gBTzCfM_n%W&UWNwgd6o$;M+P&bVww>*z<(a z6n--W0R+4X{7JqFyh!)w^+Wqr;AaYaloeNjPqtUB;#0CU=4RAFg(i`yE?^f$HI*c1 zSgNhQ3Vdfgxx^HBeEMZEQ(pzXqRGFn0$<2WeVwMhPE&<3bhJ)WF1z;@r>dZKuD}7H zxhn7?)QUo|zE0BxBeA|t)3d7rUkTInRhm?p68kFfy)Cgw3oGzV;N{*=V|frz+25f3 zYVUIe7kx^ry(e3%Y?;h1YTkk^QDmwM*hQ5sQEA!uGwa{m61$IJZ#Adu?!5fpGSZ_sqhSlCHp_<-~ zsLGDmS9|a6h(&rh%gZa}nk)+@eAwc*`g&~~P$a>(KA1(aU&y0}D!ysC#MK<-lr#3C zuqSfXXR*b;OHcqg-4n*Mw-hqp8|36mn*>vXtGUL1P!oV|k)_*U{BYO=|CW|l<6pDT zDbF`8OFI~txvI1Ug(j-saH&O=TRn3`#Mo^HnHG_p+PA$$5Zd=w@W*&K9Rt&>M&s#t zJY?GkQX84}k?bGxN%X_fa5^2X7Sq{Pn$$lXEz2O&OQkdP8R>Lj`o^CB2Hd1@4!*w{ zu`kbP-pMEk3lP-!S8w^UM`!0&fKB2{%flIh0c4J5&(5olXPwHq_C*wrO4LL+Bz8i*jo1pur_SCAcEYm0dr-}(kN(C;$V`Tq()8@!3-81B`{qA|C%U7 zdQ-S|_6OK7o4+#9Y( z)8yj!Y-5K#c{}H5ZOE^;rcD*Fj$aZ=$vNae*4+Gd%@i_C>Z5D_{KtRZ{_`LIrM>#~ zUxvfUyKC+J&mVvO^qQ<6Ay)StS3w}I@~KvA-lCnty40@#pcfGS)4U4C&0ZFX&3D;b zBPthaGyKrz(e5K|8EjINS92a?YqQx5jQzns4S*mo6zK8i@*=c~Ygry?%?RSe$b~IC zwuV2`T;~Zy2!)kI5Sn(#-3QZh$am}DlsTcWNG={Zqi;SriDIRnpXK3gv4)A6jxz>~BDb=AQ0K-MsZaBo9a zfobD<)h3K_Z-i``@z#$nmMDYoU68Q66AabD?F+bU0Y%8X0QTm%|(~n~}hovmkNKW73qH+{o7eMc@Jv8q{cmAU|E_ z$-~g$wPPLkwkLW~SJR15V%$>4!o`vt^j6E&qR^o*d49a4V5eY0^5FNBDx zH`4G>gunuLm_=SA&@erEAxAR$E!PRq2sO(-pm#p2r@+24z^eh?fYfIN+MV_K=%SP& zuMl8vFmnStug651V_PT9HrAvm-95$fU(g@HzkJ=a$?teKG*Ltt7#44oS_1BkSn)Ze zpAQU)j5JGqFJKO7%NrtAb%KY@EqVRVfBffv58Tzp(`)UApFe(l_lx%V?$4iI)24`g zfOBNLN8VXHX-Eq?MwAI^@}%#)Az0cE9bRk(#y2Qt;WaX#WRFZ&s&`AL9l6cKJ48BT z1L{ID3%N~GI=cmF`dvoLDz$&44~7853#>GW095!a-UCKMYQ2H)@F$r$z`|29K!hQ!IMk}|g4C=_nW|RPRSm;>5pEHxF5#s%X+2oEBk>?r03>JCfqNtq*}!08{n25KyJJL>VyfPXR31aB za3H;R+>POqMY1qyZ2F-*Uaamonjoqflo%beh{XuM1XGNz(cdz=NTg~r!8Oj243%iJ zwPEY7>CkWP4a>2&9!qQ*yaGDfu$2^#yq-uvHt+@nChG}A<@hE$u|O-5vUujpXOc{| zsq~bMJCn*r@%YLnWupq;H}X&4u_JbM`nSA9tnTR+lG2PYWFr-lg9zx+=$#7fLunVp zOGgExr?Eb;MzL#dw?u%N1Sz=s8cpraf&3FdKOCH~Bif{QT<_rLm@9+_2~zn>WO3l6 zap!vs!vlKP@FYpzKkZD&xCxQk0~UJ?xojdfFT?9C?dn*i_v&j#k(^zGD)!o6z*5Z& zsz6+=hTCLkOvB_9KW|yXsBraz93F!phex1j;*aI^O?BtK6k(01oy53BEwn^~5X}M( z6-U$C1!+BwhXaPAZ!}26;cA#L1@BsEju7(wHKqvxSwx`xgJ}^Cg+JJlwWR%2_lxYl zsIo%+=IdV#4GY7As-r%xE&CY?t%RI|;e0t-&S&#wk%M8%yn8`b+f0^&Y&2lQjqoU0 zo$`#>DRXY_i0d6~1uL&)Lheg)84HY<^`_@8ZPCtN49TUS{4xl9W$IssWRI`}GgXci zz5TmR`*(6jc(rYbls0JLEGDG2YjSzI2mvX*J9}Z%3!6?~wh3+d{*tZqF@L4PRXfv5 zyOM*p2w6o({1$w(rQNa}*W8-6ZbkjGS(X+Iji$cVc^)FoC|xyP#_}2$lVuMuA3I%A zw4pVibhA5Vxt7I^b+wDe-jlTn0h#3gz~;0~0Gd$uu72uy zPmKP8Qg2ciop#XBIHH5-5F#&P{r)fYl4qlXCE#3PRT#08^Kt6BF!a<5+!b0qJ2Y!nDdc(OixiPSuu2k@*qZ~fHCj-f6PQ)0xhF$q zM(1<-Z{zHB(~fCv`Un_b8))~(d(w`q>J}ots_G6%@3PwdhHf#ZND1huOBS774aeh! zDL|wY=-SfN8z3v_k(hoo$*>Nn7Njj9Ml<4<_CrOlV7+@T?x^R0oR0wfBdlsqNnm@d zWw(J=6>cbV>RoLnGjO%L$4mI7Z^5Ucp>XZ4o7wQC@IOIc?P)k);hLa zEJPWy$3ia~3o)@2<5D@!rwvig8We1R8n`33W8|3eQtASyAk0IYSJHctUlb#V+dD4i zLa;T*Hn1)-OnUq&&0L_M41A6UUXNIN#M&cPF{@BLzC;NW7FyQdnZ4uVadW8Rw-YuClT4Sd!ySEe4My*QAjBE#Pqd_zCjncJO3{?8AJHoS?1;HBP{@pTm%NqL-> zKaMWrwOF_(JxTNIs*$0*AgOzf;cAWcOmoiLl~gR^vlGLOiC`vv#Wh}&;y<>hpUr@PrI+Yvm&jE%ZQr}qOl+Pkn)T`VIl z%?JpWTx5+OJi}*UBtb4)OuS3ZVsH`*nqX!CZ0U)tIkgr<_=D;=qK1)ASj#4hSs|Zk zOyJTtUXYkEOy(PZPXaiu3YL0>6sj4szESA?Hnl3BxwiMV98A(;Jku{ELkVCf)JDo^ubFEtg)7}{0 zQgaUZUGIJ(56AQIWH_D9riaer#yjirve)mCd(Nhf|{d{>`>HDp;NXnzBW@W}BFh%fqVAEKKxl6eH$^LBnjlSSvtG zD>y8{@Pcmxx{DGer@C>6rRTo_%_ZKMjFf~>q4QgqYzP082igh(qBtSV*z4#xMQn8R zQ_Vi^?+rK1g4xCm$T^~GN-iBS&oq$VGG>p%q?Xz47A4XzqY{hBsK!)h!ixmQm3@m7 zLMQq3%w(r;4ZrCjX7$R3*dc^)ZsU~INnp9%8ueBBW9_2`5;w^;sehC>YdU*m$V)H<&PWk*8j@jrv?5ZBeH-`_VIFzk0V}V$0o$q{HTmk1o5maM zZxA-ea-%^T%vm*TlmL&T<$Khf)$)vMO}9@Plr)7NAv+)SdnHV}C(OeQOAftL4;@qi zd98P*wFyA8bjrD4ZlI>tfQ>GzgbC|G^oH}312cb)4EO>C4P@54dJBI>JG|BY>Uf?B zvq~ohrfY2-H->f~^G8StCRf+?1j*@WG^I6SL572k^%0GCFii);MR8!S*@Ag%*F2Dy zDE%E5{|hS1wD}}3LqEGUm*zJel*z!@AN&&@)$8^WNcKmKq)Xvsg{%&){XqUhK8qAi zRI}6IQsi*3%r$&d+TlF^mW3xJq-JyviuVGiJec3EnP#UZT3!3&??=b~?w0ZExA$t@Cg@x*0Q4gC;3E{`*fKBfX%c!WlL^k>HF90ut@x zC$a-+@-ojL`^q=hLeeK2Z4lh2@2}p5(;TD0S+9?-OS#gNiby^;GCG2Ckv)|JTY`_7 zn@ZZpq?5ixwJ8|&7MfI_)M-R8%_(@Y1=3L4IZs;f1DZyc%${RCvhp(ac_eE*x+;R~*?`-X7B2s=}B1L;o8Y2I4X<+}(!P=V|2Dfs(I{0|w}yhU z@Q)u|eM@Bu$}YaO;n(D7WpDl6tJm^3;#n%lIaF&Vq*M((s3@W>T{AaJMI)rOrvtf8 zy(%3jrbTN{J1+Q~{1^HEL7J2QT>tYQ{|Uky{;9FY-v@teBY(g@09unD`~m)bs{vc_ z($;j@g2NFMrP2?M_nn8sVP$~BI8&-H!^?IiDZ@jRXwat6B$M+V$8i}mqHOMY0&NP| z++)&#w6!A6Vta02dIRRJ`wFLUbWPW3{5p ziKuIZGHR@fs7ky8CDb|pD4b-i=#oovelCEM3HO@z06JI0xmF@BRT+y^R)|T;0+r~} z>^syvtdX7}y8D`(cZp`gcyyw3h+g|H@W-6|>00~z;io%pN`M3s75Fgw#1P*S(M`aX z4(K;4beo)y%V5?GK?Zx>VknltLEN$`I5*RLP?_s;tz;22MnO*m>E9cc^OR-)yjan} z?}Om?HTzj5k(EnbBPb=iFr*qjdD=Oa@glh-5ECKCL?@$uwz&u~LInHEVhhF!n;;kD zB})z^Jm8!Am&pS#@E6JhuX}|fQ>>z&crXx<|^0d)mxaq%R3tP7Dy#Z zHha@V4AxyXI9>vu_SW+HdG%5ZzM)_O!5$Zm_vXE2I$Kvi>`sv)Q6{*0!J)|g{)%itZ@nWzXuyx~u^)j!-7-s?wy=eQ8Ccz zr^$`uZr^4&T)gQ9?|2Gqply%k zMjBsh|N86CU*3JW`}vdh)4N~(_iM;~82>ivbjzAHeb2BSKy2{!->?wDCkIrrXRMEy zcQDaw2YEUNrlCZPi98d5ypmU<6+OochnLQ+kMCXcA{j@FGU|GTP{vkNxEsiHUpXxBONZw zUL*(7q08=SimGPOeW=)t5wir_n#dg5py_n_YpAM2Qgio41fsS+q0Y0Nw6+ z!R3L2S}dkrDWLj+#^OeX%VY&SWv4tUDq`Wq1vNlLrm>X_C_>_^7T}k&(#pXe?FRtf zOahdY0C-G~l&W?ntVSwxnI?VE%9GzMW4UowKI|OF;HnTWA-MAZUqZXc!oSQBRfB&i z!dn4@lEp-#=q{1_n&X5>+%rbY(`xTf5;+q3!|?;A=4DM#Yc2%ddturYNT>#g)bWfU zL?X-=K?Mk}PZ0_}(p!L5qwZZuG1d(sScW^3@c6v|W&(i;up1$U_7!QAyf*apj#hnk z@s(|?S%?W)lz;x?KXrS9?mXxZV}eoeiKs~$nvJyP{LXP>KZC9zQ-z`PvFO;V8B7?< zY)&)UKpq;?J6QS&27w>A_>}z6GIX*kyjXS0If#|E#viaH;=@f%8*TYSuT(IHMc{pIEt4IKxAgn39 z8y&Z(2}aMTVu4kjuo+%T`rwemIY`pbO{8tpOYvak3@?-MY&o4T$BP2POUgpiRl^Iq zr6i8(8A}ZXz4=lXE^~{9hopl~_GqGvTXHlVv=*e6vK{nNyyg0erOjcO;?*dNS?+0G zyV{@%Yo8&MNhcACnv~FNk#?kQBLkw)=kgduMT+PoY0ZKZHgd^}B0QX9f==Ki$W}+? zKQ|3W4t*{!cfbo*vU5MJTFL5M@w~0U+y%~Hu{O$O0aT84&d!-!map-AwVX~TvsDq; zNur_)0y_ySK)?{p9uVgsZQ~f!{hcluW0wx2AIagxcEN?hpj3QSizw*qW~>DU@fB?f z1I7DeB~?4+B_psBJp?KbffVJHPk37))iEfP@m?MhDakpXLuzBtC~GE)AQJanq__xw zZTcr|y))Kd%LA8)M{`nY(-hi7pdIZ^sf5d^Vb$P$fh%{mPABa@k-Yf4hsi~HFa`q+ zbM*5kcUj8|7>MQ2zvk9KfXjHPrMvg0@9OS}qw$thu=qx)shXJc2)BZCLD2Nx#Ih&* zgk>KUEqkc~T+NLtIht;nSj73PcgigXGP1m0l{s=8PJ?@W{WXF%*b{ktp~5>iB&Q)n z!AC12gRG zezF=C*h*4Hl?$?!@P!BEuX^!2Wi`QpHZ#KBfKp~}_LcW)0yF2Qy|CA!2E1o32xggl$*w%?pJ1v_CS^`%+gB>~yOG;APLyWR}sfQW$ z!Hj~b@1aI{sG-JhmaGv{n*bX0nLNx;;V~N}sX36rMl1?3=;vht26?=t?F1qRc&~j+ z$=O+u0v(IRVm_IS#^WNtk`y|*AkY!vf{3{U*EGGJokAID{*|J-M;qm~P>(h0!y0EN zzDFA6k%k)o*CS!t5Mz+Pz!Q$f7SK8wrU#+yPo`yQ&U$@x+Y*hrL#+puIR=+Avl2t}NzLV$VaLghy5kAClGF$unuOGu$Y;HU- z_Xh%Lf@)hW3d^E#)d!uiXO@8N_oLyS8jNU;cFPP2%gl{@zQmNk$h_Yhh@r~pl#Oa$ z%V8ke7d~x%i1?HZvO8CjB0H)-5tP$uDlR00^`TLR*_thUC$HbCUsh(5*rb+=jK4_N zMe^`a7pIOYxWXaTo3Nu7l~vZJ7ntP)ri%0(c!`uzfZrt$yXTvsJ-IAY^#Qi~I#vWWjG4W3K+{0OSlm=&hrpz=53S(&6BeoTcc8nTnTHtYTZY5@+N_jWr&+y8P{zT@n!Hm3gg9 zy`{9cY#VT?x=qN!EO@nle~RHO_N*MdQgg#_p45(^s`%j;v)EC09p8Z@$3Qm}FnTt~ z35s+Kr;G8Vs77WAVs$mjOh5V#_?NDeaKrWh8ilp0>0s4^yc(#o%^Q*TWcT~oNz0$p;N()`{Vl5Q9QtNI2 zV6`VGDjEl{URbjeP^|WA5r`?qFf=+Lj$`=juAh|+d9;{Lrt_lQq^ToQe-i3XLj6hT z`JIF!sQZq%aQU)AFqMlOtK>p05#8HY9 z)6~I+j#cDb1GI;tU)NBUfcT?8j&J#Lr<-@=w82D%4@V8y<50~Ni%9Brf&iKd4GW1G z8wwyjLJ5)1NYpi?bg+z6gU0Vi-GZYSp`VEE{I;*^&qB25K|!UdKl9|7&BKCTxL*(5r;AONE*h7 zkR$?QI6=+97&=}N7-Jv7M}Yk1M*9-|6OZcD6T+a@H(KQ>@ED*w=%4@i&*4A+@n2ZA zF#>vMB~$y6Cf8<#9%HdaqNu2))Y{9{YA_lPCc~l~(uAHlx0QLxG?DUS9euh-b+qwHZ~AGZRI6K@a3B zW*Ed@-e~X1zrEm0dVi94lc4z~>MCwu4M2rX5=7N)9IP+2(;tn3QD$7RWKMGp7cCKf zf{T{LMD(JCY0V>~j@cQJ+p&yQFX`o|LuTTQ`Dkw7whr3^aTzie{yKg!Cppn_%nf0~ zCD|2gf}|Lh^9$U;$q8 z$Z=NrR8QpTC-RWsry9MO!cKVUu5JQcC4nBMYphuonZy%$5UU`FBSKCyur(O1P^bp~ zn))8QhDAdT?hXIR08fKZ%joEuV3GgBl3$QgxaG^4f|1JI%`E1t(PTbf6-Fc^FLAnh zHv=VJ2RcFGJHw^S7{A8gYwhjK16l8_X@dz!W4~avw><1o;Kv=1(h%sOBQ1hF@jQNxZO}rdI?Dn~L=kJL z^}I7@2PB7VM&tQ(F&+&Ikxdc;br#vAYnzA5N!AdokKsCYM!~1bn#YKiB3M|F$GP)8 z@6d~KJ!jAu=OwtUg0IEifUqIZzgl$oLJijGkU{BU4jDN?fWq1NuuMx7Y&)wpgq=In)n4njn+snZR(C`;Rz}I)5QshKy&N#q z%DwnmAy)Pt{N8aaL$_7WY;Xn6+UK|5oxJ>35{Ssks^4Q8sH7p7J(jlzD+owT64s~)`qRSrbB%l?+webx1NSB`r)heg{I01d5gHR64P-%MJpr&7=U~|u zfyMc`@9{-xe6dgxA;=bKb39n)TK5evg)zcc(l|qeL_wSpBd}4d5gC68yb=6bBaFA+ z86M5;MWY8hfhY>cCwDo$8c&DQ;cPxDO7@h59~Xow(u*2H7qG-EJhbcnc4_>P9$VRQ z^^l~}wyUugTT>O-Xx+6A1+j|GeGf~@!xAMyt!$xKAwTlQckDDYiNBVICkjGZ^9XGe zq9o>_1WchVXsm@B?Z?>P=sSw~{@(e9X-ZwkN+<@*6Qti8G`q;-uj zR{~37YJ7t)qQ8e&1m_97L8(3XM*B=2u6;};W%K+)o)I+5QZpF8A5GFS_W(Q`tP}i1 z=VN0*cD&p>4S1kLc-R3U(6Zuv<6JSS>9EdGN+V>^9UU7qGP60h1oMP=L=NhW7sJ(P zu^KLm3`j{#ctKF_A-xeU#gddk`lXwc%HFxx0pNr-RBd^$K!i0F2odj(UN(+ut)^Sw zg7nC)JhD?0%}Eyvq)H0U!9#fzry`~^MpUEN4aY1V=76f0;F~Cha@Omk>!E}}<5E!f zI(CZyjlf$dHv=!o{x)2SkT4`vDi2k?Smn%|NXCFpm#g`5G%JjhNJ5#eA{3h-;JB7Y zG-~qfoLxpJSgu8f>xxaH#z*!jV#kZ%ceEfh?!L-cGcqIAO~#t*nd2ERy&tai4m7BR zhSEHtEEkcqrGOc}5dc>L1q&Pcffk>j)Qg0IW(|IgVs&MBe%f(Yv2!xK{M7yyV?f1Q zW33HB89i-Edl207^oY1Y`xuvpcp0@Wi-2L#7%eC80BJjZ%IP|Xpk%4}HW>w_`ps&z z@t|6?3^Gu!mNxDS`P4K=kASHSoZld^916IZMxrQ+vr{;5fKE|2$xPM0|wJP+7p||ouEi|Q0Sju!o+V}rK~?3Cm@7x03Q-Q zDjGpUXYDo^a1Wz8#i?Dph`5@I@3&;ugokNAK5>>lEVG!2ECWc6oTz_as?|bNNmv#B zdWux7xPN(-8UMBB(FiWTzrtZCA8bPr2VIDsA%QP(5c3?HP^vJmzD-{KguI(jn3V3kaY?`50;S;VKgj{fzv6p7?9Zi(N^p`$2 zJ1;~IF2_HPKDDa#_QWQdt;fILvPLLUNHZ!NCi;^2-bgbrl8_R9!CRvO!oSsbhx$j`fn=jV(lvE36F+@3R~?kcnpxHH-Cb4SmMV-t&|_EHs(34 z$`Fn}_PTZSl>c%*-X<2;*PQbJ#Ap|Mu|X|FJ1G4NOhb(S=4LxWKwHzH&t*^g62=Pa z@$%!@5lXY?j=38=VvqL}}v0`ZdD-C4MuS2{E&gk}{Jxt0+E`8)=*^?FZ3Oc)d;UO0VijGfyW zvLv+-E^_4_EiH{MlWBQ0EX@?XHa9$+FiYmnShS)Ch^|NzDZ~=OV*c&uPF(CyPR)my zTI(s^$|X4P7v%D(1fP!8F)TWz=*oI0!&~oov#XO+QG#EL>aDprZ#_>Qxs`8Z6Cg># zUsLNeD{Vs24J_C_zgs<{WooOGW|;2oEHED0@t+#W$v1?Cq;~eih`=#KOFmD>)gcdq zr(}P=sp~qg_DE6JPkf=OQv~f!vus4YK6%gi)4l+3M}9*0@cR&_td2|b26vDx{#pb84F2k1+pXJx z9s?xG`|C^(LQt6k^xNIaiOrjs7>O2tmwD}=Z~&|v2%C2ykpY+%~NunvP z?FWtB(u$!WYZ!e#-N-4&<&GJ%lYVEOW1@)oysc)y=U=_fzonI3k{Otq1lQgoY)n@i z?NuJk>j)MsW`NI2&QThk12Nnrg6bHV>~x6R=f9#6?Aj-tK^dpB{(TU=)1Npw*o3;P zdAo;@ri5@8IzglZ`axtutkQ>3^wp$?^rBE#5fPrsK*d^SHty0)eRC0M)e}cTwL);A z&}0V6MC5Oi?OB9j(zeZR@VrhL;t!Ca`MMy|qjCTF z23HVe=k@wE_NJ}zXFS$#CF3&7hMN6mSqceh8Zr4?3&1B9P#kB{p*yC43XD+}-+S77 zplOYW*Y!oz1Fd2_-hnU-MT57o@D9t}q#ga*H-X~^4?=_cvysTPe@ns|ql8)xjrG8b zAlolP*H4vlk^u3jeQfCM)aUDA8A&&@od4vy#-^l0i?02tMkhz(QO+zmJ^^ps_Bvg` zhc5ewodjW8ljY?xmd`)fvTO$O7(tUqVH7}+(-Tfdpw(HO3#$mk3Q;!6ftEk-*S-u| zhsppcgg$5Ut7m`!M` z-0gj|IwarV6nW|ypFLXkCVt4?*Jey${Y%KraSetZj{rNpYH=H%3y}4B_mSW?fZEk9 z;U@*GDs(-OT-&A-k?Y`oYXPB5cuPf#DP(yKx#p#c0K;bU`oQ$zYNjb#NWcg&=o#Le z*2mM;e|Svmu?oZ>P(#%pN)|U@q^3^>Gh+;Y{G4usN~KzWrRLY+W4~96@PqO7*q@_4 zSN3>=x5tEwSGaMJa{$+8`ty}?4Xe*v%Y5VD^Byu#H9oU8`bPAQ7^cUbs$ot2dp3m7eiPFe z3LF)OHw%bZ7{)fZhcW`>mv_2j^zCNZw|ZA&r4IaU$^MD=xN&$&xO12KM%SUU!^XE;HyQ)B*Xka~ekSHEQ_0x8>dVxo|lccVosUtI9`f z3-|mS$s!Fom^A9#gv=+tz1_6S_?Ve5C}^ zMpk#YGlU+$@sDs2aYJ!R2SAO-tf~t#m6?7q$%yu%Q0Q%o?s34-*J?^rtKUiC8%gA7 zShXz1Lq->-YV6Z+^)^q&9bWn;wfDIucY}nuBtuJ=RWU<8ArrfhD6Is{S_(urSY(`_ zcx!V0uM)8fTZejV+QXW66Xidpv@YSR^DXmGD}5$vAh8918BQmPOxGGK_d(|t--|b$ zMKQysy*^i88Be?B`+Q-Mc_bhdLjPhA^orcV;KW%31PU;M(?DxG!cndqPp!XJ{=@AJO~ei4BDf9^@g!hG59 z)w;cTJE=<3W7`Jio zCY0yoKXrhCZ{4CVCra`yf?{3PS^X{4`J!D}K2X=Kjc4v-(Vr||he^bXTqg>UMVm8W zFEBTXN;-o|UrFciu%rYi2`e-=rU!%CS#4c5TtC;Hc1t;lfHRNvvt4Olf@4EW?B4Rv z+%RaWn88He^;><`KALT~Vk4QY+qBcY7;O9d#qL|O&MlS=L0HV13l315SL%_(Px0iW zs2bX2-ocH0>V4`xfg4Vkxk>5+&m+f=z=&qNQEEntH))mm^Aw{HUN*TqtW=vrCUZ$Y zMHadPU3^o*ASW%**D=;6wFd1x!!^1a30%vlWeFBime@4Dt0-Myt$zMZ2~BF6mJkCY zY2ex(#GYY%%WE!#$CKn+5DK%DS_LvhnPZ(FPThc-%NGW$?2HctsJKW1YV2OU#8{#B zi<>T4mZS?my>xq>BuEZEA@;j{0kN$SA-8N*P*c^Tbhpt^*)9#CT7wC54iVG5Y3Ytt zhEwepGn48W6c_U2nwV>m^XARM@xT5ZdV1|1{hcf*$vgVAUR=$paELICv?uxm`7Nbe zMD73wKV~6aHaiz-iJB?Z#nSB# zhxX{;o;_=Bv>3AP99e5BKjWHJ@&N6T{Zu&#|4L%nhZ*$Rp7jr4H)E41u4~Duf}^p` zP*3(2Wpgk(X6;2Au=e1)juTPNoS@iR=wDTU{rQfaY~yUF2Jsy@!;(jU=RTB54=!5y)xv7Y4E)9bS=jb2y(J?uput z3rH*mjepdK?=!ifsjTOx70e?PF*XHCgj8!yij=QiW)LQlqk;(D*XAAv`)74@Gc^?l z_Nie99FCTnDAWqG5R+g6-$?uh+zG&|n7o}VEXi$U z{UeX>`}53Y|3KOz;SxaA(#{jNE&!{?O#R=1H2(+p|Br)x-fX>JXn~)j{>`3i1=-m6 z-!K?u5UHKHzyURqzwG_PMR9fhrNk3NArWIG-#Pf`$F#R6Jt5^Ptk2IM1vPtjAf>0PLAd3pbaP0;^aoAnV7hg zL<1K6w$dq)3$U9TDV*2swe=a}2w#1v;%+x<_{zz?*p}v;1A}J$oTNc$dqk1?mEOR0 zk3|`1Hq7M${GBkC%7U@metREuT0Uhk7yaL%Z``tg1$3)h=CxlW+Z%d8+hetqpT}JZ zG5>0S#z+Mz7A-SOvpzLBqEP^1HK&O}))n6hh}Vdy`qv8*O+=s-o}C4u!&h9{3#Qyy zmF+o|5%XhHT;gYUjgfd0`7)H@72*&V$Hs{nw+E6UT9$o`F51X)M{XldAp>peZ&OE^ zX_OpxX~Fyv=_w&3y2QdO;3W>>wKIeW3HMqQaFlZ`-bLG9Y zYmP~B2J{PNQo0wLfepr4KTn`m+OIRkME(|QvmCxmRpP5CE=#5e@9jTI7G@{PBg#$x z0be*HSpwlrRzq0|nnV_6sh~Vfk4h1tp2U|E6Q5SfJxC^#TFpth&Y<{F~YKz5Bf= z{El)Nj*B=VV#0F7RBE4EdR`iEH}q~ah$P3p9k0mM$~RHTveCeYp~Z~7y_C&FvZWHX zloPp%)v|&dR=Atd)mViahD=sLpo12xPE2|NNJ&Ek{$K>gHY8#zJ@za~ij2QXud$2^y<98xNi$H9R9FuSxf!E+XIw zroCFd2TdJvWvAPb{ARqV_zR7*|L*l}02$l^R3BJBm@7^VUNa~jR?;UPQV~zvH13bI z@-z9xsNyVlChLCsrFmM`=C^iE=ii&OJ~+{(H!$!beWziTJTMJ)b^&&dF$1c631+O|)&S z=FJPme2LOseMFO4l=`DD#5>j*rd_JQ7Kgk5%%fE2VyVW}kn&tkD!TQNI?HSiK^AyM zHnd7nJvERjN^W1ra$EFTQ7<)6^|QpM_~yy@l;=fu)2Y+c7={g(hkO32zR<*=nu9lc zmdv1H4rr}~*XIEPE9uBCm|aSaL+FrNAg*HYx|#qrhPS0bHU9v~O&AM(*>JV9o%?j< z04Iar2MK<1Ow(#fJUHFlMI$|Jz4Fjv95;Q`v;F*XM>DVHKZPwf0Cj8_w0Gise{f4s zpGHS3f`Y{;A^;Mt1=D`(v(pB1kUZgfJTRd|24cZUasmUghB209qX8~meEk~i*!PX; z`f=65vGFFE9S}7%QKvTl&)hIdsvLUKp4Mi$8@>cp6H;+GkRBXuGbe3iD05|kw}-h+ z{zVcEJf|dGXiji&972?EMUD-upZIz`Vp2{c3HtN?E%`9DLB zDNqXjV2+F#G&tFe?*KQ={QQRLnk<4qy`eYK45F)AtrcYN4nQG-KooTF zS^Y6x%bNX{7x}UT$Ug~1CAg80#7$MK)5{6`jjzW~TK|XMb&vP! z(e>7Dncn!Io8Q;P=nvED{ll)E-`m?kSpNq+9v`nz?#mdWb2nDCPEvM)j88ou61t>p z>9WNxS5R5bpy=(V+kh0}(T(rd{e#@^J$K`My1$%-^^dywz2DwFFdbU|z6~8dn%08D zmv;Y8L(_u?iw}+UI|cttkN5L!CGN%-!~4}OP>vUv+aop_Ms0+9+%sLF%7niPdUrs|%n-1+JoVqBYO=>($}b55m$>>x6Rd8$29h# z-_e=x`}m`3&XUpEKjas8X*sz_r-k73Vc7f}?4+BSqYm5bl309kkDX`h@AzNGoVsAZ zexGk&opERb-Fe$xoiNXxQlWH3S%*$01oeL1A3&zt|Dlm@PaJ^?gjk;kpoOzB53Dj*E=`9?@wj@@NRtHuX}0mdE0v7(n*Gc-QQE2c)xJ%~KI{YZf?AeECfW{bTgX63>0s?s~L8;YoCM9e=xZ%6Vgynb3)fQ$pON~155 zl{FacyuHXV?IO{89ECKsa}88u#b}Q19z{&+q*KU2tJ0{;Pt>{@GaKm-c4mIRLb6N) zzw|5iAIwd5lF|62jP6(g;fIAma?&-HR=u$8Azdnt!WmA(mE=#eFb#KaH9bF^;Kuv_ z6#g|Fq4jJPU0d_B%~GqAgir5<%RWV)fpk%hGtI%ij>hqrObnG@dTzqW({<$$BW5CG zkzB&WvuVY*=@Q!yA5XamKf*%%-;bo&Qg+_D#Pg!8q|8;Dv|!&WI+!1;_23fCz0)(@ z83t+r;hZEbEXIR|P%_d; zd4&4WnKN%@Y}%l5Bu*w=W|K_n0xThIVG(((JY1}#M|`=odaZ17X^+gVAB;jF9X)Tv zzf{;g%HvEK3A4h;mFc}>KrKF^Mm&^KN!d@c4=f|3t zPj(gq84Xnz#aXUkXQe)X#S3k{(L8;+&e`5GJLqv1`~9hnb6c>8!*QhBz1mhiR9)w*llsq zBtb94qUrnWHMIq23F`nV)3L1xq&ZoknFqqr*ED(T#p6uUIgoa1)}N`&Rjav18CW?u z`-P&pV^~eW;&`Db#NDVx9a>@}Jo??L|8h>ot4Us@Gu13xKt@! z5U_$mIcyfoKWeigmka?(#)bYanKg!*OW%;`r7C?vDTYHWY|~ujmFEu&kkgDqTW}Mp zD&-n8D>Jwk2s&9LGnIX-$9qcWXWQsj=*6jsre?B@vT(4fb*Ej7_hFz%SIj1&`qO7P zAf8uA4rsuTdTZltXINCFA7y_)cHQOCIz~=%TP>>$Q(|a9NFBmT7vmOx9YwMG2+Fd9qbu5kxx8kc9|x0itY7Q@GVdc5sXeDwje`&7MHJl)z5O@SH}C0Y>?i; z#KnhjX}nP|h7i~LzDsdRlD?|pUcH3PebcYwiR$$kC`(Z84gllOedV~}9^FjhNT3=c zq+$rP%9fbW# zS}fp0d?G9S7GBH?*W^H~h(7#f;M+c@+Ong1Dc#@{(H<3qUz~V=bU6FQb_+EdL;@Kg zs?)cltzca)(5p`c1mK}OlsDQ90C5;5n_ z=Md2-Ty_7dt=y_%en)c5X)nwt$*)fkyfabPb})1YmE@HNFj@{6R}uk$Vs&w_{c^<2 z?Y&`%YPTe7=$BHe1ng~_HT&H~mHJk9kK-y9Ia37y7v?M!^(Lj!xv(3Ie|?UIMF{96 zHis|_C_4TG=W$cljVxmz1`xAxjMX8!-V6GkOY=*p5^OA5bH7N`<7|)*BFML1b4-g> zPTNg8Gta;c92=;{Q!|uENW0{ICobvBPv5u#-$BM=G!8(@|rLD#=w`~ac-Rb z{SqpT_f0)+Ev`@GgDTF3+_XAu zB>GFRn8yMw@~T(%oxJj>xpt@$+rVJtRJ1i0CeQf?t60RVpvxOT-<`l12j}+2WoA}e zym%>c=ucjdXHC#`17ttWMeG`w73xNFjp$mjy0En$V+-e^O4r|U0>-)D602lK6`Yom zvM@gb0lz9et>s-pmv;^B@-O4aQ6M==_op!L-Kt%GS$u!fADv=XQD z9805I@tl>008qE6g=C%NA^Os?Iz7BLt+z~;YD|&sM?!~WM_kfoj4dH~k3=*vvHae~ zSfZ8jxG|aC;^VNCP&+)k6dat9!&s|aAB@$*3ZOm5AkJvK&GcwoiznoN1f$6`lLm-``j`PXpN+su2xLn*O&#OH*wyau| z$6N!M3-9@P1DVSF<1@8XU$ZGii#eh-Nfc}zUctbe%dIFQ2O7<4>u{^7%`Kv;w?EZ3 zj4RAX(essp>s%!3<;H%M!g7a=0ctfdEL^bLxUiZlCFB|6 zRgRdq>JPvBZ(Y2QJM12G4zBjjoO2WmrlyOGHTe>D8%%n7>DY&$Nip2Ll2CCZnEB^; z(4tR}4uUqC|8SAZ;vco3F@fncVFLj|PA;GVG{L)lQQY8&Ko-0|0S*l*H38g{m3|uX z_$(T(>EJ_eaDnk|kQqYq)f;A;mOHNtdYR8vJq)OCG$NNlJzO}uJ<$se%)LV__!a8w zb%U>-&_?Nv#dMPW#Mk3xWj$ACqqkV2f~PHUA= zTM%#xx3UiGxIan5&J1)NN-}}@lS8a$BFA@y8B&`n@ku-|5d@E`#q+oq2@*_W!uA}V z+KRYo#-K~&m7eD7SO;1V3cGY3>WVz4VM%i^DE$h5`r#1);t2?T-3F#=Z$=-Q&{jBa z@&Lfv$Q3ptTj;b(SYY_x>=;$oIS?XVK^6MNbOGK*um%nuG_46(*PD{dgg*}_YVEu5 z9Y7IuL>ZQ8uV$p(akt7;Zz`{lS=;=hIarY%-@>|!YA=wni3`zf@S;?n`@}%*Hme<0 zjg7)Dp+~D)Fj;Xuf_p&mm|Au(yBhSO?Z9Lj=XZvT*k~kwC3B?dPWvdD2TF6AM{+nl zRF7BThGkG4oOm>FR;gLyX9J!U8;Hkfa!=VzzPkNKp zZlJRD|3+9#E|i_{Yo8swkmFKBEtoP|A+pwOi-425*~p@Nd9z^ALDx+s#qS0(`_xzK z3r=gUUsFE)#a_#bry}Q^yIM@Uw}$czuNA+MSBDDtm&}gh2^>fNr}QU|FmAVic^`qG z3f)0C!V=0N*yxW4dbU;3UGjgYDD)yb>uY%YF<^Px3(OA!eEM*%G0g|I5RvvdKFq&K zfkvy1|F42XBCKcFnnNdsOk|80)PNQu}=J1Cu!@~`>m(_McIep;c) z=@sdbLKIROH#{XP<4Xj&;-}11#-gh^;%ski ztke&7?6GFoQM$vG{3dBVr{#--0B{AqD{R?6!J!GcMm`4MkC=Sq&VoHOup`%Vuzf`o z=^QcZ+xD%96u58UZV==PBIg9a;CNRt&$QOYzx5P|#sxfBT)094jw96vooqgLSBrlE ziCjAYGr*ot9|4|%qu?!s)g@NwaN=^j+pr09AhNG0FmGI=&;#Ib<(h*oj$!FxtFhiK``L__qT&ZV2o=#;ORbIzi96!P85D<79vf0SK%t0sJ0#vIrCo=D%iAbQB?u}99OemwcoLN?h0W)|?*$t>HjIPQLxTyitP&7@wPRa+ z9UUcic>NOTxD^#sYHl*{o7*z%8%cxB81@qfcvTh!F2uahAJJ?HM3`W5JaBb5!)LE(_fImOBB{m@*RD$H|og<04kFodZrQE%F5K?r| zG18F|Pwe1ZA#xzROB%ytOO9dOB!yX@oI_fRqe9$4Y|=d6fA^2nFb(O;d1b@Ac3^`% zUS621{wa#8^p)#sX@ouA1|Bp?Ps)k{F;b*SIdc2BNx934U>CQ_9iRoqH6&y|yUDEv zLtx7`rkoA4BC>dv3;mTzmAt8|=rKX>nD}abuW{Rao=Hd(C%6)>N7+|U_Fh0Vty~*z z;mzZSQge-%g_U+Q6GyjNjdj4egX7`)Sp2k%<^)%#kM9nrXd$D1{KPPAH7 zp;!AMsIJ=0(Y%ur)>xeMTEFT>Q$!QPS22pf-QYRQgO#2e|3JX%7k1YL9Mw9k==4Mze zmA0%BxMhlen#+lVg1O|PHiOZLW?S-BLL5%>Rg=+)^fC%klF$8@f;1E~7>bb`rLBd` z79te7aofR#l4uooz>u*8_T*zsg~B_k%tht);Nzw320W-|+6fdPwW@Z~XSEDR{mvWp zrN+*aBk5NKt`w>$0X)QKJKT9RqJKd-dh%L}ieYHeY{ViUW2ZG0l{2L?u^c)@kppn% zvt-s8v%(|lw(WuHXyh0M9C|5}`s*%I!Kq~80;v}!Za?c~*+x9=@NkorsxVX1<0mAGjr!Qhs zZX84d`@PpNo8;MvTHydDdLm)=I2g@nfidzQ^N-TXwG9in*gL1uXAy5eKz2u;-nhgr|Ck#CZjvfNP^j*e%SXA^as&wq18ch8 zVQx041_xCK|YIb(v8y4AN$eoMjB;R}Vvy+TLmX?mr27Jmu3d5P(@$0SB zy_jQH@&nVf7h#1_*y*U=4g3z9A6KX8)OXE6*T%a{M$99@=0gS2yV{UD+ zL#lZ;giQl=?P9KT+0kKg`l~RodwdeNxzbRg(0mBa7aXbW z1#GU&%G?^KP@Y8|sPa*>P(sRkp44AVQ$PiHkU@#5%jM5;VX*2x40T~XhOHsW5tmOf z33Iwt?TAAs%G1H@7_?Kf3j-4ft<3Yh&h%ON!V>!M)=?uGxP z7u=|QHZb!d5!3+Sl|Wd5V3Lf`1Vt{3u}PnSh^bji8p-ruxkwMyx?nA0_Cm&ZB?9gj zSac3_E~xIs%yx|tWZijlX4QpG7FN+6kLgzPU@qE(L{i?G6CjGmYxdZlJlto?nT@-h;M6V2oa`V|*ySORLygIaDA{?K*&8afRQvEv|v zlq#S$J)L)YQPejoA}eo;0^z5xM0*$f4#Kz-Rng}?Es%wo3V-GpqRJsZ!ml-i4Huja zT}~@NzrAFKoT5174L@y9rAE6O%c0q*To7J?S_mYf%JOaNs$$M?sJ|AwHdLC7j@_0B z0JXa4O+>1$R`a53wuQTFe&2SZv{BEP*BbjLi_JsK?h~6ktdz5hNkOS%)rD)p_|wNF zH}n1_H1ia=hklAe4Z;Pw*!Bopud*dY<1i|q)XM4+wiTq_3!p2u0yZhvSJRM+u^*R;E#||dx?OOQe~sMq(Kyrf{~u;!D=zt z?94r~2u7sZ$wQTiT)!K0XTysvEOpK1FnP?(FI^zJBmeE#PR%_`_EyH9m==JR_G&_q z^+JISs*saoBuVSuaBNZB`*S|wlOn?_`5?($r{qlSJvdO;B(}hGL*vk%L?+F93I9z2 zkvJH1sfH|_my=N(WW}91J=b{{VLAF$Ca?N}--cB$6LAu`=b^7I{X3+#fZJYaw;747 z64P;^W>B`5jUL}r|G)jer6qv&=9e&T?8(8nJ!g(gL5sJ!FX|S1f=1Nsg$H9`#TW@8 z8aE@?9|*E#x5@1q4rKZDRu@jZ+SJLra)e`&JAE|+Ty<;#dXmb}o%^RjWgTagaZUYX zpIcz+xJ`_w^OC}|hfsb^X6>|FY-4VNx}6Wy^k|vA@8}US9~r%Q)SSH7sxyg4Av4>2?3C?g@4= zwEjxZy2ZxZVqH-<;75{bP^Rce1VY?$;;W8p z&avJ~4q8~3%Q+~$O%!zlN@DCRdh)4*mXyn=Bn|5vIkM-jb=U~Opq^nfB&_NSt%5ll zRbq-hTX~=t_T5p(&6@g4JadO{Vi=MZhD%|x3J$ejaC;aaIYd{s40hRmQoI51c?UY1 ze3s=x?wqykVe?!#7y0-znJF`pXU?0tk7VZHiMRGU`$p!Vqwaf8b58K9@aFzX8|rF$E=*m z=GauQkYD^UTD~MUcim#LuNYvWKSolYK$8!S1~N&z0de=`BwJhHpkT?VYLlADgWa%q zk@Dn3nqn@j4dKRg$-Gj@G+UBwjMNfvf7endDP#*NNh(%rd0#5PKiV?Dd}IeOLw^j6 zA*TOTQRW^*mwP!Q7=rd^s=b+s&a3TPiXY`^1f?CkRH`ah(pQ*4Vp}R=1+Qc{Xk>Wm z$f~Qh4n@sxt5}TNq$PM6y+HhK8uKPdGEo`RlMhLlys;_BfRE)L?*m6KDSsV=)b$Zi znlE&kr=|}k-HL2ew(c()R=AhCmn~GTD(M(Z!fHcNcK^8?rB6xqQjy!2YGMtY-Bfl7 zedqxEOdX|^Xv>o!%MZ>P(}HHy;FilCbkWnwG*942rsbs8aGFxp3 zGEH#DOvp|nD+jxdn(su(4--1GDkHXg>P}>*B_16WAzY;#8i|n@ojyD?G5!86L>Pp1 zw)$_fzRVvQiOrxHnMi4dTRrG#=wvmQomo)!NWA08sP6mL>@*|-in(F*Qj$WOH$RKbuN$eObz?VR z#NT6G>9u#K=!a&1jU%E=-2PE{-624&zrodDPpR*{JO$g_es2C;&Nl?;g8G*(HD}T* zl;cuo=yW#z9Z3s@ks+9%@jC|0?rRKv4luTHz(0xAmkI!v_PuI44l%~ulLiF8F`XkWs~k+D7vo0Nkk7v=XlKrfxh1S<$@ zk+-Ocm7SAMPosZL#- zy42qH{`zjS#!ct8bS6pj@^mAbe?y}9MW_@OBJKgCY{Ql+7|8uqY0gfV_vySWs4k8k zhXvI=^)5fBU@+(#g~z$l+y#h@Kke3Nc7<4J0gd)&jLaEfDbz3El__^~{%7TA`T`L` zg_;RI;m-8V)v8GnA^*rv8bZ{y0t?l6!!|T{Xm>U_AQdv(E{`XSgT|8%u5dJcKlZEB z7WV9U-)*|kr%eye92wL+>#|w2YDI%Ev{;ktzl6n5qlst2u`kZ9A~JW^zK(_FO3o=qcs*r!(Ny@lr3yE6A> z!hKe(mr|5B5uIHtpZ-nvCNZ;NwqXB;+>_lq$^}Ge2WOieYSC*V5{Q){^NPVke}Z?S z6sYAcUP^pzev*l8q-!m_*fzPvA6<-N?Cvz|^k0D=7Q4XHmTHaw$-V-%n0p!=DdITM zD|w_8i`kd4sbBzpJD4HgU$XqM%7H0**a(#+S3mJg%(|Pj9ZR)-weLJ}30&4fV{scn(S+bq?#>8&Sj)dh$J=EhP6JaCz@e7J*-0BEz}GS-20lS*|yX*=Et zpoIoff*@zprcR|+eNF37Cph)r~+n4ydXEm;wac!~Mn+Z;33PaHK0OHh5PL zAx?s*2474IFV0dynsn~44qOHYSa$6o2%oGAC$E?YECgn;E2be2sh12aMQQsb39}ct zi!>?@@&bY$@u#JP{?s2#QS)h($oz~TH1f6XiCnNl)Fh6B2?*Vvs9p9vTzj{f$ecK~ zeqww&-lfryaAI3Zb?#yfWr<{lLa0!9=DFs|#jC2L+h{YNzxTx5|IzY?@!FV-WpjMM zdHqeT@v^ze5sg4awmmGkrJ(PPJ9%+uH(~G+>sD({@br%1)5Z+MLwzn(vY3}c;s*bx zG5|52*$JqMHJlv~=q`usGT9=UrZhl=j^LJ!(DR2xn`{=<+P7om z@p5T;Dfqcdhy|38%Ne!S3M1VFAJ{tDb8(?4_ax9$xJ57~oy;m}1;j&KE%}TySw+hm z*0ZY!>W2K$cQ|CSfm?WIya>kxw+0dk3!Li+1`g#Sxrz1hzKd_bl|TRGWX1HbUC@k+ zk)`&nW~?;(E2S%1?btX?$~9@8*GzQ+BXh0pj3BXPGgmwXGb7yo>2NE{E&jy@AcLxx z)ysbJ8vT$qp$l}STVMEeNn9v;g$hLlN~Ayu>9?_P5*#ges1m`5R%{)pHA|!d58rH# zFzgGyFLc!`S*L$+*#hB-y{aMx7t zs!gc>w}M@|T`IAv6~5zWxb!%+=5>U?2_BcUHUN&4RH2YQ2B*^5NTo+jW1!fvoaB;sYY`N-5m?Uk%yLTM}plJ(wm9kO~Q@1slx)$jiKi$QhdYGW*D= z-{9jZKpoxM!GU&143aK*!Q6~m0u;`FitQsY_T$MF2?`;ww&ne#?nPD=?V+kEW9lln zusHef&;H>7WpnV%Y_9KBB$E>FlAy|@?LuWmZ_nSrLgPT>{Br;qMiOYiY5<34U2lSZr4Oz!H^A{ zfF6hxv2I}bwA`Gf@L#L=^3AAc9TvjrYd&f5j)|_2|M81Cj zzlUh)2vZ48H|3|otAda{!VA*%pG8CllE#&W1`-a$)@NG>$Dw66--O(DoPFOYs6(|$ z+Db|C)4=l0`j(7z|2*^mR(@g?rhM^gBaARkJC2tYI0U%>Jczb2rEheK7LrTWW|{oEh5y<6~5g9IsRX|MKs7N zq|xPlR9?oel`Vi}htW?y<5{fq+`AlzwE_OtLLhOe6#4g2+KL5f&1>GnG;7nD-r-nZ z2(8fUO#*2nyY=Jmwq7twfr-1pNUKj@W}Wi_5TFAdA6ToR?pFH4yD#!&{{JJ&D=(n< zB6WtHANu+}U!m)bPPOhG;ss9^7QUE!$l=+Mf1lgoI22o#n_Y%~FFN~`Z(dGGd_)1> z)d#>l%j^*LelM}EOpnaIHhDvcP4Wg;;(*}8hGmBqNdYWOzreTJZFBSRY++jGKHJ=ikFX8tR8~NYQus zvyC0Ch5j^mO4uP4cSVj^xg{Ah4)2`&V;IVF%i?RH*gpWg$0_^SUPW@j#RKpOZONCN z|0f`xZTa1lMEpaLbqoN~xRO(x<6jH1c3a$ec^5{V3ulU{=bHZdXboN*R8UU6cg3IN zHA=RsNHk_E^BoHxwW6dv%iE0^wR42Avpf<|Vv*2B=Y)&<&qXLTMa=VeC$mLux)vL4 zktFH6Nw_`M_XX-gR+=H6eg+gndOeq4LbK+0s#TPvh3}@&ti}$OfHjLZt{BfWxU|v6 zkS&WOwKezvf8`Q*!Q%?-EK?ds&7U!nVG#Mdb=9e)TnQ;{qODDC;Cn60Mjdc-9^jJr zz?(*dcgxVh^S{BiM61TQ(z7}=>&GP?y|<}%>)?{pXe>7UQnE>vTz~iFN5)9s#OZ9J zhpJPW%T~$z6D`T39F%mVC=aWshhxcDXv+UpRe5OD|8Qnrp$Z~y^`p)e3eB>Z2%HVRv zHkkwE5-3d1Ml6&a!`_c$wmZSDfhFz;?sT=AI_i#!pbP39E4%W<&c!I$6ghTe(3KgP z9B%A$&11ZGTX6MzVpVTy+rg=3sNDk2d)+LNrK$BSPw5It!!iD?{}yr245Bv7lYzfJ zY>MwfFEZ|qy8k!mA?YV0L2j|-sM_UT2(u*1NlByPF|v3*ECXjVFEiY7IJP`&%U#`n z^-zgK|3hnq1Gg&_Oo+<}n6iH8RvC>&C4L+c-UeWW38^dB7~lPnJw5dR-d;ocqu*l0 zj(Lp=b_v&nY`X2*%{0xmwD16ALDVF60#scr24ohBIj{}M_HCA4DKTP*rM)Ev8z<0g z9vlL(5DFeaA(1f_5muEYdpPLh$9nbf)oOf3l2DAFNvy~oH40ArG~n{L?DWYsn7k@l zno%~sriP@4F+FJ44h8MwWYkQYL?^YBgo5G!YD-SqTNI7zE%#TXei2^Wc`^bIDvZ!= zNH_W<>BycH2d#aSWM*H7$8e!9@O3Um6gAkY+RAE+ttHlL-Y~BfHxV4GINX_8*){4i zr=37-n|i<^CAs;aBh=0Q^ei_8t=}CH8%8qtf0_`}2U@V#^6m)_zcJZfAEL}iU~d6q zFB4#jKC?tRH=!ZuXYzP_T#rzEefzNkbRG7FzTF;5h=}Vl*JywtwX40~ps*-HGDcKM z!OItYMI8}o3XP?2o{0AR{|Bi+R=;o3%W$LJ*|gcU?qTU2P2W&MzHYHa#DkveJY7dB z!{8!B&M{S=rltjFqh3k>9>f~7?5#cR;(ohf|D^7Z~bB1mmcKW@673c=0y)nL}CKq7! z9fbLe=i|w6I-O0I!dkU>RJ5TAU-cTic@3`At6{Fft05Hk-oUY`^UHvynh(4j&U_=S zzeR{H(BJ1tZbWOJn-Nhh?mL=kdxi^XWS~6_+tc(18pv-zW+~tC;Wh+f+aR48_S32@ zM1J6MwvokRx*X5Q|5s!iNkV|GYW9rWuHj;P!Br#W1hP1E`T5e*RnoH-zEcTYlS5K9 zoC=1O=bUI&eiznL+lVdez&%<<6YiO@{+Nemc4ELb0>0!|rBAwA9{i{%cy!QR9TSQT zLXsn>C;d_$?o=;%ltW}gI45HcL_FDoAF`z6)KwyM644I_%M5dS)4=!ON1nFEghn)D zYmjAvdRhkW9$aTnlnK!l2a7ytMGgy3Pd(uau&njVUCKP8IT5xwwdADZ6Uf%Ld5P!x z2N3Oz4Y5HOcMo1P}Zw!_}|KokYN(5A@@H8l#-6(2%& zposJkEWN>{h;+t>k$taIZWxU$1n-FtARDYm55U=MniEfv&iF7!>LaP3mu3VN?}-m4 zJHtjh5M5Ydm(R~Yo_-<^2^Opkphr95D7};E8s;kEQpl=#WX!)?@TpH3JA%@a@8m&x z_1Kea63bxpchVf48o#gwlICmkAYToErIw{(Yue|3{ip@4wd;E&K0LV_#L09qTP&ul zq8d^ugX9I-8H1$_vN;wnZ>Ow^!2pnMuLR+}{jlP$s@H>w7c2kWYS4`-?3DR3b*DVK z_`39#!}5?sh4cDB_q->^-9&H*eIO4$s=K2{h-t_w$i^yW38Wuuwqa~o<)QVOCR;aH z)ZLAC=Yyz$Z$qP?XSk2%I$4tgzV*VOtK5Pea6)1&3>Zc0>Z10Hqm;@itmnFh2|hY0 zO=Q!E_D5rwx+H7Qu0WrjubgmI;Z=HYJTsPNgFlcLuGPIoBg8Z#T=`gqge&`)Wsufw zcJq!21Ry;hIiKKb!p(bq!;0n6=w&UHxfR*mdB|?#I+EPgOlAVtX_&4a3DniIf}{l} z?e0O_6WnbQ(Vp~g#mcuxld-v$KTp!5Smqon*rrL|iT6g+u8*@pk+5YiH6*fzjSVQ; z7cI;;DH;xM!Q-*x3Dya#`MxskwRQB&N8>eWZ!qm@uZ(ZOL$>TGm**A^Q0F&kO}Wb0 zPHf<;#Cigqy;5~k7D$!)=?}W115k7)5VSg2AAQIq-QYlYmvlg*qH37(w*!0Uk#^kJ z*pfZ6q1BpkP30ypix5rQH@50a#Rd?OwclNgxKQG^>=GOVb@>LmH}H1OQv@xhUP^I!AjGTJ<-kcd+zRm=MMz-Rm1~ zXBdz^n*9(n=Tlw3F}Ef;z#|aFHrmZ=B|KSje$2D^Xgpdhrqd!n=Hx}hCEYKC{6W2b z8S9W0DPDD2ts+uY*^KfMW^dx0MzLa-?#p3(f(ikD{H7kg|6$v2+Q->UU87J;;BXv)$S~Fy!xCnKQz8I9`k= z^Z9hRD)K=}9wsj6j6fIgTti>xS8vH?BRf1csd>A-Q^22&j)@8haytm#lY?soyXWt$ zTHreVZ~gcj{}%vxUX(yPfINS)dkkJ4gJ-!C=Tx>T1-jk^D_?=Deu0MHQJw+{YZJCvoiWKP?!?uk`jhz#dRNnBY|9ex>&nVTa{Tr%3=Gava3@$Fl6}lZ;+@c6Or?LZ7{wB| zXDed)!?4KWC0dElBmViB0cU=HW=a#^7q41o2l;#ISF6Gs!RA zG!o#a$&h~4)_FfySk>c0+j)j+@raze6ff(LtoAgaBt=;cM)TH&t-GcZgVOwAsRBqM zseU_MWG@i`n%i*{vb6N_VUJ&L)#%lVKBil)+3V`Ips0Tn^ zJkp4X;ac%UAXo{i7}s0JyGIorK@|$!QBsPUIzGM0^th776Uv-Za>?u%m`K{B(%1k{ z0hyt6j7sobiPSTpC4KPKs68qt-Wzkt5Dm^jmv%Z~CrB!!AN`%<^3uqz@%zzq=~)^8 ziEFT^LzDchiv9@mypAwsyocCby|j0N ztdoVb!$duYFn;Zx=h9cgKSH64)H#Y}JR{`%93b8!&yaCkWm4&8In?zTgNkUzuAacAfr`}8QiZIrIm$A6_Jn`+Ej{3hFE zEemBuNE3syAz@8|zbsRIK;Sh1Kbz<-!y`NJI+mDU_tRE$B3+o_e8a5fd*?C3Xdb30 zxQ+r!@(X^8$h;Lu>!f3IO`9hztc}f)=8-a?0!o#%Rng%OHs;nK8d$fsWHkP6pFJNp zDmLEv49RE4z^W*0y$%n0JkUQ7J%c|id8<*#nAj@FQbDkz-i2w(% z3~nAFYrY>kKYjjobm@@C(VAYOoJw^b+z{FW0HfPmf91Uq5~G?_q1E1Ay`44O)#n#9 z9Yg+Jwz2N;G8!uHbi)C4aW&d94;>c6^?0GGIFtc|jzpquq@Ms$NUGFaSCKxhKV37M z4_EF92N|_6pnx%40bz8_o(X#rh!FdCwqBCJ@}dkm8AC$iOrpU4_y3xoFF~cT72w|l zeuQ5&f`qh_hK&E)Kieis#lEO!@BfoyNb;G?Iu-_@#A_5@_-C*r}bdxl2 ze3Gby@jfP-cax^OH?LnmJUpB~%+90u?)B$Sui>TFpFX}H32cqv z;bb})zkc=h--YM@!KSA&NN>doOxalW!udp>qeG61fLEdlHaWwoh@ZImGsDzSSC9d2 zk1l*S%RVnGe#bHjD{iBA;iD6wwK&_T2~MjY^L_OQ`<3i7@*I{O{mtF&0=~sHPCYa8 zf*VPtjv^X@JIRXotZZ+>hBw*oAgQZU-5O*Ij9-thUX$g&PW-$7Lf)UyPF&{;QHejl zp&LCx>Rz#D8?tojHdyWJB&_jx$LH5eMpMWp;NPP8Q=`(m!{OUXS>g^dD z9QQ4A2WMr`m?@6VpA?zX`2rW_Bc4I{c+rKDiBw1ll&r|y4l-4rOwA+^n1%zGVY2@3 zJz;x7qQGdqU(xj(?E@(4;3>?j+!nHxNro?>5^SW&ev{?q31ZxXzn6InUFtd z8hfxL-R2fSb?+V_QMt(8;j+lJZbG=+k86W&iV@i*g+)jfb;p+I_G&)4KAFU?l}IT2 zz)Vg|7(r+7!o+B8{S+Zg8V9vW2?ZQr7zz&!WbxDZGQ;+EW%|9Zt}( z_ZPSh2=7K@L}35>YeA1yepA(EQbe|DvpNzj>9pzyv}rb2&HkF(NW6PL+9$!|D2?3} z#H`VV=-Cz){|zWU+K+q?n_fjH%cDVc$3p!W36>OIu~QJLSLc)Z>qd2*NBRTtVL{um zo+$lSddT;~#Eb3FpLInUXmgrU*VEhR9-ofl=_?KSJwDuRbkoH;sx!p5 zt5HCvXAht&b?3#>3m@-OTtl246a*}HS+j~hP-{9SV9{NddB;NJU5$$RYjC1j$^);-lBsO8ASMhApbo5LL|t)GiDAs-eLj!#7Xum@K=js*;9CN!mm^2 z5s8_)_|=ksi)~Yz@uBt5Tq)iAvcnp)%zc$KMNro&+Cqp^mPbu>weh9X!G6Y@0C&Y* zDOFgD(yFwviuPd|H=LQe%|q_c2kw^cdY!pk!ZKTB?yCq)*F^EVyD0f>n!TlNu9e%k zH;+8&9xU-rljVp_OSYgvIUSRI@YvDiUeM5+xputDr4pK@|i1 zFa|#$Gp*~~l7SxGxT~L878M%8Qme#pMhz>lGoYd9Di6x_`E4ZTIVptCknOPw;2Gp$ ziju?!(-2$Vg#ac4!(NO~fV~HEz0V0`zCnp6vcNq`(wLl%R;e9IPhirMll*29%#*!l zA-O#1gFR;?#tg;vzVFILd*)S7 z@A0kiQ`alwt0k3Nr#tuf&P#2xSl26Ku|L()ns-fCh2w{*cUSZ!)2eS+`#rYm>xfw3 z8La5?$s-m@&((F%@evDE(yZvCGUqb7iDm_h^Skpx^)s5lppYs|fc0f>Wae}}s&zUi zUtsPr+7;XE(l%F}YEW*NhAL4;q^aECca^NL!ahO6@96phB8`dJy3QEH?G}eDCl9j<-E<$jfnea|H6d5gmIzTl zi9#@igQ<13+Q;PzlgvEEEwH?FPw0Vx57H7gTS@=-|C$oZ}6`ZLl}# z)=>uryR#z?Hu^qVo3k_JUGUTm@?&aI4^4FV*Cu4ouQnsXF&Pry9c}lJZezCtkI-oJ zu!(}KIEC5=%1TRyoi?Q<&x{?lCOcMbiZ3r`L7Q}TSgSu*Wr3DI~Z4 z_fdWcU(X-Bf#Sfu@q$-x;mFbw)iA z#w|DZyodm1vsS+M0YQck!ZcS|N0h797?z6gZ}+dNi`j#hDmRJBqXgLzT>_WPD(3QH z10_8_R~jfcvlXa@ZNfjkjomxC15j2R6L?u{?*Gu--q%OQa+atoG}k#bxQ>Jl-L!yG zL7wSsJYQZcFPCivdCG|(`kLRNrXWvA^FbmIT!Ekz_czo5+rcFNk8sW0VaHru%AtLc>;BKvcOJZ`pz z8aCaJmpVd560+hTa1c$S!WmL{s(w&BK3JqomZj66$aVXX4-A)CvU&b7%3)VbML-ee zNd##-KgO~Hj&^1zse!Gq$(b;<783uPc1&~SuO6k(S@iy+g zA2Iha+z7a-v#TEHj;3hZ66EXeh}>d5X5uS~eI7A^4r%DujadUvdd6%YSCtdxbUc|| zUS7?oSL3#ff#sv;6FO1i)Y6%Ci*s3+W$w-a4%{#?flEeA_!dt^!Ut#MO|}~AR%)*Q z%1bM8w}tfumwRN17C)yx`7WUm zcamp5zA$S$F<^@1{ZLEfMO#w#+)cl~CIMs1Q_I@aX@Ag)O4}u&X;4bX*D5NdT~b(T zHbJ89$rw)P-Jxlnhovq@B$zo&Bw56(_(&bCYVZXW39^S(DZjEvl}Sx8ypJGG4{g$1 z>gHZXne4^L!K!hUmY!#&Y<(2+^%bGY{exH|E3977pB|?k8dEitI$cgD7t5<<%e_Yx z&OSAiT0f_-K!ioq0m|6ptO4IBE!Mulj6)0AG{`{BVHIOwj}&6`rx-@-JPi1vJHF77 zf*2==c|nlJDLJAQ07c;^bzq^v)47g7djO-zzq}(D{m!A^6{Ah4JxnlfVRz@wyV6JO z3-B=6C*(22JH@wE-u7>u-9Fj$0XfJFmYV0pcs8Do$Meh$yAeT@p~jO!5T&Jp zX(z~dhFC)Ny5B~S673@0gAc?pT2p2-nMN`Az$%Kt2NcEhC;z4Nd<w>{!*2u0{sZN zYl^t`$)wdH|4d^+>>uKKt>VF~S9W<;pA+WP*hPykCQXDR)Y8eaM+j)9@f~%1qrp$} zAjy^xPxFYhVIcagkgww;A-L;ZG3tM0qby+aU)05_2G7qL@@xuIf%`TQnr2m?V<&*PV-^EN{h)Zh)X-Z&g6PO$ zhmEe5>NqPfo%w%u$20Z5={yTy$+fDk>K9ASfu&Aa{(v3{M~N93#A7G% zIMZ^Y4lm?l5&lvZhcbk;i9<$)9Vm%h%E&)De7SMJb?_Vqk|Mf=VhCRBuh^aIx$`av zDn-7CT=BrD;D(h3U6xtK#jA5nlfy3Nv6C~%K@fPA7QJ8gZUC~F(6jOHHiw$WhG+up zN@StZkgHPtdkN$Tx-#{~brTk%G1E*J+khLZaQkp<)V^m018 zXmh_P`)Tym{Q?qx6mOR?*puw;BrVp6qV5(vOQKs5B*r`yT!9XGCAyCGWa^t8BKveh zeqec;z8!zoCPOAOx)eEU5gCrIMX43p(dG{zyG$@Er$MYric_ORExrpVVdX=c3cS4aUd(e^dER7)92Mj`1>xYy|k|=uTNzeqQ%y1R#6aW4s$8sqO4cul8C9e#z z_#{eRNi4ge_ElH4V$yvB=ZzM#4d`r1(WMvxZi6kb6l(mP4 zsZuH%|2FrvAipH}Pb?Iiex*Z0wQ$f29o0^w{!_*_x~HObwNFRU?X7v~UG9-d?j9ws zk(rD^c6XKCTD%f)io{B}*%NiqtidBeAjhIqmaUzey>0XiaIiA&>4mH9!o36fAJG3$ z_Ex|8(BhVXvqPi7iwXq)t*$~exMUPavZzET$MR|f-#4mA4pGz#RnkJ>piBm3VnCT3 zT6Kdu>8MUFG`X>)`$W_ve1y`iHCWczm_ExV&odKd3k=^ws}>&QH+;p*woEpsHbRWEuBgwe(QH!3IY=B7YRXHiDhbq!HA*i~n>av^ zqk^{+P=L2n#{fDU6Oaf?2%zN6*mQJkc3eFJk5KwD)}==jOP0P%_;qf)^uc3QaH&Jm zN#s}~lY`%vy(3WLBy>IdoZ8Ln)DlliZ7VV@NkQawIQQtd8mDAf6MF5Z9!z`Ze(|^a zt#Bb;k2+;j-`PTt@Q>?|%3!j9vx4QCkYt0qhSrG~@TEaPtUFZ=y=uSrt_@qGO8xX$ zHtV?~kN2x|9}~XgD8&+yf~2nerY^U2+?&^tXi17!M?lt+<_-%Z|soKakmT#V>5Za%xJX-5x^?Kc&wL<(qeyLVpl#7vdu+W%jVRi+_C~VE*8DrM6v%@TKJ6o7<<3${g|b^hZnJkHI7N%F@&noGppl4 zA<6LW^oi{Cm1>+^O&8?<#+Qp}Tc}gnCfQe0V@(SCY_rjtNNfZ2#=Ka~TVIt9Pt=fD znT(ShzhworX3Q7e-uf%jKM_LiI@x$$Y7+KUdwcbE)~CdU($g@csqc>a^fG$Lzk(Y>&T;~@Qr)#@rU#%#1HysAO}MA>j`E3q> z#V)kmG^gGBLWJO%RSH?ofo?={>pC50)M)e|rfE%7LaiPHFFW$W%d$QqPhZD3$UvhS zzecFNy*i(q_bCQw(Ec{Gf1SBoTV|OCl}ZQ>S*D<*00+b$x&Z;5*89U$4-jBDuvLY5 zWd$1*L2lbD#WM2H|W&I2*me$6SMXQr>)xi$8P|(FSkvOH>b1dXUmpDP38?Mg?_YNitb2 zUmSgq)z3p#8@-LDON{1BEH88Nw40PRcrPu|JBa8(L^p|OzIH9hXIP9(I1jEuFHJZb zy`~P_dK@i0?ma^F+JQTzBDndH=?Ibbf7nex z8@w_loPNG?y6)c1v_BrKyo!qlf7nfM8@xUgs2!yCAhqkI zwjKYDY$-B%eL0Bh7bdQaUKut7O&u95B|~#p**pYE8J5n)(HerJdKx5^&+!oG)Fiiz zYUXla)8NeW(loQt`(n1dsu#xM58br0!5iZe)q{RMq@OE=>|f0Jsj`M`NNRR%46=Gi zLGjXLwb4ssy1>e}#@W+uQrh6Pu}JSAq7R7ZQnle1CZDa`8|P~gCG&7?{K6#jrO|6+ z{BKn%caq35lpZCK2Wfmz8oyjgY)J}J2|W0{_g@0*N|FBO&(Z4gVmw~V{ybfd=kw{s z<#N$k3X}iBDJzPVTG%(VP7brJc6?`=r;e8k#>JKBfgO~GIdw)|-2 zyHF1Y#hB}0>4Z*~2Y;fs0p*$*TR%z2JW&g`yW0i+ik6^BHqky<6DjHyjNg<-@{|^) zL3)7J+R~L4YYSZJh`i>SU-(NMnH=v6VHJQ>)OiE;pcg2t)*noLRtPG|D?ue#w+Zh% z=zWV91k&~YEY#FH#HaW-sSFhiK98iYW@tv32 zX0fhU#$tcMnGVUVuE5(jT#nN3dl|}09o{_DWLBtDQvZWGkT~9Pr-nFtm_p>e4PNA> zClj))P#3eRkrYSdO*uY=$LrWd#VowP3ifLPOUZ|%nY_@LPLX6a z)A_}GaXFjJ+v+2h3n_}E_Pjn~?F^GC@YsTgZaF&bam~b9CWKY3#)Rv*<)ldQbZsO2s11uBA{&l@zB0&D{T^=3tSH4Hk%evtOr`J}!Gtupa`yfSO=6uM!g zAAMS(O-5nptqv>l zb0sTg?uKEMx~B1cr8C0NMFYk;nQ5~9SU8kT?{25m5!*ng34SYCDAA>(NR)(a^7ycY z0znq7l2Wc#uu|d0V)Pg@NzzM^%&Z7y#~(KSirP9>`#8pj^oztH^Z&EAW|3uH(NGd? z{WN8vdQD$K^JqkYoR|j*Ie{Nm>yR4sh^5@ya*CzB!Nt(DM-dCHst$ z@A1`;jt~WQvsk#3&t-4rH+3O=d{ja`iI${sbp&L*P~a;Xvdg|YiP)2+-B1a^Fo^hIUj!b?z?xNoFA`$_x)G2DL-6;zihEb-r3fD1Y#J-KXGW!l^$o8>O7W$XF#Zp zc771C2ZeZ_@{gTDe`Gl6u)o{+=CPMUR3m6=viZboB|^w*j%lju_68_wckSs`c3Wq(t0} zn=tp@ilEMa>L#XjmpNE;5E z8!1GF{I2AKEjb`M_kQBvWLW`AcQ=q6a7S7u14Qp{@Jp6F5Pv1xgIx--PRYS@?XxgB z0?^@|9Era?nJ=t(qq3eYTq5I}+*lzw4<5dA70*$D)!2N`ZR4m-HaT zdo9Iv-bF3PTGBmuTLQk)vRjn+R9#qWNdHhG%Z^Aca4mBY4?={0<=i~dTa*(BKMBHz zY*4zzp2VOJu1DP@o0f|@KNS<%z+dW;Ov61JBg2jaLoVyrA|A^N;tO7;pmE~`JBI*2 zFOJE7w?y%|r!m1Epx;bx8svDyI5scI3f)m8SMN#0*yxl*1ZLA7OJZ-7qaOK&9#~I< zZ0;tTwcO0b?&{|e84H561=lC>sk*GzaM@NO%Z|)0aNUMFd6p3RzJniw03_1U3!yz( zD{7T$Eg3!}m{CdZF}b?ByjV<^^X24ldXH)zkSCPhgN;{a5yw$1&!qlb9`!XA!EgbHO9n!pGJv!z|OvDh_ z*Bwr1xow8g%uodRLmfP5xIU&toYX;jIT`D4kS;f42M58tNf_N=dx4zixuWVW8*Gla z7Aq`as@eILa2~8jS({Dn#HH6d-LuJXBe4%uc2fidwPw;QWAeU2Z8}k-ofogjVkAhnh*p0jA3Cl& zK8&M>hBm1u4Ms~xsT-6oQ-9^|qU5&;Uq1-n%%gm1w)}AIeJPI6XX?{~8Lb)B$QaFW z4V>M@_%GxZQ2)veR{H?cwUd!ud&!FQ!xE+I9B0;lh@E08_B6^nFJs{^aNC{uQTWFB zbrkz|en`k=H{AbJ;NdIhwexG_ng0Dx1-_lH&YcfF_(Vk^-1q#|izApv!Vy~bdNY?> z4|0@`*8VLMU&VR-HjcKA=dLzv5U3XbJwpjIm=$d;Nj}pEe6k~ zhMKQo5}2Z7e*;jy5`}d7Noo>LAM^PE2G(TVt@E+&$7E?Zt(5VD&=onjT%9kL^#>Pe z3%T@yF~oioRB<$Kto*U%pVk3p(#JGr+%^%l9%LI3EYg6-b$b+sWAp2 zWK0MZHD?C9n$!~cn=T3W&h^7K3HAfrWIXtZ$DGIa0XqU|MLSs0=dm|iE{sC246?If z+j?%u9O&~=&ho&cc@YoLRNm*(Wgl*%HEyil@YxLB+mH=K+U#envO|Ud5V<%ELP#&y z3o)K|oh|vy-vx!?I%_?XWI7+<0gS|ms*lt}S@ox9w zij@S)J0)!jQZh5w=e=?|%B|GwAz@YY?%WaY!;qY~M#%NSNq5)lJh2zyn!6Hn?qHe- zR9JanonrbU+X>B9nX}3(rSV1g=y>hLxiF(s1T=uO0}$1l@kG*2V!#j&#nM|w=Ut!H z+q7o%XF8C+&MIs4KJ9?96@%+1M%{CmAv5ZL)DPP+)q#0Q(H_p(sthYSH`lcBOksER zmK%k5ho%ll8m-n`_2v$VR;L39t(Z?w9ON~r^IdK5`OtA+#Y@%|Zl{Ebd5-#Jlm_qH zgM{|$>IrW)X(|Lp;)$y@>A6>$TwY#IrWcFZ)uPRXt9${~?|Y?^>k~C};MDc&7*?bc z4pMz164zUiOd4CGKSl~@ro6wA~q zV+IXg;D;&gDQF1uV${zAHe6j1B(RuG#I%n^CJy`KhSVXfy(C`gsHp@ha@|iqc4?bU2Hiz9IgcntUv zK(<&Fen7H~NH!ZJ9yUQETIrad)>A`m$*biOnT`S3PUmg8L@N0AS-@Ixj-M{3?aal? z0JMfx%z#`CAXoX}ACPNzhQ>+#_w4MbW7til+a1g(<(Z9!Gi z700P9ISlOKR7Yf7vYFGu*($v{p)HxClUr*gH-?(q#QgGdKAW~;+A8>cMws?V8)>_- zFre9Ex7h$?jX~Mgu^(`3cO0uD?g^#}GJhQ~z*c`&$Fj$VJv9<)4b9e!gJnD`P+(rN z2%T|ETVH2zu)XR6sF;GUFQ!-N<*tTO$Mf-QIiHNDZ4L!xIQuM6sxZS(7pHb*VnC|L zZ?*xe8o;X3qd%b4?r60xY)wOQ=;a!?xtb z9U!X?$Og6Zp!+j<`m>CLbRgIq-CCQ;z8QGTO5 z1;6ey9taOn4L4D`!F=efp#q$Nx8WuB{+UBo?8YPi@mG*Lnx{j@k02Mn&x$pnLO}uM z{X%o8W9#0!+@ce^$OS=6Vd+c6&~OJIdjy;L_a6QT$;F}I({m`xHo2USFE6hai^XNT zL9Ym=`ihZYHI={xwRJ(j7lH}8%5uOguF&3Kqyy=^o(2QeQWT7Cz^Xl`y*5AD(Zk+D zWLlo2lL6BM3daZ@Eli$yTw3T3@M-|d%mGz>)7{K`J zS3iCJG~ocX@H)U?B7^ry8g2Pav%60>5&6jZ1GM$Qz4ytf;a#|Xbbjwa<%vvKr+ylc zuYU^tRkZdTJ}e)Fl|^5CB*RVi=y=R&*vDkgZqju3=Jo4`hlle$ZQ?wN?_S5=E{fCS zbsA4D@js)jAdL$X};9V6BLnqd{L# zRZ*V*UK#)ExYNv85075uaX8V@OMY9LIft>jg#b7bFC{zo&O&;nx?bT_c5yy2buMf0 zm@qtN!-Yck!|%=zy>ef;tB^$*`We|Y!lU%tXh z-iOBT4}P)&LVk?)F;rLlr(gZDk4l0O+n&B7$D1ENfBba)BQy(~D>nUqH#NQdc;s`y=3+5_>&7;P=JruWerr=X&ejfNfJU9NW7e+ckw%uSXl-i$MZCisyFW zvHHPXOBi*LFk2^gk?*#nyX)*jpPUSwa1TY~$#F69??UPl2nT{MWQ~OcNrS+TLbzZ| zBO>hsZ8h)3BAjW60g{Y+%VhH zvG9-UknH9V&UK?nLD@RhKC>%l9Ub675Uyc_^(wPeJFL{#Rslo%RyR|9n(UtuZo?4{ zl!YqPr5*t(EX;al>7R?PP=QDj@6L;jK?T-6LIwFy44XhfQ|-u@hU^I#fj&`(2U@~Z zGjePp1IBF|D1bEzZ#(d|6MEj7NypX7OOi}T5;c~h{v}!|6Q5Mgmi&|8O|Cfoq}h3i z9wo7b5hG`Hnv>YUkuoAv>6nff`{pHTu|FzL7k!ea2dAK`D5drbW0I6M-(Nv`Q5WW< zDK!9Y?@YGhU&?Z|mOeGP%E_pasfP!8RzJ|QZUe2u-4|K;b253(XsH zpPfG5;?RU(NMn9OhI#pL55d2^h{C z-Q=T=TOOPj3?V9>Fz}JO-FtsfB*g;{Cklf{0ZE#e3lmGsrcBgf(7yK*|HcpeG{5!E zAF0d4<4xKHg6zn|oL^Zdbr%yvWI1JEF<~o#cYbzCx4c$X)XMH%%*p>>%;#;c+!g1& zzWU^m=?dIk*)6YTHo-TK&uCwq?I`M1A>CnMGxictx1hpzyWkNWwb?PHH{3CjTiH{X zl^*&C)^K?WpwcELWPnQ2EhnJ0f(T-7G(%wh2{E%>!Np-Gj;v(L&AOtz$ot}1wr@&k zARW7=Q%0DI?C+8jrYeR{j05LKWAoMe;4zFW~m3bba28$v9lrPwffIfSd&&57f2j% zQ}ogY&kONIX*WRan6`D6)G|jb7nh60#cbIcVp7JveTB0%Atp5|h>l=yfL=9bq(ZYi z#nKS3xHcPn7HoK}o;XURbxY~CQ6W1p#(aXoY;P1U)%N)6?ecutmn_k(lQ6`CbVox+ zI?dqR(1gDk9HM`!X8AQb1MFHtLV!AS-an{}!hit|8@dUE%AP**l zTP0PSap6|!@zvW)BHAXshb?IHUh(TY1acGD=%1zr8m z>Voemr;x*hS`mZ|;~;xI0J0DMzVYt-5R*p~)60_s1bB#mDTK#`QLlCE3F4*WXp65O zXelJLu$E4h3P63V6z?BqSIf)k?6S3c=Yf_p%3RtB@ti(gB2)1{5hhbDaNr_W6yxeRFH&eNTxJL!}+s2Ogqw34JRvH zZK9Z(rf7V2hR`a%sDrbk{MH)Dvx3X2+{>I*$uTLxeA{SfWJwB`-5p!x^)uJ8i&7}M z`3vMGAd>1P+J`JE5kJm+eW6=t9j*2t3Qiz$Wk*8yP3}6Lt=}XoFElDz^IphSAD_<~ zvnBO}ZW!tH3D=YxWH2eVqYS z+HYg>gK^5S7o@w%Ggp=FJL5Fp@uglLuBS>cpf}?*Lnn-EJsWiExye2@PdMv`54oN- zf(Rtt5C{^wzIh2*?2fZ?p^24rV}XHm!^o~rJflo?6g=Kpz%;BMM!TN<3T;~1v%Dil zy`J?F6Qp6Ba_EFnt!KmX?7FtrO{qV|i%wU}==RoMd2cY;uJQ7ImCgu5J;^o+ze%49 zyIOd5QR0K+!nNUaQl)-+d@Xlm6pk=!JTkHLNZrD7R1{8?Ad99QsmR1l^x(Leu?Ei? zC0h+NkXvVHc5Z6vq3bHbPy)0KMLy(=N}Y#|zuKrbtK$Z(m36r2NC?;9!RdTPYYyvx zCFDP})o3o8@7!iFXbvb8u85u58?a1O6%3Kl5$o`5x%1*D+gg1>@{n>#N~A9aWg z-d1(>zMYcu(4^ju(X~QIx+(E@M+8;K^0O!0swU1~xb7F{n87rpH_R1kK{f0M?(o*| zz7yTEY6WHTI}Klh=Or1{(DT^^UJXqlx*1glFdKUa5h5Q#7FFD?kY+U`t@-G6DX^P2 zsbh<>3q8!9N-ydXs*1A{?kl)>3NTKel( z+z*O1*s|nc5i|6W$;M7m+j5$aZ20r@(oH>H%a^$B#ce#i$QV)nWNURzZRDsA8)tIFSkyH}0*k91G#ztA^?@fNUffmnkQZV(ar zL+C#m#zhhBSXFH-PMNHm}rI} zP*sT>7EJkKqP3FBkERO=n62zSqKMwf`NU_HO-n*AvzStR|1`w?M>P1>i|M9_pym8x zyqsQ*TT?icLWf!+f(re%1_d4B6GLFwQHIIt9q2Y`Ib)(+T({jCnx6 zsu)V}Dt1L6ApkvGGFdnoemjwsyw4g))m&yh35CSYTWl9U=aW{Qf~v@`XMAEQJhdIQ zb7Y3-AzVi%rdQ? z0Q_6SC``=X>r#|RPV4BRA~(BjI;Z-?i^4jv9x`;I%J^x4MA4QU*n zsU0dj{5&iagApo)I#QBs-e^gLU+M^rtOQ18h<2_)oB3RrLE0R9B}C$X4EKJWkTlc> zvZcDh2~ey%>Fl)Gv4Hu9GF^o3x#)5;`7I&dj2sr}y~TrW3u-%8c(}^K~RTD=LlpuRZ@q zU0sIU(#8NfyZ){`mgRK%)!?w=%<;byOnLPLa-wtegg3;jwT%_w@$a<_0k-zaG$p?I zG~DcwIko8~&Edocr@_wyVnrtq`9p!k6(i!HfD2uC_%c31rtJOI(RKOeerbGw6XGm5 zx?gc3e&99sVB_sLr{^G2Gs35j7n@_P10)Q%st#k;y?nM%2{s4<6#RrHSEl#C7!j)| z9w~O0sP6>XeCv!)vQCI2N-vY~X5Y1FNj~P1^Owc^=!nuNPaFszX>L~alYn_DyRysr zx%~KZG{04`5^n7DGmAqZagv7v?DF>2ilFB_C4DJpi!zh`n*|{! z6BxD>qbD)y64fX2nA9Xy2o-hSWMl0y~(=IB_vdsX(Uu5#cpb7Dr8C|HX^|sp{1Z|9Y=yN`wy*JuEOGFWy}mab?q|CZ;qsE*nJbj7SWX z_fq53j*VV&O)E~IvPdLXd!2kIPs!R>LDiW{FY(+)<%H=%^yu)Uzn`ORo1i60`i1T1 zHagdLu8n>c#HoQS&gOCzp&dqztx^AB6daG~3x+H>zy-p64zX=8OpD@eI=pWs{JNWX z_S)7uuGrYcUn{dzZv6Be1#EtmuuKgIyyL|l~ipGDzKh_CO;2ct5(^Oq4W zegz|v!Oj6cvCyz&YC280n8}R~QWHb|QFT$RJ^?lQ{9<*?t6|MC_ZkY%`>w3IB#iaC znHQ=CF@dkx8{C=ea2fPTUs}?(72-X)I|P{PBs{7fc2{JTV*Bc&Q(u#t2YsDSYrn93 z1vHZ-hlO9L|3ZVcnxMOjj?S$M-Ep}}>E9JH>o5v(K{x@&k~sMimfit+D>kbx%nxES z5qvVk#o7a*?jH!sX{X5)>@ol9N>^7O&6mhGDwC{8xZznT1f!S)Ew2s_7A|6xJR1t1 z#$;j~=be1VQ3wPyvQV?}au2TbNuLqAPl@MoBtGBXD(Kp-=GI`1S(hz%W<3m;%QyAl z6<|h?9yGUm9e_2N-Q&dTP_S&z-(O2Kg9oa#TJIfbQ>L4DY|Y@wOQ57(EGPvk@GQ&f zf>}FT77C8LSyU8x@odE}pS8kIpJo($qB$HlnVzY}b%k-*Z3S5%0ZXsZNpbCAT@m%( z16WOt?`iX!e}sXl%3nd~0Z7~?42u5WPn85=1uoyGC3ZpvXS0{$sCPws7xw%-1bF$D zZ7c8Z%ZKOp34Cj#{j0U?mL1YNUB2B?+qd2qqmHP#p^DxI!)KH`UYWbzSKTEl{XcOC z`XH&b_6rOmkhwQ2fP}lh`1ifON1;pW;kak|-Cr+J{XYhUs#r;_WYrs060lsUnza1N zS6QAOcOS%^T(1#6fo|)n!lJ)M@{IH@-rsz4JiyuBrY+?xzp@xbzJkYhvsVaini^dG z^o4`Sd82bGVu)QjK-1y{$zMe}m-k~(P412O#4)cP5ep*sh$A01z2ZX+Y20yD{8_Y< z(U!F*pEFx*^$=07AsNlu_Akahir>egeaXRD(~vvMzf#gC zfW_nocJ57&C;Q*$ha{!%$hY(DtGHxungOu6HwK?@oZqTy6m910J8TsJ7ErHy8QQMK{+@@PW24@=!Z-8 zt>3+HB)`Y;q@7nN&B_sHamQW832gf!RMYsdk2a*W&BV}oiR`~#laCe30lkW?A`yIv zah%XfB8_M-f*jXAa6*VCNA6)dVuaW~8etHaxTt#CAZjaf*zla*mrRXnq`z-f2G{N6 z=6eoq5-^vI#Z1QHq5UPQyMeEZ)RDrA)6f#~!7lkxcgMI3m%{P^zGpec8@-#tX8&BY zoLk(kO!MjO;=)BBpSpOoS0uK4DNbDNBW2}$0WNu_11#L_gt8Rr(wJpa;PV@ST4XH9 zO|LXh+>5s4t|w#=Bx@U0y&l$WU{LQ;QzO+8m6VHw6+1)5@){NLvi2qI2U6@1V0CJH z%}CASSq*+^y(Wo5cuNdxV~ff;DU?~eab>MU_QyLUsQWw9@F-pHb~0ie(bS$7LH}Te#zpf5 z+LuHKDt)K2YBQXM z`h8yAy#DllpK%=AIeQ;}zK*)x2>6n1urL|NR8q1hM7SGx;Uq8(=>Z?_{yE8Rd`bi@ zN`%Mv`3n?evcP|g2$~7ZDtBl|lSvUK%hwm;N~M<#zrDci@dS`D6yxwqiW|&`aK-js zK)?T{?`F_8@C2$YS*i26=B*-9il9>VEh`?oNQ+Bx{#*U3q92NdC$=JAT9E8@#Wext z_fh4AHp)U0VCoknf_#>gLV$(Utj`xeTZ%~Y0p+t}pD1h#` z<;*A{n$)luPj(`~G2=wN%P6k%W>C~Lt6ZVFrl)hxI?b;YR)i4Q)xeX=xYnEFd`0vEnB0I|zkr}{*U+P;?%}r698-O_Ka3spZ)#Bu2XgI6BSj@Rf zOy9-a^b83U5IC6{4ez#Fi8<0!JQ!vSF1N2hIM8_+X0q)I)3WLAKf+itqSJdojAal=AlFDi zuAt0_X|m&nTt(Z)=U259(RW%{%VIEuPj&k!7g{$+UWdV2bS>ut%0N2Iyph_w-_uu2 zjmm{+%A2dpW>cCCMNHXcLhOzNI{{Ca94feCSaXByzY10ne&=D$xt!F;IbXJ61lJL+ z^H_ZQbqHOTm#0v9f?l?gj`}BjYdgH2Y8zOm?&#+B^5qB>8*C^n zCaBsuQbXP=9JEA*-R(WPhc-&@x0JCw6i8_{a#;y^%mfqA@sY1iJ~l?I)Lb^7g|ISy zF1d19S+{hl9AA0-1UwsshU099mlfX#4Lmy)?|pcQRb$YLyKCiUP_5*0u_3B4QgS8x zLdswQc}hhH!wqpm?lDCgr^kuB&|j!UBKHqti=XigoYloDvRUYm6-b4lqdsZ^*Nt`u zdR>gKcsp<4=YdKcZl`(JJLOmMhTxm10Wdo-Cb#1_CIQF@H4Tl2xz*-`IUNxM80n$JV8woSzs?7;dgTy?@*sNJzKT2lJ#QCKsj6aMoFG zd|C56KDaD~dE7eNla##tryM(UOL5a3a#B9lx;!T{Y&6LoBlmH3eXn3I2~(Ox(bpE7 z>~sg^sX;7NKoi|=%h>ift1P-K#e&MoB89&g|H;+NFffeLwL%9sCy;*7xk#?Jz346H zKCi@jbU2@T5Zf$IU3EtyNU>+iUPx-TpQGJ#%WS_zeEk8Mwv~v)%Gx4yS6RUy-RwnB zd}(TmuQ<>;PE$SAT(W$QWvw1G+^1}0@^x76o8B!Fe+j5Qs5)>+(BR4@{d6y&iPEeE zT{e`oPf+Ah47l!)oI8j<2`$4RJ&laZ<2gWf7ALdto8k=wZ6*_R!JNo6L4~cN6xqA6 zb9!{w_JE0&mrfcuVNgUigBdGg976LS$2eT9hQGgczE>#i|8T0x|4USzuiC{pMNkec zK$V~sr0-8igAoK+`(XrHJnuO^HG!_%;@WC@s=Ygh05*MSFFbEmmog{WiN6jpoFcjII$C?rmdQ+YASIj%JrhhW@e&BcJzGw62XSfV+m--d~3(v6!Z>Zu~{mdm)Cp5{jjX!^*KG=+i_+W9SFR9>dv>KUP_Zw5mZXm+VR2D| z(*1!;wKyrrS^Mb$JjVA)7p?y(PIA-cZ^(V8-CSMgg$S}*?R7*s>B!i2)-bK}@oO)e_fdS(IppH4Z%m*~n z(Gjm4BigLnHWgSK)QlLtC(EEi5J37I$ax zt1jVr5wXck)v%VfX)Q8ocrx0DoqTzsV;jE(cne450TKV`tSQAwj~RaPgfSZ(JTmQg z`JKeRzm^{(NOla#4ywF+{~;4ye!tB=L`Du@I=!8onQ*5wU^EVsP5TdVqVh~E;(6Ch zb`iPfpNMkbR?nP?V>{{Jn&6(sraTqXWe1&V#IDe>3!{zt7$Os-HAQrTCfOXX>zC|+ zJWWQV^V)p&S-T^2-YpKn*!dqwK|@_xxAGsr3eYKj3Nga_NJ$HHe6R*&UD7mbu2_vH ztS5^tH0E+n2y8~2zfI{II9D$*V{@{4xd*g)rb-Wmpc(BxCGo@UzJ(T5_P!KXD3?>$!IrZL z?qM~5lZs&r3%7o!zQgQrJo=q#`aHwWod5f}{ZjulAV|J$Y;ev++C^Vm`{*myV!OEk zsAkrB;=!(R@W&=6_E0RB8?abHplR;f9Hj4Tm0an~6T4+c<3mU0g3`-eoSg$3Cf>a}dG()R3h^=mQ&Ai$)K#q8cdF3bHDUi~BrFCKbU<0c zapWqozDNtf?2g{`{LWbfbwqqj`+?gJOGoNk4}lHzquId!jH}YPcbe!v@5x7(1`q4Y zK)lhsm&F99h`}!loAhxLx*?iG|LuEi(`U(|iVHbBiyq5q)un|i5vb76RHBv-CmMD-bvJo(TR?r;*&W*XqIf@Lh!^rn^%T7LQ736ZW$|l>2uQx=I_!E=YdPs> zOHy#$!67SvdhVY-8`#SjZ8j_tC%r1V%q>QdN=oyl=n-(jQ-A3Tm`)eBA||hsDY=DE z$py02jk#7;+2QX(m+EidwcgLa?zGiJ7oHVW+3$Z|e1)=I43wfQ=?!ZOzB3TsFFY<7 zve~bdavc1+p9d6O%QYpe^xms8j~C1l?TfqYts)76h8ocpRR``W^6c*mm3&KO4>3$z zo~$2ZE8cX*E}n_yP@8F1Pq!^Sm~;zUFO zcFYOGV_gpUChbqTp&Y)CV3N1jp<4-C9Ony$@M#5Sbqq2)CFLw4Hifud-^()d*j??*7OjNv(^PhXkpltpH47RBs;JY9Lu$$c%#Y58E4deYAdcNk4L zqV5~JxD*|Pbcv*qeJSs1i^23qZn2yVhQ`Y6fd6)`Nh~8lg72rA2$Z-p9lGy+7W23{ zj@}8rPSY(G&o^aWWDFaW+jl5A*+`+B^Ev;AV#P!QTbBhhd>%VdpcpcxHm@OFL)=NqRDt-pv_b4r`bcB$tR zvwY}UesmH56*K9}rP|hi91;4(ZT~qIZSglFe!aWQ_-t6Md>}gbMMWg};a(i-&Zn*M_v4;%VeX%Hg5-2`-bZ-JsN*KlpacCJA}l+`#$wwQAk5?$CJm@6VUd5h8KQbw+pzx#&WGWqHM%&|YAh z4_U8qS)c#fW>LZ7*MarsLdlxWANXb!U0QS2rB)0?Ors0HZY@xlY7MAHd8UdDh~p)G zt~39A%~m?4lsieU`V6$kM%;}z3$F-UqtHcx91jnMC9KF7+^A~h-zB65SJ`sclPJQ2 zEv_WH?oSh9P4FngSmRpMIe!Z!HPhzcSf;14kKDN9ak%R>MXa~5OVHUl3(^*|q~e~TmY zG0WCZy%zYu)0mofJ9;b+t8j>^Qsu_flO=n65Sg;!q>B3xv@7Wm&~HH^*FYoZ=*Kjf z?@}=#gn%STAXPbj#mM4Tk)N85&?o+~(z`iYgI2o>;-kEp9^THg2Hpy*tjs}}Ix}`8 z6bZs4lPDi30=1|=u~vMW$m|(UqzK-f1l1I(AMq*81Mh{nEyLq@tK8+r_t!Xv#)llM z9&YJxkV^jL;V)@3@FjW$jKn*eo-9=c1sc0?GTP@LLbV4S0mVA9R`*<>%ky9&3D*O- zv5TZ*qIFH|-)b0fPXMAbf-vpQ==YB-XWAH~-4iu)o8R$t@ru}htjNxUb<_?QXV}qO1zoC8rz~Ubd-BhVsP>#J zWd~CGZCKxJ4Tqp#8*#K>ZOp7fstJo! z5yI96lm{mAF1Q(?g7(gHvbbTl#(rQ%XfO&Ik;HV;}$Okkm+lAKw+n?y{IJz#>Aj1+3H zLFErK7cEP-|c8SH=&%4_?8uv6Es3{-C*2`*bm($@W356r8liw4m42Sxo;i$mmo zly$x_d&>&)zMezpV>2bHFYkTI%EtJZ$M)Ip=E0z5%R;gN@}v03WOePYU1^UlwB?Fe zLCNF=gS5oLCSjYBsAVUms5sU1yC-XobyXK^H)HxcB67ryzU^YiCN=)gQN$%9?XZPt7ltPYm%yr90dKdH5}7AX_4tUEChm_^tTR0MhP*CM zz`QaK?~$&e8NC-6uFUJ2@SwoZq5VyxK6kgJC_=DZ+US=^Pfm*{X8oMQ>TCgvI9E58 zUD;NVLdD2z*YbU{)ckkit>-_5EWc#zmsQT2ET_^ z;?5ASq`Z_{C5Fd4pNGVAkKm^I4itj_`BA%Fet)&W6C&!cYVu8Y7N=bzl7@SB z#kv-UNuozl;onbLIJ*KQS?mY6hr0Ej5KkPK6}WlUFj|PTcZ%0>j*CjjDqmZFZbta4 zG^B0NItyi3oa%t4wOFNYKcEHF;ip28q@s~8e@@6{VtnOki z-Skd}?eh2ui!0f22>qvZaejw6&>X*YuDQ7viuP0m|6-^3Ev$fId^RguNV0iT3syH&;Z#l`Qd0F!F-;WfgB%AnI zhofzv7#EMH-;o1+_y{I-wD+G+7Y>X08ra`{PdMR|>z)_1=0F~5@%$=8z!5m=vt4DkN)GZguJ(lJ>Tm{Y=ig(e0y;Za|G)i>rmu{%@(clo}7lMZl zexK@oG0Z#zNLCVQuB10{7>j2;#ZB?b9&(kuLD9MXnxOLP<(e{$CEhoQOT^8}Z1+h+ zat7aJNkOa|tz}`8JhmqaALr(m)!?eYT)H-=8+};p>AEiX)N$mvbB9jLY6eyLJ-@~2 z2A{kIRRx=S!t60tzh*gx(T01P#wU3GF(08!F%4+>>%-HIdV=Pr;L^2pHRC# z*7QG_pGQ!(ex8ZoJ~>6_AwJp~%cf-qW^_ag4KL4&0s6}IseuFa_%-}90~~tAAo2AQ zqDF42I+BJ_LLCx06wdPN$kOK)9QuV5Tw;EY{IB-qAXVpF4|YV44orEo$;tILIO5cL zXMLjkT?UrdN!V}ZL9kB;AOXPF{~onjk4`CVlZxW#-smNoQVu+3nVgjiIrzA4H&?yf zZjMd5x2(+aJ=zoEe6td+UFk*pi)m#Itl7DuhpFrg=Xd7i1UD<=_?V(Zm*bQn?P9W6 z^5?Ql#nV@rq|oxqR3b|G)DcS1`1ZS1>znphdfCy*Go$vlG=195DSp!r1^sFM=A*uU zOS8md37n@J;1z7{jqTJEn`LUDC)u^g~r~wd`9XzHX~BK5-IwvAVQx>VFpF1aY8fY309_8@O8~ zgWSh5jo{rzpP?1y#!z5Hp4k8;{)0Y?TCCY#ctaalfs!_6kV)uMD^N*?@(0aC7QdoT~b4SPxE4{cKP&ua*w`7EnBb@s?p4QndDi7+Oteg2(9Tp|y!JoGV| z*zbl@T7vrOf&{Uykf{3eYGb}xMM4c)%rLJg2t6b;5>3lxT(0uAx{EFR7fu&cTTjk% zEC4d*c7TNU`vKg9iy~ra2tO;9MlcX7HYlst)6rQ?*4;&pgb{ju`t`(L8ouU}LQ`q% z*Fu*ID|6#-aOs@mu74sX%8BV^ury~_kYFK@;c;$wPPOxij!p7Xi4r5U)|nUL>>G9& zKSQyI6w=A`&05o>(s{y+T3(fXLKC3*9BM7%dP>?0!OY6@s$>a`D=$0Q*1|Muo#*vN zOMAynvAQXU6}PP&?>sw!R20JzBL`V4wW^3QH3VulYE}UQfl)Yn+hJ~M@n{ynlTN1Z ztugWP@kvtu5Ov)5RGBnX`)L#4m?wV zQ0wIPF@LOd+EhJdcn8-IQ9{A90uxpMDjS4i9tQD*1S7Le` zXUFQumJ2kr%8)!(#M4*C`Uw}R!kb38FiEvA!d=-`94b97APjJW{zN{>0QwX^ zDtKaL4Dw@geX?<~OK7w zs=2%Rr*c$vHyxvV_<9X`p)vf!r?Gqj?r^fH5Vs-cbf#?fyikgNF`Y!4xO|Bq8=5ck z)BNU+C}Q>a1^gzgnuKr3zL2f$Tytq586QjFX}(PS&RA4e-P7drG``mzy!mi}{!#R$ z17EQ@(q|zsxjETQlwwbb1Vjy8c?Zq(H-h_sTKCiG@jN`p8sIRtL!wUxFILUhDhDK= zp#uiJ0};}mYa;>Sl1Zp@(!E?hc`H4YZ>wqJ01R+APhzZju(R@H%ZYT7?a2Rl>9lfR z{V|M=QbaQou;Sx;F)C>Vww1zjczFt>Ugcs9UasVqg~ex;#Re~k!d@EkGMYY59pRP< zxPv0*+nc{BT(X^79to3$5Dx1McJPW8jL9>fG!Q*LFiFjeY0dHlW}(Gz&r~< z*232B0mI(ZklI4vlC@SmLz7GRe(^viv8Jifpdp#rp1XjtqBCgL*we|?$DRU%`yz_j zgmpfnhGxBHho3_c)xD~=;=mOR#C5G{O2)Cc|&w^_hXJ-Wi zIuAA6z>2L_52$u{zhthk2X?s(ZP^T@VOHzJHzV#$xlQOA72J^bbBLizU35HC0~clv ztZyOvh#~*&E{QAIq>}j*6xd$#YhJw;?CfOuFNb~{^02(u154)7<+~vrbsP%+uN@rE zy<*~e+Q!6z-CVA3*NbYO`MeR@;O(^4m<_uSvqSRpj%^ioi~A1ZyC=RvZPD^aQCc1G!MuZSPg~aKgoMr z^LrCqM1X4g<_<;UDVRz{A@t}MFmIiD1IAb{|4G`{5_W$}bLZ4Wp-q|p<$%FCoP?@~ zbZE$>D)iiIyc3W!L1}Wt&eZy@i=Wy5oBMI}{aUmiIau#xIr&2PpX?IMVfl5!V0ru? zyuy%|2V^EbA*MibF$O;eIW^*nY)@{4Z{sigKK zYf2;609$Cg!?2(O6eM}ATu$MPKFn^5mW}jl^6hDZ1Q-*+TED!oq_C05gmwLwY*VA! z6lutiVY=aMZ-hON2q7zRX<^Xsv$R0$*G>IK1kS0EpcvL+k{}c>XT(>c++!Itfws6N zhpT@d7u`5<#?0d{zt)CLOzaIRh&$Lexb3F`(fHx@mz5fAwyhqnwDFOFgTmoIq(*JXk%2D9Dexq0aC2mI>oP!?Kw zFazmXK-4%x?zwhlA4dA`kc(u4T_gdnOJ`SOWFgGHR>QDHNBEHf>EPqhJTKuccmsZOgt?#(uW+M zt6U3e%#^(P6S-j0F;k)Ls2VtjnxJnnEXp`rg=!YSua4LmB zqmeoku2#u+MhLAsk*AU(ogYbihRfX<)UdRWnE-C2`BhyQ3Ye>0d`%d8eBm1jEH^Tq zRwwKL6`^&nR2>5MuX~O(EV5~ZK*LD-vsH_9bo>|OtKc-U(CBXP*yf^lgK8-cQ()dfOzH3v!P&xP}04BJ#=UB7d!eMw)w__B#Z~@=Ow6pPo%P(T~PTCX2 z=9h9ojc+AwR+(!O zV}Nh~2t9%GgzvaI+rBtmw&lKdA!P&JzC+%i!;qOczk2l|5;X${Th#|!HJ<09Y%TpI z2oCo0h?bR-Sy3Qo045FT<;L1CmebLDJ9)R_i*>&Is2Tj6L&^9^TC?`0D^?>seuZ1& z@I}Oc9K%%6Q}ot|+A`>Og!T*7PV z-rTvkyCPT=4&sV!i(d`mr9$O}brfsO;H}&^6W_mL!QEN=3W4ym@$ofpqvm5W*hl;q z!0QxqKi42^iZF1_TyBdQL`^#MFqElXJF6GYCTS8@P;{2O`GVWgvXf!nsIsCCn*ZR4 zYl~t5$@WWGJ3sNd`9AVq1q8ZDD{C*SgL@vQa<6xAP~|y__Uf{(c>2IIzX$8jPr<&f zUWov8^L&3&3m0aT?L3Lgt!C>J%^{F<=Wao%DMnn`fNSa)Ph?>pIbxn!zrkkM9_a1` zjonua_-85anbtDp5cHIx}2SYKk`^PV%ZfgjoglF=$L`?Ml4#W;^33;-C_xLFZmVGe`A@BIa4qKv=M~`o>TT$4V z?o3Ifsu@IzL>Y_U(jINNKJ~J|p}Iz7;=oEgX8BoaSkuSl6{AEg<2iqtYaF$^zTv1u zcLcn9QT7J&*0SQ?Ed=WPup!?1e3qZ(wU<#^>TbZf!~2%>gQ2z6(59`J zbCE8fsD{f7+DrxSkIS<`bkGusqUL9n)x^xK!dXvxsC8_J=(-)0o$^keN3d7g)d%HQ zK!3@q!U@QbC%$yD+YHj3sD7)y*2u-E-64KANEU;UHI5x6)vdV#m>cbuZve0EZY{KG z-c8p4^(#K#(q3!z-LjnNYTAXW%;N#wc6za(gdP6mku|ZxHfZ zFmzJvEp*D;)+i@GwY9J{TULs!K@qMTRPH7}f&!f;0qA0Rm)8#h=en3$?a^Y-Ih>QY z7wAk1Uq`ytCM!tAS%{UhyV#s*V}vW2MquocECjnZ-~ry19st(#nNnOM2*&Yue?m~B=yWk|Kh2)|TTb!8Xd z-<^9uh-QiD3-T5HzEXNTem6|;bG`1G)axHOf}#_J7u#`0A=AT85QS-Nge8Fj5rKSf z_zUFM`LxoL=?RMIKiVBSqW=sfiZ3(3Nojb9E+M$2kAl99=sYfh8?F@Pue0Y)vN*(% zy3d>3Qi3WlFxa#7Rdb-n{#___)H(sA$R?>ym!Cb71N6jdX{DNW4$+@Oi&yn-k=i|y z@T6b{#uZW! ztNIl3> z1@76uSo39TJbDs%-FnWoNX;*R70q4vPVksxITzq}kUFUBNIg$vEI)U1+yUR;HW;l2}GbV7s&l zQRyw7+ntxcF8_C2cI9-IJ{H3A=hJt4SxW=+Ynj&lu|;NBe|BNwROZF)n7kN{pKP8s z`Q0mssRxCyTx1tYSUvF-vtIEwC+_0`D36TmR}9AJ(j=q1^YvGdjl{Zl)RN}o;ZA9= zcbF<7?zR_G(V|Ru9FJ?r4#)>^ofl}h+8O@wx-K4qudDL$_Jz;-uwKIN`JNd`2p3#G zZ8M##TQ8U9G+K((M90m&R&Oa^q0oP5pwMQ}zW;M&i-b>8U0?DB|LLZj7)eN#wvxf%KL#xaPQXyJ%RkR45NHzHvE~# z8Cz{A2??}wn=2(@rV@l>1O5>pLT$WN!TZJ|$X6ksLT0r!=0no43x_(s-<}YXV_FVEq zSu!A=WY(31L@LbKEpI<~3M{yHSzziL)SZn`@=Ee(@UenJU2GYEdnL@b8*|-ONUtEC zxG3gCl9p@7t&tOhKwLn&287F@)beye(EHZoC-!8v4`JOw#(5hE3 zxF7-yUT6=zTOwFOyVrUAUDE;uOElvxLn#aqt+R(VgaQKxXLm?2EDv)h_GLnX2KS?o z4TO_`{H}~(Qwds0R$uRr=_k|1pmt;mI7Mk%!Y9_nT3lTS*)SI}N7bi2ec5_DGGs9t z-wZE2mZx^qFWNix0{@85UsoAsC%GbDfKM{fpDEvgEnsMDzh+QE3DOJ4iSfSfLRp zG19jCL|=si`h!fG6NJOcG2{G_g;)Q-NNu=G|KG&e@ht#qyPo!lyXm<^xAK@)XXhY8 zKPqn^GgYX)0fQ6&4%*p`6)*c(w~5k~ZWCeIAsZFBhJlwYIr}8TW{ z^sH*{C`428-TzC`>O6bt7$HD^XfQp&=+4(`K6+1+R?4Dcg;F(PuoLqMK$78aP2dn9 z{qL+VvB}bTpTMX04JQZnvC;OJ3t)JWl{v<1ACznM(G2h#Ffn7xZ6}on^M9gg3{C^1 z#oVIEd7F;e)-R`w2aJ(<%fyPL4`LF!NSG-iA2gMbS`tfT_)n$CRu>F^3J24>j&NPM zn-m=#73~l5lqEus&%G&@GRqy=PUj?^?0T$8l<}gcoLQan3*+A$qnC8XT&xe*hBuv0 z3U`#gz9d3j&+SpTSyh<3-7JZ?8iKL4YdlHN4oW>yMx`ezqGh|I#Q;lgWi${u06uGj z55Q;BAOZMnPU(O6tpESTXJfbk`0OmWE;Uus-D7zn39AV(F{cf2khqMLiNugNZuV1X zeBa1|^Is7lZ`R>zWZv-iB{j|<8<_MSz{)DN?81HKVEMF1jIO<;ZO_c)Dm4o zH2nI%twv1OW(`*mnRu8&+H6%-pjm8>lSaztvP4mh^p*$M9gQki?*=zXrdZ12Cx41c zz&J(LT^32OD})j?)1f_0Dr&@IWaim-k-*(OgvC<0%-|M+R-$3ntnlO?#QNC zkC}pCyEbhivPz@JyK|1=S4h7UHf|<`H@N7GdDtbt!27YGJev&_T80k|f3!b{`{y4T z7`)DRL^7$kez7u{2HN2`XQFMdbRa{Jtpe&{##}+?3gyOSV-=jl&H1TOOfP5)^A4dy zGt5hG<(xoq9+&fKJ@ad|)c5mhxz8$#V_4Np-b}0_KD9M@#u4WWvMHg|l8_zNN+R*u zzpX%yT$Qv!4F5|u5%T~jg1^VD+Ot*2)Wv(s%;=ZSW#~#C-Y$)pEvXuGrfJEPR!f5v z-L7j+(_Zbm$swk)JMZfX081zgvfW1LS>OMK$eJ7*6U1bjWEk5ITZi0qxr?LM^=?4e zMO8!U50cYY2P=16h4^Y6{``@nF-O*;t~u(7i?uFH{;q22Kn7W;$(u-i7|L*W<^i7X z^pP2RO7h0c#BiEn6&$zWL;3pI^)NK$BCZM!-M1?JK_8JZ(%gioo_3lJx}nuqFPX=_ z2vr47WEe15b$rf~Q*?`>vOj{K;UY6!8E!0Tik6FBW#wD}rF6zL7!&}cc+c0cWkKS^ zMc=R4k&eC~$_f4-0DeG$zhP2m6q5f!Aw_U0OsH?nI$G^vTcT%8O*PUjR3crU(Ym5^ z2cvrp{4evpIl)o>&;Xbai!flLm7k*fqjBL_=fRKOQA9+!H^O|2Q|;cSSb#jAW^%M36XfLw z2c$dc%{h_ij7>?1z7Yv!=l9^ThPU1@frq&AEdAqef5-p-^-sSUkEi1^=f^+3d;jq( z8#5<;K-LXyB(}6>n1er1_EDLQC>?I#--Ym&Nzl{QH&NZobE#}$ogmNwcZlw1M+M2O ze1fYHXC1;#%6qNLS+YjzoEl7NaLPggG5`gCsDq}Xov=6&R)7-n*anVZ3*ei01rR!H zzF^(Z2s0{lu_MWCSuIfeEf)MyJe{!$yB15_SG$A~t+Vs`EGOBeDnCJ|M#}KQKdwWv zx=Fu8X1480!+Pw%nlf_BF6a;X;te8D<4d8TUz!x4{@i|8T1&9zZ;7I^&lz@08LLk^ zcr;^lU)kp@OAtp`tIrRo%G%QrO6r~-1x-yy&^U87ebVVNnsq~$#OrDr+eL|=`uE;- zn0j}mQrkLhWTk$3Y%J5@k4O)BnTrSe)A{w<+mSP}OOBCWsRO>F9TIb@tUx~6TeE`B z2jh&KpjYl5E^Z<6mSPwFV|FQ^T{@Bu$+K!d4WZ}Gbx1KPUI2Yb&$yihmkTv!x?n_Q#{qIopg*VHHaUYU`Y;59w5)(R=ZJ0&>y?@^iai=)u9Gr!&2c7TVfA5yE z2I)NC(B}Jlthv;Xp%(G_(GQslM3D+2pS{ZpJ_F$3P?^@Y&k*vt^UY&s6voR+_9=Jr<a zW8Mg#`88(&X;MSIfXDf@u$xjy&pShqA9%N9l%i4W-)*4bN3zBpFTD5TD5Q9;@C_XS zvj2!GO8FT8+JHCCoj+~-0IFX**c`NrztuJCr?qWSI-oIYa94JX0J(Qz1iE}55=hwr zD@fiHa>+^$cpB~uJA1Cg^x86gh@6$1P)|a-73d8{%}&Ws8QoKl!Z`;16$u{Mwd*!p z<*;^DqB;J5_TFyUaU4q*dlg1HVxr1tOR1kN?VoY&i0aC!cJ@?PwJWoK?1_mAN}{&d zNs%g&%ALEf<{f8F{j0J!sNP;8?0u&|T#GLBf6bY;aEPPmh zSeVZr=F7?LwDJ1yf`Zx8? z)V9YE)5X}vcuk^(kS)@bWjb~@c!8%r!fXMbAo$o4!c8X4=}ZaHX_B=pJjZ{|*WguZ zS&-(jWicO5#g7>GXUYyK5daBrw_w{;kL6&aQE*3OalmAk zDmJ=78dA8&>fef3;8`3nmwS-(cEXLQc>r}p^EhZ31;=o$KY6jTXTaz-A*tRlx_O4= zPy3>$5RF6dpbfLxP7>fAX5df3d6m5#p}`=Iz&vQ@pSQ>B&Zk&7r1b;U12 z;^G#gb>MH^=VQpP*r07>Ih`lBLslIH$qjW>80$9U8$k|H5{GkWkq;bj<`;$PXUi8_ zh*~UA5kWZl{C6-txtP&6RGdUf5t1pRpD58!6r8ufmmsD}3BD1rwIqwke}Iq3W%$j0#jv43dkOK ziHoHK3MqVJZ7wN0i%VN8bgQW6sFAL6;(5a+|Xzju5mwAhX!)^&`-3pJvMEa77N%{L1u4R`<*H|y}0&9oP3cswM*)1+%w@`4vsRn?_;^yra8OpTY zF*+ZC5+K;@8E1@4X1^HfPHy&$^WHOl{TQt8Zzq%G-LJE|$zn0Py}w(k+c!30a2RcZ z7oXiS(uZw#i&n(8-7#2F2ees~y~Qb^v>t+gIK~!w+dDx{W6waCmmHlKm`TIa-S~Dq z9ZbnFgMP|2W-VC+&KGA5Kkw~z7_jJ<`$0}$){r|;BzHgvh)IGRZ`c1Ee1hC>T&xiz z9=`H+9lM{Q{<4D07b{Ys1`dm5k;!Ck6=ijCb&IK~GCOJ>LKed--4FfKNj_y+rVUp)aL1Ethcd z=*N*7o%mOf1{@(CP*ntjg33`)ON^w9N!3UwosTL)dN(vYr>xYp6(#9HJPGI-eApzF zD(myg(}yY+Qjc?#CV0(^L-c|-2`!N#?sBi*CgjslMab{CQJhsWs@APyh#+LPiF4S@ z%~o*&wg{fVhi(?@a}f`*t`M&f|>fO3v0C9^x`oo7N7D>XXNFOi0)h0%*I z7wl$Q;%1S9)-3uyk9Opl6x@lB*&gmvA_s$a80K(o>(6%RV&sT}q%iQfDIRsuN@fM*1$vBA3<|Hzz@?KO?2n4prUH5Ak}v8TL80^`j`Yd z{+F!uCX42$V$&*j1GbZ-oUnM=pFXz*Es@3in&#{c8ML(CAT-1ki{uVwm&j|yrR`$n zq=}yWpl3nkv;!z3O4xaN$@jb%-)Rn= zv_zB`p?Y@W3PeS}$N{Q`m{N)0!Qg2=nV=(*GD*8kG%8I<=#+;rVBjjHB3x;X8fWqK zG()hc@C04*Z8~OW$-%Uis2n3xxQc1T-hzLV+g&t7Jz4Y0dO94N>Asx#Z)2M)_s2^;S#VGrzETdqILPR_onBgktI4;2c7pDgIwo@N%F# zlflFb#6&HD%T%PEE7W7zprr`8(ttRykfnfnY*gP10s21Th&egOvvA3|*aqfvxTz(I zm`YSBhM50F4(c^T5K9D~57@H-MolF!%&su7U7??#U|~_Jg%T)A4jV7@Vt~f$ItUsRcF_fj=}WBcxhI5eskRNqdm%9@=Bc=?m&8 zw;~B}_)U@l2VaUhYRfdz)Hre+F~TSst0oLZ6fe6#zPz4z#DzIg+G%qF+9>BDq6 zT`uny_jgo8p?-twACZirSJ)TPJNLJX=`wkdrSW%1&vRmDLm&eBWI7$Wv9nLUL1H<= z%zyJ{O5d#6ALi3^C#WBr6sX=jAxSG@&Li2g?8CvaL$rm(c+f#4@sv_Tu+U_rm6`K1 zocxut!{t#6JKG?L#rT0YfeT;>_RO&W3(Uj*jE*J&7TKAjwp%mws(m-c%G%Qs>BRh< z<3@sL_^=nkp%HTTHa}}9HCJu4aN6?`L1~z+`+Ow9u3lIw^ojO#G&fVdQ6LKKXc_82 zcCiK<@B@%e0j!=_4_c^*dLQ>IBuI%4g#T)-|A-LMp#LOf^rHI^E(Hud{GxVKPbvMz zs_Vz9tD6I3*U90TiikCymk|&X>MPlp@rYZTP*q9 z*$A$yGOa4Cyk-{K*m>yx-%l3HyUFCX$<8YpghRFSwzd})tRiL#gScWE#Z0;W*oebp zH5V;75VqvrIa~Ya#S95QNR-+HA_;j2D|*)KYx+(!eEvpR47ib9ii`)X5JlFi8|77s zu9JEyC8-uabf`*aDHbQwpK7N^R*OQLyXV-xHZ_X2pTzzKsY$6w3L!Ie2qKr>uEcxX zUZ3io{81vTN0ln&yGg5ZeWX~q>z#!-dPaYwUP-*Y(VZ=#F3i*V(}g%|=Tv`K%@!O@Dm(jztFylGfSeO@hdAO_~xNI>m`0e2` z6S~hk@rl82mzdG3DSy8Wcp$Q3L2GBoyu5~;nE?5Ai9}#7SZ}pmeBHU-$ZE} zl8I!LF!R*fs)|H4>M0n3Pu?y1{<7!o_0{ePY-Q5=Q&<_!Mg4$j+yj9fy}=JDn1J)S z5D0A+={ix2MvN|2H?*Q%fTjwFI=%m}k^OdR?JZJOZ|`pJ8`Rpe{yS8)mg7UrrY|Z^ zy1PziJr#^|b1qWZt`zKyN6k)0U8+=RN>8OrHLgAFp~`-Bsp_s1Rcbi7_hJ)dJaFo1*iQ&Tef&{`;$A~~rD!eblpV6B|^#c|*^3dUNtAV~{eBL;H+ zAXv+Zu_I3hezg-L3weIv|KvO)hCe$$I{tIK(*}N}o+u2?#A`kFh=WT7Ich=pZ2Rs% zur#HHUG8CPR1_hr0Tl~G^#YDLo|`Z-Kv;-0%6$;R|1w_=E}>0?FO%2S4>$@;g-LId zgF*%AZ8<_xC}bbDhr-SYZbhOvP}pNZgk?U!{CmfDLR(^33UTT_;5|2wjp@n0ML)3c z2PdvWu~gv1%@LBX?_hg}osATIcWry5x+}I_U(v7ogJ3#C1O z!;?W0A4YG&ErTT80qqEsVhC4yB|lofUSJV+TBVUrr^^Za@2oM6wCF1ystb6^4$C7| z1VNaIq80ewD{ja_-&uZOeR5tA_(YNW40Gc$|3)%EgaK)ugNdon>e<7bfvW(tWyIPI z{HKyD{3g=`@!N9Wj$eYojKREN3|`2r-dI~VL_%LT0ykFVAd%lxzl2)5Nu4i(W3>yN z;Ydv69H1U$P)I8Qc2Z~~(1bT(7P+nTTcPu_!qEejww3@Q>aexM_GF#5SMwH&Y_WTN zRfDzUI|y!Yt)ob}U7>xR!mQipIlz)hap11uQ)|d7LITwqWU>YrJ(xa{({{VZ4Mb=i zo=#h|t6-ZtM$Xu3>b8t|?D(_YCZ{iG5ISN?Fwo!ysJd>90Qh)FF7VE-3~4m`E^`N| z8co&vMDo(p-FQBni(W-WT|w~Ty&pTzg%mSQ(F@wua4#6SQxUtU2EiQ*)jKJW7NJlY zq<4da=gj4RQ=WHZJdjxe69MRg0cSe4=txEQ0qO(7!}zZaKhduHr#Ts%P6`1q09MY;FgTdA_z}B*4>BrW*pa8ZG<_cwltbHP@-gJiSl3J1l#=TrQOG#^us5(;>%Cs9a z9WSuSB!5r3AS+JAcm*aIbjX2%E7G87+EuK!-L&4 z3oH-5s3T0gl{*-c=7(87vu{WAa-@}$+!~rBex=zLNeOHyvIAK;1l5V^c0I5zBGEcw zzDYoz+8xd_uzxwQf6t3cl`>zn?*;@BYIgzhirgK}TrRc2f6C18V4s8eq<$yT1UFDu z!ndAr8a@utp{0e9FxXm@w}>QHkPJbb1eH4kpY8`(fybh6JtGlD;Y;G)QqKd-RYjP6*ig%A}CG@*%P`Sptg^3Vep>>2XPos*OQ1pO zuU&P>0vye@h51bmC1bwF*0-J~AB}5p*rsmocn8FV4&E1R+C4cGf;zDd81mCoCB$7q zIC-@;?iSB>T=0He&vqg{;2Hy=W#9On@r_^SCZjhbS_r^+Ia+{0J@Mjet!`oOY zlzCv_I`#Kz3F|TIgw^I3258R%XqDF6dQfnD4~Hx5&EJnvT8EW+)EY5GNUBH7JV6{V z>~SZ1m?^2WRcNLUfM@4W0N%-)Sh+?91HQy5Eq2Pix~b1eP~Zn-h9kcT;~&zynNxsg z9!n_>A~XvxgF1?bElafAM;i9FS<$l42j1oe1df&ofLE9oaJi6duSPn@A#~Ob3^RU> z2Gui*HY>oh*$~qgdS4$yY#lN!<4`&!Ce;c;Cpvm@(s)`%KR{f;U8Bwyv?1O=eJIZ5 z5#3dviVPC5QFqJFkR7bk9z zO7MBnW`C614?24(TTwr_U4cMqwlfscpSU@z5Kg3;DHVHwf0GwRM(!ZGLBYiAdDNDUd`K~1o(@VqVT2@%%-du7skLBJyCB49`pjfn6P7ev;~NpB?= zWT#c}?#X1jxW8TAPo@pml9#G{vy=|0c(=RHu6)Kr^TS`{2p zI-vL6FR7}E|7x$Gc0PTSlF^G=O1NzHffB2Q!!t6`f{MDA~_)pVzd=F zn+!MUgZ9wbJ@0@arXTc7cx?jEmz{$I6x^2)`T)wSASg*cA6wt1My{&qvp@9!Pk zPjbyk_F^5SAD3^QP)mN0_y0Q^gt<5~o%BXRS+p-omE$7;PppWYlVnOFN#EKKc=A0_ zS8IN7E0P52xcDg`*zu#ia=fGkoJok&FGkN!PBh{5H&5{2#OaWK_lX?~+V9(^_gi*E za`Td2lq4Y(sIAc_=T$Yh@FkvhhM?wQe81p>cFJ&WJ43h{q5a?nhcS;a+NtUFqVQwr z{C0FhG!Eb*f*0eMC;>T{!KXCvrU>Fym2}mcXR2XMw!Ba7{_gJX;chZ(a7mSXS3`A4 zZEY_qxI!4ohg_jd`nO@QPv=y^m(U+qad@m|N}i#UI29V?S40Jkx?lfwg8RPk1z%j~ zs<(3MRq9@qXkg(%2@9_09g+Tsp}40RDR&9%@H5m}vx77L@uf*Ul?ujv0Ryv&lU!|C zAU=z2ufvm1l?}eOj1*ZnR z5GlLuxXKRo^mu*tLeZ8mQnz2#bH zdC~;@6y5V-i)8iatl-(DDS0=f9AIh`vgrumcxbi}_rYh5iHLI-ay|!W2X%q8Kl}oE zckOJBA=Yo*4g7*nMNl7vJfEYD`|Kc{-u9jm+3{{)u~2oJ<|R6)tU}pCAD=x_!Wn)$~!t&Pn!H%MrAlzgnA5o*9T{x~{;}`)Fg(Nw7^%^_4 z0`Q+d{xG_?(Boj!!Zo1YpsJO7V^s;TW2`D;RT-_cRqJF_ogkIO7^sIor%;EHkM{ zE{&K15p4g~-iacJ>=K5olp*GnJ2D9V^FJ2jJ1`OchmxX)r;zlXHXMHQ=F8qg6O1r7 zbm&UReFV$yn>TygKiVGsomi=8)d#-qZLII@DE916$h`eS5IKjP^^0Radr4yu5Q3Ng zI{%J7!CKBYZ~pejAFc2Gb@+O~!};OWkL@owCj2KD*(idAPQG|`Y}CSRk_HNoAzGok zI6geSef#qAGJctlgYfz7$6wyUOK*Sq{<{&w)(9R>XVb~sH&6e{JpVU3J*7cHTV<{| z!G#8>Q$rJ&MS#C!Zy{g|(j+Y{bwZx#u@qNf&B_ zr_~LUb@dAC6|J-ACP_s=zv1eLbcw5*dKz+v>{xeyAW8x;T4+#S&TsHt;KL2>VRCO! zbUYj&8?d}I&=Q!uojkln;=hU9=l>49KP8>m))%zzeR?DdJ;LO@q0e?ma(D}k*V+vy zHV<`@Lf^p@Lxc2{&u-+#&Su2E`WNyH-ekY}5x#o5p@U;T(R>|x{F~lfLFP}0%-Ldz z9S2fZ&{|2QzGwbN%V^90Qe`|}|G5?^oUyn;=JHH-7 zOfMe1lvlpM=BkG!?+&kiO#>IEhD|@1*f0$y&>@F?3XTLPY$q6({M{bnIv)#WNZ}w{ zf8{Kv(_0mFrHjq!cY%Njt zxl9>RA(F+GKrO)o5TukT5SfNg%cWv{(6*4 zwfnDvEE@iH<_ED;+#>&Eod-KU$X`2*n(yX>h$uFJ;x@y59NN4+Kfbqmf4JoB%k+= zlphf7u#xYMm=iPQ79meGduENbm#V_tXK5W4RSobH5>XnSqpc zdbSZKdeTSaBCh1s>(D34Fx<})N;QkY+}LR}3oV+3!pKQ}n@&=xS*0R*CZ|s*i>p); zIsjE7e=7ivO^{e}nwm~fFbP<|TWEfuJRUxIUqH*T^;2NQFG1n+2-hCm*`J;4^7`yc z=vDT#NQqEdYOIpZn__w^t%?}z-8fcpW8oQ~d~RLn%|4^DjMsxavx zTz$21Lvr4sg3aV&03I)30k4A3_|}w_gSO@38p6i>P&hr5?z*d)OT5B^bDBtasfIoH zAz`k-iqcBsc|`km1I5hYK=!GCjj>qbvO}re{g1Z@-R9Hf{e3;cm7#F32xlK^mOjQb z@uuL%MH$P_mY`XObIb``ZH5wy+`Oja__R=~_}#@rs-iFat`0^g~jt29VRfzEJ+-w6i72#>q{ z$&srFb^3iMr(hSB4kDqja^y5{^#5j)+1;{Xe=2WeL*1W|^rUA&A_h zCJ}GZ9lT?NrzwD&|1fqrp^N5*bOK%hT7D>I;`;@ptsj85r`}A+fQ}HCqlCRKql?jn zT++04zhtGIvk&n_skE+AX*64n-P1=Qil8Qu?S+oLc}?Jn0wyLUBZE*tpw5jFSYO+b zLqOB5uUz#5TKPxMMnjrg{j?d}dP3qpKt$&|&O>{C$S`R7R+IDT-MjC9{qg-z|1w=5 zvGN0UXp(E$%lul=9!&=9R-uJd1q6o}v?UmYg@AT-Q2z3S792=9GKZp5(PiKVBCCLo zW_smsGv=sNzSPEuMYb(11&IcE+NEvLk3r>0wC81vglOnY9*H%$@!r}>gq7( zHbD)hD5%s8>VgO+bAx)(JJ|l>a*n&WeIs0VtlU-X-CC&MBBk4_(mZ7@c`sWBCs}-h z+}h02GfVH>mR?OxiILluaw{{bMaex0nhsK_GiZ9gXj&f=l4-9LGm}|tB}z`6xTK_D zfQJiGk79d;UJeeU#OIo&Fjc+LKAA~D*?<~y`$=o69F67#rz|Za=h(Ja7PJ(R+XhJc z5N#k{$t~Q(7e2c_h%EaQ>iqdJBr$CqwD$MdHA%g>S+oW-Gq&DmSx?k^NeQDx|C5-? zGcLWAkd~DaB)5TVEL_tReo7pc^vBaCPqmzrb|ISi^5On&`Y@X{r4STjIYSN6Y;7+p zgr^Jgl1WrlA*wZUDien9kNG$(hURN{uU@KL{>h3|>Pvn{auXQ_^px%|56meJM73PU zJ=NhKMZq!b;S@w=&$udoMe=m_qV|2USJ^Wzaj%FywrG1_jB)zJ_2Lz=#1upCi=%Rv zxD2~ehO)Zo{c=_67nfykDoxR)FneG8m3qWw+FKmD(0+WSCBB=R?xk(RxspmgkPC(H zZOV+n^igZ;PlTi<>yIUVPlPWlK5=-jP3bQwJVoJ03gn~^IVb1Z%L7tKl zBg6(J!4hCM1-`-$?cq;BS&=ev{eWPRcVSmoV9}46^Ev=0$d=xb(TO@;VAtJsB*t31 zLnrg)?P9W6%q))-P@|9U7yD zcGZmPSF#Q*6lO4;K!`$Y-RC0-h-uePYx+hy)^a?bjtAr-6PY2SxyoygNnx?A z>06B3Y@11eqKG!?Rt=?DH#&NB|)zV~D2xzK@1^elHZ;E02Q1l(x7 zL;FPnq2#aj@Yy-BHYKAE=%idW!zOugaIw@{`b`+M7p$wD0~0}&!n0ciNh1+CLV_tx zQH^=l8rwvOYQVNUNxdK(%dr5?k=H>tB&C(IM+i>P#C{^F{ZPgRnk0_9bPzV_+rfH$ z3?s{Nu~(F4`X|nn(xo@TJbeKY9(U+_)oUZ0s;m!u&CtWN;goDPl7XLHF3}EGlWD3* z(4&ZW11B$Brjv9)-B!oQhCPbZJ9hwQmH4ek`DOCH{joZMm6E6IhE~lhE)SZB54Syq z8f88u>&80zo)bkX+svx7+156+pNWtqH&}(Z^pQ^&x5{pP35U4Y#N{SU$Ktf29n`8? zq28Vm8&DX!e|=DBC^VGCuN@%ODq+4m2zOT{?Vmy&Y@Pz66v`=u3exH#2hIp)>LC2p zUJ>k^K$nuyj|zynY*PNnW`@sK4$jQ2go-92i8CLo{A;Oet?b66nA!oJ-|l z9<_(O&S^Y(f;hO><27No`5@2l@lo^k&dx$J{a|@EhfRQg2g1&uXoP+6V(@xh4tADj<_VX zk6Ix2V9;{7_)0YV!1;pqpXkP7nZ)$vZ`Cn}l75g3ZTaoeFjt zSfB33bG;#R`5IqB5Y#$HgD2cl75tp$VsAaF6ALBLqPh(^&F9GrFnKJcLWt1ZMTO`! z14&YONR`qsy)Zkw4<)ZpWPpQlH?*ne+4gyNsU1UrNBPA1f$9;H`Fyfm&Tp4ZdPGs- z7^)sYCyICSt$8j_c?Cd8|KVH!=kE8;#ow*G~)GDZ`kCGBL$=@TOsJ{(g*N)oNH_-(q^g zk>UFV-^W>w42zz|xeV=?Q7*LW#Z+6s8u9J5Ys3;|UCaB}Y1C?^-sy#scpDTo!~szx zjiJ4cvn+kyZ|(JH1+h3TiT&u!oDmR-)1_~dLaI2EA2*e*u+X6i4*)~-{wBBx5N$F< zHWZyWZO1U(K1VtEtOiya*#-XSA5IvME^lx;S~6zLD8R*Ct89=q`SYaQPg))({iolK zLHy5S@;^C>zxwlknM`Ki-&jBV`Ntov4G^==c|E zoqDTQPyix=VqmuS9E4~s?9)v;_q6@?+&ykwB&(N=InOmKTWq$p7p!fMIT#I}0d%Ba zLZ&D5&>aOUasw1H)(#dgy_#`meYUQ*noH&B_iS}_*U8apeirsAHU|+&GFN?${cQ&+*PlkVXgHvdxVw&q`cKDTK1f*AxD`CI?HQhNOwAi#5 ztkCf%=T*P0N;^ta5pheZ7geNT=uMFqd38iZx+l!h>a}z!Sn+v#m85$vXPLC#loFP6 zQMDv@t|Prt3yvx#$(P9)Q;g`;&+CTi1w>KtJTE?%icDP+qe0)}K z+2U@onBLwuU%*vRbIwS6VWb18tkU9Pr^0b=dXC5dpuGSDj2z`HNqM4nx!DN&^cFEjXqyn^znGZy$Tb zjN+<>;p-6iq@++b`4MzkHluau9^xTzNhl#q-d4EHWSGQ{AH(f>l*r2{wv~HtGFJHg zVZIiPWeQs6)#Tk=C!a+b)+@~-W8JA%N3@@1HSXwc6J)GFX)AE4B1=Eh2vY+vd(_(Y z6CtU=_RA5(G5dNv2C-nhmfRY$ zk$n%R?%Icg=aN)rc$fMRaZ?!IY^E3d6ti@S5^E@*!n)%8tUd7$#>V6c@EM5^t#feX-Eba5u#}wNA|Z zR^kV-6BYdA%!bJMS!y#B;X!gU#YA=w*y-S?_yS0}vjri%t< z_#p(dlu_q6$Feet{9!*^J-L*p_j&=Xm>JsMC*;9PII&VrxcP6zRC}D5haMC3V4EGGfI^)PW3W=r5 z;xOlDIm1I=teMZj(7-pV1jg1mq(NqksU;^|@BX){$<_&XyxGHwC;y0$u|oRV`p!TY zE^70;1b>^-q`^BCC)x3IWmnGIaXxpD{iXe$rYI4hKwf`4SC0Fp4b0slObKGfTNV*t zSsJ8w((A?PPPTHMUEims1$$@=QucW7IQDvHQ3-~3PF}@VbeP(mguj1SOct}d`=(;P zr9)>upC#j`=7{Is)0xblvFap5b|M{vshyjMv{EM1^K;fv*eurG?98I_Lcz)vE`eol zyuT+a3EKjhTb~)?t!atMux0dG7PqaJAUs7q&K7+1Re7$LD;+EPr58I+x}7r>W|J($ zQ!z_=CoJC&$9@-=NK=7MYKOR2k|&c*6K`W^y&s4WCB7e={Jh`2n)815r#SD&%wnU{ z9Q}+9cUpeq)F=Axl|*8)0r*vD(|9YkpS7NR1tFRCtPE4e;s6e!x#a z6Zly%f4Upr4e9iu!Fo+tuh^H^`(^MV49MdC$!>#hgZ|}<+_P<<3&dUv!d}N+*amHf zfVK~c{c?G@ii35@Tai4I!d4M-WwDhZc5slIplHb-VZ|7HkoHT_Qo)_56^R~af}T0~ z(g~WWykIwk(M&HNE0vsls)8SU;WXdDTlh&1ITf695-0t90Mx%SA1+UpbfRQYHZWKY zD0AC@rJjKAgW{;z$lZ>x!;YI0l>FEp7L~@kSR#8*2};L62n)%lB?oQlbd@QqU3RFR zHo2%_M0CJwI)1j-kBhX}A@P$A=y<;Pd>EvaLt4ebF_zCe6L49fP8vNh9TKvoW9l|-cyIx}cZp0o#41yLr3oRelQ&L$HT znTy3{`q>)N8EoDV@XN^+@HZJA+M5JitkC)G=!VHDc6v&Re&=|B{~W#vm3c^5#0_Ua)>7U(@C;g8ko?M*r-2+@y*k6SVtZjhFM-uKu>={577eC zs4ZljBv%{_F=Q~CDDi?-z)C4AwmvCb4iy#n$6Am-IGBu_HMY{|ev7|7g}HSKP~=Nc zzlq)uFEF5aWuU3^N*GZvLZ}vpujtqP!Lwth9$E`8%OR}-51Bl3g9F~I(xidj3JL4^ z$W1|J0GNlA^+xCrO_nDiFgqd_J(@kg$7y(ymmOI8PToRs||AK~!k3;j8CBB7ndy(SvA%8wQzd=((zR54-=#kxvI-90;s@NbdoWnK_5rYE%4AI5ig{6l_}`nOL| zD)E4Z9tq4 zqt*Db9HeRsvx+b`IE1}w@0OT^^$WQiPuH#SbX^+;^CFgdGhkTZtBS-{y(0(2+M=>G ztPBo+k<5nn8g4eaM*OXlC#|qsB_U9qU{H0h4BYkrw=<35TUOMP5vzby`m+?8im=cf zO)~}zkPa0{St;rZLz52(d`=B~UKf07jLWi81}D-0#H#Q!`CSe`wMB0$STG1WR0Pe* zQC|?6N(RADbLQpBFjQx#swigU4z4;B&F%(=!9ZS{BWTzgOYWPkf>Y)dIXu-Duc~Ck0P0WywJ1$}Au1~$1X4{%>dGKhZc_ri(w6% zO2DbpL)Ge%L=YG?$DpnZMzzP5qTm>=>4=mOll@f=Gd0JQ3gizCHLp8KpD#oDaWf|s zfSe|;>B?|ZdlV^lV;*4Q$8t!iIa-tuJUEEF=98iYnbD7oL<$fj&P*8S+AvXj7zhg& z|3E0`cR7^Q91be6FgUn0b~sOtdP2_J;m)bC#;*%OZ#4#nfI5<;0oQ@81Aps2AIa%r z7D#JelfqLGmgMlXo*@IPLxR;NsnUtAb#n4FU5@8db1LcDa8~1~B&a->2h>O|8YDub zEOJHzi~zA^9&J*<4}YCrWJha6l1uL3cfkdk=ivReSYs0X;RjGHaP1v8P*o5Hb%%x- z2|gkzU}-_`CKPXOtiVr;Qf3foV{b!*>lE6b9RHC+C2sM{-g|U6-@Ji8W|Q05Y_fb< z-c9b8_sR8?2&`h)KO$*IuVgPyAMPI(lf~@re)*=%?(dGC=fuv2AQ1G)bUJd8f|-1S z1f1Lp`pugueY0i@nosfI(WxO93&u8DiyORAxIP-V0LBf!aFdl`BqO(Rw)WAB@g0R( zt;nRL=P?X}qYu*0nc1XdXUYJVD^UjU)RIYO=}V^--+9L)>c&FilCqWDo=8Rm^`8z% z=97G>7Q4nxrm`8Y3p$H>_fN|-7foo{{1Mdk;F3Q~7w z;~Wsipg)uOx*K)gIx;yFBz+gNUV~xkZEAl^#{xwYfOJmd-;|`{7 zL|-YL!KrvfPD|4kf39X^V2az-+qTuxq#IRv@_}tylTvsv2ic=*F}t|s+MSCD`;kIlq8o91cbFdA zf2Cs;F>OcM#;LuVkzJoaES7|Jlo}7@FqJ+2Zl_hx<7`>jJ88}kUYClu(3ox$tp4t- z~kseScGUfO|C%lz;w8)&f_jgjZS#X$-&dTfyHZsMUB}ptZb#HPs{1tHLuBm zrnX#~dWHsvp;vueut}==0@b3N0LGfrGS`N(yuh*E0v0*C%O|oqKg)rwwvafVfx&_7 zRR?dXq)02ca^wOBZA@|BD+5)HVeniTHMyE;BIL;-;~)#9RVbSl&LUn1KHOv;__kN_ z^WGHWD9P$bf;gFvA3Mcg=+B`Of$x~UQ0~EjkOcNPi+We{qlE}x1qdirj2N2cHqBIC z9UnU6l6apwn+d0>P;IQ$YwLUJMK+EYDJU_7w8+qJ-7s_5`%Eaumu1sp`xb0N0q7ML z977O7zK8MM9sdS6me{fNUEoK@y%R=Ovd?osa{wjnAh!#wZ!FFxBg~o)C@VLs|rV4+{X&Bn_JSd5SQ!;?A zYqYac5zz^Cc+#Jirb6|VVck+=WE5noR6jL+D1~|=?B7f5$jOQ8Czx(ULAqLR8MHX*}k}V{Sa= z7pO%Xdbs)w11Ykfrsl%kYttZjL2tc@PBE;I#w63~x8#%%ZNdFob_S-JTzQIVgG}i} z*cvH$x*so$-|E_MS7W@A$Xc+4a;h<`fD)``zsZ5Awm2q-^ua;s6}z;!(xV?X8F@fp zX`u4Dpz=;*xU(om=d4){bEgWvMt(Cj-+yJYLuNKx_lH2#99ps2Y|5gxM zq_D5$ZXuO3Sg(&^WFZlVFvcS4*>+BWqICnJ13g)Od%ktIy6fc9-QkoKt(z8k2nCte z2%gY9hRtDOrh>RmY_EWo1T^WN?NPIHye1>057d1 zNREWq@QgVojJb}+7LbJS6BkFaCKe1qM2|wil%T(#U7uW*k=p8l3-hNSJ5|8v7v8{& z)m}MX@+!7X(RSc%M$b-8C`g0w-{iK7{JXhx1hn7w>Qw!pBWweMINTF^0h$gsdND+5HR2_D{|;5}nV^ zdnAj`PN;1!D|a>EeN91hjs$q&CuVC)JYKDLx6aYG963F0aN@q=IK>FK1IUVkW4I>L z40v}ERO{|Dj@lwy!taRMM%rPn*x{R}yUH5XH?qvY3;l6|B^65U;w+U0NuIUJH19uT3V%_6ZWqlIv29wIu2x7+SmD3IsgsaKi z;Ni?^2k@l5cF;NCoFk_{?ErJzq#a-z2!s<^Qz=u(dLZQHhO+qP}nwmp;NiOq>^C;zBHljj-B%qGOwNWS(#7*$IFZAykP=Y7nVl3UfhfT=mFqr*>w-Ug zzRR<(1iOOad7iZaq8pLZ)mQhUyYcd`)mFY@og-g1hxT}vFO4%Vg9O$mBR`KMoxR4r zUNn88%3WhhpoHTGjOYTy(+f4B5?h}q=P4VI8#}J##NpL; zr0%e$Ke-#UN{MG^Jw6tu|M9d3OY~FtZ5*=PC!R-8=VQ!9uV|Ck#16y6a_N%QvxGU= zZD4NWmw$8Eyj&fHIo4w91oj(ePh69d#v{i-Z;U>`e`3<%H}MZmPPgVk)cKz(U;_Lb zOFV7+N{HScSvs@0dEaexJ7E1<#ll0{B%Z}DMY}N?ImabEGlQ&RW0 zx(x`;h(!w)wF@syAO)pg#vz^A5%Y>ot6JZ4#x-J=2f~rdEU)6dhqiScfCkl$$~Lt# zKMX;s)e>q`y-6=+-@r9>{NamW@ScVwSJ3tYZ@Nwm2@Ia%^*aj9I9x4XPY}PZd|j76 zW)|)EcIA>A8S+OrPrmDk-b;?5`Gas1t0viDubwK9u%Um}qm%_r2-+dq zuelFLsr= z%oP~waSdQ&cwINp@|HN9?ISP9u`3P>mXVOih*R|%M);B73Qx}DCwapmjp(UZx> z-4rvug>`0W+G}|D3xhrH4eqy-Rq)*JhCHX0v>M=Z%d#xqAQwr;KWC0;N%$Yjs+@ko z)y=q>)x?Y>;zmgtny7!FhFI-{Kf)>+8s|1^X!2Sj{@J(7>i%+`OxukD)Rob|_!Zbv z8-6Kx{tX1vE{xHoNN3z86e=KOsfQL)7NKX-9T0~+_evBTytWis8q20=Nuy@>>(raY zh}k^5?^i;jIkmMYjXo0Xtc<%efBTKvj2i&$$zrV)ab(fj%-_Zw1jQts)vH`ic!FeZ zbpgh{p_VVPiD-;ktFQiA)n~oJ^^>GvXt1G`6kz0l?EOa@%wP{m!ehwI3ndS?i7BjW6H-)N(7AQdf-Wx*h`i{6@H%Zs1oDa=R#%tqYjto@tSpmjOrUHLpo zx0a3aNX(W$_M5n2pi;6@6eSF0ealVWNh-f>RkOQ7^H}O!Moo$feOW0P!4X*k`2)M! zd0|kGr|$3bw|&2+{P6>MgS3+0nHCKdc|4_}x^s$u)H$?5b=+{Vn30ucinz*|jEYqz zWJ&R44Q2Fwc@)t8W{4(TnAeuRl2Woj9z`vKUf7Y&T3K)r>Dqx$9wDu0-pOC-a#kcZ z_*#p9t{ogiN7@><#4e-o9XhM+nD;IuM=LasgBmhGAtb{x}XV%YNK70~WNckXEepFmsvtoRI z&i1Wex%s-ZepBEcyqN&IZyu@8T0Bhsb?47vGoMChEo4!)m2UA3vPjgCX_kt;YBYkT z6>)*@Qh*aT6pno-Zs@1vo)`h>mZqVTRd~LyYHU$?9f+q#Ej{Ucoj5vyNGMc)`5f|49sUGF>v`xgOw|LoKc^M1I`*7o*ND`GgUvl z7^~xYtxHZn6@Yr!G=_`p9FQCVDETQU3a|)@`u}q@ZUi9Oxk?!MWi1 zijS;l@+3@1*1wjHITNoXzti?P1Doeoy(lJ;4kqdb96GC{RqQ(!)SO6Wo`}eD9BVB) zbN)WrstbLC06xxf7WD*0#1jsc0?ayrcmCoW-QV}jylqf8L7XjZ$ln>F0m-6^@!OR< zdH6W9D~af^6wOPqQw{!talK2=V&&J*D^D1dW|iO3k0T7iVk%E;rD8qI6R4(CA~7L4 zicf1qSH8BD$-g#-iIQ>ifvFPIbwF1>>dNPav62ukyeWn>uJCmpy-Rq`J#AfxV&e&N zvh#?C{QB9P`ZDgat;N$<1fG*@Nofd6oZRoK@^Usq*l^?#%)5Ey$c>>_qU*>ln6pYz zsqzP5F;NxpT2=s9#Rj)$x`bi`*fg9`aU~29H8Gequ!0Or0a?Om65KTjXjZjfNT9Qt z3z?u>$)01rcZ`_>?btrwcv?(&n$_V>F#IxCDOPWIEKv%4CMRGg6SWBS7j2!m)j{0n z_1S~`_?vfW!V!<_ptG~$VoC_|tD)Zr+#iScph4mpolbH2;sX&Jf+E&H!is|i!Y|}K zPi}ni1Iz$|jJ4NKxW`+FkBd0S*zs89K=LGMkEz> z#UH1uP)SKVQCdlAztS*6JnTe<$p!9r!+m`>2*J8>#CgaZ0>rRR#8Z#C#9W|`B9wANmX#5 zC%c9Is`HL@Z$B9l{rkSn39T^*-#C=E!8*$xAL1R z4HY(D2{$kk!^h!|6;s=oUPx1dnnSBIF@^ku>SBNB<>#z*pBiSaT%bnsHB<8)KHBBB zX`-gj5qLeHML1$q(XX0j{fmR}+&x)lepijy{~;ZwoWuH1jlIqiAXV4>+|o! zx*?IuS#M4gYo8V{M7m0mHjWA)8@VzJb}J;}etlv&LC}EBGHvcqXl@xg%nMT{J)xPIAJy}644NtG zH{l6!ikQAL(H0|S#q9R~+zO~1QN3_ydP??i6GLuNxOp3MJPX1Gyx)FbDOk$Z{+N9; z_8Y{Tr%VmMpJ%L_a(`^R3!)aV>Ho%xxY@G6K(g^G{q+NnB%9;sW-AKCDolVYVtRLV z@QTRyzXJZ}ZAwgt{fEsFq$J54f147gU<2`=OaVn|aUw*fXlK?~_RAusek{Hh7H!p^=!m1;(_b0kcV{+KQ=dgbT-S}Rjg^}bpx9EE13@7dYgs7Z43Lk8 zAkWVj9syfA-%bO;o)_&3+KNAl*$}7{vMU>Ryo`Q{$NduA&`yq~sZGuX0NrVQ7t%sd zh9z3E^dggzIxxyPNQ#&Y?I0y{aB+G6tMti z$@X?zr-6H@_v`Uaf065QeVdE}M2Drii-|MQ zs=wp==a!7h(a3{ij?5=^C?kcep8Bfd?m)In_Bi72ljQ+m%X2ss9+(84ZbXY!ea~ z%2|(@4ds8uR`0jB^P2GOm4~@0=fhd{)tBlDuU%BEzW6+M9(dOA`l!rO-F?+O!w<%+ z_+D`mNg{Q`Kh zXbJrDw&l=c)~~*{mDN9nXatmeZwc&N^VLh2F8H8`aMLRMHBUZ`@@C*Kwpr(9Ztj3X z)FGOyvyoL!_($6ZnuzQQuYyS)R!hg$e_e0FG*%~(XEz52lVm0sxMZHL)A%~lg_(T< zi8#eTp_VHOmcKp1iJ&g5(a76bb?lmf(iB)!JI*zjXim7#Sr|N_D~ukU+57V3@4%TE zG~igT)A0$zz0Pg8yDsqV%#SUXumjdT#a3UJMF;@tmd7(P$HDpS%mKWn7jaMo!R2R5q&j-Ugse-CCYw3$P(CStjy3RvyE;p zJvzqx;u!7q(vGh<{21CRIdz=5=srDDI3?2dz-HU2O&LvMlZ{n%JbriC!@~j^4QPYt zn?0#kVfF^*9xe;)fEbVj#PQ_}s!n?G1u<(%48W7p;LXg(+m_)E2?^jSRD=X|cXM^( ztLW3^Q%w$sqR2yK4-IUZXq|jYOA8Z7hI84DGkMxMQmTve3^nRA)|!LE22T-bcGOlg zFd`x$;|7HEn}1s;80$4x-J4pDGo{NQMG*BuG6Fee40pLoqCtZq^tzu`415J*k3+Z} z$$tUg|4rx<@rf+vygd_AC=4S)O>hY9!8pR-@EsLljE=AA!x^$NS)QTDS+DJhJVRLJ z%~hbO4nWb)L|(xkh|_L5#^)%;xS%r zH?K1B8TUEYhM<6W9qa^u)-J<+C;$unA&@eK{Pz6~=eBH15gZ2N-@4{;YnejsYR@jq zVM%^+IOaLs&=nHXvASwTxp;GZWl;ykrNsdCl=s;uT(gGosbpmDutCbt9)cbM_7o8@ z@T5CoflAH%C<~$H1iQohxe_2oW7F57J_Oh;4UBxKx=T99n2#$$CB>x;tlKt^53hJi zSv!g*s+WNx?fpGkE@iSBazU*vr(JXo*54? zA93Q@qY8tUxr1l+Bd?#SmPp7E)~q9tB2P!pZd7=hePbU!GRh<>v_!Z{Jb+m1Ci%!Lqf!Z+m-);JPTOpRH;6lGk`bY9QwWk$`LL-b!C z^SJ@&6Co2xv3%6{C7Wk3V|g*VQdlwTMw42JODLD6l3IP=Uqf^z61pc}63jfMz=+iK zp==T=IX0z;*pm~wojMyxZ9S?J3v^Y)&jlUils)Jjz|KTO&qvCtqy5&i4@|DXNxpAX zniwixEMY)nTZO|T;EzsaQFPd&?-n@~Jyr32Nr%C88E+~c-#f798t5D7v#HF`r5B%s z&zi*!dDZ7x61DVMH^Y5Ihws#%GP6%>>KmCA7bq?}1Z10wL4scI{vh$?(*2u6uC73u z`2U>Cwo1wVEp&9+t*4*?Yn3j}lnljnkW56qJx*0&IN~B9MRT}@!sE?YM=mqt1od4k zrtuxJ=oY#yqEimGduyTNf(kU5Y`JR{s#u=q!M-nb0JcS=`4^xpXcQt%k+QWIQr>#S zCiHYssV7>mdZX!HMYJh7ui_q!hH)Uy+haNK6q$C6 z-$Q1qg8-*__kDN_Y^-Z}$z$E6pb+ctgGU|eif zfz3-yCa3v3wZYx6++FLfolF*3vH z5-{aTqj*~d$Vtr{a)4R!kg8G0VRrspWecjKOJ zP!^~r5HBIZf}66G6c=H}R>oOkRpQ_ZtJG2J4#qjK1Dq^qlbtK))Qie8a3jqPsA5@z ziczM_HxN%W{b%#k@+?#hqjVA_8j4UKcGxK-7vKH*T=dxeIXi@)hU#i4JaX8%wEMC2 zdGz?eya9PUyAkoRxTy=c)Au_We+R{0`l@+~XnM-S3zr<}Z1TtGjyw^l2mILMzBjcv znY_L>Jlve7ti|yyjWNJ?#f^ENh+fQ(O+?oc5Hehl35EuQL4Lgh-suHVJR+rpLL4+K z`PL-qK5x$_o-sD?RoR8_d9t<^ASMu}9_Zr{5*&8>dwXLIjt>ca{Xgz9I&K#>4f=oV zQSI9c1rN$4Ze5vkCop@f(yU#U zN{D%*RZ#*;!`)-3l=QgOvBPb&@vq!`Lq|3wlZ=1t8zkJS*>wrU#N*xtd-Y9z#n=7& z`hFliZ7&=>5s5#T_qq5(5&wJD_+K9h?I)oeD?A@9Jx%`bNuFUi37!;#N&J~AJfEhNlJ7>A3444G=&W`ewqf7WLoz6Gw zfpk^C96M)HO0Rb&VTK(H+i%?(yw?HF0lYlQo0Hvznrogas~j{`YfeJA&DCnC#xFw6 z>^KYPYScY(zulpu48X+u&Cc;lB-Xj_y$i|)gLi{2F(08dg=0l!_F}|sf&Mx59;icJ zo48^;ev*{uEh`4{l-uL+8T!=-3z&)gTkg| zh1w}*Tp^{?o!8MmqvvXnG`d&9{X+bT*iE8?WA(A2!_$X{!}0ZQesy?prOuUU=_-y< zh=o*c5qj2MI3P3I$2%rhHMvTqyWwYW z+uzjF&#sL5bBF9>LN!AI;LqYA@UhFqBSS8a)q`3bs$eQ5%=UV%ux%MrRIXu77wy(* zt>!~8^XV4?7YrFAXY_yw9*y5ab}uYQQ@B9;d3nQ~V*f~}JjVsNGT(JQBqMA*Fz=X4 zv~FpyQ`?liaD<(^^=0kin6vPOoi1y5cIQhI+(HCE_Cj?w#)q_B_3U9nfT!;Ig~A+B z<>&iQ>MlukS`W0?T1L0={S#vk&0E(@nX z$)axTH8ysxlA$2U2_EYt@&5po+N5=!2-Q*4M<^*9qFPM1O=QDZ+`W{Ev~d<+mH+sh z$tUms0TL5nEP;f(hsxWB$0{3CQ1P$hZ5Yu})r##LU;4wG3-LxkLY%+tqe%$?&etn+ zF}6j+V$NDDDhD~cOI=ge{^lV0f+?{a`GP8em9@{UC*^(_jJr+VJ7?XXnrz&JmB(qw zBQ4#h5~1iGpNbeA5d>WYtn4 z6|$lgk^+@vD0x~))@g;68e!SVIfWc3oz7b+>^ikLbDghnc14WHx1p@8PvBv5Cg>b@u0*2Y+B$DRO8lsAax2x@u1OIzLv-W%I$pgG(+7IrAa9OpH zfcGm*(q<~`rHFvu7o`q<%t;e>YDpJ^ueSkN@|GKiT7vJ-!-SQH1c9Hk3klvq&o#ic z;0bYG6XKi@yOBLE*A6PZW*8l{-QaA+#F6`B@Qm&v_0=OnXMHjS+xm4jj`~ad;PCYj-)OvdjbS zZzeouRuwKQN`$E5?K&0uwmMV4up9z{?q*`e)F6qQ^r2b0{q11|T9LX~T z7fzMWpGk9X1v}~{`OUf*MACo(X7UH|#sUbdYos4F!9CuONfGZ+VaD14?NTKRGq@b;}dJf>$4tf!89uVE($_w)oiX5nE0 zu@#ILacW06FaGuju)xIF4k=E|+jRIKJIL@~1R9cpT2NMaU`_{HT=ZWJvtuTI8xbh6 z=6ez6Rr9X`MWJXrk!lbBP-+3NES>#RLFLA@5Yt={AXtTl`wZh+=I*XkM%BmZjdPh| z+onSwo1XkcBUWV6wdzd;B``B6OU4}2np zz}OSi3=_nxe_EQlQv|y&SqF@M+)NBn*Cg+>M4_p;*6Nbmp)>( z45((V8v(W{$#W(Zr@3Sb7GzuT5(CBt4afiv@Hj8gtRlq&xq0Hcm3fsYkO3})>~jXn zRI)*I^n{$8j&+BW6(t%IJPhu&gjFR-l@_CNU1_=!aA_TU#NfhJ#fv{swoP>Ol+4V) zxzfyx5{V8cw|giCC@KhsQ_)Wo8WnY0*`O{V6;CN~lm6VL?B2XqY7q)i%PaOQf>hH4%ZRf9NY^VEX-$=l-j>2yf}mO z!(?-imsX5Vo1sRo*;4sp4Ia9b1R+xQH2-fco_k~&U=JgweOH~Coby9^g#9Fm; z$NFK3EDUBc$?_MOBMdH;owZJ=tL_$3fsQ*nMx3wM9U#=VR&_8eDCTa7^hA&KkqSZ9 z5UHBJRpqG#my#M@dug5@w@;yWO}=Y(R*b-?28}K+aEh+o#UeKlBR&sd8o|TR$~dHZ z9hAx!wWyJe-yP~4JFm%scM1Q|%rw|Kmb~PqSV_U_l%%I57r5`y_;Dq(f^%y~nFE&$ zQS=27+=e3B5qX9Mm7VYf6u2%U!KTXhG?b0^O5s>`yi6qfzH)pg%C7T{Mes5RTsW!j zRTF*>b%KMl6&~iKFcUW3F?4pQWwkUiru%*a%}WLpT(BO~YIrEwm3MoX8D9a8RG*cU z8X?M1C_0Z%d$?)j!028U9u_S^ELs&F2I}F+c+qAE*_%Q8f@UUKepE(`Fo@@Hy2r9p z1s|L%R6g_@gJD%d6x;h(2P8K?HYJEZo5Q3~(Se~PAH)doI4yqio)NR9x_Z!j*EMQ0vm0>}|5HFW%Uc!$XzfhjvQQFIwcbm-3hB|>|cl{AU4WP?wb zkB3Km!ox_1PNxtiJ=*s{Z9)b;+eU~|xo(Ps1E6pbk`d2krhU>E*+t?w&ZeZr!Y|Dyph z;-3{_FR4I}0E$8T#p%3C(zg?GYBDgEcQb%LxFN0bP`w{qGc~-8+5#W$ZC~^P3L9}T%-1Umf`@TV;j&mr z!F{3HSZmfUiU*W7*V8T`C-eN5 z`b=)6co?djgRQqY90cF@KHL>u8A74`UM(G8C0BsmE0bQBd5i!->jMON%nkcJFpia< zmw_*XpR1p5fx4gPf4HLY&tiyhBjEe7>QEjAF~93Tk81MRyJ`EPi#{QG~0 zr)7xJL1WYp80MQKPQfNjC=-bb-LYS=? zWcV;ri(~Ap7;$%fTN#NeBE$weptk^a>pjeF*qxL7nW4S|M7#v;kZ15Kwh})tBFkSN zy}l;391yVdSQi!3pw>*0KZhH4y-JoJmIIS{l69|Y(0gK*4xqQosR+|CN%}9DM~01P z>?zD-nK?1y6Wm%0p-F1Q_m6?-oB~Xvghye7W%rCYNaUXe_>#>6llvtHKsXsYLqaC} zIxpEtO{9X_LQE7GkO+UwP%z>nrb7%~`FMr|KO=Cjso?F)T;U)t1dU@dB8~QX;&DbX z_vgc`OlSWkn^#pyc&u}l^TvyrPVih_rlIuMY~pl%kH0YwLwq>;IMNBjpJeN&j|h$3 z(Hr%LhoyuekI{mnn-31}sQapc${Nq zz9kcBy#X_Q;?tV{3&_%*BGXvzC4%UWE>U>Gg@tfxApTP=rRhp+8U`y^Yi>Usq0dY^ zyEI|Vc*Yr!6()2q3jHibh{^u*88KDxGZHlYQ*1gFg4`QWS$WUw{z*L+_RP=`P~futn(t zOT#BGcFs8h!AL*amW`-CH`5`f$NM3axg?2}8@=^8(ok(goYJqX(Rn)bm0WNqb!HKb zzsEB07x&z3b)bG2x-Q2EA0!|BP{(E1)-vZHc7SU3FS{7pzlL{yhSS5#gl8P>mq=_f zVSXcbCjIz|x&^bJXOifFHoK;h~pBfIG*^91(K0;|S?w z@l)na6|>E=L%=5>_yx$pztqCHuHm-AKqtUy7}7oY%v1SyUS9OyS$U^xT72utygd2z z7M{txu|FQO`G4jn5IEmtF{vPQ1(~)7PG2xf`9a|iV0%0v{#A^HKmr>>mpkNJBFUxe zoe^Q+JNlNOFBv&M8jMPJ7h!nZrG@6Cr#k4(E#An`xQ2aMbf|IB)M*JeW0bh@3wQ7J zL$Et<1EwP(NPMtRGZUr@`Qx!({&CFOhHHt=j{ia-es>kXPeni zlYQ~rqfsnI?q5PqJvo07c`n|~BHp!wlMd9qfbV)uHEjUhThl#w%&zczGcB%!@rbgA z?gw#-zm7QMl8kd1{|CiE{)f0svq=9zQvECvo^@(%N@)#p+xf@2gMWf#qd8i%8aG6D z_zr?E){~l9J52o1j75(q-Gbij>kUGrg+as4;A4n|N4w%)I#z#YyE}7UUdFwx9Q~mI z+qW9tx0=Zuj?d28!+5?x8lQk6M{AU_UTuTf{9VVzGgcmFsHLv1#oq(&r!Gh|F&{^L ze{V*RA2mX;JyX#aY#t~qW(gAQo><5X-vT6`7!rSk`0hH~nfPMEs}02QiP=&k-EjSh zs4h6YIi!YerVPGAv?B0Ni)E7R{5#@5hb;OdqRep_bbG+^cW_?-{GD!%rXtbFLL9Ew zu$91N*2bG1zn_bQn}GKWvhyiiBo%MbT7C1ipa>eOhbq0Dm@n+INx@DLheyz4Skla-)Ahrdgpf9v6v41Iz;t}>A4o*h@3Jf$`Giayv3_F|awenXXWLB1 zD5#YG2ZE~!w*+~v6?uf!YIxgSvGcR@TlD0SE>c3cx_XThUHk5lon3egvXbY%_T6?< zgK+InOB>gMJOd*vB1`jFs`d9~*lcf+0kgfa2N%d@qmDG((3wqjt%uz`lKX)0k#ov?xUd;z~q zEBf!6EXw8snS{%&){@01M|f3*Gw(h=F7tPoAOTrXh=lvIg#YJo9L|+kYz0Qx28@Y% zYlnM{q-epqtm(^eI%9j8b*ntad-)Q`@MEZz=9cq-9id&_h50OGVQW2j^h#{jVZ%z? zPcfUvM(YIol^jm^w~H&JZr{+2u|a6aEU|nxpC@qk@;tyg0=0V>)-_yw!SZitJ<1tH z{-a2^zL2b8zn3n7Ms^8sE6SyVPG#h9AvgeM->Ia)aRZ@DPY4mA4GX;KxGwT6T)Cc* zHz7NACBC7+aSNtQCoWbZ0`Fa0V80Vbx@(G$t7R*N?R@2m$ROl7#Ht{nVmoEmvE=LT zZ^kp`hwFOY1=1-|nAY>oxBTQHjg-m2?6{G^ixA&a3LR9AU_JT=m;;q9KACCL8Uwn%!fLCi-${hmV$@;&7x;N!Wx z>J%*!n2yPQ^z}4rh3>bsAU=z%-|BdI{dQdiU=ozke^$MxD$r zXQw8+Cns)e-3`%QZ~Yku3~VRcBQGoi^}GM5tjG|*SfkV0D-Tq(t!Xg7Ti>EAIDaUj zTMA6URw^<3nf|@t!yj=KkG-jy@n2{3Mq+<91b-1O zTZZ)et<+9Bc87>0L8}^l)~u{CodHj(kqQ43-Ij2UVk;?Rs$L_byS~)Hcf=v6AF4#X zzfHb_fSW_l*}pg|7E>dx1q@gn3d|1A(pU)_L(1T_iqPj zXBkvvqs47q^dr=1#NI0c!+xj!6+|OQNtBBz^(6_thyfX$ZB1MXFpL?Ajo(>p+=356 z>qk@)H$9KRC84;qQg5ygMDbrMJ*i2%ux6Russ8-VJ6Do*Q1$Y|#_wQVBwDiK#WT zv1`dn@Q5Vs)F+A#ZnK$~4PTOwa=;Ns-*>_z5TUU1vSmshX}2AbF&NAsC^EM_o&{f` zArfVn5rXWi_o(kM!nZFvi7X@7-IFB>bPS|41t+_RiA7*U=Vp}*($wi=u00AD*_%ma ze2sJM51PqG@rGWY1~&GJ%4e{rn2G4|p&XTrh_lNzD5;oZ>q(_#5Sw^QQ&$-@8z(|V z=VG!h`E2C-1*xcJS(ZvSfgB=+_P@+l52Hd3`|;faYK{G^dy`{63dt~uu=ZR$9|je@_7Hkp@5JQ_wZXj zvQSt9wdr7+8(uMj1B6x8w3_yl57f%hdRNS0R44@XsL(eN%~&}s-+$v`OmMhHz0_MP z=D^HUWvp-2t`?dibeDu4UN#%l+vNjT_51p%i!8_0<25?F+QCvwv7V#o``vU?@{N#|#1)ZLh-2#uwRT(6 zZ;=VO>pv*W?DsLhlIS@Z6|di8#{6kti-O%U(QwC93&UO+^|$W6=y9QQ`lP`44b(uT z@`E&n2mSIkKt(N%@hHLk5i6KGuyk%ruz=S#^i`7s#b=rb!QQ|CW|lCt%$HO2NJlfh z`er7qZA-VK)>}LNVm|99iwL!)8`2 zM=D;RwXDe9S|#n1s*$FV=-O2lAH*!vaU(H&65_2XTyq>f{rcpmZ1}w>iMCDvoVDV% zg#cvUA2@sL6;$Md(@qZ{onXS@{t(kavG6RfwGuV5@VxQb^PyVgOlYkh=(G2HlaFc$ z&bC_1kEQkl2rva(o$YDV(-SSGqz?oN2aTbW74|epJ`i@avT^|*XcihnnV`(!p0&HF zrW!;^@%R8L_T`wKC=c%|xGgZYZ0ufFI*y*aL;f4%zNHj?$hQtTEl^Oltm%|3zd{-v(& z1WiJc#>yHATw+*&n<)ZPl-OnF)KmUDy*ZO zAm5qJL2@!~&9kFb>Pio3bR)66UL&`sHpj9f)WnZ8Pd9H7Yd}JFBxODIf~;~>+jRkp zkA}6w%t|_~84QR|&Pa3)eH4hseLQl*6h*3(ogeOm3OfdoWSiORi_>rL08RkG1R%l2 zEoqmRpy4+DT3~92`Yz97h2PB^yrqL+^;MOY04q9<(+(3%L0K_sJ`gHQ8TJxXtF6?L9FBZU|fs^*NdA^HasUFazgI$G-M0iuqeR63?Mvl5-&`cB;B+pq?NUB5N*C%6#@lhi2E= zROK3)_Ec3LS4VU&m#;v4FN8!OJut$olrIN#FT0^7g*#y5d7-a2ZJPySjpn4;hfFQg zc@US2X`8~}PPli<`v62ZNS7HRmH$7@nptnu!z9 z;6a^|CpQ(Z@*9O*3bA4IpBuFgi8OC6zr-gJ(s?)hzZLvvnUA15K^_(%3X}y z74P7Q$ML8}u7~yfL(lD898M9r!9K+rLq2Hd-43+fye_b%)rDn%(WDJW)Ei3EA}+D% z2P*iJ>Yd@Nz!4@n4|>_78kSOvyr>vFNU5AO+ALNi2+*7-$JQ@kCX4tcC!Nhsv?yk3 zSpzt62PnhMoQkk*SdCXo!z@j8P$6DBDY#OvGP01RjX~&W+j*N+2^yYQWt2?6wH=Ua zUDFal6$Ws}c(Wi^C(i`c5lyl-hBZP%Ciykt&O zxmrM)7iaym6v}6gzP3k7r~Ij~xkcIxIIUVdfs@7#)Eh7+%N(>>L|BBTv1*Kar|-Ow z%@hR>;^-+$V9qn4Qdp=PjHoCbK|U8SQTtwKm0F|+T36e+F}U}YR%3?M%=@J-yw|yw zW)jJv69o_j5`{u-DU{n_Vcv-xzc6<+!S1fZo5rdjLRLgasd2x77Ma`qU$Sv$dzySF z=pIi^bi&RUU7}n$LCb`pknrZ*Aw0<+-bP05?N?j_D@vPT)llw02O7B^D7pwWaPI)Q z)MT^D;^z5HgD?6qzKGxvzv0RogOjAsQ_6DfT}+t}qAQZF9K_XJzzD}0Gjoa0>4TE3 z%)W3kvHXLSDRl3t?4-J|vXMfs=B>hrs4t;v4zL_lMGmk~L_Lo)>TgC_m^>eSkR$~{ z;r^v?ydz>K8_&++5C?>6DjpHGBc-Qb!Yv;T;!d8pMa&)V?nLGP=~#)ZQ1fPe&N@wA zV*e9_C)_|S4vAfE1zN{>2Zgb1xhc=E0m0qs9Y!#Y_Ls%XDSiWE=aHs>>qs)ahs};GdY| zyb=L!CACfassir4dpy>9UjgFrGVL>!P31rrgtoWh1tt4PeG2U!lRf(4(a6 zoR(j_@JI91Edl;n;9j8-F6bOeR9x*D63oPie=-jTQO?h`Fid0}LU=<39kfW+vuG_V zy0vXBvjL<}XO?rqm7t$*aDiQ4r!S6O8Nbc{MWyscn4P3j9QF9svqxwjyK4T;g?S(2T9HnHDyG5Q03_Q8|6ERyRHk0bcf}agu-mD>2 zH8G;TzUGvk_xK2wHgfD`*ic~tU@#CB%gwY{^a zr+{6HR&4ROmNp%AqhUF2Ts)~m2^DpAlXI4cMRuOxsxE2P z?4AhvQS^7*`SNLYxD1~zX9-&H@zX>U+TifBvZ*XtlyXm` zzM?6fpBbpQ-Ocw<@07D7F2<158Fcqq-j&Eh2t?X6srmI!bwIV>(fBDMH_{SOL<`3@ z^(F>~{JIUuN4*n=BiUOkxAW7xwO87sGk3w(u0po`6{Xd@MJXl*5n}^3$H-pS*_a+- zfgxX5z&jBz0Xtqg>rMu=UY1y;s|xeEE5fLr)s*qCM#CcLK_ep5zVIg0DqB9ZXrC@5hs2VK|nO{u-ac>CRj> zZmU?>Q|zN6IPpETCHu!oxix#?j$>Xe2#Brgu)nKtP!;2JQLl4lp?M}sxDcmwFkO{< zX26y{-=!{Ht*8dWyHU^;_H7}=Pl`)LtK#7EX~Ps9#yXG9rVargC3&EZf;G%9qEkQF zC2DHbUof0E5uMy~F$^^})k;XA;#Fo(4N%I6$0<|IQWBKZC?d;9EAc0B!kY}~2JbGZ z>IiG$Lp#AQw4eA{u*wo2EL6Y$^31V+mrz0>+xswEy_U~2>rp4B^aN&oH_rKbYdF9I zts>jvB~@=z=*R|S)b!_stpA)Fh|T-9a{MU(Lk#$9t0gVB!t4C+UzU}0kC@4YN9tn-WRCkaQX4sk@S5h zS^6$8A9wk55Ucanms6B!67iY-TMo0JLJ>X|%l)iB%_tkHa80hR#5QH&7rP-XCVl=V zB1o3zJN=o@hgRp=WW@SX1|HsGEHNWvnl~G6+lM}jCOqmREQQ^yr_~txtWs~nivF#h zrcj%%iR(oqTp@!@BYkn2JYLH~oCH_jyAOyf`jpZ+lL`?zJ>w@+`bgW426O5SJ+ z*BA{ciE9h=F9!GBtv3eu5oHl|Q4078W3YoX$kCgvk3qX6)8UL_LUpYZs7zXSU16E@ zjdEE$ZnH8N`%c3A^$jge;|OB-dRDBFoA`3>)0!!~Iti-k=_D9^p9Ppa6b(lmjXUc2 zQc0xIXtbJCM!6@4uK{bE`rrXY{r?BjKrO#}L^T=+IV#E^kWe@dDSI(>RoI5MFpCI4 zq%S&AOUq38zF4Ks=_*{OotWgm?Xwpl*|^cQpp+4m6~QlE5lPEXIT@-f$C%_#RfQ%M zeifIdiZYJNqwGrB9p#U2|I$gB)&Z*R&sl_Ud>n2 z^|Gn5U@3s<6~!f0pQ%?LmsCHs*Akb+x3M)glfh=4l0?TPNu#lif}2B2+3ZXtCKs2) zGd_M4Hb7ibW0F5tToR-FfJj`@7i>izE;30ToGLeu3}(q_-rZVU_AV}UES36Ls-?16 zs%)hnmYkG~rQ#VNzn~l-ma3}al1MC7wH|_Fsk9gr3#J-Ys_0m%QArgYOVzh(rXXeH zWL_uFjuo8~QIk9oSH)VVh-638i)2YB+ays;1HFsjdh~1~LE+iX>Ad#?;3lWQzg=-5 zg1rga6a-PBf6=lkZ(}u#x|}0iB_?i%#9)OH{s4XHdzmX$q3|4LTuzX_k>_ObyYC*2 zPq>$Oz!p^gMoZv$=moIXr@rvOc1b)jwY}r{Q|~rv6R}Lx)i5`;ei@bJC3Lvtq9@f8 zNvJU?bcE)!yGy-KI^0o8)@LJ7`uVbC%`7a zdyKEe=@>IIdL-pTdjgI{R{*bLPbFq-V)7a*_JS3g$RLXmsfgX2OuMb>KaFg#CcW25w##Kf!{E`JyhNW7%*?4E|pzP+YogEjC#Y(ZrT= zcQhA+FRpbVZt>E8nf{_)g>29%F&6_H|ltM6GQDlYby5z+9M1cy?$Hoh} zmJs&r8L3(>(V0L4!%L0Tuj(WD+9EJ~4?)^}5e{b-1JCzfzb2!N&)`2C8tnB0_P7b6 zV>9G|pMq?YGn(Zjbbd{JP015+G}k)6Bs-d3FkCuW9+#5kpjObXiPI+?&qIGe8^nHw z?ST}`fyuC(aEa&+*QgiT!A~zflF!h>E3v(O8DLGN6l&T`TK4oJdz#1~D{<&)?o8s) z_Nl~~k5l9*NX~G)gL|{=$=R_i+rw_R)T+SxQCtwUPR*zoV=pp^xdgn1h0N`4U|%3@ z;8+L(>w%R52N_;8QUim)Zr3QU z7nCPJ5p80S#(P@@=^x-g3$DJ4FQUi*z06Z#gvT?kCWMzCl?=2?1hT~L&Cb3F+~wXT z@)}5sO}60yePL4tUlvfQf&|Tz62k(E-F!7)ES8(5w9g`F7%LXoPr@sZF1I>x&*ayW zpYRXiqwz^1ABVJxI0jA*>L8G)aC%Dp;i!@ocRUfWWD-#_ORm^-5Fd}6gXzYe3FVtl zE{3Iet4|jcVy(~LN9f_l4FhzI;@0chlj7=EZki4AKoWV=sW-LJ|)Rlad@W8F7N|O zeZ&g;h~lou>1?_Qo3#gPCin9U?Tc$}77>IbkUK}AR?=T@&p-SaOF(wgv>_9?K12LiEukh&M#@D(^F+=3k*(DcwBXEgao<6DTTeKelY@Gee- zMCl!WVIOWdI5x1aHa4DTl^A~y7i9yEmpPj&-m|%QTunFSv$uq^mT!%M5#<95F0<)b?uVl4(CR{LIMiS-~wpq;>BTJHD`(`w2?pXDI* zY2T|XeF`?240cXlPto)lX=!$l_QeC9i;;?dwuu}`7&v%R&49X0v8EuiW7hmfdNpV5 z81k^NWoA5EW;Mu`Y2Ry1My^d$*ft5QxItD4&B*i+!noQIg7}D-XWxozFT$I$QFs2hSk4&Ko%2w4JqUH%_o{@tAY>)zwVd*w#vQkST`hR%wHbt7 z?R!;1FVI?K=r!Y~*L1bw<(^9(dTj@xSNmSu(5onPn?&gk=qczjC)=|F6YOlpXK*4t zp{Yoo&^bTFH}g3s#kmmHZV-aE@3jrVNzR}InHIccnm^8#ycVC;ip%0N9meF-zS}mG z`XF*NlXVm$Dz_PLHhr8=OH@U0X2yauYc8q|WXMxz$&(V00z_RyBI>i@+ER+hlG_e6 zLx+=Bb>%bB4r2&X&}|#i?y)|Z+8p<0=!C}c=8-ySvF9tW54Rw6o@_{zxEnp3a(;~z z?F6Eq6i)eO%h(EBCc)V-W+nyQ_IS#_mptLz#;N(^oSf!7U6%{i5$CcV&W15hDd<*- zdPC28>|=`q>@Q{%I4_3%*Bfy(NDy@;ps}u57Dpz~T5|#7*)Rqq1>Gtksx&s{w&JfJ zH|quC91=~oKr$|q-)tDGkb-X8kWALPz-_$)WLvTZAwta=40Fw8y_*eV4pPup7>tbIoPpn+;sK?R zCjG#_oz8^|96~AK%57{C@Qtsztc$Z@tW65K?eqM9D`!MpaU)@*;VgK~{A(`j)O;B0 zl!9)RfF?=n#7ZFYVXTy9DR zh}q+YO&6ewjVN?R*tsv>Pr1(|i~MlY(xCV6^-W)yL_M<#S^( z+6|Y1X+DgBNkO**F_V7%i9GXg-YHNI|!+h0zMT*&|yj9&{}b?Yms@ zZXzy&(tH?$l7eoB3@}`C+Z{wsJ(rg)9b1kBN&iK91m`_fX^JSaXC zifP_dX70)CC4Lji{BgT2spgBv?Q~tn=;A0H z7e|?M+XO_4qingXwToe_wFVhkgK3u=@K^vW{C!~ zSW8ohl@G-fih5@KtwZbS+&l+u7TR;R7>rC{sQ^%2m*N{L%>G+0Tk>)k%YcGzWp|4V zOBP6!*s!vSne^c@(=Lax04V5Inm$>pO?W$;agpRA^jBBjqecB4ffTtd%b>@W)Lho! zLrD*U1?01Ttc#oDmUQF0<=$pdviOngJxuH3FWM)vT0_RzW5%E9-I?{aQh{ ztY7QXp?;GiAh|tfq_v(k++8bUBPhqoCW~`J_NP=z7D@JDCTN%Urq~MrBdZ z?GUvzX54YJF-SDH3G7 z^{uZmoVk3rc=bmz8&5zF;^*T#F3Z$%m~a&Z-KIN_Z|gCw;CwWF=za?b)bZIdBNQ1z zV#j6IS`8EbqM+LzcL0$oU2g(`^4)9JCSXe-E_>B#7<-k1ZhPDXIe``02Onu<1&PJo zTwCeYLT#7{l{e#$!V+%i!DS6w4Py;c(Cx5BmeUtuWSI+S*!-M)Hs!MKt%kAhDd_f# zva-y%73{_1lowIYrhJz`3}a|h(CwFIW|?z`7fc^F3tkyCoATWjF^siMLAS5h&LS_s zNK|vh7ug`0st9ET0#ZgJ6$qf&Z8_oaY|3RwTn}SNRM2f^gY$0jaf`c|K!nbY*Dx`g za@qOT!`S&0bldkf=z13j;9lM+t=W{zint!eim0I5p7#JYJa)|t1WY8;IV;$fxe>U` zlN?%58gWVBT4YQ1qkpyJFaWM zeNKDy#PvhldT01SEvT)?qw5x_lE?1_<|67nr zwNl<0P+=`!R>93yRrB|eNw0&*R@Q;K3-;lLePOh|jw4lTcg|meZ~3?=Ator6%-pDa znbyOIN(J4v&cG)n@_m>550M;tyHzt3#M>=jT@QP48|*&wkZ5kV-1%cJVI|=jJtj z&A80?yJ5`u3c790xshbS&;eBfjpb@-C8~!#(1Kl-`A#TL4HRUvWxF3^XV|*)GGRY4bls;HaLm9 zdYo=}orQD0yT_-)1WBvt_is^t*-0vhxb#Bbjzezkx~QN%n{%1`cf&9<1>L?jp|#^? zYeF)M&j>sWS5wgKYmitw?kFcAfyHO|9VVeeLAQg8t75cCrJVX1JpjS8_pLiz!G*R| zdI1Ld!-fkm@GX6iIgjtpF!1*wuIG(?Z|3#tI_QnaN3x?%)cwK5EB)rH-?-6l$z2?9 zlh*__V*ch7{Wd4=NJEHPb^x+yg8pR`9>JoTXqTa;u87^eNq(pO*`&Wop{qAv&1R1) z+F7oHlmLGHWuuIlgm&QAVfWJ@{opyw=Jk`HALchqHDp0+FalM-b} zm?s6klqR`?OF3cSOt*F4KM1!_bsv&=OM4})ux&_^?G&)QWGl>&fd)<`XYc!;FJ|zWtR#7tH1e0f{AeHJmi{tZ&UVY~ z{4ev>V!NB~mb*8x)|8$gc02Us-6xq1jt&TV`xiezt*{;!#s=C_`;iq|X&M(@>a&=9 zmO1X}wAtr9yxIrnh*+0_-%1ole61hq#(Z%?^>Pea#Zqk7hET8v# z9Q$8O)}AFR2Tf!p?9~q)u-tw^otgXbJy)P}Y*j&Tp{Hcm#(j~i#*rX*&ESN8Gl?%ZH-PS(KNVrQ+9y=Rg8f55 z5niQ{U@u5ege0;+5J3;uHoeXOAZ;H5zs2KXl+bV69{RcF-geO`4@~bwc6JQ=O23Fh zK92F#Lq68%dVzc8$@4(H%=;kQa3fhqfuxl|4W{Frk{F(wPuI)cW|btBRN=W2@Ea?h z3mpp`{`&;}H@iX~jPD6KL4rd8Ks1;Wf+Dts4Ni9=*FhGIz$H{5Bnn5_m>@nWw1M@(`Q-4wnOy~`=r=DSAv%a$ArZA`IUbDA z&(ws#9fCymEo)5a=VX=8pz@3KJJ*Gg)~pj=qK?*QxUiOaZqg$Sl@u1txxO#-P$+Vkr zEwR~P?JOhuaAa^%Y!3ox8zv%#X4lij8vS?Hh-QnhcdTgEeDWP@;y>AeYhLq!26Phl zbqVqzu`*LJINs@D6S&m;i1B>96D0AZ zO;aOpr3%FeC*pWzy||J_MQd>!TmouHqkl4hm`5yW{a)jnx64$?VXS&_z+!{ zDra<~Aa-R3Mt}tPEqpY-HUoASna05@k!u98L@dv#3UtB=fk?y4&o3l0?a}y??^g9f z*9Q+AHHNz^ZC>&lZIjO8nzs2H6G^_`#+$~dtJ6B%b`fA$BWF>bZ6aul_>AMV+Wk42 z$6E;+Pc|yRg#*vR-|uxtkjOyTqv(nj_Urps&Itm!{p*N%Ga8))G=@2i zTN%ye}NCaqxI^yMFLtJaxl{H?Slk zp;7SXhg|3qHsGgKvdG{LsHuHA4J+15I2VXs;Su(#*1*-g@{pVR*x;fN_~=L|5&caO3VKP-kb8E+=n*yB zT5An5T7yy&=t58OSV=*RPq>X~g2Q#mh$DXz`nTXkLz8%AShJCkK&}EY9S^Cm4rW-fvnb)4 zgk{Db!di0G5*rGj3b6qVTKfX6LS)fERvyTzs95TsOdMP298&0-J`)G4?W>gLM$`{H z%}kir{+Id22oI(UT;$nt-2}2`3Y8jP-$90&H#d3!9((lzaPgRK@+FN8)|m9QV$#MP zB!)tl>-BuSm~A&rD6|MyUl9uBKM3OoVk~YTFqL5dRO6o2kf|TY)JO;ol4L>BYO0{* zJ}~IN};hJvd57(hD$(C)xyxU~kfQX>2Ok<64wyuZ*zKP-mF(%Jn-z z3yNL@MLiMpHLG$0LP4_i1qnfdIa3*tJQ5cZty8LVf*7XtbgRdl{ZL9fKD><1u5HEpE`B{k-9UT=+TWOm%g;?rwlAn1?M!v0z-l~ ztCmlK3JXEw0THaNz1wc5%hhhzWFRP75?+yk0P}=|9mHOV5<{S@pqOSu?tsL*1m}49 zQF@u)t1~aCTnV977{oHscvdvt><4c)(LviKFpSwTbJHktkBwy%a8^*3841a&9rXA(zUNo6EOI zpx7_w!xZD+~GtbS*jZa^XFPKyVUDkB7NtvQ1oAL8;6 zvMYKD$yIgs_oI6S#Dmdx=;7mkqo(fCA4j|E8(wz^&BAItqUZHmQ$W9Q5l zl3Pau!=Zp-Jv-94un$~VO9KrHvBv%^L<1M&yhr1Qe8pNii@R|$uW6Pk%tOw!AsKU_ z-Yqst!3J(i;R?l;gFX#A0D)=ROQ9p2@G{$SLO`qnAQIi%1nKbTHssYC!uu0+>|ASd zvU6;UC`(xlDF1Hm(vxH!WNU&n56SsOQ`y@&RBAa#yaW+RgP~VYTj_K64#yFfuqI;a zj`!~=@NZZ29y+Du%eO*=$DdDNOcT@s#-|s@@F&|7tnC z#((|bzgi;50zfK5J41l9{qaJ;nS$Wet7A|6;}LQC1O=v#gn=N>i0Xl0ZalqU!OV1d z97Yy80;YGc%EfBP#DCDPuy$wC3PjJ^EL5QUDv?!>VLx{vC)&LP{ zcce&ZzH>RW_ldyVc+@ys^pF-J?P`I|^wtd1m04=CqREH3HDxRq!t;mEo*gD@1{3YZ z^`{;P=P#)177laXJr~0U@k`rYe_)tO)Y5olG;rw!xHQs17Q1-97whYvI)*Xju11V# z6hvF6Ts}oK$s=(@(>mHZH=ceFO*-91ftwYI=HYO=+}y<3NexM$sRD^L~!NgI{QVU$&^9}oWv=0$a ziIZN2T@L(>ExpOTPss@;<#>`)i&1fSyTmY;ak8<47j0vzUd*P`m^I-0&@zsC8X+7) zZ+<}P!T1?IQZz8Dy!rZlj~J}!oM;Tz4+d+ZgAOy6!CQa%**|QT)9GgOm-%M8TFsZ+ z%~}?71@0rE~_1LFF37w1i6yUby;$zkv3u+ zZov~VZ8RN%pAicnhXD4FDNw0D{nCE9`X1z)m~QR}HR%3n16SX@d;X>PeXAoxJ&JJ2q3Iqd%uLG! zrXib3Q^&p`rLi(|pywW*(oIH=eNoG7y*Awzr@$p_Q%yMXPlTr@Xfl0U_OJk>?eByT zwvLX)YT9rt&}MRuMAZlMhU7>RvzZ`h!qMviG>eL&5{=b{q-6n_JLNI=t?$&KxC(s-Ov23=ltPrF0^wPA z8atJvMRgP-%?6LFg77Rww*5v}(BsSapw9p)8 zD(6svlZJ4a3o{oDZ~BHee00(IAhOVAJ5vj7F6PU`fw8`=VqFFc#M1d!{`uqHFQj<5j_RWvN<6&5s-L>3W{-1Y7w>LY$X=Wxj-{*C;5XEakgh<~W_ z@$6b2t_%Tq&B1f$Ksdh^xyc4YhmzFPYjpq~tS%Xa$eG1$E!Ps!hZ-2Y-9qD{PUP495_ z1ANv#zA;10a^D!?)9C|FQvdj7_PE(@4j1z5Y&)kj+TRG~@0RcoH~j0w@htm=$Ta-K z$DJ52a9P-gGvf9i-#or2JsZ$9`GIsAI#B;8eg>B&BP4X$+gAL@JVc-+eSG74-}|No zj30O6Tp;9`)yI$a)inFNu$tNS z%~!u#7Z8=|)uqH$zv3lS-Sv_KkhVBoFX)XnFr$#QFaKjGWz;Mo3*eqx9pggqSJsxVF) zvIlO(f8bWL1>?YNcjW`O;5u-tVGdmTZhJUzPTK=F5!fNUHp@=9(6~DG z!G3mVQ8_cf4hV{C{2QF-z`vc&*>TI9gLN0@V99k3*2A2G_T9ES2WJNg%-CT4pp=bk z$;i-e(*^xjT=d%vL%;Uj%Fqu^pA3Dry!4qrE~j%Aeb#0Athwm39fm&byKQy8aPdFy z-bAb|iVlhay+|0_P+HjF-Hw>xTcPm3GPU~o@RQ*h_vE!k>rKH?;%1c;8#r2wT z3KtC0&gNSl;zH*G5LZFBtog4ggF`j}HN?p6g}KNfX4yzshj_=e7v{t4h4$UHI>MHHwLJ^Gge;V~_xmnDX^X+PoETQ>Yf%*4?)HzuQ*b+A^m4GSird$VQG0Z_} z-)-VJYC0;#!_q+-lFZ(rM)~~i`IH7G+EBEqIk1Ca)N^npEt!odVASU3*RvVdJ{-oV zt)N@!eHb(COfaf%S$&h7+pIc&oNbp3ny(msj2V|BV>^spRYA9}o%fU+Z69*!)}qbH z>^p8VCeqy3TTVS;#%0gn4r9ku&~3c$cs3q$=e2XBR^YbTbiPJ3TFt9{`JF|PWZq-F zSr>8A6m!BEeNoG)7sBZwnYh(5$@otvPdqEOkT#6oIdXG`pV6A-qEfj(MEy{y*MbSv z_-u-SE;XSpj9`~4M$LG$If$u?*wT^~qBQv&G{PZ@4++IH>5$bbk~D>^(vY*Zk={HJ zXYDt(cp5uH%aX}4D*>jaaPFQ%T32dATH$wAEGs;h3S#9MA9oNd9bMl^E_m`h0i^IE zJAkzFv;^qhzFecb5k|O>^PrgqH7lkWwk*T$fEcpb1!RwPmQ+BRA9pT+;?i*>bdJS( zX;7UE^Ho|XE*T+D@&M5f=kwWWyIU={;&%OB5)9^>b|o(5IxLo}WpWzL^^N9g$)U4FRb9rgY=0R;QI0UMooH?-_t>~mU3Efe zrz$mfPG$!G9BFbRgCiDX6MqA26feQYH?udL6mhL8PxdDnZ;(*>4L@lo+Lx`zQixa-y2`|xlqNJN#XVLPiBCC(ZxBG7cu><|CMyT zw=eH{SxuQJg=&u;UY`Gme>UjP_))DIGDifp&BHm?tUY$l7^AkciLU|n1ze%?c_Bil zab!7Jlp}GHLE2&G$t{8VdzIF%4ybmjt5f?FE*RNxadliE@Q?|CzSz;(x9}!7`ypJL zn7!epeNm~5qfBObJ6*bLaS*(I8}|B*QABx2;+Hst=a-N7v*Wq|3F#F+=!n0~Y2WX< zno*{}8I0{u%z9_CY+ovQiaR`i`M6t^La-__5odg`-nGGZ3t0zua9^`WeMNu)j)lE zeby?xK8RSMJ+Yj?#?U6?_bL1$?)l*uUz6vjJi4BIKgG#6d4J+-9dFr0mH??(~bFz2KHyFMC=Z|Zsr8yV)$Ys8vR-;*=y(=Pas z(J0WFGy~a&5B?3VIG7w<|L_@#Vdc)X@#$#1kc;#X@ods$_>5pHDLCPH2GV|=UwseC z-tA3_b3@}T+6JDi`RxgW;i2FtQm?o@?Q&7R z^0iptx9FN4tH+sfZD?K|2?!$@vw43rE#G}xKT*1YVjZC6ytxe~YPCeZGobZESv|26 za_D;?<&~VR0wo8K>%{a5s?@lg04+h<;~H&_FV%0O-SCC0C>1jvot*hwySsMrwsm2ys= zAD~sZd1!IMhLtGow&)z#z$sCuU`p#;%_;SV^_?~EHSoAna$tvOiSVv#cZHRr3p^D8 zY0h&m7P`4xAU-(Vu69kKn?=O^ihy+f!Zz3vo^RO4BjR3zK;^ape`N%na&I^Q;n_Cf z#5*41)~1E;A@w6*mXF4_XzSJ4cOIxcDa*|*A9gGRs>Q}6vPVNC5#u<_Q>N z;T{OYkX@I)Pr9Llp<}=U8aC;qaTx`zf9u6;yWP#EP1e66x_M2YrFj>5epJ{=xn1O- zeLx!k>6PD5ugpX!e5RDH#2}ER@yuwf(hF8;q=N=2@*rid0HolUw@HYLjHfsy`xJuk zuYr9473iHfZs8bY18yk{u^;G??UXwZ0_|XPe*+gi-p(WomNHDjK|>5T7+2OEeD`(% zV_<;P&F4_sSdtq6O|g}UwT^%{emK~!I|+c*PfW{#h_EUM5;Zpd`s{>2431UHO^mD? z{%@C)%5?MQtKH+QB1gY8BeVk@%a)-P{%`km!v7^PxZSzu{|p!hpAgUs!q7PZF1q+Z za;TBma__|UP0lav?ja72CxCuZJ|LMx;d|ny^AQF+CsQXO{h37~Ye*IlZ!eJMxH6;@ z-KANWazg4)&+ zON=G~6abB)sg<$On3PUFUZnNTzOxxPIgqf6lW}ZiBJGRkV`#lnL1m@TN84k6pS%#p znMR)!e-KwFTh~@%jIAG?vN(02`1*Va3NyzTQzKrQIuBO9@PJkV7z?=!ogSSRdXyeu zua<91$9D~8jfEtJ8U60wp)Kh6(fAaVVO1%FBu3T{9{$v|V3%|(Pp3y0KD_R75*7Jl+Ax>)4L za=M;vX3OMOuIi#)1*qCH0&N>D!HTSw;6ySk=9M{FI$+S_1-b%!Ok>^7eJp&`(4H1~ zM64j|H1u7^%9j~UABm&j)_JD6@$`g$lj$~xgFxyE2n5U=kC1N|5*;n~x^TA`rBOs8<27+Hs(@j#p3NuXkq8m1z##|lZYUxDyBYXx?>iRv z(DB>j8T{Raf>Y&kKUKr0?~i5z*Lz@I_?Mr)&NF;&Mr)fn1X$2pLTxM{p3H6<1R zMBKcJ)Xmh4L~l*V-smJWWd|z3KsA|C2DbucSRiSxFPxD$uc%%ei>P$QI2zfBTBaiI zCxiw~=eKL|*SycP0F)Jgswtr_>QN-A7AkV72)zOuVU=61WLxPMVVT7Hc>>6Kn|7)F7KlTx7>BeYLgF(ATaZ%5BI6!!A&M)d4w{To`8wH0MFe$?=(e;-X$ zRHhZ{XbvaO8n>SoYJCc|MsjG$rb@D@NWh8A!)H6aR+#=RF2&mC*(4+BM|RPP@<=T6 zaJXIKYhd!l=BeG|3L!2g+An@^e>DC8R|zF$9Kq3USq}b~Mj{cuOTVS@2O%0~rVSYx zR}plf3-H9!a1`O_wHr^&OE;Zv7Ss85-sq((y7R{BrDMeV3LoX*SM?< zbmAp1nR**TrYBOqufa22urP?@p^BO1+0PeZvEbOgTH^I1@i<5!EBDY&`@ue$U_|)d z_D<2cGYMGgiORzHbdLCTnC#8g7aYcyDiqrq8l>FYCrIZ?ICC=Qsciav1xSA& z7qT6V(0@QM%{iQjdI~W$Nh2xVAJ*U1xC~;&m)7gmcD36y`@D+Iv9bER%vE*!KQ!Kkwj#{Z8E(f4Gsf)=rS_7Y z^6r5y1e^=!h+mH49S<(}Y@w!`XH5cskN$l$!!uF~AF!j{2}!bhJ?7Q$OT#Y>zg`Xe z5^swSd<~d*T4iMTkOGAmJ`hWr!|4$bup#DbU*lPsf*AIQE^#n;xYAUsv%S6i7LWx>YySW zR5YHTqPoqixpNgEx`-*Nql6AAQY-}(nKFy_fbDfj%Bc|Nc+D&U1*u=T1HFoL;J8_aj11Na_r65r) zat@#In<4t|FMcp_JTFt{l>M_flxm&6Ryodo@DzI)cziH6QbZ$|CHP_R#|Hk`fHn=> zCcXmK!zwGjE{k0KV+H23M|f0VLz_`tmnUuo?O!A$2wVakcW-BcZNx6JKBR@)P?Kbm z9h;c)oslweTTXuqi7ZZ6De|Aqz#>^&LV6EFPgBj*!=d8-mVmXOm5P^8Ti<0 zM`)3efIe~VK-3>%Sg31e7i3hlIs9&IYox>K=A7jJSl$N)yzPmhF^iWet!^ zd(Apl${P24OFam;PryjF1J3rk)eY0J5#6w2FP4X`J!)EyQ>e!^pFtr#Za3Yo*PC5q z`L2?}_nP!Lwz&PG^tjq7zD_-^ai?oNu6I4IktSM?lh@-|S*oP~CpGF_wR0`~SzNtq zpJrP%&SBI$S?3yN#;u)eTD{Xww^8VKJt$TgryH;9Rh_a~<8;${n%2|0+g<{C+I+oS ztaj^FW3*#Yp?h_D+L!HbtDWL2*3-1VZG3u~_P2GTr>RKik7-4(xA(oWGM4-#u86fy z=x2?uUnMM^K92$xzZ}EpL~p_e;xWI3*@@%*uwEz2RQ=8>T>^ znpRjaD}Fv(E;rM~vI(ISq0CqjiWyBvU7frL&+ja(B_PG_0O{k_FX(?gtTAND@-%L~ zU2$U#SQ;Bm8ivk2cS-X=m#$VNFzYCFae?elz1+Ep7-{ zzq74DBaKm7gU`<{=`%zl9^nPfQ3=K8{!=RJ3aPK#)~3lfA3_L zu5CWqlT*HYsq{q6c!vIse2Bn`ecH#(XnxrO%RS3B^F9*F#G z(ZLREs?6c#fKQbA9rCBYBCLfn1@q=Ysll`Plva$!_&=?8GoV6w05N>amsJ4Bn_b?@q;VjgT@j};wlo8lgKDZ zWsxzoVx*v)N_?Seq7TIn#MPkIB~vnE=|%fVrrM!KGmSdzxfLO{E*9z zDvLpS4;h3UA`E-FIpNvZn}HzeVXb0a13&q<;DCn;;g2>jKB?O%Oi`vw*#X!2MuHml8ax^1lGQLv4S)#Sm5ElgQ8 z<@65;w>IvR*BDBe3_qSvW{UhX8YFtKVfSjlFAMlpQb9)uN(1<{f{GkZPUxT`km7gp zw=jI?8A}6vPe#%YdZ!a@0`JZdqNM%(FOV~p`XqpR&?W$qdw%q2e0`5?R}b_9V)&%* zbz^=~4~RyYaA9C`y5LMkcr(3VxIjm+u6FMWp}N^(HC->)=--W~t^ogD5vq$%e~3fU z;$x4P0dY^hGDMfoMrJ0%Ai3HNtASiUK(3Yu8pp}wIGNk5zxn15fBF8?5C37d6^DLS zu&_Rum%W2UnD6?K`(A!14gy>PUKs^vZjU!9GBuX0mEmbsSORLNT7oehkYjpB!9tgHmJwxv!m(e~y6 zy>l?JzFK%9&Nf@*(UnKjvG!b?Y?J$y3Xu6P3*BPIr?Nd%UA14NF6(ya} z=V+pr4@jFwEoV7n_PIEJY!M+{HL||AWNzZTfdcV|2K^9Q{XAeY)z4MWI0$ItlG=vD!Hc-;@KA0ovEt$r+>(5XjUX*1R$M@d$tpFmB4d2Q7I>Wbo_FX`eaOkW^YFL_ zmHmw?C+IcWtaq!;YS&n2tOyUrD)kv&qwMy{6c2MG9)FhbxN5eGtu$I~A~Ak*c-2>4YE68P3m%r-Ea zO{d%WayDTp^<_-Qjm!_$xCL-zDDO5 zBj7*8(LvjAk$4P!-~uwmCPaW*!a_X+F^)gMf|Lq+YdAk<-S9P2lVxfZ5d|uVBg^Gn z+dCB+RmtQ?^OVQU*q12`&E#4YP$qr%&&9~)9*Q%)w!t37G4;aya#Ln*)Ca?K zeZ(&?3z3e08u~&;R^;A%`nXxvMee=6!E#rb#9i39n9q|vA`<0?gr~h_Bdz?jLDLqQ zI!N}LYX*#+uY6AVzVMuOY{^Au@cyfOnAOq01qS|@S_OzokAEYi^TA+&hGYkh=?(xw zn%Rg3BfV)@Jk-#Er*hDveKeJAAv}pABr~B@xrgG=qiq~jaZG(ckNlK*qD@2RSA5MG zTyBH#cw9ga8VU&qOhQiMs=(MP3yNCY5qUc)E}ndVKVN*4$)QS&T84EC;LG6VO(N&Q zo$jfSzw)e==C6J6R~~BUkkuAUwtYBEjzp7-Z`n*vi+>Skw{62?n4{~R=aR`cFMa)N~d{V!M(r}oeW}6}@_~1M9o}9qQ{q>Fb@$@2=k7pSneBp`{Z~@EnTuluC9r8!2WJr{3qCFxU4STV3;GL4RwgO%)v)m zHqa8C&MP{z4p!8RC-ep=Tj-6wkA$gbJE!yB$1s5YR@goRM)n^30A^HPAhH^<0~?No z8Mt=?XIfZBcrg*3;T*XpEHIpM2Q3qb2YS%(feIY7!lsK>(Y>G0s%23XJ#n;`v3mcw z51WQi!vqbBa6{pEU&ir}y9$BDi3UbW+xCG$1%umrmSs>FA@Pi>9w8M+)eAbxPg+~U zTN{{jmZ(uoI`3q`=H;n2FOS^3%yTfc@b1t4!9xyhV3w2U?E`phxT?uJr4EWU4#{avxgm~*>Jw-hC6xe87 zg!fWL41+9>2>K>5!L%;*dC-zA+Op>(S0gVi{>QO6H#@|EwURO+lII(ZeLf?$HShHFhu zcJ6qQ265$dI)ePWtZ)GmD-_pZvyVrh8zS{n{mS5oaB_ia2(h*ovJVP-WQoL-wfucGv+4Bjax)$Pzcg?q4PAPJE)A5BMJ?qv zRiYLmL1{?dC{auMh`hA=_#_r2F@9nEB#va-M(44|*9WFyO`iwdc(=>m#=2XkvU}V@ znq3s%_K|paQa5@pZu0!%2#D>hKqf2k^Zkk|+8=xm?nXu;G`wA*KvgVu_jdGbBiT8} zz-hi(_b&_hsi~zxUs8deCbIIu^SvMJ6ZW%w@*?|WccLrW@Pb$>VfaJlpz=&m zEDLq9+~E43v~*$pR2KtZ>9b*Vezz1VQ7*AK+DkZuGp>&H)$4Uz5&T;3B0Qsg!TF^2gF zRfSFzzYcFeYIE||L-uMs(G8SbyP-0iKNLGmym8=TTuILv~@w56)NRfxi&0dM=z*0LOUUnP%( zfp6QuR@T`10KfI3m<@m-I5fpTsZk@5NY#)?`ALb@N`gh`2{MbRLl)Wg|Knfrew2!rjb1&s^T}pE?Oj_a0 z?uy(Rt_}lN1tgg8<}7nd8NkXA9s^_5UHjnTc-cQYo>hdY@Jtw?@{EZKq0$lc2~P2Z zxg2*yaD{dR+%}|j0b@5?%!P-v#d1tZ@CxzSdV&966BaCj#<60-qiaS*0F^=#NSHw{ z7+1+#COa82QGfD-hU;eUR56;+U3#F?kh<}_8%yu?j2J+EeY5C7F1R;NkgO9e+ z(8(zJfE{#_?EOjZ(g*fBKv^ipK*V2^F$R+atL@(yYDqH7zP+LF(YA7%(|IdLZX)$!O#-D zeY|jZc05Rw2~(j?ABfBKwz0w4vGgO_%bC_zrtwvVKPA8r9!6vu_NprSVaR9w`yjiD=zst-|Hm^5$t2>r|; zpN;22bFS$KUS~dEZkDU%Y|~^NESeE}whk5}S%gDvn75pl37xkWzKYwf~fg#L& zTpL;o_F>F^yxd0EZuiCBc)p&tk1dK2wk#J*xQx_SH3u z5QRQeI-4Qki!KK+TKJ;48USNEi-Q-|8JEE>CEhnQc4;3(6_br-7dgI%DL8p40-4ea z;;5!=kX7AS`-C{OYGd8jy61jxz~!_~$~W_LDVf)+533t7a_1MRtA=nY&K zJ39MTTzqacDC%kkP#xXnn5CH{^5HMClcV>I#qV0Qd^d>KBl=&%3rM!xZkpvo2dem&zqL;TNsm{WSs+SuVF@4?sDa#(CBz@P`oy<>5W zFCqVKJ!M6YRs&7}H{=D~yKVOEypDzS|^4=uzW#G>Wx(Zq# zce~|mz1%J54fwMJR5kw8_*3K0A@FC_!Poe6T==twL2LY}6o0l4^?rhVc3|8sQ~E(1 zShfxLW{s^6Kv|x8ljAmjt4#bo&z&;aOJrWbtuna;tk-a>3@$KY&W%UE{cn#EWrhnDvK ziycbEFn>Ctk45f#&n?=sV@2l<4JYN!h`FTc0tk^r-Ns#jg#IH4;A5haI=|XgWG6~%Qivyh?PC5C)A5MJmGKr&6caadyWMl(Kxs^pg-o{>ypli_ z`og}M2dW6G5iu+nBg|2kwhlT+y3--c_ z!^~pYkNzz#@LNSDrz7Y^%DcB_(H{9HBHI%tkZ}@<^akOI%28^5?Qj>^Up8Ab<+lks z%z{GYF6CoK9gvZ)nnn)yxg%f`B6arwZhTq-kKTO&$H+t|CosK`j3DE9dp;w%gG88{ z*0{MkFSctq7Z6uceyvZa74J@az;-N%OU-N&Cv_%+0}cjr3~i!ZU$3r1)N9*3oata- zTpk$`jM&AZ$cYju3pOsBwn8u+{+MLJLoqB5W)vDHv^XAI7G@f>-Z+M$#3>m-%`E6@ zGMi5S4o2|z@DFLhg>!tR{>SQ2~u+iao5(kv>JI$fTZB zkGgALoXhQET>TK=U=cT&Z6os@?-D|AmUuK*?i79ttMX!AuCDzceBW+82h87byFyz8 z771%7@E}hHczJ6Onxa=cV>aKGj7OR8NTZ0znO&dJf5_I~+lc7#GN*eV5xCV9^AnrE z%(6ocZ+pZ$4y_U?)C-~HyeBGLnF_q)RSBf42d~X*eVNxd4zZ|BEp$$vZT%NJ@PGFI z5y5YC@cz{CjTqHk#+EmBb^D<)cgt{YM85-C8HmG2LefpZckZD$3U3w0%@|W3a6CU{ z9+v3Z<`b|J{6&oM+~k5F+8`1c5yK5AAue+xoWQp27895IBM^DYwnC>6xk8EyYspA3 z=ZnPjFJgFhg_bpa$r>JN$O@fun=0iC;bcUV@GobNl4Q;bsBWK_&SoPlDMJ{VsHkBM zTUyk_qw8JXl({)e=unx#CwEBL?F-1804J#q8aK;5TfxZL-C{jm&E`!vNt9eZWA)^e zWZs7|xiP7afqzLz4LolTX;W!}^8Svtf;5GOzcs6b0txhBC(1BJn}H$Yac7}Zn5S(L z4Szsw9L~N^BhmIY+U|+Lr~1I-U64Y}kvhD%55GoI!+5$xxO00LFXQbh9-X1lQu~13 zc+Kq){i_6t$Ww7R)Ha;AG^#$K5S=uS?tS$gFQNwgg#Z1`n$LsY8!Z2Gt&MgQf47U?83=ciN?$_4gxXX183d*URa;F%6|)Kp3lCph)Bor9^5DlJVZP18;x_oEHKdNud7L%a90S`*(1YTv@dEJlc+}ZYNK}XjF5{{4yST8i~OR+ocKuz6C@Qb8MgADv+0k( zlW-(;8d&X!<>v5!l+J>hiaId~Z)!+BY#C2oRCb1wG#aaqPvUfk(?{Tf9$MvO4$N}_}eh9(?XB65h5mFXTnl&+fmUQRyiF7 z#YVm(UY+v2)@hRR;_D*D+?HAKRGrpKE z5-g{$Lc#tsO@4idgEsa&C-M1g-tJOQ){E1%S@%7hgho0$TzaJJwbM1C9AU$6!*Nf?T z-55YvMBHNq(hN^`deTkyIfsJPm1q4mc)lCvCpfo3ASBn`)+n+!V;L7cv_o4S3$lXF z)Ht*;>EOEAJUWCY;=r(VY+QCU{b52p*$OylN3_(}ExO*YOPX>}nq?gNx8Q*5Ee5S;|!3z-@E4FGlr(P46MdEfEY)|&_FvH zX=n#hMRb2xelA9{GS5)+61XN4!hsS;mV%`5Ud+#Sq0S~*L|k|Eis9F|5nT;<4nb~5_Bo2k#`C34aal6FX+7dG=Wxuua)y%g)O}ds4vMRK$6tG(_+s8Ok zL+=FP(F58#lq=?+3iC#uanY26t- zl>Rv)*ZeeJ?29jQkwca{dcOCAeKO(Ricd(zKjklwQOYRGU16TdF5ovb!)za(2mhIv zzy=ZwnRz76D%%F<<;T+tpUg~`GhGI(9fpl~CBCSETPu{%gjmMxe7ak1*3-qZ z$&y$!IgZtm2oosas}IIcsg~d+7ba)zStkCaK}%j4Dfi^q&*H?vK2qEO`mYUbjAmNV8G$L!bll2W8Oba3?jpt{$7&61<~JI7 z4Py@Ek_5umGY0zy?nFHYiT!@(0<4e`91zPuU z*m+v78@4~`14^QvJU`&S2vH#_msn`c(|hFUVzki(Gg@)__RjSZ$>P$Em3%&_{V2@k z+q&QD#ySX(XO_X#99}htZ(3%}--qJw4V2N`y$yF?wGS0II&Q+q;orhMn`aEQJe!W7 z5B7{F$m89D7Y*DJEvFf0AQ9vAqw!tt?@VX_WL+IxKg40cs1cfl1r74EN(Bj*zca2T zVs&vSvPlMopP`Y)tRAW`U2Rg%jxpQ;U3oR667%6r*Sq;_u~|0d0+yV8WA)*YXuP~X z1+!4JY#`54{|TXDD)VR@U+$Vg8M;hxxHf)4HUBNMhD>Lq%+`F#WW{t6W4t*KF%Qcr zxn22a7JsXNYH?G25iZvsr5*bo_7T$#@%6)5hH&^p1ysZB^hL6?GfFQuupBYHJil0~ zhD|OIbSx=1WPXwFI+n~~EOtZa=cB_o2QS|e8-7f}zZg#!qR+*Uk{p~UpWn>-{K z>L5D`&T=PWmN?%I;X6vHCyQHFm^BNYj=;9_*&vONPI7uEY5~{^&(;El7P0N)6&dD|_mzelVUgQ5f{{78-b8P;)ruX{m>SHm`96+qOj7os zQQ)n4fgFC}5;+mYN|5nDa+GH)XnCsTsbZft_ui8gp!n$z=po|WoypN`Cvge6QKoaQ z+6Si=ZQ1YH_H)vfyu3P_8%a{M{+GIwXEzyRyJ-t zEhv=;%J#9n8FFEZ8$(hOOPsK%Y#YhT7+KGV za3XGtn*>W{Wu?RZgRD4aD->`wpUr0L`E0suDwzrJ_>>3>}!muF=BTZv2N$-GW^oWaIGdUfQH_lZMYOG2Mx172xCK@(KTbk z!q|EPhqjy$ zRL?M7qz1xSrd4I>HC!fL5C3aWJJ!zrZ;2b9e;F!kQDcH$pt{L zwb0KV-d(aK9*QOx0!ckI^J@TZyBMD4ELVqH0Fdi%*@9J`&EW1|KHe(m0^TfltL1ds zbOUF}S3Fi1@ZOIi|B`o*lJgZGtF*`lel?o`mPi^24{(RGL2&382}}vU{~G2M6fIs& z6ANO){AgzeW~BUWFO_p5ua0^)+#7H7JC1*=jen0t{*`Mc=)JMegP*msQJ@*-~XRFbO28s$(%PqYY4W=~vpE~%%Unh&!UP`Jyj zbP4nWgt5aFrl^6^1<^>}2DXc@f{gEmAx%9yR&*YT`E;~qJ!;ge5ab;jeYNqFwa$=; zp>3ysJGRq~)s#xctQ8flsC4J>Z{B~het#Vnhw!7K+{&_?s>8W=ah$6p&yqFD!Eo-K z3+Kl7N@$cj2K+TB${p>h^c>otQLaY0UEYi;#H}^>)!?@e@LRS2H29SVzZ<3LqZmLj zU@v|y40w6Q#tV4kk@XC9$;8>)mYq6^ztEYZe-oLbb-P0gRV`Hea(&nBL!CFOF@lP` z(P$F+69^7QLM=rI*{9<8pncY8VO0H~gWRN>3}8voG2ft)jYNK-ui&!YC^m-`?~X$6 z<787(t_k-=&1Uhn6oW>ibF6_-9Qt%NUu|d8-Dc4khh7L+A8Q;sqZC<==(O?}y~UI6 z4Mdhk!b^lY_BZQtaWdAVl}~t>I7p5|ps%y;&*Z>C4qd299!03QI|Gv_bbhr95CR^F zZ+2_+&s_stDB+4P6)u#h{iVVL znTZYv4{CP2#s)oOgBn_BU?2|+6vUYa=;6e2!mDfE(VPRzPK^wV-^8Ip>lkzP2z$W{ ztOei&52isr0A@p*z-6hRmX+(95wIHE!J|5gyO=NL4d9}LLS7NLNH#_uSk&*4SB5Eyb5t?EL7)WxM%S34H%!4# z6b&xq!38U5R!u1{Oh5GI$?+y>DpnqLlztXR9<8H(E63R%_$V)fXnq@R05Ra`*|t4e z&;zq(8o`*gXkeyQ04F#|q8I}JGAjw3Byo}mR+u+8iaVqM7qZ~SNL;jJT)8&Fvx(Hv zJ-AniFB3|ZU7Z)(4F`xy5TcWo68%aEUb@H%3eWd`uunK5{!g$0zwg#{&+abvf%C6@ zk8)(IAWkkP@WVrZPR!n{&{LD2g#`xBNCi~Y>^S?^R?}tRRalc`5fBU+36iuF;*gdE z$5*j-GYmeEp9<|j5 z8fhsoh_2c|6|JduCL-F$S)I(w#f(J){zF^@w2iHb$Iu7MCsS-<@o@qH&cq7sh-_d) zv+FG~a1$h)iriBJh2R1+g!;Vn;P%fZ>*l4|Vqa{rjtV+;wFRSVA2)Ie5I##79sD8A z=-Nhx#AE1%(cvjJVp;!0Y-tH+NZ#U1$E4lu-Ml$MXQZOSQaNFpqbJ+Q5A zhmJZRBVSdN3`s_gkiUnZei#L}11?%~bX<@tN1W9L2gwY`_48x|4tkv`7SCq~k#=vo zCTf<5Cyd!iQn9oNvx7YcqV#w~Vl^>{;t%On^Jqyu&vpm6@U3q6T87HX&qk_Vr_aMg>C-Td@tybltmw{(HEgRUv_W z_-*G`8{6vwJM`UKR;ofC0Tjnb7K z0RL|lYIV2y6xeV-p_6wi#JzT8zolJaL^aA=XLs#Gj7~Sl!hYBY^t}X0<(>+ID4ucE zgQ()DdcjZmN%KIb_~o4AE}5u-i_nFM3y+Y3)M`bN1T}AaA;=Hd3A{eBAN;gJDSKY< z20qN@-ge)71%H0XRYAqRzGUcBcpYy6w%}ZRi&O=Tm1;6-m;;b38FWZSjU=JvJUP}4 zW1>W)h^#vabHS_Mt^Fj^5wWAJmuf9QXo32eN74z2v5tKR{no+ioIw7?v z{i}I!qU7$3+(U6T*)|HLIHo?hWPZwAjx+LZ_F9YqJY_uN*8Hw7e#b)%S$6kppUyE> zXOtCI)R7*V6}FE{!GkE8adHpESz+5amExHCV1@Z9OWAPDj0FdpGv1<2AE#jL?@Sv{ zd~;0!LiW#6dFHQK>cBw=JVer3cq@+DKG49uT^ujRP2&gRoV0CFL3S*?aM5I{%^}V- z>9urc8Z+oQX?Sdb&rLJdJhLwt+C&K*rPVR>+)UfM72zE_0Hzjm&-95X`{Wu=E&I%k zrVsv^nJfnbjROC(jlFB+JGhF{Ih=9Gk#RLKyFt8^=HwlG&$AB^sWSiv0X`(R|KNuD z=beqS)y%Um=GjOJY3>P6e?Sk>>FkbQW;%&EUF+y8ECu3wiLxj3J2=gZXI95QcE-=~;)756Z*fd?R zTeMxhCX-Zt2h`i78aBf#uu3s!t7@hL8m2h*zQz?p;0kS=>IhTJlsWkcoml3n%rC-- zf@ggEh++T}Rd(_%jZ`C3ytJWed~8yisybnk3jF-G8QubWV!F;LDIA%5D9##N`}YfD z>V+%jrp&_-Gj~tmk1lpxn2NTAJ2e8^#nn2%O65dh@}ocwXL)8Sv?`7Xi|JF->1w*! zPB-h$3u>v-Ad-q%c{M@-WwEY(_Cwo?Q!>zMgtv)1hK1LJ7cNI)K+tllreBhkUs%D>StM&8;QL8zapGJypkm6HPXs;u|#MfpMvwsk7 zrizP*w^U}pkZGdqU=NK=6-1ZNoeqwKTQT7R23yZ*mU(<`!WYH_R z)u;M~9fz~Hdh;R80w};$2w0Ix?ClUrmW2+k{yG9U%|!??T)kRscH7NrRl?Qf(Ahiy zAFH1N7b4AL5U$ObA`nu_^i=?_3LT^M>3anl#@h{8dUq@?^mp0YmIa0Q_rIXe!$;#MJ08H^*}IO9 z*~lHwpNt0SatP$1#)6M;{`mbL=w8Xa3{HxVZ(#B1ujr7Sef0i+2u$Z>d>#0Q&*9;G zajb~GU|UWEFZ@U65ct4Cj6Vf-7}8&_H`I7|wkuzVoXABzej+BnbX0fSMBmJIyEtXb z3HKg)FhP)Ywwi30iwWA*{}p}k-{{JfCjAv}DVj1JZ()V%k#1CS52y&itB9>Ye&qLa zb}y4^xlJ{H)9sev27C>wUK)0<;ds^zZP+E^xuz6*EFy9&I)y z&rvsjEnf2?YfLgwA17PNqSRP-5{(w=hcM~~#QhKMEkq|pPLTemScs||B0@mG@Zo}i zduFi@cf&p&0ZYQ7!~J+g+D7z7B77ea(U=P)?qA5YE&{4At(EJ#1wHzwxR7rfHb?sJL%_rI8h!cxiAeY4xF>IMW{l9z_U^6YyUh1^M}i@G z%09&0_RZqhPl0VKht`EFk)aDR`o+3o^oHkqNV$%5t91NVXVz(@if`%<8*X`ruj>Ri0G51k8br1n^5aG!vib%IZHEN@xAi3{MiL3I@)>_Z|m7ogEA zZzP`)*ERm^(f9<#_3lZ~F*+RSuL)O0O$WD-KOs{gGZmPu_RVVFtYR@Du=`}?O1Vvy zB82cIA}w}f6c&s2AzIIFhPie5wjnIwBB+8&A0Ma(;i*u`1> zPU!3%7h;-7X+PY^ke=1rX^5Fk=kwKWy_>CkIoJ}l4*f`19tTHyv@^Kwnu(pqOB5PgHzB13mg>2iX zr^1N(6SbUL7OC0+s*~f2(&}L1{+J&6Ae` zJB%NTbHujM9_4ZM$P|-lSBPWRN30{^Ch{G0oS#tWj5t`cGac$fq1WRj#Cb zCBH*5NeC#+zv$gOP?bBg^F~x zyR;jT-WhLiQ?o$xcJ;hnbxObH?F$6~1e8Si5mQ zK8(#U@cGSjjcZ_sP?ao>q)juRi5+54KYRUTg|8O^zwcRK4~eERh#K|_cBphG<+bdIw;G*ICB$GqosbF8H5S>};AJZSCs z&yA-SfRLGPb8t1$s!5$QD9wedgGWBz!SpwJoh~dpYR&c_o|;~}^D~LD&OC!g@DnRe zdqxl9PW)#xu)@quy~#?FtkEI#vc}cYoV7R3+DHp+nv!O%-31t6s^JlaSDeN>N$+vY z^Wch?#JO_o;Dd%S_s6HJmZX9gd53_cgA^Dv`OAC)o`l)(G4L-LMoS#Ppn{>lAu#~5 z4L#33M1BxH8sDNHTwLQaeTpknhIWFqD(r&XPNYP$36__rSLb+(9fi*r`!N%MAtY>N3&d>z!)EL;Q-kaA@tu zt{v|{q9IuhEf_{47@BCJ#lmo6p@BA9D6|p^3jEwr;D64TXy7k#R^QsM9gm_Pu8t?k z)gB*B~bJHsb-?87Yx@b#Uv!u*ilnYsxHxn`!j>2|RNr%QutrsTsJt82zG!<@b0 zLrlhGdt&pLDY4*_V%r@=p`{(s2sE})gAsv7t%Z31k{wHSDlRgM+V)11?dkbm!G+}c zF_lI)ScIt@tFWQqk<5Sx@n6;P3XPNo%1Lct;KIqI#UmwtD{hImNu;!v&dR`WX{8|I zCBu;4mxX~SaN-#e2XKnV(;s>&%f2cI1us%L6g#(YU^FQsM_L;~i)@;O=7s%fjZL)B z*Ow?^e=5BC390a4Lk1HhKZvu!_8$K7*m`D&bm|=5e$c)UP)M0$NVsE?HxlcCF|70; zB*4MJQZy=ne4EYIl!G0kR%4`s9>IQTn}>5&_T<&QT!q<0455_==1%UKOFxYvJ=UZA zYYgyAH$WTsPJbgUa95GQT}q)8?|El8pC=R<;Q|JHRUP)r`)#!W?llJrOSxejDHQ z;iax7(k*wgPhtrz3js0ZX#=rgd+3ax% zM5hPE*}IO9x%eILb<(8IcQ`FF-Y-Mn`X#y2*a&p(-m z&!O+pMr?$vppic>eovo7PUNDlema;g7McG{_UCs*^n}J+G{Ser>~TilzuPAIemjNe|~;`d|o{I!Rh_aKfZ^T-v9WA-%n5zv)KgxoX%#;_iw)Xujt8t zqw7~%q_0L}0=+nvRV>bTfkh>^%f>}8;GBesy8qU)uYrAl+jQTJXCg?_>HYep?^m{e z0n4RCeHzVR1OMh(dQT3xCx`ROG{Fn4!42u2;Q)Wa9+Hv-5_i;;7>0NgCEO<7L>Uvv zIE;#%dT0f*Rm^4hbjt3WgLy@5lpl&Kk1gUVnPci$b!1GLUvZ?T73PEfiDuy$;cZWp zM}=DAx7Zm4mKg+9VU!OB8fS46FlKpVBX2DyO%hA^w?U!g} z(T0n^2{MO&y&-m{={z8vdp1yUi#ctc>fJmg0zt&hLIt@kZWSss3mL0WNwN%W7E+LP zb-(QW;A zm~o0$|B+eE6VyDjwSLLVvl1NQu1H%!j<;yp{>U zEkHH1!IuQ#?fqIN6ga1I-Hh<>%BD0#$c88f(nxQZ;0*~$A*`VmkFU6Y@5PXJ^ON<}OAYjgy0kFXiUEw^J-S zn)$IJ_!W?pG&@d`M*da#d^5?QqrS61jNNIVIxtY>6-vU`u5boaMEObt8<)h%7Xnk; zXPZWj3w!Zun-RSmFhQuLU&O&_+niJ8=z77W<;gceQVa?mmt^xJMje=5=q6Xq;4ofj z70N0EHvNG{5ncoP$?^FMwpS7n7CaNnzf?>S$>;nW$;9PQ|4)jVrl0%{;~L1vb4XD50eT#WG0a z@x9xGhEH}(L-Nkq#zrQz6`ma{IzLb`Mk+wq4$eDA$3sY zi1)aO=|zj}Y`0#nr;V3>6&0wl>P74w@WF5{X!nxT0a(g{brWN%z&=5NXC}uP3t(n# zOUC5l*Az`{5O~bH;dzj8C=88hlmhXR^@)!wIwl~QUGF%R3=QcLf6FRBCwmXaCOrFa zoi0W?<^lcJzM27K)Khj(OfV{v-p6ojXsml=R%Oy3?5&Se5?6lK|)T|(7 zP%NFhJi`%8cr9*ZHunl843qGWPhOnoIxUT|)x67Rq1D9eICuW~ozVH!&hIM>Uh?<# z9MAxeWHG~#1j3-rYu+Ls9Yp64*98T8Q~$Bc{PIfs3;I$P_-P^=$$a%g2MlT7cY9A~ zz8ebp=j?g|L&NCy$sT3=!vfKmK?_6ZwrL-%vAqHSU6y9b;WM=!j}AjpJ%^wz)g?MK zg#Kb7w8qLBD{HLWJyxy}O&Tc=f|P40B8!tf-}}KnnLR+|Qcp2jo{kYMZ`!8UHp5#$ zZY;o3or+y(;%2%A&CE;kD$V$d;VXR9%vG=y+;)!0yIeJvf-B~?jWum85n=hnE*8xX zXCKiQG%7Uf@OH6-ZVHSorxGPB3KdB%j_W!Xw8+6|GUyJ4Awqh~$c9*4L^~})HTc** z7Y6s)as6?v-nCHS?&>>UG@j8FPWaV1n4=k-;~mcV;lY#946j&?@#y>GA?(E|vA)sf z*4D^jt(y!}XQmz+38y|X@q|QanM=Fx4=ulM`T6IT-(OqSkG!^A{vtmXZ{gUw^kkl| z4Xs?ZPoI58d|~2vM>IM3#P_Ij?I(pNtKSe;MB66Q){eFh^|WR&nv~Y7YaWQo;$Ptd zsxvy;7?@Yn2uD*AOQ#9aR1!la5tZzlA`JE`~XeU0iN$|_lPWXG>8M* zWW`?SOgo-onW2rVw1Ptb?Zv=!ks%ob;9pNZA+Bn)(%600+GT(kPFSMX#Obt1apkJbw z1J|*cRI7+?@LY#*c7xAG@mz1?q=h@@v+c!+lO6*9!1l#A{ogseQvfG&c;Av4NsBbn zmmUHnkMUFb5xf?QXwn@m^<{<=v@Ot{fNDnAb^7Y!cDmVYtOIS~HzXIf_Lo-|^V`HJ zlH|;r-1}e9e!oNPNKXJ>U7(GFKc_EC59K;D6e>bO?$In@B=C1k-(osjmyB*56M`4l z_=42fuXlU2-w`HvtO!vWUd?Ch|83sT|D9jIdv`rwyt`e$Tg^A$-mIoaZ+AhPAe3Q_ zu;XXp-hV_$_Hb`+<42|in+Uz>dmnsri{w6?K4dzi^Yc1uYH&<0`QKQ`+JB|;DJucd zzsP%WwY5web_1C|;7n$$g^9@D51igpANgMdrgP z!0Kh|KYB>HJmi!^oI7ue^R)mAU|EI!MUv&ApFnM!t{W@oOCrRbkW%X*4TAQ-$&Dy2 zSe=AN-`j?<&Z<-8pXLY*5{OWuz{|h+=$`@$!&F#3^f{>Dl;|eN+Fs_&i{f)BD?T@4 z5}(|o;S`^XS!?n6W_E)h^zxhQx2wf>Zx-|QcV{a;7mCE^Qb2sdw*BYd{zqh<&nTVQI{1#gE(P$O%>DJn>zmxP zWzjkjUSYNLBEm^rAcZFjMvSmsuL9{>QXnnnV-iT*qu~`u3kiX=`EHHC-126zdh_Pp z+neRt3Z$hXfppzcAf;QQM{&eJGHl-x6U;$YGY(L8pDvA)7db9ihp|j@fNnr*#C|Q2 z4t2KMB{Y>_E$j<;I6+#@5cL>hHwhrCv>9sLlNrY8bs1km9Q$PL9b~z0l?tq67J3y` zH?pE?IVMrXJsM6?wUiN6tJyc3n{RL5&ex0O+i%vhvlUg>ibPc&1T=}N{Ep~WJShsX z5%$-L<%_;uEtl7uKlr zSR##FIaM7W7?%yY>5$ko(oYQh35Gp@m=XH4gYYu-goEc9wFa5SF-p6n$C~iU4r67OqTl#9|wEfJq2Toaaf3b1?Xj z#U-{wvR8VTuClw>LE}U++uCCR1eYtH*r_6_j2te9*^8E@s61yD4L1wYock_d(w=gW zpC=0o{AH=UZ(*|*oC79ZSA5zbBaFSj?OaX{u~`- z0~YBJyTsKSSA2wdL311 zw`5@Dck^2gtp73PhoeYTkj4?t9AHSd`TnC~?j1dp+AM8*h2%Po>6i*wo6} z8{$Ak!iF0OxqL?1XozjLvqnNHm!;AAq^wUhB$bmS5rWjOPjrK@4wJ}9!cx#i`F*r) z;~#&&1+2UTWJrm3?p?>ny!eFsC(Srp$cXUZ*ukrdKYsi`*CF#V2_HF_-pO?1ke5@m z_t6(0_h#UG#+$8c2bYEo*OaF86?^MM@X9aCxAaNmL@u!2m&o==F0qd=hH!7A4?mdR z?gVbpuMibq(=VQEGk}=lS$rSi6dgw_Fag3cqn;>h`t;@D;+qP}1%eHOX zwry9JZQHiZ{%XHJ;9O^t!^}x!J`s`kTI-`d`=kHnVo_fGZedw|wl(g zmQL>ofsSy6J-kxaJB_lc=hqL)omLr8hR zQD(X)KbQp`H`B!XpRJezv=fQ#*x9TcnvDorMT0qFhkxC{c#>C6H4U>64e}9b!omcw z0W2U32xp`M`JVS>2@2dKORB|Y7fQ2zMQSF2(h(?N;z-8_+PnFfl9) z3;p7Nc@Ll>II5u@dyVDcQY^`!S*r+fW-3Cj4~0VpD8n}f6<8l##D_~&cuuG zV|-aYIOU&;dhXue4e(3QbJ!LF=IkBW`aO~;-X!tEi}1(e&tPbo?#yEM;>7r$&qnoc zgjQ^gR~vZK4;HorHfi|+P`lz(R*5!X^(2!5Y}|c~gUb%*;S0TISmj>cl512EZwL>u zS-j*gEfx=82|v)vm_xO2frQ{5Z@XiPrL&5&G_`h<0x|jVY;JSxa_j@+xRm&6==6#} z^E7_;&BgkRG9ZJ~ge2JgC_OJz62OlOy)F-<-^LFp^gcte9bK+DcXr?&Oxlgpo07N3 z@hzJ{``zTje3PVAoMq;+7W!jY5rcU4@Vw+g3y{%Sq#|2UAwiFv zH5mn`o-h-&ipi%Y4+{`GoTvDLh%_YR96}h#(xTU9m53oH(6N%O6!<_W=plN|{Kun0 zL&1&@0ghX!ixfM=jAcZikv#AiJRRjBmy#AQ>q|Q zFv!)0tSf+sQzQFtDPAyWV2ah|N$YMGyOAh05l|t7i=Ztc{@$p5(v!?Doy`ZL<@TE=NC^h z>=?Uua(bv-Lzj?$2U&=p^@VC1^ zZ#SD47Hx6{NB9T#z~BoOAXL6DIFr9@H<8mSOl#T*{uM#6&@}s^yE3kPxh%_Qc@z6) z4f4m%5jwZ?b=g&A{dD(pH-ZJ{sWZW8K+Cp_+551RR0q<+A6@UmB0u-EkypDjdO7#o z?#{KXTJpzn(+;hvw4`{w+~N9Oe<5nMzpauEf3)5T+1&OJNOVxmKRzW$1mrpGUUiy+=U5&f-1l%2@09M}@I z2(?o>=}_ZDX}5CA<$;Orc6c7nC{2$sCr>7XMYof_r1JFISw-I6rpMp50%r4Hg4y?% z1;!?Hbd7f4ivU{N2UdfOW9k)bpLTnLEcSeE(3J ztmi_@IxdVtZtW>oy;`BKe0C88^*%-_Y=W0 zc5J}wd-4u_Waz=O3xwdS&LdxPds<|Hx<#}xtt0-eiShA7I|Doy`urrBaF2XXy6zVn zJ8%^qICTN#%?RoPa3ULKR=_2%drMEv6#IWCA9tAZ2Tb%s5&QU`UP!rXSae2(s1brh z1T^8iT{!X!4ogJe=A82Ed2o@Vli+o_+4r4xix8%xqPt-;Mh^4|l(f^E%|XcY-p%2) z`|Cb}DZwxL;eScN*YE2kcjPAMN5ybR80$5byvN?=zhqBA@BkIIn*-PwE*Y<_UiVl( ze<$;C0SQL(edd~xnVn_ofZ}|X6EYH9WujxAT`CyfI?D~4Jz!Bs9-#WYEQp+Lf{s z17el3R>ZpwJ>z2Rw2%PWt^+sYe9r)0efq@I&Ez_**`MNF=Hox=U55Br?K-hxE%@<9 z9FuLuW4V2BY{m1FpScHi4`RhTK0`32j(Flav4UQB_`IsCc;kqNx-{%vVclpH%%p zW$mns*@05Tz8PYQ+fP?XyULN_IgWGHB2DxlsBJ&G`Gs~87PYZ!+M1PxxJlhXvRtLg zgOydBU2jtEwr$vMuhVCCb<%@$Rc5=9Ub~w6RiyRvc_5K<8AaQ zH~U(wf!P~jtBtYSQ*88eZ1Q9J>&Mv`n@b41W?g16AU{)I0=BMKx}g^JeQOT0y6R!6 z2GWL`pL-M)7Zof6*zj{|J_uk^X&t~xwBY-Xd)gVi3&IMx!nFeerWgWTA#Zg@_K|0eT?@%CQoHnB!)d%1kf zS-?iksnrltUT$=7d;VHv+2m0*Du!asnh3`nwm5j(JyhA?H(k*9Qq?XW4a7>9Co-Mb zITNX|Zpe1%%W+hTzk8#VEP%aqJJrTjJ|Gm@L|3&hc@kn{jmfoH*|xa~FcG5-Gk#Xp zYn&7$Dbt*mC!@@AMd^!cf-t+p4WNa@QF+uU5p1Q*LB*mUPWFpVzFh$QXiU|jN4Fns$*&aYZj-~FqlQ(0}Q%^-TZ7x4wKU+8H{6RVY2ICgHrbYCeBVRlpintQ~g5B^( z=0U8ZJ9(PMQfSS*_< z1;SIHWkep?W&NE%TNnvafwhb?7vkI>Z&DG*T-^LWRgtfKbFIaUPElli_q>ZCO!SC5 zAGiEJ=GCcL6@b*m3pJ?9Q)*W!jm(WOB~GJfTa3Snph-rPLGK`>S=l+KgQ2c?Fyw(A z{RAlJ@6LBCBw}>^=B55rbXBJ{jspvHcQVtfuq_6O33)Ay31@2sHv*Enm@nRSPmT7o zCz69C7s}0eK;&2}`PbtZRU6#gXi0Ju#S}yA5xmO&A%i(*}3UlwBAX>(SgFk=<8>4GC*15F&+ePT1Q0eP0h`M zG~*jg=y1;!2EF6k;TrL~nxPh=GiJz)_Y{*ng|%cJm@5O7##Rtqt@>MeR(1yY`4zsv*dhujLFtc%xxY4Lv)9=sjE@b(+6z# z45Mid<2pnEKNmz$b2=!HRy~26`yp!oaqDiT@Q^c5yu+L`rpM`p?_4%j7K!LGZX+xG z2$>R!pZoo-V;zX(pNKG%_IpFYL!PGPe;>?d#{aC4-oL23C$tZOPKb*W*7d_hHKoLY z;d|MQ`&}KGxG;wkhUcPF@RR_VIM80UG|bwh)X{2Ol|5S5Ho5 zJTs{~%V&3u6}R?yuybJ6yHS!83Yf|mG-S@Pn*7GZ=Tg`?YG&8Qb_xj}GE*vRbN%Ry zz#OSQ)#x@1Gt9%_q&X>R?AnP^U@GQK^m6q#f9OBoKJBaY92umB$3nxyeVOVwK~|FC z1@3A5-%PuX37~1~r4m+0t%7?!TguYtyECTs5{PTiHQtRc`V#=U_LRUeliH=1Rwhn0 zWL7Hd%_X>Lg802>%YGl>f5-{~o!5O+RHK6>hoUquDqOiv%)ugQYP?4_@U{?q3=YUd z>kaQ3EtsCOB+g}sV52`U)5WKx=IiYGQaS{KmG`X7Z?^%lAQsOSC{_f~jJOnns6r3a zLR)N8pfq`?^;>Dje5=0UOsNPw2(3Zxm6r(R+2ELKxFYg)pA@!n}=@r9!*05M>}n#mSpe-WAb|1AK(kA&T`G z@u@x6kmedeUWyq%7CayU-^HDn_A->U&eT2%5FaCK<l(}XaEU;{17=^0(VqwNg5#QtUCDhyfjQWQ}m}7Is#Dt1^q-7JVVDE51 zGGcekjs5Ca6EFJbwRW*e>BC=on^Pwn#p~T2 zFu-L#+S*l8x#gx6h^Uk8niXy|D5xRJ4cld-E*iowI-lnfJ6noVdA)ctwaw|!7T@3< zFlpT^(-#Ox^VxqD-0-Z(p_cTa&);iK+~LcwMzfQ{sW|k_J@{7ZwcLHA>pE>mrPWK{ zj4APDa(9&W#IcuJS925+YZNKrFBu$UiBUMeM{4No_PaStqbVSE+z1cSh&T_5!yYlJstJOCmX$w?lz;K0pLuXGVxpJ?JqqD+ z1V3y7iZIE0pF*R#XZWOC_2w76v7l zmI)~xisnW{Cl+9SthqviG%_c!me=Hl;EeZkGXH^d#As& z%lG|u+cLF&&cGP|&=)umL9V>W@NBNpyY`+@vG}yUm&I2|1T&8`6Y-vw=lymH8 zWlIHAcWSswAR$Bya-j-3voXKgk*`I6%570Q7cQk@H)#L<9F#Q+C<@Z+&y1KMF~N$w z4`44%r~SE_YR!jc4f1OMxfvt1_z#-O!`Pc)+w3r}xcrBkVEmDXe`Y$32*SVJ5G!`S zH9FYb{+l5Nf$$AIm^@*dA;3EMtVY}z!Uar>%8R7kM(xI!RwxOf3O7tY2I1KN0f|U~ zzd|666%i2Lnoq>PRmMspCnUTe{+=AlzQNzT4M2t(z7*T^m=T4mmDYZ(UEU0KsB*2D zpF!>R(#D+DxiM0ykg>QqvSu7$7=d>}Hwp)gimldxeN=c1APxfL43#z2Ra$4|m_vMo z)(`Cz4w$^!#+YBBb0M(X;53aT03b^T_}yLg9u4Xq=Rj6~X+tM+n5;l`0c!ajQ$3#H zOI^$2K<(v6Zo<{?WQ|vyCrfM1I=<_Xm@AMiHN;T%p}mdwU|61I+$p&{Vj{nW;rzs4 z%suqZDR0h%fW{h2l3cl{2AnUYe~@55dupg~6A;iD#+n0)B72F4s2SYPHV5F2sgb7Q z$6ss)3F7={5R2G6ngJ@hKDB#Tsls3~CY+k?QVfOkF1ip_svK*u$sckMJFV6u?uT3P znIyA@M_(L-P5>UvmfIQ}c?Wu2?+cqd!}rWTGnc@bp&zegydY>WJUD>!a};julC%zZ z;SO`xh&&s$&e(fKSSlqvuNN48-?_lO@BXamK(B#nnrU|jK6}@jo@pD$TC}(1?--Y} zSrjwm=N>B--T zoD-?J58kG=#EG*cRa4xRV>R6sV`8pH>||8#*<$#~2}KLiKWX z(6yU}$H4h8<;Z1^@eS<~a9ae1{ahHz?N;B9)10DvYxk_cbu*7OIfh_G5yls#6jC$i zF&fH&sdF93fu%X2Zkc==W;bN8T0dRn`F+Y;>;g73CcaZSkZ+Yp%lnFInXz1EsjIuu zG#zXs=K`joaS$=X3=N(#ga;bgp=8m{5|l&cVjAJ`S+T#};bHgK16)I{=HBt~>`Mii ztTv8ADYXhKa7RBNHoXYi zxlA%6_`A1Os<+Z$>akwzcTISqg{anU!M@SZ^5&qVaVSpWY?HBy@Nf2U;K`=z$JZg- zZ3iLyb4I12zQ~iEMT!DB#ef9goRNQwvPe|)J?TWJeC`#pG$5mj|0OK(6KL{Z{m1mm zW|6S7!@4~eHrxn|fXuLAZYKt2y2TJn+Vll*qx*&j$g9CF&m@)2 zgP?u@RhvcD{8T)2uHYe8)o?_1i);Z4^n~U=!Lrj;abv9}#2B}x#dzFCE=4MlCC-J!kMxlb zwK(xoLs8$8a0;@BILYk5QmOx$DwT-x_QA4pQjRSn*=EU0w0YfY23rB0)O+Ou3B~pd zFrzJL)^sm@8_cKSTi@-;doT-)YRD03bR}$N|46LV?6YjnXFzy6D-RLK5zii5k*3}-^w6QiF8P?0#Q~Xs8$TiTxn3L)yUh2aKdhy)2xzB|3t9+|PH!;JEyLjNYhN5< zE}SbuYh=$&^0Fhf4~L)zla^la{Fd^WH{QsrBBOCkIhdG=>}4U4N=rEC9sYG6lkm8y z+^A7Q23r|as)sYtqKofjGYiAf#@LRnmoq{-9OM$wKeSK{9+oA6>R=#B^OlSY&y<|( z%_s@v2?3s;oVUg(H?FOuIlVO)LWgr={%X|XKA20eww+>|A6uLx1^+T65YvaTF zG1XxW7jZ9#XRe4ge#ExhTi}vcIrM5IBj8gZ$mJS=bcB zf`FG<)Cx%id-N_roU%MG9BK4&K4gkwJWg50nT*Z{*);d6+Yn%v-^OLZsYU@KZ{Gsz zJr@_axoMAU7yz=l#>!)^oss!6B`UZ(%oPKgliO?Q^CjJ#{Eq9v?!V#ILVKYQEX(vq zSqBqpM9wjJpHae)ze$TnQF18J_}p2r8^MCgnk6yFMfdul@zFrs`3|vMAGi<(i~8pS zw=l^TBDTK4j`33~P4Cv-e|sVx+0>2+C`qUdEbx`#5`}2PxKk-FFalF4L9Do)ya}f$ zyfcuC%ZgP4$xKTN_efY3b!Ctq>*3GH+7`L)X{~{gd&sFb$*(HT(*3(0vQ@r6(2vln zYCZue%~sh`{>aLG!8Q9_*kc?YN5rUDn=d!A29>N3ND|pLXKV!YC4f+P`btO;0%gvk zJszLDnD$r-2!NJ5i$R=m_Txc%KQ;=+fH9i^n6iYQgAG}mD$S>692X)P1cutl6P+sb zF@&It5W=9h=pd9vukaztI8eD0!Q9i?>yUdA1!mfsLC}ft{6lyP3#Hm6Z48I-qCxCT z)Baq^m^nh^S6EoB-!uejhq}hC9hBe6Mv^Ld^iCGdf9R7+bUK$kwZ?GixS0 z?(+C{8?CRqx=AEQnL`j*yT$-6RDs09?*4w2Dr`*|8r<=hNu+3NUxDrx%OZXg??@_y zG_7_e=ytGLg+S+_isNqz#4mp72w^QvE{L~wprDKFXrDkPnOJig<}@12WrZ$ZojYjV zlR1rO$L@*rxb|dCXcl0=sO$#dkxR&T<#jUyKecQt8*>yY?$`odY@p+Xp^m1ci+D>I zcJorcYw0ZRiz@Dhgt-5#0vB*|Mp7=~RxBBF(<$!O5=HJR=gll$ZqxeL#*qR|e~($f zE!lvz(<MyP_)yfgaVACNZ`IYLc-o9GFYB4Q}Eb z7ihU*u|U2!j5DEDBZzT-)RYa8CneX;cIB7-$SPGn=h@)VM)1HJ%~!qrf=M`U(uj}U zyW#%q=jqU>_IF2|VAguQD6`58TYB>uUt&0%{La(^?Bx2R!Did}p*IYEuGI!4^_eg0rSlVGwa+@{xf|AKpDt_u{hb+F3 zLloAmbCu_@$1@t`c_UYHfgW&{(3?%{f@eX8=%AUmn}JPeu;}2-->UwT**ehJteLXF zv|eH~Ezprs)ivwy6wb}z2A>H0!bZ>X*b5CUkEhiUYzA5412sP&atEROMRp|MyT!fI zBNYqw(*FiXlu^S5rc**c`5d{gc_ zr5jDWZll@tRDWoAVv6O;tl5(xl@H$ow!DWz1eM50ML8sUXa_ewea9F;j}aA>;9gcZ zTWFH|S&%!|I~6(G`%i<k#$PfoO8Itj zZ9Ko*LVeA<27qlohlHH0KMUj8I#~+ZB$hKuYL!e`L29EwNP>2ii$e8yTCDf(7v97| zb-4?8Y=xCjOUEBv5x+G%!YL95b;^8>G7Fai( zW@XQGu+3q3+MY!{^kQf$9^-E6+y`963rYwk>BNipuJHpHbdP&^HxC6HlJ8q)?|3a5 z<4=Y`)Pp?Kj}dBh-dhPrQH;vV-#u7O#CJGh-x8i0FF;*;!5|-K!7rpM1Khy>CINYG z8J_7YRUz*_zmKpP~4>$4Zxa^oP1@?==9c_xq;L08hDgKvQ$ap6MQ>(IDl3&?E~;%Uh}&pAQcMGYqZ`Qb>q!Eynck z54v3v8|i1`mAN%XBVcVLU)gE(Z3*()g=r7#xZr@Z4_nacBl^0PG7SGyD6;-e7P zr8B=)8GsODcs!v5B3H<}|H)X={S-KsY0zt`|HhCM)nh-jrm_vV394?Uw}<8>*&llAD< znaK=n>y)~OzatYJjVZok32`fr-CF^*r=$7+;-VXy^K%!!i9ga-bfzGBV`0&IW<^mL z()u570y5{*2qT;@eK}R!Tczd2LFWa$H-9^)I0p@$tPa!r5e|}CTCFzhQ4WgO z81?G}{6qhX>|4|=_Lug61>{E1sH*;U#fpLf-nU0I9zydR(($Q>r^$!^a zeOEG&9Bji!2E&5998g8@ur-!w%@(uMfY}KvcIcWu%E$OGUCuY#q{qI?j5(g1Y_qL# z4@5G7CYxinY8hovOo~Mf#r}zAHA`m+_HyUG615uVASj7yxT$0d z>C9Wp0ZJ1r<$gEVdE*7xN?jFJ?^P6fiXFq4D#c1hi=Xh3)d)u%}aRHuK{0NLjZDB#ttu z#X|@QVLB~^_n9c8Z~>F#SjwJL$FUkWk-?Psy~oB_*iV=@eTUL7A;u`%UL$ZkXoBEn z9%gFHHSd6=zsz35gIwryPsUvxC6026ZqHbR+;Cmtk}tz(fN%_qv0*Nh()BvWf>#i#koe+Y z$06rz{En9dC$!3KybSV*@dYBT;gYqDqmT9sz@b=|N`Eu|+R}lS82tA*iYN0RJ{g@_oUpIzFsjUI z>lrIB8Z?lFP8It}abU~FUf7`sJ_db-$sKUhL7Q9vjT{A`*E7e5AQq0Jyg~>ZRBOXO zFs{|+>+tq*_{ozC9Iu#IK>GHrtB>aR5=JBY>S?&9F^^_HK;kTuBzU;nNO zI#BQY7J}o(=V|^nzQOjd2UF19LOt;$!#1VQ;0_n!-}}i2S|23Ngs6@8wIhL4LiK!b2T(`rZ^J_VT&o5L36PnVdx|oRjvN$%R5$(fGTD8%Cf}1{# zvP-juY*~xoWdMwee37wk>gsWEaf_qJOYpAhdA^-O^xHb$PuH7}cvrug%4xGUb@aM_ zBBB5AohP6lhpBOvAZ~DwEj@U-Jf>TOY=&4eTSm9ewXqp-2@^&q@z+7XC>v-MT#RLZSWwI%fx4{@(v7j3qhP?;b@m; z<;u;_i)=4{_K-au`v10VN3GtS=Jea{8I!Jh;x5-1IfjG7X)gB7D6(|#pSwSeW3sRN z8vI*Pqj6|%#EWXI{gcpIiDhfy-ZkUQYJo?6IZUD2qN1XW^o;Nu>Mf;3q!&{na5E(% z?PRi`qdFzycr_OKm@pmlG#nJs<7Wv9+RTP8k`-0{a243?M_^&igq5C~pkvrE8w^+x z`*23Q7ePTB?$(*hI>g;wonFggKeO)P8&A(L500|LVXwlW5F~I+pg=Vgc?TC9E4z0Z zaTqWGBBJpT#KDscQD0eHbNE&nS-}3sAiqRH!o)0l7H(8Su$Wz~g}_0=hy-ebWK@-9 z_K*2i7J?oOMFi#4>t4~nz-0SKXL{?V_CpZ<`#e$6{tApznMrWWgx)5Hb9owt%c9A2 zNWZ(=N;0hy+eug9WX%v`8YY1`&(;QDw@-LAjnH(6}?6m zF&y>-VUwy7ws<*lqHr(Yard~==B3fusp-z(haBeG3_mx(bAvmDNS4|BM)k5{Z(|qs z3(qnLS7r(aSP5JXpP<>aie8o0{RK4{5msEIzxFm|~ss9y`vKy|t(v0V?<7n#LS$(nnG`WQEDm@teWg1O(WkODX4WSW_ zXuTKtFSp+vTi>kBGxYB1t8~%b$KEJ0zB~H@9?i$aT-Ug*FlgCt zH~(UxF&;vYMo&3CuV(XSSaK_PnkIwcm`tmyx%GsZ^h8bafg7$Ws^VHWhJ3|(eBIEf zsotC{#2qs!8Dt%BSPvZt3!JIpZE7tT6-CSF*?T@okxiT4Htll#+9pXcwQc8vX`=c0 zxv{2hM7J=8!6w*(SO(jGeiot%J!S*#auhA8%SfrAF`o192-0B0aL6@7Mi#}h^9wS) zA|LF5DJmW6hj%oUD@PGSh03NR>*Q8aigS||Z7Mr^TNN2KrJbAwbwr72RZVeib@2yp zp$&-*u?4o|rUd<*SS4cghS0^R5LMTKiXyP$hW$WDf+Y>P5{KlPb7D`4s_eNyt8zgg zO4)sIub0@0vMJB(f_J6%dG1x&@P%oI&Qz-Gus2j_YHMEe_fpjNQoUp|U0$WV8MX_uVx;d8Wq^J$Xvmu5q z^%w)$A|l0dBeL%wJEv$$ha z*7~z!3!O&J&bhsvu+*wLdi-P~s+Eg|i`%a*ie&v=Q*VMNULe>F^I~d*4O=* zkl?H6WIwQzjsF)(M-CmknoZ{H#PSnrPe_TTvZyn?Qp)%!4PFg-^F~ky4ZFA|5v^j& zTnZ#M_~WRzx4ijm(>zXUzUFuc>%!LnKY9kq9d`fs4KIl+T1K5$*Q)W86>}s_#88J&mJC5)pZ!4hk%zvYX>+Z#3y# zPC!|ZF;<1*#19EEMo5J%ViXCB8!Zw32e;7r)ZOH@81)WEo1JhGu_Bwn>S38&n@Sx7 z_(}yZJLLtA{P~K26Z_1RioiB#N?4S$xHY&@IZaauN}l&AIA@xGvewxm*jFngIG^h! zo#P#%%sa$+GHoxHDM3sOQU#2962) zE&b}LF%N#_brk=&?Bo8PSF}#wwrtGnuZVKY z^sshVnVphSGTk46LSR~O8;J!uR+OuorZ@|2Q;;Kt7c>=@UPd&`J;3&)5IQ*v9HBAc zof@g`v4vEBJ3szcqOYer%O`p=Te>OL8*2@Bgs;jge6Z%z9J*>Kc9m2$1D$ zyHds~Jo)lzd-$C0bz4DgS>FcXRo{u!aMLWWC>a`j$&y6_OBPq=7-6!+%(<+!38G?R zo~!>Sm*3(3P0odn!&;C40wF_91S;wcLM}{gAB&hENSkaBU{flEixw;n8DrsaaxD8! zs3gtDlP)h~V8l?o7$i<++NCQh!vvI;3Q50idQnEbiJ8%$>5*)K*m^HUQ6b7a%~Xy} z&+S?E=hm}TxY$g6aTx5|Oa!6SgLb13ed9%&1eIHuK?Wb?Hw#zO@k&du;ncmRuh{XL z9+W^hFG?8moP0Sx5?}{y09rZ+R#Q_@b~Y;P*C< zs29G^Jz|9s2*i%HE_XZ2)!2VMH)x^JUdo?TyQcKRP5K1c!(zUHazrUXeBXSb-8U%3 zdlx*NA&D~-g3#^%AN3JJtH8ACAr$Pl9^Di5y74L457oe@=SZ;0LZz?@#-wo|^rX#~ z!~TG$Lv4aV?^wMrD+`;7KP;-T;u;aA3&S=f+zdRjdAbixEKJEG8OqrOD8@tNl+K|20oCE*zs(TNGk{@c-L01%Cie`O#!3` z%23|OOb%u9TF|5|Ez%M2xiQohjRSvH5=MRm(CBwR+hWdT*=few*Ft5};(zMJzs8Mx zaIoW*(A^X?lPuUkU5z~PZ468uj1Af*-WJ;t6m&M;%^eY_LTHQ!O$~xKfrTQJTkDG= z&sl|6_q?(`;}7&{TpO+>`XLj-LkP2;+DDx7awTVU0& z(WY^%nbK;=8Xfqh*({|fm5JZ*redE${Od_}$5S0&_@wS&K;_d>6gdHCY{>)3Q<$Rj z98Ro*_%H<7Zhu2qvfyfN@auf3buuxj69Mf{Bwf-}`b6B0I`ly@iB*t7+u!}x&|aPz z`$9RlTo+9?m^$+7ws7wP_mnJkJb$>;Szv|9gK|@&jT+;%86gkK2)6!QG1PrkcQByB zwUht9r>3=|``f~JiWXnb4g41%Xkt4|*-FJR)ewjU_ewmgnhnhrVAG#MA{M&%o8_$i z!xCRmO0J0upDNBrZg==(Cix|EX}u>U$@{hmCAIGYT+@&CXCXvq*J2EcF9N0TkkNk6 z+tG0hf4ZrG@By1?6w|tnL*>}hRTsZg2eh{!i8stZ%0m7njhHUvv0Lp;iic<$0$!QrpeL?=mBgX*R@dwT>x_jVOPu`zAugzo!xlIe z!Pw!NDv&cke~>QD#Zw#Isn;j(aK}R)az4z1=4ovkIN-!&5J}!Fz zZn*MxX(s)nhR(GlI1}30h4`sS*t8cxfQqiZVLvL7sc0a~#dw(`EVew$BqJhH=(Ue4 z&@M45C~!SoL^A#7d%+x^%7@U1gMD8pe+-bl&tx?4pM3JgrWapSYwIxU<3!)9`{Snsf_y2)*FO!x`t0HX_!DEV^{u4F=Ovv#z--(YgqW z1WCNSw?4TMib)vNCB`2!52663S?2a zde`sm5up57f^62^?R6I#SqJOp7mal`%Z#7P3vky+GIW-`mYicDi?QphUlJZRevVN_ zLR6qP@pkN|^}`Ou`v84REh2^}|DK1bJ|qM8gm>^m{3zL5 zZ(w5UjUi%sgZuuWAh@zIw`22~8b2+_ih?lW*m~}PYg@%Es*qKj+Q1w6l}(022qCd) z#B@P3H=>8sV?`#~t{9p9i>r`UttMP8P}TNSu9{595ocS2jl`jYQ{&VJ8J+jz-kCd# z#HrYP$SWxu+$1$=g<2r0Cal2A8Eb0U)534&WzLcKnWc-lmsC5X^oS9wSCyh?eGstQa3UxBD<#RuRE>3 z*d|79wU2K}gN~pQ&`~L7qnm#H+E|YdNhK zjcB(_4~ma-P?K#XQA1c5Yc{>jv zC*F!M{EFYhhVVS1zDvjwocz%?)TCZ6hnN??q*kVpaDf7@lVixLJ*(c%1)7_e351%M z06YDKz|A1IH>8H2z@v2sL+u`Eb?X%YPq5QUcy$VK?;}9~;aYoUa&E8rfGuX1%2*9m z00AS*GChPWS!8`z!5wU!@fEv^@9l5zQi!(G#}@5j*L7c2{`s3fJGU+8>I#OJ1h(IM z*pz?ORVNMeShc$QzSkdI1vtc*(9&)a+3d6jV*hFCfeq0Q?fZm#rB%}Ex#unB6h+R@ zcexn7gNdVhKs2pZ$J9;UZMcn%KzXL7)Hflz@l$P;hPIwqp+20;7 zM0{mBh5^ zKaxAILWR3ST1}&?V{dF8_*Sh%sxbI(o$Cjs9tf-|45@K*c*JG<7klJF_^#T=-1ME-$2#BvdQ zrrM!6d?>v^jP?~z*wY~^48yv8Z@#Qu{kr{8c-B;VEAQflk9VVIJs_pKmC&PLP48wp z^!r1>I4%_-LdPS7Yb>@G2yD)kB3e@zMPS@Q(FJc=%D4i-!pH?|(oio<8Eag0!au=9 z$pilf*FY%0-k~CIRD=eL!-7Ta;(boA@fo;ywZrk8V59aojtw|=<8FNE&{0)ZT)Id* z+p`15Dus^pH*x5wCP!|8!rq}{JONG6(KP6r82||#bOMKTo~(W$kgo$`Qk;1^IL<7p0a~Oo4&!?u^?JI}4hZIo zl*7Efxmhk&H`lRbt15??FU-bL+hx5qQE9iekrXhYur514cLaG8{fJgHeG4ybn5(X* zur8Y@{RgCu01X4=R+HX zhx6!!A^&+)R(hAo_Z!xP1+@M#x9u`9X(c**&VrOYDKx2lV&+zE$8d?vdKwP z@aAYIjds##C(Rh>*4~%`ePi*)=)m7|@X0i(Q|+12o|y_yhpKdNIfkqYe$Krk?wwJS z9Ile$!TdA4LD8K@wrG3xeC*Zd8@g(=W9IIR*82S^X11=bSJ#W#@_OE6w&v|yZMJH& zRhzA2pj(@*1^QH&tramIJs>P?&yK~OZPc{dqSY2{g>|SZ*NfwA?IW@yVP|2o(C93< zhLW*qtKJf~YSrX`siC?*yS8#tnk-vnaAK2|X~2L64B7w@(e`!(wt?Ung{*`5&CP1H zS>CQ154G}U#8|C^2h$C6h5=sagB^h%gX#^k_Ms7(zuF#R0%RpZrrlHC;O0Y2{f#aP zPPxHhrrq1lZjT3KnXYwmacqk3!8LZIj?xj+_slTa3CK`>N`HrF1vY2ApyvgD&XULZ zeHZQ-poKVRHnX~b3lW``*_Jr6qqj5sv^N?>a^2t$K?1zxm?$I~dLbo(XiCt**bcu0 zg?c9j!_f>(9B$RC)lk+eG97NGt1iuk&R3}Ig=PfYTwA>iNp3XL_T#LH+;iL~kXDrs z2Y$(dW_ThFkk#bAq15yThVfvVk94r6kM?FnQrTOs84ws?iV6^FP+NBQQX}b#cp1w1 zIMIIeTOus$hgF!$!YnEnOR^A?v=20p&Gcr*ooAT@zQUInxW;EkSnQy+Z0!)K;Tnu( z+gd>S68o3}r(f(PcIC*eX20;Dv``qPVaSRVY_B-2v|9|+=1pg@4YtRN^<67vHl0DI z9oSTrK?lbul-vtTpNj)eHJNiVl=TZgxo>{GJP?{9zn6e0YZ;+KT&Xc-f0**6U&iYM zTIx9XF<~#A{#rc(+o-yuj~A#k{+s4phxOQt+)KnlunR ze;|04NyEDVfjWG&0~n|@-j`#UG(K#H4^`b1JUWrJ&jLgINE{KWxd#~2(;pNh!)?NV zk9!*~-^ExE*cScM`2sOyQ1(1+ntabE6X~H<9Eg# zpjyY1+Wu(mhL*j))*vc`m3U!)wYi#A#`QxR5vnd{;R!E0=VyKpHz?Fx!OGIsvsuA; z)IYd!p$&`v42yF*5q_4Ih01Aqv59WFz0@T)t!HcAs7u5;TivcUv*mhr+gL3pXAPa3 zk%N`uSs6JA#b;#X=!lyUn>xx9PCi?MN7W@dGVP^dHJP8pjUF}E>hkpUZT9d+)@Z{= z8$K^00z#WU&&Tw6zBxWeVg)J8>^YxZBc`0+teOsc3I>z5gPyG&q%_8fhh?>aG_ZlB zK7--2HIYJZ8Fp%eA@f^Zs5~mF;DU$(1!ji=d{huOO z!sLj|KocfYr4T&fq>TffWGL$oqEw{lEQ2Z7PXp;oWjzMkC;QBNvdGs8esT8J&p9ll$-wSm%m@aB5PKmL9@T~Du}S#G}mNd!y>%jZ<(K8#EYp7bC9=KH0r2n< z<^{1i`tXD4?M^U|uMibq=eaZ9N~Zux@_iH?@2;*MA0MZW%c&piu0H*A1utFw^zGZp zm(ZQSAM@G#<_a+c7FvPWp$Uk`fv*k+G<3YQ zA<5?qxwSw8-z10CY)^MBtFK>h^@Sxsv_z-naYr$StnD$Y*`t2mf=>eZDHV0c><^r z5{v-m0XE7ZJp^`rG~B-8lKEl-4#gIsrtB)`BfaEsJTB-LgfG;g}-QlYLwC;*&6elKjwKB zCz=}dbhpDb?&%%(bd!5uBcHjl>j;?GGOtYfgD~FVp^gXdWN7OV>M%p+y*U~AAZ-l~ zc+7t*YacoK`nF0$6I*J#MB63WF43N52^kdU*~CBdo}WN~tB)m+=I{RayOn^d3<_0l zyDH49xwu|#7PpJ_^`^;s&6~N}dezpewqBdJqqbiMwqMof4AmBFjeV%>`c*<~nfVIO z#cfwbSFl*h`Ziqgz?)-+NQeP^VZayq^3^jyrTX%fF1m2;MHf1o&|E*GsifTz=B!Zz z8gTX*q1Ch+ZDX@S)PT3^EH;ZYk7KhIqYTVac4ICfwmLd1{Z$-ND!MgSq;d#g$r-Gr z3SM?dtUewX5UA>~C5=?i9;tR*8M(AKidri;@OhwC9qcnc?Apn_%9oB{m0hY#m#HS6 zhy7g~#VWd3Sw`s~IF|o%zEt_#vFx)5b8Um}jqe*vfsZ%%mn>gN8b4#;8Veg2y)`$x;&H)X1HRRQhSG%dj zZ)6h5(Yeo=bVGd3oATN@B_2_IC3F-UY$!J~j~>(}*x)AEI4_xLBTO4%&(sK0a?Q|> zJU@cBzf4GNO2!B){3dRMDY$M}Mqy7zSaAY)4j$0!&f#=0%!7aOur-F>w`@p#Y#MMz z1XV^OY@(44a9va1vQEb*f&-XRw02g<#p#(Z5!iLCy|J~CQaK=A%67fa7=pAHB!bO$ z$MJ-angY3@jmx%*Z7BE$ob;QB6)s-StV4E#v+)$Jb8wn1z>Z zI>9XX5YjcDkc{aSx|H{e)aR|hF>dz<EqO>d`5#)VkP5%1o8`{xhu zfB5(HJef)k^Zer<{!P%|_&cOdzq5nDbbQypH2%N;{r~)*|JVOv{LlaA|2Dq*?&sgV z|M=#YH^%Qy-q)ALI~&d5?@a4gWRf>|BtN2Az!LcnwuRm>{tf7GtkC!hQTVknpU(3} z_>#vTxy1fR)Wm!a9?9iwKEDQ!Bzn?hfmiWyW}XRbC|z7gDzifa0=G$0xZ&V$ZSoDS zm>wr*B5xwKG((Sefo+Eg&Tz1z3W@H2u+8Wc@J0&%-~*f1aWlMurMh`Y;$XnXH`>jXN>_>5K(4Qk64VW-2Vb7x`x4+*+} zlu#zg&qH21c?gfB3_La7lsyiaU_KuqnAm>>rZQ^&-f^Aii75X9bps$5VHwhm(*+uw zShnl->v}2c7Q+_-HQTTEMR>j1IAK6&$XVW!hWiYOBFPp4b1Q56&vv;+hDKQm?$#hZ z>ihLu088vIY6Ru`|) z@@AGO-H1is*nlY`9|Hd{al8-#$?WtXF#3=MLazaKIF@uvCpYOALFHs)@NTuwyF2CAc9QKm z!ObJ2x0&8FW=je~-*WIdbc%Q}XHqa(tssziaIhkv(?dRkrN)2anIpDVI#Z)!NZ_k1 zJBmol!V)s#v9n37+6rUa@U8cHBLE50OL}Ii;?lV%K7E)c-i@xPODr$O!{J5d=2u0S z%kVonbu?m*LpI2;EJxSBSDqtmK9(g2@~00XJV(^6I;LYDwm2EgPc%NXi-c|LQZ<8^ zV%xs8qGT1jLM)}WnETed*bmi z%`u1v&AzhkHeeanc1N?JlcP6kpIQFl-tnkA7VU=8I=B|-!ZmVjZ$ z+k!WqxJytYf8^adz;krZZ!R~NqTKi=VA{>%J=D6skQv%-KkiMgMCKcP!f^~vk z=!s)|2c0(9z+)hvsSotx^&jFW8AZ}4tGuzM&W)~V*tyk#Ry|mp8+LpJW^>S+r~3*1 zsaQHT_pqZIG9=_?8b?|RQaN_>!*rt|q(h0Ks&)`*? zr0-k}_EMJK%z7$Z=|u+%DGF7=-chi4XEkOFm0#MRk7i)v5RaEOaJWR$-x+I8HuUGSR(=QcSvQUc)NpT}2N?VKTn~tUo|EfAj8i1IrH&;8xk7s%UWWG}Ug|Lz zD!sWM#x&^u{10Oqb-xaXF^#-84+I&sc0p(tM9YmJ;)77U3*-&Gjz%hE>1k?T3bh@0 zDul#$uda&cBZZo<*Lg6X-YR;MJEm5Pq0Yt7#3J8oaiqo3bDLx>j?PaU+1?iJNbej^ zOC&9kp4%jAiFAGviQEy_GD*v%=Q+t*CY_T^YB;Ps50=yWT2Hd}X+Jx;^lW@dXS#K? zd^%^cwS4MaK2hgVMm~{$%4YL=4z}T$Zb&Wl&Y5g2^*Wb&&&q*yru#<=sdFY<3#o2} zRC7@Fc`)F4?eg=YR?8$UlLnAU&&H>9Uc3FgsMWGb%cdb@lMa^B)N1jh#nVW|)3b6s zo!6E>FKV@b8oz+bJS9)6x>s40kE_B^Cx!TSr1oX6Rrrd1k_y7}|5}!~diWB2y!D^> zT4j_-J`KKj)w^PSCGj>2H44O=C{5}w-b`5{f6+Edie9uS1z1s7VBms)%bC)GfRHo3 zq#z(V7Y9qU;f^J)cByWaSg5Pm_}lVY?C7!XqBLmUQmO;qgd{aYS87P zTz<%ayT&%)LUtILVR}B&7C~IgbW}rByk*JnquaA}x7wxnm)2SvD+6~Ur)V8OMo^7r z)TL2Ok`juxIG&}g4U3S{x3t~fHn42Kf72nXnw1~r{%$_txl=NBVLZY-9K=CgZCq&w z_3#erTGLn9-p|`p;!c_>v!!KAReP~zbLCR4jsH7`W?MF)W~S<)N!#{R%~dIckZ48~ zcQuK7nKmn&bS>PKc@NIe2NDbU1Bt)*jyJjYgDsNF@o5C}O#CQ=mF`0canukRDy|XkpQu+m)yY-Zn{$xwJ;U5? z3GSf|W#YreIt&k0@Dmm|6nI;>ba{xy=FWlhy!$5+D4tN% z{g{){E*eG~Q9-VEpAA^XiAq~&{;-+He+id-+&c-49>Zv2M zalPq&HaZoHb)C`$pD7cORh@M!Fl&3IV=VV?^dUSesOx(+C_AsuS*#*0aRgZI?K+1N zY(He`<`t5l9g>LK?;J{GIwB)kG;R1!kpv~EhcVN2yB!b9i_H{qt8~vIY(HeqX1rn| zG`eM$632#Cb-hK%SDi7n43CF^_w{;lokYD?hR5gQ z=*Jo!|A0VOE+{oVtP1!3$=xFH8v!VTnY6cU0B(PS$+KQzEJEWLBBE{X|}rOh7qv zmxW-EuMGH#m8-Z-2kGnN_M~ef9SU3mHv`RVtVZ&BD|qk`ll24=&+KaGAYBoc(+Cx9Ql-667jDJ*JfT3;8J)I1fwk;sAh;_!nx;egj1cyG!+v7|@>2);F`wYO!np+66>@MnJnnkj7wJ zi7*{MJm*p+%0@m6py%Eo8rb&=?77!P1N`;?eph|fM2$L}1J z)#LX9UA;i}+_0NaJJB5E6LL`tK4^&;@}5B()P;%kD~1kq37mV^@$ue&!m~)4b-*^}WzXa_V#-nMrE9nZ{t_$u?0R zh@IltYDzkS9zObqcWHe8hW_G&_ui|E&Fy+JpKO+^#e6xL%_f_R*MFk(@gHB@eKnr%8PC@*heq@&5dF1+oYSuPglL)U0%tq9H$!`}xA8rS6xf&kE{yMa zXl=sxRh0Gw^UEiK2knzrjld4=;4|n6I4y$a3}_A?8j*8Nh#?M6aHW9XB2X($MF!c? zNze|qAf}_=v!JqmNp`6biC2;JX)R@KZ>Ro-XDVND^RZ+t$7VxI*0Mx3Y9hW0OGvJ_ zR?1s)+g4cIN@v=sq;nW)TfB5!CTvYCQ2)g|`r*HZ27GAX55dUFo0GohJ~1{W!tSjp z45`&NIdp(aYStywFR^vzLa|8g!+Q$h^PG8#I@MNnOrn+5;L56Qd91N*v>Xel|Ql&o8swgR%) zrb_upwj&Xb{9dR&rK6J2u5^jEPIyFrm&!-_o4ABj5ad-xVec|Bo&erU8dU-k-$JF0 zwY++vDsY^Ccw&L$>-p?@|;CSWoW~0a}7JB?);Z5Tc9ory*-~0@& zvB8kopnh$1@OOKJpd>CTT_`L9O7Q{yMI0R{h>R*y*E=>KgXgiINS(&K0YxP15$7b? zkyKsmoA}p6+QtX-;lV^264XATH$9MdNcs(2f@|yBSkQa@*!n;-O99;AjuVNV>jz7A{#ou(uHPs= z9mhWQGO>=G{-RQyhdO?#PHF31s29#VQa-jl5HF$e1_BXTNj_{XT2AVPjJernv6`>e zv*ugCd8==%#vI&5&)GW8uQpM7N%?7<;SUEhGdBBYXNvt1H@i>xQH9Qu+6M!rZMycX|Et=RHSharuUTP zK{F|Xg8Kf!k2?n{p{=BaN6J35jpD~GoEn|%=>q7uOJuZ3P%9b#B}uO4;2fS5B;(18 zw>Ff~bG{VOFySft3tF2ZGSBX4zu^8O_yZT4Ng*6=F`(HMDK@{iqenYQHjuLq2npkDNE9mM$3?=SB6;2x zFV_ZpJ3~;5@@#oXGqiQ0pgbG9X2$@jvQqN|{~~UmC=DQssq5W9A%joO z(1gsF#bP;IqyJytHkdC3J7=usOZ&5^(nWq2Cs6_;8~hxqj)gBEf zj^TqlB$Im^?TS)Jkp3)=3zSClW$5f395Bu}Zx{RXN7<@ZyY6L%Q50AsuwpYZiO_z@dJCjods^{Lskh8bk~U zA{v)RBZ>A%LUFt+UaOir!OZXCSVC#sYnIYsz(f~!g46rJtxCanJSg*cw9NoJ_UjW{ zoU_18&ZcNPEiHYXevsTY^abz_&-7xe7nVhyq50hj@>H3RQJuA%3>?JFP}etOezDuC;*{4>A+ZAYxR3gEST_iy}Y@- z-E5jp;|dPAGxDopIg>qkV?+*bn9G= z{1G_d-|Z({CiHc9uIcsSzDo#@!8E{yWM)LOwm`k^p;Lr%{{9~XK`$KZ3vgdxp8_{rxlWgno?2OFPO^0th zvD+@>-*+rzVm4oH<8;3bm?Nf`Vti{0rwlBRAlH2{4Pg(PkYrCKd$2*-GItZJ1YwyB zB*DM=l&7H7VE&K<_W=dFcKrr_XFuTDy;vn8W`o}HijmOO?Fm>?Qo$qF(SU}th&|$g z6WVFQf&992nsBU;cAd0$ov66k1XN(>W$G(Q9*H|gEmq{P+ zGBbw&5_XFgcWs+%$i*!)w7OPt^~jD87fpV(0}nNvs_e{TakVXf)hJI_KdL)BY~J`A z`hFtwnd*BGZ-Y~H;3yoL8Dd}$D$gLrt|8xUHj8Vd!yB_GFg^THQ{sC1FN+V2C0h0&tBR_?Nz1mFHBp-=K0DXAo{jrTcvZWAcp*4J`r1NLIvj}@E_CaBIQ2|DlINYoxP}}ifL$4PB?wENg}H7=gi4l62%*VFdEd=Dl|ILyJm~ke7)YRnsPYheY0oe za%Gk`e;!%4$m9383iIuVe62z}-Hp!`8tm8Un(Gl`fq8i_;1FOyXic>1wLLCS5FmAM z@ap6P1nd5zN8qe=svK{=ZSYG;59FtA{9%`5I)GJ-ZiLc2EvxYW(QY7$G}M z<_zBpeKem!C1etqNJ{&W&F_S`bf*7M&%OM5U3@-k^+lTi{(7A}wDqJQ`!~{xblWEu zRQgEVijof1%h1z{CB+Q4*_A{<1W4-8{_6<_)$a1$`v<6Tne3Y#GS@v^hL+y{j$6-J zW|6~5ozy0TEz@{lg zx;ZA&-w2WZrc2W8!!dd?;L4Y`yDQtvF`Z5?jo;AP!4r6tJi`x7`WHBoL*MYd(SX)sSYO2~ zL*b2(g4o1MfIuwRULcs!|9~w+#u$HU1sGbOH9~STcrqdftqLU0rOZ!)2E#aaZZ}JG zf0&0-@i0IoY4QHe}6!D_QL`2!3Q6kgLIcU z_pamP@Q3x^47D;{JzTnlxA3uKhL}|>t4f5*M#liGWrb~Y}Pto2-pZpGuBQ)N+ zs6G0Ny>%k^<(K7K`Xq89*T$_Ip90eh$&?`E9~xglmtPxyKu8}ff%$Yszj?Av)W&?X zi7OqQ0wl)vQFOe!x_W$koIWn6ez3dx^wSl*boJA>Zzo?uH=4j-^Z7iv-Es;e|8Vo_ z!trRgpJAq<+jyD_6O&GLEmyma?ZGz7TqmvZh|stNgwOC1?nB@om@SBGoM3{M!QD=F zc1EDS^$!OJX*v4`^ykIvACI>8&bLmWt!Yo$Z_Bb?Lp%iHW?&r;%>hCrk-Yz>C<-{8 z4MitXreFYP8y$%YdhSTXMa3Q6tfT1ph`*F!`Y8a?s2X9<;561mM?z3fDu}6e%v_S@ zuFgxgJ~qB5&}4T@k?#pF#qEkeBY6LzOO5NIjh!Kko!TX7Yv&B@u^!sSQE)Sh5wllC z882+(NZ-iH&@-rw)4ysg#o5*KQ`K*yf=o10mCc5RPBI=#S#KjW)3lAGZ6s|YX&Xt~ zNWIxeB{RWkBM}v(O{7jtq}pZCCejclQtgsx6RDkvq~Lxwfxwf;0M|&LBze+8)?zAu zL)?IpzQtWfZD00O#bh)cAw`+;ap{Ng3B6}PqlOvyC$LZu#Db^|S|Hi?xmAZQaBjxyS$Up> zqUM2F5Douu?T4rZAY@ty^2sU0n}CHw>b7|2Othix6Z*}`9KN^2MfrrDxYBcATmH^- zej@>3m=!}H6E_sbcIM}%+RM%C#6+$}k!kHAktpbGvwZ?iz0g&%P|-~!ArUEfG3n;| z_Ih)>Xo~GC1ObjUw$Jks>BvUT2A+|4NwnEKNX?6Wjw_2+s}Q(tTB1TmcCmt}u+R2; zFS2)b#&j8Rn3)hm>nr5L-F*<1Ji^kpY`YSSrFb_ewPbSrjM$`6aA`UYsGZ!~2!S|E z_Nl@z;wFsr73wnTdNEy!gXb|>;+HXFqt}gl{|mV}Ku`GTIRkdf!tYz(4)FoR0|Y*k zg6Q#wt#4xsivr%kCehoXa=<)A{)D*0C!YN{!Me6^tOIn%gQv$XaiT*~O&!v8k&K5- z+7$MqN5^%IUEn`L=)UWtSth;`f(}BQegg1pJb-*SA%zX_2w&gueEJdk8oq=3R1o7% zj7i)ZyxKhD&Q><2rjgcTq=9xH_l)h$~rKlGa$qtwYKjOsr)MsCv-Re7Ih!rkjUKZcm>DZZ0a=q*;CS`pV?>tcsIWZ-HjDXlnw3dCGbM zgV}-e0m36dLG%p-XCn+qFyAq7JRI9;8e1A5N>d)-lVvjuot=ks3g=o05$HOi*+EkO z7(2V5t%4Hk9mes@jTn@>S9wP?SAI|X}7zeoOmP;{zSB8hGD(%cxi<>pV8%;50g$vLv)rz0jDw8_aebA-oF`zKtsP|q%Kws!{nw*eZe zW(2%}c)cvc9tmbU$gKi>IAZSc@Bd<3`OW&3<5}(r6s$qd9>cHi4EpMb2lJa9_(U}4 z2E_c(j{IRvm3r-}4HP8?O5eaIOps3j@yLrD@z8z{v~n#}pcV0kN@S6EBSr8b-bNV~ z5O1YSF}J!jQ6bjw$siTez`!J7H?Y{yW}$+set3gT0Lj~V^DurYZYD}!>C019VlLLt z^Rj%Nm+j^`8{hkHwr2;XD?Tl`FyY=z;AA12OkwB2ps#{(Emhn7PriyE9d;J}+!*wA z)f|T=y!P^8J)&b6Cx4NEN@1NJr0{{OT0E=`UjNt)nafyBtPL`*s9d^nv>@68bL zj7POsMMkD%L{?=`LEv4|~~D&p(;N$o`B~RWrN+ z!VGVEKq|A+iHAYe9;%~)`zK`d}%r5Q$+C{2B$ zh%^=ArMNWB;-s4b73uuO86*eot3IpnqcEmRXcOcl}lxEVpdpi zLtai+vtJjbtwAvuVqIhxj};lxO>_#ac5FH)w)5~zl2=w9BO4Z}&>eZq zQIYdEN?n7XBh0)Q>hPZr4i<%wf)d*Si)7B?DRgD0(jD(?1Fqcn1&``_G1FaA!gc(q?!DBi^I3 ze6)y2^5=ICNxA?@gyc~7rFWC?q=H;c@YB^+;oWHZEe}OX=Vb~gX>|vBJi4i32RhzN zL!gQco(PoU&vGQiot7={n~W>jHzB^-*m)MBUuY3@XwO+}MtOzIy@X^y`-S4@|IjEn zC@pO=;RxNx<`m7H|^R&qpek=gH;VQp5Tu!l$(Ur zQiR4F)>xIS1o%QDY$3hv0*EPfwZ*bQs#EAsNQwznRoOMy3tg3`wRgl9A z3}#1bhMcfq&7kvzyIB!k5ojPlr#lyZJ36b9cQ639(Pl6%5NK|Tai6xPDk_6-*nP|^ z0Gg8W9eA}X+659~{U=!sYdX4GjIM63@(@KFdYoCX1D_R%2!Ytd@+MJbbEH+D*ZyE6 zgFE6JpKA8=HQ4)flssw|)ZRhuKpU|IR#UXa8Dt0UfJaSO1{Uxn#g|JFe^iQ`X&cT| z5M*I%TOD)c5746Vu}tKuJdi0Ja1p1f5fl?;T4r0BB~AjdyR<-TIQp8c0W}fJ=Gl0co7}%8dZ&FO|=PGL^?|juT17w)5UCjJv^BJ=nky}oFWoz&5`Bls zGdvW_7LnhHv39676PSPTO4C%=oxK?5McHVod$iGbL|NHJUV+lSw`Dd0s%si?rG zs~_Pa$dlTne)uDv={l`t6)ah{({RSRs%y-{^x)F@Ban&Z8c^al3Sr{nU)>s5qN-BTw%XN)lxWQnYu z4mEnWKfp5Aoe~5^OTAN+;Bil#3wq2a%(Jtp>zxZFuUwYjQIFNpr7j(y!u7_VZ+9r_ zgQ^>(jkw9~1mvc?Rxj1j;f;)BUd`-^KQ8pC@2Z){4bB9iPhD2C8d`y4LSnJbOi}FX zE#!)df0zXzbjivV8k?fH%agSqG;SCAV z@mA?*(Fi?_AuY~sen==xUwV|GE1rUyC*4QmH-y62=`WN<zk`Yj3rH9CCVUWy+;R znBUAMqtW#&uL^L&Mc-A=yR%Z`+vA}D4+8Yyu@&eAfiwl!#y55Eh2mHYei3-Z z-ASA;3|}EK4CWBe0kYLi)ll?3ZsWkn^7%x^QM`y2`=LWM9H^@Xdp&wAD6h9vHgDO& zC_OqX3YhR?@Cp8T%I**3>3hKH{2Gh{+j)a8;y)hjt+P~fMzBh;I%XgySMfZIRcb!o zzNhj;T+JnSU6Nvs!subX2Ptu)@-(Q;$rqezu6CARlshVr$y^OR;d6 zQ*vG~A1CV%T$60L;6a}np7qQ*+O~CMB7nWWw7$xIS7V#C1;5JQhL1vj(G*{)j^?Dd z=A<>}`wN(7m&qWYbZtEr+by<$!UHC%pkv3!JyzEtdAPP{htj(n^H>C;5vT`Tus*Ir zb$MtD8?HX+Yb`98p$|p1;KTMdMblTXhI}152)+U9Xfd2!r7t5+aeiIx5cwPH7DO7y zDvGED7iyqVMkCY^uam1$IKyWlVlY1u5 z{*F2t(zbKr`1bjD6K*Dx>Eh<d--Lo7+1|!27CmsHDNY}S7*b4+X zz7_S7I!PM{=!r-2q(gwVB6;cv;pv1bY1!>Ltt4RjpsC@29sDURS4Akv6O){dhJ+xo znI{2tOmNJ-A3S>ldlOHu*oxzVp}5-Nj|a>p!m<>!?MgernVcVOF&SUa7B{oJ^RNkr zTf=^|viUnqYmn@?iP8H0?hXA_s}P)}4c)KC$hcJ*Ied^*x?$ zBZI>xsq9c5Y(arVE&2&1=tu7JAlwI9&O-Y@SG1H;|v5rYs0Jb&P zQOWcxr~9eBK57vb=B%|kkC;KPwQ;~K`dQ|by6KQpN?=s_EH1^-Q5Erco7KQj&FvA5 z3|HL-_$YQm9wC*F&P&qP3`UBxo`;fD#d}=Q*D%%bD%jGim1VPCedffsj|Q_lcwg#E zL$}BTdZO-Nqy;T}_u}XGZ)Vq5p1O~`fRpsQ7pyt~zpozMods{*4V9mEx?$)C=R)~m zsJvAlbca8K$;t7V`*)w;^GmMo8rW&-mLZ*cM!*wN{(T`cea zJ)UNw;0e=sLRCnKZuAYcogaOaoibJXilJCMYYy$r>TA%!`=xG10$BuS+s3-}=S@4& z4gP`)k@Dj8WHg+N(sP#-FjI+7XJzY$%C`~1Ksj2PJDh9vbV`iUr0?cOUkJYcbISpBr{u0{msYWO|cKcW0xfc=G4&MzPD-~9OY zUAD?u9Ua%&kG%%~5O@j%sQAUySJqlnKDp3`s=dBY{sMCeMdNJfVV}bh+H`jKvAZ=` zDZu|;Jt+O;dW*WOKZ>*I+ypu&|D<&K7hTd@N4YwK$H#X<|`NkA`%NAT3O$-85 zY05=VMskhS253U;%+f`D5#x@1g5&o_*ol0L8LPScoVmGoQWO_5`qHL)9kaQ@nbfR3 zmDn zXDQpWibF^7;o_dFZ0nOhAa8$`FYJ&_YdaRG*A=}D+S{P@+n{{5b<7I&)*!P(GZL$n zM($}Vtu_c0VQH40Ww^X8+6+svuW@@ckEe6DM^6jpDlF2JFH|?PE1gqK?^6m{n!WYd zj`is6OSW;0SZaf=3b|rZ%OMGYz6uwg{l+Z3{N@M0=u$dg>$}pVOiGW zE#3J8paIrb=5grM(<2OMI zydF#TJHtCzJq2F-zSwJTQeWGFc+l*DZ9O{vahK3-xXv%fzJ^Qa1ZU7!)@Gxxv|H+D zj^!MfzUJ0DSCcn|aA|Sr_2Ts%4%$9Ad~oo|x{TA+4T3+DxN(Lt3|1M%Zz`wwd&^!U znnbf?sjj|kDVH6J8W|>{H~je%y_}eJ8Iw+G2qz*PlHVV1*dZ4HaUYW@B~S3(Dybyg zP?ec$U#;=-H{MyWm{zNZl{b~M@{0)|(A*}{FJ#i2HRA-QRNCU>4C~IoIW7nErf4oksIeD z3eho%*-#Ai!0VT?B&#6(?}htSsBsoP)*E-G(i#@X2F8 zCH8?+C9Hp6|Wm39`8qPwkMpC<&Mb0FJT3CklYQZ*KUzQh6 z3$qHVy)I;hxvC;7j6dw=*3eQMWq4WMQC2=HOq{NU9c9FJo}-N75q!r8zJg1SpYxAr zZ}DrQsr=bujafVjbN5)N?iTdI681A=HsGqS*ni|s6)50-Aa@wwR|%R~=j z`Ko%B9nG#8qJ+Q0*vL61o}(*Mm^c`gJHP~r_4DC>ide}>2Ph?1e1T3+`*CQrsmJ6@ zA@PtA*jtm-AQ@NxD9~qU1SZ4uq=glX0ez&6O?eSiP*2iL>fJ_7m-rW1BFd79BznuN z`UzJw$ROEfl@SIEuJiDMPDU40ku1u3^vcHu29tM5-dHN1ASz5xLx$4h>1wCpxbBVq z6|@(;!VA8&BEoa%t&SMZd};wz$5oj!) ziWRuAOlPMbf+H^Qz_O_Op|VJ-JdP#HJ4|QSv+4DfH@7o$_QsR@hKcM_&fcUu_%<}O z>@JoQFoW@=Tb-$ku+|-Z5d@5z;DuLsj8t3-O90R{-yZhOgxk?Dqxhawq+{Lft}>OX=Y3axlB{xlS%sQTKRogen*BbdvO#Ec#$; zD~%mYj7+}(HPR^Kr0~xgc*&(h!}XaCAEbVP9Md-T!;_-@epG26dZ!xPA?3eAMPvuT zN7&oRnNi0qc3}J&JcB3Mhy9)={|&jWoP=hJl0;W@Dwk@z;V1&1yo<%G_iw#*Q8at2u*n^JxozU3O!&rPn~*IxGkxmV6d{K$M@DtBCB!h#r&M*msaYpO{Fit#n*xWeaKN^>clWR5jKW}Z{C zii&=Wr%z1J2w9YkUz=j#S5AJ$F$iDR%4X{GKk&DvIQbjrB~PqexoQL{kseabSBa@nR8>3a$ z>}+gUXa-PYqazscKC+H~py-jziu$3TPHsq#aV?fE{dzdj!--l1LJun10u?8RrR))k zdyv%ISky?R5F`2>f*Rso+zih6?X$JIxf+cY#u~r+EjS6l@v98j zkRneIaQxah*!Z96jc!P9pS}qczNtH6%UesA>Knz>u)3#eKbP-I(&tN=KDJH>_TIe0v~slrvbaUd>fAeO<_=aBA*Q6h*46 z={Fz_YXhmlC%iBp@t$oGqE>LWJ65zh22#Chp3*S2^y%&dT}=Yj(?v{ssQNsiYF~W% z*+I&bh1`S6Y*3jd_iBWdo^WTtGSAc7KCtXdj&}%J)>CM_2bUg%yRIO^Kv*uukR@J| zhLs{T3BgKEQInXG7|sKfYzH;0^w>FL+zkrF#J&`zU}N2GELhtcb*}^D41Zs+g(}5= zlo}HIMs;qWrG(o@1jtq8 zfQXi-)JieCIB*JJ{PGF&9yrH6B1}5nxl&C;Qfm!(*n`jv+jO`9$p-VVatNM+ndX4z zT)9EU+?AWLa#>fohyw!6IwV9Mr6fd#013#QYB-k9U#xNr?u}!W(nni&6MW(Cr_lGX zKUYARs+*y-tg#dTUdbOHiU}TM{b&V~Dt+$Z6NCv^)hzsZ8NX}K629i|kw z$ZgehSbt+SHOywQr;hN$N(Ah;H=jODByH#Kq3aYdi7u3X`5*u17nqTM1w%{uplcV( zo1G2RegMN-d%95Wf%`wHD{C3Itp7TF6E)u6sLqO%ADC#+QOc*Crn&F|((1}2VxWx| zi<=C~`f*Bj_2-{2@uAC~-@O?ie*^qAnvDS*{44&>HqI`E`|a0HA0)f&6U;Q|th=?L z*%yiiO3oPO^~<}ju4Xzq0&VIT2m8hMI4CcHidS*#b)4Hd_z-o@SH~FOkMU?cyM)ex z=Cb>StuZpZ*relYd2Nw>wo@OxMK?%O$_{hoUWkCi(Pn0rbHJCMkE)YLD% zA3|%;55dbChtvj&-PO)Q@5EZ)klKm}{-VyOqIp)BTOcAV!;^`8jVQ-;)6cX+O|tau zI*Y>7F!IPSPEA&J5-U`3&3~M;t&julkvyH4^1w@>m$T<2Aei;jE7xuvDZEUjG2m1GDZ z_|BwBOIf3gCC`33N2ZeN_cksuPwD=@Kg%7mrMRgZ1x zqO9`YL$9Ma4cmJ7e^gYL*_&Z)hiUt`xWg>HG!VRJwBL_;Mmvd!gvkznea40+(93>d z%W!kA!$vFL)5OX0#4Iw-!cch+k~fVBl*r7*Wm-PN0Vk}MMd&)}8gfpvqL2Oni7F0c z26{K8b55`x_8zhp*cI%%qoIEH!m_N#Te|ZHc$%pV^SJjrH?8*qXgLTWVfeqFuxD^| zKe5sMj5F~E)&(&x@r$g69UJd}Mu0sU5>8iRJ;3gH%PnXFu!(Wpn`aZmD#*D2lqGZ>Hl@rHv( zZ2p-#y3qkphgL-3%Fz`G}9XM0m$Wd^%<`WIBGsf4^hD`3$*w%kE!s ziE?-KhJN3@VZYzb`HbN+?ERfLW2St@uo?OOJ-`2+wGYj+3zNI+x9rOM8-C^e-S`>K zvV=WZYK}#&p4+x=ts7l2M@+<+IJuc6yN{Lng$nknm=n-{pY;px<5jR{)n0heiK)=X z1{IDCDv?}T$d@PW8co0^`2u7KnOC5cT1xm+f&A7Vb-BkYL-{(UR8#AeR_HS=v z8EF2x(hja@{RKnUOdOxoHE!-SP^)>1TxirIbH@uq4*83bTx=#%Bggbq+=T+9aX>-7 zPF6aD-{m{4F<@{wKwmo-Jl8rXdFrMMe$YZ$T3;{d289#8u$tNoX8{)ADJpEf6x$L86KbC$luI$&&^lIun64AU|bWee3% zAg08j26E)occ6j$iMpD}<+_S&_&eb73nt##=x)fe2wjyoFv{n`k5Sc-oe^d_-}M!( znFt8S)-XVbtN};=hvwye<1uO~Av2upYg;AUV=e!VhKlluK8#mbK^^ioF^Gf_c-RzQ zxZ&D%+RD~cCrB|DTG;UzBL6j$z-AU5QP&%uG%_s@5d)&d*PIZRrDnXQRRcb?enLtd z_8sq$R*O7~jHz7Q)AV|NJ-NA_PV?fP;sH`!jeFXth7${@@dlMgLZB(M)QV2;0^u^v zG4I;P)4bQpw{TQVwRT$mlK585wemQ!`&hY^qpbpSuIR~D049c3eaavo1@iX!nbuC0 zMY^scrJt!DaDcd#ytVap00)!zcz6N#Bz?1ue1Qyq>8|HMY!_Y$_lsoh?K!}w>+$?14`jvB*cpMWlXC(gSC#Xk z`?#yICDJ7*CcJ!VN=SSLKFe0%itxDfprtrysUXQ4fM58_ItyI}lY^bL!V!dpQjzUdt~p3_2rlxRoy;=4)lEjlVig|}&$ zAGNKDQH&onbL;ME6XS_5d6|_)U6kna3NkBs?hF(91vg(p@;rQ9TAGW{mMhI;lr<&G zBa921o%kLPy``5yZiZ{sVPxth*nB}H882!DF*H988GL}`GK+^{VYLVJ_p?YM|Dbdk zTa@Iu?y$3&m?DBAZrGtP9)1HW+R!#G`daaCTi@=`O0rE>uE(SOA{>abp#+*3eM?8W zbqoO3EwfdtS!_t9EanLq%U83}XgbQXnB%5(S1snH6_u;E-i!_$^ZvZXXA_eN0>enF5~3Q~{!`*!0Y#y0d_iAei5r6tI6NC3SDW$<#30GlP{FNY7Q)3lclKjQsLn@+6|=<;#v-Z&8`=-#pK#Q%bDpDjAON~ zLNI-;vBRVwqz*eZs{Gl&2aXh&4Cp+{od|jJpi`c*2$S4VRxhLNc#cFCL%*roHd4r! zR+StMt58g|4Hha0)TORp8tlYS6f1aF<)K39;M_P>%^?M!XO9TZJn?f6c{=~Ykrss|8yU-dm}f%aU1AjP1dSqxjpCl%^8O4(_xR!7_S znW*LyH5V;|x5wB1IYgd%!q5Q2K5 zOo=%mEw$7@G-$~T*MN30b7(cou*%4g6k~x(**Py#13kat&J|5Ou2nnGps+Q;t%5#57K zozgt)*ln+P&R6l|Oov|Ww4io!#-vv|<&;iUQFPk=07IewBj$bgFUzZ$YNF`EbTy}6 z0=DxM3xCpKeo@jF7%F5@rEQ6d27PJv@}=3irVbYhf`O6MYKdAb!y2@9s1glR+Ov!V z-32#hLI)`#$I&Svl;bk5)}w`msAxK?@I6Pva4Of|&MCYrw9#$H)i{mO}{WtybLY&|#^IR^? z!tb)YQ=lkeLID&(N^#lD`kVur3Ol_fSl63ge>=vP3T9d0cxh^h?~FU+Cb zalFxZdNmu5Zt^oC#BhIC;XIb7N%qgJSL)gGBH_4)hx}-+H5>XE7DjCtuUI{)8X-OmJue*q6POvTqXU3!1{N`#t z$*s{5$30zzGn@hI7z>f-S9qdYoD@EyIOHRiWXLk)Z1*@B&?z1`Hy!$^r(D z(v}bd>xewapz@7j)YZW2no_62)uflBTcF?+cZdqoFigg#QXaayvCot-X+R?^{)pGhN_Wy4iHe5RB@iyBcP64Yby)Q zU%1Aw&p)XL%lYSwrrAxl5;&~Pk12ig>C+VZF*~SqubM~I;P=&|yR+c6AN18uGn7w9 zeQT=rn%~vdx{G)JI(-uj7{#wB_!;E~Ykf4dcoe9YUEyd0hTpmF;r8@7ES_2;1kTVS%^L*gOWb=1O1>_iYF2zZ&hda- zdQtiry3v9pjsP(&R+TGgk!2X?58yeG7^_V(S7h{K{gK@fJd0N70240Xi#Y2nxHLGq z9JXH)Q{=*1{q@N#_F6m(r zhZDom+YW^{=jt1jqQ{z3D%4aN+{2ou=pOO1dQGC#s*W=!#wmBlE_g^Du~u``Ih*Dd zachcpOkma!0*MBDB$^CK+o5vrrUX$$o@U8Ol?0q(^*h;_Yxw8rTIds6F+wizU?=7( z^hZF^be0Y={A`GFR$I#2?>%2!&L<PIM$MS1UU~N7M+VE`~I<~)2 z9P7e=(oaSVQhaS4QFyVfMeZ9xL%M6Rq$j#UE|zpMpN!|%SL3``(nNHLT=8BaU zs%B^Blu!yPqOCBck7{z46S_O9rsIr!tb7xj@`Q8XMSf{JQD3cwemXH;aj$pH`+gN9 zW@)XWtZ57G{7)pb_>QD3{e6J`V5m$w^g zICJJv+LGbGIwH?}6p zc{#!oCRSH1r}+5Yo?HztML`vMsK97OK%wz zPPrT(<@$QO*x7VYB=NLEm3kU^``pPm$uL^F)g_dJ@dU2R)qzT((-PHggZvwuEN z&8gbEhkeGIKvLm#j>`*@CG@-#>>&A(EnIsxAC`$##g6-OZMZvq^(CsT0eBW@ z#f;K{CXbHQ*wMzL2>Jm>8;J3A6U4d7e80{f{s7tQqcc-sj1eXLPycB(?RjFN8;1HR z@Y7rB-LTYi0BUJ{FTV;|oyBr(#L-kCSzvZhB3%?r!P7mRUYL_k05%a zYN0~fd8P`(VElQIOu8JoC66DfIfxafuLbxZm1sFoAJR#dTSpf4O;Y|`ggE&v#+I#%b80$t0126Rmx8&q?k zEnj@KAG}4CQ}xg8odSGz6G7Pbjw2HK3j61ExB%oMpZQ?{Y8^ zoNt`I7Q7ikd4WjF;|3mxrw}d*d4$!@#Y$9_On=OS-6BkuO->TX7%EI*-P zr;+Xont#3-ehT!sun7`ffYoL95fUpkXZAUPgeriF0$yp#=yNkpMT?vr!Hhl`d;hg0 z`VkqrYLfhjni6G2L2Ks*g}Smgm9oa8F;l5e?9&XMA6Ir5${V?q>^;$Y(uiJ!Mj1rk zeAb>=2Z&($AR~wA2R-+hdWtmOp^eGo9yUidU5J zUIav^ESc(~)J5As2QtI`BU~^Ko%Y-`v z1B-n&R?s0k^??_*v?=iW9c<0P^XYV6EaIShK-~|PH|syI^ArkI zaekLhHv6%ZxkUf%mr$DrV%@+|IK7G5BZ2H)ZCP%7+qa(#qny1=3sut#};L12-6h97VY@f%|;{24B7 zTC;$1L~n2V6t;aT9}5gA52+41J;=_^ddGr&$3NS3326rhNAe62?1jRzt1w-2dZvj< zqC(*PG2K+w+Sb-Ihva}ygc?E<_>kC| zOK>`@bjh(XWD71MTB`tv0cf$eX#WfM(Lf6NMVARvfu4iEIi$k#Em*jXE@CeR!^7ar z(y&%v+B)(fG~;@_(IDOs8j+$|8k21{yV%-RZdGMb@CV5O!#zuj(LH%BR!tU#1cfbV zG1dX1?jy>gzy%}eu}HvzZ%_x(3e-ILkT$xDD$I%)gXCliJR~Puv$eenDr=*EtA+35|p9}*4)U8bV7X$?8$zg)R^}U+ktaZGMTgJL$mYec z<^(&Gq8undI>gTl$?z#vq(nJfg=tlux_9O#U&BJH>FFnfyCE(xR#SyUIda zx%|7@AHvD}yUKuIHva@T7?Q zniBsnMyZ&RGbEV!zm^RDLc>%|ihp6-qO2HbEe(fQXZFTZ)_^o;JoQ=r8$$SLM@A~l z4iSuKO7{QQO?l{F&3Tt3jcs86Vg&&F_xlO}MH=tY9&mLf0LJslcy=?+Eq<1;rMhY& z<(B{mjxm%=ejl`RrbPg1?TEe%K;>cA1rBw!-zS~RAKcLn>TEvW$}0gxkCFAI08Y2^ z?Un)%gFC$m-T@Q5F9y&T187B=_r(CZ4IUbIQcWvJDsXhPfpu_o5FmKe@whi*9;vJc zq`gui)SmWAouIW5&s1ht%uw9;^9@nd1{ih)my9Rez(6Mj9$VK< z@6&JaHai>mKeKi}^aALcuY4d^al2tY* z#B9Fix&e<^gnQxC`=6{MXcl}KC-95cw~?7u_iF0UQ9;R-R*#v04SHX1)LcmaFlgra za4fEu>rS5}IYvd3DS^T@G}WvP{_yrW?&)MMrD+8T55l8mTaP@8UMlDbZp%ZS(rFJe z>1-VEgt|cx?!X&fTH1o*8C&QY(#h=yxjm`TXf$6e<~O;?3gUq1jBrkJA{0S6nUmr9 zLYx{`P)E^C?&_)$+u*mG2R6~KGE_6~B&x|Bn;z2?$29d-qroAB)v<=r3o>s-kWS*R zJkTkfLLrOF#&Axu6Y^k=pLdr+4e)J57uwdgj=(BQ&ld}kR=rAZvBx*WlGFV)qT z$W7eBV&%5jV{1Hu7=MbzIjsQ&*n8b%M;)yVZxUXkm;9`U8M|t2V=U1zkaH!?Mldk} zW#zh(;#lmAAXe(E3YR_fHkt*;WMkc)7=S{7Kj#R**o1W2T-RMjZKCV7-?wfKt%;6F z57vr;=rciA3IIFZ)zkE@o)+us3W`ZYS^6!ys4)#9 z<2>NF(?;Hfu$K_5EVtejRX((+%ni4wdhp5Lc>4!ws&o z#5MF4)ViycWv?l38CAs6?NIIMHnFTwf5`a>CpR#O=Cjc_&rcXfyIlpb$=LOXFUzmc zskyNULw&lZOzxKA9C_&{Y{)O*Ib>NGaX$|r+H55xFOJG zd{1aT9`k5A$337PZ>s{vU}rs2k{IkvAIx_K3Z=nLBGq9t+nWr=Qvf5Pc$6l5SJ+9z zqj~JGcRI;V0;uNk5<;+|jC^AVHd{S55$73Gb`%eB(}UPffY>4sG*u6@?7+WDi_5Gg z+QOd_2g^x%_2HsC#w;B~8l$OM^oT4M$BwG9vEc)Xtr?Vym?e|rZ?14{sjWsW2(T$x zl5;kiPHwJq(>NvoV^?wDQUi6A3|2rjys~UF@PDy^294(J2w>0xzRUs{y$R38yhE8s zQk;?r1nBeTIg5RD9pkGjY+*i>LDC5*u{<8Ow@+Cs!f~vXPQLU2wongoL?E(Pq_(DI^Q@KxCfC;Lh{ScLR9dQQIRV$tZtkT{yAW)zlA(5?eYVmN z0rrkGvL_F*zG@WKC%;LUelkwQ^qir~*LfL4Qn;g$C0y7jgQ=foc1u??T8N>R=VG|Bn{xE*QQik4|$GtzeVZB zKX}b<|M8;JtJW!2Vw#qX{Vz0>ZLu#Zo=lk+alf+c*;Ct7 zTb5cu$z71z*S`ubw=6;RTqIGBUivoYUQg}0QY*Z!dvVlBag=8cp2sZg*G%8ZXAO_? zsQo6yP}&x3zfyW}^c*_*8xcqJnfOt)=OwCoH&Rb+Pi=3vwJU{k_Abw3?)Au{@8oCZ zSo+otxvVJWeh&8X=~;DhFP}OvBJ~6UoyP<`uT_3t)b=u|mq{(iq-O)1&TF-w7qz`? z>Sa@NvI!sR#ZgafPwn}6yOWXXnRL{WKq@;KN1s5dPaxGm0;!YPV8q%yvE?G4xhcyz zS|kTlENrh}6V*_Y>QpJwOf^)+Bdz6Ih;Q{5$oG|U?xaYrt~d;9J5^T&H3lE`wY&3k zbkVOEB?8I0N>>#0sQBNS$jZf-6iLUm(Z5p42Y8-k+#(%5RNjGXd*YQUoSh2rWT!r8 zn8YY}LA1JDl{)_vXEmmQZ$1NjTnEnT)Pa=^LD6!mEK|&b_CYhZvBoRtU%#qq^fSD; z>O{OaRFjggf|8$)pyL9;2S4QHUg>I`oQ7t^9_LXWG^87wnM3WVp_A(BF z=H!4|v6g?=R&KkMG*2)lS3h%fH6Kr|7SpS|yz21;>|ydcl~-NgZZ#*Cl8T0RuRbZ* zZ{E;ir-LQ~k@UEO>C42FzVT8e^U8jPwsCRvZ7Nny>CNC5&s4Is?6pP(0}>GT-w%gyGvmQ?ji`K+j7K* zE;eYho`5{ti>+bk{zjg4am0b#~gO$>`1UAM>o@(NuC{_adm_T>ru|nw@o@vxI4j35oBD-s*>K<+1 zi1vMIUN!iTWcDN_?ZKrOtTOU9L=ElSEj2|$?MbBuEz@{HZyx!%oy)bYl9;1UItXK^ zafgXQFkA-O{@^~9G@t5m^Kqx%s9Xe$xQwdFS?NJv#!X&4PmtulD}eIUa*#xolbiYC z`erf9LzQv(*;!Nxw20s`wl9G*b)y>w+%lh-FW#Yxy151=&+9noW(PfTpuW&uD8lPj zGc_9v9AhD{@U9DT$~=#G_XN+ZeA#S$~=Yz|JI-WtuqlzZLO_s2cPF1RZ0TrV~EQPY@KNZ+tlBj!Kb-=)fn zJ|cb8IZiZDQmu!|J;g`FV55%U^o)_9N8Lprib=jyw2Xkv1_xc1E<<)fg zu<0mGDa!eDCr{Hmd0MQKqtTFmWR{G4uf&2Xn*ki5Va$UWs=^;v@NvQm@DWeqr$s_G zI0)AQ8;&wF{kL2>dzml#Wv74$6XFX)goPrr?31P`|MBmjWah(pP`GTVFAd$Ik312j ztQj4B6gYqE?_T`+=>s3~$iwW&;$Ah6s=@E8M|Wqz8=rQn4Z!JcZD{s|qPdD{4EZD4 zT6gi0zfRxqE3WQh&AWGBUCnfKRPLY1X}Qzj#Sf~vJt7Q#2~@n|Z#)4q1JODfjroP6 z4HIzZx`*4#%g4vZ;p22@+1ty{KVRZQmp{LIGx+Kl1N<=_jc1oHUjHjJ_iwxx6I~GC zA|Ga`>opZWRSga@MJvCZI0;sb&riDap@8rJoK=>&+o;sRjYM;&!6l%3V_W;cz+t6K z!Lr9H@^qOm06(-h;sxixyn^E@8KD?;NaG&3w&pg<9h)K^Bf}oJ%aTD)M(HNp<-jf( zzXeSgWsf_Se7`&kWqo%dg1JddRLRC~CZHf$XQ)p=YZfj_f20^Ts$iE`o|PUS)ryZQ zLM{b2D|`4-)TPr7PB|e>YQ-uU(t+?w4_A7)(!-T%;7TR?j3;!wm);{2tRx>O230E9 zhLmNa2P(ZIr-wtL;cw3a4P}U{nz2xd_(3Ejo-U(DLOl}dk{C3N=?2 z4ocoGhJq^H>M_u_gn=?dRjmjpMf6ZAwtnZT2S7alst5p8lIAWGJp}oy zvoKKV6UAUq1-bI18R?NwkA!+8^erKwY=KoP7)lpFgokc=Jk;Z%9uHN5hvxN0Hz#sS zC!tVD6ePkxNfgurpdJ7{oeak9anZMmi=KI+{vHkWXsFw0sM1r7^NQn|2cVWMSmF9A z^?YM+TORgQ8nhgtv+?tRp>D`KDd?rfR8ciK$36Us3FmEXr5dZFp}HE+d=*l1l;X;d zE>N&?5#|?Abk|XMJtl0|go$JOxv}sfCL~y+YAjxiALzrquKE*+v zTrGrd?xjTh#=6DZ1J%&C(G+;3VT)xspp_MsNcguxA0gzmgG8Xgs&3vAlsw$S#Dok*vQdK1rpn6N%@m30^>JKmNQ_I?4!Qo{ctl&sb zcPevgg6rlu4qa>qujek3KEAElj2aR{)8|bs4l~Qeqd#nKF>T+#J{puaBm7$)NR|mH zk5N+GH#Qy*r&6A=Pk;HNq-X3;0Quf)wyo-xVO=Qy-+%i*{@4HYzbpUi|M|a_m+yc1 z)BUHrzuqZ-I-0L8l(#T_ls~DfFOFsA`OZFptS0&N7i|SkD1T(9j~(SDQ20t2565xO z*;K@HHYLv)G%+5d?`%36kFU^o23IOR^Y-IGGv8XPBjGE*K#p@f94wrFVkxT(T{E%C zG>yj{OaSH38J^d#$BW_YN*rC+s@_j_ZJ*et3Hvc`6pC7lM!iWFjc}$#iNK-;CHPIb z2#qW;xPy;qHuRJQ9h4=q$rZI`rkWkVP*$F;35+F)fFmd)*q@FjWKSY|snNlyc!FT$>f z0Hh~*y&-zHaj7Rjat{_85_ke*QB>?D+pJRRu_eZY-lCH-uk_{u9~z~)n;}6{b0W@TSwzV3XCq=x@m+_^a~O%6^dcG*^SECECiIGHjFgwIt(x#Plzy+M zq{diz3GM%W)LtQUR2Ar*71n9mdd>4vP4FIE8vSRCj~I_e|G6zed%EL#QQL|uT4-$0 zzodrdthn%9TgPS0&0VGRWzCcLO;3>L?_)&P!oSLT#YbTdE@a;xhu{7;wpfdFCi?e3 zTmN!2*S5C)iLLh9x;E`&T+dyJPvs^RUFm%Sz7`(!HP|r`HAk1^m0Za^gBU%{sW`^2 zh=QXhyMW?Pk=(16W>Ng9vFM!_h2>l6t-G&WsC|`}WF>drzBVJizRGN;S+@QUJkMk( z2g{)&WnJ4_`^vV}=JRfBt7Y|WFJ2oGuUP|7+%sa?u*hL**XSPcKHp^wRSl(gAL0U#jw}&PSy3vf zPZX2(C3h)AY43#mrr7?3+Y zyrn$qlz!=!l2O3RpiKHE2`nr^h1GoCMNXXnR8!$GCj+bbKJ?F{K#PwQy#~W8c#UB}{y! z*-fJI=8d0^g}~w3N*suUNHH!T5Wn`a3u_*2<6ssqs zw4|qET>Q!B{7dSJ0(l1$hg}LBTu)h5?ZV6HsMMw+8}OxN<7p+#z+?C*Gkj4NYzk3z z8f?aBY6NpeSk8ln-cEMP2`0T~TsC4N=feeSo3SH#EP!S>arG z!HWoA*+k(PixqB7^Q&RlL=6s=cj{_Ke`97gO@GkvBgV#)=YB+F&`M{Jm7`(SF*nh9 zyjOT1(1Oqdo*D3oT6W@$6@*>)CVvvvtv!J68tcJUi-^iM)_$+MuBLs2pV7=k{G-u# zK{Kg}Z9V#DZ*4q;cHEnM%ye^Q9M|Y1G@m$Xwzc1ny3JBcu65^N06z0N3tm59GIDc^ zM>+rw?KRb8DDeWOqi$%S`G9CUIPx3LDhlgaMKEP(4!vx8r{e;`2&(&Zv$+eHG&17| zPax!HZ#tCu@Aso>cyQUZ&Cmn}ZRU5RtUaY`D&bsnSnkj_i=%rG0s2mWfAbj(#iw$mKQp|$aNw78y* zXE%AC#5k<$Dq2g)>dVG2l+kyog@&@z&cbA}-Uu_Yj0hv6Ds}Ja>DsH^B5F5d$G+mR z=@aZ0SJ9=S(CC_Ku6CBq#+RMVMrECTM_z50h%?Kku5JaM!Mw=E;9>XVusAb3t@k(S%#Br*XjRtS0BqK(k?M&)Xrh6j3ArID zDq2~T~?HyBC&aJ>JrtKY%&SR2ygu zpQ~{S*+E{Bfr29yUs6ttBZBwLSY&^P=ow$X;1?6j!Y$9_4O$p*-*DzT!#faE1z!8U z*lTZ!z4kWsHJ+W(wjLedgb&?@>-=);YqU*~-61fr)@Gxxv|E~^ye@*FC&_&UCv~g{psl7Mh!sX z*y8FJQP&p{ooqYLRm75=GK{sfzOpzZntn%{?xX`Y-SG<56IeTwC3erWlgEUu9c<0P z0(boUVbBW}chH>hk0L%#6#42k_*? zm?QS_FhCwnlsDh!1DN<$aC z&Jg=AJO%@gy9vIE*EhlVr{|%lep(>4rKd(WaRpOTY5ItZUtc>p`qm7T1wE;=ux|W2 z;lg04DgdM*^rESR(wV{v=-siXNPgbPhA)tFg*V>%e%9tsn(j)7w&!d{M6Na+wRCzP zst;Fc_%w#t$P_t?5jXSX59=oUN%BpkO5_4Zk7MrPA}2~xwt3nPp(>Y@hD{wE)&-b% zK>!uMARj(eCN)i*mS%#dJXS^GP$|}r;!gQnK6pMlpglKKss-C=H)`iJOLEz2W?-F8 zujiwyyc5B3Q>d$FOjHA8e>{)it>Ua~3l9MM?#PX8?G?*}DS)OEIyJ%Mpfg1+phu&>b!eAWW7Cykpt=RyXmyEk5Eq*l=<=u63Z- zZB2yFxLMl_4m>SmdKB0e3e1)L(wHYMUgVKia;eL=kt((e9SV-G*p>m@xLn$o$fyt2 z8b21Ca#; z-HQKGVE$^1&(_i@$Z;iU_0DF~tJ(NE*XoU%$6d90*VdyMHB%yk=o>BgTxX1{WVY3G zqLb+^yOoYKooafpGh`nRA~YWlowrDHB|(pviXx_rE&hs3RuK^{ZS9rMSejVR@=Zk7 zRuQ8$F237FYE>l2@P^&i4w~vFVH&$GkI~8}$4F4tEI{Loi=eY06^5(tDHUPVcx6pt z&a1Q&h!L46Hzo0pdlSYO`ZQkeo<|O*kfG=%fj-a_##5UX^~o;o6-4tU^~nJ#YEzq* z`BB@dO{CmNeyYQEb`@DSyn$oJi%tQCNf{o#D=*2*=i4ZF~PO+4PxdRDG z4PZ1MZ6E=B@WXOhELTTNZ~;E$@*7TXrnBjIo*PGE*mXjq{&ze? z=Z!SEVsNbgNj+H3Kl8ITsE`mdtL8SInfDBmA!c&UC%Vsb_iavrso$fD=23;fu=HsX zi{pq2L(kwr?ck&V2)Hbd94ZS#^XY0DG9cR`7T{WEMwqgE@{VJnT*dtI)&ppEKi?s9 z;ZgiIG~TB1b&9!OO12>-v&W;a7Fkp}PO6OSz>u&LMwWk5T2hKoDJ&_&G&U_SgDxm$ zVPVK!_YJH(F6DMPC)34zHkmEvd8ZfShS>SpS2Vm4Bjfp7R!N?z>XA<9;2dqNyxHG_ zhc>`N-l+5zR&fkbJ|YTa`dSaiLHQTtu|nDCr!Xx|;DdlwK}(7Xc3EsnRda-=$c}g( z+0vVJX))Z)R^&CvG-fgG^z}M^puPziFTijOWk%qcW~+=uKL~Q?dN^6YKP`l7Sf=sR z=?U7l;4L5E5USA?`YA7T%Z4*FSD`D+W}d+H3UtLpPn&jDg_XI+)2sPtF`Z8GDsv@F zu&!EGsZ0JgHhc;gPCR?1|GYouezLdnlBNRDoCQo?Pe#M5$#tqo=7e9q_Gd+BqBoOA zKocY5^Qao}*qas!&oEx2_4=q>D$jib3tc@LVBTsjX0Pe0+1f_kwDSWrO=|S=K`(0% z;)A7X;C2gL;Z+O#ZL7=&+7rQ>Fj!vhc@D{q^oEn%a5Br6?j!p;pxD( zLp919#jl;EhqwH~DA*INC{)Q6REvsr*!hG;wQTa6tUPIFe8I9K)BA&qgP8IWH$((^ zf;`j`T#<((K;b7<*Pqi*A!>FZOq_|G06?_F&(s-C|4EUyWYNp0! zv03hvkaPW9UoEDyo6&TXx2YaSZD$0=qDvwQ!-Q5x_Yqbqi{;pB12*MO?pkmX$$&;t zQv8c-zg+zIP0bi7cNlt5R2URZ%Lm#K5z#X3p-a-RNQ9z%Sk!1?_AtA7z(`e0?UAQm zW_ySz46y}%9u;~bniO7$1orL#+i|L%&(ZD;e~Eegr&p(8ir)sMph-)83ENC=nEDv+3d z8;k9P)5mH9u92@0Xq`;b&9NkCrOZi`q29IlT9a7!et*yRPd)?%7^if||e^4&UPwZoyrM%e#qh5?7??`G> zOnKkqe5J#wfG^DP>o~_fTMkQE6YfOjqs~NCg$A3HptsQFr2DCLTFcBY+ED6*lbFBR z5YF)1Yf0^|LGjp|*ny z@+FxN}+&-U-rO6Ds@d*^mz&`cf|co9== zDn+U>s06)=eUDzD_qy%47v8ZDZwAExlAo|9d@wyRg~B~|Jb1N~YG;%Wkm@RHOJlW% zZOuV^MG=(j``YhEEazm^+}+;jN6=)@eMi&Pjr7Ts21$8iK|{nv$+Gvt-C9A!)Cve% zl0|2&bPAgy%%v)9@0JtQIUdIYvpXAceH8TV(890kW4)(@>NdU95fldL(k2>2L z3j)RHG^gGmQu6j%ifw_4VkTbY`v6OgwhJ3K0E88C5BSRi{#pj6f=$5>^=7h4e2ItJ zWH_ta2LI(xQN=M<0{JtbCk^|{o|sC~)hy;u`hoKRKZ8LrFy8A_@qr3~A&+G=xPkDU zW$XVyHVn|LJcVL9BIQ`r@v!}~*);Nv5yLS*M-AcleAV4FeSi(WN6fMv6zoWvsvE3 zr+5riS3{#x4nDCVj2?JOAI$EbaEkCE$wwPUnFJtg`3Y8~ze3S<64~&i zfhYS}4W6RKpi-?`1$t_$n^C)YbP#LUqE8Ge*tq;bL(@&EE3+l5%9SK6EzrW(v#Z&BoR&1=?r;F@tA9Vcuyz(Rb{nlC?N#p#i8R}Q%;~$kztDUx2r7?~O zIk8qE#MB$sn`CtWtiE(KZ=x^trJ-8{IG%`D)~b$Z0Ktj<-HV?;{*jMqf>-W8{djr*?v00U?X7C+|DgQ;4%{?h?wcx0Evoz&x=B#!lM8ZQwb$M? z3_FRw0#b10+Lo)WcBa093vaCbUUwYK$I8Cw>aKz7)#IFvt@4)D62?|PsOI*lZZ+lQ z+fQ#lyix`OxSotg zUcr;24M2Y9x`*4#OG|ZhX8&Q)imeQrU5axmk0$1@cMWRGitbV_lCEM zsC&nLk1FHEd^R6|iSVy5EdR!5Mq&_Ozfv5=a&X!X3w~kpHUyX;`PRH|FtfYm07A4@ zj606pHdxgpnu1qIw&CT3V7ps;sbud!QEb$e3%Vk>sHoo6)1ZQn6;C^>GDL z?n%Kdoz#>{8Q!Pq_n8XtCH6I0haGZ zgFgPzbS=Z$%BL(Bp)5;;e&4JJ-FsZ`J+3Xzb-&UwR@!tlzPg#+%;pI{@3UQLMK(?R zkH3Leez^bPo$?tJtV8PWy$&|RM|ezm_tn)*hk|BbeuTmKNOM7d&|b-}I{9ss2#xiw zx=;W#Sxnp^;CQhs)<&UDa{W%)U?*X7iWYPd0*c52_7znCKHnIWRX!^FsMNRQ^RZ!SId4uy>!|M-kBva7(3`rF;tW$-3}o zV#;Qm|72S$ZG8lTItFsaX&~qE@o}hY?uHl6CGCpNnmeEG{$IUa5FPxv!FH0grLU&wX!b6QKZ)rem{I^0F!ua>AoF0!J) z$o@haK{T5Ku4h=}w5&P9+V4jcI&ozNf6-$TZ|5)E0=t483~2qk7nWr`-qM{vfPiOC z3Q#bd$iXRRCM^G!)Uz4iKroy7yC zg>3lPK#=^b1^XOVB)57@KgL)%OHKMBO@H?D{6zp@QYO^%kO%`XCJ%<{YUd;xl1oNP zKDf_GKCmPxxX%_H$X;MPKNZgFP&?CiVL>loq{u|8~?nmAgEr z^;$x)ug-g^zM=Zfy-M#@dJ{6?n^fk{N<#E%{M%9E`d;0hTB&t(1kodiM#PZ_g6QQ^b>QV$38x;sd^_NUAJsaiwORs0Y|eX`zGs8g zqlg|wG$a?kNl(NxlM=l;|8~?lJ}}s;*vaR#VoRv>{dq6eKN{9jH5BB=U$8^vlZH7L zShg3|TB#Iveri3IPI61%eDQj`7~YK23vI`bEI%U|k%S91tl!W&jH}S|ScI0lKikFR zYW+#KZ&&+0YRhv{ePzMw?!5Ki=aXxd65ssG=N~=fC(~lqS-~RIHm4ZPZ z>I#bpyez82qa>WY77xGsDpcME6@=)bLTN0S(ri{uN;9vzOL|H(%r%T9<%{Gr^WV)$ zYL@a`3VuD2Pb}Ghd|I=VHl*{KrL@sZVzaakIG@aBjZputhSX+hvi#Il0Q!oi~CEK7`CSgW~`q3DRcTBIJao+5Y z$Nf)$M}PYb%X*IHzm2gT)&oB*H@F-4OnT?iMQWoyb^hM zwF0|LU+RYLKK=0sR*_dlG;&7?ZWYMWEz>I}^L&f;NmiQgw}~|0p{W#IS@FpwKfNZ^ zPp@dg^F@&gc|l*m{J(tt8BNy^VH2ee=NMZdWwJLKED{A zAX{FsK<)~|C4&KoPUN@Ww15xl@d8Q5~-ye_5C($3Sc>6EUmfJls%XY=!UZ@o@IrW{4XG* z6m=V-5GN}7w6XTe(dLpss1COrxfdYqRy&*+z86zj^VD6|^6%P;jTGNX@Rr94>uq6q z7+$iJif%FljZNvUKjWw{K^W=`l~4FVYBc1bRk$z)#uY~c&Ru<_>^0ToI|WD=O7gN2 zH7vpF5UkjK-EtMb;fdAsT7M~GwLrI#|N7`pO;0a63f3W`9^B~%2Nsk2h$T+A`U}>Y z%6!ba?W@U)P-Ra`s@Ul%NgK#HRt6)Xhhtt^oKI{escwXqVT(dLIX+qCk*=?2v&mvQ zuhq;GN9^Gzv!9j6_tV<({iGzmC+Lipn~IKmntQbISOCEbka7aSr(*a_6rY0Q+d=$y zthc8NuIbp=i2)rpmanM{GZDgYZiaHOqiU&ngT>?BoT_2})q2U^k7K!FS{rv8Eky`tY1 zX66hTrF;me3N>_+sUbXdya9DNorRu<(@NU8oWK=rJ z@SWX^N7swV&9q+M*|#86i&WbUR3;M%4D(qA?tvd*LU>*>TrC`)5z>Uo2C#8|pkE#~ zPApP-E{@N9lu}IcPtb!`p4JMa4mMmKp=yPFPbJD3dmSnAQrlDHOqHwGO}>)#%q*BH z78Cv4e)m-^iau0L!1@sdu8M|VAk^UsT1TuSeI2IhWd1Yt;%Ffo0E5l;x~cDv`=Rm! z%5xwAj9UFc<8UcKBUMdQ6)=6nW9kheewV$-#}ngafDSM$bqb)U#AFNkjMRj>1XGc* z4i=-TJUBz|H@O*8tPMteNSAv-aG*K?i~RAIdtNm<-Xr85;jwq2ea>Qz#g71@ww?~g z);;n_DI#&+9N@)eA9U?8K5=N+F;)r2nxlcRZ-5XE-xnzbLe|gt{qyNnVGSsHe@T z?!f+$yk|Nu=p(w{l(V-)!5-eqB^~8EvNy`k8zSeThzC042jh_oBq=kTU@}sd?y7Z4 zJobebudj#Wp_sE0B$=$tu9XA!1(MlU!;C{|2_A+D%|{Th77N`?uPTkBkGmfi3B^ex z%qCDqgns}tLNkfp3g!ZvfF?VrpqeX0O|H5H^6o;w>>>+^`DhW840MyJJ9`did@Qij zO*YR9L6XnjZWN<5%o2V!@QmB<-FX=&m2fzG`JTu3P8`Stu}eswcm^h!CQ+yu(jpHj*g1Vb@jgo?v??+Yke z0a~&Z?X)9`mQ8eh?@2b(G6$8bQpGVSG{ZY)gy)u6gr7rx#n^IU0qG9RakgE`7nN?O zN(>SdHaon*+hpvJYZz@_vqo?bvg4u#8F%>u$Z)alxs^1<5PZi?38N<1o>*_JaceQr+@zsmfPG^0z!}SjUZz z7yQ}|I))uab8as$0p&R?Qhb1s;&dpD;dlO@K?G`CK8%N>%OBsq|1Cn(ZvjmMd}6qB z_eRQkxJR#?sS(pi41WaS2gtR^6#WakhEImy`hah}Zh(3|i0W$;#3<}g5aSk-t?lrT z=0hmqo40RAzO%!?wFYZEed}msSlM2Lw;F`uJz|q+V>KeeeaN@A5Fl9gnmI`~N5gnZ zgc7n47#U!9JzmUbHG5lHjp>ewn^K$d@8Fg1^|fxZ1SP7Wy!>8&tG`k{5l#o|`y&jm z4dDN+zQrBjNF5^X_C-VL8TN6(#UYG0NAw1_;I zNC<$8XXgT7KBr&|e5NkYJhHXlk8r`?8HQi*(7)(xi+h??~%De{X7sMRH?5H;=e!lw|WKV%rWxycvCj4e!(TW4*Vq0{dLZcs{ z_wb!Pau_&bPi9XD`S;nWecs3b8;Rx{VEzycc;dUuk1$w3Fuhl7TNo!n2G#sS1b0cV zuk{CgeN++Jq953w_U!W)tRuZ2UYa=Xx96k@|Duzd-X$-BnEhr4Y^Zhx=MIDYILh$& zR^vomVDvd36y~r^S)6RI)N(>Mks^!ls?sS1Y)oN537OCOxW{jd-3YfyW@EhK91L-q zm}_eCbwr|QxK9&E5dZTD%ATpur9 zPewyP5vTWM0+cJU*>-v{#^TOHQy=CEp5Ax@k+jFq5$4{bfK?ikFIo@>?}!nDz4{k? z{>5v<9=MSs)5=Rj+qh^N+xm9r;zTAxd1<*IM_=WJh^2kRHWDA9#<5-eTKpqS4~Dxc zx+580DoS)P(&lzlAV=84wGtuamEZl`U5w@kn@~|46j0DlXMyP)mF+aAqn}L^tN?n} z+D12-71(2&O0bPT>=Z5zIwa6qY{q*V1@TeyCic+6E1VbsG>Dp;-sJK2qVTC5#e62e&u5Rnw^pW??l(zd z@cc+*Hsk4DKO!}X|1TtalO}+b-Vf+WQ|;o|JB^B{paqGlVlKF-bI!s51Ma%ygG(ro z%omt1!O|k#9ORQru|zr0XIT{SJO>QZmYFm`_Bnco?f8*Z!~klLBF@45ag)*HP8kk| z3jO(xp%2_7(N}tCIspAB+W0G@clZkZ_5Kyxg7w&ubyIx)c`_=XLV!W#?f>|HZCDvd z@SU?iI+#52$yK*ez2ZrDc;QzHs#)`?jf&`aP(DD<9TAMgwMafP%I_Tyag42!;K&O!KfG^(@wVh+u)$9`acVu5=c{7hU4vZ+?plobi8V%llhg z$DtjNGg{06)m5+PXSh&~lzjV)d=|*=d&tlz1Hyra9tu)x?TZ_^48~ti~D>#iv zitwc~QOtDadsK3ZJ?RJ?ZisvDw|2tTC+>kr@b#rAL*WMOMjZyOP)c8d# z{ZuvZ(PA3lgSym=eD^axK7R2U|D%j=Gl&jp5dLYtHokj-Bc05_;ioClR63XC@?!_q zqZ1_hz-+>#X`dqdr+1&;+~0enhBbGlBfe(>e=b7DV1vC>5R@O_yXN2?=HJSD7x#l5 z<<3@@`YL({OZi-1`^{coFJ1*1Qa~_!WNV;$F#d;Uh)`Xxf#_DQN=fZCw#%lQ8-rJ? z*@Ys%{jDh80*|Bfk8;2@&DdPjIOB*3J_e4<4>VI9EX{R!a#EO3bY^GoQ9M{{xTxvC zFnjER=b{TpM?Whe81DBjG^G&%gm=y_Lc8!m+^)YXfE#gjc9x(18nB^el8lX<^7bY! z;j|zJo3GUr=g9%tRh_O5ay&6*9n>zO)R{90Rh=>xxcn;@D-$kOCgNg+mF9~UW?LO? zgnux3_g)@yn#!y!*Z4x2Tqsjm$?W$9zkYwA+|$4Jp<9&6ivHFw6rKLnd37)CE8B&| zX@x-y1jkl8ZLhLe2EK5D>A*AkvP_HJ+!*w8(ymok^+Plm827Ub;=z^xW3y_9D5mh0 zh?u)z$*jJrC?GJ)6VGoz}KP{t=TIKdHDb zLwVfUVN}OuHl|=Nc~8N&SzX4Aexl6eq{%RfI~M8B)3@B7{Ae_98L28l@`m=H83S%{ z>Y7t)9`NkX!jQ~|;|zHrHX=zsORYn)<1R81$dp{})CW*9;zKW9!+O|8s|;7s#cSUF zfHe=@d6S)KUFKNg^lE%PpI(1EXL(DdUU?6%gey}1;*h6pqkQ_|{)4=&Un2F&``^s^3ZZT_p@?$dL!hmwt4ZIwI2~6l<*T~-BLGwjc%D5%gSV@ z_8X&)u4_Rj5FIQ$5YZ$3^un%!KpT{?4mLr8S31}8qqv?1t9bNa% z+qlRamr6kMo{naJ!Yod(6!~P37TY2;WQy(191ee{!Ymd>l$37}x0Py7YKR}9yoQru z&W@^=4jIKg^Lw6_t`UY%7QnacI{ERw0qo3%S3|KZjZ6-*^GZ%kE7I;6MbU%iT_0I# zBRqOf6^U4OvYqw+w|8~BjU(ClK2O2;B1nLyTBInEauNg6-Q!6EJKKYq#%>ltFrZ1c zOjsthq|`rqm3P=T+$Tw$Q^kME5@nuKwp&;2mMDHzbxu{C|MNwikdI%BR;!xgPKCpA z*vrKQO1{tnLoM{|xP_J{y6SA-6b~?l74OR83WJ;IZ&8+(ckbgCpm|qIidPcE=epQY zj;B?8u40Y4HajDreK`K2_K3wcP~g=m97(dcBC?0BpQ zo4v5JRjV)}Kxg~O)u}Cl@qT+`M8L&Wejl$dZ=zM4jLrKs!*q#(h7ZTF9_Ig=c?Qe= zmT?iMq>I5HP<-WH^|=e%3p@OE*Fp}J1eWZRj(?cd0QRg5(TFQRl^3RGb1={J$$!Bp?WAQ`ak)ERxLG1SS= zR?!v%d}P(!F%Jwpn_FiDhM6eM7E@QD(^962ht^f=hMg9#b(JJ8zbwpWmq#lPwqv`~ zx#v0^T^us{{4%p1_I5Q^ zzP>h>dAdtF+jcZBUm-|zAyE|d_Q-C{`*4pKKhQ9CaE)rWOJled_nBftMIp&Tm7z-y zLSqz@Jv+ua`Ggh?9@n&J(yN1uc8rbu=`0%9r1h+sw6?>NIn$Gu>_puef+lYK;O+|) zQ-B(wVsxrlYZm!AR=W`s2zLP_AfrSH_R4YP)U;3;`h?V~%slweLs^5$zY*8au~&`~ zQSb$Y5w}S1%+XB+F`#(!7X?LONUF?L-|Pi+00*A4b+aKmK+8Nis7E^)Ro z^ei#6G~JE?yl)JZ0#i*?ivA;`_6?vS)pfiEc^F3%?lLtNJ6Dk^__>rM)lO}bW$ZE5 z{*>SqWsukYELg2RxO{h0dj#UJ-(Vpmp3#*--U>g1yzE>J@b##i^SbABJaHpD=2iIn zK0V|Z8~@C;7mnq62gLM_GvGV1_W%Ad4Q2}=4$XdF&K-AZ*>m^e_0`Xy;QprUVnZzV zd*1gHEb$*Z=EwL@VTosDVQpl0G`y!uNRg~?iaoL(JdBGbmk=K-64kO-vSP$-jQyO$ zsAUHQYqrFWz$Jn?YiKI)Yri?h67+1$enn`@Y2~5f1VtXf^-Z}H*HdK!35sG&*-nsR zU3qE!@UxHh?2^hk*7t@QrPy8wtm}8tx4JcZ%#?hT;9{t!gYik2QC4FM6&v2%i`!-hQ}^%jZIeaS#dr5@XC1e%6N-zw|5ic zNBr3ML7gp`JhwXxSwx%|Z|V=`F$D7XNhD4f$R`1;AIf*Wtv~80Zq94BQ8^?W%$xFu z?^=U_XA?2^&Zzo~w}-?^UnpJ$S78(Ae>P1+s$&MIW2QNh4yfdY5~D$v$D$ms@RfH8 zt;Pp4lovpoNXCeBJ$l;HhHhEuoK8-+40~5Zo>27wx3mzFh!$thIyLxFZD^l<2t5lU zF9l4$P{UwZh>_IWM=$!#(^&MI=fCJI0Q=7w=JP~JgircF37!UT2Wk|xU!B>U?X8WM z(vhIGFWRDq4#|T<;Ch~tMyTUp=s6j}^Q}kz*6LMF^XVW5z=5IcvH#n1+x0BVbIvjT zo%s4k^@F>{p49JaVYH{X3yvPh{y_hy(i;1Rq&KMe#W)%2o`kBHE|~nP{?vZQS(P3YWJ3IKgomggQx=ptfx zPcnmeYPE`>R35gRFC9(AftS}T%W6*)5zu0JMyAHOvcS2rz`3$OA>hsyQ_q?^Hf<8? z6RIp=J*uwYPvR$UW#0Qmg(HY?GTv zoa)%$6LVIeg?+li%A6`CuY4$rN@?%3#*obhC7Cew?+aaf=0DFc3edOZg@xsCLj!<3Tf%aKmX=4&Ox8Xv_~dj~K632Jot>oJZc z0FtjS-mYGLaW$XJCkJ9(wg%*!busOTXmN>krr0@8AAt&OCS4b6BCKnMAlM@MiVM=QxLIxQ&zMPx3Q(vi_?- zz^|@8VBG*jQFHT;G(?iH1!_{N2>TU$0C%FjG|oWxHEC4GlzaAfbu9l z10}|I5BZvMv;VqVkHcN?Vt6mU7T*dN^K8Zg+$7;S2Wkx-k z_hQK*(+iYG5#Z0a0>k(X48X?Qs{ix|gupkOdF#y=SBr^t$Q4MkA*?Bbzy&Cy(c_ma z6=D(An*>ek#}9un{tN0h!Utm!=r9y+p?=HynP87GT{WD7r&=?Qc7kC)smmZuvk(fh z0s&WXnov5x_CN|bUyq=_v^fNQf%2#m;Ao28M_d0AYtyEgsq#!o9h$v>f||~uqL(y+ zr^_OEx{nh)kEUkP6Chr%apT~1NlDFKK-D5ck0!C`tLim6LCa1U!~~V@|4(VU#k9jL z-_i#g)X|WXmX34Q^_DEAttBTRZzDhCBV-*-5>k(Q=tU6{zYVi=V}|J$Qpu-@1pYl| zVl6aK(DN(?3JMfP3a%jyoSb@VnQV@f)8TY_7L*%9`+2m}exM4pj#g2(D(ComkHkS` zM~8Uqak%y?-g$mgfYYKMi)UCb_ZDEG2-`Xic#qUJHH-z88dzWp#mFuLXoxH(hW|5z zXiXb#zYp}{YB{mAL}+_1LrNR5MS*k*@On;;%+p;KNUkt5h@hkA#||X0<3bBNE?68l z3ogfvTwk@%)AjB?VK`nIaPnlabjX$7j3dy`{{4T1q@gO&zYC7qu@{6lwHzlO~{p zqpTvtl(ETKbqLyrh%JL=I!;>4<0x|lD2x%UX0!CLX`Bd#3F3QyZEn_n zFuu93%cC7g#h?e2vJ)7TF1w>MtLBV;-Ju46SuU98oG`+5Im!SqXg((%+6lISD#}8IC(}yy0is%B&-GM;X1P}9-!ATHf zmS%LqRtpFvD0g-s++v8ZT!!PXd6T@_h_ZLEhD~K#9K9p~Wemm~Qi-VD4>{On84^HH zA`k;6SgA@UF)M#8Kgj_VT5j zgLu0Z?-sA)x%4>Cb)04VeoC@HwHM@~!xDVk%ujOQE4rJtiGx?FHPw?o$r2Rru(;!} zA|?vhW}JMEvYhfx>jT5%#Im%=MmCF1X|w2MYHgFi|4is_tE0#*Xltp@<5js z1VZfAJ~90iilm&YBkjp!DV*(%Q#kufxd!Dpip6<0U9q_DmvS6ARRZNqxzXEcGN`Gv zGBWKH;Pq@=x61r5mOh|pV+QFiq08Xg2PjqTnU-Xc8ArPyfx<@6Tj-`8nVVFMi@;{m zI!;<>>R8bcw9Im>ux`!!_&y@Bqqk^S;z;T(bzBNdhox(f!zYO4w|=%sqMX|NP~sr< zY%O&kUY-F0zoVucV3ZNM>Z2^Z6JPuJtsP|#gs zp_6nH4xe#B)7~ls&vIjpn1Is&Am3HBnc$YvqQzM(;+DlHZn3c?e)W4Z_O4l68~Ag1 zFrsF7OyPG|FPyeaJd3S?b_%uX_4GT8B^aZQBe#+kpPV~q>Gd{eNlwI7{hJvlVf2-l zb_zvO?od=UP4F>?HwRESDEBG7yzzs(RhI6OkR~#|H1G9bNz0z6rGEfR5Y3V&h(;{! zT@-E1FY)%)OvHnfL~J6-;NGbgqma#FoV8huvtnT(Kle6@SGS{+uR251fXm>EOe4wLUc1a7KOZN4;}&&8~kTEO%es=+g!aJG%4B(W3|`v-ppiY!zxSZA_P8 zOR1s|Ah2x+lKwmODGDG}bV5(s8B2`3$62z9*l<-x>C_X6f;0(L!I;HCm&_X6QpgaZFf<^kG;jbj@_A1IrnGkT$hFnQ{jBer=3-tfX0c&qI%Wv>XBCuc98o zYzT(BVR&~7mLw>OeBpl4Qe>N9zv$sP*`AESN#8v{`lHSn}BsJMMWKLvgRB) zY=ANb6;CXdCGF0^+NTVsu7OB$x>_uh3zn3`1&^d9mo!a6;$)N-kfPs+5uWmkdw;_b zIJZF~q?Q5}-t#Z0MLP%TQk=AdXEFR1Uc%AG9zS~U zupFX~%Ov`IUR_ehS63KiER?K9ypC2;A}gxT54V&WqJh-kPbrqS=3z~=G;{G-%wLrj zKYMu$i4}?SAWEW=9Y-x9P`sTs{=YVd>12LrLlH$UP+ogSt#}pUVAq$L>o`>f9N@|d z{0-gh*nyInV|ogdkrrAQM0MBUp?V1ng!mjsU*4pIiJmnOc|d6qeU?jI!3y2Yz2py7 z5H$D_hm_TIONa*~C3k*E$~a3(S|p`G{40j?UGQ&PuoB!mVvUZoVD%jdR>arq*Zn-} zo|S2vLU9Ff%hl++YhxvhQ@nf+;1y7TD{vzm7vD zChlSaH#>)J(q|ae_7cJhA7ZGFGpmX_WVl0LLJXqZ11cGk`utEZ^7OE^*sSLqrLqLd znRW!Zl?>I>0fmot5flK7)@#!b!;G{Bem|b1=ArVD&sJ%CHDuh-qEMg`%N%ta9Q$ma z3NU!^aTctJSG|N$L+_6tA3X9jNupqzX7qzEkcy@6mtaqrz&1!yadY-ba4E%jgHLaEc`#het5yXnVW6ze)U<{)BA86;tVV zI}e}AmcA2=YOV{z?su6E9(B6@wqlTJ6pkAEIQtde$+Bk)AT|1N_$3pP2KmSVM2&i! z4Vy))-P+GgF1~5uskw}qxTlKV`AL#)$!&@qFfk!#kBl=hDD-4|v1G_D0Tf0(`74xp z${9@D6_V18M=aG@xrIWr!lActw-Kd%dyo3?5)9lPr|ncGRGTnQ6Mm9JA-QL<3n{tv zPzQDK%d zM{C8e%juX2K>bMceA}IynA)L;Mn7>eho?>&^(cw!)z2 z*T#GndMbD?S!${+d1|WFudixxsrj{yrXON=iU>(?n`Xr2*xN{wf^#h$ zARU(d=^ulk? z#s$q^OBx}IXu4z)P2szBoNvvT@|v%qNIslt2uidZj^@CY!_#0_t=`&)n!+GRiIJuo zbCc%O5ws5jOZqOfw2yS?O&-L_45Tx__p|Y4zV$NWy27;q>{-!Xv91+mv^zqxx8HrXa6}Q2f{EKK&ephPnvzS4O$?xdCBt zxYzPinCatfWQ5TsivnLvxq7ehFa9RY|NTf_Qvq+AEDfSOH&r%mo!{i^jDLkrv#x8z ziSgmxwP8){$-f!5es0`EQDS6ro-`qG&UD7$p8^y%zIay=?&tSE|7d&^3zZvVpD7;~ zg1}*Xbmu>KUVR_^b$94+fsZ>Ui}>p!I5urZa47s?*mJ`)evMXfz6I$|&KDS?Jk@Gg zM>qbf4VAv*pFN#&)ZG^-WY-I_!uHGx-v=uUJd1+059Iix_);uf5E*Y#6gUp}7pGYM zT^?mJgvwk++q$9YUG&M{t+yq>#nmoLE^(ppiTrXKKsk~mOoJUvr`|<$sGo7q{ot{{v7<2MBr# zK}E!%2moETeE?8P0|XQR2nYxO%xHsA0000000000000003;+NCY+-qCb#yIbVPj}z zP1$=?RaG9q@dF}UL_{8<5*W0-WmsI@nzf6&y9EjEF2UVBxI4iK?k>UI-CcsaySuvt z_uvptku9Bf_vzjJ{n%U=EM`%)YUw@4Gv;8HAR!f0(6^6_gx_GWs`~~MfCp{i7Fbeq z;f?6gwBx@q7+Bn1vm$+KQDLP_ZDXnMi1&+eDHvYtiWh;ViXDC_^xABF2)f5<~Tjepm+-3J1~mGfiqCd-;FF}PXHN12x|$R7*+*JPTkKE4Gkjz-vo5- z`+Xr4tQzJNXt0Y_4<|nvY=)nA30&4!v#URd*B?$EsI&_+8`1?%Mc99T%kh%;0p|tA z!wS8&yEYqc&W~*h@#PdPWb4x6~Qwk_mtw-OR!CQANrDw{F1QKgq$IF>n6Q>vqp!q)gdOQ@6kX@8h21K0V`Fm5;K5_sskF@MQ01f0yN6? z!+DFy_HM>x02by8*?`oQSPwOralm5ibEzJ#MW+%9pZ&14IR}{R=fhY%{{*s*gg!tZiKhG}D@Q+|5KAk>z)xb(V5PA^WhD!~8+ANkg6!tg8L1NIH>K=xq)0>-b z*EUIGKUN9|3F7^6Y(YF=&p}mfM3BURmi17VV2``eZ84j|jamI&331Wvm=Pq>I zhmoG!KOOW1%k6UF`!K`@&Wgq%+Jx-@MC~0&o(wV5MI{fl0UZ2N-#!VB&-C@G<|+cS ze2;~R4fcL$)iJ$~_TtA`{3(R&E*dZ)4h=+eHk6W|+Z2;*>vcO}r27}t?B+~A`$Tdj zAPdMnAHix|JP6EgT0LeRMhIzeGd=Jj$ki?{TZ}cJPM}8U@_T5`SPlVpVs%05%Iugm z0~lo=&MBA{U$fjETxm#&EwgCE&~Dz#BjK}9*BzfEUu(Owy_+`+yLONi`e?9B2v^^h z2X+VqwU-3}CE!AzqAp2!usa`(OVUFyl{hqfLNpSeD1jT24=PD|%o(+?3tIF7ADTb= zqlXZ}wu$>*Zvo5g;PjApE89ka2noUMQh|dAqA?3_szFM2^G-o&@RJ`RPMe5IvxT>_ zFzeTRL@@G8>PpMT@BnY|+1-WFMFPk0)slxm@Qd5xY(h*ILf;jjQG;9XsmMl|^T(J1 z#s_Mo3?+;Ps^JHAfyDzk5Ew+`p|z?ohQ@ZfuC!I(cr7Iv9jl^m*E&TT2=_J9Z{dpV zg?Krf5`8e;Vo=_OH1Q+VgQozV-{SZJ>Fo2l$v~@#F0uF$SZ)%o=P?@(4=BsuVvE-{ zU9?kxMGb1f$3Pxl)`x8hUV0Y&*WXSKoRUB97IMxvAku6c79X}t)as0!O9*CuoCj(O zuvUJaCJ;9tZ4y?0Crrk1Ah+4Tz z>VydS{#w=OZIG!x*gt^=`D|%?)Cp1de9yLkIN&*b9P4^u1N_jU(JN+?=s9|Sq9bp> z;&iiTV>b0OEHY{=3U`aWu;2-EAkYAx@Ix1a$YjH>K_Hr$EJ;6FXODI;qsQp+KHx6F zIr(|}+HY|lf?9tM=l zcoT#d@I-Arop-n0#AWhwI7~T2l`qd0mNE-$=;PrFz5dCk&=^9jG2j$J#CSiLDX0|z zMBB`=WT2hyEP)LzPiuU%C1$e-=unj@aOsdWAS7T6pM((3pYVRYN>6m##M$5;h~@8B zB6v9vz5kiSinM?B@bwt^8YtcYB?v!>8iQP!8tIZ4dSHOFUtTu&3x^!}#JNN-mh>>L zoSg&Ey^#o1GHfEb1v+&cq|(MBh$&=!IPi(etSKPJo@;W>T{Z&K=tlulYF%h~oRf`O}`Gmld~*-zLXT6!f&It=7# zgM#+D4k?d}vhdz>%`a8VDkKbvwz9^1)R3_Z0VS&-&)%`KIWSn4RZ(wvw_xLE=f{r~ z{sVkSI!#AxXGq!OHlqjL-%u-Q7{$fTVcLA5k^A1dTtcHLQ4s4G zDpb!Rt&ranJoxK=c5XBi%3&BEAD=%g$H>lw&ez}F7g6uNHH&v+T#ol=*{x-B6KBHB z@y~o+>7>Ql{vx0asG z$!oVKqvJpATsP?}lV;DfJD0S6{kly;l%)6eME2qIbUS&hd3$*2C|eypU~f^k#$1dW zzdR<-`L*lWnR=F)I!2$w&R%Qg{n*dNP0{|gy>}zllrsKYyS-l~mj&9iJaJ%pA2&{~ zT7>Do`?Lo2dTVLd@aV9qn<0CCaZr0C#E(gUv3P)JW&3MijBgW8KV8Q|3eFoax#z2c zJqmr{XurulMla+_UZ?v_*!t`y`4kN%d+qAk@iu7re7_Or*}?1Oft@4cdZmgkCSUX+ zZkkiO_Nl?A&54O3-Hu*o(eLN%Y2808w06BZjja>QTF*SLd0O61FAn0&I^EN5`#)3Y zAT0S(0&BN#*LrcUdJYT{xjDJ>gfEX96+P@$)o#bVwfveq|18JWs_%JQ^k$WmM({TC z>(-_>tYupy>dm&;#h;#9r@ac4If6Z)W{0-i^|r&@q54;tG3$_KslDv>am`LdV1cu? z+H)dCB_;JnPtSZqxeF|;YAfK`G+NqAb1l`juxV*GH?&3%%-yX>BoOtbW}eT!ru7P zjUg5?@b!7#p6P)EqUWor355P$fP@B;5|+S>@++b@?8TN=v#QdR`x=^^X)dKMU^W!q z2Feh_a}V>rIn0gSZi)-x+rU{@ieV6)1!1 zF)$l|D%0#FE|~E33JJcGDQrMDOL(wX_xJ~*R^y&9Y`;R4GG!!6Qy$m_#kSV<4-znk z6L^@z1zeIEoG6#hE}qHjyurqdVD`+UwwGdRm(cP{%9>oX=Ec(ZkE-8~{eu@FqpA>j ztFEvvKhFVWnFg)?1WsPsShs>|LTnW8 ztQhG}u0(m>M-XA05rIBJ6cs>KpnGNd1cmDM_-0^F6l!U_S0JiUH?fgEqmgefRZjK5 z`wCoEC}?mf&=M2n3mjY5T4=Y9j*oFY_9GQ>9oS}kofE84^cA3@m z%o_FQ4u|@=p_ZbZbSYHz^tu7sFmDxN6GJt1uuNK)Mt=sooPI?dES{Pu)H^auTWkTDEf8TFB4s32) zCYmiHiZ03=$?pjNY+rT_%gefvz8{BKw%%MTh$w$J@Iyd*!55SV&`z|2qs|#QR1M=J zG2SL`r#Zn&?DyA@0Zd?DQao> zgspA(=_SpYvC}gHBxHGHPZeN0CU@>3wM_2uoY4-`9(TW+u`Y%K=jqk+l$!%BUIed68U-ZzQa z-y;U(5pa!7_*C6~^s2yQ);tk`*^?>;OzSFUi#&mBXc8?)H50LXvjy48(Z$md*R`3( z!yG_}eh_&KtsYr%d9PG;Np9qfld>FYFLWP3GpHigRNx-iS>&Fu{ApQSLIqlRqz)#t z^ds-*{xKBg0K{DJ;Q+u}n_jsx{7B5ZG<_uAr|||{{*({uzmk{Ly|M;_(t>T8Twj9H zCM|o%ckk1=Jtl`u8xHoa0JFV!RO~aaI$d2_VMc8_U8S6HyNpZ-2_`7YUp|B2cQkJ^ zuex5^GM!(!Y??xBf@Z=&a%>``|0aq7l1T&hu)}H8 z(1dWQY}Hj|E@V=+0;FpP@zV0isG$_zHJtkpFM{h47P=9~d5<|bJbWt}nzNFYgE}kbW0$>6W`@x@ zz(M?+xHOyr2LxulyYw58VzR+2k*xzxoKBex44$9+x0JZl1WQ)B#QI0&@OU&oI_2C7 zXzq*VHGEHNiwYVW zSdj+{;_&y`^X=*9QY#3@{abm446E`_Z@1?sL>}C$?K{!Kl%Zyt#O6bC6>%I52pQ=p zkJF+Tj#fBDEitiE$bz=YAI{{dNhsFma(apmi^NIVxEK84)6{TRTVxw)iNK~u;3IM@ zluN!_2OVtL*|nk^(g|B{Xf5;0KZuoJLuEBD|=OSn_V^}uT5QnV$UzWhj)~H2p~nkik7K* zXHNID*(KlmMKQo*YvQ~&bLgliI9nqy!H>z!9>#CS1x{Xe%;I8c#rs9rzIzPTLK#W- zacjzz^IX0ao4JFgqRfpe8R3(w5Y>vy_bbOw!xxL!itk0U z!c61iCg_yjkDT6{FA6yPTx5!z4N3TtAy(PCdX}zz2-WNaItja8kNa8Xj5c^(u0o7R zqwTB0vZaHY_3cJ>mSQH4*LVjXe$@JPo$o+-|9+sfl+u`%c(+lu*5;LV*c_z;7Gn7k zq+e%{fsg_zWdW(7#Sp(D?cPsfUCAcunDefqPoCrtkIZ7ZPRHA$UoIIAV-WU;l6GwL zRtkFcs^K7eH=-*TWC+^2Yxr`%^65Oq2RTT;PBVOiJUI95^dw{qV_Bq>zKCYEQ&tVq zf^E)8Ee{|`kh4oUpfpu7^a_13n1X*$y;eqts5zU7svQO*^%51G@1*J+3 zn5l~>2sGPzG+f19{bjq2_>n&RrDGTVS?94V&b8#L9)dyT_eHC_F-7^=?1fKA1PYKd6F^e?Mk-d@>j_yom#JvXvLE^f}BI?Wt#mKnbU=U&V;weZ3STN}ztU$?>8#Mp|Y zDiA+tp+mSQq${3OP}->vRn{gcI9Oo)l!o_bfN_`Iib}&_tM=!14I-JHqbm!G(1>+a zYztGDS;{#AojgNO!hxq8$EMs*rTbi+LczrI-7iO3;xVXFvxKj-z`$&v2HjnNc9Lsr z`wM-71FczR9gHE~;?vYz!|ibtWUqi{7mAW0j!_xwPq93Kyrga6Qg zAbq{&;73dt0mgC{h_6;K&Ubw+sh?^?87<5)a!T1vnis8VEk-kj`b>K3A>=Df5JQ%H z;>aKStzY?*nwlEo%n=vr4>_MPeYNxlIoKu9krt1v%`|)}vh2Z&;99Q4&CR%W#gOab-%8&~vaK?Ve+b?a~qpsWn!k z<7YW6NCQl1XblK)GJooL1X)*CewPFqOFKfd;_l10lyt~)3eSH*wvue=MK6Zp6g3Vc zS7tLU$mB=K4>8Y!BYjSmE$fpB7mY?N=0d_nk}2y&C{MO+t!pt+Zx(DWl+4kdz5~(6 z4WNx*7vcE0P!#wAJyYtEMJV?bVP16wT@$9+LswGTwYxEvDVZRBp+{@oCjWZ#CD_Fo zqH`NQ(&E(RWii$SF4#@9(KbjRJDDf8Ob{a!!_=swAO!+d>^oS=E^!A9w6RBP}i`qo?P74K%;F~*)Tlnp5p zU$@L-jB(|wjZIqKCX?8DRx5pn(aIv`X5_3lfHaU$7Zfp9!eBr^ZV3O*U_b+qN6x_9 z*wBHHk>1e8+QHb`;hjPH}a%64M3@N#C7Zpn46%(CO z5GzIyg9YdDQWSJa4!>jw9H&98fM+H1z-chn-+WZ8o^#k#PV2ym1l-*DUbxW`Sz zU@}eU#?<$UF;R z_ZAS&b1<_uwSV8;_LNPV6$Yfi&3o1Cw#IES)dZ+wNp)6|r9#0~(>S~>)+>>Q&wAdk zrvdU1M8*bm#?C)e2(S764C+h4S}0$vI^AnkUgd1Y zOf8(3+KnE$aBT3|+x3%#aX3uF6 zN~v?Zjr6qK_9!DxmI5`=EhbM=cUr9w{WQAiOP82Jr>nhbls3^+jB4vO5(|q=u87|C zws$^J1X~z(*`@nkxRRR=E0h=c(ns1P=p*Yo%@^E)K0WCNzZ%O?aOz!Nl#yzu=isMb z{EJ&3R+6*==a1pH*j*#dQG0}~!r{uc%nZqGi8=jAY8h)#aBMmGK#P*lcg+;>dUFo* zys?I{a}fj7+do}_$CJU4UX@scA~ULr2_-9E%QBXdRi4Egw}G&niJ?*0XZ5D`JQc5F z0rQ~B4vz)PMJEJIez`is5|xr;r_WoK@k4Km6F^0(lzO{~l3 zq~m#%rt^bktF>QC1H=!d|(IedlT5DI$LuB3RZk>CL~aCVtJQ-{-w zk+|3aMOYXQ{Wp7)BX`r@pm!zSGH%|$@AqPmVts}Lz}9re{&)8x;~)1T1HF)qwTYRj zqn*BknT@qQ6TQBnp|PbgplM@AZ|G=e_jfFT{ze<%l|UfxKLB6e|Mf$vXj;S{eyEKW)NO zFc?(q68b6U^oRq2p$IKn&ClQ~APSfves4%f(X#^jZ-76My({en904VOi~K(y1q{G5 z{((FO`hQ`beeOH+E~;!@Y!sdiHAK(m+%oJ%-Pz|GCXrRf(QBkpO4~bsp&*?=D7KhrvM_8 z0~0Sv{1&t_5fHa_u7PZdfFcmsD-P5XQ|V7s?T}X6x)P#4oKP>fY_X^ziOt#2u2CVY zYFY$f-pSL`O5{bMl(vz53kOC*`GyG54n{sZ$wXhZQ?08t`DVqyz;MP?U4;%#u##6* zEiefIxsqVE;p~#uLZu^Zpu+}5d4odj_1$ahfqF&fK7S#W#?gmI{8FxXiL%AhC3V98|)NcQ4nHI&9a2F3#3U26}!!X0Wf+XBP06oQMqgD;e`NteMi$;REd-oOyo6U|r zs&W+@pw40Yxnv|V977{DNI6_CAKYndl9Y&;`YE5;M`Vunay+@X9V`S9g4b8^2_#R# zvE%U&`fMhBiV!*N&*9&iIdOW*V-Z6YSif2o(d?pUn;|M>k9opdz??|8GJ?2~rN^cq z>Jm~zXHD;{GKD8*TI+}!lK|D?I53TeibIJi9~v4c34<_{>brwPz%1vWmBnyVg;Le-mJSWbW2sGwpy|d z8oxf<<3??jvAsd0t-%*Z2Q*{5OAykHJT?zLbo_&Qj7^AVs%P<8IbJ^vo%Tw2EM0eHwULx9IPX1s;@oh7HH~yq8tYc{h)1>xw(7r|f3*<@ z)x(l6oMrL3jIK;ID!HO6`IdXX9ZKWqr^gdw(zDOP?ek@^SAO3rHkVot1x1xz50#Xm z2mP`M6^;EQlxaYiM`*$MPz;zl-d+XvaJD!@IWJ%4Y&KXnx;IpVd1;bJsN+ix8NY5txU#OP|px)Nxh|`Zr;OD7Lvi8n* z=)IBt9Fhb;&*k4jkLl05@jpVnzufPC!Cr-8w`?y1T>A~Wf^3>nsw|Y5kd@PJpKKSl zv37%K-Cev*fwm8m09LQQzPVf%8kl%TlPQ&RmKmy*iaZbw>5p4FGez~LdZh_AEUv9 zD37IjJ0F9nI3=z|tqRxKKt0p_57zD%8@=vh?!4J?p|yYBj2F%Et*`OH0JUEmr4qNU zxf^SOR$J7>q|eDghvE2{)d^fk!XfWxj{_6WEBG5ly%1^C4*wp$WQ@zq+}7Ls#tpx-sbD87=$*)n0sM2inN)i-rl|8Ca|qY^@KD`bo?lkmr*mRven8 zkQKEmTtnUFuU2X^aLlAppLrbt@zAzi7TFV7_@*e-5z`L`UmcvU=bKNxTDp$npSEPC zqCmEeh5Z!WzLg&xX}MjUM502U6U8XGrGpXj?7L%u$Q8O?h`C#+y%-Hscpq`t7YI%| zVutk}$p9ZR6AL1<;9bs0fP>V#MvLFkx16>2vW|quKf^apten|3cmrjO&$jdOS>&(Ex_+s#_1M?}T@^#g7M1PQK9;KzCN*4x4q<{eni7}6R zeccb;8CAk+sc%QeyE9KJ`E*6qFLkFWaC48c6dpRM9@wtj&otb4>&XG`Yjb%_!W941 z5i$pJIo4$K0^{khg;8q^9x)T)+L0`DoP6rk=KzIG4C0-Rkf6GzXN;IUH@JB0UP6 z{bPx^GhkUK&#IoLW|h5Lw+Odx>#8WDYak=P^a`4XS1AHen1D}IGjdS()e(?-PhhTr zGUwJMN&(N<=yp0|lOF~e3lJ3%jtIEo8^c6RU=^7vp7Zgu4q=@j4(yGSdEpN?u1nLe znOU^K&z(Of1k+Z;mBQp&jPLzQ{noVc)Me_P^g>&~l-wN3d!S_x5SKv?uy~*&GO5-? zV>8MzH0#a%=rPXT^usgMP>H=?Xgmda;e=~(g6M40&^`nAMn9NJARGcj?rX#}WM2t8IB2Np|xXURj;bSSCh@dvr%y#jKV@<_((2 znbUN~Ty5D>>|6!t0%v4IbUbWm~W>WkRe<^ZxpQ841+zKdW{7pt5cCquIOEmKh; z>3H%Mv7k<5hEJB+y69+h(({*1O6J;l$QbNce(#q=y?jW`mxf=rmu0-=_F5LZ&0_uV zb$5HsJf*>Fc@WFRZm-cd3GkvH-dsB5|{43BT%@`)YtThY7!@y5J6Bx)Smx5MQDzPlhI$xbtXJF{6 zFo4V2eWTG_SIzJiGjMDP2IJ*cCuT2y9j-MWdo=eA2Rv;>OurLX{14(b{CDCKh`Cb( zh}%u!ZNPTYf=$E!BSaD!tuIy$Q0)=l)z$wt*nW@!kb@;yS zUdURV?FCPjTH= z5X)|keasH`ICnHhzpjlMoOaeNyj=Y(IB1?|-ZWpDl~DT%dgzdNetRTAyzVq26c^Zg zgTeO=OrZtl7rF0ZxNLJtA8qhHT%a8%_OJ6=HzATWV%3uG;?nG4tLF*`nkprUQ)U_7 zv|rE?da~vE;;$W?VO7?wNb2=b!ysQ@GwJl&taPExLw6Cp;tq=02(=cThQ7mOGA8<- zOe6R0*9fWzf(npBZjDtNa0_YlS5wC* z4pn9?Tai^;pzfN&&*e{h##=zb;Brq!pJGOi56ANGE9dY~3A5>~)^Ibqsi7i-dn)Sh}h6`mZ_QlXPohk)-tW^BiE8=KIyN0^0dwNee3Zx&!;(SDF zuWb0fN2q)73(c*0fSKY=m4?h1`5Lh{F?hv4WqY5>Z_wkU(25V&oyWF#l+!O^r`L`! z@Zd~k>??oTH~rEAvvyWUg{Y}Pu8c0cm^%ClkNma$)<@2n?h#kRn86<1bGZ3OBJDZr z5dsH9d>YHTKypFZNA(u_FzSyNzjR^?RFP;Prp2H9g0SCfdF>50%0dtbqN{NT%RDeQ z4#@8-(AVrIu}n|GSwvx)Mhac_`*l>nXAv4@c%;j7cldx>p5!03{63(T*JX8p%=}v| ze?IDO%pkZ>ln$unzuts?YWV>BO-*BuJ1}Ryzy_~z1`2Tq7tU0HVJD#G*oIvQ4)#SQ z?UA~*^~O6S?N(0lfd2j76&U(v?fn0STc-awZkhh9?8iUz0C0=6{)oOHQ-NdfF<|cF z>U#1a*w~QF`oPEU)T^W+@^4&=9xTXE&>_Bb2hLd+6ElXRr9;E5b~>89L?Jdl6mcsN zY+MNRlZcDJ-;$%YG`(^*&3|H0P~s2s;bQ-&l5*S+&yb8;4L)E zZ1OWy!I=5Uw(AAf?k{W9i179kHTi?=_3qIGF>;QHl*VivO0?~uzMr*k-3XmX z0OB44&fNb|<1+mVab@g(Yus1#@QV;=BCB0sCW*gm-1In?ZvsIhQO`~a`gyYK>kqLM8E5N3DEsl;m7z8Ie5IN62uLtR|=rY z2@;Be;GxjWi2}?{YtEQ0d=!a-K?$Il&mF-;mqw|LJS&>rJLIsUkD9Y7ROoJ%Tv?No z2T2DMWas_2xAm=V?;1DiXb+%q-EafH;YOz*an<_Gm(I7~dOK5DkT(i`w%3rrLwT$i zz(Mj(R{-}7kuiQeW=gKvVK-iB$8~iPQw5wiqIx?q z3Vw9ioEk}?MbYZHA_CVta9duU_J#9`(I9v}lEoLbx*PPbiz(u=eRrALBsc^SZM{p# zF63CbOluQP;N7m75sEav4F3+Nm4rY3-uK2}b>Ma+f#K+G z$f3|))A|QCxUvFMHu^Fq10QX8vJ@wgKCm*XF{bZSA0gD{tJQr~0xbb0W`I>HiJm(L6DD$7@sEfzc?P@4py-A zcry8Sv%mzU%d7l4Gx6Dm?wmLIHFAFbs=H(I8aMa!TP>v}PDuUl#QoDr{g3F|KZi~J zB5(VZ$0KJMkUB0thbx9id9Tq3t^_W*@AhT-+>ERiR^%-qL<)tL5=M%rZxJ<}b6t^e zd{6sP)w*uC#gyX0oq2&9W$Kqk8?|j;tVjla_p-d^FHf@<8^U_W>*d1Ler-J@(p9qI zvrMIUYE>tzLmYqbNaGFoAn}NolM`wOiw32gy9_ZumOZ5}4dN1AtnE>~*JYC5Spu(53geu$#>L0QB`o1-81|A4(yVUZPz(ld&g{|_Xom!BwgUb72w|;F=Lxqo=Phw$Fc(R_t^mAsyQ1e) z^M(J-jUQjDNZrYPd2y7oYNyUGP2!!mxo_q;>!Ja7+8HoJtn(%wED(e4GRmJ|wi2)@ z`rr`z8@O<4>*b@@$ANK=aGT>f3p5i|V4=ge`irEG*_XUT<(vB$*b}vZi5ulJzlRM- zOgmrZc*I5Xr+!tV9QNIYstd4to1^F7JX1S5z#A{C9Z>}^#v3Fl4n~>g2Kt-X48lke z8HLlz5`7EWg940~NRCe!&<7@ynWf~oV!WEY-?G8^YX}7qK<>u^a^nAU2lQtR^{8)iQw%lVqQ|EOx>yi@JV2EkozP#m19;%|Z(CB=EkNIFOoY-vIO4 z1#ik8a#J~}F=O>`s?N=I;Mgo!Dx#?lvs1d0 zf?JwE2OWy?d!5>vAFq4|3K5;#{3h>4bu;|@hmrhw8>h3+um_qSdIbSSwJ=ZfNX@Ew zgJy;~z+=&_WWroOuj?>c1&q%b+Ir3X9-rIqa_@28oh6-hb*a<)E?D`hFo6mBaSI`3 z?5Bu%i}nngWJq_wC8_apq7>Pn6-m5)`)Stk+lO@@XG>kXeU&o40KPp&b7^SQ2xz8q z|DuTftpNuF2_r)zT9z$`uMo0`)PuA6OTom9{BKKf_QC{EwNJ1+u*K3?5<8z4(TEKy z?}8Z0_7V(~WYSkDM_nMktV~kKzq=~_;}XpPrP*w5ug_Mv_giI5Zy>Ep@Ff7Jn*0t$Y_IO^!pLK@iLfvJ7pst~ z)tdctK&UzSQa=MY)d?1ycc49S9=M>I zncOTFX7$|z@!g-h4Grh_He!Oh7_y~<&7kx%-<|3^s^M?B2LPwK-d~S7;s?N~9uufL z(J%hVCNYi803T8YTOERiwTt7T1sxjZD1wceI}trj`=rnXv+rOI+~ z?Lk#4@hMQFv~YJvVgHCNIgc;r_W+#>Dc=1103Ey?K45@u zVG)*n25ORl=4ycXzP`ru+O=!q*>>g)@?8;Dx<&-c0Mww{zqP9W>{b3FGXBqALVI^eW;BXhLnw+_QqM;;f~6zEO&OHsP2 z`4sIs#DV4TqG3qW6^wJeQ_9`evqhtUB!=jOo>*jap#iBrHzMJ1#*o>*$2jqWo0K7F zGg95J(E_R?xs)J7Bdy{%sXQgV^=SFtoeU(?sK7r*2|J?GnZJw00w+)h^K_;{zI=um|YdT#x8 zs*aa$YbOCVvdsT^tnObm_@Ax^s088_Pzq8iC3CbBh(zVP2CujkxAWokB*jGyMa*eP zpoY*~v3XmccZ1J3iMU|Z@%=qkH}QL{&VD3O`{b*e^WAvMx##hgfq=H{kHa8d23InE z$$DXyIVZC82d71tPxjGJRCuBuNRbX7;Cx6|(|hM-!NRI6xkq$b79>ZyzMtK?d3JPg zh;`Iys;a6wIk2lAf7G1XFDZ7pC4xb|Cu}EjBJ-~ndt3Y}WRBHDCo zM=)5ku2bfWQRT$-h5bb*)>%FuI@J_j?~bu6&fVMzKx8b8J|JCO8Tc)(4L6D|rLu?E zyC0@GQnXqAXNV7%5fd|7$Wg5Rd0zZs6tu2lqE)kz*;+D#Wg8D9mW6NiMd# zuAZ`Mn9+kg1qif4IiHyZK4CFbn*Pl7EuW|P6dMseM&L6RI>~R$+;^Vk*kf56I|uW-~j=JOjsS7PW zSDvi=S~>Ly7V0hB@>(wDQ@Q+v2yM1=o|8gEEK9vJ0WUhh)DWaqmO2GizyP6IiGpZB z&H5Yv00D)CtQ_{j@TVM`YJi8#8u|E}fBs$n3@F4u^fTX^8gtzq_+;ESN?iOFBooOD z=NubjRjWZ+b`el6$oCzuC?ZR0IDp#i z*MY7*I#<*pax0rFZR8coqLG_1euUntM=knZs$=q)l4a9@oqScvc7nx=N=G5(F`DrS zBbvkrHkHQnWH-3+uGukAuFa89HCqXFTa%jdVuLW=c$vnX)zBkkEiBC5p+c#y$;(t< zF4{3#90%sK!k8gS!u48_CVq?NvtqtIDP_l1bnN)&P%}@ttGW)!>by#n@&FaVdMo2@ zesNi&rl%cE1teI5?au{0bzyZ*`tqD*@fumTImjx0mLzwhV*4T&%K2&^VfCDarxP`i z2BeWTsb~y4pq+4E5b3BcS6Cxf2rWWaoIO)#5))IigTRH%@A&QjCBe3M#Nxt)Xuge9)eM(l>c#rTUSbMG=jB_sE+V1XVwQG6T*m~nz5ku4ZL6FnM zaMDqnrxET`w^mCh#TIkN>#MN!Yw9n|EwL8~-p(pSP{y+yjvh##$V+gnU-214IE>cm zx$d<%^sCd2?M9X|i z?aEQcC3!g(KNA*?k_06SqwF+O@%j!-S>!vdZ~IpjeU(8kT|@Om;g5azdGi^O=+?>GR8PjlfLiMd$+%?ISS% zSJBS=FQ(C-9hUtu5k4WRAhR*Vj4a`BeKn@Mp#@JYUbdX>@IZjy*J7*v(C);$Rd45d z9iaoa4-fUKTYeu;G$KY@ltF*wiY@0_@W@`!b*L}4%Y8_nEP;&-wnhVr!vx7!k`k7& zGVPJDcCPrw3>lK$qfY{~Exy=|q}DRNtb5j1y*IK_bXs6RTLAZARi{EFsceDtI&i(I zrKM)K^$0LEVLIJ}2x-|pz@-O0f)8P4ELX2;Jp11Rb=3bAs4KZ;|DOYOStaj*I@}1S zXNym(fDS7$MV4K2b7i@KneG@bJ*$3CurCDg$p(B!tyf2WN1WWYYBVt?E@)vQSx`+v zWXy&!sn!^E5sC&3WF7+Q4f}rmUvZ(0)mlBPIyR?SU4rjORrTxLKp$i>b5{Zw6mW@q zsa#f;px3@l5Dr_0mj^(kPfT_l8TY%Sq7B+oJRK5<+65hg>Z{nudH@$d3rTn!ry2;4 z%}*nlB(y1nmxfqy8Dm!g$+Sj+7@r%eeO4o=$0g1t@1ab2yacX^y~L*N_|W_1=;(*B zk|+p6nE?50`L_T)r9fUXQ4tcLJRB$Tsp4oJfGt0q=a-z5+|(D0yLn;1)8WH?N~!z> z8zv)`(M_+bDRbrqqDHiROPoz`hX?2?`VsfP^;o*^J=TxkJr++*64;JCBOfBx<{}*w zV~+Qj{078*oW0<19e!NU*ypM;at>Xp-taH{QIV?qztbhVS3{p&mudzwN(oCB9L}Eu z$Zy#|8aUj{Hm0fkBPje2(iaD6`rAq2ef0TLWM_eTKDSWC77Uc-f4trZma3V9_PZrX zg-)8i1j|*2|3{Z4{`W3RwQE;4db3>WcbBEUnM(jpqbgg5GS#YJk?@`_Sr3+zV5J1O zLdz)b{PE2`vG3`Uu_8xxfGbqv=~@GAau`LKCxC`!sRJz*VFz_Wzz~c6^epeJ? zn-Vb6dBy!$TjTlj-pBJeDsDsfU9u~R1$#>UKS_3$|8$qd@@JQopeO*ymLRp=qbIr- z$_7Mh7_|mVrXNCcD5Kka7^!{?3D z;TwupxuN7em-5A8@cp(qRKp18Yo{y)ECX+QoBO>Xq* zr}F};gTsG2F#4xU!t(EcE6y1KITSD@o#NYoDsD%63O=`_5k&$yQ&eSSD0oE#rrB&z zUGRFhsa>%+^`}eH_NPly`|grR{o#_N09+E3Y5CRvUzfz%{!aD3yCjb-_L2W|Nm_op zB!&vZ$DRO}gx^hQM;gw8Jq^?8dfnVIV+~ej^|Am`2yz}hyr!04xJtev zO39dv)R9lKc^y*!H{!m2_Uz2Vy+k;Zs_Zep4ZaNK7LB0P&t(({a=fhj4ziX!LG(`C zK!|j@NC0t*u2?7|x5eS6_`>(_rXhREfB8LtP@#&(KFqQ9e@iaQBO0S}&BIbgU33~@ z(g9ArV}^-up41=Li!);v<&O&Z%yhqvYDButtl_~GG(9srK3W_Orl;aBTd0l<-CYdh zDIFdv4kXHYDx0l9Mr}Uw&D^Rv@PUO@G9&z#AMZ5+`mq?F$?qD0{qHpbA0c;1BV)Dk zj|@PF8J?{WE>rS%jgZI!_B+HZ1QqtT8bLxN{vS1h84D&|kv{N$)d*&P2QJnk0J!oS zfEpng>35Al0A8*nTZ91s?upXhf%_ikQv$^KTE*fE{)qFXyvO;TaK@&yHf_l z`CEwD6f5&G%yj!b&bJBNdgvYZi|-w{`cPJ;@4$8aKYJvs|7qZ|{s~;isCF0-Mx+4u zECY#)ej%^~5)8it(>y;bj$Q38l2{s1g07LqpAuT$T^5!mVXr31$hBcyJID z5OCpDy&F%WHD@N%1hpy0&_&?ZSnSmbc;07DIpyaA|>6@p#mZy z-64WVNViCdbR!5z3eq9nsdNZP3kcljc>x8_Is5E=@85erT=y9J^E(E@de@qB{^sPD zv_aoJ-%XAyB@|uqV3*w=GDfP~Ry;5I^<3SW^IU z;I-Zg4y*ls@Y|D1-<;Amu59-vgCZ7_` zLjIOGGrn(IYm2kG#}L(Q$I<%iwfvsK*b+qckUJ%Fo_~=5tpdE zO-90YJpN?zy-I#mjor;oi|L(tE|OZcM@MK}Wkd?(NH**{VM5vwn>NAgZY!Rc*!xYW zv-*}dd1zH+Ort<#LqnjZEC&rhHa-&PkI>%~Ib3M^(yZ(f6C+pJ6Jd9f z-k%{Gx0AF;|CuDh^}CNduJgxTziPM12bL>t1Nn&SVzn_*tX5)>CWA5nO!(a@LqhZakd(BRtoL z$xiog9gk5qjvZx7KT%2QeP`k+lFkrCo~=eEc|DrfZ?&FNwp!Is@Vr*cWmIfWXFpsD`B+<{fun*WNlkDFDTB1!F}zm*9PTwp ze^)}_`sILEJU!r*c`8dYR<`p3Mlx6IItW(ARYnDGt8=O~vq@$+CxUzmy#h*#d{D@j z>&N3CA9!^1U;9dwUjrvLP^_6Qn+@GA7F_5w=o~i|?^>GYtapPaR`DF4;_d7G^563* zFN^pfd`hJJu=Jp&1jwgoGs{NOue`~3P6W2vE~&L< zyNpxKn^co$VhQs>&y!)Jr53TMaeoUuqkfs=OE>fk^2*$fwoOY`0{m}WYC>Qt!?dEf zgX~J>JSZ5?9`Egff{QX^(voXky?_nv&}@))U8#2^tOOub#JxJ{+e)dOGKcgU&iouVv3adOBP0f)RgAbU3m68i#&d_o)rCx?77_o?hXH3l5=?11c@3>@;r1D8}0W*ZR~{4Ax?1c7W{y_MqH8QV%9@#yJdv~2|*Hr4N zCcLnZfforNd&h3Q_6B6{;V`sNM+_l;gQJm}a`$XaCXZ$31f9l}-ADXS@>{<%nB8}f z24ru6f@mI!^uuGa>84gV^2V)vf>y2Rgi%@*)Mawx8vgCKFYC%O(AZO;1%`Bsl^;Lb zUudd}O1CdHEatPjrINQew2LIa@d(lE@z?gs)P8s(CHPLb;J`cKE+XY{;FVUU6mxDd zOEStNKP-UGnIx}Si4ReA`r$Qz%Oe)8An}&62)_~!Jst9{94c1AgPhr;De~1jbv2-N zX9-nf{1tGeRp`(FWbZ1~jbc?PN&k_GAB@TsKt+HsD&DKjz2(=kB*gp6`E?PLw{Ayt zlOdzx=6fZNym|7q_*RELKH>Pj^Jj6w&q&_X6OMD$swEiJ=tEAEvd+hV^NxTx7uby_ z_m3{M+`s#j=RSYR11f?Es3Oec2=j73r+=0r(VCk+*M|#3ex)Hw--8LxSc@;B`jz`) z@_ty}mk1sXsujb^<*N^HSH5Z}N6y?ixEqJVK@dpa&1Dz!hUiuz$yy$bEe%4Yk^*MR z2-!pEf-1wDyk$i<0qe(gVT-mO<|K^oJ(j1&C|AOjA*9N$%*G1Tw)AdhxDDfoX8Z=5 zL(Q;D1(}$ac=ll)`&0>GsfJQm6!XJdY8mPtn$b5NyLq9KSLSGaesJAv7N3CuYXocg z;q9?;4d&78#5WR0_pF{Dv`y99xVpL8WAsG7Z?AY)6eQ&anvRDSy_<@_>Y?}P+OR%Fk@35g$)^?!+2wV?Mw*IjWxcJFcPREkpHW}(gB_>&_CWVO!AGVxzg{fE^uf!!BbV_K% z+vVuqH9e0yj!bC1snrGq4X^8%(i<)e?U)poYZo(zUjHIqFe+sgea+v*LsIAoXD zSzqUn&5mv)kDOdKgKlYpi^NMMyZHr0_Pk5@y^*6GX1aXVgfQd+j)38D8^b-ryb zZ0EyfyuEbwVCci5>TQ;2_;x{MdFG-oTv~zlyuCL;5L%EsUsJE>k&$*EJ&%BK%QIi> zOsP+l!w}V$4WimIL=(+7fY)mB@R&CevfQ2LWLtLAX)Xu~tqX_;5fK!&x&aXZ6%-LB;=aL1VSE245y74mu61m_Agw^q1P~GA z0TE&IpNI(e0TIFIzW4npP(*m&>30AFhzKf4hIF=4ji(|4VKd=2I|PM>K1HERf1uEh zCmUfw6#BzC6q*+l5pE7ZWLt=cFvgo?pcyPFGM8D}Pux-3%0fxll{^ikr`0k@4;}e8 zfH}1stMqHWS)B0)f}bU;0-rDiO~g37Z3UsgG5`uRv$Bvpg92IP)x-+>93xdkyALcS zqi)v_OhQv#VIyr0r`bjeLvceC{lnW9RKR2hL7bb0j!FhA=@WW3m`pR zMO3WHD>c$L;r1;;CEOahID+X7f~W=}o$*bQ1vyvEXfd1?y3uIb*t_0GFW3l0J!g%tT!|4c>T`P~OD z&-nv4HB1(iZJ+JNeb~r~6edO?FQ$uGEeBxAt1(m@QDIhwM5ugnb+tT5y>scQ*I>Fo zZidhIewVneQ(1!Ml9|&B&(1vURfLS9Y@%)S{qtid-f5I~5?ZsS;&kN!gA*3!UWnxN zpRaM*GtIaPVlxQa7naY4lxN*pu=`B*C>JT2aIP}fRq?&ycS+8?DHcgFQ}G&sn_(t& z3u@sa5)_4qR638yS_Rh8FmDFGv`>Z?7U|plwrjmHI6E`k7Jv8V??u;%gARVT+!Tp4QR-u!@}- z)aO1K2v0mCYgUI05!pGFwVRNE3+rFADd#0vp1(Xiwf8pgNKBrbp0PT7rk`!I_0=U{9{{G8TGJO@Z9C0=8Fz$o?W@~+8x&2; zlz=25cTtjPvBe?z24w6bo2W%V0XDQH`G+I{3b0?^&4#5~;enRdp@`f2^m77iEWg+} z0hai@04oQaowE?jiwYjJyn;Z>%l(!sbR-hx1{K z>kVLeg}n%UQC{z(HA!lDVtLs;BtVJ}LxNad-Tv@}szoyrT;eB|mj(Ryqg3bOOL+%- z>s;pUX4BBF{d0QvVk^jT!dSTVuOrnP@`9EZ7es&sEH8vz;OsmVV8M_^7FYWVcn+IN zll1SX+sULwl=3V0__%%*U?a~2*praPPXTuGOo06n(l`-d&xJHD3b0^E<3xZ>0&lCJ z0PAxqz}Ee^tAdW#DNkMhgQwod{Z)XSL=(~yP{KEP8$LK>SVA&p~5NP{*wKjxn) z61>0r=;S?rbjF84Xlm~@ezAyNn#eS4;Sq(Uah^BWmf}e$rYViLB*|6+(?8cbUIzLI zuDjS zNuwp$1(aLk)1p|R>yNS1iHQI5?K%iH?7d$7=0=?|Fxwkx8*rAoOs9z_Q zuz#*Eby01Oc`B;#nPuv!Wy>DsH#Qq&9FMXS>&ZhW*H!^&njrGi z@(_nTaLW{c+%lKlAh*m_CsoKT6JFK&wmB^1mI<7bkAQQM5Se_o zq1%?VZb8mT;8_owKF?T1$gwJC#S;h+ zNE#@fU_ULMs6Q>9@I^W;ogVgQV`0Fkd3G>El z3ayFfD*u{h!}^7vP=QHah+&w*w%{Q(*#LG5Nl3M|mx24skTXap$uFkX_n3ksXf!+40&>*|F*@yEG4EmlB{~LS)A#Kz8hiIF}Z^yh|Vp zrbU+)r%uzN2&ZY$iLrmC#HuDPt$C*x^&Q_u=;SJE!2P1IgG+V)-(ewDNdJtd+CqOdQAL8AvOU>pXGp4l^_2Lll>dM=rT^0KWxgt+-OwQt^-SX)SzLIAHt z+z(XDpj8M)sqF!jUc8NS56)pWt;2|RD}(1SJ)iCeCj zks$g|lVI%DF$`z|tmR*R{@-te=g+#|O%1bMpoSlXe9Qv*u3bT~W~p05Vwb8?raK}% zU*%Enh!Yj~Q7I?;uB{FYBtDA`kNFx8Yc#W^L_Dkkm^-q2WQ#UwkLHd71yWp#61E#% zk(o5;+6j`lQuuH4A0lDt%S^FY9g)F@x2Q8BW*V^0lRagQ5DSM3dFBwx5y7VfD@`w< z2jE>rL<`lldh)NmMW=JG2ElC+7JYxYQFR0UW0I_Ic7P%FI_y$k7hjQcL@_#!(q8@u zgUXSHSKtD1!Ptb%;N&PZoU5hOw=BAZT@OfDz63|(`$ypT``dIE@bkEM{9SwygLGF2 zhw{%BF|E@UF)o@bq{2U1#Im;u%hiY`O)EjyrPCyyI~Se>Z$5&_<=pYt;935uy&KK# z?uN{h2ot}D87ne8>njO3)^lW7Dm($-$cPtj;6q85@cLxOBjV}}J4RG(sj#|>|Mc+WrF#OeV9zgGErWe$j(0& za@4kxNNz55Li4Rzgdagv{D*8)|4cY!`z;UR^EbTN}TsqnV3ydk&!2KFh7--?P|E;5}nB;5yC{`I9oS~n^qtvnYVsveV zVml9N8{o?v97-1yZ%M6xoA{u6c?B_?L!zKGe1x8lk1~`v%22` z*_-^*trWYhrRY&|cv%S=o<8D!)`4Y9sOR4AhtcZa`R!A&8NcJfyW&5Re|!zEX`{cA z<%=p@Kf>YmVLJ3+PKdMyFQ0MM28BRK8a?fHl{m-mEyFY9gV?!SO%F!5oyp{(U( zMUh97ij$PPg&$M?2`Uql9Z{J1*7Vgu_|Na)+L!C*nwfV^rS}Ia9aV1C`taNJ;4nSO zruEm%INY1SvMJ3dF?}TFn#{-%*(M21;!G~d>aZnzYv1XqJ0wc=;W{P-3!t{5{@o}Q z@H_qI3kHG@|JyH^DbwtiE0AxPbS=H>)@FdO&&wlVy8bK#JJaNodym6PH+8R_<4l1% z`5<$&f5Veg8ta95G+^t$zDeUM3D8(!4OZC5XEYXCd+-SxVDXvT37H6JIM)wAT?QJ? zdBOX2+%O_|zt)L+(%S~!ub+eWYrY`hehmw<0gjOSwIjd=AjbS;1N!YhfNX$0>3-`N zc)ylBqp_R-8fyxqu>{U&EYwpP>%}RJRS(cuJ0Oh(D+S!I>%t&3)>G3?B8WA$3b|hc zG*(CL6DxsKJT!yc2Q8syUIs@{20`tkgy$R1L0jJuwDp-CNA9|7%+s!4&aW9iyMDR27oG_+ zMD%9DZJGDo=%-`tSI||zE7#Ro&?j7{MGBjhp+h7jdgJDP$iq_C72x&IP14& zknY3Bs8~%S26MjWc|A+~H!~~x|V#5C;G2wTUr)(F_u?KRmwV1lftTr(Qi#N=_$hR4Xm`vl5;!qpfx(Y1se0PCbw}HR)(lAI#G4O}qL1bHT+-U#kNKO4X(89q z(@#dbqq7$1(?3!jgstGgeHEpYd=)*VQMoT9u?~T$RUY=Ht_JrqQe)T(q&B8AzI$#M z5EjDzwyyds6neh8aqr>C6f_(8sjvX4ZiLjv9PLX1!UB=ch^ib=Pu^Kw0SF5>28kxK zFT^zqtjEhmtKSl>*pCLS(f|_= zDCPWkIQfF2N*EK@$y~&($Nv|obq#{RW zSrd7&Qb~O+`GMiefkS7wrhA=-3~NCcpEXeiIPsviHe?JoXVrquSu*q1k%pz+M;pa) zr@}(MW}sOw0gy=Q=+tl}pE-r3904X2hhz^(B-wF1hd@$5nllL~%0&Snscuqi00|wn zuI+h;_KYoOyjpE?Z2^9+=_iE$;a3R1!^{hW@R@;j8VH2n07CdzZvzlMGyvh>;)g)^ z`~ZaSbq>Ne;kyTc@G;yV5dKigNFY`h_UDLp{%=qkR^I|}Cll_y-Ll zRuz?D$r2{TP6oPh710i`AF4D%Q|krJ+`HATAfr818#uqsYo#YdvKw*jE$TD57W{b- z!tee8;j_6zvE80~ga#BdZkr%!?{0qKGJkI|4b2ZGlAo zC}b%GNps?;i30CDNSZUo3rusy32|iK%h&*lvv63De6s<8@G|~qLdQO&4X}D#|8)X+ ztk#xr;%uw&9T;bBlU(bFl+3Dwuk@KTpJzWb;Id3^Sgw7*uVBAZW7PB!pSABjhcUZPA2o_VdCA%IHO}E@ZEcYXSbAPvG>25C0@>)JDu>(TUXdikwAsMGL z!fi~6ZlybkD0_zJ52TcA)R(36VX1(+u@6GWTMdhMqF_8?o-ZT zf-Uh^ADa(4Vs=#+-yzNq1x*oA_dk+8f2BATPlvbY6(&ZZQhN!Z@6cy^Um90=cwiO= zTS-&hY>zyio*0kWiYTdZc^4^kXt&~ce9zirb(`iC@+s1sKZSe@JDuak&sf<~I2h z`q>E0@SE^8RsH1|-G@N8Um&F04<;;_9q9IZV{CTabkI3U_(uMffr<=`CUAsCGWV?8 zZx0tTLNobgL<1%LwA)WcpzOwjQegQ(g&ipKwzlh=Z<7leyv@9X8kbN6f!1-p-fRK# z=3$H1_`j;r{*PJEvq@6!Lutf&8E)=%T+{{xXpqW{szZz7ZDn010PX5HTG zr}C*}p?|lnonbQwP(EeOlussOL{wNH3FLhO_<+M(bk3vz;6sbZ)%%e74Dh)I06sd< zy#U|?9ZToIn&;6J|LUCv0QitE5fqk*-9%PTiu2b5hPPH;6H-4iA%!TPV6Wc~QJm6b z7*po~RBA+4Kvsl2OPm~S!TlM^>{Je9oq|x;K=EgB$l2VvFse9VLajkdb9uAf3Eh&( z!%}AVDvm{}YF9lwJek`YUo>BKI5MuFiJd%dc%k+}^$5lBptkJ%HPfe!+OBrJD-h=H2IRpBak5)hs&TANoa{>wCmTk(6m+uj zqqK+jBLsGHizAZsM`J(ES@)KSRu^iGn-88`=cLPT;6>(~J~&S{1^0&KsN{XZE&hM(1j1Y8ZIir z?I^wBk;-v*$Isb1-l(+yi#@O@h;CclvAvho+sYkp131~=m{|ZLL8^3Mj%Pdr%<-h1%klV)Q$lh)>p~85r#YT# zeit;{1^El5Z~5@N8227-Etob1qJFSJmHs~Ev;p*#0tk%Tl0|qe#L1@PBk%t2*SYiW z%?of}U}&urEGw{02gGbLg&p)UlOn%t&9w;M5|AEiG=IgX!KRVy>(D9qT7If8cLWaZ zy55KO@5f#@AFL0VH$3&9fmKzCrd8s}sT-M23*#QdYmj07)clr<)AM%dwc(V$c!o$D z=1pUQDe=WU*R&}94ZqpcOCov2FI;8sj^ML}@AIYkL@KuDF9~71&4<55U#`L}A6Z$d zWqo-n8qI#XQ@u6h@%N=m)HG#6}PB!Z`o`;@0|2y;?gO3vm z6<{)?1KEFm4(vZip6);I|JZ*P`MLibpvw_b{F3?~>_4l`e&@gIs#if)?{&l~;zT-T zGw=1>SbzpCCY?m}q+cHBs$_<=tRe4&kY=@yS z2_g5udS#4c)s0-BXCijQhx^~u3Hdpk)d?A3|GI_B4bLkN99%u83(!%H(=i8{!-D%f zcjw*CgfbI{+C|VG{o4i0Y`>e`13uu~JM@ndXQ*#W2K-DeW<>rdaS*TIj}iy=_5M%5 z%YT%(zdixaL3zI=AaV}MyO0lgq`+qmI1wv0$Zgw&9oK|Cn@Mh5%OFE2!1XD9o8b2a zi{@&2ORe=~?*b{h9)5vEHx7$0OL5|M$Yr9!=@mN~*-r$nQjo+y9?dsGsq&&^EX`{dfF5Ps_~C_@pMNB6xR2ELL_L7uNU{JOYR zK`Pz#Nt7ZKvs|3cvqoSic<*3?bC{At+2~Sb5&b-tpFmrQ&mF#RZJNHVnR&dJ z(V-@k>+b{l_}f`ZNo#OGR|Y|bjj#o{`?3Dz-S6Bj`Pa0_g=23eiwh=8NfiyLB(rO0 zm6~ZY;5$K9C}lk3wd?oo=d5&C1YA4^blP(y02a_T>18=0dXBPAO?po7!c)v z0by}P^~`|K$bCO8lm;0WLV}D7nc9EJdDfd7be9?JgW2WTja%^4LQ~_Nd9J>9Ns@1V}YG@bNN56qh{}arR%FUj5>Ql7)BZ8ce8yrB3>8Rv~>i$S0+_ zKl*OOuM+~LxnY#Uh<>|>^&)c?s6QOi=|^KnLyeSR-%agF-;H^r?q%P6$kk8lm#g2$ zFrcRVdNyxdHW0lg>}rQZuls@@w+8{y>y@E*%6OvvFFV{4zotxx*Wkve&0Wpq8uDdx zq<4IjqdBJ41BDL{M6c1v+D}kq>K`a_4sADpB72`lk;%_cWawbNpD40h@Z&25!n}CJ zPXq%-#5jSz8$s7^Dv-V#6{a`0fxerJhbMhEYCzvj#>ju@yFvchccVUq*Ex1lBWXV| zNmKP6{8QXl&KHsRC-*+~-woLTA8_v8_vc0Y@TnqjRQ~wyT$c^-lltX0_~%6o-~Q)C zjJ=C9b5B0=&x`o9VE6yhi=C=Qhcj^sY^QT=OGq8Eh9`4vcYe&ZwSsePD*rmyh6>EJ z>00X&wVj`9lUvM^h$76Ndfx0p%G?6RTEZ=9wB?>+gB$dBCTQr(VQ4NC+&nH~ravjT z2?h#ow0U!-fLKfJogiSY4TJRj2K^kcK@ZHeu_vBv(Eo?Iw)52uSH3lD&YS>!2YqL^ z%AklW=l>qNJBKr~|8AfU_<(a~r%p(%9PpY3eU{$Mavfor8e5-OTHYihrRY|!;f@gd zsHu$R?z5o!^&t7SHhH|38<8pzR2)|An`aufOjRY~|pE{&D!Z_h41PQ$Y_N}ksB z!?DSBnHx`LO^qm*F_qF{kLfgeKp&;Yn8*n@kRs?h@I=@+_edtapv6tSxF|T-$PtfH zmKZ}@Y_*TYCre1PdCjY1?^_>~`bn%9r^41X$2p{xC6DON zBi~J-RHbQ6>!VVth1Y?+kKs;YeTIXjh+V)nk>@WT)#tB|zXE6Hvo5c95?V9jHS=vc z9cpdsp0)HROBExNoGef0#y{ZxAoS|YRH(Y2cAY;*4t)&Lc ze`zyjpmY$AcOlUHjP+qBu4=)&KYOE5%35Yt$P5t*|kpsEfqTpV61QB zG}Z@>e~Hnsi-i7yo28!OX6Z+hJwI?WutnDUT%7}?MHb8*gHtqTO^E-JJB|d#zs~25 zm4GJ1v)nPt`P?z(f6X210d)=#+)NFaqCtoNT4a5wSw&c_{165c2IuSD;GM>lm%7-l z+@RKvdkRd^{Crind?#rpjw$^)MN*HKKpN#A87l0*MNd30qFode|3sSsLk0MuU%UlgP!|70oBu?c|4-Xs{}?KN zZK#~T1paOejr{_K_D5R$3u*CJDD6+!2G|(*BQ5@s7QyYV|Lb8J_TRl!2z_AZDwu-AaMr80PTGk)z!xI?w%z=AZDL3_+v$ne-LER;Qp2i(=0>vf}xnKmQ=m0nrY zFm&P7MJh|ZL;<}V@u~R_w8!pR+uJ|C4yEMl?;!W7g)T{^Aqllov^(1_B~jQP4zX4_ zgz<$7eoC|@Riv-VyYEYUgSJeRv|n#E+@ijz=Mex4_g>$|_`dnQa<+3gMS z3d;288e71$qBiZu7rNEH@sz3xt99m*-b*(FRt`1=MSClP@5gT4uQKh{XmgY0IBHRyVpN+>+Zsx||Px5_(nSE$?Iis&4c# z|7MgE_-(s*>pnjVx!yEh%x02aGRSN6)f@zVtxer&Q-LSVt>#=l*# zG45D>2rk&DLKbYu!37)ZGJd_1j?m7P(*+v^yy1Y3U@_`s2cTOVZV{>F{(bc#-D4Bl zM(NyOrWdgPrSikBDSzYWH+w)!oEF2(Pp0P-&`#NOQ`|1jPa&bm!sS zrQ@qQ9;Fs~*0ZYF4k+%;$|^+IG$xb~^|h@QZShK2b7Qj<5JLZg7)N4HC?9^G6kU|` z&`n+r%MGX(|LA)iP+!UX@6Ay||TmI^#6KE8|@-gpO_sll{~hn1&SP zp;jgZ)YmD&Ik{9gNifl%y5|~KeS!^M5dNt%qZZz-(4b6^PIY`qtxh|!ERvp6yoUv>g$>_sJ`MB zJ76S+L8c)K>35z0(~#6FO=#nx;PQBAK%t#eC3@OIFdeu&&Il}z7X!=VrjX_F^6l*p zfgB&OQRPpwoZt9?EGN(6$%>y@zQ&*o;ORU6M1N;#+YrL3TKXIEOgw)=q9-8C-mtz%^03FG~RSJlXiL^ z&;2atZfbmzoaGgLdcN0#ikT5gQT8zyxvdyJ!u`ZCih5KF594nw#UhTtCB6_q)nqN+ zq);m8vz=5D{D`0HWhYHL;XFYx!%xogpqtE@t^N@AW1hhWTj?)ltf==l;9QPb4*bzg zoS`0r5r%cXhR->G@VN^7|F@Fl?7u>O7p)()$dduB3joYr_rot<3h=*LKj47YdFw}@ z6<253c;C`We|)Ff)>1H?nTMoY5lTiEF+_<8i?cW$iMDLKn4*K2$`jcq6v~TI2SMcS zBA1bSF?L-TgK1*nU|w+qo2{8kv8GO*W^^;2ee$^Z==!*AroWjS-u&yZ{sTJEF^?_p z`WXCyoWcArGZlA6Zt{Am9RMd_ zvbP;B6xlj&2f3MjcFm@IAq`9$WY9)y*pKFl^R`Wb`&rC-I+F&m9q%%*Eg!drpjWp4I#yCE-0JdC9yN`TGq*v#|^%Z<^ zX?gDJ$!wROXrSGQc_2o0Df!wKE9*51X#D;HK1h&!0|=7ioCeAFegw&de+J2Y6SzY- zm*D#`kru*3{ zt+!HfJP5!z{N>qm{?Y%t89(+5jNhMega0yaaNZ#L6%@Q!dHZMG;Liq3(w}vM*_MIC zB<{3;{UnP5rv_rqpgk{(|FLz0^Ov*>q+o+`8#n`4xrq~namV_htXIgs@3@xS)}^@6 z*c-WG_wigrT1jgnEk3pFQ=4r*d@2NkM8!NU%T`fDB0II0*W8k9t*cdM%yA=KG^Q`_ zt%i-WOE_wiEpx||@CR?Qen&ZOs8M?TJ9h%J{6pKEBc z7X@(Ms6FF&rF?zr!!WX6j*bg|F?bLO+vlqLBuq=WFqu%Q}0*OxZ9aqWqUOAlJZ4mV9l?~8gx z@|tfrl&tAZXa*+pPIhl0V2p|o>feG%D~p~s4OtD5vG&`;m4qVyOjXf4qku*tg~D!I zL@)8mN0F!bUSpDY1TUIcyl&X==Tgiy@UAHC>IKUV804bBSJdCTEB;CyPAX5a0My}H z{@wk&S)YUvXyVY#AcC*vm$rE$;H=Yz<-(B1^xTnB7oc;sN59o~(Hsn~t9!aK9Ot|Wbw)Y7K;CBch#rmbUs9tonAlY|U|9osth z#wvIAVal%5y*Gg`Z5~d%w@KLgMg(o(l@wm7n62>sUbB&0#fa^$EU`rihO%MZDtmm! z-mN+#ynbia(VI^?=6tFIZ%VHp)QE&Xo8H8|>3d1B9QlaWgFB$(U1t4NpIPE()+5EP zZx%3-9Gd%U)v3~K8i$8gmC^ZBGo!l9wRLAWo=e?hA-gZWchA8_b?gyU@jYyRm&3y# z=6i*vdPpYElTqHcD60@$W@dn$QHSrum#*Dj#GkU(pp;JXc-2d3`9NJTfjn1#DEz8H zMJO>P8`+q#JW{yAi!Nm^#YtSsscJv(x7jm+_wRfxFTsx5MrL_?K-V=V=)>tbJ3;aQ zZcFqMwLW|z83TG^|I{d3PE^8hWlpOvv_0nwgAp7o?3^r?w)!kz{JVGR?BO(VHiE)( z#r^1L=PIBa%i^(FRTxS}86IiAj6+kGM|b=1$@@(Z*%3;{_)1m)%XUi34is%gb@aV4 zZH7YUDoswK(!twoPEc&OI#h9iO~GJjxDUiQKJtjW`a~EtTSyzov14|bDqaWlIMxZB zomU%6Q!$j#7fJadO8v!6P?T754^l`H7f|ex=S_`Y2%;@aY+M7H!8vr`Rvna6eO44` z@8F6KzHD*x@qIV3Ut{DF{hcY7<3-tXK_hJ&f81T~KDZ$0SsGa##9rG-DrpCED=~xd zNtD7ZWY1X^LTSA&7C6Q0K1pq(Gz}^>EL7FQPaZ`Gk>ZgJ@ZH*Zprg?EWP#nl$)6F~ zF)dD<9sm;u=)@&~`y@u9r^#ixw5ZqAJ5Ms$py5{XiOMPEmtSWv5{T{2e!hlJNu(h6 zl&;_%a7vB`!HMQDf|G(vJ={TB#$LDa=f1IWZW~!TtYM&WujD7}KzQm60?R9Az~3q( z;a~l|p1)51ZY+`g0+#r%$FL@01-Ek&?WcgTK3T@g6+=WyM^JgLuzCa6@5SCGx^!8B z%!wzi*kvPH!8d*;T36#p!t>SLusl#30Hv$13tAf#|J4 z;Qn)E%hcEPPnAOqcpfs@!|+7 z>XCvLrs?umF`c8v59Y}`_IetHE{`8+1^5=Q`N$r1?2NZ*Wm~b#^SwO!bk9XXpHZTQ zW7paht!E`%vV(QepF+JL#XF`Cxtm;tAH}c1)~Ywsp`F=f zGv09Ds*;CSoYjU1SYI&z&UJN(GO=ekDZ^mPrO^wAR$)OW~ltN?DQSEfx;nXvo4;O;vEw?Y8D}3lpp2!>T z+&0c>^=?>DCK9cp)Ase83tD1AVnTEgP(o%_J-J-ei~4?-pF@L(-=gKI1ZHaXC-=*a z9~S~*rN*q)I~3{Cd+BifnL{mov{wQF{##?rKGAxpP^#FgqeZNC#!itQ6<)NRZgS1M z_IZV03YXb^tNizq-PAHAD-5?}t;RlBY+UL0_G%k};#I9>Z)CG{yWyRpecynZ1Jl+S zssojwkv)aSTVPnMi=72*)#$|)rZ$2tjD)AljWH%ar&imvf^&lR&8XX^!Q_`v`>xOF|DM;2;# zyfSHJOAvU5cdC%5=QKkHmw|VEMU`M!3v39IbxGl;-Ro|sbeMA)L+--wfIufyntX_w z`uu8?l-RpOMRKEt?_>8}wf4zoLyq2vI8{6}C?TWnEtg(e_p82ZWLd51z1aI?l`+4S z{-#LpoloZ6cbtZH?3C`@vdxVdbMTW`%EfRkv1ys?y7n|Cd%>oIv((HgADE|MeKnQ> z%+oOH;I#C_Ybjwl?e2y#R(am#4QTAa<7fwK6c;v1Bw2A-Q2i{p?h;XVHNp8h(l$@# zNVno+x_L8Ngor_RM%pMLE!1ViMO#kaKe2$I$El&P9Hu8dzpR084F3eEOiY07fJT<}74eYwoylav23;gno zN_gyZE8f>fhnKk;ygXZ_r`RTRI)m(2BynZ$6l$&TtA}s!jLgf#w(EMdC_jE|&mXh# zY)tyvGdRkub^7a=`N3Wp%QvzxD3-0UIv*&%p=yPXqSdC+Rcj?P(4~nivI~xKvL!5f zExRWbscXY4BWmd4`M!+m(y#)~{xu22J#>%lI^_@+wzOsmPuawU*~X+pCW~W5UDvA7 zh2l-3#{KoZx+C|;uO9CtMjy%?Zh!i$(5S8=p*qagLVs=0jgOCNv-zHl6+-y8guqeE z0C?&S1m2EC+e}5i9mX4w!b>TH779e*V2%FEq1SWIieHWXi*NiJ4ZzOp z!?bpx5hSWI+#MJbvlhx0=>4roMj1LmuMyQed^6+shYo7XoLlB4z^WH)BP;bu8IX|n z(!IhZE&0s@e~W>SpQMACqle&{lFhF`Vc`*bg-AP!nA47Rmma9r`-)&Sjgiwqts)L4 zk%s^&&`O}(aldt-X{OjB_Zi~V(FrrI=-3WwLxzg}6?kV?un1WpzIi<1^@@>qFSfj1}?A+2)+RH=*(eVg&W{ zX2Dq-L!b<35d}*`ShePuYHgs2;dR#6dcEp28RxNUc+bhFEam;0QN`|;>-2Epc)}~! ztG+M*cU~Q^qP-(WF*XhaCOjQX^jHWWZ9ogWCheG?1L>*Xq9?FLJ&pYYw{X%1^c83W z(o_vfmjK#;TqO>BC79{9p|MO0L%&2| zGQap94Npzx^c}ugqYRQm4uOq6l9C*&bY|Zi&d3Au`{fffLaLc+bFctgc?tWJt#s)@ zL_}jzG$yN#aAEs={swo*zA9360c#kcumbYR63Zae+OCo*JI zuInE|r`4Yfb&$=|qXv?=&4Qx?a&?#AJI)>Dn57>P7i=DJ5qyXIG3GsNHTXv{c#hu< zR{|e!-se}VmHQxsS+&bR3aG<+Yr_{vb%YS^lYnDA6XeSIwHXP-T4 zX2VPsy1QLuRqY0`-0XZ7x?EQ)wlU!?*KT_P(^T0HD89xtxkR85+uDrhaVhxY+b^_| z)6rq06H4(`*YE^QYr3jVcSC7?d;sf!L&Z8SeM#V2qX(Z=*Q1&$EQ*q^BGHmdNcVlP zf|c8n@|X6|!@A>xg_@hACoErgrWj0zxT7Sc&tj)+{eq{f>oxt> zSxhZG#ir85V4RuI#^u`qxtUaVu(mueIjskVjWN=GhA@*2qoQzNaSDxxnTHaarZ(lX z`|*bg4|Wn(B{|j2hWq@PWA!<|Nf&-z&L3&&tw{Tnn9ZQ&^JsBln|Foo>W2-%<%MYO zKwYOR9K#JNR_lI@8S!v?aM;9v|10jZpYveRI<= ziEg(}O_mWw5YfnE6cnDCll3(8gwtjsW6?>t&5pK;@A8?0kZU%NmbKA)EY`BDERZCc z;*(X0#PbBUuUBBi72r&{M!P#P>Izp3=_T1`2EF2-^tCvN+-23#+zg%SY@EX6!TU5u zTA*GdaO`uV|J6I`oVE-6B3!iK$E`SPqf~I!M62q4LF%EcYEw_^s&+2yfFm3^{YGBzjYl`oJ_&Zv>Dk6N`HY53&u8ss zKHcQqu8jq1Y-;-bE~VOH4|k21ZH0~M&|V%Bp~&3gK@xIq-DSCyV81z0x&zcH8GfX5 zU%VlmD%@$OmfgR&^!-Z1heySukGQL2xwb<)7pK%!diDj7u^h;H$q8go`AoTPRvq3g$E9%Cw4-Hl+clM8Y+oC}t*%RY?V0?uHMVJt%z@?d0O~Mo!MhbjxZCla zy&RnOOE1TS3JAXncD?4fJ^1jU`OtGt)&vVauMbfekyJ7x@Ab_-CUm3ls*jQu>ZDy0 zpqz2&X27$J%xTwo^4QVgrra{_OySuWOZ4jd_wPqt20L|=I1A%j3R~&6F>z%yo{I9G z?{*6$W_#-~kDADkzDT5`HTl^O5uIxmxJ9pd+EzR>VvtU<{|eIOxvTHxiXDW+f*tvy zJx%uFlW4$YW1$0FHsaY-4=x)m2bT@`We~C-L-cn!iy|=k-B7r0*8r>dggedMC??Urjb7ju9tri*39u@WqGQe7>s8C*7y!DV9={l)od@(j&TJSFLNUc`?M z#k59gJl3`9!?9d+7=@3MzWCL18+%^; zjT<#296{_*`kZYw)t&SjRl9m*wOBc2b2-{m*9eWl&M_Zor=E(4>f5B4S{g=UV%RJr zZymXOt_(SgFE8K;b?O4X%jr2;zyQaZuZR9}xOyY|lu+)|MO4!>%IN93eMrL=X0v&(`eaG#t|HH{%uc7hMF|*9Fv0RM7OjYXa?rW7RQd{AB6B;K<=fXfcRcxwi#OtY z`Emjtci22IB4a}jvWwLxB_x_WCI0d>!NtBarXfM&m-~6&r1_j}lj@bB*0gr<1%w0~WonWL4y;Cm4!zAQ8Xw`Ze?9yb%kPk#QvG z{#B>+`WN*Z8TG7N zMU0pe-D&Q<7FiWqy}q;g#a{5CYVjWMBq%KE}Lz03+bT&&swl=S)Hdo0+CU$o+FQzkONal;jcLVnQ z#Cb%;9)6|dFs{Hz%$sL5E?B>LGNu0^Yy@$DJI!HCRkcdWEhGakf2uH5O`&R6k37fs zA~Z0^hI{=6fnneV7@Gg+5DdPW;{)@kX#lZO!3tS5BbNlvN#*fMG5TQ#iT)))>gY(y z40v9&d7^4#CdnzEw`Kr_zs*0u-*z%xcgbsB7#nh3s@%@-y^rEtAD>RTTQ?n#z|@D+ zeXS?n{=zDc7IkO?e$~m6CDu~NcQ?$-_dqJC-38}esU}FF(vo`_LT#Tm!zFez(|h!J_O{GWA{Exa7S+4+nwKOXeUj z>e(}>+b?^_X{a_c?b!3~d_eLGr{P#!3eIU5+g0!0RD9H?Hk)wqqJtcObK&v{o5A2* z9PiK7SFMAz6pN5{fhM&Evu%tc6qgdC=hXc*F120-VH)7{TXdl#oYoI84Za7M2D?K{1383g0ON7mQ2IEgVIW!nU>Z)tF%3uPw}+U9+`Y2wKD_e$ zxgpb0IGw8<(79ZY&eIy&w(2bhwmB>b8GRirhx+HZ#oVk$9ryf#4doyBTj!q!i*gZK z5to^`XTmVVzeNH3+XaY!YkJ7P-9``J00ngM0*84iIRAD{3dvwzZe39zy zGv?ymZU6weatr_ocPv2wNXW4S0U*^N$I<}+k`M-f{G@lv6LT|vfHhkw>VSajca(su zbc}$z%emPUt#oM3IURFS2$CTJkqG@%HW0R1&&{{62?u3$i)sTcElAcEf z^A36Dq(Kt$Lqa9=`q`Fu-}j4Zb!(q!3GeC97#380mSYY-XLHV9Z(>X@nRSaq!P-HH z>ABIu)~m0#EadV^^5!ng7*zIITJRX{G|X!IUJ&7*<|8a*QaKZwdE3y>Ahe6#Pk|n} zzO0w*$wdEaeRbt~#d9~^SGIf;?+<)j|IAABEs+RuyN9}aIot_Kjowcuv>luo(_g$Y ze22{`8@=%g_w^4PDmJP_w9Dpd@4{+$s}|qmLti~g3|;TQzZ!+V21k$G3~s=D0Y7dA zV0SG2u{$z~h(3>DM!i04_kC>39c3l4WUX)92O~Jwn45J;9V_lWXDcE3l7)l!dPn7g zm*td)g08*UyuS#W8?~rRiFj|X3w_cTm*!Laa1yu&j0EmOHs@Rx8B_&AOretp8$t~o&A_LVBE-g|1{3~6FjD;KEt z%OBx+kS7j*E^^5;1}I!f!;`T0A--IB6Ql|QLTt?+_AxPsJAM^5E4hk1dJfL4 zc?&}o(s*13s6tNJDOQ5kLYKYEp0$})apc1fb?)^oeg;U0(^kg7L*)naQ1O>jCtrb3 zh3Ie;cv~m%P!TlVnSbm`)WVd8=BG8rzm5z%RJ7~QKqC{!&qk)~6+c)b6ZK|HMYy57 zL9!*Uq$pIzx%D2&z|$a1{#@g!PQ_;_(vIM zN)U12b6KJCt(O!GtITg2Qz z-}I~Q4I$^l`A-J`oXI_JDt>V%5z^yg?&g!c&xO>yn?d5vrd?;hO*F34U9{bf$ zW06Tx-=s_`wq1CIFg|AIm)D%zph9?S&L?@hOnMu(nRwu@?ft9ZDA(@}j)D(3G70}z zHqqrrs`-9KuvTV&oIIQz_s)N!+&U^(_ML0INjQs zxeS`8;hof*k%e|p!$YyHB6QzvK*nR1NP3FL#fhVY6cbL!r^y&sI?KpyJwcpe{d z`;Cb$qjJwmRH>2-rlj9nrnWMO0)7snfK&Ev->y7iH&HWvK39G1wAX{VXYBNHT#|1J zPp9y>An-m>k>VgdXZ08{v-q67yB2>6{cCozK#|?O$RwIw(YU@uTzyf~22s4!%BMuQ zj?P?uT6Aj!>6Rac6||a|MSCdHM4{3UWc7F#U|R>JAu!uI9=MhQ+xi9Ju|wOs$$@RX z`M|dR8Trt*u8PNrWBl-o{nQ?;G-OXW4pSnbd%uzbt zG0_drt{Pc0&94{6v&?IU-O77J6F5wD1I7M2JE5`M6pM3>$&f>ZfuQ*K^AY71-~1Sq z2WTx;Ycyu%sqCRFe2vx&J@UD=i-oM@=HT@!{1-e#DP^QMRq*AAZHS*%}L8eCe><|F$NzmnNgG>$5 z0#*>vakL7&OTc8ZfgoK8hm#3(WMV**Da!^xx_)+KY8^}_2Pze4GL8DdCR3l_=jX6K zql1o2vmqOufy5awnJP8Sc0Kwm%^_Dir@dDv%+;<26LNs7JqPY;Pgi0&QjcyBx5r3_ zYTR%(+VncBCW&k0HUE+k?8QA{U0>H55Y-`v*JomyKU@AJehE8A?%mALJX3?zHdlt4pAMpW&zb9fi3zd)j{wG)ggfK8e~kmx206Ye!`tTDJmWt z7?WUB2lkNI6k9z>(?6v;xSj|-HIzP`6Df2)kT^I9P#w0uiTv2e9)pc69Y%E!wxhD@ z#RxMwM>~EF2Rpu&9jM=ZIdt}8Z=p7i=b=|WswH~++Q8d9&fS)#$`6KI?a)Ss4&TU* zxZ1V;v8z4iH@MmZz-0P8uJ%;mYOg(XwVSFo5B%rJbi{_l^}7R`-~*2AWEqjqAvdVM zYf8hX-qWE$ILh~}U5za>8+78|bHyfb78N+-7@5!Fy5X^gqLcgFo2f1Sy3^@etK+hg zLT(e->HER-W=s6N)=L6|OkUouf{7a$H4%CB{3-&X(-(P&PHMeHSR#>4jYwHNB?M1AXZ_`-a}Y^;iv#P8`h=ME50_$lY6%gJ|o9An82*S0bdT{hi&X#2r*pzJM22P%6LhRWU!nK$f{7@+J8FmI}0 z%p0_=?&_+sh`8HBNlkqk>}>ky3Rf8cY7Gnuj5h> zpU1y@vi@#}A=j})h!N72*kN2VrM(%mlkGZi4x5p7KPvNTQp0%IoKT9oQI3OowK0BGI<3}R;-cH z>>O%ZCMlCFlWxVL(XdR3X8TM+R00M~WWshQ`vR{D znlaRUWc+mUa>-YT_k6kE5ZA^jfM2JaH zOv;;==Mq1=Cs@T|jz4q3X9|D*0zc_|jpOJCF^2tVJrNH?=zjxZ^H-B8Fcq`^@l^aZ z2zhKOa{VuQ&3?6Hn8<5tYDw+_k_JhDD(JvOq@`p~z4FMoXHe&`1Cympsrb`D2j-+G zJ*-##^v_=Psl3yM^zdHw=^-0$D?M2Ikw@gxhT8_m-@ay#jK!ZQFx*MUqbM-6t#2v$ zbt7f4V)ZIturykRpyP+)!cbu3bx;cX00jn8*as*uG_W*!(PqMyMl%=+EaE>bjd#?Z z9z-E~52KJa#D5osgq`uO9WZrX4bq8>et}0Jy`TnR(fR0*E@1xI`eFW|##_S;3~1LU z{kZpV5oj8#b2~?h)#+Vbp$fQ=YFeDRnXjY99{Lqjuj1fL9c*YUCeUHUW$LM8+p}6W zVp@oDHs`pszP$#}(}Ixs=OtwR$>vVp6Pc8*#=6tNS@ABz+m#24CWZku;xZ7=ROX4)1sn3hd(n3T)o)!8pvi9=6=F{O@+g z-<^cyI+ldYQ>s@$qQ7^-sQFYU|$r#Rmcp(J(E7ID>K6EljIn4 z@jPY!wTpy~nz*LeIoI>WxfG0x+#%_*_`z(|gFZZEt+#1amKrrl*o6eSPlGkCB$W;Ez_HTDsqS z&HILUs#6;B)uAyuauK?A6p@q_PJn*cx~Dmu?&boDeS=K}F7-?!}e13zl_v;gX4jzM7Rs6tT`|f%v zYP??=foUCM^$>lc3D74_9?&Pm1nwQuCj?I%(kJfBr`J*ftplP@5X0ybw0}jPIM^Kx zoVyNo$HhbXMCsqsCsKez(&d0YfoimjM`;VEPdL;<4oNB}8OixOM|(1H;PinU81zS#+b2UUVV_+7mNhUD2_ha?<4MhhE~j(iVG4E?ztp&bs%b^GZoVMy!H zg=rn04G)0Ukx2QH!w&Eg{iEw;;k?9%RUbpqc!eJFBjB-d2t0;^La*s%r^J7n~hEB@V(1!$o6f z2M1GIC)QgwAT_hCi> zD9q@15N3RVF>PI(Onauhc0VeX1}($EW(r>{aoN1KDshEyxGV=0Um$_b^JdGWfjkn} zC?j8T`(*E8Gv-oTa+4?hp!gyM{Yde}^FJ0}xWbArm{W_&!b&2b;)@EMl#AEr-psj7 z&CWK#$*-IOm(IlGj!RH~Abi3LkzdWKy$r#=Hw^82TzR(8zE@Ta_C0fG-%}ZZ_B|HR zdCmmwd$7)P35cU}bl=M>TM>gAe;edT*!E=R#7K_UW_?%=NOFcZFsX%01dJdcZr{l>%$s23e~f2bFwI)xmoaP^{Z z8|{aBQHEXHB73BCNAND`J0{xr&`7BAdq+VQs)QcKX^?#~fK$YjJIB@l1ZckWYls5vX7pH!z7w6o^ zfogjerd}`{S1%y1wV*#BhGY1;=geIk6mZ#=?o8yih)z_70#0sIH;`@puR^6e*)Kuq4hmGdgKC|I43+M<-u-F@E8Q`F zvq1Y-UnPTS;VLYT-T%N~ zUv;>HL3VA2|Dww}E}HX4CbS0i@Fhv+aB>@@Rqb!PpSThhP=p5O%QcK%k1nR{eCv)= zmeHl>&PXPHJI7g!*G8O^ftu*)^yYD!fpHp5`(7v;!u4}6a34paU$%dcog;qU@zdy5 zYMz&)*k=;2ni`2GmrB0}A%5i0#qXFY5~FotL0QWdE|$$~&dyRr)#J?`#+$n%^V%wC zM>i^|ieq*Y-ySB6a40D)c7h4V`?n{+BkS(p>LOf!3)N;n2Gyqk!kZSzH&vGIvl@sn~!G^2G1u(KAP>m-xoy{RPh97jN=k1$2pJ_{72Ea?ZD2mdW!43Nw{*Zyu5} zdr9RNsjzR$kZb#2$utR}AY#im-%Puc+sDEW7&y1EMTJcEn|vl})e2(koG-n#o%+1T zLs6$;vwx#BT9MXsa-xaYvoh zOdQGG$*m7+VZ45cA{>wvFIbIcVWe5g&($d2Qnov1a6kR(Az6|2mi1qe6@_#nGxDi4 z71QEjEsQJf2MeLx75G9ZS$+a6gdfacp61(cb_u~kc+UauX}0YJp5}K?Kd*LVrX@r} zp5`E7s@5x_5_{{St{=uK&u2?X_SFatA#-jvM|VT{zXHGXrsqB%LxHE6h@^V6WJ(fs zlF9$T(;O~xdeALZ-u*l5@%a{i@$0|RMYw-={ttY>k(Dq{SzfV`4YPWKIgPCAX;8u` zYMY2#yb8<6NlJ_hBo^{dX>o8q)J{dYIFV4EWxW`-@zr`sf<=EA>vlhI&d^=FuhRJ< zZ#4b6Rm+-ffx@gu(A6}x=Z4}Xmp{=rt)Pg?WJ#Id+puChd!Iiy@DqBDRT#~@`p}JR zpR_GjT#{TA9GC9r!nWSB|YNueklSc(mDz`0ehV_vs{DGHYvRzAq0@wrZbMqxHVpIW9gUSTM-XALgug zZmQZ4pEG8!f|rwdg6YD0*)V|+9skw)?_qCe?T!|_ZRp+nPtSnhn>(KWI7W)F$;3lc zW6JSI9#OrqXB~y~lD_7R%c(IKgO*BK3vU}ea&Wuq``C`doz)KdkE8_Me$t*RCK?9UVCU-h>_kh+&4d8j!orQAJ=I=L?=+4q8JjwR?Egk0LF|mq2SI ze>r=ySkw@a76uldZjw(=TkAR(Q`n>wX4j>VX|is#hTQ$TUrwCImyG(-%l$eqE+?J3 z{k&TyksAJhODl&SV#4QhFa^28z!9b(pUgB_J-h<`a|W%X(IU74dV1Fd?VW%#Xlb2f z=#O6kiGsEf0E4!c_=i+71d~dTAO>v%kE#6zCCn&n_AoRbSS9X;@U*FxsC;C2uX(=sjl8BC36K1?SR+aL z(5aF~wZmD-zNfG?bEn-G!0Wp^hgXtHIGDnx#ye0mqwkx-GHYn0VFw)oORc#1lE5%q zfCic@5;6h8$&)7$+W#8w0Dio`8D=Zle?82kr2e-KGdrmC;ZKHHa*2IqA3Mtv#NxNT z4|0U6G?Ep#p$1%y3RZnR-MPfh3ebS-exw1nKT{UofO{oh$TkM!wa>}&tMraykqNdB zL43oAjoL$6t7axD=H^*+Q_ZSxVj#Xj`tkINY<`2~R=~$ZA&F2X!!-8G{>~p?JU{n8 zHq0JafcSNBv=YTl6zSJpucWI=&!4E?C02>gRskL zF1>%{iRd;6p}+71=+_r_FnUC|fd! zvZYsmwJ)4%c#BQdE%C|xsW|^veOQCy=pi?;gjSJXcT}c@pewzN=pf%!syj8K(|cl< z&GKv?qlL=e$H{|KZ^c%`n+(U6K3-V+wmW?3Blf5BS{K?aE=u09 zs}uQLApIRCX`ptB@c*j@T<+hUWCI^?beLTe1dm>v6~|L;TScAcuiSk@A#nZ~63pg}{7PokXRRC`VR9OZWUr9|bByY{ z42eS6GP#;b6mggILbFOrw=yz3xW*hR*seeSTIZ5p9~&X$u#7PnowaY|cO&$X{F762 zb>BWNY*taqcD)y;iNvXtWV~A^{5gDQ?-TdXIgp(|ep$>khZ`i^RvMrt_<6@AGoej8 z@P8`50ltdA9eg||vX#}b&`YzrJ`d3zrg&jn+{xoxT<40wkNn2r7AFDn8zM=%*UO;% z#@nnv+2UOD{%VUGhUGUhp!`Oj`dkj!;xMY59UYC~`3-*Eq+pQWNXNN}c9`FI`2xys z{PNxnKX~sRb4fQJp}uM_kXNApbi5qCcOR$dP!x|;+Ujd?ej}eZa_gOI%OUHz3Qw+0 zUwL(qT-#VUOs*~6h{gaR-dm#d;ZXNCe2as+zo%k>mg`9yZMgCod+Xbs-{=FpO2Fut z+L+KF(DToHfFQRPi2!nI$w15fe4yp}8-2i|T!m}7@GXwfNv7%e7IzY^<=Xumd{ajZ zFFdZW5O0$nUSI)ii@RP0g?N9q-E>6xx2r&HH#x&>=SaHR*Rw%YV{f=udl-1{t_&Uw zKF?Gz_$2EH<24T7yG#dz4*@>-sM>qf9)R2$9lY%Z5pnKq3|QV!H{U+zaMujzQKMpzF`E#H%5T~(w>UsGJeQ>-Bl?N zlloUn-0#kB==U-2Val|@erfq@sN#NW_Ua#IYUL}MaS6d z!7E)oHwCrcg_5mnUzWxxx!i^KzSNARDXz(F(WBlhr!Q&+*R9#>DjjyEI-wi|Z9(<@ zxJj=juA=vt#mREK&-b$%E1hV41|lAYKGIM_k)I*D%wH3UZVVMzIgc^`*#Z1kYU=9(n@GD>lp;n58c!_N#KXNCXC~CajLR zSj?j@RQC5w?@uQ>j{)5EPEzIj_AV?>gHPf<(Uw6so~_97t*_*t0UbfOs(c||sK^!s zh!A8;`S)^?PZH{D-Hxty$;*hoV?2`6x9H^T66|4EmY<)$JP&%lBzQ9K8!N3JzF(K+ zkiq+P&gJWm_bc5^sp)Nj>!M$8UZMMP@O~Wt@7K@<%ft6;-!AECle>3fMk5nN#~#aR zSDQ5}T<05K#F>5PGjvwqK^sd|UR%K&lw5;3pl_xC2Q)0W_7iu_OYy@2{WG{`#)tWQG!R@1QG!8Hje zxaJ-Jf@|(ja1CD(7F-Jl!8Pii!L_tu1x;9R4Nkj8?$0_5uKl208y^JM0ujx)=Rt4{ z7e6Gs3kt3g0p7|g6kNN?qz-7;u;AJ)`zbi>I^Zz4)X^+_Da(-zEq~FbS%AQ{g z&=dnBID<4>tuNF2P)U_hFQOELs@=aWTZ!Z^Vk#i-iZcxlu6+n*bf?UJ18CR%Q}!UZ z=6l2dJ>^qgiI~WEhdSTqYVxCUEsbb)nnmKG8i|XWT91>8wE^vVC6|QG!je+N<9xO> z-#zW@*uisYEXb-aD6yQbisa>_1)Hb>={NL}gq=9?me_>BMlio6*#`Oq(XdvvU8XYu~cFubbL-TO`9WlEFJRg+@GXFoPzB- zShe#Rkauy3^uPOgy{tATa*`(Al=r$IL_T=wWK51{XxB{t_gxu^+d|2A5kKCDXy+?7 z45i<^Z#rNSp3fU5Kbo7AZM$)0T`hP`Lv`MIBdtu{8>YnHxD`b9uhJphzh>utx$XV4 zt#HP{|Nq9Vu%@yGkg!1$)~9E0H6HToQC5KLocodN97KdU$j(9U;s0f8;UN;{_8;OQ z8$ZHx|12I7eo%r4j4`Mqqgc;?F@_j~=VVe?P7_V^vz}ys?A?BC9Bq4)|FMyF@e}He zUPAz*D&c7lMCIDJ1!NH7MU6{lS5t-?U95kRLE3+&L&9Lgkpuyj>OH8rYRY*+6WrN& zMr#rM?iOtV`f-OJ?ST#2kNJlUI>aFwZ(v=;o(0=Y%$z_uMGb; z8^Q_tw*Q+A`ENEv?*EN!2>0&}%z+O$awDu(hUJOJc1|s!_GVkk`9)}3R*~W-`w&-T zC2GEMF{vW*`{J4}pMW}F_sZdO@-r`NJ zSJq)WXDoqZi4<_YX*Tv9P(JcG=VTLrGp6#&8|vKEJJwD&EO$B$b*nz0AY-&jkviid zbB@!6Xh(+_nb0ry2YglLVP&aIBdo0MUaelSOh0#hRQYD0SEi5Oyc)}Sva%TGYgCeh zGpG;TvujJjM?T|!J$u&`$sPCVvet!5{d`yX7Eb29SvR}gu(tSJ&DB-PN;ew!8@qjz zShUyofoW9obFJzt#q{TdXPcMB6hA4lu(_v+_TRyuA6NeX3plo7%8_FNOO4+@R*Qd4 z*8LG1)BUH|m^TO57+QdhF?(P=JiA3>5W|ZTMPtWb(vz)%xH=X0$)e4TWIR~W%Rj0pJ(w2T>5Z-Oa0GtTn<5gXG!vbvIIu>Jrg{cFigd-N&cf#kPynHx<^ z!CBXC04cG>6_rJ)^;tfs6UZ_^nGpr%6rtQ0xOn1W4t$C z4pGQOV^v*r$~8m78o1a=`q~;4#Uzt|-u=q*dJPG?gN5vp-8zITD1Prv|Ixpji8sD{ zsxayCHHE6!i-hDflN1#KME74g3D>Sr%oG}fYSopd83~2-X9TF8G*6=`U3kr##w3+V zd7j_u`o6YsqN(b0%p-dK)%Uz^Vds$=Of$mC+TIfzGnG@2Uru6WHemv|0te(yr?zI! zCu*2gMZVU&QRl=_{RCIg4e?IlR|c~!0{+k_Z+C=C%uAKrY^@oWhN2Wi|Iaum!=rPB z{)K}hjk!K4L61ycy~hW2S;Yw+r2c)qoQV(Bh}rA%Q90vXBwiusoNwoNex3$Zv#(I= zj`}@orJ_DY+?iJ%XAug@IB8HVTU@L%oTVQWBP_MvQ6w5=>&JcNjZ#vj8-x2apR0JR zc|Cv4l!$jAI9Izsy+dndD2>g0biwwyUov@f*GkHl1Vhy!*1=eRcI2 zM2#UnpvK$-)R=idjoAj&7<6TO?QLmYk^ZyG1f2u#*n~;Cs%O*$X3Rmi>S)1J8SIhA zGTAJFo!p$;pVW-71%}s zUO{vZBj{G`b*S-|Wo&u+d2&+antVe`uQJzb3S2e%M~}X#U3Q(e&?ShWOP{Y1(nLLH z;@N6}gF?s)>IB=K`vhi4bgB?(>+Uw)WWM(ir;+TUii*B()on_y(HDxsE47d!O2IyS z!3G>7|1md)`*(-$zy}-|u<~K`psNN)e9a4G$d|W@r|F5>BVNVNPrMLHvFHeI_yq1( z_cjf-necKxaC_mta7RdRE`}TPlQqT@&QP0}NKD&-o~J&+11X;Bvy1se&5P_+V!dZ!2NK^_G9mr5CdcgLQ0X%d2_7g6XovJu&Yd;a zCo=XuiEf4Hgx(;JZ;~on@wIP%NL8O@(y!wZ^gT{f6m&fS+u=0$^Usv!U(<3&?~IO8 zjvo=?aS~#Qr3CNL4m7YllI(Y<-y`8?Z9cLcr79ffGvli&tWTS)31?6BdL((Jy95oZG4TCUp=tINK%)>Aiq zg-}Hz2P&ll(LtrOsgasEW?{Br)rq`QZdY5>)5W9lH*^tRj&=qSWuF;YiQ%~*--(*b z5Flb`->7*N=Q~R8s*9RroclYI+ddC;C)(I-ZO>>`>*XaBk1U;w7ea`qGH1r{`u?uj z=Y(Nca3h1?-t$m2gI#2|d-AK5s^=TNMW5P9_-k0!p7W`>mt1nGs7`inG2p44kbh#k zD(hXN%d-dPG19C$rfbB+b?iLf7gr1J$EuUG>qw+>=2uAEzb&?SqS?pc!BbX0i%OZO z48gK;nxfS;6fJj@dIzFVs8RavvxkjcGoVrWya5s3gmoQ{%%gA&oTX%{+r_Mm#-f|V zMK2`?QG`?!(h0y*+lnBa7Dj2g%#F^VBHIm7TH<}~ejb2vpOsW&L(=v>*`EoC#A3|6 zOrSaX(kRTf`2>wRA%D2x4d(^Y<~**3bC`}_;}Ui`%d57%{S!YcD(=CQ=S%#Gh!$Yz z{o_7q?%y4z10Qf?=!HhsD*)x$AJ}L(8RTLwkOJPo1zrUQWy(jZgrzsj#D=>UJJQW5 z8_+hS$&gX5u<7k{#eYwX?<{!w){`McM~=eRKb!21{o|&lfDHetks*6b700LUvUvtp zQY6}GeKFDea~%57L=TG+3Lb!MVi%4|M)&l)f5ieww#$C@AKl2C)gPlvVC#|rAO zePv%<`SvRKQ|h_5ykDtJ#YBrB`vk z{6lb}q5V^^(fT3SFcAg(1hc$5#mf5d zfOysXlXxWnBVLVGEPGYdEky6Wm+uNc@qSV2uCjYz?!tnOd&^Q7KKd$kq^f%oGL`Vm zZK4y3nQm)WZ?m(w6`4fWIwe&oKc1_+|N6tNZUKmRwc;`oI`I?^9wdkffxv@UZ{(zs zf($#{zrB*L5i9|vURQdYDxui%*nMuQ9lkUOJUF}yz=Kn8@L*8F1Mam6ent1MF$f$D zUD6ZJ)SgYSO><^mueEoTC$s$l9&~#;IXko<%?|?)4(X-#j|`P^QY5gDrIbxyrVV_j z_VE(>OCzTyc{*EumN~}g9vg!Duel-Om1z?MsZ3!PayHk z&?;eWd7_kMBR%2v?jE^rgULt@UN1rOg|GCAN;XpExmXd#XM~KcvGWz1Bcf$Pa{W;6 zDqz>e8@|5fPtaV*P!MTz)gk1KkA0>fo!k|RD~h<1o&cS;M^ExDKZ-Y44Hn&7I%9BS zTj^1U=V>eCwq)VsNoqc;N1ri;qgna?UsO zKA;~#O0wS5yLZzu@6FN{$=2O5J<678#5c(N*R_BrQ3RFXq@$`yD$Z&%4~5SH{`8st zimD7{+|{+Lh#n&^TlSg@o)HdG-v=MR)aCkogm|?!>5+%olZiN{1p`?>&8Zu+&Hhwq zdPuy|$B*p2PWi=pE~@si8Y-to_gs>d?a&9k2ex-WJHK?#1;0HfH3&Q?EipYdA^Q_N zXpfzyg(dc|Og=cv$56_n7;%L0jtHyhE5XbAP@E429`ps^!Tcn3ItV-nT3C4@@L-gs zvO<1r5d&SQkH64q=&wj!7+h@sOSexuQnj{O$=u~_tf`Nu76Nhh)@2) zOMm4?cIp@Npou`TbDSS3y_#yh!~~wO^Stp{CEl5(mKqSeqm!O0PFxoHCAURfamR2~ z?CmE-InK&Vv3rr`H|#{$VP&p4ZYZ|cV7%u4<45|h$-h57(*J+Vb`4#W$ctN{6gA&y z)Jsjx_yU&ImWFjV__B)f{XreHtg8OUW%Z)N(PfqS|JG$S|KBdF{BP&xPEU=zLt_fq z3Z>xYIQO`!SX-8(2pbof6E2* zNHXx)0dz%8&<;4h$M={OQbbRVUORs|CN57UemGyk;-tZ4Ym-EJrRe06Z$V$91YWsC zzjIY{HsIG?T_4-l%1jatxl1SX<%)7AnTfLk?w9r{{8qEmmDLs2+uadKgLiUfAIZi$ zb?IdFp)?s1xil1?KFev1h3YBvj!qEVLtn*uz2}e+mR=V9cug^>QhF0Ev$H9-Gt%*(esFEy??twoeo}nk#MAM1!TYBqD^W!A zcSL1#Om;)B26=BXuGij*K0lu0Q*6V8=UrL7TwdM0^6mA?>sd-`5#6S8hZqr(633f) zI+5fEd;{iw&(=?nNlgp*WW7hc)_mf%AtDQs|C5LGp*Q3nV|DXAwqdpzcYcf#dh6`{ zHqC@9r8NbSg9DM)I=BPcmRC=ipA8d2f=&+n&BfiWV2op<{oTpoh@SWBsnrHfhMmYX z*wt(EJz8qv%y>|0@lw%SS~fBr+y2G+8Bl6r_Z?npVKtF+tkeQHn*{ndrYDz&D_6X% zj?f6`|DHxLc1R-_7x+OVsIg2w2WSL|iKIVh1e&TZ5BhlyXax7jy~`|N{X8!!rOEJi z#y+Fscqb{L*M!O2K>a+=3EsJ777icu^PDZ&4+H%?26V2|SAWt7$n2b9Gy-NAji9Y9 zXUPHd^XRg0dfJw9Nf5Jyl3RrLG?jzF3{oBj|- zzz%Q(1&26-i!dAk1{_Cl{m*a&ke@veQIgwQ5%}2!AwPQngAr8GgS{$L&>Xaf3MzV3 z;T1i6kX99;#}&c7$Pi{CMqA84#c47gfLQCDrFY@Zl2^)D(@G;xN}Y<$J~>atk_yN% zs(k(+s*^Gc)pCOzBdnHt4$3h`%ULCG8E|fuCNx%LV{$$bktc`PuSnnKn>XL6xD6IH zC1+D*_dBiL_G{kaK`xc5=Crejfhu~eKt<2chw+Hrx~@#Q%q;B7Dfz)BS?lNX1JkxA zqgb5p8VH}xY?$GCa~ZH-pMBzy?mokIIxvT{FbI$6!>L=n=)sB3(!}S|QmB`1Z(d0~ z(`uo1LV&15ogY99Ps4gGfVm0QYr%pHdM#k)rZ!-1f_g2my@SUCITizI>Sxb5_VUf* z?;A#JkReNk*SL(np%SWp@24;1=ncRu-$97+d*VT_g0UpXdO_g3wO7lm;9?kpMMK+4Ji&C5mnX{R!>mKFXJf6n07p*q`q_O{ zXtL_J_Gr-P2y{Ceo^|)_S-Vt#6{MWvn30VuGej-1G$U)6@fiuG8ib&^=d#bl5 zU5NCl(#NGS_~4#eyawGY5C8B)4#~>_x9J7n*uu+9;Xu2MA9xJ+Q^zw{Wd}yJ3fQKb3`e=Aw;x zzUq9%s?l>kT`onX_R*%9nT#s0M9i&7#f4=}RUwGeS4PE2?P7){m^1Kp>`Rr(2;UAX zm$?E1q$KqWBYX&lD@isKqyxi1Nh%;99C^lXv9X`L@uXQFg9@8SpoO&L)E23~$E?%h z1=opJ>t<+dYCOv#JwXYXBsE`@-)&+)Dt4>vnL8WmG{S@}j~AwR{VNro_yWzB)UUdn z0#i?MT*+b`30fCSzTAFe`B17{B461!GERiq_O>YhvL-kKWV)@FJW^6U%0UKvOb6wYJnrPx4Q9lyP_D}FNg4Rt4d>wlTzQ#NNU&kGQ zuU`T1b?KjguOqdekLg+TK;Y|Lhv^^S>lIrFe0@>AG=Oht3j$xOAA+wDqgsTIgRiA7 zQI9tAtlojn0ATtlWu4sSJU{Koe#w<+B349-Kh1mj+Bhpo`~|6&7po6;J<`?&h?CNI z-*~qBKsQyjA2(G{>(ei-hSFVP<}g7=lV67TacG>}TQ&#NEI;in|G;PwfD&v$ls;({ z>_hUk&QJ1nFr0jyq;_~yC4k>l4SZlXRd0yKA_d)4FN2$^hC(r3SN${YHl--}mG_e> z%0NfzQ!ahAimS%@=*c%{F-S)ujA2M$t`X8kF*XtVp(Bj|9VtcvM7ZHPQYc{b9g?s2 zE&=j&<^lP7GVN;{BqaUgn<~%mjwXT+I5Pc0mFkrnsh}3ec8a9W22xEopQ;UxyIU$Q z4n1bFAi{rxaOT@>UOby-J$JX|hTC?N)at38%_1+bo3zl?luq=Ny4*I##?#a9cg4`0 z44qfACRVbE=xX8m7}@nY(sDpO8kd3ain@GHYm;1vF}rf*;*BP0vCK z9(6@D!2GQFr>9i#jUAt%$KUzx?-0rUT#TPT5aa2A7{5wCBnr*Y zR`?7Zw&=@3IGCYfs|u{iIh_v)6*7C#?CyFIAZRe)MZXg>kx-m_cVE9OS;`(e=*hb& zT7(6riAJ1T938hW4PS5kz#uERBRdk$e8xS$N|Qz5Y^VwWXIZ~B&)C+8$+K_|8S`d9 z?pp(5JW4$Jb51L`7{8`qIyGI@)tjt<2grSyC5W#;&Fy6aBb6Z`p8OK>&`muimQp3h z(;a)RoewCyFZhJ8IYseWo>}C@+-YA>y}nu#G}ZChFxz_2^C>>}r5ok_FJCg6?V)uI zeJvcAGiUOmymh0<-edd&8UUSY)PJW1pi^Sr7)Xpyza~JoW7JKDw;GY-3--f-jgeKA z(}L<*v0WBAUL6($F%1TyuR=aGuFn2)NgeokNi_wRRLlrtVlYBc1~OqIl;s|{q(UQf z=axShp^C>xsNo+ksXs<&IvAm3{U>8@-;O)eg^wE@LhNxjm(N4}zFk|Pw!7Iz(fMGmh1m@(_&GF2K5AGaXKtvy5tJzlL*D%k=m&C}`6 zH&L)uaJC$XDqq?t%b{S3eMrO_ltkaWiD*=fZ(`SvVu~3kA{GmAPR&~_qMUJr{f~j@Sj(ybv)~rm}+z_oX&Kdn-i$}Ly zsDM&s+R?*2LW^eBl+8x$@q9PcBV|To7fUQ0sf(q&0mD^?#fVClY@K#gqv&R!tkBK* zr>zAYU+x(BJ9g-4&?U-qL^lS+!L%q^9d69ke>FgVO-&wMLU*L#z(2Sam2^)_G&FZh z%E4!USB41x)Znot^r)!sb~r$1gu+%kYk-?cQ9el_3ws;?*4k%H}kP=n3z9kDYGa=EKMN_)+n!kpdnaT$y z*5>i(_kfw{DPJWN9*?1(EaDIiGyNFyoIocvjGFZ!cM$=}NdaL*bN`ts;&%f6!b6u! zDO=cSkQ$OdN3)^dLl>4H+OlD%SxvklRV6ddsNR=rC1|KsfFM>Ce!^zeSo54F#j>Hg zsG|5a4zrJlMISzDU8uRxXt@yI(UuL^e;U5hPjvzNFZ)!nTrPNQt8-gxJW>OXZEJ2B zaenp*l)AQ+q`=48&%Z${=(Kg6yTd#_DsPB0^18n0ik*h3UlxOWDH`9qTT};IIUAYwq6lX9{%Z$J8C?VS0MPpL)Fm)jAz{w;bX5IC>H9 z(p?Tz@l@)z>n2KdoHJZ9h}EPelI$`?S=G0{5U4(|=O`h#@ElD%2A%PS_gGi*E$y=s zrY($>7qKsw0+dxUt3ob5Iq2zv)+&o_z@{C97hA|lhzarC_ zg&O;s$v%gQ_t(=voE*v8uAwXIB6?M4-H9yjff}ghUix<%=&$L^{|?Zf1Ju4+ zyWmVQaMN3RjV`s_C#Ve<;?m+1hTB1N-h1QSYMc*AlmREoP9?_7WKPHpdb&b@1nveE znJF}fxj_dm@`t7=6JZ9%DS3^KC7p34m9`mt^+C_OHeEJuc|_xG!iV_=yH5ma{(fz( z2>h}2oK4F1o&x^mI{j~yZ&1x|A}0~YhMP+*5q&m68}g!U4#Yg^I;_$_OF+L#VAxys zIje6z0Te_xNaXx^jR-eFJ5jph&z*9pF+zJD<5QT9sx5U+>y$NnKFZoi6nUi78 zb1{d*$VV58{#Q4sE^vb`U;E((y;$Z*<8S%;^X&|I*$2glOD&HN-JpmiwU8S$g=>i7 zy~)HjM@XWTgnEHS&g}B%T`78OQTjJSt#>DCH`yPF#-)Gwf<9SeH-#7{a#_#tK^1FE zu>GZsE36wk70q8tH!rtRe=`pFSX|~AdvDK zZL>EE$(NqA-ksOxtXRXr9RO1P^82XTj2M`dA7W+O4Gx%Y)|%1t{czSwX=Q z{=*L|s1A6-BmMOg{$wNBrKeB#F;^+RKAwE~t*>VvX5N0+m2>sq4ba~m&*V84&-}Xu zl>Q$spqdu9yhlWG4UAV+t+EK^UO#zEznGG-yjL?%c^`+lLZ?8(;cfJ#!8K7b&qb2G z^vN#2Pxv7+`6W^{a*`$Nn<3+>G90J-s#mVK6OTBFjM}>URzyv?@w5=V3c9$$bxlYR zCnznwXm)|&e`En=-eG_L?-tNs1De0Q;6ZWupTFP_?evE)_zid5!d6n~3Yv8Af|uKQ zF(ZVvrpTJS^!XvZ0zG)ahy39MpY(?p{0PP0+v)8dJQn$co=kB+_^KVK?LgwdH!@c* zbT4tAZJJ1K9d5}3FL)Q|1z%Nxdia9Zx&&VEWTBhmjP1M!FZf~#?{hww?9dCI7<$3? zT4*G~U+@NL;06EKm|O5hxn7<=0W?3ITn3jmiV145q4_CtY<@7jE$$Y=akdO!)bQVt_;Wvzkv+$on?DtKBYRqqbAAhSwBX~%LHcJe`2RG* z$?+4yS)|kov>yU7me>(!W0WD;Si&XkN?RSl$CdFK4GjXLliZvWh?gu2p% zGtv01h=W=}SxO^rvtHhQJ0W@-jkr2l1I4I^H#PDt)CctK>qD<0Dx2USpFb<4zwD>W->ythQomlAetzI@ zSz?#=-T+^jX09Ii_fHzO`GW0+nt0Tcg*rl@OX@|U8@cw#r zg#zuNjw`4bf?%Ecy=~F7bzMSDkHVdk;6Zt@j*La1)*2o(UpYYY^&M!wPV{gB5Bwz1 z17FVS#`g!lC-A`M1s?bc8awG%4}1y!3oQsdBhUk%2lT+N9m}hp13mDGT4aC+zG#l6 z!(01|nL_Y>`q<%L?56`C62bc^12A8sSaEbo-{E}UPa&`N)1=OC`{|39%2)d-7I;6E z^J>nbd%1J9p8|z9xT@m7eu{p*pF;CIeXYX*-cNy4R`7nBfcx3x7OFugV{qzkx2w)Co}C6n>ADCckAXu77A9ssn`^fpSk%EH| zXr(=@HqXUQeh{tH!r{tKi~a7&eLtP|pymjhwP(>}U%OD(j?yD$d~O2G5qU#7Uwx9= zPIT~1g`ho38}0+~A+qXEpU#_K#8c)TX~@3em(ua&5j-Tps~ zSF51J=ikRG^SANJ|K)1D9)QQI{I(hPKig0LBUY#%9W_6Bp_2Z9LH%io0nFeypCCO^{{Y6?OhkK&5pi|~dpA{-DWuapC{=Vt zSHfJChAYjy&EQeKS)KDc2QJZ=F;wh(UW=|rA2g&&*f7%tarH?&uz~_RW9m@hRD^YR z`o&{Hl)S7`j<;`pMe`?wOOy?s(`(f5BeU9EYldkJQt5DVMyO0~shB&>0bjw#drX~VQCQH?>9@z~uhyiWJpA2h;Ls(| z@g7R5_`7Z@037cT{{%z*tF;xRoBm3H{+({hKcn5cOm##2#H#NV4RCnkO&OA32M$ll zSGwr}NH@je;l}}VQ*n}IIIwQ259p@-AlkZ$UU)s?W_DhiBM;Vw&;Vf*vt{dADQG^gTU8ccJp45t174W-qj z;S}KeXmwMc9&_yItol*(n^4t!ib?`KMlcTb0gE{cghPFEm_ECBB7ci%0gOXAz&H0i zRKY`Mpz~bSfE&V3y5X41dnP!b><>Y4L31&aL_6zB~lrlQkKhC5p~ zT#(k&*<`~09*5#z8f%ok@CV~idMscZO12I<6mpFch-J#&pp}ZH=h5z2Qh5z>8y+RkCj{|k7!2%;@-OD(dH$Ta6hbRHDOht;pk=B-X zZVSMUlPAjD6$7=>nm{4V=&?IVBu|JbYO)0G^gT0S5}wFOgj3Xa0AiWyh;9UEXsz=3 zrHyCV5!Q?%pfUIF8Ch-)E$uAa!MB~!yJkR5kFdsO>;$ z_l?ia*K-y8?*H>#UHdjyRrust2a$1X&B|2Hj!Zo3m*`$cgoI*~(ZY2U;LgI6)D=tD z*S|ecTJ2jCwhnOg8Nf2*C799jqG>A9-5b0IH)bAOjX+GW%OiXv>!xox;`8miW} zT)o)rfC??li`&wX5xrP3)L;V=iqlhcdbtGuc4V-ey&NRnARyP6OAR7dH^H& zFfyO(3C0)jTn#H-fBetp>fb`9|KHEm{g3~htN)#=|FOAxXMMu|pUu_(G-k^26K0yE z#1FJupwFLRPoPj=?W=~aM(J2gWSq|UL92w*3{Sm=U~?=K;00pMPS1Ac`RB2>j;jsq zX55Vwg_2EM*kWDG>=~C%HZCj?t=ttWY2OCtet>;T;#8A(?3wa;GSB%@a*3LB6G`ta z>)YPj!MpfJB>J;c``E_soC}yNm~Up;>h-&k1F#W15kRH<27ul*3~JeZ^tDvCgquvf z_Gv=it8Ooukmtgc_h4uIrg8Y-*8FSB31(0=I~K^AR_S|id_2*Bopn{-FjFu=@J_7M z6L1zDBO1IDBCxZ1{PxcJD|h-AQh>$p-1>hsOMSofZ(rT|!BW6q-}?V71^jU9|8ADL zzV-iTmdXLlQuWlLb3XmPQ?J+y9~3=!z2}-!?%+tp=A0ANP7<+bVFR((g{O-Ca!Q3G zEX2x2f~-*;Daht+qS1H1DH(FoYKWE}V5<;#$TJ@M$b8wU!t*69flJDU=s*~LF=xUp zaB@k)o#U_jq#e6tXtFqRLsy1V+Ak?E4?u=f%;PJ=>D&E|bZPQA5_Ji{Z(6)wGoM5F zxlrkD+Sr$`6geQjDJ0-G4XaP6Shgk2LrKt>+uC(?LX7e}y|185So6Ebez9-I{=xrC z$NqsoANwbRonimCj{Q5a_r+ePD3QdSfJ(!)zY?#7UzCZs*PCZn6T^;qNN(=EXwuKI z7l`xU81ueO|4nK&07klpl0 zsTKKJYVCpzIJ(vXhyg8N;qSBneqyi|u=S%B@EWPJ8}279fG#Mp>$?_!@z+|wv2ENx zG)w)bu~Uwpu+zVrtysT1TT3xNojG|``BpVhYhhc8s~kdYqSt8;o;Jy!ZoRDwTnDn0 z?E>~;6X5lESL($*5vDk*AH!<8&C?=hAC{XZZ6k&hBFS;hF{qlI&wn|5zU_`~BF7mG zvnLoRT4^mWYX#X##Kv?d5!FO?{P;gPThktwwg0o(`uD)82dIDdFH@m@HKP9Lqxx<{ z1^K7|BP#fe_18w!KcBIFFrt3S0o9^k z_D*FK7y16|01EL1R~m@v?|lz2{cBfDe@Og8^M&Sz$%kJEAdP*~q8bzn6q*gX&E)E5 zoQ`D)?Y=YpC->fjY<6fegPH#4jRJzwd#5cTQGP22ID!E%igidAR8KjB2Vdv46Fpxe z^mCl4di<~AQJUYg1>QGcA~qC1F>rmTHfKX#Wq=j*==?mC!Jynq579C(<3@9jvI-t1 z10D1?JzxVD&;!UodcfE>J-}!x3akf^f%O1HkRG7?qaF|f=mB-tdcf(G9^kVE)&oRg zD2%@A0W5!~2e<%wzClyXG-|P%)l5pTxI?hq8&tzNyT}TIgl!|lelCx2Y(#+8 za)`K(lrZO<2TFzdrUzsJsZbk0DpU=S3U#Fi+)nv$tq1%@Jj(xE;?!~>hWX#`tv?W_ z{}DOh2jcW6HNfW2wH$RSX-I@ETF6#qKrM%2q7yd?e4i9c3vF7eyT|CM`NGt=8UDCL zHw7lod{vkh>_>}RdrOBd2Q1nju=%D|-4zTwmJeIbF05sWs*2?Au07j`?eo(NT7%kB zN2&H*jWE({$(A`nBO@%rsC=RFj_~!Jro@HQG8hy&a!kZDD_>Fs9V6F%!Nr`O+i9k|IG(W63YJ6N`h?Y+paVU|5xNXjZa$aeO-DUDc zFwt~_lM?O%n3j)!_mK|#1OI!k|L?v2k95)h-s}HgyVw7?+x$dq#zcbMO8&cielZU^ zpJrhT&nST1N}nJs5~`<1jqjt(`?|T#6_t{TL8CUWJT6a?ycipAV*ix=I45a9gCz`) zTKl!qERPZ65E|!=YD{$tx-v-GD&0=}_Idtw&&8qB+1dkk`Pe>KJ>?$e!aI1;b+dTx z-5Rz!WhSKCDs*=@)3GeJbmd3xi81B{r+KL&^Bf`ty=PkJpkFIGWe|Twz@GR7fdcj} zxvKfScW!qK@O+#RY_r3|qNr956rzw?DPd}wgBgWoRS`DP*=}`dV_;PZCR{*A(eQ<= z>q#$pX)hgFJTE)(jN%jIgGm&q^VKuHbMs{}0bK3JU>);hJ@W+%uuQ@MB-w8Tk#hbD zeg3jhvP0#M7877PDW`2$Ai`@nKaSYGId#?73lrP!DNO$Pe8(V!JlsBJo-V;RfE?`Bxzd=%-o%3*mqGVQ%{PlBD zr40v6@5AU_0|dUL_cmdl4K?{io>Nr_mChX|9(b3bZ-9FcC72dL#@ceLtFx*)BVvKq zuY=N3Zlb|!z2U=N4OBOR2$g4sTH2F0;X{dXjcYpzT=UjGo{lt*YyXwtICmtkn(!kVA^tnQ?I;be%)GHj-l`iK#(A+(m0I(zfOhkEe== z0+W>N&H5&A519rPjC#WTNX!2enui7o&9lg%2ZiQ^eGAQN1cm1L{iD!499I zu&1efAI)`Qfs9OVcwCP``J>R-`&BPfc!PJP?_?5=3c66=xfSy4ikA0yoNhM-&!rx7 zje0uvmRzBps<*2P6o)`c>(7X75_apsrGX6wj#wf|!Jp+84yXqRX=@cz&c}bGA47^1- zHj}C}CKUKw0mjf5=Q_C>(^{(aeB67drN&eR#kB9}>=MhUHQPntxJ^NKo9V5-m2ID* zx3WqWdJu{uQfh8`f(RqkckOmx+k7U~Vz^}}8x1)jkL=Ppp0z_U8_RL3PwU{GHImSu zmuYFuo2KYViV)T7b0E7@;iIx!=ftfXspXPhH?&PG83v_7qMD1)If3_l>BA>=f`LlI ze)MM3ErubNX>NganJ^Di?v-(6O4`AbsW0;Rid<^yN@fin%NC+rRXGG)(-#$!0|qJf z^6F_G;o-Kz2nb{!e4MaEj&Yzvc+W^0yHC4b^vlOGpx(-C0`G;d&MJdIK2E#e-V1*P zHGec5L37J|@@C}*r-fV@jHn%vGZN-w*?Y)xF;`aIOHhVAnbzg5kg&)?y>;sF8#nYQRA9)huO$$d4u4_GXVC< z_kd#Oi&pxh1Np9E=PN*lqY=xhx$#*ibMME(IbA;vJ?uiwl9c)$*PLn>M>;myE_q<+ z9nV?;CFR1{zLXqQM@B1JT_cjaNo|j@*r}`leenTUUkr$dYEtZz1oXw6P(8c)Q_4`z z*=H}x4US_%$LYsDxo_<^fQDX9g>?yIvDS5FXbO-SN`IXhYT(o>OR>X6Z$=%x!Wr1H z919+LMpr{G12pvRwh9W?)0+dNd#QYT^uD$04YfI4dXT;-aen@kLBHWjUzCstUoDxC z2vuEz^X(h5Fjb+riknBK>jdKF5$gAGrfrEOKnBh;Aa4FXC~h8q%CMb}2^2T~SOJKe zk8$Y*`{RKu*SSe>+@@(HxKg1V_y5?BOt!}<4*v8{0+k= z2;MdISN`~-(Yg$pDKFg=8#1puQXFknP_3i#t|_Fw>i{4U^+=Z^{ev?S!GbMxTg^F2=t?`UX{fpaC< zp%j+p6%b_?7j|_16=J=dMJCMuDkB8@6*zYp$Osv~&Is|67FDtX8I5=WqY+;JoT%PI z+gg*LN3wPBp(KFO=op=7R5gNrzLo+z!qtB=b0Nh^t}w|08{pBL=z4Ju^)tJ zdT_y)%^>b`Zbh z95#>p90;5D&6q6<2ZhZ)yr~Hen-BSfo&nXIb^8n(FvttO;XjlQy97Hp-D+ftjsI;( z$d7aHCxTKov<%gU>86-#bGmyy-wS5Q11%1!S8vgBg;Jk3Va{lrKMD$>H{;X&dnOdn?!9Q;rGk(8j`}mHk39h~(Tr$0TL>1X&N{*DX2&8ERY+8#*dr z`j{<(rqBBUp!5PXeSp%7gFi|yfa#;l&H0nv@!w(M-|ddt-|db=>i{MW*d0ARw~N2o z9YL7*Pj*KzCjP74@fs8VW_MHu*&Q=MIU7N@z3Bde(it2045oCljM$~wA1jvJVm-(D z;1s)a*kN*a-lbP0%6Dw+>bik&LFH8wELTedx^5r?*A4hHe$y%uaz0}9JRoReJ-DK5 z{%ZcD&A)Ew1to2yg65Bt>qDG5UGRP5m-&OfUNR~XY66-+D{QR!AVQq`nh>Y;)ddJ~ zf^G~jA?^zz#C3lp#05Zv`28zF{82DKh(FX2(fDWs5aNsgA#V5y@rn>f`CCF<4Isp| zuL*HMn3mc3;DD!E<@0J5^CPPto9i5xu;6Myg!rNm5K;sX;&igrr(6q1AVORzVtf-I z#1k5CNA6*TGdosSE*;x>B2%Nk&jp1Pt#BlRvWkg-tl}IXtN2cCcnNScHh8S}g?P;y zI2xb4HY2nK0LLpnr%|BgL=8V%0=ljSWFSWZ4CJRE1G)51fFs%$r`^EjGyrhq9GMK( z1^~wgQ9D;z#r(d{onk;)#SUV|x{EhJS;Za1_)>bqpCJCd(Gm5V(NQ8}f?8aPqblRM z{P)~Lyjq! zEFIICr@vw7DPLEAEVu47KLOVigEliAd^ZvvuJ^rdiOs9Bu;aK>3hkh2`XUN7p(+mJ zLSa6EhYM`7qkNQuagWQi?w-Wn9~}A|)B50fMucvsOXr%NOg}M7ek_jjZAl@mN0Wy_ zH|6SCF)YiZxEnM0f+Lrda1#)TZboaEAfHPyBYePqugYo8oFm|xM>JdPhHp@6V-zTO zuebskFWrVjmUuDc!)eMr*JqF~UNbfu9M?08SSN&oo}qPTtMBcoJ-tNT(wm7nQs9~L zTim4;2yC#OL?6Uqj~;TR2{NVVytFnC_yUd+_Jk(W0!0by|MuebE1;-&6+(G_GpWf6 z@`#Veo6KW@8G0ckRp7bH(_ouXDW#{UhjHkEgm;M+Z`T$IHh z2Xeg^xW{a-2O}WsZT#kJd*LE5TN?+1vc$%fQgr#z!ear!gp?FTj-$;1(=l!SfjYQo znNNob(L0SH>Cv`Amfp$zNE5l^41DK{&J$5{`?7Dg6S-bdvA}mz=2T^WNKvLIRzr21 z7_fX|qwaXliF^>U65Tw~0AAGTmmdgBP=P@YSEVhhOgQLAB}n z>pPy$$=wONSCYq?>KiYNit+9amMWu>sJ@#cgp%_qpYn*>&c{855SJvLY&Iy-xj`5) z!e9jtC^4?m9x16*zBk)+9#op@RY<47#}tZb0caNVvQLQYV1jgdE8rf9BWF0k=#k6U zk9sKBa!rURQSfd#vb8tiRJDBWFb{NQ-()Xm5Em)5nr_INfVGL}RYi^J4k0qw-@1u@hzcCQq=b|j?4e@)7@^m|{xPRBr>|5nDw7&+hV18Me3 zDVlM7{qrgG5UBBuFIlUHHl&{>D|w08Iz{i!5|N)C;zd&xh!9bjOx}QV+edlU!9;Z6 z{mvLI+aQ!oWRXKktb^&^)BAJPZRzssEoyifd_4r=tU``xT63e+AyRpT4~Zv#8}!Vx=8R=283M>K6ufLc2b}ddMhebfA;CpEAd0eU@mM{zp$77+2*qD1YI=eR=)K<8ikj!nBaoujpbJyD4+$u0 zcXM1GIMcRx5-JPWa5KK?svuaeJ}-I^g?Q9TkZ}jLW&9OP)*-s)$XM;+^5k7A%sCO# zyhAQTA&=f;CYWTIgKCLKbQ)*It<+w2+^ir)ZT;ZnM-WIXrqqrV%;BAtn3~%J+ zx*c*LVQ_+zC}9iK3*v0g=JN`Z=8$CPEvSG7@tOoHpg~+58-|i22K2b>10I*pK#$Ay zVUVJ>x#tSijV?mvo)HUD)Z~*~sy4ui8X6^_sB!YBRXp>ziVN8?toDLR8bp2M=^SMU zHm{8RU|w+r);q9y1=(-(T{noq{uJ;lgZq@h1E)ORd zhYMN|$YLw>noo{3<30#t!McW6guxKY(|-xEM1dfd$}5N^2QaNP`GX)98~|du4}w_q z{xQTN0@1KI1cq2_VkU@W2QLc15K9-R(}(C!5DU=hQv~Ytnce~*7U*k;W#W6M51^^B z0-D<679Ll$t4^QVUQkT>X&XEZJSZl8o&Q@*I_Pc5ewEyUza)801GLTKy6YP|P8 zo9Zfvr+i>Fb_fG{D6$iSl!PQQT)+^E1X_xZC8k_9OVqvw(xz9`~J&a_9M`4cZtloos#?+ zoYf^l-1^AyA3ZI9V)uaE&I+{Kxn2f}DD%9vr1s0~?w!bcDl}V59cmratrX7S41K=G z58vfz9!J0Y2>5g&s%XoaFI#QET%MV4NC}YfL!gh;phmM0FE!k@ab-I z$uEYxLzWIhM?tII%Xmb7m1vDy$Zr%`18~`52P}pi#XT>Sc&l~y*xK|7l&)91NSiEc z^2L-@V6|&#^%k9pTP!`De@Rj$E6KgCNTU11@qkk$O^}ptL@zu+9$HPE>jq2_yPOC) zQnqb)b`IkC)05RUV-b;6a7WVMWoar%Qv3bQ?pKEII(p)qj>mHn>H>EIBJ_iM7qT0t z&sV}3Se9xjDk<2Vl4f6pRr5SatQ6c)W5JUhTh7^P=ZXNbbt2rZ=*s!8ngh<>Fl_C{ zGcG9-XgQNRvg@mvVpLd!-giccL!JgGqY8I(&qZt@9v`h$C$KClw=*9j20lF{{bT_} zuKnI_=(9Q-e|Z3tyH!0a3FhL#`-79|v$NpxJas#cgoRB@4)#=IpPc9EhaYWjW;sDC z-8eK=D-|ztdAD&{T(PhkYlm;U-rmC(!7YT!UBoVSnP>=E<``aaTkX`UK60zs=%t-b zP9b*jxz~J<&ci;45c6eI^>&sBbtVkkoQeH?oF>y+G%SOjLps!s!fu!I@+XS(XN)al zn(r1EOA=1|Z-o@3KBkHEAU2WgUj1SzX-CFKK`Z6zGH4b}vq%Wq>^=$ove|9t`xwx| zgun;LGSe)$_*pkd*RmC#?NeV0F2VZNBexo#fj7IZw|EM|vLw#~J`KIFjAbTe;^T(M z%O)C9sf^)$)F7Rqn-fYC0)bJ(dJhAhEIL^T1J&A536pxr{xncPazeFeRA9wZT8(qiB_m!8$^evJx@asU}?6vSRUh@re%e z0Oz|2^>6D^?<&>OwvHm@rXVkE+xkx_&}YnZSkKd_e%SSRjGKyJn~~e6@CnYars0*N zW>^6-?y$Z3Ga7G?TpBB?ttuoGla%yNhzgQYm6es3g8R4_EpHW-AGf(ZpLX|=OcvfP z4PEDd4;7&=|6b>I^CHn7n_bv?Vq;OrQ-!O|&TGeNB1Tc=P8XN!4K0#$Ih7jWgZX&u zTR6^^l=oQRRRx?d#@wgiSq2)fHoLJstDdo%7wvjuJ5Pskv9PNjNq*j7rIvSj&LiFX zfDw18hZh;=jZ;6ge-!^qf9_Bj&sp*q>^Cs5`S!E-g9MVGwN-=nN$rFNA$nNN9V9Z? zD6`53Ls|unmfW3{)L;bp8<2B*HL~JmG8eG2(r+4ims#SY@tw#n^{&3mU4LW3mpuZ3 zMVM2zW|*T{J|Bdkt!2tj_2LLK4MxMNL4u8YlgOcm_cAu_G`#|^*K=p{3|s|p#(38p zRA~15tKCnQy8jNp|Lx)Tt1a)p!|%Vt@4v(E|DoacL+&Hze;Ts`KHwMI-gWAZya*Nw z$i@;s&&6zk2}<3m#;{*gfH+7+8UFfmm zLxPn}sN|HL64TP~Tj{D(O!uA3yx|-kbpgo`nyyhN3I~q`QuZja4oe?HR5LqRjY~jU zZS|>#lWwYUvzbJvqco8P*R!WZ(6u6>)riNp^9KQoBubu2uQ-b1eG+*Rs)sz>Qp4(d zz!{p@jyvCiXMitTAze$9@H2iE z0eM@|@BIGsT|ANE2Lc0Zm!`mKiTI*&f@{Fgu=OoU)a~%cwRQrymsFvF?j^k7Yc04WeAXRLAX$f-Gs*7m z&n4l{yW_87b^ijj`+hHZH2X(9gjo)Cw(ZK-uQR%hvi@JYshm9MX>T`%fGZvW9Hce= z=xZ&2gIHQo)c_TbJfP;9qzQbWxkdr@=?ht#^QqSpE^MQxsZ5Ka15%(^U3LBoH3+;P z<00~D=KhF>5bv^#wS4XVz%I7p>R@uzF>X?~9sQj0M%Vh?C+LXjPS|JiP<21 zQTy_rM`AEU{l3PFAOCCNLLilv=TTggSy>{vH4jG8HM*6T-g-&7Lu1@Dzn#W}0TcGVm>mOM6q@)}sYZCc9 zH;cQGHI-LgtFmO6Qhn1k$>VkNtGjQJ7-dTNyi?1ZEcF-ktaPnxHdUkcsB05xubi@PIQ9MhP8ckv3(pOmAdjD?jp$q=M;m#THHfkZZdj{=gE}!LH_O7`{9!G>;CrRLF8Q* zPZ5SfOu40GsjOf15G8ku)pC$^PRqsDX~eW(-)IVl6!aIKcf587;~tJSPQyG|!G4|E z?V+|+Zo%$d`$4h#qh?seX;8_8?4|OpTQ@d+R?-MyTUPxbXvWb;6vkfJN6zxoE%)Ce z&9%ox6yh3nW`c>8dx$E*%S>NezDM(DLz9k1q^o*z>u9a+;fu!>HN_<*+h1&X-ilSH z_B~YW`5Rk|UwG(uJtrTQghbeG>0?V@ox=n37PjOM8f_C@W1 z;b+pPC-DnciY>o`>g1x^QBUi7S!YsUvuy*sP#ZE=0ts}!&cIdynkRy znox1y*rEMPwZpvtnsX!n{fXBpAF*it*`@KB<%!hf?VH~EjtgfFXrQZv8t zK1=!sKAngx7j*0F5uMkG{#5AO9=NoPvPw>HG9t^HP}Zcdov-0;tNSb)>MC~n=9+cC zM?I(3_jBZ_@?JR7%E70&Yq=}%m^NRE+fOS$dkQ+89!90|4yTiuKv4luJE&6BH)g{m z;U$cRlHQ`fcb_Yt=mx?f{wkk;+DK8!E!#|tWCM-mkoBI)UYGYP-kzHkQkP(zeldzM z;NL@QKmHbfV#;Jg2LMYQy6-NZScPj|`%7<&zJaL3w-q#kPsL|2s{@-FgCe?3T&PZ5 z%tSBB`5$qR;qQ`@@8M{y(CQIP-hcfdG~uQrwpiQdFtZ`i{SU&psEP7pH|6W6!tTnK z)33pj=+VfvSUwXeS;XvJPtWUQU}muAP{Po<*};3f73GpAKp#s{vZ*e#IF%dlaNKST zF$}g5@(|*Ag14LnwaxeGlaaE zpK`PL#PKUe%So&KG(Q;v%+Sohkg(zpD6Pu*Mown$4Le`QpDw(*Q#~gJwSyPq7uwU$ znLoX2ge1mb_vBQql_@Gx47xq%C60W(Fw+91Fy7=7cVH5M{U)oHV8028uCiGRHLD*X zDJ?3NGvGH_a&v@Has~V*V}Re}1p`^V91*KHgd%X25cS5mFHhkFxS9$gXqn!gc0xpR311C`&@WcsbC zrkBx%x*<rJNWl=2l8kJ_1pU~CaK z9B(%G%*oni>r7zrK*7<^jq4+&4zZc688@n>rG8|+DFB6pMZ{*|1Tx{qo>?vb{0nZc?XrZQN~Za(6&aY z^TWszAHf!dKk2H|GB~ju2)q$Q%N|9H{fy^!T|kb*6gu84Jj_|vaWXG)G=IWWFh z%@8Tz805!oqb_@XMebD|H^9Ggn{0yICU`;KD{dgSNro`sHj(IH5`QWOa+?gjZ&Cl| zHn9ZUCM=Pnl`3juxF1vD6UL=9G5KD*<0-_H-DiJ=&?wPqOw$fwq{?=?_8_4priVFV z=y{)ce>a3OAw|TRaa_4d?Jbg~%6^YPqb(ZY8>MP)VH#(7yvvc`lSFETMX%@f^-03D z^#e2LB*FB%ZWFGb;4eR=GFzZmdj2FZDvLp^T~swofx=)*CA*rHrPVv8UA)X9KJ{ba zHq|}_e;h5d1v$=E($UU*{n(B56nD5g4a34c0bdrPA>v+W-KY)eKAk-vCq8gvLwacH z;;oZMR?cdADQck^``~0L&rte&nm+YL=9xgyEhwwBW4r>=@?Mq5NH>_Y_uNt9k(hX-XQBJ>WLFr?oa_~hS?~SKj(RUqAe~*Ef z?V340f0O=%t~9bNEUEky-C=Vk6?HMbv^S3b!>9Z3weS7fuxg;;=aS|1lJsgWms4E` z=X8!2i*&4@mzT4@yk<;Zu;xx_DoH5b-Q*FTt5+0+S7n4h(nsZyg=eOTF@PJ}Ui~^= z+6ISxn|ZhF0a8E<+{%+pScyA@7?K3T&j~sFdf#bCq(f#bQFm^%+bwC_-J;A)dOg7D z3>Av1Ab0_OzxG$ZCou$;I6dHt`n`$zD=en{aGCgK*WxJ+i@RN;Gvh#R(u3;yL37uf zna_Ap87vgxkV?*i=RUYw@h`QYJsrvIpPZplJ%_f?V=!E9gu3-|By^Fh;Pm!zxY$cM z-iwtFJBRgN)BM~P6+JM|(M9QHj8gYiyrc8OKD~9Lg*te>0)$&4Bho_!8lpc%hK_|8 z@Q0mke1<(xNso}tNaRIng8A0+;N;ADfyd~vmX(f<&RaG4iei!sEI$65CLVSfxJCrw zxAiG2eAu^+4&qOCA8kq5o@8&h$~W|5y@FPWntY(#KSUFYZUyhYWy;?iTJpM;&i|y- zc}DBq)MXcc9;RS zZVzTb6II}H!d#W9Kht;*Vvi=fW2_iGlrvAEvr2Dg{F1l9+dPh>R!gvXw#$ggY7+(5 zq&i$gwBuBCz7HRRE1A&y?R==2T@g@Q-9lp5B%{!8Iz?nBI#4l@b%!94X;K?Fq zVTqceC*jH*-3Q-8-jQ*nK6NWO9SxPdX_!3Rw|n*>uV1_o7`E6UH592tdYiMd9ywMM z(xNwJ`?MTaxzV~N{NtFJVsbvJY;?3PqsCGmC+N&eFB}S-d9(RLkvu2KiGVY&ACE&l zQjkCbw4O=uKDph!L5MtlbB8yQ_+v_%cdbfY`8D3{(~y}+eVQNW^T`iZ&F>Naz|TY} zO@f14kiOTFvo2qZrHxZo0S1B6d-4F27y2zo4cJDZ2+}UAyUu zIy&&wIIPjH{@uHj1hNfUtP~Pj0noB%x8^MH&z8Mkk*=I9ysvT! z$x}ahMVPj@r$dIR(=1+(s+-fZ$Zq&-Sj{F$;hiRPrVI_eA7Jgwd2qhD*{iKPkPR0s z_vuhWh364L2kxx*q0ieNmOX%EP4J)Pb|{xLhEx!dvyzqak}LC-gzwfwv$~uqUjAx_ z`#xdV!phI;Qt!BMV$NQO45xk?yEb?nTPABZud1QJFHCdiji?sOxsM1pUAgCzlcKsK zJ@1?f;Yr5$BhU9ioz8Ls(cMnO?OGLn3_iHvKK4Vp{_>B%O+2!!&X zLYo#Tz+|FL^rr;Eb%d}b#I7}*$|PHex{%N~JC;na z!@#b$4chh6{@C>{E)}~1V2Z=ym$5o|2M5W}osk+_c~V?8Bt@U`$2{C~_j2VD#DPR$ zZui=bSV(#Jxtaq`DJkd3JU99BxRfCz{VP{nt@bd|hHGIxcI@s%p>JufGAp7Id+t_R zkek+X&(yIws{oV{Y6U@}=4d|81nM*PZB*(Yrg4kZ^1(IIX`bT zd>Jg(;?Mv;#?+;lWtWgyV2GO`WH(pc3tskk#ZM?f29!L&fYK+4IijQ~YgGCS!&;5X zBw?xbO`kV-E{SgNvjB4m4!0nCuRCfH2AE4P&L6)H?hHm|>QKbgT==LIYk5rC9tT*9 z9jrZrhM@}C7sznDz8g?dK?am>+ulodB5qJL|L<>mKY?9-*VUp2*iFXp^sWnv@W6?AW860gNdvt z96dFe&07;8sD8IN9&c(w4l`ec8$;9+$(zZfuMu83pr@;s723B&S^JRsWVD>ePK9DI zDtl#LV(@H;2%;Q$`5#Z#*x}G2t$w!RBdXr1!HbvC+DZ@p5;%gjlW{n&YT!SF@ucXf zNd1$EC=aa$CLXssg0YbZW?Y+PuzN>A&hXP$;7z;ow{qGK24k*&!H=C_-(JKz7>Vut zkso^mDQn$x#gCE5P;;QRD#;<2SB5RjA6eSel*Br$HbAYsj11Lo&aFia_x69;&$F}g zW#_E^(KtV^)!4>O_@(D;l19YKiO z?ijn&HLK_$T4bBsc@^bO`p}!uafTr9g1ZaKaE;iEwea(#1I46QN9k0ZoF<*l>17>N z?fZC0{IT|d;s90B5`EG++oJ8YyN~<#A+p;dH_QkF-6OU=3dVD7FK#VOH`wp$B^-$W zvrbh(;HDHmh@xy+u z5rE_$3eXp~$KL&W#QnfS1i++;YucRxYT8lN}r%)}cV2}{`Xr%~Q%_y#1SfE%F z;mnM0sN46Mp^Cx$xk~Z<(n_dJDrmRbS7aQR1?J5tvrhN1zt#)ffu;7@qTXb_+2B3J z2zu78(?a{R%}oN&+S`^u!aqi-%AJDdLA%sx%DcCSci@yp%oRk$+ z_>fkOo$_%v2Q?`d=G@&b23JDmIJYHs*4-2Y9x-HOIu5SVj61q77sE?fP8@4=_;$I` zUR6$r;q6IHKYEaHc;5I9W0CSq@!^M1L6rFxq(jDxid;d#ft|3yTr4nx(ooi*^97i6 z7r#B}e#OPUFLf`QtWF#@r+?_PtGr<>6D1dkG^gi zju$|nX!>qsuJHqXcFm6_x1*vc3Bnu@?zOkE!CftN0fAcbV)_g<4bfxXBu~YJ6p=~8 z4O%c$r_1#px|C+Vir@wmyfxV@8K}jS0aLSzPP`SYW>69+V~MGysC}1EHz|+@R`C332e3QN00pniMZtu<@OX0nCa2pQChdAT zZSbTst9tJbjbGm0SKKX@UaU{s2mlr9cOMTrqIHf&Y}_L3v5457>BxdT02I7zzej?0 zZ(Uw7;!oZ?Q6V1?>Wxt8*_#euK<7*2k*aZF$PTtzB;0w4ifKQTOAo@uo+O^%&Q@66 z?_68M@P8Feze6U_TIn_`k=bWM8||niAYf~|R-+i@X98$aV>K&nyezCb|LbyUK)96~q_T#y=6 zy*mb&ilx-dmqqaDqV&25+W6G>6I+upy39qFf>!a=dE|T9yWH<@8m{YvK7Boz4*l^# za2gkArCT>dZm*3!(%sY3?6TImA62r+cK5L9nQhkn?tGejqa;`DXmLejfu z8^@{5u!WQa>4{@wRSG+d#ty7>MINFe(?--DFgKa+`lprF*d@W!ZD39wU$Qvf~ zmgW$yzzraC&-11Hn0YA`1icV7?5?-JKe1088&FAV;(oCe`Xvf z5CrUW=H;0mk9=U0>)z-KNJ@~da!o(Yn_bC$>nb~{$tz+`gCsm z0v_}LnljI zWZCtp=k$P##6)wj@3gi|BC=3Tx*YQUL+fPb89LX&4){0qbD4Pmi@mpw>M~!yhUo@L zC8WE%L%O@WTe?BIOS(&>8w4b!5ozg0N~A%NkbdtkI_Kz|dFIUTJN4Ri)-D-g;I2sfzLW9SwQPdmP8E7YMdyh zl;jFuk{ZTA9gZ`>;?Y+zdHmq{9e9oq%l?7by6;>Q@?N?9yCTt@%D0) zd;z@pO^Hpk7Z#^d*l6XjGV$R+xVg{^$tP4VV2;0uh&Y}%FOy?w<1zBtnAapS>d$!% zj6v?xH0p$4mo>cDut|~aH!f?Z+HpBuh&Mdyd|YsSf4RSz^+;dnG zx7SoJelyd0yGhxT0G10$cXPmUG0;34>n{7qv8nie4qPcQ?}&xRY<}bEsnx}V71#&a zTa*SUTf%G~{wHo)-kefPTK6-LRB=GvP{9Q!v9kyyK@q3o4_}k7j5|RiTR)z ze-(+LV2>Vh5!kMxin{#FQ!Io*0kJjG+_(fwE2~?-j~pcarIkeR{q;HU7suJZDjfBZBQvG4 zwicMeV6+j>Z6*ctzAGGUNxvu@7GZor??v%ml99G^lE?LHRt7II9e=rHf$xuw6*nT7 zrzg_D6>pe1%%P@_?4~8)E99K=^Fr8uOx^MRI=NFiP46K-j+Qx%JUpS0WddJP~4VLSD0TVh@nQ(ZM`UWpI|;Lwm4EGmfCJg!0(onShV0@A7R_(1fFd z^Ri!~QzdeEROb3dy9YoCdtbKOwX~P-!8sm@-#mWo#Z3k4JZ8m1m7qM|Z`_it+c7W6 zDHI|x%sYz+j+9}zq|lao{E`{M3fcTck9PUvvV;iSia_b;$p{0DFfpyL`boQWxoq!z z@T9FLpfh5%UYa!mFjXHor@tm}{NBZ;2jmlAh92EuWq+V0Y^ibsdl&1PisRr8b;?r@ z`&}}gGw1*Y&I#ps3Vr5+0ng){temWZ%5qQHH=L^wtP5v&l&&kl6bCmcwdjZYfzaTa zMs|Mw!+#E(u>gyB38(P9n1m^I(Ra|QGp>^)mkI{0pUDt@%to_jo>y~1b|}m6a^b94 znL?`Kx98%u{C>!^^bw`@zq_E1^cHA(7^dV2N*bW3~6rU z+th}1zGZC^L>H1yGIAwMk}QsVx)5{yK5;tRvyI}m?mv3Hr*<)=oDrHtTAH^}_tZ=7 zbMP+Jaz;xUOBJPGlZ9QJ|1)v3mliBvN374Dr3uHs@8FcD#Wq*2ZHoN{HMwr30rzfE zm1<*w@xksLe~w7~NStovi&jokw!dTgDcSft4 zj7%3xNkKHCdtW$Qjqr}NsKa(b;)LQe@g{&qbgHt(0nvzg0F5}I38E2EKQ$+9A)Q5Y ziIYMYkiBo3@Kmhg9u-lhTP@2)_M3AJJOl`lHG}+PcZALR!89|v~Ap=np6&u zQ1B5*C{XEzbrNbAs!_Yg)JUOlI9&{<9;I&xPP}dNPFfnl}dx@UgkP?mnK*z zQ`jP_SU@vo2Q*_Mp_lSYRo!{-%sW#-nz2sYq=fZ@j1`uIzIxS}Quetpf(nO=r1)C0 zZ)=~-gw*gx2=2Yz`MCOwmO_@oi`wbRoQ1<%Q9ljBD2UT`hLMJQ(vL7-zrSy5` zlb|c)!e@B964r1aH|pP4>cF}2w&F(5iRKg(c9Ww{iFKufm&=Tnm*J{!i4Z>I!-NoL0-+a+^z38dA`=7OnpH#uZol;a`e9z^SperxjZ!aieq@kM{aV1 zx7{!JP@EEj$N5P=Uk8UM?S_%@htFd+if2^I_6sa`n|#FwSgjT2N~4~tlA}8wpJ3EV z^uQi{B-ff>s(2o10|OzDK)t<0dP0oTOAyyXnIf z8n3W@qN>X0g%=Wz7nhF8TNgN8HZ8+>d#E}iZx>SZ=|?*UJJ8ONf8Wk=`JNm3i+SX^QIlz+-@q~HCL3mBmKW0#-nk1uk8`eT|O^~cOW{qcJvWTRJ&AzI*Vs6qqbU6lQiJr=LOar|lh zu@+E&Y@<{=O@+4EdyNWa@6JjBV?E%eQ|Ky@Sa-KO7@&Z?#4>}{>jz5DOa5ni9t)73 z7ZRdg9cFqBWg4ADPw#P~LkNKo%uO}%9`?NHIi=y{wMUrir$bO92khtU1F_wYPWOXoQ%!Gu}@-E!kwtaw*X#{T>8JWDbkp&rO^ZSLQ~ z^N7EU{4+eSmUA!gx9~irPS(vS8F2jP+HKh6^HVWDwRFONZ|QvPO!;qGI>WxVbdJFQ zEuBWEtBgQNrytJYOFz#Azx!Q{f-?B8pnwC)zZzb}^~;{ITuc{e(NFZqS8Ni>UKt3_ zv%TN+1BK_sH%Mwk`5gtqHV^Mp)bYk{WEG+; zC5KhjE|)+^ylEKn^0DF!kD|XWVjg0N(Js+5vSi;IZ*DH}CmZ{Ifd&ts+jOViTTl2k z9}-poRN?+#UiSO_lJU@~RcZ~@I+{U^%H331%$TvG#+3MK{pTWYCVlzi&?!J8NYd-B@cVNo{_Ygr^M{VMX z&rKpAq4nZP)jw|8=?#1)NtR4NNi3-VO(5PmY4zdK(jHtUXBd0)NX{Zp^<(p)3lD#G z&Wk+kR*O@wWxY3YVKDs?F5YxBIBhY)y;%LSl37}v*3-KoncnU+GL*BzD$dtzD5c&V zub{{XDOH6mja9S+II7t3pPvX&$!aJ$*Me4z)nYp^1TV3dK;4|eBsbaEuc(2_vjcPQx7?8 z6Dq{%y3YHRB^rEeznVFn^5pC52HvEeP@qBh+tw_1;;e8X(>^+L5#Qo+7PLE|jO|?S zx|E+^0V_68z7d$QzC8v`c2VvUZ-UcAuy)Ke5=|2V6BrZInQnC95n2ytq|*>*3*+S9 z@9*%A5RKv`)5}V@`~Z6KVMq*QD~$olw`Cb(KZ1-E97{%gkjo#`Rnh}N#>sHfFi7o! z>gWRHZySv@>G|tCwUXn(_N|!)>S;-cHPwt#BGk~}JIg|+5$b77pVt~ZM|YGTegOX2 z_X%-c@h6))HElOG?yKsCedypWd=q-1KzGH=MKv5FYnj9Y1{6*o#-65TRZYuN9?8)6 zf}#EMOM$Z;r^LB}X+b1c-VP5IJz$F7$3DImP8!aDIEmXay6zB9L z30`|(g!X#CkTzlXiQuwfD@LcjDYXE06WHm6YllcEloh8A?hjur~YloMK@9q#m*Q<9}m60H81;t;+q+k4D|NqCN-`l2FN>Uw}zJ z*}eWN#gISQy?%i_y}0`hpU@)#vB|G3dcv}uE@7FJ+%GMZQwKTbN8{X5)<=rJba|u0 zcERbk%O2l-Rk&MtON?TDq=FJ$nKSiVoq%@%YN_G!baThI=#hg({)T=8mUH>DPs{nt zg-I>4Po;HO)8AW|Q>PfvyGx9M=|l^qvuIXV5JZn<%HqIgeYLzR;!D5g;(4lQx%??ZTMHgLgfu@ zr`txd?Y!sQzR=hAg1FgiBitA;rg8nLs{4}#<VB2zG7Jfia+MoMSKR%-f$m( ze3EPfT3>lxsmnY!;d^ydHS=^^zY?J6Ow<7)NoG ziqgQY4`2rq^b%Q@MS9Aa`QqSX>+~E?^P`N0X;Aw5k$WSkazYx;#RhkAXyJ8EVcaNf z$TWks`iFMEbH38k*~k5mq3T`|cEYY|dYqBq9 zwa*1c%G|`1o^92|7ebzq_T6LwS12j7;2l!}t0*B{-KFz7Vu>ua)Vj(nCaG~%OejwV@&m(R58{%8-&=k;z!sNL;AG5aLHE}} z=1DgfBZJDPIbmj|ApyspuHg+357}3WoR%a=?v3u9A{WrTy7k96hyG}!P%1Jcxt%0C z1_{}B8m-S3_d0`IqLvx`h#)*{cm@0ORqF0Edeh<7h3%5>N+18XvXPE%4tEh6G9$Y_ zef01sCtm`l_G&#;W9hrJmv4{{CANYitws{WhgBHMCAbW%d!nrbS>Khr4Zc@=a>>kl zJVns(#<7?oyo^2j3Vcnf?Rfw_OZ71C4?EcB1nzpLb`!B zV+)4}8lhb)aik;iHi`R+9V#B%?zYrVbnR~xVZaxATVZ2y`?x0d#&+WSNM_FV08Sbh z$vklWjPd>{4Tbx^U1A3O4}MBRDNGmvO3W}r&IR7eVIVQ&%11|R%g#4DafClmaAg+pg3Im=F1o1ZU`6D*Sr1c>?rHXwTSYNG4k=J1=tOn?z}^4NZaJ0Xne|j zJCEgNLmx-XN9dG-%6RA;LRtDw`YC3Oe0w}kJ}FhZcc~=UNPG1Vu^MFznROpJ7Zap~ z2Qd_gnPfxmNBrPcLcgQ!ajlW)oyIJG`>73Kc;<9u_~`zFq}lTYOVK&~ zv{`{EL`-^ZJBn7@+t$6TeSsRQGFYohk%**Babr8BOBzTAc`5Y5ffHR?59u&kNyCoE z6@q3c#IvL}64?&dT+SZT3n;529)ZChFyI#8P^34;%@+TfKni87xH_2mr6EROr9KFBF9B3!V6)Qzr)>)a zNV~~W-PCM!2g2f{_nD&`-)?s^ofj{sI_IM=SLN}ROe6a;LjRsZf?tv@u;kHSI$E0Sh2{;DW?w`h~qf@uIw^rQ6!IPZXhOAQe6| z;e01YzOx<47sD>60AcP*M4xeD^uzdaRRgl3^3=sc6%<(Y(v-25Qs1^QDw>ck|8VZj zouM|S^%j7%d(KF3a{jC(aOWjJ+QG*#hzABz@psn3O@%w83t1ydYZ4=&x}<>PsAL~T zr%j+jb~E)Jh|OR#UNEG6Vg!oI z$ScAU=871W6y#Bi@plg0o$V!a?&^^C?`m+}D2la`(IA1lGWTRvc$%SF2sfF!ST9&P zt{d!FSseeM6}zS17bymnnr3zfmeL?Y=6CQDWjc?a&ARvGD_qL8snuzKQf zAcoCJ9~{zB6>G`^#UeI3^HBXpX9XM~xS4XI8ur`=PsFeV-y`H;bXlns?woah|zMHQEEs}Z0=oSXD?T6J535WhBg3a?qyl{0cSY$G@wvM7% zyHn1!C-8yOR2h;6V@!}r^r0_%fOJyPPAal?sZI{z+*lb@V1J)SYb%MF=n_TCHC_z- z33ahL+_qlz^s!Px!P((vqKaHMcPY7jI5OI_l%V`orqki@A`jzkQZ%p&P>(|KqpqBy zIxTX+`T zo9C#+!Cbm;E!~Y9G>6|tQoX2Y*|0HLYFCx(nqP371{(E5W(;-EyRcV&7yE<$N|q`nN<7As2Iq{_cDA_*aFXQX)t#QBN>%uy`sgtF)Ine=B zf-X?%f%}h2p+rm@pwvSHsiA)5ww2Zj`cdkT|FpgkKtOJ=$?wS{H^pKMTHtRvy0{-t zH}CtlbnYYp06PX!MMUpak?#N-^REDVB=PJi5c>=isqJw6R;0F*=Nf7JiDTiQq1E?Z z71`O>ROP$mM?h=5k9|gdI$ z;MCv;mOU~Fbe2CY00C^RgZGDZ*mxpojjlVg&ynLeoXJfaHCg$J@|-;@BI?xv+onMQA^tTsTv6)R-IMrF?DTV4*ta>tMYagh3c9r-e8`}Z7VQ^?9k z>M~^b)Ysrn6@eDfW~-MjNRG`F@t~}#ogZ0MGtBz~Pfc6nAA?%UcjSTA@{E7eS{};& zb89)_j{xYu(pvt#R1MTxp8n6)^1vUh<&m$R3SB=^Y+Y2tGTN0&JOGz>^QrD`YF7Vv z>h;{K%dR@s^cc)EFsqX8+l>q%B%qPdOaQIrHP2xUFQGg`Wcp0m z3jo}xzYMr6|82ni#fev$AO}>5AcY=XNA?%X?cve{*USBcxNHLe;$p3LY@C{ur=d!2 z81ugRIv4Z7MXNO74dPw_P(1yG9`&VjUA$Ln*U;A<7Z@40M4Cgyz`_MHMUM^xMO@+V z9zC1=7>chK(N#4C%;ge9cspn0)vTJS6n>B?JTIHhSlsE9=v z_6&H?_{Ifdj;e6b``HG{)A|Ipv_v_w#qb-&U&Fzh{ya1V=(anScv_8E$`X_xlxYCwejZKaPFxP-=c?4$l6) zL+K=$iGq4A^k=IR_@Fwtd_*bm7nsxe595;^S zZ4W+%jj?6Rqlbz5ZaE=`KZz*`?CdRS0F@~5;_kF5{i8&wj=+!pmlCC&DaK_zjIhju zF46g#E8+W4!0ECV$#pl7pcbXm9VycL7NwA$pJMiB?_>7q?^~33aBdIlyhO;BNbget zIinU2l~8m*6RlOYA3dnV?MI0cP~v8LpQQzRbCUy7lss~gk2r3G3FD|ep^FpA7?A!6bwi|#jM1#!dAi>XyQIP(cxDV zxD!=CGrAgk`GUOW3~lEaL7reH(2S1ykoQ>{))*^VQZ%-AUV}CW|Oe{;aepu;tT=KlYv?B<>^e5gcNI&mZty)#M1Ja^( zS>1q4Ed=Xltz{%XGPN3x)UY{cBj4y(D=}h&GPOv5G$}Fuvq|ZOgCGECQbGorl=6Wl zB@5MlE9NJS*eeeOB)N0__7y)c;-=phSSGZ1S1``uWYrBa@#BtVZ>n)`T3EIqEFBcl zJkZgmRKpUT%^0{rMssXC^;d9b_^rTl;75Ta%J%|Gp|rws60H{JC|Z)ETm6JW4OBXq zammZTP@JEN+-FJ z7ucK`GbK-!!NZ{-GbZ5~z*Mhf==e2~y9FOHTvPiaU&wbYdIIi2KOT~W64QEc?XEqi z2omD8dgcXfYwK6Ph|E(3?zbAZs-0#!dlk6EDnSvD@F-qgBS9lr2<|-|n34L?~0Tl&{DQ`v%wKA@eHFty8 z7lxKzscK=M%*3&eV&HhRVhCn6c5gv*RC(?|)hJ0PbMH8|l4}pp3=hBzJRBFH*;Q^c z@Kcf2k-i+V?K|M`xo{j^!JlMxe@3!}Gg6R0PA60Vt8x9}ZsQ^~(cr{rx#u-U&NIv< zL2HGa#Ws(AeCfF7WwQ@1r1Dxk`;;~m5(J!Z1^p9a-f&sxa<)8Tyt*%~<2{`oM+X3R z7dW~9^Nryr(;@f&!E|_o6@3%|Pi(sZ&LZ_=zRe2J5`129D#=24a|!@1FyFpP#t5Q6 zs5?58))v|@N2?h`3NGl+9DVCKT?%&YD0)$_!}ow-w4H~uQUUpKZ0Um!a5q$7Rlk(h z@x-qZpi33LlLDJiX%8d*Y?{&dj}TU!$#fbluPR=^UcHsNMMZJ=_Vo1i_pP7UosYnL z`|H+E3lPFe0}5ePan=TfuvYegLRghRA*^Pg5LOqqiOhfE?f23;CYJElF zHN3<2h>a09qY9fjpF&c0Id#D{fImR;d!W@uicSz$KBY-k^t5>KP#J~yow#oha52n#nw^93>p#c9 z`cHQF1q0ZJ!(!2s>4bwb>9^V$G5c4+UGygIf#2+N-5SeTx~JkP7Wp3^T4Z zoidbBh89JcoKLfw>;F*J;R%qdyZ?ZT1g51DfmNLCtkJ z(Ro)+emF?+r&RyP<~kpipe{Cq&@4su+XHj|HTaHc^V`A0!yAKj^P9w}%lla=Gi6lf ze+Ia0|82ni#o_ojoA7^uP58a>@z?S8Z#Lm?HsNnJ;eRii!2aI`++Vzwf3peyF`Mvv zE9I|n`!}2LH=FP`oAAGsP2l)%W9=`t%>&i<3f)ZDZC60E+;ji(o;3gY!S9K=`6kbG zWER$mg722?pJ;*Mi_7wPTwHFnRr~l1#6#<8Oql zVa<4CZ#CA@hJU8NKVxu9wDQf<@3!E{+U$UT2@Fu~Gc4TQP-$l);bj%{lnQTPzSD0t(zSx4Y>QILzMx!?!fhd)=7uj3 zFXhhaR+i;z1IqWzI<1{SjWFELH(FF6?;Bx;JOP`g9@p#vqXt*HBHN}d?`ig z2l4Fu*)oj2%T6R+{A3Bzv58;>#oiA@RtMOQZY=GQqh8SAY*y1-6sc}E9~!^n($9LF zpVk7nG-cdxesrw91UgoqVUpMhnG5d^2mmdPL z5j-;IE#qAFMR*FHmJ<#h>-TC~YS*3V=g@I#&cddRS6MF=7dDN%n#e)x3{!?=MXbh- z;RghpH9(#O{K416s6cTgYNSh1S!xCMM#F(+vHP0Uv6Z78^uBvGf`{jGCZEJ>@U_|* zi5RteHX=5Lh#{4|79C(CxWOz!u{LlfctZ6&qii@6NJU|Sc@N-?(4{e2BAIpNtJC(@37wu`%}iCp zVeYJgNtA6RF%DG2GEdjULW8WZo~sfp7yh6GVk5A6y&r*9-pP4qTR$) z0F#V{Sgp&}Lk-anH*I7x)kK;odGROE$gHR%*4Qm?Y?Wo9k%ZSXk>|wWPaMFF+b}-b z&ybs)LF#@buc zY5zLCqqg;#Us{uvANlLMdm`~;Z>XpTKq5x}WvPwxzYW;GctZbXBmOV25x+Nl{yHB2 z%|`sqM*Pi2{O@HW{wswxKQEL0;xzr6jrfn*h(EKkI!pe|M*Pi2{LM!EFJ&YCD{iu% zvGx}`*?}s*J*Xz*ik40xx4=!Ag+ou1!LK2tsI5xq)G; z?kM|cS$6K2-d+xZH_gu2*hfBqejU z^nH)0`6+KL*~l>blgy8!$7R#R24{$KifAr7*_ilDCL;UCh$d-Pv_gza-ig?pCYYF3 zeBzKMVm2>bOFM%|C=GgCmlcTR0?n-Cm3Q3F@Nwp)d4~Wv`E+stX{PVnqJX14??nAW z#sl&hI-Wt^X>12>ypqiqkIG57Uu36M*9YG-IY-NAijt1>CyE);mLZHKiaahFX z*f8@YN;p6@AAG_%XAZv%DO-Z0qzr;f&_w|;t>Gly=55aRZpX{VUr99pP6GEYa}s}U zYs*~ywWSucAmQXM;6olQh0yTJ0&sSeTBkK55t-NrSKMOPVwk0O)SF+czB0A*bGtKm zz2M=>R3dys4dNuSC4b^1T>q7mIIy&bjCxUlz4>0x;w6ZaaBAk$YmiqOUKVd%cH^`M zcASrKvI(OiB|5~2*HKI48|3m!Mdbg)<-) zWzVwUT-c~N>U%6otk-oR7)u{07R415i{f0Yanuw>5yQ#rpI&Qp9w9$XGX2@Je4ftY z3Kno!EbobL(Dir>iX?_^U_5#f4yDwBbW0hO8a>)f{gyv=6Cz}S;SpjVR=h)$ZXpaQ zvmVn}-ymz8$(Db;t#*A%fz zwxUfH$nhpvd?s{|oVgg`LuNr0!7zcNpeTa3KomiQk%2z(V(dq#cAk(;M!!^7W-=A9S2UUK zOQYW5Ox?PviKSgmm_7@i^jRrqvOC1`Y}3!zXJUgSn|wy3^3le&>&V~|Tajp3Dc)DO z>1eSDwn!oF(cGuQ(C>_dLF7gAyKfE0LW5|aFaodfej6d_qSLskEft@h(N*tCB-UJT zeog&k72nXJ^3EQ+vg4XUS7kLJm&)`d12nYRMX+zzt0^7%YA~!C_;S=ao+DoXaV~XwO7ZM__A@x)IaY>%sk|N zU}WjKgZHkIt(){1VnYm5mg{B3<>Cl-55)KV2!d-PU_T;x>gs+!BEQxQ((T_e5B7{S z24qpV342&V0-Q2CfnZgs{FcFsAqAT90=5isbBB{LK6L}Q331!O6ItL~N4)bET z09ZOp7{2BUS)IxoW(yxRBjN;`W@4%dypTn@OJ7qLO2=1Z#lcw!NW-?L-(F)j}arTDa2~vnWm@7xJtf~WFw1FXO#=b^W{u)T@oOtYvdI+%q z?*0h!;xGZCmK59Q(AcoXPhge(&*u6}6iDC!~4emrs_^gaLD zztP9L13V9xKi$54{O3=M>5m?n3O6=31Ef|8z`^FCV#Iwi-43n2y|ag^g^ELx1TX7= zQhkC&H41^%Ge!A+4BC_%Tx%GKLr~eji;|W4HPtIJ)+Y+YT(7BEk@K8!`jG|Mk&r43 z1u%O2%$w8{&0(ix#Y5eQ%%NL%@BBhJN+6@7qp>6X5qbmm>4+GNp{PgLp)#-Up2Pw9 zt7kNj8GFD6PbRn&1I%6E)SK18rGo3n!L9yooy%_p+gl6#_cx=N+?ko?SibdSn@9Cn zxjbmP10L5WJ#+tN2K!aWLwZ({)q0%vuIwUyO$hl+tWTW~qMcYs-knml<2;as{4;3=3H(f^{rU{Tb2g)iCWYwKOQ?Y##S}r{ zM{yGS`;Q_)ZVpGuw79r9l9(X0vY^{T)N>Z$>w+#OaN|KgaiUgOx<3C;Y?L*Vf+(1V zp9f^6>80rghTp5e$XGcvk~;F}=#gIHH}xnVr9zQhIKQwf4f( zN*<#^OMNheZ?&uH(iQ7HCwkHm@X&N@R*FA&~B?ctE#2dW4>p<&A7i8&#FVV-PV*mMlmt0@3X~0LSuWgBq~Rt%dmX?iW#U9#WIPC5)2j&ncnZ7%N3_?9?V^1 z{9wry%e3{7afw>haoIhW_RwE1bqB^>?-TG4MJY7rc1*kUidi*vExM7M^~g!gX<=oC zooeDx>s*Fw#OT72$|I7D*kNVr5o*4l)1DTrr&MYeN16-|o*T_(SO=2o^BKFQR&4Bg z9Qp3-BDvT8`JDl|{?42J++#Hahde!93EQ`hNS|od(YFk%NK%}TN9n#KKaI19z*r(P zh38R6Yv&8zRo}04|M8YdbEz%b0LLbV^q(9X%O9awH3IAXTc!)+R0JO4FAF0dYDcwq zcPCCH12*7KD|k8~SXwIR_^<@KNWe3cfoKS(-`Jc9GC>#V7P{24E4f+ff*X~82uG+W zNV7sw<(9RFK7fTcw}_dg9+H`Mj$e@9R#N>DIF=;%4js{MnEHx@G0lq*0g=hn`HqEPVnQj?VFD@^MTX0ME|qX{x_d2=8+6J zOAH~Pz|O9HQhUPki6u3Bxp)CLS^0_ahR{pl(z7w`E|F8I{qn_`><69-z-O60%~j$CL5S4+|&EkL>R=9*x|!HS(tO^1HgZ z2?vs;WkU5Rwn_PQ2oQjOh5_SnJYoh62ZmsWI`nd_A(e{LV7zlHK{teJj*YJSD_==! zLMv6~oVvK$!whNa;u!R(Ef6lYWm}T8*xoOV;nX~cvDzQXZQd@d_{9HI7XEO3$VAZ! zcj*o|F`G>{}b^SjsT9lXLq} z`3_>Fd0MF6IPT>E4IZYg#txTup^O7_*2=6p^ISpZ5wS593o~Z({AiJ?g-EYkDPdB~ z3k%zcHaLtHsIN9{*Q?*&sI-EM^XHAWVw6N?!sxjLPMGP0yI`&2%Fj?e(ta>Qy--3G zItl$0B9cbac_M;J^W1kB&5radtJKusbz^1xNn)Ye(|2=^2kkVvD%MwaiD4cL!h-3q z6%)N84-DnoVy7TxHEomn_QaWfKzI5Ie#B*7*}nSt`9sJy*Imqa(^rV#FR(+0YHCt< zyyr6aNp-!jUdxSZr!rXdjGSO}!W@TexXg}MzSCPbtK&?P8MA4akO0H$H%Gx8U4D=B zNIi|9dkG?9MD;8Og2Mr0&%@V4Kyc9in5B?5ie-laRtkPv5Y??-5~s`UJkE;u5#2-S zl}gM|Ud2v^z;Ea4a9`|GE*g_P-dz}VqHJ2v_JC#jo1kGRhMMx3tr_91=Ya`Cp$oo7 zP^?7U&UGda;pTkkBbkjCg^(9n3=40_hZubSJhQn)w~s5#-@AXP>F`O0=|Q(w77cWbYee{j0$as%jD3enM^&(k0FC#dZ3yn+4@nqXe=Tc9bi-R16r$GfU%Sakz|!E9zq`DkZqqF z>BkV$$W1Lo4B+F=pU#~B1|L~RGW8@?jIjMzvgK@V*^BL3E?6~!ouiflw}t5u3OWge z;Yorp8y_bp%Ee=o#NVWeiCUd2&5Ic-DWPLS>ARrm!ND(Mxv04q`4J6xy&t`3XO*^c zws?2mIp6MlmhDWia{kPZ^8v7Aa$qwP@Tfoz)=hHB#qTJV4-ED>m=d@lg2EaewvjNw zTVo4HQ|YEIkt{#3EroT@An(JKy|Oiyn6ov>2gu*715*rRpDgiXBc1Z{T(21lwjAg5 z`#XcxuD^rmJ-Jpo{+!^gfUn!jPb-fV)dh{yx%E{Dn^Mz}FZ7C1C~HBTpu?FiRHO<0 zPKDU41xqpc5KFm!?`>(9xuJ^?jSE4*xaXMzPpq{|9D!caxfza>q?UNeH|$q-S^Y0{Id4IKl6Ju<#hWb1{OA%-ApdCoTMg~Z^NC1OZO&0A zLG6o3O-`1s_)0wTPO@F`k?D+VM4~{iw}(RtLJk?N+!6uxpKtL< zMu*(d8E2jkzL>@Y-gKzSpBbDLobrEG5Pn`;HAH23U@pm>W zTaZ+7aP>rrQ^$26jiu+zvpaGYFni{qm7Bm{QZdslOfHq~?z?6ARdwp}Rh(1T29pwl zN1t30VvapUG6F%eNbf6>K60;?*~hjwIr5vKNwdRXiI$R9+cF60^{W#|C{d5& z)E&62Nk4FS+9*uK$63i@()GC5b zEt06Bv+%FyJ3eq)$ImvyGm|*(lb?)NRYz?MbH`#kFtR8AqOR$PwW&V$au-wE2zQ|; z%DOOHWRyU(lN1GB5vF8+;@RfJN=57ER(kFcywpT0Dm5h7Ju)^#Kh*z!c-3qLV8)jjGwPit8|J! z7=N9G`8P-(fD+2p+20@j60QW8vPU6|ZPnwHEvRb-?(QJdk@yX(S#q04VQlJf;yxOG zW|SO3tQwXZd@t05XbHQdhxD;k2EqDquO1Ro0}{AH@qEH|J+k22w^^#L3o5xSc5dO5 zc{pX*hVoH;Yiup=tPmB$h%h9rjtQFf5(eCs4PaDfl~BEjWjDek+Ldt_j>5|`gU%bk zlQB;u_Jz05z@fNJ1=pc?#Ef*r3Q}1{)p3ljQF)t3(as0SO^<-&?Iv>35&}GL#z%GO zo|x?5ntYR<9a`SJHO#0fhsY3KA9xhcTsrR-1d$p7Z^!v06+i#UJJ z7%lt}V?+h^-(!p(-ZMte4I%y~jFHIi86z&>UIlqWwpR5O@0)*}nGn>HQXwM}Q!&08 zE*bba@}Z!GXeW0MB+4^}fB}g6Cy7D9i3tWg$;v-9V*Z;a$uW}g#0K3F^Bo~3!jv+x zlI7Dpn6QTU027Bi=2sCauOY3&ikLZ!1O2Foxm3gYEDK&ypjhj{z(KehB;-Fi^mRX9JNLa=YI~=bnc3m8nHP(s%t)A>dzN~%>SU3y zEf>5U{lYRz;|pQrSkW}gh{RIlYy4G?^Og16YEPd|?ei_);%%Hp28XBNPS*ta7wgh5 zo$|GH>9a>4(Y)2Me&536K$vH^SNCF=_)1mXxre7H*7^;Uj%tyV0=>TthYZ$X+{ZHv z{ZW|0z0HW3c)7&PlQ*YoJ79WMuAiK*1%wedg{eE-?9EQAdfsl;G;iNEd%W3BRB%Qc znFxH&u}Hq~>`*uA1j{zzyd(^B0lhL_T!#m0>~N-{NPNQkLS*wDD-C17lOl;ZmV8h#! zF_H5nL!~;9M$oNgZls~#3ZVEZP*SfOgPrEcEB79Nc|E#vPka#v1K+}en0SUqbX4)khtYzq^gKMhsh*C z8FTTGM4OHlkwe46w~h>_GLk}jNxmdWBBQA+Dhe+X2}iSL|K{{djqsw>P0hF)N_?ih zf5>K+Q%TBAIIJ0z!%w=mZ?(g)8XgCfV^B*_WrL*x9lIo(a6f*JPEdLB1&_y{%j+^o zShCGI^@7RGhB=A8V;xO&3eFRummreX97G#Kw^I#8f0hhB;>ux| zIpRy~Q@RLh_w9olHYIJfAaxMdTQ>>~j*RKNs2**?tE7E+%5ZA}?n zm|aWrAk4Q%Nxt3LXYy8^*=`Zf*@}@R?JC!Ewd@MVTyvMa(Dz&TL?egrWSg7bvj%cU*)wY-CV(DB7pakIN3T zxG8!IsPb)9?iGa=vF675~&27+gngi$c=km&*%d>yT0sVbk z|KA6u9{f*c-= zp;$M`AoR!lKkR*XJlA{wzWuTHUP+O?H(4Q)Rmd!4uZ$4NUQv=wX4!jXCLb$gRd(4k zS(U7W-|K@;opU~?)4AQ}{@%au_w+|4j>qwOz2DDqJ+JF}8u(R(Aet`;R`yui3ElnV zb@d_JIANRtE}JZh-aHhNAigWaQ4 z_dIY%iC47_Mu}|jMu~KkzZ)g~sMHYtE2DK%Frh+W#`#sF)K;+FE~zo#t>?TyZ$gU& z1E-LMr;YlVSMgjDyA13Tsfaq9WEJcNNG9xlf7r;yl#!F)4dOG;7ZJBWQ^1&cnGdG~ zIrO!*55+9>6|3Dq6z)wZNiiJ&JDJD%CX^d5H$aW|*W>8iYGgkKqRLV5P9C1lcwKp7 zL*kb1uFKC^bE7jDhhnQks4CwOq7+DZe@Z!dpO=P5F^>KP0sFV3u~_bZ~H zo|dJPy(WJBQA`TfQ`y?vsQ2+Kdg9tQZYi4Z)s&W+8Mt)c83XK(InlW!Q?p` z-w^YqGwnF+n@fS~GGi%($5c+9wW>jjY6`QT)xV3_f^cK)7KXZDU6e&v?7;PU)Gs%j zSTy`s86{5=BBDanQ%;*)eubJC?qQ-KOJus{Ny65X@11`==Ke#OR{@N#yMy@-1y?9u3c}i}Q z*OuoV;=07d^&R!+de@%j%MO~3-D)*^ibXSZeV)wl!F(t&S2d!VB3hPA`J)%o#x&;# z&-xD)To=epCo*A@v~53_;%zA^$6~%p!FhVLFBZ|_}Hn| z97g1@B+KW^ciLar$6N9sG#WkgcU%!t;^c0LdY<@1BJ#P+g*7QeN3{=_C_o z)a*O-)>9u7(8!s%5g5<|lj3if_hd8VG6?h$J~-i?5ou@4-{KU*4K32T!H}Xj8g={J z017L0{_W={n(iq@I<+lyg5Q!Ho>v=ZBxG>7>MB3k8Y@g0{&LJVHGz;nD)ORHTDYnE zj*h~U+R@yS7nf=DBeP_;KWLsXJZ(qME&fH82f-e1)rdMEyX-ac8|I4FmT?aHanZ~J zQ6_Pwxu^9`>DXX5*P1dW`I9Z}*~>-wE`Rp>EH9!Z^rt07XF z<3R$i&533(pBy(%MH2n2r|G-iofz=tdZX$EZJw(kqG5W1W;FL!jAIpyXK**@5a&mU z2wv6ln@m(jN!zVeEIM;TP4AOWYRuKu-RRyu@WuJOJj`1KnmPoq+~JQct^Ooa@xm(v z|H)L~RQG@V$?3sGYzIntxzKsJxhmmultfb8j{lmY^lzKZ9q{JLK4E_2%^i;B%pm*B zqu_|~0@h~}B2-14zaiNWSpKR{*2>~W$lt+riN_g2JUe54x>-iL>=pO8GY{TJubM`l z*wsci%|lX)CXoQFt1hF+fPQ1O)S$Se7=k)Hz;3{hGv4r^HuxO5h|L627X1$y#(#3+ za52;YFb$OlCk}raYMJ83{PQRNmzatN(@;JyjNeZ~Ar3=;>lGY9ZcxBV%T_>S>{F%O z0$>9`MybvQbwO{V{w1$QIFLn?rD`zpH)5kwtRZu#x0G+{v4h&+x%MQ_uy=Y4n5WWg zdWp9BpbIIbdG+`Kv>F5Xkl$!=_bxfzQHukCeRvEL?QiLD zSXr0Re@%z`x7Dx*^icL%B<{(dWrtde9-?JPpcyW01~VJTusS0lQfSe_E{|%T6T2jh z3$%b$*{7y}9B^wD2o5JDvH1?tunvIm2>3n^Tqvqjn0%j1_yz9iVgCn<)}EBl7MQmE|li_9XiBNlm2Ow{Ck9y>r}JEaS`gaQ~FcPtwR_!~%_7Td%` z6E|(tMzinmK~nZ2nUy>v1EmNjuuJjr3r4I+BGC-v;xY$pM^Po;MdGtF;a&G|zO@WP zMJK+s4EBdDLsLh%tSX2K(4)j(xWLgs@sHRjI)67CT5A%{vss=1}8Tbm5Bu0ot>!#Y!V-x~_v zqabhwh}*bfW`<;b(Ic*xRV5A7SrN?$jx+^ck7^c@!0gurb-7xsa-qoV>LDAlp$996 z96ZX(M_~K#!Ubvm2{QllL53GD0QAo!;(y~Lf)_5d?NY+ch0gs)1wC$xo7CS_(0^^A zcz)ADA&kV~NtN(RE*;!(mJ+(hzE#{O3_ z_K$m0Ubtw$KMCc(AffR0B^(0X1shh6XKX57_3JsAbp4atTf~$m-3c+ zb`Py2jCt(U-)(!=O4)5+QA&)VEd6~v4nWx4NFBi8nJDaNBlXRzpXw zvv|`anvRPw=G#VEE3yV&vkxCmC}Xl43p@3USQ2AQmBn&XYh;&?LY$iTOR=daX!#C=37?@OT}4O(D?7&L7B+l30+Y@^T)^$!8tW{h2G8b3coIRBEPx=stTW6NFE4{f2gQ!(#PC}WHna*?P+h}bV; z)?d_ZQVHX`7u-D&XjeDrG=M$LLF^Rhpz#4~k*}{lO!C8dW5P-vq6idAGw%rKJ23{; z3VF%o&(PX--MLluldN=hFgStp7_ z7&NuGBhbR~{Asx3?BZIK7s~PlZXW4c7FoHh6RX?=&o7c%`33Xjr;9V#Aw51B>g~RW zd^YRBOlxg-0F!;Cup)cdY>)_fn_3^zv_Gx0i8Pa+}T_-TZLNe6eEPd zYgSPuX+BrkvgvSTiy3B=&R{2(q^)O8IN_A18TU$(Jsb=VNBY3VOd=#7Jo$KifH`Z` zn?3t+_Qaa3l{i8kX9)wtBeZjB)(R6DQS8id{r1nPv1LE-%@YM%Io`HSZ%`%Hy|8<| z*PjV|yANmdR16g{V^9XerB5Q3r==)(u`@H{cZd5hf{*NU(R42aorFdc^I;S*_&?Ar zPa_NgUus17*6z%G1lI!MrKL&c zJsxTixAQYn#H<)7Vek(EpO!iS{vRqWOcYs)@q^i!<+9LlFjEJ^a#5RDLWH^%v@?uFDw$RnW!=?C&_(c zq?%=IZnmEHF)Da2{ve|oZE|ulf}(Y?>Y0CA(u)50V%swTdiRoIoX#X`YenxH&jk3u zM|ZK9t*uX#oT7U30`>*AIzxkU#@)(-Lhc10Pg1&nq(SUR@}*^3zo{G4k>qH47Mf)L z^n|1n@1Q7>UFuGQn6dfB4er#Pa5C!Gc#%fZHC7&Zsi$A7=*1BR%`l5|A_uN7h#Obu zvbOlGdpp>fZ)nnIuBkCFmT_+Qo^ih)ZT`Ze|5WNu2^#8>3k$v1x)5pf@y>T-VH+u% zxncFI7Ewy$7LGbpq)j6EYNXM*SbJ8LdpmVDxtBcm2Z|80_WFX@#7qj06)&!D-FR{#q@%unvsI3N0PLi zrJ5qQxo{3me0-Pp_yJr9 z8MR>VK+hcF*{qLvuw-z%=NcOqB;)ub-(Bm09e?3akpf-3$XaA){S3&kQylWK{BUbu zvD{??ss!!FVTomV=iH!bVw1@&C~Ull=`B z43k8oFgpnv|NI5t3i|mAUX3MCE;V`YdrI(4Jz?gUmI3bhIwZWx>wro}HY@b5av4K) z9e2`eP?onMu(%p;!lMmF&-V}&$%cVJs=$rjd|^7;y4 zZ%HyB)7~`H^A#KU;MhnVdt2Vcm#$HHRt_a0jPM~f=>F9C|d&UbTBU@WT>($Gk0LW*#uWiO%JZv_AcG%1r+x}q(e}Z_rR#jqG#w!X{TE@Q<*7VJf2SP)qZSVvwXL(B$m!rB&i5m!iRw}S#Pt+ z9x)Lf52AMqM)wO!!S{1xwoI&XT&W_vc-|#*3@ygp*?D=WVkK$y*4Rn|ZoiE`3 z1fB}&lAmMvHq1xmh`EW@9t6p0k%_8_;4tNze?qd-zD~4gHlm{@Jif-zsb;dtSy_Tn_rTgrs+-~z+7YgT+DHzn>A)DPn!Tg8+g(|keA^6JwI zK1Z*ioJI@9!5l0CG9zElcx;BQq^`A?YXPfBly`EUDhWb0bce=Wo)K=G@MSnDrPqWo z8GlFPK4c*XSK*`TSf%9L1BiYy&qeF=h0C1}KRXP>D&0)Dfk0yv)G`>UA16b!Xia?I zzCbdr)qGLe1s986^pYp)=<{C9l(Q8`hJ4rDNgc#oBl7ibMCv8d1@uWw(Xpi5pJ%w&xgT;;fF+}>k*Ujrhrjk$f zBh8P6L{v5^_q8;{-}8?t*2rvCofOB^lZoKCTd6>XZoeI@;bp(6i4?T0mq%dcbQcr2 zO9h4S3a?d#FJTOEoKjKFXHad+&L`&;PGm;pY|Be;Wf+oYHdPQPr5JwxY&cevlnuF} zO8Pl|CVo4I^ba=;dBU>Bp zW<81PErg5rS0GT5Ef=~W;;ouw){j#+!vz$)_Up0-$!c# zBpa9=*v@ZhP5YRoNe~E(!`X*|)q!NOx%b0&#B!N}=zl$U(ISY$kFdd721{G+r zg!IgQA0VW0ei2+#8ilD|HFyE^QZOEf*CU6rYVLYadCbo-5Ug7gJ z_3Hu3H`wLSu-UtXq0T~sN8WqolCx<$v9ONj1=qg!J$#&(ZjeQs03pN=ph5pCuapli zPmj~#pwe!F*DOO(e^+V$JDHKdwS+Gp+o;KtE+Q4OsDTy^ltZ9|K8)FMwxHXYghSQ$ zMd$yek2VjIlD-S5c)w6V9`)S?UG#aGGF%@o(Plq%q2uWYAZ{FxdtgQPInX{+UiOA0 zOh6&Sf}}D~3;J}SPH&gj>YA|Yz_+&))#5=G72WrWL%hVT^}O=UqB_eIz{L1<9t#;P zBboF?*k#^N)_4gd7kQt_mn9p4SPfsB#N7$&u=T|wXnk%1u4^4~gzJI}+?}%L=K6wI za*$+y>;FiQwJZ1+fV;oqF$0FMu-hvA?zZ>_hP-S9e(f-Z?t-}FRTJWU(?tPsXa%S| z4T?VNdtT2@q{pG-abRIrz7%B4W;RIl@##pf&%vdQ<=eR=JP&*iSbB}8$ugo z=AL6ZrYMslcR2adjVBe+BPkzTue#!OVl+Kost#{g0R6QCbvu^XSy(GeUxCSt<1>tj zS-D0HE|(su%WfRmmg5x6ljcGKBT!{p;T*D5N-1UNV1%pMqvT?^7-4(m0Vsh9PYjbn z{P$7e4zLL&)^9{0!xVk8dUVG`H@;z~cQ6M%m=jPSfe!`6*S7S>Y~yk&BDP*~az1iK zz#rz;dbq|s>>U>*BZ!W~5kYaltrC8(>>e`BryBr!xvU|I35-R!vp!AtY`DlyiVkL} zhkY?gv3z*dEU+rXTk3%!=CH+Ubu1xFYIMv>WV^$r_kC4g)YY&U=$;Uo8OCsvLKe!i z(O{pi5Qbz&Uh6@m*7rUSMoAZ!`!6Sl(Iq2F7m(xDPR{d);pe|S%zV#HHB zd`goq#)OvwBzp)Pz`q>s;X-Hs#E<_({P;2A1vd|Smhk+5UW50y(`(X*f1QVcf)_io zDwJs7Ka2t}Sk99N;Uvg$4arC6f zif5P{oS3ltcWar z_-bCQfcU7k62xnlBbZn7!|m|@={67itN$I{CO_PMz6NxguxTOOZZn1G@2lGmhK5RY z-w8ktHO#UI-%NAiDj57IU*G~NcdJVbaTu60ky>J7Q(_a1EBDZej%NW;=XnqcqH!|3 z+@FI62qs0MzLEKu>qLTSJ3bV+RD&tvMMTY5WY!HRa)CpUao?%D8>KAk4S0vsfbvs9 z*N@t5^22TI8LAEr+X!B3FNyU3|6%{O+boB5oAe)jL9>}4zJp z&<3b)Zx7o>9(RBJ!z*^l;db;3@gAs_=wOopVD6ZD=|dbSnw;L<2Q>`L-sing>NmG< zJmB^X3tWpLzj3tq4!NOAY(>H1-)BJBWm;fIoA2Pc7?^GuU{<$vzpfeF>L9BXMO2o% zfjCs^G7^;|ZWrMu;i*(Ya(7nD!#D>C)YQ-d@6J(rOn$gvzzJB7i44ET#7884iuUuO zAc_+mdYW8qP4AN_mM<`sB3m+^I3tQ*>Z8B5Cvk=<9C?4)#C5Eo&fnh8KsyWqI0+zt z?^{c~X)M&7Bes_OaQkXJ7&L`iA`Q<=#STAf7w_kxsh@i&wGSRjZCrj7U^iyyrRDn$ z$fy^7<8<}C-PmUuV2TO6F!!IQNju7Y;)E399GK3hOpx4wQe5bCB9_aQ;O%faSORgg z?6RqxOfHx`+$hU|`99VA?GHfCE043P@@5+?W_aiB94AdU<&QuJwj z@|fW*)G$wZ>`KK1*b{xuKHe_Vu<*rUuk)t!)uJSL`m~M!67s`s^7kBn)ayw6$KwO& zapt+y`kXusLm!1MWFYm8Al7j7ATL*+heeCYX?GZe7I0pdopijX}JT%hG9rKVy=O)G$L-~%4mCs;OhNsUa-yT8Fs6;C%GMQ zJl<4ysWbYx3{pzKrS4)DpD2tQgpqnK7>aEfR5u&eTZ(sB`p^1S*KO1IwrGjmO{XPq z9yobNw5R#w460c{WE@*`BCAJtMU$5e!ub^uB-?v8)m3j25BGQl-iW7-T4?Y^fR@`Z zUG;6$da8VnCwsnueUFrb)UbIw=Y@bia@i|}u*veXg1nsbrp_r;Ye_dTuWXMG-z?_S zuHrr|nENoGJ4_EhiS_PGWF!u8+Xvd|n-!l>Modd2QQQT@15f_24Bu0NsQxbR$Vlm?5H ze>6|0MQzM@LVvcnl0_d|Ss?>ix(0^LW|<{v$hkTMYbkS4AzI2EOEGLgCC5fRb!UrX z(CEyPa?FI09jM8AF7z%mT83&~{52H8aXv>88XP~xqBmPv2)S|Y5@VZQb^nEg9=Cx> zX8i?H$9XrWu*~a;)W#h8R=(`#E>-HsJ_`%hC%2)xROEo7H3SErF3oRTz8^OmQ*J*Q`MwyVeCPUh-KxdqP|vD!w`X|Y>;aY8DBQ+Hxk z9uS5-l9lS}kxLl+n3!P9d%FLoQseLYD_@sd80Lm5-6>m-x@v{-R8$Kih-`s%SQcMSMQ=p31_N?tlx@$D%; zu)ar0l)Q@u^X13<;1)#=hzYff|2pI;02lf31iOj!ActJ%-+&0?qN{Shl7C}t&nfg2YE*nP!rCWVr~cmZmG`=qB#d!I^q z70jHRi<&HWsYZpGFY_HT#N{N*)?gb6j$(Hr02imZ2MlIlOR(S{HTVDEQD;q6Tc%Wl zB@i=xjruWxFng2VGVZ^}6)l)efz!;Pjlor5!>C+|yjp;r;icPkXlnwn1dCF7fF+E# z04#yMZ!!{Kg_C7*IJ1(-G6|GWK*KQq`fN`G)`p%s>VdvE^2e-hjB#lfAXxq)suy^ zfS~ec_2jS58tic6Y@~?=d@V3&#w|It^aF(Zg1mjgJ$FNbsp4aybg&dmXrvy^F$Ixc z8D|`bfxpHRi2Csb=A#}tT=2!;^#{{rN%Y?VW$?GOQGBfA8@d-nYL{Pvon= zZ!7|T;9pTe4z2+WdZTiOqNY4{ ztbHS0_dwM9hWz(=@&G2r?oBdLhQc5L2FiqyXu}qwgJ`bYms*v3j6$UcsvMv^XK3kp zr*Wc-+&j3z6k{oYk9`(c@(Pk2Sn@V2WyLm*hJBqM%Pa2KtAVR|afJD?09^D%@o>-| z4tLN`{=2LBkz>%$HTSTUhdz-RQD<-vfmplsE<->)|9vY=-|OY9+6Zj7MebvK!;DjO$}W%}aMAU=!G?!%8e&H^KUkIrHxh|{gbEKX+TsF`2Uzkw3D@0C`9B_?4)8ET z|5wCS%c9@7kUy+(5a+Yc7wz-LVi8>8(fS@nHF)tF1_-}Exc?R#=z$`&ej$#P&B(*l zA_paov4#Q+4r40rDWgl>C!qSA#8V5K#<}^hXEMb}O4<;5IzW^Q@BUjfDX9MBN%b&; zYuJZg1|398Jx9I~xLANvZ| zW9E2p)f4Y-!e~>LMc!JhhG)oSV_D<7rOZXAPmu z4uH6MP#$bnVSIl(uRCI1ssHKi{1^{{8_VAOz)s2>^>4S6`YO)-sb$3n;@sc(N!c3s z2!-9QS8c(4Cr0-`%51z5mQH@{CzWsJFRXeh1aVeG5Am$az*cd+-tP^i2KLnID8UgQ z#ZXERE+X)Mw7BBaMS~Sr)}X*WT5ToRpUVUzQ68nX66Ege=T>Z#Bt{r_xogp*JR(Cw ztQVgzW#@3=dXA9#@B;yxo@biDbk!IanyZ=muFw?}Osd%RDV^Ordy_M!-9INJ_=#lv zKzmILXUj}w;^XJD>j4Om>Ei~tuL5JmmXM%Ps9a4Ff`gIuRR!;ma~bhKu)C-7v{TLLoy{{1=@Z<~CbadGpv+08 z)Aizwy^kQVTpVGz3W#M=S3j53mRq5t}YLy zs9(C5*e>g0#FV%Z`&NuYB;Mu1K>yW&*@wCnkp;Oe1?{pGK{H9`&*fX`Cx(R1Cie2L z3BH+r_@Ip?vCv7JY~+6Wb?<&u&y4M6ImvvNLg91l3)jj!!1oR<4DAJZMVX_WsiNQ_`;qlrBHCMrAHw02*QO&F8WcB-vl!;xJ#$$ zD6&Q&e}U5fGXt?tH|Z{Sptz$mPwx!sSX^WrbP>I!REsf z#nd~6m6q>%+_0r1B{S0uBJhBs39%8eyF6kG&9%H1s?uYvn7Sa21ue0mrJtVxEs^dC z`Tc*R^fMSDwHh?M)^><^*))`d+y+;wb_8LkAY1?@2C;2HvIB4WJTfLXqQ$SaQKw5j z9`L&H{R)~NNbFCwI-?t)Mx4h6i{Cl?!AfdVo`aRt8hd-ZWygh6V4Lsc&AbP}#st?( zDFFyz?HxA0RZ-1X+(S?1q)QyYPes9x`LB{?1>xczo~7JeD1Yc0&6)CUSYwwU7byHf+*T6h~5Y5O zz(4v1u$zMqs5+&%sr>xe|Jb7B*Cq})21b52$PVVoXL1&H8xo~Sz*32I8nDD154KbS z9Q&4MR_cwJ{lvxGzgA?U424^lrvOKSO+-Hz0@fqUao!!=$eeM zqgM@T<5lC=;f(_a-B?7pTow;LL(NuX&Mqfo^#NRvFPkrKg=H!ILk%M43d@GXfN#*M zwLG&1_fd}?F2HdGSjTSi{L#?^xbN7{AN|iw@(&(+KCj!qf9#Q~7V&`dfh{)Ip%~~l zrW%3X6YQ$f$R}D!{SF9m$W2OMU)8)6G83j_JleijdcLWTtkp}x%7tJw#WEf4i^p{y zdj+S*0*)1PN052Gp%$)-PN%_b&C8@(Wuzw_KE459Z|CUxINd63f|ohBBX#*#6)z=?v0J7ODCmM)@%XV> zCzNw3*tU-Q;zS<{CfG{7Q8W#4UayZkhB*Xr^}rt|PgrYo!FlWCHCo80#MF9{Q~k4kv5(aIAYC`%JRf8M3e+=@!547x;tKO##zh zU=yA_T_UOxuTLb<4!V&M6aR4aF8?qCYT6RHAz;*J^e6-Vu6$z-bk`fe^3twQqKcztLCXWGg;qg5=-Y{f{+c64^m-Pk2#*4@} z53wQjc6C7lq(OZqjjo${8?CxDdDM1Otu0&AhM2U>YBsTL7HhdRh_7y)n|tZZP-a0~K)~q7hDZ!8XCO<}A2I}oIT=K}- zL}~LchCdQ#ao`7SAUH81SXiQ-^k>Egr2KK>*we_gVME4gP;ADW4CqPHpf{3T`08#r zD&9We&0gR@!PF}9iqvFiKrRTr;|1fVc}a!-9D3Ef;Jf z_I?QW#$@1$dej$#3iAy+AhF>^du^k+7&sFQJ53XxRL8BnpeX~zU_SoQ7rzga5HpuY zMc^P6G-^iS$ZxkL()1H%4TIu;#z5gZ8gdp=R481tNLmmjZ65JXQppv;VM-wE9af z9Y0r3YfI_@y0%Uk%2)8?moBmgp?Z=KR!@J`*8irQhJ3em=moy7-~KBh0h|88_AESF zV+P3!Y~Y3I;vYJl;*EN^2E@gWqJHyGzQF|#CE~Et5O5ST%?t7(x*&q#5+6qR_&`?{ z8UeT>Fws2r1mbsOk=eWrK_T$?9i^ERg4@Wy89Z3>G7NWQOY)bNy!`CQb^wfQN!h(A z4-Em21N!U4(~RH+K42w*@|~3gTwcgwRN`x*0~$Yr_VI2Q(`LVyx%C{y(V*G(22=x3 z=11DFL;4qyDi=!Hg8IRxiMyItNMpf@hffsv%*x4@Fk3h�van$w%O@?||x}LyG`0 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�ocgr{gPMf!cA9B%dYJaKPj9+sc&W4P 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%0DJo}v$%E@*oTB5g-vHFF0f`h9B~qPhd*{i< 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 u2AEY6c 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

jy?zCRj?Y^&`WqxD6)X2Yg`bcHjjz^-sVdEXC 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�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%0D^lCDWAFN|0^;T(8#I+FmCx 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

ojiKvkZCIzg_*Gm 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Π7q1KkWEF3FBhFM*PSMTO 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 y|Chf=M@8uI12BEIt8LH8 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�Ddu0vPo?%^`ll526@IE<0{QoHQ|2}^ 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

fp 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≻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 %CSy!M z*rx~Vf8(VFoG*VM!VQwD{>y;9>&K!Y)I7UvGnWh`i6tk}5>hDxB>Ie&Y1$FD0ceC2 zyv*6S{ju+TFCJ7`Z*HIY$%3a*y61zit_}An=OBO;U=pAxgO0$o7Dxk^D+4_$#xoB< z7z9=s0aaoOGH~mmfnc(io^DF9rNyi6USN@&9A=67_p6QFFUWIMM(QEDs^2PVUsY2V zw4j8k?J27A)HvsvVH55!&Le4++23Gnl;y(_UPSUX=I#Q4cw^ZA*=i2b-kAq4b+C@_ z)DL|Zx90?9xc##dHR9b`**Tnc`w08@rxrrT;F6iyhQCIY(abhr4(-YTYkyD75B3?MJp3S|L~=(h5ugDVxHrS00Vr4T41qQ+Y$Ghq zjI6~fT<}H`YDtft%ze6bmC8$IKnq}d*%!j)L5|QEL-!$^bXWNSg;|qZe~DWIdb=Rl zC-kT)_nz6EBdn-T#0{~5W$%YxCD{|c!UPPkGyf7CFTI*@>sG6`5h){zh#@O8_S+=I zG?Sp;IKvaiFAL;G*N`F9>nKn0K`22xr!&|ajkgUQ3#=Tl-2GmHK&t;P4?MWC0 zjs${q_wM0d<3gfir^}MxADJkjxhDtsU<4mKYN&M&8rhf5a8Y=j)SCRV3c=SUUMYfE zJa^JZz#_c6(r^*o#$!CpK?#95fA74rbwDTeK?3y>;yO-{4;EL2;CiQ}gIP8#M$ydq-NM@j zIp}z3NahGh7z<4h+j5-;WPA2Q$IM+^=30ZHJh)tOa7$N&lX1zgt$uUKLrk;g9j?E; zjNaVlGWHzSxr;r{(YmFwpsc3lF7@~w2ty)- z)(*8MktL;Qi+Ug4P%>=Q12zTW)uvemFf(g2l@nxyZ$Q&3$Eh6|2)<^yQbrd`e5_yd zXh(q%={-mSOH|!K16+<+>?QWsXwrnZ7pNtXX}kw< zbp0iH12^pHrdH+!W$SRX9v(1bx5;teZZ1c*BXKgVAD!9ejbN}mi~Y!O)TE>IL6T`)P6NZc0cf$td@$r8qy1p!uuFQfhk!hHLN2Z4~BK0F@4N;Oy$&Ewd z(Jj9kf`A%a2rX*yPuJ`E;t_|iXFn%y8?U_X6mezQV>RR!mg!_cQ_q7$b^mo0gY-w# z8ZOj>_k*%u5a6NX&rmDfr}K!>0EmUouSq4F3OnqH6gWzqrZ9~AekiC2zn0MziV2Hz z>NK(@9Q86#SYmv_pe?WA3bmT{F#Rc8W344>d0UfvZtOu;XuM^Mgo6MIw3h>fl{y^O z;7g&j;8)kIPd{~RA|qVRvG^3T{Pg7$yF#6nyc_%P|}T1!g|9Os~zTQzQ5WqLVo@Y1^0jZ(FkvH((b za~6H-x($g(4FF!lB6tLd=|5%Yx~&SVCuU1JxWky89!e>_Nr`71v|YMQ4%chc?o@r;(tu69m*!KE9_(2(0$Go(gNHlm>v07lVTd(Bg z_IJAuBKmw+kDvG!Y3df;M=ofsI7c~B;~thUjY+M<$E@qZLw+cn6N@>5 z?JvmVU9n2P$O#KD1KZEJ!&W5VRLYPP$B$bB>kBfT#Z2J!M_fcQ#Vgx@X-9vjcOiRi z0#LY^RYP{YKc=V?-|WWn1)S~xo}PBw$sT388$z4J)W>dfb!p5hOj>uHOI}x*!f9@v z3iE(yoBR1Bw%_TlaR&^J733%8$7Te7YW2UI+*%*5YjMXsx`*_?EImhfCw|Hz@>i_p zPlXvcmVHnwM{xs4r0|hxM$p{(d(f7<- zt85BO2bPoA+~z2;2E<8-fj-zxzOQHK)>rDwHBF7;Yy{tlF6xY?{B?}+lYbEONR=Ln zWGc!M9J}}m4SMFXy$W$qIsew`Y2WcvnSrTzDYe6*>l$#x7&e{X#1jP@frdch8)KBM z^JvYZ9@QL+Qs&7T&Dvcf`y(x^CQ239qRdL`RCT_D3JUBqJ_xo;JiyOKoS6w2N#VqZ9(WNb7^j!+E z%bm3Sz~|+3DeI@SG9njYijuwB{I-5s_2$-Lq*3M5PZ}wANx@wmiIh`In-Z7(y>N9M z2&B5sSG*+p;nF+&$E8P6JfArh21|D2qLM}{!3!_a(~&>_w;s|t!~n=wC_rRupId1fTCrDqF1Tb@Cy)dHZ=x2PqbcApM>W{R4_t#MG?-71e9gn;Sjzijv6N~a`y z+A3Rd=fDngrg-+e?WY2c#{GYI@={eN^0G3F;~7k@tZ z%y&DE7{I z5E$)S1H&VjDv1{=`1u%Px>0QV$5n)66y3rh`oQ1N7`ZJ(F%HQ0V<+6QdH}Yga?Xe^ zj&4G?PIb|*rL8GU`%`IQsbW8`<;lH8Ark>~x>%~8)V51ToWR7jV}8(MC{T=@#@NfV zGDo=%hqd2B|oSJTqw>B=g5PYd~tY+*bVO+rd|a3`Efi==WQK=m-Ju%I)(9=hl{9vUcv zGMmt+wcG7ExPrw%k1gq%zciTKzQ`T714OoW3<=6c2OVd0jS~+E6__SXglU7MQF=T6 z>XAx+gzZyT;;evUr4obS%b+s^j!0F?M6GMJt&{@BU|4ilm-CbqBCdp z<^H3kgBa1C2%u(bpGX60IkPlHGMOvgaU>pl5VB_VVU)MBcG^3p= zz>fCXy1T2l00$j0cV`?QbDPr{KA{^4O{eHEz}f?N;SeAwj;=1X=2N<2Yey8YO>}UW z3{^$q6&R?y^&Xt9m!AuhS57lKcd_j-S?6)Z-19;CfP`h}>@sq5^N?Wh?K12m1_tr_ zLLw=ya>eFP-)GmZclx=CkZ?a#a5-NMq385|wMNNY6kz46HmG(R zYb)%|hzPW~H95JUI<1vJoPy&#ms664PK|Tsew2kCtMJ(JA1`OI!p!fbDbaD!fQZU= zR6uh?o>9YrnWz4NV5;ZRo-tSaFjfX*Un+O5H%OWv1X(@p0Igo`vD7-Gc#nA7=kvDM z;3+)R0?;nu=S#$vGuUI?-MksBg;r@dJ3D+VgK?JRN+^{X+xhb3(&f*a#>w-_W0B!6 zrEaXb;3{x=mD+t!79@KOy#AAW&B$j=w9(n_iJ!gNHF;gIKq}?UZ1vzJAaWg8-8+2S zz9E1MvI_YCvF6)D%RlMTB;gk=jw2t6V3(}i()0?uMWR}>_{G^{K#Hm8h8JO!%;4y~ z)|^b1pe8FMf;-WKa=vHKDE@YLdUJ(W;?wnbc{3}c%Ye`z`NN)kfHwkT;RD+X{2hxH1PAtVe(%~P!{}9Su#WA5`%0Ln!F@s5H{R;V#@eU>f zwKzszW`?Eqx;$`nN@;sD;^`5r1ln-Ji;6&BBC~+7qC-i_*vD(HD6pGoeMWpF;WiR0 zZTQ7Ti*$*zH2MwK_x;pa&gUM-E>`LT^H|x}(UyH#w$?`U@}GnXVzC4({mx(+accX+ z=4y5rKh^@r+HQ^>R}>#_u@OMA9!ZE7r5A%F{@cXVK0y2qN9%`=>=C@C5G?<8%m#Bw zA&E#t^2n?h^%I;6r@w{b?HN>)T2t*us`P#As?M-=2XIUDaa31f+??ndIqs}C*M6k+ z)9r@Hx;yKQ$K(BnO6Us#dHEq3LY(^S0E=1=!c8Z^;1jt!vgV(1nzDWfl1zr%MAQhG ze9}X@@Op)M!GRPvRgf@%)v_?F3alTe{#Y#9cc1&PKY=pG3cE;qU}H^?%j?3pjO4H} z%dVe;SHme=30T(fg4eHXS0r0=Y4lUQ4+yh z*ZVqgu9c~Ajh|xpbi(lp;$DBtP+3(n$>03y36X*IoRTI17v>Lv zJwag~vi?F&)MFaKm4Km23|Dt&yj8QL*8X*iH+w5NYNNmR z^ucieSOETOjHH&voB7;Y>v0zW{XDC^TqC-3RX@P-1d?ImFTDYANBx1)OHwyjH;VD; z-sqU3|5dS=?0@jrtap90R3YW!{&w5{0{%y@WYPv_JVY_47!D^l4dqVIQFl^1DVd-? z8*^5lrPS^wtyw@R9061a-1@~BtQJ`;Y)H1e+F9T+FH4*796|d!NR_VF`NpRM>D=PS z7B1;CjUuB%7=&+BXII8DKAr(pgIlQMSc873Z1#*GPH(E%o+#6yOd&x}Hax89g*H(f zDFowIa+TppuQ{G#wd&9y(P_^Z%yS!ZaDcU9*2se2Oc(!Q;o1Gi#G?n&jM1PWHGd63Ns1Dhhn&a;r&Ga z#xhlCxf2Zry}QY3gx>S{rYVlGr2w1z$nIK#f;$~%>=vCJo6iCE3bqNd`mnD7;6W!xr%_RnWV7J5$C^w;E-M~R zLO;o$U>5RO-debuAYPt!CFe^bH1Y;8WzCUC{k3Y+(hcmF%)8wh8PMgmQGY%dJ1H_4 zmCfomKvBQ`DIz=&ryjYRJR}XEC=Ek&5B|C@A6j^F;Z+QSg5H?Fq+_BR!Z~<<(J;Pj z5#n!HV>V~K3be*kvNu9JBwRHj!u}Q~G%FfFQtr@gon2S^P{(`4zE}IpiB%I$Q+dIT zZUdS?ntBqfogqs!E}o}bfMflA#*3Xt6geDy#7!I|GVEY~AJTT8O{scOMGD@MiP1`0 zp=c$q=<)*{kxDl!U=mWw)yE=j5TyV0i;(vG+VAzdm}2+8i}+GBKv~Y;Jq99yMQ((YV31+YM{7MOo)n3gZ*6cQixp5l>i$9s0~PY5DM%U! zx%n4!W}-33NI&z+;}}E;Sk0^J>dsw)NR$<%;9c5%VR&A}w9V3;jQx}?4ATG!Op(<{ zr3|U^)q<|>^A!Jwr3AJ`y4V}r(iWQ~FyWbwyNqyys{_+Md(EELsrY?}g!zFAEOwDi zB+Ve?9OLr15H4ZX7lfCk(-d*8>v$jt(jg5dHf#mR)S?}z$Ppb5*v_sUZ8{gl$Tzx` z|Bd#S%}|Jv83>zbvT6ZojISV_4rz8&(@W#L)7n&(9&q@RzdV^QIj0CkpbwWfh+gl( zu_v?kY~Jk~N^D(HXGg2ssaFBn&q`)YK>;!FaN!$}y2rpgXN2EuS2J{Xwj?IjRLq+Q zwZVZ=i>+vU(G;R%a%?HThw6ewg*{+07~T{Wn>^AXi!d6&fowE zr79IkK-V%MZ2(RPc|#!#Ad>xhi%7Uh;K8wYkZap+GP$6juoiN%@j z6u67+2|GlOp~oTYxGc8=RhPNg$RM=M@j zGcx2_yAg6>n#5YkXr!GTnpDA0n!ZF=^QF>M;gWD71FakV`_S zhzZg4azik+Q^tYCJA$+**J*MKjl^|OxfW}7A%sBlIpN_G965jq*}6TGV3AT~l>0H% zupQ`PNOP$|2l1-Ufm3ZZ*93e)e9Zwu4DCqgLM=-0`h$u0XEh!;3n}HzK_=$nvsKF#lqLOrGqJ z%X~3B7g@yEUOkecnH}F8D(`7*F2dz*t-hMcjPO@QfP|5xAaQj4se8_Q5O%$h`g=nbpAQ^`66e{WV3!n`xNKI#9c?Ucep;TOT z(_)G-rtWOtat$x72`TqXtWpYM;7IIu$clK%ZD2tN*NKt**9Y(6RmYhTkQ;hr!}5z( zS#`F^n&4NWBDgE3$t%%BHgv7kD+Kuj`EPT=cDh;K6a{ptF210yGk&$}oB>xE#M;G&Ls2s5gV}8mI}*LtZq=%EINj zC^Eii?&{6_YESf2GLjeyIGpZTY= zFDvH6*X|e0@d$>i`fgxJq2l4YZzycc-n5!TyWIIsLcnc_&SLPDoK)P&zWf>V?<=oF z$0y0J9a%|#X0V52?!#n_e?TU$tvcFbgxQkIQPVFM|NVb{&`~DXLTivdH5?p71xans^n|oNi z@P*HSjKveldFN;eu_O4Vg&T2QTdI)))k;JZerj^N<8~*3A@ekhB z?n`UzkNT^aEJeO@h@F(PZnu*s))?WvfsmRbA~MF-Lb;iPZ2+(-|Lh`b@Oxv``VPI@ z`7zKRcS;g1J&|#ZXJsI~MIqFcFE{R9f%82yW5yBL+qeB+Rw|q0TqZyiKAy zp_mlj;R`TKy=>Wmhcm|8_J5=vjwuvnL7W1&dq^9{zOJ_)->xA`qC1v)znjMYRv&Y! z5B{^Vg9Uio!L9z48*{8}`M%fx9`pN}`>y>w`To-1;IQ+18|gw|@bj(s+_&-bs_6+8 z4(*$7%i|q0i}9BY5&x058!31%wMl9agjb8dKHwP3Y|np%=rKS1pN-c+G5dUCe&V@l zg7juHPq)z*zSpm_tHZKuq1%C8?wF~w?Q!K`q=G^Ur5vYNXhWfS*iHHxyr!lMxe zUarz6qoy*?G~=3lJpes-IUqwlUM6kx&-wGO!_0c@r}>aerl&zTepAktt)zUqS)0_j zJprtwLBA@=r-%*%dj~vn8Ic5)t4H%c+HN+J;`4o+&0&qXfbKvXsTr#Bpf&F5JA1%x z#Qa=p-2%cqiXl$i#x_~aXj4pkXzsN98=?V1u~D@TWK#q?ayL=RtxF7)AjZdOr`n?) zcQbXG7siwEU)tpsbh`gp$6!S@dzjJ4b0kKKRUmtB(Q=ka!Y;Blkz`7?O2%UJsLEvC zGZNFz$gE+;%9dIBC}kEQ#Fe~^OhySlYY;NZXed`1HQ9&w-`G5I>QBt}%0;+rQ&|e- zr^HJ>dau5kM7PEswNKB63m~V($i+G}JvbA-Az$1<3VJ7%unpSrq0 zbs91JsGBMz+Az^Phmt*F5HQv@IVpUs-xQ>7NAV+J+C#@+u`)YR9Dt{Ig=2fN5S@M} zKO^vk#p^SF@P=C$KnYCreM$_~w?sU}T%WN6;EH$JFuS?`_7Yuw18lsj7P1{fyF#jT z5DX6)ivN#e-Afo_rhTkO9fHy?qNiT+`zwW#eFkj`jen_}>Gn|kXvAn1B zy`N$aKEaIWx#3Z&dm%*%C4GBj{d&9xnANbP@9un`ew?pwcZ^=GI=8j4H+$qT@wM$T zBrKE^T6@d)KMfXjkhsbU&+L&nkgeWK6N)LgQO7n;746>45aquxC#F~d&_~i{LLBv$ zQ|)5nu6h{@p2Tz#*?2wP7h_)Dh#j+!+mG}1*wagLaOYsBRAEnTE@Al8yJmhcq8-I_ z*t%qTJjiuoD2h8Q`|T!4NhMo_UZkhQ@ij?AlPhuuA}#$4#8=RJfG*iqbaw%6-o#DT zE^;tldoWY`miM>EEP-yn=b^qC^gqG*H}#oTWJ2*T7x1JyB^x_v6)TK!bBbu^C~DQ` z;(@xkMr!m8xoFl4px!BwYPD7t-f!{f{_dtwmei5T6Fx<`&35k612XS~ha96%=A;~* zt`;LqGrV`Jp}mR#&2HD6!WO9N)uBV;H z_gWH!DW0_u;IaUBr8c6Ak$ z7aFr;SSHX8abMSpit)lJ8%lB$om8EOlB0}U)91*u9&J!C<;6NUnWcF4AK<7kAaEaX zBH}xEQiTv8W?+zO=AQ>K$)?tpChMB@7`0jvN-zIPwJhLO2|BSAjbj~|GiHda-5et! ztjh3Jx5bA19ObM)Qc#&lOp3M)W@N?s%;hC>-YPd`ksi%dF%rN84&@|uATk&pmy>pl z9;)#RDqv$s1_g)vhGCtfzN$@0rmQs3Usa)1jg>S9ry2eJh@kkMI*Y`9#bim-wbId< zTUYxWoO&%@C?L+c@fr*HC#?y|DVlK`R%nnERq0rtQCNX8ong=c?a3dQU#ee^JSl3L z%?F}lqO^n`j4D!~>I=9Cdh7T!@mGdt52*)yxVB{2re?kV0b`%>UmGw|DKvgSaW_qb z1TI_onF#qjOZY@h0K*9irC0J){+5GS>w*u&0PbB3Da?}(g&(mj2Mp$p8ltdsu56$F z1F7LZz}6o6uo0wK;g3Ht6g63%G>A_z7hGWyU~#umUBlcBWhBX^x{>oY@KKob{D%LALXlJ8o}FJB`fU+{tW1`@9>3 zqTq8_vB~-aVAEOM-3iE{4V()cAkNEsz>`#OUliJ%UzpcIo3oarwZ&?91hU}iyu+EJ zmVRo2H<)DRjU&e~Z#y6!M63*RUTTqHv@{wa$^{xHIIIqv_VeRDR|iV-ftbD-K0{?1 zG#!+Nrz)E_ML11Vcn=pD)=AKXI5?WB>owFXI;G&glWh%#jQga6zrx$?lS~~!Pan6a+otxK#br#mPs;TSBpnnbfj}i-&uW5zMP@z0NQ{OE6hB5bN zI#w0;V&!Ez@LG);$q!H8q7a6QhLy~Pj6Npu!={_0^do3NFEQb#GyJ^up4u04WiUno z2f;~YxR=mw@dt4rRYW0-8Ew7h2M>FKWVDf<{4g%etSrn-h0gQ}iPB&g%}|Bo=O}w4 z@mfuttJvg1#~8<}Fe(1oWV?uZrkFAZZ_O^wFo7vkk>Hi#@(b9zZAv_$YrVkAqWZ3e z_U0PV>3AXZkcq$nTN7e5Z&r;YB-wN{;y+#(U9Dd552b&`0U;u`ga59a8o<)qWC`;C zh3NDD$uz}^c&@`+Av-dU0CYzsoWjcrF=B7mn0zXb5QAY@Wuat}?0^)0_ z=6IZPIG}eS#r819BVPes7z0Vo7?u@2zyZv?p;^urqsQ4H+8)n>Kuom8=4?Jq483Wc z;Tk8`@SqSMyC)fqg2Nn1C4T%Y8s_tdyu+gcypNvemm=NMC@K0zY`{~+`9zvMMC@o+v8f&p{i;`{?yjn}|1p$64Qd5VY0*-#C6=7Sw+1$@(_ z5$W*njHiTV*&w(L&={^65W^S|f!|JfWp5$aLFUq-KlLrE>1KAJmQ}c)E)@+0;^0}^ zRe7o|BMG0geUfi9Ye-^|pxjFPqr#cwNT997~?N;0y za?Ygsjv;H7m4_}Jlk5v(4Mq`U?16avSd-j5X=Es` z$67VePQPJGmKJ{QMm&9j4KDC-uWF~)h& zS(FRJH;8nNHB5Kcrh^^F)PF4zluxp=E+D3 zsO(mrCkCNPs$=LSV(v(SVgnEphzCdnRfJKzG?r^1CO8M5VpjNOxt?z}vsG0(?u@xU zR4Y6$!6Qs{Fu}eToAp1!J-%S3(G>%8{g3*|@&1`z;sJ#OP+GSi(y56rARA;M=WL;e zJP+UI^H_j8lNw># z{Znvz3*;&!*mph?%^oIvq%J&+|0a$1X?&G2r=(;bQnGkHRJqK$(s3p;t^-2CN{p=V zM`20HLnXJQjMLb)yo`pRo`nS=cf&WZs<;%3?VZmTtHpA;s=C&iF~lya37=x-GMk z?2yQv)p)ic|JSBacWmov&?~WT3ENtLL##+y>`!r_+ccb^yAow_Hmd|~P@ya(diu1p zWR@nIOlHg5^=2`ziXTmzU_-U6awWlCYWg%{II#qp;rrp7hgsyB3m^%ixd@oNm`%ou z*(z5gGs16PgsWmO(VN*TpqZHodDN|R>`jk^7Z|U}f`wQwmSxZ(8(lwJ#Jn|p$bmCd zv$c=HahC^Zx>WSdgI;z-h>z}d3yxdx2`k$W9$OW@Ag=YBhQ5^1+6fLQ913n^5L};T zwK0MU&{6qFvK#>2!U-5{Wv4lx;ex(p#lOVb)3(!VP6pB85Gz|hUn~gRm`^Ix6Q*Iw zP|-$_A2)v~u(GJ!%Yhz;8kjeVJ-bK`Z}W{&b0m6EsDeAF6&35zYYUxf*=(P*KI>q7 z!J;#x{K54>O!J5vBm&(U0cwe!h{KeoaW)BRy1*qdW_f|gqvP(hM^`_cKy*M(XAmPn zx~DIYCSAWbEUzZMph==5sbzpJ!OIdfofPC7^J$^AD6918WSIub;m$3?u%$boxJ{`Q z^+I;ibewMtgr;=)tbN$@Tm+SdtxvUCW&Y-pn0%OT7k%VDfyJPqWE0@J) z?DYYgDi?PvI06hhJnu3D2h3M@7csixakW5s<_b8y0i zOK=wmEWf=&Pr|XY)_`lG7X+=dS-v@z1+AD+2{Y9D4%=%2`#u~Gd<3hLRFhs=6C zj)E(xT`?8($N0*JQxRW~JeZjh%|!~;Bn=K86F|@AA|gZi}PXJe?TDa z5^W?4EsO^Ols^W6s?o5Z2_GMoNcaL4=MTX6MYA!W;}y(3yACEeiu@b-P)W zbKZq`olOWbmwE8uHvqU5vI6|g0e>qKBjHf+eY=^g zGCi?S8-ZLOU4sASx2Vz>D}($g&=ZFJO>azP>FO5qXZ^rcfS7Qq^|X0RY6VIW{hx^2o4ctFk7e8rJ-D)`l*xH1u|AY5M%u54Bmev^#f znqMGG1kc{&gzgF>x2BiKQWSLo+X`cq%Px}P+vpslpL2(`W@(iWFvY=w*u|&WaWK4jAPnc>%23X#bPu4!(ujFE;f_NVkV9` zXyT8f{zu0hIj%`m6KNy+Py}@dQC5UJa_QoO9zVbYTS6-}hhZMnVL4kpQ2UN;XxM<} zo7+#FUVY`JUZss_S>kceL|u`$bIxS?S`&G+`9a=q4W-IlhP*RvGDDX0pu1!v9L;TX zSvGe9J}y>da^u6E-%Kqr$-_{En9O6RWm%bFo!6nt4#SzCq^?y22|F6bMj*Ss_t}fF z4m97@ZI3QxB6HbEClP5B)7H4bfUd&C-8ItXQyxLgn#4%H6cs%Pdd{I&(!LvM&p92+ zt=35FFY}~i)6@n#SAV?2=G_0$*n+p~Nn@>P4!&FPrbn+QH#;KZW*`NL2x*>kO&y#6 z|MtFZxpCxJ@O{4ms}tdvjw4b8c$e3TP`A`=?e=A2)N||&hob`oN+iyJ00#i2mY@6& z`?~ul`?i1LFWJnjD%=Q?AXxxJH6uK2iUjJC_sY!5j1ox1_W~q1NKtO1(?5#>94k{$ zI={`m$&rt4ut&N!AqK~G2=fKkZM+Se%@&MYzDlEa_mSz@W?<)2&~biVm-bS-_O+;EWK7V3;g9Y>)1)x+2WWuBn+RrWh+I@&S2OgZ1%86 z^ITi26QQ*1JoRg=!L%%mjgwV*kX1Q6$eFMtZkhES-i4} zEy#@?l!1I7;_!~c%$~A;{qz55KZR^Z9ZDw`5T;Y*9=#Y8t^7>Dk>hs1Qyk8C!!IV_)2SSz zh$7y$2BL;TU07104<$v5w*onH8(y0`(;4Mq2@}o+d&{3|0;KKDI718aYx=Gv8eYr{ zmqBhELJim=Phbs+hMDp%E8XBNAVnqCL_Q+Dt0AzVK260|K#}aKHERpVlv~p^=WP|u z%guooU=5VV$|?0)y^SzF$VL!PyR_q0WKMYVZJ9zLQ@qwcv6t;oX3ZOuzBaD7jufyB z0NEwdkjcz4CmN0v@+uE}e0ldD$OT@(Bo@zu52QInHkU}*LX{!EiW9_23W9W;ML`<) z&cNBx;nf|Fd*eZ8)QH0iEky+mq9lipUIwrOg6EVzT}%|k6j4A3GCwZK9h^MxaD|YM zlFyym_5BuR6J`h5NScbgcl#h`)f>41H|v=;kDs-SdMxfg8Q#p+&J(YVHP0 zmJNf5OF5vZZm)n9Z7VaPc&J`N&IC~R1ypvBJqWq9cl5Kr?Wl@RkeP;Ak7rl-=c?;D zUfdr{pw>Tz5~S!{pRg=MohZ!X=v;%D3-Al@OP-9o=HgGK70tohyYsXFk7upO=eQB> zZRR~Xflt?f!}BbLBoOF535r7rYlVZ(srn5$|p78l{knoi{i}yO-?d{&p zuPHw}B{?Uacjo~hl!d*x3U6i!3T45AId|agU9Fi7XU#Qn*~+cI(k3J3Ma4|uzZu4GIPMwUUUv^)Bl5r{DrF1g4t2%LezU8jFTJL>ZMe)e z4ti1^jqzx)dSNo0F}7dE$zNtv#4|6m=S~<>$34nD!GoZiWZYAQFrmj^O=V#;>>xz4d)NF*8Lc_kIcy&ybf|$zzE{4nBsatha z_lJ5%*ZWQ-B@)l>?_#F@B`PX^I5EtZe!V7erV?%+>nzkL26 zke_)N$qWc_2?x`;qz+~~kq@uj-G8~byL~6sb}%(P=N}|^L-^4H%Jt|k)78GDek7SI z^D56$?c_BjWLv?gZA!$^+JR|L=ga{KZ6uUZV4XJ*2#jZR0F z?O6t3pUk3Yad~m!n{ZTVfq3)U0Er6=7aK*4g%<%K#G78AqHMwIx(*c8o<(z4hJ*;b zdJIub9}oM(7Fa%i1GM~IP{s-puij`O-*VD{j!sQl$k6WrV#^k=!3-QfOkJ`R)eIi| zrAHa8Nzkm6WWujk#L~5GI~;k}AmblQD*`c}e5sl8+d@eta{tKIo4|#_qwlhUDHp78p|+uEN^FJxZc47&aLK5LPDf}c#HEbTtMPY%LgXj1{-`OkrGF?$)ni70Di=tV}x z)6-MiVbKGb7{P;u|Ka}H5eOMD7Wi)08w_pjXP4n!m7PpOB!RF0^XJ?9^I3&b@H2hPE!iSb8ID?*)^8-y%XSzxsrCTrk2>craFj&ifI`e)1>5_i=cm0fqKCud3tnKu(D?>)sN+=c-L=U7lUi6sMOUcN1a$e58a__hC1b5&NZx0{hUEvTj zP&X`S1^!bQYueP$0p71$8J;ls5eQ8m^?SX+U^oE%-;rfEb8BR-TNX}06aE88J9bGS z79ku!*n!-RN8duU$UZ`co?XR6lGTHx^m1!_d5Z@#qFw#E-zi`B4GXQnS)@YH+n1mH z0jMrEST@n>KBU?okA}us5v}inY@-a&N{abSp1^y58CV2feCO;c<(=>nQ5akzy53IfZv59Do4ST*_ z>ptHdxKGL1@Ay3(P=vUR*xo3){B^9o2k#E`j?sG^yerOJUYwOxx^H_iJFm+iNK%9^ zt_o=HbqJ3ZoMjiT85QM8yjUr+%3V8&lIS&w5*|#&7+DsPHOiKOF&exQ+45RgTV&vb z$HdhK*ap*MV(831KL|u6{QT2RV4`F2O#_VF9rs^}fqya*6ibpH(oi@mxw5)hAxU16 ztuX8uozd$MF|UQgMV)&yfAQg^Gxq`Z!s593`sWnJ8uTd)j85;B@bbxAs6d$fkS4=x z6fG~oZZLHHl^ji83#*5~>!wX9{Kv%L2bc}Dx>MBi_I-k|Cas2U@3ou&PF90@QSw6? z4X;qJya1bFFzOEnuS3$j7DlID6UW5a2UrW%aWnNhL{*b^LZ_#{67D_O2`a_M4{0I1 zDq->xY=g0$q}?93ba^ez?aXr(#B)?p1t5R28Q88C)<}4BOycAKv&1=WNpgo&(r6;3 zF+Q0kC$nTla+NVlP9jX5Mf9rV*h{d8`rT86kgary6qmxE`c^dVJO^!*O9%?Gjj$5aG-N@Bc^XboDKYdKzIzS@Fw69#WG5Di4-GX|hZm6+4+uwQii1tP`sd0jdX zCD?_N@e=pRBeLlnHRxg?7Pkl11xCgy>oCV3eqZ|0A9s<$-&<)R%-`20Z02~h1To@; z_~EBt|Gm>O-k)ptUq0U5{CfXJ!{iv#!X9})?W@DHOE`Kho__aDsuMUWh_bwfLVCw) zegiet{DyM*h1LA9%ryXSuX29zyIbn{6+Bm9>24^cw>rS?75xgv*tw)%!5Ed+^y`cV zyVmq80@d*p^{Zv|w-r?NE24}atgPQa?{{`Qf)=6sbOu$Zy|5=jbw{$7gg)P{@St79 z-Ri4sm@qZk+7AJIr(sQTB{AT2$IRj~^4*?39vJ=cXpe5^wU?3a^*Y_*;M>R;^o;&U zPx^6f8Q}AB{xcZ4-v9yKZfE#SA9gx@gG!3*T!;Q<%`2IQEenot&ctz@==sAEPD&V) z4&lwrFIw``A!X~gL#62T-C?q>>ix}1)%z4FWH}>G9P;~uK65{Jdy3l2QCa_S=aA+D zH{W!4=_{U6&$X0VCg;IBb0OQci?Uq284mXt?SRPA3tfu|TBg9oEM+ScGUi1NNrlhl zpV~>3r?i^mEtVPBzLWiSKEs~^({=*cKb@Ur8l$Z0Ng6RZ+$;kB5x9v;vOl6{0)0D? zuZ7FS!UwdPg7bt^EIijzvvDtwWr{!0OE!&BDf*)AS5f|YWm@M!GapUIMe%$t8h4BG z7fDn5O{y^49`131#=Y(tGA{ zns`;BWz42o^DRCF4YV9vH87LdYHlKmuj*@B>%|bvH5e4GYVr^Qm`ZmU$Pg#*&KQ_p zh>J(}6WAhi0Hlw;tHd+Tw}#x5X>owFhcjd@LE5hK8zYbTAIyax{t>v!o5=3mLUXZK3zuwVahc#2Xh`>ZoXnN+l%La1tF!G)ASONRMD@EJ%W~jkOiWlvC8$H zgS@k5NE)%rQnN)lH_^?RLIOOTAQ{BMzHZpYh}(SVhc-2C+Tu`76w@3v;7HprZS5W> zq(M{eSWSpy*tixl*m>kw+MJo5h!)_wP?jGmQ`0iM3ek$=S1nm_4k=hiWd-XVU?XSs zGNw(b8AFXXvzoJ9!S6g^=pAE5vfZZo+<*$HAr$(`H0Ik&%E!k3h_iKOH0URE@5 z&LxZV#5u`~GJ9z^D7IJeQ+)o?!OR|+X+vO>&AQyYRExV;+hr=v8_Y!j`pM2PGo|~f)}Bf zO~D!ekp-*EN~=8?RZp~?)GUc?-A}D00}5g4`dEcEb=(w-_C5C*q2w`Kk{LW>d>(an zPSs=77>1;%u@}KRmOo#(?7I}@e8nDPcBsuU&KUkHo% z4pj;p`SD7ofxle92g)+=w22u4QOF-dkh!~c2kmuqqc<8?>#RCrVR=v!W|UC|I;n`` zxuxd27^YqTx~0w9(k!{+9z9M@s-6 ztB{u{kA=Oo;sFOfmq6lx7>j)5K$MUG>?QKOiRX$$w!k-Nd~>3RMJaRWe95I;$WkUI z<}<-T)R`~mZS50^6<7kCnVd%^)b`36srjU-!O1F3pOPSPUjCw>P0YQ3b-=mBpcc$oBUV>#w=fbN~Op=E0Exz6F>ZVCz@a9AwuVGk=~Vx zZ|&!~`V7i^DpdiFE|*8L85bvMK=jysbl6j#a0u;~_X4;UN-2HxBt!qXw2L7ok_IEZ2zCI;zeiM2r6l7soLvptdb^yD3nbL8vbfS6@EJ%J_u6YNL#^zgtr0~^ei-cB6AAsxK3GC=j%+V*xUmx0r2pg za4zhTSeefpk5jbDq~otLjIp{?TupND7F>cy?~rW52-fNOu0MUIGXuGl$y1Q_bMoQ1 zWh$)0X<*LroNI~EVOY>|)0qaM*|W{S&U(4E>!0t!*tJeeDD*+MHT3<*@C3Yrjw8Q< zRIPG4KMPIx-K1}RW6u*G=ZAI9eb~hg%C@f$dY!)Bdnu>m8kFtmFlCFm5|o-lMr^u> z{T>Rm#9G!X(C!OSpqzf4xfEEQ@3oYxNG)_JR4*@{;7t~uh!v7ID#s-}7dZsd<-s$- zD^5@-2#Eg!p0_W?wK8VJ#iQQtTzt8C|1Gno zZ^@ck_(Xda&D{brze7)&$7s{I81V?279iYO=|}&Ae}_+|-};DeUDdF9fkg8Pr7=i6 ziV$G*Az(ASyZ4x?VJ2ffN`4v7irB$u8x6Ys)P=~GoPW#3#X$ktTX^NIV>UIXb z;doFsZ9PY=2gUYoDf<8yMCmj{C?Cyd*c&jKAg2-xw9BSSFyH~Pw%Zqz>wH%MFL6&$ z%;@9_Vwl>x^zf(}axcvyMkk01%XF z?q9F}I$nRVTimkF-PiwwBi)!_n`Ezeqi-fF|KnBVZrgX{kooK1OTH(5;hs?n+eH+N z@xPYdPa98sX*%pcfZ<+xcdk8;eb@eNoOy8NrZ{eV{UvekXi9JpZ|WS6Ljn7J317rv zt}F($pF+UE+navkr#&HJUqrk)j}uyKCtSGZbCz>lF6U${jH0C6r-05ttf$NG0E0y# zLYYam4d5ylkSK32$_eFEs=J9FG&;*{NZtv=<{=hwN#AT1mudl8*` zOE8H>go>X4S+HPwZ@(BX62Y2Pi;2h%CWFCt9vypWqRopw;h60C^yeIq@()>)O#Urh zIO)IW`knkrW}EWA`E?9x{vdXT8DzqIk^46Di#W$jWq}m#r7d7i9{BXb)Q`9#UxY|0 zryU2=xCMrrUpKkjZ*IGp-L7snw^yXW)J|9TkSD$L2Bri}R19JT61W*4i)UIB|9b|s zk|9<%AEtM|FJTn{KQU#ATiJt&6)>_Ut&c8qVepG6HEof26IdV~mkZ#eibjE$6;#Yi z%3uQA%=D(5Uz3^}^bU7l5zBMvCxtOWteRnTjBBmkZfo@M_6@-iT?3Bgq_6|)N0}sE z>D=Ng^y&Q@?tPTo*;NOB{l)0)A^Ty2+Rgv_zX6!xxZvw>z6`OF&U0i=vkF0qW_aPR z6g{#v?zuz_vRr_*=uMYMae4Kyt}0HkdN4ZlPiweQKYT@ZF6DgxLT_sS7VmzYia-Eu zP}VzSWDh$X1CQjd_;8Z5!w0|rur-TDC6K-EjX2Lbdf1AUGq?kxslLSxy zEPRXy3Yq12mbr!pQc}yE{q_U z6lwqBYBl*S&JScJ#Y`gMJM^EzOqwFsOqBLSQV)N-zJGUjC$WZwle!(D0^s8~6{i+v zCy#}Egn7Nz9nha8-^KLtP`eJyiDPAd!Fo)CK|JhWFn*JyCV~={%VrM`q^m`0mKn(b z(6f`8o~j5iem4>Xq$^4e%~I~4ShI=|gv}fKW8pjIKAcxbakL460}$ps5rJx)u_zLk z&VZoE@jjO;ZrKc(nj-rAv2$@5Az8W~2%}2mQ0zt0m;^|wfy;Zk@YBN>~?&X9ylSqVuFeypst@Hqt86{ZaiMK_}I1*qssRKL?JOpYmu z3uJ%gV#N?*#V9XUcvecb=$^FT1^3M*K{PdqAO0==>+^9sdnk>aNTWiMVCh$z?OU6maLEO~jS8ete;#Cmug9uN? zcMWYbGUG!ZKXt^nOwhY+I}b!Ok*H*eVhUf$h`Do~MgHAH0fFh&;@&D<7sTLETf0f- z;qQt`NS!LIm`(HC<2*q8gSIg)rhV=z%E@0(m`p+r3%#H9D$sEO^BG+*KxExb$$(+u zwnDW`&S86*TSUw9m$1%fV)^c%I5)Xf$3j8@d|XCxYGE<-Dae?Pk*tM(N&k&lpCt_4 zHF=rx1gx46SK!27XoXZbiNmM220lBSjnESBjyu(!jZ{V}56TdG53i(aCjJ_t(+7y> z{?pyZ-48McWQe`5INq4{dB$=imdxBxPVF7^mm}CFb??B$GFCk03a<#Q+TxT<%Kd0$ zuB;BiOAnCcM>>+3A^96Y!DzqUWl9HV6eWc(=jL;qMTReXQx{!6#9yN3CM;W6&|LN6 zlOkb6Ry;n}=1VtnaANsdn0hZU0*PF>sqbKJg=tAsAb+t@yY@B;j~n)IcE!ifNDI0~ z1XMS1yjWcM9^*NoK_T4u>gaox0D;!QT{);4=}%dkBXNK3Wi#A){OCj=crY#0=Mq%O z!N>}j$sLg(OLY54K&IPDg>y9=ER(r#Wr2C_rna8q;AY$+Aq+d!w-sJdD}ddk6(gXrE*;1 zE}3s*ePHwq-S}}b-}Hkr-`-Q`_a1Xdfx`rjcb3Lw*05F@znI|jtqH`r+cgOc8&rN% z0wWa&|FZ9lImHl zk20F8K&hEf!Tf^-eymCl2S8Q@bBrg3!DHH*h}V-#eNRXuZBX!IOM$LOrNq87Ye`nf zgS=i%gaa%TCO>lb9+)}U!UoSxWby1B(Njl?$n4TLkU&A<1S{;vp_2lFb{B1Cu5@UA z?zoo|Hg!DJw4ZXO#dFYMt=H2x(|_tnIm297c|$XMDKs#eWjt#01#qfH6O1f+VC&08LS~;lc-kljtSwz_w{3@PGfkCo4CnG2gLL68r zF$1du1>)*b`ox^^EsW6&S2mIcE{(hm;0V=!O`ol(K* z;O)|N8R&tJ@O1GBLB0c~c8lZ&^^n-+ivfdqqd>?&J`J18&|i8hY^y9XAq|PuDajNa zuQ4fd-2sZt_+9-~+hCN^E}7*f)Yk%rVs<5f5+wQD+Bo&ul>zp9w~W*91py5oZwP4I z6HP!{69;&qKuh)Zs2OHBGY46(vp2~0JUe5ccVb$6-;z5@P5nq+~`+E+ow_ zZ!+PML>g_;n)Y)SZiE;Qnf~7y7VkSU1t!B8V6t6-=?;CuhNSKQhJZ%9u9f z7DoLp0=~A+KctAF?6~}i$edhc$SXq)m!5Bn{uF$k$iYe|t-$vq6%(&pLvnygHp)$Z z#j_SIAVJl8$3=UXR%0&%u@)l~(RKQsTatoP^Jr1M#?(hXd4d_DwZ8zVr56`2C#gs9 z68T#{iu`#!tBW&P#ry#Sn>S>#i=0ZzxhRm1doscyL(%(1=a3Q?*@nI0VB8yZSK^_0 zGd=I)KW-=fx39j{9e|b7{Wk9Rh8^AL56>>HKH<6bUbwqQMOzd2earW3y7wymnC4xO;w+?A5HRJ z$H))q8ZzE^q6$UmOaF~Mr+wFZdzc>_ys1E930-(;vJh#iSzb&c&Bq@y5^TrIEv^mm zrxFm*dgoYy$y3pIfddL3gbX;%E{3Q|;BDMPnEP3Xlqgv|wmIet25AvAwB9u-DZC4T z$f)2Fa<}6^zG2|YJq00WQ=zyFlf`r<)x-6<_V!$RN71yKwsuQjYu7@E1YB;f5Twix z(cY#X3>{3nF+B#N1XJ5_uIqTrcj-raf||pWHj0--i+LNrc#~TUKI_5WS5{Tzlig-5 znsAX%Re7_Jm36I?8#7C?3323eAHy9tow8)zy6k`tZQ2_>>I{#G#dUm8TkiQmwQk3tM5`tulqy+ zN-t!6TK-EZqkZiarU1X1*g-l#5GS6JCoic^ZLWBdxQCCfOv`(|940i}PI-eb){86s z)M-!l%-n|dTA~yCp*)F9kZ;Zu5eTZHR%%N{`MZCkH29Wd|2@6Q-G@sh8C$Mn{iZa@ zxOkCTT$U+JbzBr_{a9D3d|J843#l#&B_`mlYDZhTw#To@{N6QJ58$cklwoPZxJ6XP zXbw{jW5E+LUm3uo7#llWv+Inp8CADatx{KbcUeEEEYk;gEnKUenv% zgUcqDS=KrY{o(AQx@*iAyG0w*C6?t)=TKCLOGVpcIpw%l)SA8x`rr)f>qc6dJiGiN z0>&cJl|=T5kM6j;ba)3VXz+3xxFL@{l?-}h$7Dg^E4gPNm(!vVK{$=t-F9z_8sZZEU3Y7G8!>Ar5ILjd@Ie-_Fz7#Q3LvBKg+LU|o<_`3LU#}2@ zhaa8L9}PM>sM@>xFZk*2P2gXz1^@a%_*VmO_<1&W0o5mpK)Y9TZ%8?`a) zU2T__6c}(ZK5%Khm$oKhkgL z(2xl=?R#p(2(c)Gi`B^~xWK8Dl8O|@Qj2F1wV>PG;+h5(`*aFx!6>JY&S5^CA{4oJ z@1<%Cx%_gCKu{C1=y(uBzg}XE49p7j?AC+hDo0S^B!Hk{+ZZ%~9itWjYcwuk5BA6) zg-|E4OP5UQ?#y^*ecX)P!0QZ*vtk;%E#Zw3#; zI^sewiyAz@x53h8m0&`QEs)WKj65=A1b$>j)!>2;El{x~!Rmwx`!ckcR}Cg;WPylA zJT0{&qN)>Sua*dWPZdQiFw3(VlA@snO%>NdeQh+ge~fmeV#%h!%MI`RD$_fu4+Z7( z`kBJ8yw^hI#p?Mqgy+Gwbm)qlI(2xbU={@|2k^oaPZp?Wxp-(gp7)G)ap}=&a{>pW z8qR+>iy~YwGh9|7|B|tZF}iKN0j)|o#+73OXHkOf=rgOo6jhY-)CggQ9wf%JZ)Wx*G1boWOFc;cq^)AgU(R zUj3*z9bX9XzUMJ3@~bhY;?bqJY9JtWBCV!KYZ*rVyv4izRYF~<3B>8C0d;tyuZHN0 zxvsMat065hwh&vz-4sq#^%|+_A%I^ip(z@fC~E6v{u3geE~k|sVJa<=Cj6;Kh5=_@ zl{OKjFv@ez2Ho@PGpghG^ve^GU}w!q~6dX?r58hRBMdZ_#WypLnLDJWsD+ z3Q1&*6bd*t+(fgAFcQrK9va9$Iq`Z^^yItG(~3eIVr)TG4H)Vts%ns`Dl>NF;DWAx zjC03{t`POuQ?3%4!hr=noh;oSiJqoQ*9=-!YQfwbg3205w?0u>LsW*(wI=>|<)kGC z79O|;Tt5xuknD>JpT@d0Jn8<=HkfecY zE|j8Wb$Ef11}-!7I=x{XHcfAMI7Vz{`2jDPtQ;N5*c=zVM$Tj1D$iq^?21&Uo!IQ@ z8fgRLaP%>(#Svnk$T^Elw}n7cfyi7BpQ34~tIybIL_x`)Z|Twz76{a=^fnPqv^IN!J&c(eRcw(iY7czM-rXS!;I1!YzNj;F>=xqaU?ZS zZ0R_VRCeq3GAntu-C{v?m9foILiqo<+-Gmj-ZBuY_%T;CAFlh84A+XSe%Fy zE|`V)W1XmqAamh797Tgh;+S<5K*w1QM-jHqQ=d!7oAQBusO!zZ{|LJBCGc-qzN^@9 z&y6i`(TLaT$Z#>mEC^}^s>o$kfRoG|95+TI&0miUH#0M`W>q34nLuEr8Q=TyUb3%vE=J}`eAq;x@R44Ne^6Io`tm+VE#}!Ri+QS}AjMN~2I)0Xm+3f~E~UX1Mp%@f zV%(%B5!h+sg3}RU$6uJ1q7z9LBVu5Vg?=*^gO5gu2w+vD*VCg5d^B?j=4kK{1*R7w zkSkE@@z|u;jYeWT!+tGp#=ZhK<5OTRT8{VNE(tciS51(1%UqmoMok!DojP(JaFzp; zgD&Z2Maz6pt>Cjm3rsXp46|QLS-JjU89_0)CJaEVR-NR=7Px36P;xA|fMu}Oj5*U; zq#6~ep?M^_(*#$H$2BF748=R2QZKlA2UQ1|7Ka4{}km4bn5|&`9cn-o?ubJRtrIc>kVd3v(re6lU}D=$B7(fQH-N+b#&F(fV^+pJ8lT9Hd6EE__0csyK6rC z%PKnBl*erGI%4cLQYGg#V7Iz1E4$#fr~`|@Y$I1Dj~}xkv#7FblXzWSLyXl%?vouq zR{6bRi@9#2h%H=3jN2xv)V>DSabi~dAvSK2@`k3jr3hr4)Aj0-X^& zrxs8Ff(qy16^j~aQ>E**1P%1Vf(C^!uK+vw7dc`EO{9%=x^)E5JKe(q=;CL*B1(CW z-{K~zR6o;YkIa>;qST=Z?7sXGGTl_yEQ2F<*o?=7>-#e@-xpS2(^4wKQ=iuH%!7__;E)#!JXxb=@*JYDb;6-be!P@uq=NB=1I-wqp*~!v%S>392%_VjKp@5!J@m4TCiMW0vhVn6> zWG9Jz!xjOvOjwh4D}?qwRDj}Z&LR_;2y3~ZS3;HTCIxJMeBjJR?sFR5aSb<4jHKe* zevFAI$&@EEJ!fw6{Mx`@DvJ?F^lX|7P}OOV+D#Pm=@_+?$S@8oTCyHl%C2{9##1Oz z)J&@NQKHCp=9S_G#urFwg zBbSYj6G02tRF*wkh#Q)2_z4^>d_pqc5}@cY7dRaeem8D4m(nh7)2QXgDJfBG0=>bga(guQcgCr=bF z7)@;3wl%@TPA0Z(n-kl%ZQFJxwrxAv@BH??xBGU_+5Mw$ea@$=ZgqEc-_upM>ehfn zYNGmVNEB)xJ|k6{Gc;@*=n1lFZ|BIIz}ra`p}STM85m6$l6j5(os!Nb~p3aiA3# z5Ks&JKL!`b+So~--p$%dSqTaV^j;py{NLg11_J~P_6Q6F^k2zERdw5ac0`|TU4c?> zvp*-fMz4ql5P#-@sMuv{?K|GlXBSosNTfg{R>yj-f2*P%uaQRlIHRz9nVRIFC>khO zmyv8HOd4${6TzDyj=kkUU-hu~?BZ-1S(>|;FB$M^LdMPKJU#?xwzmDn;@_SYzQi0o zUzTL1EnMBPewnGgbKr3KmW|PB$zhVdstMeoTPZp~DOaUnB0rt@TYi{5mw2k6)34GQ zY16PET=i26Ngw5whzO7>1CJ!1;mNdDI^O~UH)^4~$F&gy| zeWBh9WeWE~lekc6%587DH?g&kOykSS2YkiOa_k=??v#cZ1FGG8!FG}m?!5i)H)Xxa zpU$7wJe~OP;s_4fqaV6EYj`0vwm=DsD;bgG1&5ezBdj~1IrRHX_bJ%~!+AZh2%EgV z&%y@y=6Q;#+Ir)o5(!2Q=@W4CMoCf%@1!FlanRGO;3cEB;G6!w6yFO1C}*&^4r7Jn z0>W>I4nrs_wL&e9Eh*6SdCb;^a($D}CxcJq?09r1jCcN_!Oax6jrBs=jf6$f57P;BB{r+SAdm#^9VW-{N;qaZkNVx|gpD|QW`Ysm! z6tE~a*at!9+!aUDJW|WNPl9aOD$RfDo_Su8=B7%6n%!zs;!~bvD#awG(cnx5+kFl+ zhPNg`vN^d@oI6MYGk7Y`e0aK>AQE&9_XcdS6@1lvmvp|CEO{658aYn@EwW%{^W`#+Ws%n@ueV~Q?y;lR01}LTK{Wv(8%v+oD`oxGXNn^-P__jVEyGb(oSX3p ztr|2hwN||Y6Gq;&rF(v9q@2N^Qbi|ws*l|7onA$UpXCUDh2x?!E>m;=RozTGueXsR75nCw36lvaK9*!6 z@#ex8!IefK-8p!I6vFQ)5(_TtDM}BtZM%K=#PD&i@anU{`;D&iJyHDTA#v6rsg$j| z=lke#z9^Q`7Oty{G2;Wrd%Ea-L$<)n_i~f@3GvTbK?AH6(0|tIKkz>U6u?@^h$sor zNyv&a{C}CN|I6T=H;QSFCe3V$!T|wM@B#y&{ohqs>)V){7&|)sFY6Z`dT93V_%VIF4=kg^;)tZ@enRrt;K*gMi3GlYje`@7E6hg0<+iD< z%`{nO4yzn>OUgU8Kc7y&t_}vQnz9)%R7;%bW#vpFPVYRrTf4YFpL^a|eBajJb+E^Z9o?MzF1$IJ)_nYv)v^=_2(I_1 z2?7`d=*!1)e4M_oi!&T^k@FD*b-UL+->&SNnSl|f4s}?3#6EeTF9RXEusvT~ekN_L zY1@3&+1(gzD-}25~dKBRDIvJ_Z{xfb=P{n=(@{dY}dX9>MkCuX+0P7eoQXtTu;=u zus#RZUnCi)Rlu)$vif!wWsHsz<<&k^L*Lt)ADz`-&`oL?kJq;_IwsLgZ1qnn2Q@7P zrD>`eYO57U2C;D~t?UQ}$$%)SnTiHAaVx1^{|Z7gq^@k2*FTJcuCT4IeItkYp9w~N ztp^cI#s4kIgPG`Qul=Y%n8FYPrKIgU??>*W|KAcSD?-K~G}3@AN%kNrrQ%wDBWN1& z|2=62kT5jj&9zWt=qlS*`j1opuS84#Q3h=oLK&05N#6@HK7^W1mM7F6Gvrt4C=?lmAtprXQ2z*gQd5ErjS=#7Rs+}4iVP(MhM%(4(sP;Q&o$% z3p#{!r4+%1+xaa{0GG=uijmCxkvF$*1{CC6kMFJ3TY!-1-pF@=VBA*#jJmYi+FwkN za?5C+uVxdL`0KEhBHn-7PIA|_qp<(aPq!{I>1f}d#V8`QkseXw{gnMR9DNc}Jg#@# zxA>on#2_Bt#KJ1Kp{Asnv07eEZrfa~_qc~cV%IwYS2qGzcMj#qH~EA&Niwxg@HO)4 z+z@?<2Z=_vZs~=#dq*9&7NLMdv2hbvAYATOx z)D!j8Zj+Qej;JWkAX4i|zYcR{{Wzw9w>cr=RG}1a+>~ff>Hm!XZQM(U+mjR}@nSj9q36j$(sUHwq@p}WI=w`n-=hl2g7!+M~-2c*e4dKKgJ2TD(2`v6ix%e zcs!13p$QPSJB_;rQS~=|wJ(V#X`K+R*@uvA%elBjAti7amZ)AO8oRFLBw%7Vx7bNV zQFdAsVw{=TAv3p$!69TAmNz5YH}6fjgT8R%0$wwN*aoXT61fhXSv&6>f!jSq)eZct z{ky-D_jjO_&|UUoh8?n^$UfAe4YBCC$# zGgv(r&#kAW^{NTK$xt3_G8S^%%~DHz2BU`gxx4n$KJ0ps_?rB;`Vty_Hj0iQIXxU; zzyPhzEDBJK!``Cko&so?h?LYn6PyF< zl#*d2b}Z@#E5_obWRhtWY(bKOxb4bR_l7*iipZrtlw){Oc#nw4Cy?m9j5_X+YSbmr z7n%Ny_v5vmQMQo^gr$IyX`v-(m8TlX4*~Sc1FH^^>inO?T;+ciO8Fz#giFvXOYa%u zKrLsJrZAGK2j+oMOYQUp5rts{1Bk-g{Sp%-L_qcw=KddGQ*4`-$*VvAjMrD&nG5Zg zc>W_k^vS0j)Mx=!%f6`dOgXDa?=xHy?5=&yH6b<5?D&V8a0Mm(G7dBCEG%jRqnIM* z1Uyi5bb3zn&Yi;lMU;YKWU}hm{nheM7>1EeKP*%Q+;Em%lZ<1TH8ul;Il2JDpK(FF z*4&b|1@-|4SeifMb=Ba$;^Vz?9$3|eYTyhD*ywre|E{9-w`FUfMt~|ZTm*XNzt+@( zVb>C@>Vs(luU5uJr{V-ClBLgE+A&rdaPSAHt*^Bs+OW&oVc~ghpAm0C_t+|s+JMETimMAlbTq-ayDGV6M!V5)AD3b z_)d?^7O(8gP}&JL)=1(><*Gd zM$7DZ)M|{Bg;Giz0gRDF=d<2BK8ZP$k4o`d9W!Y8jZW*lg_=dQPg!Gv*dM@gMr<3^ za=9hw`|A65EC0Qx4%eV0?KLTN9YV^8m-LM>Ve;YmQ^z< zPSZpe_}7A%b^_~rEu>Z^>21bw8Gw2t{VQJ4d&u-z<|pwYOtOC+>Lm`)tijVybWE~3 z{*e2C&UsNb3Da!|GzUpK+{1Q*HTNQ(O$##bt@!;%;L6c z{s0EKUKY{>^vZ*-P2myUdhpj44DTueTEyVD@!BS3Gr7F>_jWE*CN5@^1~^3Fw_*S> zV)3}#Fm`Ta{3b3=q71n(6Mh|<(c*Q={`5+7NyF>1zbXE^>nWMCdWsUmkG;DK!Q*9O z%E05(F*WcE>urMLf#0)#u$=70!tRsTkjoLm5ofLpU9m1eQpCZV1WHikkbNzkk)XJyOlZ&dZR^K4 z?4{thQE(oGqp&7h`q`++TyuAeb-@s%N#{`@iI_KIc|H3|v#a(G9mIT5Yp%KXPs{7h zn#6^yvWhKgHh+plmQ7U{h2`$Q)$t4Ja#8TwbYhGFnU$_OcJHdz`4MZy@=4`J%WF(0 zWl7$G2rAd7Wk$;9sq958Rp`|?N!eYSCA2g~^WfT^%1ts9xS81kz8!>lVc92TSDr*g zE&8Y)ZzYjfQX(zdvBTk_W_MXPk~DJP$In#$Q=of@ghe_xmHRIoE6PX`_6)SlA`RqAIs)4%1y8%0@Sb^aPw zb~cWJcP`1o%j@!%5mQ%`D$KH=S>KUyYeH0(j_x0wUE*fFMS$zTH>Cw zWEjy5JvN`fUOm%?bJ{1SgPRScdu!H!Zjge>T0rGSc}vX|S|1t041fA`m3eVu@7y0v z%d?euCK@g&k_`8#{1A6o-%@mv&aBIKq>Rt6=z!+Cdz^CIZuG4Z)&eRippn)bIpY=G zkB5}0F|@VK$5O!xXLGFFeHN(;FUp^fs&huMFQ%YekRRHu9Dj-lO@M#6+TLKj2xzgQ`;XZ&)hhI#T|gCJME7 z2cqDj8p`pcj#?wsJAs9(V-m{}7L_4`r4|J!mm5jOcx)9Bl5~ydVsjIS(P+om@!|fF z6?fVflV?S~BM&kAiu21>x<(BPr&g;`>=GXA(KSaPtgcPBv2&t%P z-p%zeeY7!QJU{d>Z@OQnY<-?fE+8U(`$(OkB#FrsQV`MlsB@_mc@o{|d3cU*Zf-Jq zUh7+$W_s`GmfJe!LJDx;I4xZbxe#1A_spum3Y zjDdH9d;a`t;Dwy*$S64Gag^D<%i%i0f0^-rWO)Y4Y@KL8xnTLox_Q1C>g+1eNBnG| zx7}vw=3QwIXzJik{nJ#hSYxmKlC6!1o4vV}-@O|WT>Wfk87Z2ue)Ej^7GcemgZwfw zGP1jmIdC>{c!%CHoSWec;>zj49=uj*`v-1z_CwRVbbGiqwY2j@PY*c=$P3EtCy849 z^)L&8`#Z53CI0EvKAi9KZScjpug{L?>pf_I_j%T-JxR=;v8^p4O1-a#B~XZE7-a4Y z8XtOny*tfm`yLQ{j=IU-Nha*^GsC=EJ`WWj9uO~W$Zqz_M|18wIT22BlB*Vu06arM zTAS@&(T|yolba& z8iunFwhejy{i-pxyPY8$xL(b@`>J6ZZ(p3bk1sd#bQU`<{|Ng`2m`1~q3J zZ-H?yQ~nS%ZzcPj@G*8BD6d`@VrRU;!x0UKOh%n^sljY-et_XeH=h=*A*j>_3x2Kw zmN-S6Bg9LDeysEt_kr5^nf9HYw|UN+J3En#_ln|vW)ED?$3o|%Jp1aeEsZx&+JvbpgoCdT7R2E8@uiV)-@dMc! za^Hjy_sh0A~--z#0~_CQ7w3 z)|mQt+897$VqwEf)IAW;Z6Ci3O5IT0BZ%?Xk^6(eLO68lPRCY(yH7k=E+Tb1gSNO? zK?w&q5t+cs^jb>OgsW_8==O?Q{T3Y(2y-Z#6PPEDJIUQWyRwqDoqsB=+qD_6olB;! zubYxbY`BU#Z{=w~>B|zq%n_;>a5kfPEeo3Nzt-{;dUr6`uuElNmB(IeEDLNR)6A}@ z7M+4a&_v)F5c0!|iiz=w1P-^TCr9L5^F z{yx(2G~_zR^DL7ibPL=aL+I`PirxC&f^%7FHo`O9O|+|GLscZ;KC(##xJY{(XJpu{X?e|77DPk;dI z8<&AJ8%IR>H{tWoXP8FjCO|llMtf9&^syTZg-UN*Z7sr70{JXviGpMu9VW_JrM>=mWz&rf z*zzX`3(m!I)#WcUNAmjPljwT;4E}Bk#1&DmW_a|^Up*s|6FeH35uvTC;4qC5BY&Lr1d&C-)u0jFuHLZrTgmpAXOy&fxlHg9GRY{irw6TOX95aPchH9zud zcQISd#AC~rz*~1MW!`J0CK*1Kk{~AKO8FaY;xTf0y#t}4=QlT3wg}aVXz?djff`?< z;vK~|u5Fr&F9Uw>85Dvz{ur9)eL*U3vC@*z&?Eh8)Vn=wl8i!#b@w#76itQXHX8@s z@`kr8@kANJ7q1U7hImB~Mo!Kr!SIYpsAPaTN*-xY3s{~pV1p=Qc!%PiyL0+0;LlPK znyla4vc{;Ge|Z_*G^Y0U8`{+S98vF#6(U&g&$$dje>m@$f>)rtKLG@ln*}ItcEcZD za-9tLJ}WVp8%THaFl`d~n66%tgAAK2*a)mzc>dq&mEgq)?xImRSwKj|OnRZV4`Gls zt#G8fd60drzL3&nT-TwVn3Qaxi9Jb@=)b_72(^XJ9G_`Bki2f#r@lVXR17`EaAB zxjBOe1u7ml;Ybfaaot`)kk3DW_1j^iUd`zq@KEewkUycQxB3E1t^abTHG>r;qxnxR z;ma~MwQEhCDe#Rgyv;{ELOf~is>@p&6SHxKQfP}-cULqJqT?Ne*ZD0%5R1p@b<9W^0G5h}{)Ked)b zP&%lGYwjBp4afJ`<&JY-OZ^3j8KkB~djTf452YJTK25kd+F{jnz>Y#4A8ka!U9WYd zqn;fTG#%Y`#h314u%c6F2`U zcxGe4Ov;VMNc*rd$mn? zScZoBwY!6!XQq*;%vAo1&ewBC@H=r$T+SwNFV<7 zSc3>jHT%e{(kxbmF=XDU@{#`9!qim1ljDV;$Sz^24nIkWoUMruJ^4Lgu3%B>NuL*x zkrj&}!;lcCLw&Qan~kxA?vj@~8Bq?(77`aBHPa#$SQt(K zGtPJ~M5Y+}%Tz{%x9{lK3>2z5Y?Er*WiFjjx#P&`?2+uULBwqKA2umIBw) zg}EX^y^eFzB7C4Rn{$#>9>XK9J(oTEfMR`v!I_C6ImTV)HFYr|#y#YYh^PU5Xi{Ur zXsHvw0X<93WI@syNKh*uYRYP+4befeuU-v0nXO1qUJg3hV!T)ow!pw9YmKH>%Iw%5 zjSDY{snYE-Q?7>|zWWeeX@jIkuYS++^e}mj%Q^z8{=Dgsqf5%HKo$Cp#=pQPqGi&c z1po6Mq}xs$qXkTjr4cn1vYRwZ&F${eNGz?=OM(hc_&{?@OC+!_0q@gMu2`$2&2NWQ zTS~yG-*3*2JsZ042U~+}nv8tt@GLw{IOiSpWGHX3XOZ1!5M@^Lm`?t;&>PL- zHZ~}xfT#4cB+@%LRX477b+>-tPo_~6y)+q$oW=1FE!blz|D9c|0ybfYJ@1KEcyGQ;`iARX1IKEmiC9x* zOc5FNVhyhIap>NFRDI}37fn7{yu?lJs;dF@$C47ocXZu|{Fvz335tHao zV2v}aQ*#FuAGuLnc+#u|%>Fs{go^cZqHTItxUN9q*m#x(;VUFL+Ig2c3J{4=nx^7` zElWr=xfwL-@;-z2wYPZ|i(`u=yebu3co9C>zl5Wht(CB%+m$_Bv1?}`2C;?#?ryCA z+HxSS6*6hL*M{>*tt=xj@2piKt=iyXN@hS50j!1d-NYE8^3KtL+$EHn#TcvW++8;A zP@bBUDK|c$A_YYhU4WP6L7tH* zrT&$HOvLF7nTNk7grxpMRw%=r6tGNU1*(AB+8`%Oz72FEWrT7VxHeEeN!G6jcFRM0 zHm{+!wCj3P#Y3!W6W5y^m(KB>Ygb45VRU%C#2(QebPhN}TGKB;aA3*Bw%$h(PTkN* zm9$=kY9L=;U6cO21Z9lMa(>r|tJ_ZfeHFn`0{J>h-;Rir&S{G}O$#nut6|tp8;OZL zvTBzlLL4rcg;v=AFv)6=Tz$*!w%Wrg2ln{W^yfe%(F%PJk)uv?4AHtNui;N~X~t+` ziecfRhEce?b-#~n?MfyljqyC@X~S0LXf}#^l~XOpg8F8yB{}$H#U=7tyDoBd!_0A6 zqpH7k7vRR$u#am82FBKjGi}{^fD@npPV8Qb8e6xaLMA;)E)D;#8PoU85?fLeTbAn} zNSdzZptMFQT@5d~>_le9o-S!eMed)uy{=5M4obn`MHAK&XG9A)b%#9)KvR+`E5x5x zyPgDSGmqB<#tP0ijmo6)abRbOGwZ{+3^g=K-5~d%%S)MXW5<$Sp*4lWC-!Z zpM7TRT%A+;9A@R<@2>{;F1H_{CeAjouh+%&A&7X^8yRdzt-RP=QqRBT#hnl!kfE$Z zSmVE>g^?k_shg0?_L<>^AUN%tg3+gK*~=cMo#f=CYx`l9rEA!2yY=g;(6uuj*Mwu{ zhy#A)p>8z@6i|cDjXptF%LhG7Qk@GM4ag$yt7+i8_D*i-);(;+85OHbhW2}oHru2z znv=%XMrEO`dX5}*HUqd_up-pEk0JFk;)fAQ}<)%Sw9yL zh3KL`b%G-lN1dFu{%JD7M8Oo75^@?7zOC?^aiNoExqXXhJ9z%#v@mVxH@q5kpC*tJ z;Uz`VPUtD;VHDEbnk&CtRl_dz(DDS{cZw=u6X0iNX_lZD_&v)Gbz+zJ*c$bk07Kkm z7nA*i=aSCNNQX|cmz98b9L;PD-8Rl_yr)VH&95e3E@)6yG-}CfpsnJq^pTi?X9fXc z$BOpu#&*TC?GNVcsS0a5}8X2}4`D$@8k^#xJUg#Lp`;A=&&@Ar+iy(hWV# zs<93#2Nc>5@RgkyR1Ej!J@1drHg*S`5X>g<3%HYZ%0oLOhI@+(u;>7MSXBQd>S zDfBXQx4yEGvO<1ofD3|kwVtapRWRxBod?%zq8GO@aZCitH0(_#x+PVmC;s(Yh(q$7 zJ6W1`!tX!8nWTOIl>#DJ`3>F_9f%mFFGAWe52Xw~wGiyZF12YnHbPdh+v>$e+pI?- z0a&U99U7`0J6)Oa3LBF=ybuH@%Aphs5`+=&+-a`BQ^NQY9~$Ft31_ z4@#SV@uqaYTDz2@bMi)cC5EX=*PQ>mulhGdat?D=tahjcWk@GFH_cZ~Wk|uY8=Ljj ztiap7Q%CU|V#5&%f^pp)BHf+#Gd9cz%NM3zpu%4inF){<{(bI(2{}rY2p_j-zG(@9 z4T*^dPKLN%suO1u=sbcR66Vtvs-n0}i@1n!u3hOq^3nmBuwgrXg6u2y2ucud{Hl$)dd&rfPG7O2lQeKiA9Vd`F6Q zTwA(523D#zJnm#UY^GY*ijPL8oBgZlLB5g$mr3BGE28BE-)<}k2_cw18(3*ko^WaA zP*Wc(Pc`c;H#}%FjvFroY~@8GE0?d|fn8V08Y9)$N;Ogg4zsZzaD<%DpI9Y4l zsk9$<`Nhn;)gIsmjQD5w=B5xtvKBds4L%FKf_agp=(7yf&tZ6p!p45$p~Eu{!%Gyr zVn4A#xcq(alqp)qy_m~29a0?RqFW=1Y8qLQjMJ26R8NX;EMAeKvOK$UL629FtAf%l z$^@&4cTYl#-a&)-JbJz1}UwoT*MQvog7e} zJPMY%?$mIns0jgk7~4z2jR_P5m>&bC{?}MqPyAL+Hr5fu(j*oaq`3^r)D`S#Em4s; zQI~WlR2L9@n^W`p_)*D+JrNTb2n$>Oi4O8v9lW5TMsaLqpUy!gYp{e{y{R9+0KDMDYkPk9lZ0AkGt`R%B zpDrw5(Jau11Lr`Ip4+aoH)UXr4Qxsr1Z0iT{j{@ zB_V=nQDP;w$X#hLQ$vs;*}(E)r`A+tU9%?_`lcQ2DSxqEah<=|WF?8iiAcY*)Epe0 z&*&-3zmcuzAZYM~zk%F5xo_p{u%Q+RKjn1IsO$OhqS0C9RHpswA0^kG#oYh8kQZhm zR*kzcuLl}usbeS_4SWc~7(AH@ij&^Tb0*lUb3vP`w3mEr>`H^a5nJep+uG$`*pk}t z9dye8qA=wbtsT-LP}dgeIIFf$IjQVK zwEhKJM02Kpynd{3jj+5A&nL6**FmOGrp(&pwDOg=8dU3?{83k;{6>P6UN7RPA;d~? zj5@WdKq#Qbx6=IotE(xcTh%LP?@&n2+(0)O94|9qKJEnSy&m+PX zwZcWhrZ`;j6Xd`w`S4e{uw)U@QA8ao zLX@&sAXC5BW1M7xQ8Et|{>8a#Kt1i7+ropxP!`#0$Ckb+w+{~+#>93G^wG5~)$-7QY4a%$ zZeF|q8`dpoWIn|9)4jJ1;w|;hzlt)avk#$5$zlASS6j5L6xm%I(rwgy!-O`VCG{0V z)b^loc}6v9(SOU*Eax+Vl4pxs1O({Jd9xZrB3PZ zNBk*$3*w^fuA;Mhj7@x44MXXA#+FDs^xd~M0K9irAiju32fEvyaN3&%tl;@)HbaNd z?f1+<2{g&}g`gk_@UbAVhVqm%D1{_n*FWFDu#GEhNzoqz`=iphN4|2>Tl5?O!y#*Y zzhrQ6?>~5YgwzIIF^gc`XZ_CO;OIUK?cbEbG4|h*AZ5nAV54^7%jiDT&@1TPV&X_$ zKY=Jrv{f+TtYI(vfF#bN@}EhGH9p9(Q*(vCLv6k$B&j_+CvAU#^BxSt zz*%a}25rQR>~$SY+ICv{nNmkiLF0=pZbt>3LoU|&L1ML398qIwmuEK1gmHj*kN<|% zP1YSw(JjCUS_#ArXF2{CkxI_QGoO?MvhQ{qA{$3TOkMh~Fv4!*+DY+@+YLQ4k8(~r z<+;-}ewXu@Ga(Ud(|Bd;=@Urzq<=g_7gCn7Fd`!v_@K8QH_p7&Jej3H?n#N*twHWr zW4E8oIv^6)RSSbH`)MfC_H1%j8$B&{=n z#qqQ7emeP=rZx~Kj_MzZDy$36-|(w>zA)LdOW-84&fl^VKuWIL1oP^pB z?Z%rxrE@$_#tCjc!$a?@%NC=3wvxIC>xVcm6zkzIf*zrR{a|()A3v|NdZ8Us%0sCV z_ZT|sKG@(1_GO(=ks_19V|81MIpi4QFB0a9KU3}WXmN)QoRCnGfk zR^KBOax*Cv(1oF_qE%;?ey+7u)`pYE-N4zs?5nj$(+t~)Kmz`F0nk6@*kHSxWf7Gj(=E6rEJo(d|M>s3OZEa~ty+ zgA=h|O^*}y`H~AT`kVvxL_C9j(PMn)7O3Kq$HDgrvr5gv1T_#HNXj-I1}hzv7L6$;!^fRVYFe)+#Ph+^i`nCj+cc%KvsKTj2>uM_IBMm`h8%U#475v^fPO0h6z zta@?w2vK0``3H=AjBqir=9551S)n7^w4c6>vk*WhcSb&@2POMH78rgO>_Zd}ICR#l zndYq{0+#NXdFl5dZSzgH*AZsn0DcVwj;rZ+5aB1vh!uj;nw+GbcvEj=-FEV5uXaq}%(MF8XJre(;vo(QPvm&*{H zqQOn#2H$Qvm+UDLYNo2^6$vH7R@Vm~>G{_$0(8JQ@)2L!ptUW+r<0cYs{xO{0O=m| ztiN$G+r`C?{L{2#Zw^RBBj2i4x9`wuUpl@rKY^7I6iIe!=?N%?&!}$D*Q1Z1D`i7ZnmLE-S9;&I*R=DDv`&M;fOi43)h`#Sf2!X&(fBOzN^sVuD98HM{J~*Y<8Gcvc zgX~J8(()f09HS!7Q8u?yklC^m1o~sAH4eWMwVr;lTb!j{BH|KZnsc_p5lHsz*B2{* zi|yir0wJDvyRB}cI*8-Nm%xDvqkiYWEQG}O`R%=WFgCI$6k1Lu?^H<*lgl+}%;v52 z1tV%U(?~mw?^j%1L+lR{#FQTekVY%WaYR2NEki}L?Szz+q$yBWd--iz&{27#yf8&6 z5J`QkrFFF4dAux>`#qIL;OP`WTfKIp47C_nI5!{Pr|2y0K!iBJg7IA_CuAyyf66!iEI%!55+L;Z39F*-p)$PJ+Y<~VzeUw_K?n}B?N`;$_hZDA|aEZH` zZ5xMEx|1Mp5DIN!IT%%xI6|j3c}`^9`2G#*Whs`m1M9|KS47QN^nSN|Yfbp+%95dsXpn#Se&#I7xJifM zBb6s(`I;*zPH6Rzmz5dU>ZUI&Fi+G-SXf{krI52VO zqAG;~=qvpv)7W`znM=ErZ{#DlQF+?sUjm^n?l=pIj)zgd8lj@KHu|je>mO{eji>5U z&);7d#@!JKd*M^h+(zxh_g&m+)uUcDLWLDf+Z8CM<&*z|hEJ;=_NtLBv}E2s|6P`I z%7zE|*&TiaH8H3;*pm&3{iB7JdQZ>VFOa%2ZQF~}T4iX@lGLlUzoYP~Zxs^&S z=xZjeNi2ZoSsx4bLAK?v8zs?4I(t}80VC0?i%j1UI7tztfS8?;FqlnC3hWEj#tLOJ zU>=8xImlHsT{R{Ma)Xg6g`&r#g^Hp_9z&-t4)k^Bgry8=>cR9wBjZO>MVcJa&yM?_TcZPsjLC~{6$WyAhCc-qnwgX~! z#@!vP-ouX%I~?s^UNzp$&7G9}byUPbAnlUVUU`K06GW@kj4jamAARhj!$I+yD5Y*= z`tV7$B`V@o1U&OU_f_}TN0fYSN4`A(F>{X9_TM*^vTq^i-uqYzSbW&Jx#SKpd;^;( zKF*w?*|KGR9b);4w-WH+xDMA0D-x7`?8WFl2kH)(o8nsXC}Gr01ayLrp7E7QJ8|a|u#?K=Ecl0-qtL zR^S*w-l&QbJjX^7^TGT=LlbR1bnvH(ge$wze>^89J8H&HnJ>EWWM4d;?%CQ!)}qi8 z;$78$V$>U$SU*i|<=`ZB88igwU&T?T6C7QaJB@1N1bwA0uBQ;48})_yX38^CCC>c13;@ojaY^_8O@| z8`vqhnVNHPv1F($&77p|Fhk&xkDG#Z+Bm;j=6NvVUR%wK^kT?rIvkHare}aPQe4XN zCy3kE20G|l(eN+)mLd}B%RCz;<>Yb15`5QfL2pjiFRp49Y@EwnMht;JzCtt$YHz)3F2<%$OItluCx(E#2cD2uI)kTV zQ2)SfFXskH=Z#hNSN){`Rp3`eQsYzjILx8WiOi9KhDlc@nt!$IWv6Fs8!wI+E_=X* zA9t>FT=cch5|%2E1B?XcHcAuQ0Q!O6W}5KU^APlgLqlj}1xR#C+sskJMM?JmaPKB} z6xbvYmYFaNOpA1Z#P&fbwzPGYI5T8?E7#X2hNEvSaK03>O|j{xNbDMvG>^q7(!CjTMrZKk@XBhXQe4PC2=*9WWPKbMT{iTH(6h(Gg>O&{``!Z_rwY*cIzTVL4`kc^DqfZ$ms!DMwzCigxg@oMp1 z`cBoEq!{~#3=8NW(DHNP*Ru&)PMDb$k-Y*^)z{z4xYNTn2K z4H}&;&?ctSZ>A+8Clo0KNS5nIs*T&&-gxS>f^ z?$2<=hQHr*zg!1!F71hWz~*G(Bj=+Is)YseC&jqLXDjCUQc}dIV4yslf{*X&nGXpC zYGjYJ^rA~}Sx>mpSR0dkK$@}qrT`_q-+F-ks6)lI+f10lR>3%mlC#PV$XNSl?4#zPwXz7-~cF+@|fUz8H@mc4}|#j=>FyW}27(d3IfD zGRKV}D2G=*#-??C*dC~?4P|ITcm>7fU*SyE*i`;o{KU{}uB+&uRk$Uw>AaUC;A<-y zf%so;N{d4?VD4Y9xIdm>7@}@z=h+kGYP{ZHj$`gljgO)M;vYIZ1favCf9OB%A0jiA z^YwnS_jG>DNkGVZ#s#w7;paN<$msp)&+YkqpJpH24`aQs86J})(qh`IEu0tirU3=r z`rx}Rf-ugQy3nU*A-yJ`Pwn5|2oHVlF11`gCHy;8S*#B;dYEqNs0|YOo|_UgBH83# z5G+Up54D(1Ca4G!e1aQuGKDTL_ae<_h2=jlTqVQUYK=y-jMfXGPsLJDRDv~m1Rkcf zjJi-NEM2;I)^EKH%pYf(YFUVW8gAvtz}Sql+<8Dv(@JE}ta{tdg1{EaWs<07y*w9z zAPd9_NtCmG&Z|&AO34bS<#W63*Pwt)f8pPAgY>pMTfI`aQb_LTi{wkd$2zx1D_BA?+9{-5T;-|hB)42kWZLa|G z;6F0$AL;P);8=2zqPvCv{Ad8rL~v+g2$PrHekvTU=RYO|5N!$ok){q1?s@>BZVC`w zHUL589IiJ`*9O}%sN@rNCv`xadMA~roBx4a23h=pe3(MnBTVg2)g$~$mU59oIU>wO z9*-o=MLy0XA04IyrWhUOAf0GPjMkTEn2(zf;Ub-An$LqW23gF5a+pRr^RMiTusiuU zOB|pY7WwQkV^8vNHu>r>BQVA4FbA1L%YS7p^R-Y8)Bg|d-ZHMLv<>?vM7mqLQ@Xpm z8$=rEE=duPMjDZn7D?%l?r!N4kOpZ9@mX7)8OHG*oq6W@@V?(><~RFXYcKX%$Mrvs z^SqXnIMZ4Z_2g>nee|_t>P0aYKbl3cbIM*$&}TW78$%A|vw_o-kF#^!Yz%Q!h;t&v zZHaTrOhI2u0ev=wdR>g0N(DGQs$TBehwEbQRK2{>;Re0D$_pWf3ZTy_#JOd@K?lCt z8}zkQ-A1>}IrOzODG8>vH0m?4TF_@}se1X9_ds85FT_!?xS3!1I^phgx4K8q~wPTeaC`f8%eguN~gse8qh8A5@}!Vv1H92W-qY*?l)##$!m zt7TGSugL)al0{7<4qO%@@pI~4Nzi8{l?6f%l|f%kIWE%iu0W`xN?a`HvczVlV60_> zKATNVCC*I)x-2xk(zUu&9n`0?8j`cOh2Ju^G)X`}#Rip+6|g2nTj34|sMnGe)@JpuH%C9_ zB1b$~AnJ^e#WmCI2^b5K&5{gHj$^U)q6lXV9Mg`(;k;`)xB3o;Q=4Hk1s>0%wN{&E zJ$JIT*5OeN2jkkzj%5u8#vy#&+H7W=-I3MutO?hh6Z0qc5*%$E_)}tCI`gMwnvCh5 zBN|jf&bh8C?}8N&0RKpj*)on)Is>l3+YEfmZ~xItT@MZedI|Y$ad{=-)3gwYA__$R zN}G%8`GL1CkjI_@J2P-h23G_-lW#%|l!BM8Et(v6>5qHo`Izey2R+t3oVkM`(Q>g7 z1d>lt>xY-y9-0UUANikysd$Ts2xSnxIJ22MK@DpzBF6MBry*-SBMAmW3?^iTwU2Dr zgl@(o)*X#vL(_IfLxm{@T1RS;)7+={M?Ua91RH7>?6eDg@LsU9ss2Mp0hM3xy|Gj9 zY0DYpVl$}vPxBELM6Q(h#N-!u;A?DnkR^lRNJ)K4T_Y8iS}cx__%|=#VS7U;E?X@l zqj0k67ZyRi8SlDcH-R?UoR?oB5DwU~fi2E<+VhRoQi6#=dc>V5EFEM{zPt~4%pfR_ z;#PkGJ_wok6w5rOyo1N1C!|ygUd$$;{Ir>H8=jwllvr}#-yb$;&!a-Y-(*jbhiMJl#Yn|`oAS3i56mnx2@c;Gr z?;kpT;6KlM(%HAMg;6_bHi7xvrP@z_mF4*{X|nWjn65;ao=Ih}PjsL4aM;f65k|+N zZjX@|`U~-5c4bB#3^GY9{@`3Su+tCf;KQv!ahwZc^7s0V{2#9iAiZdVnZI*c6QqE3 z#gB|qH-v$*@fo|3)MBWK4{#K>v4}0=Zt#o6gAR z@u2t~*4-VOZ#G*ZcJ@wd9COxpD_`E@$@1c8k1x37`)vAnAq*kE|0EB3h@S_K;atj@ z$3_oD)fxR1K~&oQqPELdH#4|voE=U)oWOVTxqmIJC_|R2)XGRX1O{VpX5sLJUWfdM zED@iTKV@J!bA$XX$xiD~iSvP?`gxu0U<~THbNSs`{8xq9*3ko-Jz5{3bD7E6gGU8WwFA=o@<38B145P z&TJ}3Q2Lap%U>~56268M4K;6R6AV>bw4a!?I%R*@Y}l{65fYDN`h~NH^MUG}XcY}* zN@2KBSTo7Z7MtjZm`c~A@j6$}zKZV?1;sEd`+#TXB%H@^TB&AjWad_VJsv3YEte`-3M7Ex z2L>oo?soNiXKs+CK`Gnw!@q)Ho!NA5Xl5;1qAaKnUv?JJ)IU%7==@kfQ7|$S$-zIW z7COQJTj!~Mk>my=BIyiUvYdGY-IyS%8C!~iA|!Fko0YB2TM|LA(07tb!#N9mcLgXf z-Q0=gK6XFIVUyImiw93A&ZcZ8`MXT8amep-h|lMw zs0xL-)XalQz{PMwu>-r_Z%O4fC*G?7mxmO71Ftz%kB4s>iq}7o{?rF$k3VoWaoGuZ zs)sz$$6H50l!Sy#tsPD*S!FeQ793r?;R9o}NgGzlS)N#sb>z!bHJ)^$wA6N+*W(tf zCSs|C&-0=onIebKQ@rXPDm24xf6R!FiMoQ_!d&fXmuTVN>MJU(8Y>*|ruV@H$$&%z6}fZxY!R>#P!M zy&dbNCFP>ndvSI72D%gvOJy4)Jw?;B$&2B{u{_sC3YsdG48;#Gg$E947;zkQ?dv`MekJ4b<+i5mf=i<(_$=*JZLt^b$&7WSO(fP z6B19!*Cd)D=iLUaEkk*z@&1~chQoOCvF5!iNt$L^C133A4VN5A&m7V1m(o{uI>NR{ zwYpCu%mhexeTQaZHewOUV>Zsqi%e%jh$$2u;b5w3qz<4JH@ZJ=Y;WLZRJ0C!-evAV z8r)f?dhQ=5*1{FU#ABSy7wJGexR49uKt#bzsRQiNAn`y*>QV}+HMZ*fD2JN=VAc(K z=}q`kN@RiUwjN?0G*2cPNfl*}f$Cx+f_X8f#nuClmWN9vZU%ON-jGf%mo|G{ew>39 zZrjcG!6Ut1KL`&WO;atCJU+_6uv^Ksm)j?KtlYVM&x^hi2W#!Z3(u*0QsAMIMuooa ze(dRj6K9u;(D3pT&xft5Qd!|VSGBK|BkUSKHGMAlG$gcI={B_g=*?slv0*~x^#E+@ z?tn4Jc-m~$Df+v_l25n1mb`B#le8!ucd~w9L7n`dC7`^}3eBMvG~MUMxt$eMebz+K zg}!|2dKXu6bJ1tpc1Qust0LX<%BLPDLMqfiibGh6B1W%I>WLz?6%yt((8y5&KjD^Q ztaX(nclY*Ia;L7{#mKZTOEvRF%+sj?aTPD-Y2;f z)pmBYQz|@Yh#Y%A!dRk9ZkJQO7aHFNxA+v_$VmO*F8Cm0dBw{=Iog>N&I$mM&W#kxfA!p=6E1~udeV_kk`ySAkr=pRisj)LLH|Iatzh~dXQ^f-k z3@q#p7#P-{YB-rXJ6qVA{d8=!;rXoN3=>M={v}5EKDv|C%sW^UM{}JA#Jjg*bm7Z= z?`UsFuY!4B0B?`PuoktU(?qDMSiG*Mvw*^W*5^B+CoC2EW`#{*TLG~q61~@qVBNvl z?Qo)Y$EU7&GwxzZemD|hX-mvc#Ur?Ib5qyjVEZXL>>f$9nn%hlV*WKx90(kVMQQG)}RR&W;32r;r@BheRQSd zRupQW!l6Ww$frP(bnf|!C-rvk9+rD2(&D+MZ;B15B32L1>^fFG0!tkjYY-5$%AQql zH!rjIT6hN?O)R6?@|pZY=m;)ne9cN}N|urWXWOEvMoCBj?r?#yWVCB3V8vbaj~3K8~MCAedu zpINx+(uFgELv3Mn{IJmQCMp+eAf|xlIMwSf!+4)d1y1EV6fv zA%PVIs}V-(19esC2`6w&6_?b*?*#(c{ni!;A3z<8-J&qQO+-wGls@rpmZdNuZTd}N zZ!owkd!oqTRx2I+%w~V@f1KUJ}2r2YXoi9GzK>u4tf=;+IlH|M8P7 z5hPpyH|?k*%vos!w86zK_b2juw)tuSm$;aYdi_HLoz*$WDoC3|ym8fG5)a^2Sc)#Q z3DY;=U2m^DnI;M#ZY&(WN;za@yAQSJrWzk~wUC0Z&B8^qndh^syG1OC zwV?v*x=wvqXMxV}_>jHwNwy^Yqw3N0^R*qA(Qc0zdq(MC657n^y@lHl#LDjkGT0?! zsDigeeS82}r3~S%>#MbY>pa;-8W%EiC~6I{jC!foQ77IPNuo&oX^gccG;(^3C7MEU zLK(%W?@LE;iro^tIx@xWvX^|gre|x*v^ZpVN(#W15;g7}`14Pp#0u#h3EPIZMme9} zvj_-U#gsUr#&HtSKB-Pd4TSP37`Td`pTBHsAGn~(zr_CEn|a;&)1548XZygy%*D~r z*}~4&iRGtHhaYbcM)|ij4ULUWtxbVL*g5`UebDY--Dlid0$@+L#a;jxd!KlGTzFU@Sy!Tvyr^nsH6< zS4mWy#+hU{9I$)g==;gu^UX(LfC9*+J{&rwA010507Qb2ph#jO6>HB`ra`n6i(4&&QRXmM4nv~wL5?`>Xs-42 zND(^RR7O=iy8qqX^8Gy-9pNJn+|ph;80qNhlo|Jle6TYIk@LbezNdSGjXaaPit;H6 z`N#{mK2d`e50X>o1a*g|4d!4s*>XoO5u!=wbV-Aasx}6Zd@xC>=AF6M_Kr$c;#{`x zIUS})alID(Aa;Zk25Ysei_2Q^BBiMJswxjJCT8S$5D_1ATV8Owce$DNUNG*27S>J`dvBh=8r`?uD(1u+$G1{&6C%x| zwsB5Ppr?JvyMhs5+-6i;$uTI8F$~A6JA!NMGD&u6-LtgR%ZqmdOdB8&b_L)nY9kFJ z4BShDw88mNg?kcPpu0oc%ql-tAr$18aWEFJ82R2uq6;!7BB!r#dy-dbaFcAw2ogu@AJ=fo?GK-*Y>X!oG%UMPg`#X<27 zq_>L}2Oo+XqlP-R9lz5--IIH|x2&op-`X<{45$;Ls8hap@ySKh?VZJajChKyjYd9Q zC}R`IUJDc`EY6a|tl8JT!SUjQ#yC1aOzJ=v@d2g{UobcK8exy{Dq}hK)5O>{{4Yrl zaOeK#(({9w|Ecu+r2fB>9s{*P!F@pL8UgtM?UDISdVoXyqVz;4x2UucqcmJ%_7kR@ z8c20I0CcvvcKO=r-^DA^Kjp3^|V_i(Mb315~x7#)P_}8h8U}I z^)$wVEn(cQhbsIaaZFnk{*pt=+!&vbTagBHv(dhBdBU-F>0ahlvn!;vUF&c@BW(TP z#J(@-hTgRKmT%@61L_^?TU7W3_tGj=&CXLCSb#0$aeWq2mrKXb#YODKd(LkHP88@w9X9pp*v-P1B zYoofg#vp}zYMhB{0tu1ettRmQ{o{iFDw&UsHvF7C7YjdP59^Ckz6J}j?})>=HOZS4uTSc(|A!8wz)$6l-Guk?d&okdB} z@+&|@r5*AkJkBd|CzAAJrmrnGiEFyg%lbR%xQ7~Tap)8!;0ekHk-mHI;&tjnEM$R# z$)WjG4_2N=p0}?nd#7HXoFQje@a(c7H9}{n z+HQEX=svPy2NgvUsBj?$fKC8OI?wJ!e7zL_I{b;$c&_@JS_3SIoJmD}0O&xZ4wf|t zG?|;s4%S$JKqm(8H_%BKq2a8oTq{kpg}U!bd9osb`0qDwFh3&D<@(hqKPWueJ?!tlJX9)8<$(CI=h2K z9{o0^fqA6zive#WE114iihj6_ConP+2m-a(QELY{36Mz_wKzpt5JS?1Zqx;x*+@X z;!u#T`!XVP<^0Z+$491hzs5diR?T={kDc4plY3>;*2Ge3Ijrz&Ccf4~UC)55 z(E_8L?s!M+aYqN;@`futv5{%?5q_XXUZcaD3>hD>6V70!K|8GJM7nJt4%Wwf*Zs(y zy}?C_y+*;9nMZ%~9KieYE&T6P=6e7k`}?9crnW9dhTrJse{5#_zn@&Be_!0f#?Z{v z>8Fe3uM6()Pn`CbYKvGn+Zft^JH}7X|NCQ5{QWVUoDH2_oPPcCd|&=2*WTIA&idaM zr~3PIw|BHNb2N4Ozc~A!TpW8ldl!4q&*$sk_a9&TpPc_+)<6IF06#f@(ABp$v^BN< zm*@YJKkfr-J40vFpWj%2kRq`z9(50}pkf9VR5wgZ(30R6S5z)h!nP312;yfcq=#58 zDr)L}wCJw)TVAb!Sx_>eqT^9uJ%%jZy2~vsFT7=4cdqyGeEU)I8V%wWj$=r`-Tovq zC2)QhRJXg<0*mSIODoW0@y}$G=0`ZN@*>~V+I_5PU~{^`i*#o{whvQYPVetgP757* zpqBRHeZ_E#FBmR&Ua`i9xUa~Nx_$bLQh{7x4LXEP zB@7Fdw95i^o?t;YGSevasPuT>xtQ8J(^E7&p6ZGgB<53Jd%K;8N=?|nNL5>qqqq`3 z;&_3&pHtZhY2earu$=G_nJ)sfa}1{??iMG)`M8B<@?K-e%D|~XruCF}hA}&@d5vC? zJ_ZQGon5E4kIFHckU!oNv?p9!%k;nlPf?&|=GIFCOQ&Yr3VqW;UYN8mp__Cpm+N@p1x}2zCO=ch zWo|CM9V=H)YUHPm`QW)0CMsm1obQp+n%_c1C^u&lLhKduAcnlE0V;rx|gE(9_E^u?i zckgb=D2<@#nEH|rr@F@!l8cI|uyfJ#Ik({8?ILKeI=7z1VHyAD1;E?o*{jVRN~GPs zaQG%tE8BgFp3&5Mx~SS`XMXezeg@3J5~J8`a>C<%h8u@f(#)7lFd=pv26z<1ZQQ{V z3Q-N(*uZ+}0zrF@6j(3O!4>{=qrltpBe#obH@?Y3~Od&i1RS z5uyAVuz*qK&*8Rjk0Z4gp{T%D)w@_y8A#Y}QDXIQmzCVQPJ@3sBXwUZZGY!%VS32& zXrAL;U&kt>r4|-EFsEjJtYz`=(X2qBf$^T2RX&znM|K9~R$9)^W#a}>7z$mjZi%Mj zP@Le@z7W3m)}70&<>7!s^l+KtN~uOUiAv_<@C7v)7Nm)WT@er5S!aPcTMz%*m=$-9 z9-Q_N#$7fgK3zDV~g8U z-A14qe@KgcPNt^?AT1bwc6fmrzYgJl4jYjl`XWT-n%*8oidxl4gkp=XB$P%P&MOIE z&M-jtE7D`08uhu*ESO+mv(*HrYw(N0a39OpeU^%5Pm~uolsvfd@p>!SY4&2gc{&`( z8ow~O3@B@)|C%-C{xxg7%xXZS_bD@qYhp`%qLQ&*2W%MYp_&Iu0qm11A9&Gi z=Ip~jOV|)8(oWDV7mQv0SiNrzkMnvjt}1NKNq)kD!bfVg`p!L}D+h7RTb-OayT;`e zxmnQ*bWhd>trTY7JX+`5Jg@;b3D1aqqr9!uWZ1o~P%vj7DW76jh0JQ&w#S`hO4d!0k>}z0pR~J1V7{N$*eCAo_x0&Hh@e=ka zgM^9gUCpOHad&%WA-#p%swE$CIFoYcvILeFAOQM&|g-=-$5C_pmy6jt<8(&Vj zX+YX_mELis%+roXg#>7vd#pG((LntPH@Sv*J6ORTSLoqaQT)9Y>@s55Mm{jU&-VO+ zqjk#L>ZtY4M`Ov-nao+gSiCNYMWObpib?Z?OUL%R;y`a;z>~V-NE4o0EaHQ2u{1v2 zTLgy-sHGY$fj;xb6E&zKc=%*@a9%kd=8W|nSr+p-@ycZ{G>znOBth>z*=TJqYtOL5 zC$k=MTL<~JIjmgzaBasHLXk+C%W?W78(653@cFIt2^!*a3T8P>6H5RI!&gF$Ecg7@_owRWfOW7KCDm#Yto1jjT(jR7mRK6RS z(KbujA=XSy-YDJ7A@U+p7A0BEo=1Bhnw#f9W!jcm+pa8*)@#IXPLmnN0;e|qY$cEf> zts_S;vJx-U9WxzkMuhfK7D~#!xsN`4A#MgR{+;a`?@#wrE?sh|_83F)-_Jm=Shr^G z(Lmb7_k|Ns?btq?uQl*?z`#bM5>mlK;}A~KbJR;Pt>)Y25qz&);?|-XV=d#+M$BrM z)Mwhd=afg780^oGEuQ5U48Je)>gh}3_)#qMK%ZP`b)1({PMZ;hRfxTF)Rd!!{qU;K ziC;{YXM&y=?)x#!wqw zB=#=k!ZiG19LL+b9stx#Ft+=7N|DDCQjth0o)bzmmruSq%WAllu%OM-tIwGFTqSzF zF0A9-LkEv=qpd2SKPH)PAn>be?2&*VV8JmocMQ13wLIg1Yux_&+#4YhQQErN>pz=iyfss@%=+bamAk1te?PH<)Jad@rG}W>(9xjS>s_;v$WK zWa_JHoM$X`G>Jpp#bYnpy4Jj~3=cP$Sz!DMt_oUf+8g02f^KGzQtbsW!Nz}6 zDx4*)6{7L(#m@^)yvE*0R_z-Z7 zjqxIzkC9k{T=w=}0!=ZVv?fCqYq8-(AlG=b$(7pfi)-8gxW*oQ!|U7pDPc2A-gib* zH`RI9+)V1==5})}k?-kIsbh;xCiQ$mM73x*d93I*_z_RXhRF%dn}%ymcdWCdA z8rcv8q>&vYjB!pn@BjtHUq!_#mx=GT4di7eg{!{Iu>^6Dh>-ZDw5Z#X?R`vj@~o{o zKHVo@@<^N@EbNjvAdid!<&mlw+Nodj$f$lpwy-v4s(PgV$YD|y7Mh{@ch-^l0K0t( zH#Rkl<_SjeThSz7`5NXut`yJ$7acCbUC!gV%#EmjJls?E!pse=ZwPko5hasjiiOwP z13}1-!A(?J{jSil7KP~U@cqlYH$*2YhWQiPu^eg>u=0n zb*->$+>f~Wn`i6|bAbKly@r370~e|#qEf(O>mlx+{y0F5UpEJo?SS^LuEjGNrG;6r z-B%nCuT(S;VXN|oPp8SDAIf`0?_x~lrKh6w!boeQoxw&=oz;JyKX-gQxXbea&#oCt z{B5Pqx_kk6zj$Ps_@qaYK+64l)eVdUDMR`2PlIeRz+%lHvejh8L~YDkrET4cf?1(M zUbGsLgDp!THVb-AehxF(pWDDb6SP3cX4tu?s6N;VJPFi zpAssgu@Csp(4%;0W=2}|({Czb_ce^SSM|(iG#Dd9X`3deAz~s~X-S4(TUaw%P1Yrd z@YrE!)W6j3I{j3?u3gl$B9x1xvq?}3J3-K!Jz?d#Q}|@8=&1n%Vxo6Onl54aY@MyX zChI4H4I}sQ^}Yi9F-e9kgp{=MRgv}(HOvo!J@rSMew(y>A2jKsx6R|=#nWLP3Q>kPz@O~Zto!L*CMw?hDWj880Kb|o18fa?aaD${J zH?-~4LklihyW%tOx>rx!9&pVp>P|H0v>p&@F%T2jugX}!ol-EvM0RJm|KL^XA?tXg zPybWC%Ann;8dYquiKIdA^bgq!63tl8HQy5yaZClXJfwMOQ>Zg{ZxjsYcHAZ#B60ti zdMrJ=9tEcIv4C!Ljsi*{)ree8N+5TzD?ftz0wqly1SN@s3nYg!1eq>)B(JbTc`>!I z+&HU=ccc$SsR%cArLREvj5xc@%(#HpM>VxrN4QG0yRRk1v|(PF3leT9cYL{mQUZ)*$wvpLCwF2)c=jC{FD0siv11aN?f}E+GPB5a~E)^UyLGc zlz4$C5@pv3uJ5F5kXFR6n~;b0B{6g@;8J{xYm`O}BZ<9Z_5;UzKBXp}k$YQJXw)5!D7L-uJh zHdV7*Z^~)bQA7Cqs)E#cPtRTRlKOOli>;8_O|xgDJ~EO}Ad~g)LfS+9?_bRgMd0TC z2T5dBnJJ_zpa|jL*~Q%dKoM@zx08AD5;zMt+g;WuR|x6i-y4Df`VN(HoizWiZ`TDJ2=?Xm*B6p<6RSp;Zo`on(kWPGX zFPNq`yMzY(;`wcf75cV^y`r&!E9lsQ!MBv_5U#2GpM?+B(sb}gu0cE*Wx$5-#EiBN z)6Ka}#(bY?xbxK4ajG1MA{Vp^?tk%%qdq5Mu zj8wJ}t0_c`Hpb*LribKwfgapv>R%Xe+i&n`^K-+Fhk+F#hWdIWvyrQ}qQRFH>?9Hc zMgtm2!!N3EP|xJqvhP!rU=&z#RHl}KAbei@F~=EmA#)+pDFES;q}0!uK7wgGfFS%S z2*Te35RUK-!a-)SHUQyY%wjqK!a3u-0J9j1c@e7l=;Vu8{7ElgS9a_fU>4Vy?8u;e z#vQ+QRTodZ7&Y+>9`jx-V6xrAbZ^kh(qm$SBp>r6R$aBW`8|h>_7SPspRIw;RgA)( zdcPMaBVLoPOrjt9r62fExEB?aLwbyKTMNs8`hnL~z1s$tyowN5Ux507@-@vq*|?S%qb`0d~}|RwpvSMYe;eI_#@< z>(t(H*J3&Q;E8sLDhna%&kd3S#1O(`Dpd^Y<@>4o^V&Ww594z-Vy(#H5MJ-k8v+mW z2O@)_SEm=wyzRyw=qCM?FfT>}xL&&+NJ*uw>-p@{@Karzvyr3w#yvO;ACXHG?|n;> zmP>ol%*MoLJQ~_POgu)rsQtv~WtXV+NsO^c;d>4lV&(_=%ZaBDG5P-ZYl$BWqk@*4Ou>S)&Q+7%c0s!Zd27dv4oXw*3 z9qSMs>Pzt&YslaiXy!`L25oF<>2H%V~xlQIg`w`2c^PqU@;}xd_-C(ZhR}j}!?wkUt ztoNUIUWYOH*sj6Pykin?uP7y9H=T5?ZyjUL{Pmq|5MstE^h!xcf)O78`N*dMFs&f|ddqbu}` z2PsCy2Mn1X*x*XYDsnPrv7q^CBl0|dAWnWOi}skAnU)kBXQGt>&E5;`G87~hW2 zK1Cq_L_q22XPB!#ius~_LK|`6!;p}jC*gW*QGj7ASw@1kj~X1*uaEcP^4Zn|TFu`2 z`3=IMbaPXaYMl#jAV*nWyP7lh(yt|MPy9+a$b+z$V@VWExLp*Q^2MMLxB4XdsQgjRF}*{gT%AIwa7kJf#? zH|$~;ZuB;Mk0Un`hyA~oDBy|lz3ly`67`e%|4O33yRJ-D0K|Fq9pbS6szg1BVpf1; zMiKW^cx{6Sd&k8nm>6b;IWkuVlACTS7%)_IRrMX|bWi%sGsnx%h z6uqyt2sb}@zGv+@TqZ%}2BJ=cOc_LVn_W@P&2kJu@;mRxVC9c9x;QI># zbbA>^oI|a#q1SQEM-;C6L|u12SJm*9#=ndd4>t*kPwRd|mVD}wWR-xh@X{5XCh~O! zdJ1i$)7(2zs_Ruf0k0c!@qM;^LoQgq(a+!H*MIn7t{=cde$a;r)c6N}*tdxlRVMFA zh^>5rW>o(DMDTqHrF2nkVzZ=O^89A+3t62|!r|V^2t@>&vZhb_wlRnm#R=dAUz%lR zE$}B(@7NPj#SP62u59dWwAOBUSu8utcz>YWkOco0J-$75W@uP-nGN}FTxARtJmMtq zfr7`GLEZder}+*ehc{f@63k9`&z?QAz2YF)B1<2g&Uk5Z?1@2YEA&9*og4x%n4f2R zIGPj#zjGVRQc2{R*)t6?O4ob_x#&3i9P@uv5i{A$GQ$70T z*&S-81?1up>xY~(-+Lmar=_Po`!WvMxVT+DhR}2d>cix->-l{ga^TB2q~n)y$T4cH zFotORAl=;vamzaGIoEW@sWJe527AO?R$Y{75N?b0Q!nn@wuIJ)WOG;>Ig~Ulj!?)| z?a~R$JIsORAt!)&$Qdwh4PYLU1vC$tt!rdL0rX*dfDIzhb+Tr21@cdeR}u7lNgxN~ zm|%1M=#}{`fo!i#E&BpLk^ua0gAzy({7`*KAa7|)|DHgC;0NLx`~-Z1A97Fv34$ND zKj5ctAmvK}sb?`iiecUSErE1_I?xxgvC~u!$fuI8g65h&ZGc;OuM<7F&AtUy4{aCi^kLG1`Y@da z*{iLAKFsQ`eVACS^!G7AeV8h!?q_E)pgv6Q@J^r)vtNj<;I{-4;aeXjkU&19>Rv3A z{WcF71*XfR=~>i{TsdkiemS5qUaP`#^n|Z;mh%kkuW{8JP zA!~$&qLmI1G&kq{7$DNaBBvff>)MmsS$;;+HB9mry*$A>5Hkg zEt-1P(DVA{D9_Z|^)N?$72X8Ho6(8gea|eqlZIDe5^)i#3UoQP`>RHoaGBqADtQT0 z+I9Lsh}Hj7DZlkhB(r5ei9hN$;~w zYx)O`wqnd%!=Y^$VjwvtI=)0TeJZM)_spc~^WApdKkT{he@!<9>YsFTTDrAt%KnvS zSpP{k=bw0nJT*|6m6_wmJOl9u&zNeza4JW->cq1bj&><}>po@)<}{LJJyMyLduFy+ zn7r@|X>ffUs!Nm;&bNmZT;&x-W=0k3GI?ITM*DMrF{NcDG++DdZ37tk`S&{|u0~pp zCcCPqGnEM{flqBpGzyL;I=By?%-1zGR;`q8s$fs2Fer#q6r3ps*FbI}hOjah&Rgrv z^gJqf?c&JDW>fI2lO%p|+Zw!Q2sa*OV~VXRsM6}bEJ-RST*3YE!b0!Qd+r+BcHB`k zff^nXwjwTpEEXq81ea5-n;Mc#&u;fODk(CQ?^N9z2(!$61a_aE)w{8-|A1%Z#bEO$ zw=9xaij+F|=h!#*(iswqTOl8Hpw%AMs54-AlP(cH??(XS>Ha8(Oh`-O2Po5NP+)Wa zOJL)F@knuUiD2fL?vsfvM9^fw9rRW)<8XxSB@1Kj8q`$bm}wksctoz$bl-uq`j)yq|vyZ0>__M)@1g zbhHCFbMX~t3_&=f1mMibpKu2CE6yz9{EjozH*n@_V6ztu;Ed*%z()VOz=od^@p&Gh zh7*^*Ra>~ZP$Wai3?M(=+g&Tsd8ehO5xg$KYDJrKXRwM}Hn*%Dj=SGvP29#)zRd^~ z8KEBLDSHR3&6g!L7d*hd&N3#avml!^G%bj(Y#j5}wlo_$L!Kd0=6z(*_-g6UVqa+~ z-FaX6xMmp5<`o5{IZy)(x(l-QVg?aZq0*rE-51DN8iz$1G9aMg`~lE}xcvq+Cg}ac zM5;G|hVv`Xj7~nq!wty8NqD&O{8DFH;DXCw-J4_c(+&6i``h~l&;YmQe=k6Pt@+;y z(BIepR{}(EEJd^q08Qzifd;rdzbHTv(Je9n&;;%ahQ<_5(p z_m^x5Ay<^#7N)6F<5Y})Q+>}7Z9#vr2Dc{UMV^uwvPsX4 z&w5UL2oXhhjifjns-W}rDDd34Ls%8?G^&TxHY_wZo=Fc;3Zl7kODXR*f(hIR`M>{B z-PDY4+l~FrD&r5R>FFvg{ecI@%J~nV=1-B%*F9cF<(@yTK$mj7+Ye!BQzRJ!dAvzC zov7pmQ(2@78UeW6FMeyap=ak+asa2RWWrzIvQTlSSvN(sYDZgf?6SP%t;=UsY;5=~ zKUPW3W%1{nSHd;DToQY|mj73I@`w!9JilVu#;V5Yf=@JBpM)G}Ln`P$$GA${{2l^Yj#brCL49WVh zo?jz5*Y+NtACh)$hllY%=B?8=qBxSOLtQBz+Va%_?S7G0m~^YXD;l**2*JLdCM>KN zA)Bt!v(yw9#;wodOz$yh->J?}3ap$(-n!(UZ@!vpT%|44_>ANey( zk>HOvg4_N)BC2xOcdP@JtDz8IF*XwisROKGMQRX*pSXXEF_`KFiy?K0mMc zjx)Ey;?DhBrTe_S|0&m9vH)lc-eKid5sq|axy1|5jWPki+ev-`6TZz)!uYfi20J%y7_ zOfJKQepi-~E*WlzhaHeOEck%h&fjw{MTxn{Vl--CqR$d(-N_~q^~7T9;e^6D>V~9X zu4LLwTLSyuIFxc_u9F}!UvV{Rsp(d{yJ7(%M<#+EoE}~Q*4a~MXaw(G=cGO2?yoU_ z$L}$}HRUo8^WVN1^Mn5u^Fv1R{1Njzh3RdSi*Tpv2<=N0sYb-GRk{%gU`~*yh}>0| z-9c5xf}ov=yj_Q${#IRCoaNQ&TF=|`49?u}iwwI`U@tNDr{@87h>mG~%^M@%BqQ!) z2kRN&ft{@Trk+(xe`fsOE5e(S!TJ9{GX7fgzm<%?um7(k12dNj_Y9B>zCXA40}rlW zl#JAvFWZL&?(>PqjZwzuqKnKZZOwDNMz@#9fVax-6qY95jmTSWd58wM;pj#X4(BUV z={s7FR_iJeJtqWkf++M?q0H{kRkPR7oqw7?Igcq>meawslAsQZnPe8whmBV09TVTX zQlQr;$eBVpq)5g?VlgjZN}~0xSjh3`!OEO`{i;4jFrU&KiIt|17i@VgdR$0WTNG79 z7!{&Nt2c1;;l9F)cgOwbKJTUE_#YVvE-VCLD@+MKWA?q=I5Ta`dZhP&3nMd(Hl|22 za6w|tGi-_i7qR>_!$4b-WvGfFurnvzacVtEc`_fmlHXD7coAIShA;NL(RxEd*#AjW zzA4MqrSxC11E}#2e6gE-Vm5id)+e^+82JCkKC#BS##aw6c!xUNq}mP zuDdNwB`6_dmZi6|o6}#+H6EgAzG8E+JP0WDnHBmreKR*;%?QjY7-7ghz ze7-$9hxjropcdCtnph@{9tmghEdva5#-o0v1?aOm?hGTH@@$f$aYOc?qe_nc;M;6R zAO*qQ(iD6EQV>_`xqSFcOZoLi#fK_(WCme?R7rkQkf;9(I|e~13asA=c@pfiF(&9g zQWWxUDM|p{?;rP>}C$ z?i&gM+?YRvj-NJieP8p2>-B@0e^HR1*8iI!v7glcR|;bOFa&=GP>|I>LkDoEUsRBs z=r7a9fo^H7hvP^QAt)+g)^5g`s)j(&k1jiaJ3U#4YGn2v)g6r?0+zt{$y!tS)%l=X zlP=*b0q+z_Ds)HRyBJpZ_(zUPbl3Kec$1HE8l#F@0#V_V4{jfvO9aQML>I#mSt>JN zIlU%bB`@GDHmxWEcUB)SLllVa{6v;NR*8}A{XS4`wE!G%ygazYXu>(vZh%3jnCjLA zDvti=0G~GvW;o8$xX1E7clijW1YzO}yd#F!-hRH2A@t-+^#lK49@WoPZWuv%9A-Lc z5?RdoRDP~7<(2J`$bow3zNXrS^-*TE{G-1a=DH~xtp6Z=f7?9$@kg@pPj;8QNgj~g z6$fC?qu5mc*y#A)w~dZDC^3jce&6W0;N%X^q}8I;8*pq4?Mcg2j-uO4*k*Be>)wv7 zUauy*%wLYSoTt<+^$#O@8yt%H##x4#zucAMI@m47bbL>Ys>T)mkr;oI2M0{Hiua= z6TiptbJ58{^BHnF4G+2$?r|+_p}ZgUoyO*g?W3ML2Fkoyc)r}f~%%OP#WrSnVr zj-?O7{Vjbbyw7z13G{U+g(E?PW5xzL_*u8f18TIf-Iyw6nPbTSM(VyQ-7+>?(F_Eu zYNByq*f?-H!@Eaat7w7XigL)%ST4~#Jj#%O&xRhFGg~#76_3O!13d4D%-%zrJB?DD z89!LSBPcqB)I%t7A{kv#$h1`mEwU~bhs4Q+EkK)MA0x{$b4Ed{lTK)iP(=UvCH~u6 zZ}VM^Zyn2VQK%vV8-L*oWOY;<b6pYU;ilsg^(9xA_s2auJ3 zz=IR$75g1LGE>r_!}qPQ18~Lw@Yw$yJbVYnLEurw(I54H*n11FEYq%kpKb){?k?%> z4(S$E4Laz|<2ds^?^?gLe(xXfoUEC7 z?sH#zpZjwhC!B6gHhEuA_MedsQz~y6_Yrt(1mxcuuK$QhGCqwyL2=Lvo>r*=)2cFX z*=T?c7B=Ts^gv%;FO*9lC|i6;=S5oDtwxJ5w&cX1uM|im*+>%1;24W#0J-E>*8rJ9 z=TBbhCzF<0r>h;uMzMik(IRzYU-xNh8)Y{YHJ%(;d=~)a=Z_26(&qjW--BN zRFR^($_SSfWj!?0*y>w~5Rr0}#6OUjGunH|XG64yIES|^2`2AAkSx{eJ--$@S+m|GQ=5*XRGMvO&55zYby@x&Kr){sHRf`L%X3EGdr{ z0j!g4S!^^m5InSLBlT?$ndOk-(oMe3YU`Q88?fA1aQaktZ?Bl~)1WY(C2U%bx_njt z%*zS!!QndsxGX6vvu9G>%I&%T7wqOO%kfI z=J2G2`>!}F=20rsZt^@oFYIV=rScn(N{qN_ zYz@u41R7RnC^H?JZti{(Q#rS;S@0u8iYF*ih9ua5EINAGSD)B_{xY~y6Zm-lK}`_r z4t4MVT8W?G_q_k0mAG0HTx5qjF}s%st6qyvAyU=jSU_@Bj8XPLp6ti7($G%?Pid9n z*;#|*y+|x&IKUgbKLDio_Qu{7r#w9{ymP+x4tQg)?*zqrFQAaJSK#+Ge+E(jNJvHi ze&0stYkz@+T-`g~ZE^#`z1%D;Ebm6A&GH}L6VD6DS_GD4LhB%t5ubA~>QvqqxwG_9 z$$o1&WRNpW3B)>Dbw&*pi3B5uYwiQcVF3U+teWJQ^*;NOb;SGw>u7!C#*6`GNXk~5 zB!C;S=dw3>!oO1?t5xT0kr-oa z9VE#TO#zAoI*x#M680d+^|(iP_X3J}?`efQc9h@pve>I&poE(kHHxv;mb_VB*v^Dm zL}B8miJF3KrP&QH-$Fp06_E51YW~1ox>J;S(!EThG-tinUl~uI!<{npE0T?OVtr-5EED|2pO}>R5f_Gqvm6 zmKxpGY$COIb2!4Xe3`zRDzi5TlE0%NZ%p8)R`#+A5e%lSX!5OCT7g5p3}||{Xf?4f zL%w&K5B!upSdIyAnX|fJ`}EYmPq+yA!hu7+NjXInx(zPjj1(WwZ^z_lqcg$1l|2av z#t*gNLNS=-rq6|fBj4?ZvwH^P#S8y@3h@)qhZyz~$qe#vJu}r-mz638$gPN5MMTt- zBZnly)WEb#pV=HVty+PSpEBffg-;(dSM_A?-R=uCXB8jIONCQ4x&suA24dt;omIPyrKAb-(HIc98Z-17}fIZ#$x{k_HmxC;L3jmKY{ z`CqLde{=r7svydu{lTa}^_co`bOrpW-)uZeVic7D@_q2fFAux(6h9C!1XU?sLEm%s z0O)({#TQElrbS8UvP&ic&-W%GXI*s*Vw#XYWWU9y+GR$6>QWi)mDtv|*Wn7M;2z7c zjU13OWv+7fg`o<8cxZ=#-DV`s-tnW-@@%#u88X84L+UaPokSX6=mh?!b%*R8Oqyds zv0P^1XOeKUBrxc!B|Dz}XthnQP!n`Hz4yGAuGv<_XePxfQcZ`ZtEnb#yg5M2sgfEJ zQQ~mOTkm`0bMBa&{;oglHS+814yy#CYwMS05-`>zx% z|0JUFlY(UtlAZiAaXHY=lqo&tMa3uT3r<}As9^bEgI(T>3}U~gT`E}QkDImxA345h z;nz-6W(FcEXtP*Q zdsIk|9}NJn^UvmhhzdN2{mKnuzb=5-uVXztfPy6rq+n69MgFc}@wx1WRCKnpE)*;> zLg%+2@J&Gq7JiU|rGB`e<{e1ELfm>2=!YcpZ0?LWJ)0^9D_HK``40+~{5?&O)fUck)D)$)kUPh1)V?x|s1~JJ%J}2&vR*b*AAlp5>S%vP zzj8gK`3e1sbg^>G+DaYTe}R5wqXN*cGi2Y;uQQkE*O@=iuQQZj^lM7+cIS8WD+tgR z`~&*cHas=t`^qufH}tE}=L_`f)s^F)$01i9U%3AqH~Al@^#9__|7z*^oAduw>3L;o z$_na%9{kt?0e|Xud!X;7CmL;-CIa+)uak1|e6O2WeZ7Q(n#5kj|Hb_DXAJ$C=WIcu z0e#`7A}=O-6)Y4rAJQ%bx+S&KJru)x{SL?+wu9d9@hmo&3OKO?3h>nELdUe##@vWU zaijO@i4pCaY+l#ExS11ehohn9sqLGI$$0-ww&;CRQJ7D` z6#<0W4JdFLBGK^z>xe0^&ooiTnPl=!B30Nn6*>&8eH~vs?Jddvvceg-#R-3c`|879 zUtZW(Q;{Mk!n3A1`UB!jWwSf$H#*g83x zipa>7xPFIYa6(Bi9DclL6q%=f_EBV+lAB!#ySv@lnS>RAk^qSRGNW%RCw!^@YOyzB zmTBDVr)T0;bvbN4`Y3S2>q`j)d*`5BM!sf#2J5nVo`HQsBaITzbYK{e_K%MowJTfj zYCbPX+R6~kt311Hc$;X)`;B7kgW%2bM?~u$odpCf zACB#h=t7u_G!(3ON}XxS0_BYdX-(vh?|ZoXXF*Y3mQ+8Ej!%Cj zXfgg@6SU|7f)=Hp1ucAk613od7qr~y00b>&)n3&$1AirGIsAyeeTPu_8)^^apM+;v zX3zLZ&=SZj+xAV+0?%uxa4Be6|0ZZ*5VAYvFQ_1E7`wSGAW3yF1}!|px8!J*)Am|! zpKB>juc~f5+j|~Q#bL-54G2zxf#Yh|b-MuIxKN-G9~d|;=$D`PE$IKFpru&{1RVb+ zXaNJqtw7>0K+xj4N1so#VrD~s3nXa4R2c*WEopUnxKidlbPc~RXjuUXTHb#yIGn!} zv^@PTX!&EevxRKo=_&A1(E!}DKhU*)`;zqm^R+MNTIOU*K&->8kx*R#lEYb@_IcJQe=n$brIjL#v2-F2*ci3vOceRq5!nAcOD~M!M?}!@`s73=2?)hE}6w zyic9FO^|5fQ57{CBH-evkis5@%uv}sPk(tEo6n$`B1z{QSjCXi!$YJeLMcZIj2(nk zpM<>M#q>Vu4Q|9L`gs}ttNq&PgGu}JbhIrYnza1oa4*u>YkBPx#G|EfH2BP)KWQz0 z43E}tvFv`IC361+z-N0D>f#v|b zgirT`?ZqIb=cr@jO-?+Q}0-iZ;Sb z1R^+X|AGP&I$0>bOrlhXTG5XV4^_#Ci=n*R_;&D6Sk)gvCmUh%BHf3fd5`26g)j@L zCnofnctV#>yv^2#c>;|kAg{Huk%Gj`U(JcA3W`ucicA)kv5jO9fyDn@29Trnp0bI!n=n73ViI4`T)S*gp-mZ%(?>8$qqn+PEAm!KsK`0}*@Qa*is-m_`Qy zsgv}()zprCI30=Nv`4VEDf2|n# zXIx&W4Ka?p5KJd)_Czqlo(+MgbOB;Scd=i?_ldIQlUYY(MkVtpd?vDjt8Jw;vd^Q3 zLzvf-40SWRFN1TF9JcU<{%OYv@QID z%D_XTD6(N$;$sdRJH1rt?p+ z-BMbGjMnp=U|YzrZo=FM#GhAif~?}VK|9CNV4ti}O63pWJi*?`Mu0~o3xu15@+D~M z8Z8MxiqRfkW3qx77lU_leSaKi6$MuT{By$GgJcPyvD_LqSY;97+Ab=GCNZMIgU|Kz zG}1LRfars*LD{Fq^+I~@KbncM2{k&O9e%hUGmjuwcHM!}j{Jsq#&!42yd5~>v#Q&V z=JBA@UytISHQWng&V37~BG*jN1~ZVg7o^vQY1F~EMy73#zde<6N*`p2Ie;P9Mc7Z! zZk~xW;!iUO=T!&5kQ&#|Prc_I2qGbS9K7D3h>;jPQLclC^Oq;MN5gBK`+!mnZ@ON$ zz*&0mm}W*cSfF*tU;&Xr6eS7nQyY%TR%z|AR(ZVX5MrT=@CavnB8|% zGj3VwNH_BdM>0a7ar`umkUtY~2I#fg`DKZOLKKkU+QGoLT00TD66WI}NCy^>5n=@@ zx5@2bT0tj}JcJ}er}FpAgoyKA+b71rBW%E8YQ))0o@fr-C%?zc`+773o<1E4UirZd z*`1MlTu_v^4);wQJ*|0l29Fu^CGUnL&K~7wK8p8B*s(X_PCABt)}~PoQ4EiriIa*c z*>}fG$9iAeuwxnhp5krWXW7VTjkalq1@Eq%2zKR*aVEjx1e&NIZnT*@k?LGiz3XSh zir9px6}UBzZUw^=vKI8jix9;&*^$SwnSiQ$)h33=gRDt%r+lxEd%ocq%XCv;7syh$kU{RBygd!#d145JP)9Uz$JU$lDRxxfarN=89C zxA6~lX|rKT2Cf?+PM}=#gBwJd@}F^fS-!wuLnp@VZNA|&W8?yBktUERP29TRIpp_z zUNZ_7Nenh061UZ0a7Oubg+)gW4eAS4*gSJN+!sP3=!kg&EBG-=UNun`Iw%2AW-F+# z(1+&_uNy%n!DW4w~*Px=U>GExnFo8fLRtUh&RxB>OR zh>#blJpfC+_1=!~1Y!%6cAJC|Vet;+TO$G;6k!Mf;Lby=f^Jkr51(k7M{mU44L{wAJC9L^ zW=A<;K?au{NCf=Z$U$;qOnswvmg_C>#kW=N`pdFnn+2j8k$xu7hgSA?$!;gT3FRUR zNe3U&c9co2Ci5v|9@ss4iI>0}3R6I4`KX2oW7GJWFijKYNC1r!v@1jx?xY{tH8Vf` z@?ELsU12eo)kKf>IX{JYmhw;&e1E4Xj2tVIzik+z7MPHx1=KtZPNCE z3@y$NdR|}Il-m$Dy4FUR(7%Kf=*rYVjra{` z;(xjJ`qdo-f1@ZA_BNz){7p#OR%|ES{ZP%j0dI}iyJ29T^Vg_}t$v-*xN}gI8G8Mz z_%nASk=qN%CSv^EaHM|Cnb)fPWLjAwUz0H?y*VZF=kj5Q)Yb^VobS3z+zBm)ifTtg z7wpGo1YD_7Mm+hjxNXGqJkivMxq-E9?kdm&fg*lV0qv+Tfo81m#ZY>!#ydU%N)wKV zZ(86)8vCgpcv4u3Wevo>m^a;!x~>Er-kK|^sL!${4IN9>fC}96-4J|6*gB|V0nt6L zY45_`gm#Io{>TW^%-hU}z~kqg>4>Cku;crm`>`u;Qr!Op#;L`G6VFi;;?2?kxemSoUY1<)=OE>z-gyhXL%@*j7Sm%Xb=!=^f6I;_FV!;Zh;8 zbrPkKuPE3I-Z(ZY^KI(p+!AlxJx~BUpr9!%;z&KdJD}>u=RU4s(42xDPz^gNf>QD1 z3l;35k>)#(o@41}M3S>4a#dgf^m8Fd%ixtI{2_jTJs?&?dchtz1lR)){>&aIwiPhe zErXC~d<Cxiwdw7 zqB{62X;`k#n*p?B)}m+$+Us!{fHQNaJOyaUy8dX%IuFL+g$3%C9j$?uOmm-a=?T!1 z@no}rotYcrNx4N-7mE=e&TmJ779&F5>Hv!o^r2pSmx~d>mx~c6br8>I5i58;1hB&a zixGXG#R!fSPI<^?!fI(Y`HF&O@6T8ou}E$kUgdn{W3Bsh=CYfWEU|V7vJ^SOT+GnU$e_jN+IbfArNLhnG5i53j~i4f49V z-SDwf<2vel`N-8tDpPc9!zt^`yY6HdQZnZK!;Jq$2h`7#zAKf5kNY2NJ1lnwOWp-` z?tX@Pa{q&EhpT!)*b#MsfM?FLY|yh2nZh9zq63`Ma%%U%dcid@z51Hnu&0WLm2)$S z75+sZ%v)_-&|@eZ`68AY)SaceI&JU|*C+nh+=q*wN+HR_p> z`feD+xG)Uz^8?jIrW$ggVoWAd6R0jI`i~>YK-C4~(yf6Ft}X_i;a3fV@;?~{RRP1` z_)mtxcYiVr>iyC%SPB>hXH`Fq(p|^yyoU=>=D|S$XYQTy7x_W9uFdSYL+ zRT`(i`)dfsAufwcka1uwBSfL_pZVu-(>5IpU347=0|_RS4}u{H`|tc{~AF?iZH z;?Js}Ed_`*aI__7&zh+e$^fxOR`fnBDhGPM4PHZ&z1mG!6!FCr)Cp3SuFky)VkM1nL)n2{=n0@0BrQS=uU^bu^EXuJ1X*Kjk7GD_Q$4Q}FKb$x?Hfk56B^h;AOD*Xk4kHS}gZ58fU8!uqIih!=t)`j2;l zZXeTEvOyJcLPnMt%woovC#TFb$lnO%A$i=5MJJUkY{H3akzB6mXBmbx$9jOOoLoi0 zIig(M`=n3>=4cl}uXzyQaR2=lMr{z&M1isE0IB{ci zw<@O(o+Vp|cB^@5AyVe!SgVdcY^CE;rPEoHg7D$VhQ?iJzlml}mFZrq7qf zOW6;PR{x|+N=X<{__jZedsQ<1Z`&k9a{DDnb~&qC;80QOC83&~^y~mwAjh(kcpi@# z$h=kgaa;bD*pda{%0&sv?oJta=?Qk_N*-sg3!;$>wD9wkD5DZRE0E`ru5ntX_2Lm^@fufu)RtJGTyvdO-MAQV<>pXwDRSw*C>;+6)iQR)qm#n>(GCJDK%caGrBBk6rUm+> z$PVX+fY1=d7frXB5`!eFXher9*EVl@TkVWJMBW%N3%aiOXyBHhDQC1FmHw zbEIof(igVeshyN2$#~&~iXjPbr-Y)Pcn#>3u)&>@FqCC*8bE2&L=pIOZPI}%1hg`7 z%M`RS;fi&2Wg-t)nJBzmnP3C2OrRP)uMN?KY(^LBiTbuO!TrmX30+`i!VX-^(n5ii ziP`Nu$$cPKaVY=t)|1H1)1WqHQ;&epj+ySYMeOY((KORSL|Z4fgYUSMbbmNtDWna~ z4L93|F$+p%W(Kqdq|it~d<;X%2uI}+v_>Z|$!+`|_Mm+U=?D60?^mxaO}E3-pMs=@ zr&5%au=Gh|K58M4_hAJB_v$%sCc?Qodd34`)hDG;M~wwT9SPs|C46Nh^&Ji7W1AJu zgS7}=>q{BBl-5gydn?*NclkNT=5hmwYWeSoYFH4WI*SxF2ZX53kH37m$|Su&RA+{} zpcjD=)pXBf07P}23LUZ2^bcU_`YlfT+$o zb@s(ai9Vpail|P&;d}EPQSHMX*v5$zoT{RAzGdOJfOvtZ-aaz~5Y@3GC%@R@{Xr4+ z=LY286|)}5Y*pabP>1Nd_P;cf4?`=)+%Az+Cd zaOYx=DV7kJPy~%oOwS~(!MyHPoOwm@oN<~uOy#S<_&v_+2#8_+EUO+F9|wj^`wF{z z8l7+Jb&!WS`q9NsMQ{sTyYU8X+(qXhqgHp+btbNK37q!x^q~r-rBB>74l=PXO_a2C zhLT1pqaqGZ^~Z?D>J{fiS<8^D1C*ML9#pPO-l~uieo0;z2(=ifPTpUBhtZ`>^d=tj zW+I8N&a=_1_Ed)`hwDOlSuCTcpdE5zIp6yJs+rsyq<7C(lJ19s830A9410`HNeiZ0%{G-n55{#go*;KnAqaBZsFR#l* zHIXYmZ5c~6&$TO6qi*DTwi%=XM{X|nj#koSZnec@wGWoR_Csq~^F_i{f2@Rn6<4Si z$KZqYiPIg^nZp)WC*eF6UXlh?h?}<&qSTnLb5*Ay($>#ZQw$JM1t5h)Lj+M8z)Kjd zb6fgWV|K(a+GbRYmsZEIyV`kI-!dq@mDr8z{%po!dUwXPAlyy~cQq?!^psBWo&SDt zXEGkpSe0!qH)>Av*W*6P9aR7UL)~fsU}%6mf~%d)bl+5UX-?Dt;e$~Y8?CVx-y^}I z0}rBZED6SDN}i_;63JCw2a!H@3-^jBlN127PCjj-uKRR}G+*DGKTAR~i=n}sS;|0N zKBm+CUN9E{yY=hxHi(N5e#u2(!FwoteaG*n1<0SnWcAITW7h}ExFn3xTkd`ua&j*E zBaY1mz_HmsLMZ}pY_#9}IT#>+4s>23_FwsP;(o)QbCQ2amwx??F1>~KE4s7*7{~Sr zpi5(SqJVL1$KP>m;(y@SLeqJo02ruD#c$)-48xB-TR+#hi-jVdnFfCnuFFWp1Z)UN zoM!1>+Cpvhr6?R(kV5=m8^X!k$6b`lE1-aD;bp)zePkM8VsR}3;3A-a$U4rq3Hxx4 z5;!4(A%TD^G=lPap)3$^jd|GZP0G>(3b@8v(da96V1lwreR;k>R8X)Vy205ZQr?(G& zC+pyRez~{&ruXozFZ5x7ucDXlPp|pA0xuVefyD^W-03Rs^0#{d#m8*d+F4PgJe01R z8$Ej}E(@y$1phIe{PKfpY?d-RDV)6DvAB9xEPq{gH1K&xH_P2QYf8Uo$N1poD-ka{ z1z0a)Tf)cA2mw`65X+Pv?MSxkdAR^RBs)sezurLC%uf zppa%+C3Gh#u0}wasrt0RH*S9Mk!oed6)~7j4{<%}2uKW8?? z-fqK9^p*hdWrbmQ^@Encv@0mNzvuEta^Hi*fZgDM%=trXfSdnJ2gJ>XW>3a{*y&oC z32^hz*cKFeE0}SaB2HC6+S6GYlVK zhT(ykVN#^unPJQTGmP^`W|+qnW|+uDbRUcRTXdh}dvxFOSJC}*AiD1?+M^9b_t819 zFoEd)>P2+FODG5FDl@FfzgYDK?+?tdzliRyIEX%=daXDa4t>Yq^&84pwGqhTH`hox z;*Q$RmQz*OFPUK*hy#k|7tAnC;3N8i8P*G8hG~GAVRN)sm|<6Lwn*S+14Z|t5tJ@& zw#Dx^8+WV|aI*zoz1eE8|KiN6AGN=C{x66xe{=r7`e^1-*Y83CKAL|D zUIKsWHhBZ7IpLKKy zLLl#4VBmIVUcM)c$tdn#(XbNLP^h`)wm@cIg7}Q!eN)Lj)feVp>c`rCWtW zVr=Nvv|}Y?DJl@C4D88zg?3TVMIJwKe+DNmF>>_z$obRw%JO7invuwy$jQrr7BOgd zrAIkWmv-5@)-oQilRmI&`h-;-7&YT*Ui;j597{L}%M&BslRW}Y7ymhX;w!F8}Z}f z6~V}DC6=@ghlw;wc_Z+S0r#;Wv}rNoh9u0Slvjts4Qo?nozTLvhnA=y*6HUu(C@PM zdy7ozbu7{3-C2agFBW9BKK-VjY&aqh4&&B7Ot!Lz;y}6n0Nrf$0Cz zmFPduqk+1DPU4Uiq6f~G>&714qiw+C#^u%I#J2jy=*B_+_A=)~d1F>G6X|1P(7y3S z^xymJERw~z!WI<$e}?>`M_mISgM|@#SqJV7oXHJAwpNUT+-bb}x{OTfx3 zi3RMwBn-7FTm~8AwT#ilY4+lT^vR}TfDhx&m1H&r@L`GzS^GK*0X~dohdb;o>`##~ zCDLJZwC@`s?$)PavS~2ZOf%ZwdXkE&qkPQ=^biqAc8;7svsL(r^&q?F5Q4U`CDHhu zK4XPf^DQpR+Ho0nPY8Cg0WF*_=Q)odVcUtYLxACpDIr?xKH?{&ly`2Ry<>W8=kzyk zh+oy_ps8J3Cl!dR4VSh-R%0zW%_hlMLv}}6wY5$XMqQiz!~iHMISpX9J=AkTwp3^} zaX{&RpODbH*^^dF@5C?6C7en14}~rDUBYpWf=6H@Ay;S=4G@N1>~xNuo5U34zj|k-UxZxH%;?Wqm`AaWzx?+PLvdvY)nAx(856FmERhNnP)f?(%sxt zX?g%~JVpl^-k_mn1lV9GoKA?SBTypM=inDec3gMyK$XNSWYzOZ1Yq#yigUolx8DSp|whAyTm{DY7?Kk|-`7 zmv;9&1I;9?Ir;M>lSfLcbX~l>V^O+XSq2ux+k?qQ?<(;?Ow*fcYDN@>N4weL0Evzo zQF+vGMtQ9%N0;Nyb@tkIA?)Yc4>&W`Z!ES?BB_Q`S%l8G1SXi}m+``CGsp|_!mh)? zo3kH1dG>}z{U84o z?e|oeK>T>GALkXo8NYu6|Csnd`)wjugEk>R&VMLzUyyZA#$bvnaK6Wcm00xx9|FUGkh{FReFHo#NCxgcY{K2aHSys?g2T{^&_%o za(9}5>Xd$DfpZ5gcO{abT>Asi4SYI74BWuaFzykjyxOjCFR`T0-jg?Oe*7f9`s19C zvdtM6Jp0R5`R#7|%xx8#lKYjmdCaK}ZZOE!t(zQaeVPd~TC0n;MNfbwqr{?{d3uI7 zob4?2NBDS!Y&@ySof*M~|~4hQIVfsFR@KFpW-fNUVxb%Mziv zC#PGp67%v7CX%^Mqfc4O+*{PwkGB*`+ieaU7kE682!A5Tr%ob(2=WH0mjwBT3o0ms z0+9eg9=g5wJm4;vAb%Gi$Ri|Q5agc$1o=_-b`U|{o%E#lT^B%*m#ZeE%%p9nPxb`w z72z|t2z6MkufI3fkVauG5~Ce14ox!Bcpyw84G0~d5ggJE=0`!xKPTwvh)H^yRM#13 z`-aeIvBghto8HX|A1N({ZJ^EXj!+IRs#%FePqbZ-**Sz+cBR5ieD=x$T{=TW# za)FSY?vj!Lx~47v5p?^K7a^ox?(HW>RZ~Wkz4P_+)z5A2e3Y$i9n8C#w~iAacp=2n z|1QL`z!(VXvyKY18t+h9v5x^h>oCx@d5kcrS=+gG@-eY^K0IW9B`GAq&9nAEm@#g+ z0CwMDgnyJyPTl)xL0wg`oqj~Ex|0OmoIEq@%qml0*V+JElj@m`VY=NJzL#llKIsWu ziuP;Or6lFgV`Qsr2#-j7w(6qA?miR?GZb|3)v8hVMVs*SP2IoxxciF_d*G+}^JMw= zKD>WE^9suGFV6h0e%Sxb`Ty#}zWoL|1uKvwL_z#vpacA=-~6!e*XoZOpf5o0l8^WLKzS%<6KD(#$sKX4AaQq&r{gt` z>8sfeW898JS*kdWIcHo2WD1;}sEP!a3Hh-`EcMFV z32u(yM4MOT7}N;(GxC8F6jD@yTiSECVtK=u1U1obKaq_HBN;4);^OXC@zM!fBYR#} zyPxg0zmYgi4yPzf!#hGW$~N}F3F2Y!i%HbZy08-}cI!G`T&(b^vabxdU7tpqSU0s` zN8!&7&hj9~i=z~D`2?(+?|=C`w)-qCt(524)BMn_F=CsMm&qGxgm*2H_GV9=*q$ct zj98w3gcs4M#E+kjt~jH8^!e3pHCbD9fAp!xt-S)Cb5fhe46nR+PiddAQL)_??CH92 z1DaP%8SfqHBG2QX%@9cB&z^)wzkZA}cOX5>bKNy1gIn#aOLayc(NrI!py9LX*K@M4 zL1KId4a2U&5M(buqEC66N?Yb^ik7hYZ3nAyecmq!MxJ!Kc9=nMUO#rHCA`CG-;Nrjx?FL0Rb z|0HgydX=J_GfV)fNnaEUGoxX3Y8M0DMAOpkjx>{(k%r!jAg7CQgcv<>)cAGg*x7&k zfM$oVtQA&jtn$|CrHs=2jaTYSnonivsbNE%jtVXj+6)~8%^Mimf`riEsez!_ciXzx zEw5pSJ?M~yXpb%pBrkVOseCaNX514Wp**SZ=9U~je@*l4vNz+ntKEt2A2v36BR}R| z4ArpXi)Up3w{kWQ)j(&td*$Tw*pFJKAC_-hO=*dM(w1{GP%)1=7{~{oTie~R9rsEQ z=P$z=Ys}Z}0u9yVN?t68T7YDf$2f%oadJg-n^U^Td3wYh;smUxH-+l?Eow*WH^DMW zXSb2nKBdTU8I}!{)bz?_@y;*}>>ZJw#@+Rpbq2v5?c%5pR&mG|rS~!DwSdJM^jaYP zIi_L>ByX_?%UhaH?#u9eleeG&rS~C$Iv{TexRkfBrAb`MTfUdx$OT!HK|tO@1d_L$ z2Y}=)(*H@`;!X;dw^)?-R9%+d(;dW$m>r<>5`QbbP?x1Q=(6-u0j1X+RCQEOfL+iwFf@v4R?Jw4v# zcJQ@Zg1k5S-q1LuksLdQmB;i3Vy8Ku2pZlT4**fl`2nJQeGg2-w6#xSL$!K;0a2Fu z38H*o6o4q38uh(q+>6vAw7ZEfh}*=i#k|dIjer6TVEBX4-(S!$W4_ZcxreP-fX9L> zG|b_s3mPU{sejic4U-(8Vb)8DAn80!4F}UOvk0i|FKL*3U>YX$1q~C;mG(OgbGX(h z@;r#0K+?bMeZ12MFAn;-MbsW%u=L{=_jlc7f*s|ZH`41x7^jm(;5VCID4zWMSU^Ej zN%$6cC{P6Yn=6k6zz_2`Ym0r9m@VLwfAH}Po17N5aa|4RR>e{YEpE_8eYWie+&iM=iMaN`)Ek zK&SgjzK5>nbg#LNyp+NFoW{TUN ziOSFG=8MnLU5R!=T-pt!+?vt8Tv^=t`7`3m?1$}=1^io=pPEdF&tG&Nz#0Ft^VlFK zA;T2sFozpbBI~Ix$5k=46^bFsR5t8+6%=qM-+tv`Tf*VAuSfN5iB&J+&(+%V0Tdr@ zMf5djLchAQNwiR$|c@HDIo)10*C%z<+s=xoY4?bCqsc?bhGFlrsMD zQd)4p^PgWzGYUX2rGydgr?z~+=m&T!RpQZ`o0_cQVA&u_&8P-ne_T5v>%jFFu+A^& zq{9^b;VxFVRK{iJ@x%cK=sZkVY3_*uokzgSJA{beIuEY9A&1o3#?@ZXpB2-yrh-^i z2`M`m?oLf0z6%{7>#=(TsN_=z-n6cpzr6bdtILV*WQ|nXId~1)Sj$oA9%K%pgxtN2 zCnl1wN8h4b#5buvDh#s~Fvl;0Py`YU=0KuBU5E5r=Wz^l9>0D4wE)*&0J!r2uD_2i zpw45HUh|^!0AGJYdvF!f&GWL{;uqK7k1$}sLIPn3vXHz7zbFV*B*HAZuz{|>@ox-y zxT9DX@t!J@*x=XdWks~Sh74eLRiyR`5MQ{zzqH$}?m1EMDy@*LaLjf4G>G)ua z%X;=LLtq45;A-mls|tW)g6d~1nyfSo(XI|s$AjEepJqc8Dn`CR4xV1u3b3O(?2}oM`ly+$LxF7MA^A2z z5B=3m^f?A5(-uT`!Y^nn3_DX?5mRKg52rkQo(v@9-OOsR z`^TQd^;jP>!jm@rh8J}694%*Ok`8B2&T;2uzQ_r`C_{s0+j`2|4(}Ja1B-Vamqt#& z=8&4@T}g0b`fY8qnVn*>`#Tu9b~Cckp%LB0**?ESWb`I2TP!U`%sj&Gh4Uq41 zZ;W7;l<8v=@4MxnlI8YM1t&>jEY>p!`@b5rAGOvVP5TY`$Y=Z|AV;EaD+%w_o_;Jbqc0i{?CNGY}nJ2G+WF%|q!UYVJx_%1n&UcE_q z&e`FdLCN@F^DNB$CD^*mZZEA5P1am~^=qntQVgxKvC3F)qFqqsVu{Llos5a$|)_aBw-)7GPtluh^yc-qvNLm*}b)|8Q{J;1YSy z8VvUT?9ebGRg>9gs@n4n><@7p}d* zpLks3!m@!ylu-pP=F~gUn=_wXdtC8Jc$u`ieX^5&z5vJlc-n@X9gnN2%gtnYiTr--sSpgq`T@%1JD`{sYbfR63^uBM(0F!H%%!;K^E4DjF&bs! za{L~Gig|aQo2Ewcqe36g6N1-oGgPi>C=F4aNxpABS>mPdgj+5EX#e+fkd14;vF9TH z`R9GLnEwYO%rAcKf4d(5{M>*3K=|(#^IxC;uZsC>r*Wz<(B`fE2qgplQGTAdOp678B@y$^boyeb&A1_iD$3lo{FzeGaPQHEJD{!x+ zjPX;x59b}~ z>a&|YdvuM;-AT*WyC$;jV_(sDptGi;f4vtUZK@YZ+>Gw{5MwOWhj57{aQ``;!SU~@ z$v7{K$iJ`&{qdsp#G?274p531f7~em&iMUOG~+x4Y9C>8W&H(&O&(=Y?kNJxE zA6b`?^Ts#pLdYZ01On5 z-1th8iS7-FgIwQ?q#8VTeckX^$8`dW)7|*YS47aCrP8xr1vyRPQFig)rO~3WLAyKt%9D*tpdf(tvK@;$Y6I| zSpIikjfGlIj8H3~yeI-<=mWo!G0J6V?rq^|m0053C}PL(GeEUq-+CyEprx7A1#A_- z09ysyh*b>B#5pC6!4Qx7`b^sRT}H17j zA(CKm?gpGWwi@CygHh-yYm4`%l2i_akcLF5yB@;%s210<-oS>udt!zPVrV93UwV^2 z)O4arcip0Xubm-Onp1&eG7~ST8m|!r=gdZ@0H=w&#AC0 z1q=8A|6E-DT@K{RyVqZw`KN;Qi%aLCApT;Z?QhQiR|N|#H^T50P_THe{m^{^f9f|2 z){J(WQoAU6^ARJBcL2-;jww{GfrC?Y>I8-86mzh#-m2f=wwO(>MI?QVX z@_a3=ypc<{?rAN(h0yD_fcC(qVw+Kb5n_1dFK}njzP0%}Ma_;xqTB|eNyzob>U~ek zHjb~wyiI#7+TEQv>y-5-+iWSy7x`&+Nz2d-{fPtFm@}(MAqQpeChqOqK}%I$Qrdah zE=}HMGb{uy-k(p&?d0D+)>q~ur}am3u|_<}7iV^1QWcM=&ZhCV^H*cPrBC_5B<)Pa z;xK(%j!VaGawME3#gyx_LdC*|vZ=1&#@zXgB1XLs`}MU0zAZZ9_D{ke))ILlZhK;J zPQKK*vm3_riPC%U-9zSeb@CN-Pn%WtS2>KM1LYOW`f@x^zJBefpP~r8{@F*@Ch@g% z&a<16@DjSEOv2)e?-c{g17P);$yg22WjIi`@w^u}3Ak5EY1v){ze{ndua6)}q?o@` zBl|F&eFqClS_RgYd;0Agw2q1`b9ySLSIE4R3CHC4j0cD<^TMVhxkVf z>7OK5fM%;(@v?=xGS&De!4-S;MOO5#xw$-}liPiP{Ge4lmy1?UPj zIfdwFXiinT*b*t5j$a#7ws59uZGi=EXkZbf%O-Uk6kGw+Z2V(;%L|)R4O{nZm+mPU zI9aR(3$uFCh{{(>j*Pg|q<(hqLgI6YLSP`0zK0&^N{r%1J)Jr;sss~WRxH#z%Ri>p z+xmQK)W)sFCXLc?A|fS)P@o}&$t}7cR5qKua36%~Ma`lMV75IuIC((qTWdo|>mfc| z)c{IS&K$ylQj~}-k&5;%x{YJcv4%YJ%BQ6Jd#8>*rsGzhM*^5UBWjOj8So;AL$iGz zGm)bkf(x(+!kE@$o-otbSM#zdDdLT1%6FoI;U$sh}lGI$k)0z8n#v|SR$0;N|}eS9-*leVT4^&gCG90KoA zh_=e%VMV`h} zb23+XX!)%kP*+PIsxPdJS@4r-os)EA;~WD6@2mjR)F z=(Dx1{T~Lh-a%al+%Pq=%^Z%_@om9zZMJQ;rjv`aQ77P4kODNZ^wNiB1-lHTp;<=@ zF-&d&MnV7`a)q;7jI+o%{}Z>|TWr>Ap+$t{VHkLeNOwmNAEvm;;ZtU%lYj8u7tg@% zwbq2<$E()jlOGznCVWpGY-j6Dn7{1M=du)RBTq??y2^eBK@@Uytu0FjxS()G`;moR%R zt~E5*+a0})N}cd8dY`F~>^i7lFbez17|*@E@)|CO9V(oU;1IO{M}v50!u@%6DIvK{ z(H#}N`j+to40BU^4##NkiELh3>U%5wrtpe0Is4b|xW;@K(WtwPSY?4}=+uAg^u~S9 zs^OEfe17uh0SIZPt>=$!zSXQKdV`r-^dw7jowU`VDO0ukvHbDA#PM{0Y}>@g^Ps9i zPs7yY(7D{%*8<^4(habprN^QQMP?@vGGV^^bh|I^#xcwm`BmD}WB4{SZ`L(;ZJoW` zdikEzPT1g8opZb}LAA@B68&gm2;Onap!{7ZBH3krzk+#4l`g24#*j?V!P$v45mq;! zqQ2#QYR_mt>-H2j;x2A@pUxBUnwGNYiScMV{p;hmY-EruaU%t{T* zljmqbQCj@D@dM8I{l@R=DkC)CO~9MLcj-+i1vmhhx|ecMJWQmTr#116aC%dYUuWX0 z0>=6&jH=N3)(vkc0ce;m_WL zKR5v1)5-J~90282%RB&Gy#%1E4Vo2$Pr7Mcy_gtCnj^$JQNhdPpbAzGER)-SH~_=0 z{GbY!HU{DVsDL;C_8<;`JLk}8ChMGJzg)`E$5d^hb1evb6OcE79pp_Y7%r%N=Y!dG z>5-ELd*nQCJ0?_~VXnCX9=VsJ<_%kMAvDNctIYS&5wl#ezbHdF;-@*QhY4Kk!$(?i zC3tCaM}|s}LK~!!!+liweC8REd$AhxQA)<6BAtfLsA_C|611{0!a_c(#9q$<@mu(Sgq$^O|%1 z*qDm3ha**p-}iCqH~QccgC2ZRa4~YpFO;v^$YTH-d12LsjXV#qk+%e}_&uMy4%o;g zpvXvJ9$ebU>3?M-Hw0|t6~eu$Swc#vdxBt1^TR>d`DD`;abq{7+fR#VV0m<``zO+f zPB}p~@?d(0oL)!5?#32XotYWxUG-*>X6?#xK}Js)Mv*mjv0!pA+GV12%HVk>Y?$8#&RXjT~i#NQIOC)KE)7Bm=OK+e831^3v2w2|m~? zN0snsb5mH9jA+0{UK(FP_AxZy7MyIe3>Rc0ugK@ZF*saqXT&DnP`qj*zkSE{e#ciE zc_8-nPj^`MQ~?|L86xXOM*7e%VkB2yd%#!w)3fbAzQ%ssO|HE5ezNA@4!8ff{*Q+n z!?z>nKdk?+PPe@0Y|bENg5&q{B=Dnt^LQ)y#!QeE#6ZFln37ALWn(Zww-!-Ls6jJf zBqM+ZKMNl>d?C(hJ+VwhSCf(U>CtmHv&j_X5ocAtbS=oy(tW(eb%^wgtun*%$Qzl; z6Z8@ePrYGm+`3)H9n_p+j^y^-c`|m$a`wyJ!D<+6%wCIvn{D)~Mv|AR(x^wHUn6t_VhCMj8Bd!QF zcS6i9##@BL=tHdikD|+zY*()jk8LKLY{1gOK3ybPP8Idne;5T$An$)7F?k0^u=GC9 zAoH1_iYgoYqpC5sL0#SUS4h#P8MrLio9WwOw|*rwTsd@@S^uC(P2&Fh`k&-tfi-^r z(3!VO<^!Hh$Es{i6!}LZ0rE@?Cb>h#Q;*19cywNyy@{{q%=}okeKY7OLMKE5g=pRM zu&2{uyfEi@QJd9wL~HK8cR=3X)@ygLVasFfjk$=HHJ5!BSRxl1QI0wZt|=#mjBTTt za4NeP6c#cmIGkt$azNWli=i!3iU2ZI6&`~!Ei+<+)rpU`^;}x%X(SobB}GLvoGmG| zz_V%f%RQxv%V$$08^*J#!FTm(?zOn*&!!qz6MTiE<{_9!_f$D}pKxhC(6gx;cs6B~ z&s;v6jH*uqfM=6&j?)r{k`rZ&O4;O7l=Ej36Yy-hcCbX!Z+X1CQELi3o6_hQJzCg? zcQ_U^huU`7C256H#gxI%Vw&(WhLTDPd8S0%5pQpe6 zjG{-P!>H<04PsVKUP^*I4t!fNOqx_B3A(R5*5^cQtSGQh(}{GxECEN#=cczJB+lPV zz}TyG_|Y)}@MZ$WUZ6MA`PfT@4i^}EMUzgVK01W!6ns~P1XRl$n8Irw?!7MdnN)+`Op?Hx={4|X+PW~Y-1Kv4FugFb1kVN1 zfJ`i}*^&_wM(JTkN&}ztP2Un$ZDYGtYS~6Ep&cao#)g8@atsg>gIoiOEk`0CR47-9 zufGVC=PVKtPnilt$p|)8ka-ecNcJ&^@)|hSW;f()l-~K%yDez_f*AJGTtodI(SpLKM|LR~_ zot25*11yf@-ybZ%kNVw%MZR4Ik{Gr57|ZXW$!OhTS7H^y{=44vSC#E?o6)gPz%j#i z=F{S58^~YBB)~E?xjgH~=x43fDI*u!kl$_KSQ*e>%(zoZ=2h3qp0bz2fhLm|j)s-B zq$M#;gXZhz9MaJ4Pwistt3OBMcC7W2Qdn9vcB-1fh+nEz5)%oR=Pw>ty=ztI(Q zWmCJ#SVZMp0r>oD=kbqMYgZ+)7n$ci?iZb$qa8hVmQAN$AO<=G-+he zCJl9D9RO7^n_;%4*r?!#J^H0I3Zt9RHS!XOfGeAcn@VMwGt_G7c_2{xncBXzucBfI@p5^9dbW{n_YC@ zhrXzlsKvX_FX|SLgERxlJ5wvTN{Km2k=LE|X%(SH-nl11=e};H3H`n>v=y86_-Onw>fTozi2}ykUU45I*Pc=ZGlnT^=HCC7L9)mi7MG}`m_NI#Ld7yOE z+pq={CC@M~pijq=sSmfSbBSIfKCmO>6Vwq<|NQvbua{~ zz6-iq@?C!U0CWoZgi_nzmZREx?m#^cm+X$|Hjg`Xp*Sejk~?vkYGJiEx=gi{^p9H5 zi+Ty*AZ4~`??|u}-n<4kkGsSb@MNTh=07V zTp1$#gV6GePyOdUuq#7^zc2Z>>+pYE{zskV$`Ik#%m1s}FrLwTZ#i%q1_z{;D;xfA zt1QY9PeJ8iLQX9teKLxEk(3exT~HYGS#l61uh=LVpiT*D5o4EoqqpC4HhUh)aA`?d z@R1q`Q~5vR&{S{2ap5x0m8=hV^f4Z{T|r9ZuFzqe0{aTda0sfEsfw~>wO+6HtctJ9 zkVbZm%wrG4q$C0(!)w`Cif(?<6i{7GSVEbr`Id7c_bn1qp`P`BD7zW1*2x#ownw>{ zZvOr(1iBWCBd!Ck=A_D;@VSBq#iuJb*&p??D?$j{pRgl+gky0)RW1y8-<4AWYy5!_ zaxp(Xq2cft-xVCLgk;NHxykfq7H-|n_(snJIWRx2Ydu95h|0<#k#^S=i#b_poV2`a zvf+v*I)q0bPG!<~P?@{|25%hHTeZm(wk6xzIGz?0b3IMU8q8DdAu|k#3_Be0v9)M8 z#msobv}IqAEL!&r1trW@NLwC!q~bUie;Wa zmrF^yp%$bBxw9*!#NnKXyaX!|3!khZwAm}umGskXjtz0kqujTSGN}U?Ns#(6qw0$L z!&KK%X<*qm3|U%hXzEY#0*<;I`qbY}oON^eGq57Q2qL%qD0Ca+2nyq^qv;(wtG9OX z$Mk6NQmt>~27=95*XL7S51v7ArC|-7EG)QZ9A!FIQ)Z}(&qgxd(zkYZ6t^PbBBK^_ zG8{6B?X4e=aFV)VQ^%PLJi=1=*RKh$-7Bz&w|$iL2`A z5_z`01JR)sply3HBSRR$Usk~M*e_WC8SO10hBBR=khZfen1TamdVw*G(?{n7kw%%D zin!n;mPWoL$Rd>7J|y@POWC*N(%*i>YK|!`Qup`hI*!hl>kMR$CvOdB^%bUFR(r@z z8Zg44;aelNTnHse z^VpNodwd#4SMX`5V}H3rj?$BsjU63tlDbEkw1Vw4L9_dYeFog6B-(t>w2*Sa*5wpc zWX8;}5c+t8-;zF#j5angIrUn)OX6KnlIt9}gIu`>7d7KQr`??Hlz2_ZmpjVN=8L-% z8}D^+Yo1Q8&8WFyb~i~pNXfLk1F@ioUs}r4=0h_-vvt+0zCc)W$}Gf6E*mSZE6-P8 zf{$j%Uw9Id82*eW(qxN3SCAP&DQ__$dbIXY+k??9?-$q@)#gr-??;W~(u-F zu;28uB3^%HKL8mJ!<`tw9**cSeG3cg85A_N%``#?Pa33#LFn!+E50GHUT$L>$t-4| zY&*G2o6xnq!$DW1FZxYjN&>htPLWc~qZe-3O0fcn^eV!OKAf%ano0N=NA7i@-ORY! zzKhH?sqdL3ZaqyWi3KzBKMW!lokdHSIjU`%xsfKVxMiohLI`q?e7muo zj5|lu0z2Qw@3jEn+x<-~AWlKrs)Go-<(LMJB1~Q-fvf>+&M`U9!ssDZTop8AouiuL zybG^QtG-prgzu)ojoqfDBZMY`1N;bXALc8O~ zOZ>*P`$O;X9?%D<0>X0^yth#fB#^Q`gT}xZ%d84ePN4b1BZ`Q@s(Ht2ah-0G_!AeF2p-5ln z&k*CK%z)YbBq(TeSU*dKrH)6(Wo}p=LwA3|wf6<&d+J&Zf9%4Vj79T!sUF?J7RojI zgQ+O(?Kb@EFDUpsRL}jcfR+$0&D#K=KEcce6x@RqVQ!Y9=g5a zlg&za*n1A{QJa_(=RtBJsQ69~fmw!EBbhF>(O!4!W)7EoBS$g{ccWZLGDD#v5S zIh++(X*DFhB6%%Oas44HKQDrJ5fi+`8gWH#p4}Q**|f~9x8ubyvTa(#wp~4rF<~5%T#X;H-$m;z z-Rx4Mq6TL@R&wsBIH+~DY7A(d4W)*YGB@4m?y9cIikjo}e@<>HGuGs_(zLo$3(*57 zNa2yC^2GC5G4HHo$LCl%2l<{E{kfp4h%>xZS38ss0R9|*z zxzw~mn{ClXPnE-WWu2b#CD2b+mqD>CkL2lzq2I$J>ZZ09ykPdi1I*rZfY}>-&g_+S zjM{{;4ejx^&SN5z5-<^vMHBJR2n{+W$9-8EjS{TPVq=nbdjm_`I70sMpa-%URDUz~ z0K%$2oJ1EQ55EdJPto&QoqKndJ!g+UA{L@mRQ@o3z=hyBm(9o0S>(CSE&Vsn?&bl0W zP69*EnJx?vDE=9T(;;Z+35m5^otVKHx-ChVjsKF@k&^I67{Ki9t=fulbFh)V?0`;Iyz(&g)kO%QrVEM( zV$fd{kNSKlduG!c%am)mj{6^|3don2OsO4-JT$@u8edD;259rtJ@`w=6sjvL($qz(`R zwz>S{?sxg*faZGVDD)3tCMh+OFZCsmX8oLzNoP8(Oj>{K9kvp-;S&5jpk|Lf+BOJ-@wNa!f0dgvXNV z2}cHf=a#ZD|66B59UNZ=ILq9~h!~2+J-HZ!c5t4?OsPN}7UNM_=LED;hCx3dL|`l&`Z`_s`svKVEZ#)h#A^+P2(_ zw)L_0Y_{28WaxnU1D+MAzN1<_@3OwbW!yD+CPPzwyqWH1>R|q5f}P?#!7liZ33jdX z1bbiJ`)ad0*`NeFZ9-murQ(uZql1HkLATRr4s8Wa8excp%62BI&9#?!=tjEt8YjP) zQp}fhb@isbs4BUS8>j?y;)35Iq)-xgtT#HL`Lz@GcCCEn?qw(LTRw77eMdd=xzJ(e z_`cYGu>@I%9Mp-MuDLX6;bnIJyuQOdYGco3k8$3925Iszr=1D3Xc(n##sC?FYIO;(i&#;Kv$2taogH^xYYY9;d$aVh_IOvr=GX+f_P93 z4-7kR0KtOD&b(48kxtEuMC^cMx7w1yag^>I!|7b1&PzUwv)+w!ryS z+c!6;?OQGwX#0-qMC_a(b*~!W?{R8l%jJ&R!vaWjmR^NLWre@0 zvrO@&{rgRv!T#^e{#-s78F22cczdi`eHUQ=@j-jVR04e6|NYtD-`D(`*zy0yRPvL* z^VRkLmD&N`{Y8HfP&*2N6X?q61N^ApJbnBl8Dt1X*1Cs)?I>z za#*ycdHbyZtfb&GN<&hZ%sf0QNh+=Sb=@h6>U#sr$x++)<`G^@LWe9JBXVTl^BjFR z9<3NSp)V2s`R(fhGV87JoJ=(Hlovv}H3?f~*iQOGrHTzj@(7_vuxl@12F+&t3Z+uI7Whq;j0t4Th z@Fh{0Pmm(AKo9#&)CTt(DFEDfey#;2DJ*2|5eM6OUkrKzZYiFgEb4&47 zxRxuOyAU`keaXhK;l%M@V*EXv5c8;zr<#^ymSkYs5s%Tdt z1F@c^Po`p4q<}yo?&JsvBvkYG+ljObANU?o+DjR>$PaoFVo=&132zqq>QF<4!3Ie) zP|Z2|n>R_;GnanZr99((1MSy{*slNOTp#Ivg(D{*O&l2XVfc}0JOc?m7du!%?#*GP zsyI%!Cdn+Vyl|>8Ftl1Gel%Fp*mOQLWOG{ubjo4t<6s`KG3An%Jc}NZDwGR)xRNpR z-FWRJs=LMQ_fel2YQRT&S|$uV(Sj}gv{YnPWbC>$X&EpfcROqLuK6sL^6Iv$JN9EZ%dGr-^232w|{Pl${4|*%2$L%_U(zaw{g>=nF(%TV`W%@=Ao=Y);qIiBDvd zY6bRYld*1GcQ7UAXM|Peu}2$qnSf;+Yz~}24TE?+x?|Q0=p&tgKH>xDBUm+VVjtI- zC}kZ3IVAh;gY*&3@AMHVKp%+%=_7^K(-Pqz=d-%?`!$}W17Dj}FkEK;1KI5@lvzziHFUc^02=oLPy}=drc^<=mY7?Xo^}R{j{|!PEX;9sxew z-`pnX#{LwXbcDP}?ZH*IdFSr3_ z$(s~UKU>~$UqcOZf=*dML9C)V8LDg0CfuewyjByfMy~FUBv%pwZH9_6oa&^N;1p4h z!jeIkaIGabdau&cpqyz(`*ne~#zsGP3{FtK#`25UD5#*jpGsjfooCV?z32&hvmgF4 zH2RG~Vlq6pQtZ7Oh|lDif&f?Epvenc5sy;^&Kj*9<_>K^}Xp0>4Tk{!9 z#~J)h?cPFD3G?O0vx&sj(qil@^2A!6wtK8fPk2eVMjk|_$U*`hylYS;EHZ+(5OOUe zbMxR&e2$hn^aTZ%t_&r9JgKkT!`Uu7Y=3cbe*66-vfN}h1vXatAEf6$>9D=JvF-{s z{~$dlewCgj0O|Shh4lR1$tlHrdhCFNWC+jN2gl+PYYz)_pw5=;c<^nwdj-&3DagI!zqsIGq(Bz`Yw} z>dL!+0`%xeV^8!}tZ?d+v4|C1 zx`I{~XL<FvJ#4oWD=+0BhmowjP2ov6W|0bUaH4xPc@(hAzf@z#!Z>xtQ|BVrrmMhXf&*U3yb2!+F!4d+`o$uKgVqE6)= zG04vVt)vdKR2H0Bh z-yApwe3GN>wZyC0ilyFn;$}cZ^}!Qpz=tj)a;jxjB;J760*Ac5Wl9hIVwl-rQ@>f| z$&>d?m^=^&IAoHNr)TorK~SX;$qN`=oI^vTs169t?Hn0S_r!!Aa>v>2xOkl_&u|Rq z%5#R@$C|q^3V`x#oDXoU%4x#@;klz;10*~bH)6$aj}`ls=PNS7E3o8mJPC1D5A=9E zI%5`uG(suId$To`%Oi#I3(F=lWeELilg5Y689Wbnm7Ee)#3whPA-Nm^+jSE|h1+bJ zU`Oe@<#Vi3vWs-Fv-qrLYWgyV-?gc7iX4%HcGd!5XYCh5A5l<~)+>LAX0AeEkn*Pe zS-*E-sB&Si&>A-*xg;?Rc2Vw5Ps}`2sZ{u*6F_(F3Pq%UE|0D@_g*31^pK=8Azn?^ z#@r+11w=8+9O-qhzjoHgpq+K|Z#%2ivI9>(a1q@F{#?0;0$=}c?yS<`gUG)0sD9gA z!j(=1or&Hi{TF;rULTRE=o)now;QBU{qJRVH;2l1b3}LFr>c%w_q@ClImBF}oV#M( zjL*s*OCp{auS3*>JFEkz!y$*OC$&ghU7DvRzf>i#MDrS6tmq4KA8Vj%)!(`x-Uk>`{M>P94zI~gKLb^tckwHw& z^IMWH!=H4AiayaG{OYo}3WNKjd7E7(D6hF)X6xiKn#v$n zg%o;WGca&N-GEm>5zD|Qo&=1?to@m3DGqN~=e(~47n@bfq^Lk9h7cHplpZiQ^VU~b zy3TX3Whh>Dhss{<4pskqcWC2zcWAZjq}jN-1gJYyy+lUUC=URQZ2)PPi|$an2Da-! zcc?J&!u7A+p)QucBR&+@d=np*`Et*@LkZ5iL&x7ws9o#UxY@1=bcYIX*AG-qH#FrN ze})Ar4#rpZ`itC0*>5<&gb%CP5-$i9B7DkNn*D6wZjZHfL=)fRz})AbDGN128dLv7 zOuAMQRJVhT(en8AylwB7Sz!U3F-zY3?L&K{xfYLJ<$EP_V4g86`3%HT%w0X@$mw?- z!B{hy#2E2N&7Oeg?U7o$s#sfZs4mtFUhFokkI|pVz zH8MiXEYpQ48MQ7NzEOfqzNBN^G0d?fM?I*0DK;`D!WKS2?ag{#YjBC<5d$-1S=CR* zib4%7e9_&R4|EzRJ^KjYcq#;`R7hQv&_Ot!Pu3g99x^kkk;mLQ$mcj75fnu1aVFOh zzA@8y{9X~UCQ%{+#dD$qGq|D+$pfNS>w)$cu05mp;Up7U>D+ok2-}flGP3(51HC*k^ z>$$KUi+r;k!?e*qmdY~$`@8huiarRmc3+hqZe7}r{b>HO9X|qW$J;Ny+K%%sZO3`P zwjD2V{|Fju#arU?e=?F)c9WG6PL|>JPRL4oM%?B=2IR*ltzSW7Klemj(H?-0`={E& ze>6h;Xx+FHX!*&SSG9rPs|EkjXmKUb@*md!SK31#e?(Xdu-%h>uRQ=i>NmH1hlpkb zpjy?>Ekjp)`?(-g+^y@raYk9b7Ho@JZMULtix9T;)$WUHdbOFE8-|=1CZbh_aCS^~ z>OV{n_qJ||+&UYlzfj;0NlItAi!%18CQmxK?MOOIn_j={_%W!%7{l)){Z@1r} zM0%{B9Rz=J`~5EVC=Mbxpe9o>MLI%=gJO?iB?n@*-aH;;co@Mb-(ruiU6Il@!nRrN z`w;2$W&Th!~D z%mjc=g88CtCws^}z;0JmuHFm|*zI)m1QLxyqd<1M+pxe%5X6K>3_1xyFfL94VbDq7 z+6|lpuE0s4fhv1`5<~ze0rAC2UNhakPJL>IXy`WH4Zp+}yoQuk58bv>0v2AeUZCNsMGeGeg zHqfF96tCU*Tr4*veCM%KmZN-FG;_5RArIE;Td4wflqKJT%U_3}o{E5Jz{nU=mKSC$ z1dx+I1G5o4Z2Jp28T;uu(;*;2AN)Ol^5e&S^&t2^z;6IHj2{n||L#HX>-GQDL9jk~ zP&o`71V40a1OJrYJP3e}?GPZi@4tN-92w(#S3{ql?534l#r;=%=w?;mDY5#dn3HEM zdeaWv&Mryt^KKtRXvs-sR!PK?14=rziMA56+};8qZn>7cY#keX0}%=j8rQgHg8@-iV*Ch zxoLL%YpX2Rm+vf!Iv^)Mi$opAP2pKUVqSl2WOz(zc9S}Lm#&&M|4SC!akgFC=VQyR zgW>Wg-d?Hb_o;)sJ>J~-ttSHGpOkXGB8YwVlldgD#_tQx(sn=-S^!XE9=iSL$ao3} z#1k_s8WL?nMW_CCGMs*vxJ!4lG%uf41VRoKQhPP@|r^UcNF;Q>6h5QI8LW2$BrOk(W(4AY;Sgf_7jzR)fLwPi(EnYqdFQB?TVRCH+cp{wR1y*e13~EPCcdJv^&e1*@ zW$Iz(qd34DVQ5&*op|Z;jo=J)a$*r20aR=U=HT-;0&z^z6QIxK8t_IKA;bVGIj3#g zU)CY{GZxRbsLpS%!o2JLR2xgV%tn|A23VEZ|!VEd*hP_PXS6m0Wzofm9# z0R`KBR|>XGId#qpwoyFJ3$`b+r!I}yT!0bV=2Pf(z=&P7Z@&i^v0(rsb_`&|mI92} zgn$uS7i7f702#5#9)vCF@DIpIX)d&ftsJm}jM#^<)K!T7GQHR<=X`;`3bq-&z!*i} zS$vmGY_(bh=K}Es5*oold;tSGu5 z=Hva$z`d&k*gtIYs4wS}HqBw)cNEJ2C$>R3n!$(Ey{UUObxzsf^!rq!Cb)do5`g{V zl{1#A5P&BUkLTboPx51WYm1x8_pQ$b{<6>IEiTaKvJ2{S(F6KiQZ#@*mt|0&iz};X ziEV6lLGv-l{_*zQ{(%z22(o`Lzeqc(q7CVbk*}eXtvN+(W-xe#;_+~h=3Tzc0EN35 zz!&(d&*k~!HoA0*bF>fgMBeG$wG-%n{<^Om4ZxTA<2L?#claNVn=5aGpRD;`JsSSQ z`v2-^7)~2`HwhdK(cixjfFJdnM}vplMJMMTLO(1mmKupt0d#k>jj3#`oq?|j37Of_ z>?@+q`AIn%AvhbHh-xOzB8HUO7DWoe0;GFu6?J2MdNqW7o!!?*Pb-ih=apC+8iaJuCVw9bT>3u_=eqoSHm@Iq!N*Q2sf8Ha3S zyZ$&{A?qe`c9-I-$c$&Oclu-@dGD*SZoqd%Z~o>X@h2FD?K1S>pB)l^f?=?@(2?fz ztexi<1h=1rP8DoA4B>3fDowY9mz$PG8br$-@SKnljbUUHM7G%a>3bb*TgD^VmyP+% zJ44e_R;0h?uu@0Trge?I<9Y=Eca+-j#(7l){Ji&zMTq&8J$dSq<8UzBMei5HdGD7` z&S>h%hzz1+X|YG&eOI9O>%~Ry*Lo_@`&H84F9`(LkqlLwpw z;Et?VYC>l0q^H;OJTIG@?SSUyDb}z}gXXGqfLIT37>3ML<^b;?SHaHscN~U`=H`ai zXahOmmBX)M`neiQLWWjA0d}q1cH{0l%VsTWsUaK?dEK|`QEf<+VZO+IDD`O2=D3D3 z1}I6@tbO&md{8sQG4-WCDoL;E9{DjACwP>d&W~JR7%Zzl*M3Oh5)Ok0ikn5wixK(Pw=?aq~wI0FHMb0KkDLG^rp8O~6+QO*8QTwF{`YdBw4hF&zYe z11L1z003?%_L4#a!Z4s8;z)xiH0x^%000g|p@9Vea3BiJ8~}hjr_gX-q0oQ;aDir* z6q@350Nl-J1`vi}Ya|30pwQ?`e#0bSv!%{Pa zZNF5Kpg<;;mq38ss0~n(XxqpYv_VP|86_dELM@3B|PE9XmpVfOx&kFKgjqi-4a3jmYLhG0Z#Fv(53MqZBkcQ=`d~ZN(3-c_CwqEIP3Z zuymdFBk2+ea;@tPrAy%>1Vaz|DIj{<;Gj&;6NDeFmIds5_`UQF^PhBQp{=#$gH8db z@B90KHGco8@I8q6YWpL5)n)r5klu-oCxOkewOGUe+8>QtFWMiA+RDCbe*|hwZf>~j zT02_II<{8Z+|8n8BWREZlS+q=RJeo2Qk@1*Q9t{XWC;J3FG64xm>;PYtf2PVT_dMz zjAzj_G#M4O;nk6h_U3N&n(1^JD?KZYi|^ibT}%_0ICw!MvTxG_!)8w%V45%mvNAH4 zSc0sKwatK)(FkN^RGbD`8G+2^92LmQSOKy!3YWAlerIJYsofL=k;povfN6pRcYRNV z+hhZk(Gl#6Ba+eOkfM$AmjZ;0?8P(z;#0=V?2-MDJsL1gxZV@j9j5za6%8DvN8gZA zVRXZ^7(JW`&B7K5rR!jK$5VirrYQANOx>%(arL|X52@iwZlvMv7v@9N{ zFWyV4TS;M2aWA|_C*j$ei?L;67O;_pP)<(7WY9c_2G)my=pHlc5IvIBQVb2M=fLeK z2F&B~EH)N-w->P}$*`ghc{HPQ zWKfH{MwEcirYP#5DRyBK5ZZ(e1wxxJ=9y3dbx;IOzF&ZPtgav+w7E_Igf{DK)#JQ* z!qkiK0TfxrdG#ZEz503e;{Y^J{dkTd>(AUhuYPo(7xof54{h#Au$kgtgL?ps69WGl zC(z&i5VA4?j1wN7!MxWyOa89<@kfKim8SymW&ZT3@C(Dl#faj^HLpAsezNA@PJ#cp z{x8M}|6%=qbqYMV&4iZ(oC2?aKUXHmz>oUPr-F3&x8!Dp`4tk zAVsq4Z})5pP_<-g+*jNRJsb0!9f;K<;sz>9FmKkJTJFgAP9IcJ>6fVX;ow4PFsRrP z;i7<1<=oz6BqWGTFaSr=XnC2Mqw>@arng3(=7zg&b%SafhqM{fXXjMa#BG?77~-yb zV46LCYdI54iCbPzTN4&T$P?)gu0UFT{FPmq6tG=h^?&he`8FvaRQzaS_ICp!u*UCi z@|Swh5f;Hb#@_z4dg%^100ASpO2nt8CCY)oM)cdN{VqIvGc~aox%$~W$%X2 zT_!SOD*iZbLpJX9ynLcTMvX@E_^g4V{#`OS?r7&=X^=8WnKsFcWy$999ruAQnX|{y($V6w-8fh5`eLnQ zoTN}}>axxgnh)A{`cAq6~B1pY;0T_&mES}kHcD+Ssxn%0^AGbd;Gw>*OM zIJ~u-Z5S^Y90FqH6noG}zIbFN13no<*$BQulRPFYi_IaP?GfYo0t^XKzRpb<`ObE@ z96C8a$duGrs6M8dmQ2=Y2jz{bVdso!tYGJiu9r(IJ6+`iaa?BQ6rJ?RLLbC;t7u9n zmgDuf$&{Z~(uxYcHms8lLZUInpE0qIT^^USz5!eau{zNuc<5&=Q>$CU11 zmQrsxJ01n9bRE((9hX85)eh_y`V8)a0#jByTumC{y=tqn_#7z5o}2GQyKTm zX}h8Ju`a&+y(%7fn@HY6mW>qoS785WLEJ|jbzuWz><27}=;szhyK@WT{0qwq3!;V? z@{bn8_$>PlAfgEgifCR~5VI~Vh~Qda8mbo-MATj;V;8}%5zTGaa<#Nrtac|9I>%~%f5@Sx<~QMt1V`BV#OCW9Ck%ZWHtR36ps9L)}i5c(n*|-DV+5 z@G;zN25A{rQO(_<*3IRXRr5gGjK+qu^E=+RPghPx_rqski(CBuvI~5=zq!r%%RdEC zN@n-4D9V)e06|2!rjcO;K9Po%B`j{D)Vx;4ekNi_=#`~Iz_MCGc=AhL0+T-uYkkxTC3|c2umN$xNg>L)#4;esc&S4 zehMDJ*vi_URn`d@M)NH35p47vi*Z$NqUUgKz#AQjV!*ao_|2l(Kk5AYCnNVCb^cw6 zy8q9}{XZl3|BT%K7meJ%-Ff#vBlk~@+&_*Vt`tXI<|%*6$zsTi0{2ylzH*oUlQ`v7 zBa5B!6zFb^|ZP~lVRee=ka#wnAz(663Esa1Wh@8 z?jnb|D%>{BeM*h}VgTF(Fa(u>;;0q7b>BZ>2!5n;TT_z+F$4i{(@`P75Y(xqrK1Ci zqX35B-MkRR9~puf01^201V{ai@tV5*U0XTFm#sNqmP6_|^+C`i)EB^~WA6zeLr2p+n#~qK%D{I< zAI&602v_;pZsA(K6t?(+;y5O$ZfSS`ebG{wu9CFoG*!PdwDFV{CZ!$WGgohi^Ef4% zOz%J-N@Sehu<_0&_OIfUoS-ZetKv zD*?h_ycX^Sa5HBEZsu2-qkcO|sTJ8S1K1e@wt0j{_ZqYWq}uEQQz+P<7%3$5-JKkY zbc|mZ%-d;qM~7{P(`=F2J=>E#n|e-+Y`U$8>{pWhDollda|&vv=JUbwnrH3}Yon~i z`;V~firn7KW-;W%Hb|LCXfP!W8yQl?Ke(O2GVwl35LpWb4+BewVBQa0#LVw52{R)x z+-dgu?Wn#~E~gXGqWRg#=78;CI<&Pu#}sU$^jy14b}h%C&hVT!!qr%f_U^^5k$v=~ zc*+(*dwe+xi|V$gwYOF?!`MBcuY%%#AzQHi3D8e=(+JBHkS%WiP;T-kK)>&7EMgZn zmOJML$Dxkfk445@Z?W@vd60#QBTN7WM~sJeHY>NcB-HsgOtH%QuEB{%)uv6kyewW7@IP@K4jrp%eV)szgzm1?RLW8BYdV3n zX}lH6ca|lS<_#&ey>f&{p+mC5&$H%%m^~~bhOW`wa@T6tw_WpTePg|>PYO8GKsFW` zvui=TLjcdOGq=LST+@sbcdc3O-d5&2d=S?`lpEmr;pl<54jdq^L;Yw$&5R&MUdqij zsmbzVp*&NYSJqim#aNXmkgM)CGaLOOn5_|9%xY}hRyz;HP;-jjc%eHFuBN6)0AM0o zIm)~krt4ZHZ?6NQaY&~~Tp|Z!fGj%CgLvr}kY2NKoFeX}k50#1&A7Lbxg8k9p z#-!&hiXcQdCl02LTbShgSURt2p9j@hWfE^vyX4$ct}Fl;Ma>Y1o3sd3^$|K@Iu7N5 zYT(@H{Jnndusy-gjH*95A{ONs-34HNx&X|NJjqeG6RL=Mfbl6c3Cz9MeWb1D&=8P!QHvmvTcCP zIv!knzf5ItauX?1YTHLDsh2XJzLYEIhjI&o8Dz4esv*L(*O zuPv4z#*%*SMqWP1jGFSr1jOrt;k?hjX&pzJxQ2X?uH{VS)^s?>#N(hx zsts-D$pE$k_=lr*GA~gYB*W57S)B2iOn@VQ0Al%xE24BTYmxQ7Ow-UrQ#(BLz1{4q z%@R!h@&>aM|EqqT)!iC#1}u7nM^<;W@yO`g$btrCBAeB2#4_CajHotC6atY>l_!s| zI-AcDEFTSUu+=%*KuIkrGUDMqd8_OAF7e*F5cXxG5k|6kXx zf3oJ^PL5xQq(477u2|v!!}|Z~=(xs84s!||9qvEmN`IT=2Vy$_X9rNhJ(x<=zKN~} zVW?r5`X)PFS`A^kE-kudVz$+344OZ*U5Ku%EQz&@X^qA(tYk9fV>=rr{gACTu4L`q zI;;<0m|N4@q~Q4!0$`xTs$VA~6~=C4@kfBe68RUp4KO#b3`|4n6Mmm+F5 z{)s^TCx*$tf~1KpW=A&bli>Ixdlw8mU<#@)6(bXkF!R6*{z=b>0vh_2guV-Rg!nR2 zU0Y~P)0EolA}}O1zqRaTZlrD5R=4rZm>6=r2pc&5&JJdniy&!Gu)3_UHf?QF?5H=f zk1(G+B1xo98~WqP3T->b^6aE2_V)eiW$7F#i1~~`L!-(roJEXQN1(%yuFOzTP^8cT&Dlrvx{ zJ{;f0WOaTRlf^>#I5M;FYOV|EY+rNcC21ox#K=$i_-NnY7H3qnM7?) zJ^d7dgYizhda)Hq;zYLuP;iecV`k{@Nqri5U+Kl%?&l1$KOgsMzz)58G2cjy6ry{PJJNOPt(3GzLnRGIs5z%YCpNfH^G9qna1~0eM{vkm zwhFkW!*GYebK*nFcSeDPzPO6wU%!6*c4ldQ*)b@0=ZeyW0Axk)_9I|~Z-7XUA zx+|LDK6T@nknit@K4AmJNLO?bJL}^QwAM9Wz!Yf4Ev=zl#7Kib@zM4;;?=CjhOcfn z=%SK9u=?4vAw1x>OkmZZ-9ShK_qc9hRu26Fg$0O_mbeNDPU=y*LSZsUTo3f z(2)05T6DDT2_IO8+SNYBc)2a)M00z-gxy9*KF<&%+g5Hx5Y{Fpko$4Wj9U=P2=!%- zbXx2S7AQx`@LH$wp?(5S2#_N+uE>6W;0vAJ@JyRWOq67aZPKS;dNKc%lk`h91~Iw( zYqdpHt50!07(Az>+r7TDAI0(TU2SMK!=1R-N7tD$}Q@S)-{wO*WQMU-nq zXs<#LbXSGR%-&M14^50-RyxY{ouDY5Ts9fK?&m}0N{u&2TdW6MCD2#M1g=?+IislA zzTjMlb~=^jJrp+Ljy;}veR@6|`}W;7J#Etb1ZAmj(j*h|Mdia1Z(y zs`XwVPd9H?rPri|q_~EOo8OpDVd^?Pj^#s#Z3uBj--Z-7pHI5p5(^T>$CkOl4QQOk zK6dmTPw&mfzZaILC)GphsrHHC=-R-@p~_+8jvaci>RLPf5>g?+)|uFP?Cn&am5fYD z5iSXWHb0I@Rw=~Ywos=6*r1LT6F#`=523ng>fF_EA|y=60{he|EadJzcPUBO&}Z&+ z(>mcRCOE%gVcO1s;}Awfq`Avho<*pYI3HQYcw}3v$+gXnl2kP&jI$#?>2^PB|D^dX z+C2FedArqcUZmMJgnhcK%6wkl!L5j)diKQac2n}i?{DHm=tntS) z#tYB6SW4&B8Dph4dBwSivq7UHMTsqFK|=vR*o@{u5Vm&!ge}eq1Yu*Z-YZlD-&#!E zHR*RD;7QeDXWgWe{sv+D?y}Av^@adlJf~Y6?4@E$An^zNbIT7Lo7=7~2pTWnD4RD)U|T;IY$C2!R)kHzI?5G^;7jIxFJQD-+d}t(HflgCDgs%_lr^^jIWW zG{*~W8y-`>tAGMD#XNv<6s9j z3Rqsmc}eZ3HOXIt2h1KJJJLS-(Zl=0YYAf?STK-mr5KAfO7Kvsye^jD)KMz~6LbrO zu-LM@CwT9@g^mgzosb-(?g#jag%4_XT9BTZt|blj7Xm0z)raD_S^!G45TR147(j`t zu$ZenRwmYnHD{3!VrSrmYMY)74f0X1m{lpbCpsDj3Ea^Qib;dcU`(ArcXTb2irMa+ zQqUc}Hn>;?xTE7F6GZP|L^9acRJ}R0@<60SeU~rBOFXl9H{E*;W9jBtePf;i+7@Ac zWZBV|86EcrpNN*dPoD}N)fwTN^CRRsWV~9|^JwL1J5s^D;I9F9^h^HQ8i>Evcg|ni zMnxOfK>1|99p3sR4u*+!WIR;Ea%ACt%$5)6jy}rm7ib@M!C%wYn!omqzxDwv^FFd* zLalUgfj7UHdnNcZr4PXnf3c(Q`@x3Cp*$l-JqyTcm>;Cr!xZ>Lv&JYz#P3#T1CymB){HZ>C8%+_D>jB>p=4u#U0A z8eVq^bB7?J-IsXR4;TEk!xy~Vo2{Ua{@dOu+RqL#3+$aH-|wBk2m8B|#YkzO3kuQy zFtwwv1w$lXA%t-&9BUJXjW01EoaLwhJtP*d{M~hY-+pU!O_;b+?LG6}jEwzswVS?y zMhVw)CJJimmEP!P)L=TLxz@EN-FbyTCsoen{rIW9srK9hGc7ZVb>)~{ncDtkfimc$ z_=6JPJ8{jmbZM^p1%z113%+4e9{d=#g_&p?S;Ep{a%`Miux~Sp>15un90%gZ;KPgG z{fv^r1<&f$R%S&pY}2v7f5>DW`sj`%hSANLr-R)}^a+;b(A&WYxA^ibnDD?uPfxBt ztE~Gxantkn?wHJf(gO8QrGbCa0ww>y(!l?f2L7)!@LvGK{!MA%-T%H?0qht*Dj@$= zwc1H@$-02>18}; zh)Tn;qC3ZJN#@f9q7U0r9dNHf4-8JJI2S=Y5@Q+?vYH4Xrj?C)khnVvxT_lFQC(DPyf za%Nu%an62L8QGV8+^_sDnU2m@%1HAS8XLFaj(;RZ0plCe_Qsvn=(XEi>SgzcRcS2a z?1VGm>IBJ|w4xF%6RN@#GI`0}#noz-qjwrX8P1Dz4$?rxrex`i=>g1#Kra6)=^Xr- zpdq4gAj9boWH@Eo)^wJglQECZGn{VUGMsVng5sAM&N)=WxF-3~!bi41hI1H9x)GG& zw7aJ`k^L2>!}SSD?df+g9Z-f71k(X!I6*L-^9<)-FdZH7?=zerm=2;p@Cj zhO_v%w(vE2UFpiC!3;1Ig>)_)XzieNgai#m`|iIF>bKqC()}_~N7U(e$|C4uHe+|} z7px;46JTD7T*RJQ0b9XrDCChm1iCeegcN0K!=lI<0o&i~Web$~}vb?ptk1c;$Y zk03?r&h`ZacC))6Jv0IRfS81Yk_3`KsJ|dhy7VH_1Vp4s6_DNogsLD&6=?#}yYQdM z?#|vbGkbG)c6gqBK6swb_r2%b_nvcZogD7Z>A2u?I_=$`(}BgFLpMrnKM_AFz7772J}0aT1Li=k+1H12~c-L~#MR&?Hp$IEKgx)58>c(2>j8>e4%YcO_1qYt@3 zFLj6C9bYh~Yn`rpt99v}(cp_3-wvucYJY?K_3wZ7^2v)n^=38u<>c-Y5$DEjnUVA4 zXh?b!c8Ltn~b__e=g* zx7p5Br+2Q5ifuac)zwuqGAI1e^u>^O-MF{k-U?}T+8XuUB*WKJLi?8dv{vs!OaAJ5 zZPJC1v&O|K7u&Vl)@0y>rQxgpTDzcq%Wbc^l>2D}@dBb)Ma01w&w)frr}~nFJ@IIw z_X!x{;7lOr5k+5rFy&a$rbD6pn|?g;?2ixgdU8b8*B_cR=@kAv|CDpjx4pagGG%z? zy}H6XW;Bq|KIoA?$B5} zE6>p#ty|T8e0NjQ`A>gq{$<{+9dEoEGO*uw{0G7#y)VGz zjn$cp{dl|oCl{(!&J(kzf8>7}>YLzKjtr@7#pTJ27P@^Otw> zT==ula=5%xYVao!J7zw9JnUhj_bsrYeHzv!-U8dRWd++?V4fSCo=*@@72X2l#LtkE zH#ps&AolkbnEMmNi}_CwZ(Hv76U1YMPY}lzJ$j--Tk;dcX7UrnZTU|S4}9WzhWsvm zhFmhec%h;uViNHTo0r60<<89Kb8>~N-%eSHRG2M(W`VLpnP*t%X4 z?0w!#EpX)Ny3FeKuMU;p+HO&Svb#Em_WF7L*t=2l(yWE@9{EJKtNNma0|%XYop9;g zZ}FvnYka73c-@N|CwI<$w@1l`SDy5Lto!U%@%rbk4{ZI#{%cQmy?NWa`KpbpTGje{ z#O;|!Ms*thcaDEPEwpLm^(ir3cP(rFv`D40tKQo%w%ygTzf{;U@6zj^a}{d&VR-&U zy+&5d_jyeE(T10QI9z_woVt~+%xGbq+~jVjO&3=Vidk?xeZ`iQqrOjB(X0QyxFzSC zylGg;Xx1NnnfHO{%OD$`C!ER+J{bW;f2gLcCNVmxNB6kYwAv}L-Lv{}+}D36@V|Zo z3Ti@fJ%#^k)@t6dX~&XAWW9trDlYR}qdK{Br&P<>(sRKspYqperd;~X&s`L zthlq_%wMZr`pc6xe0wjt?4j}NmhWz7i20~;Mw5h%w`&`quQM>ej9^N7XWi_CCITakT++AJ=d7YsKBaS^72!J+NU?zWn7U+Iu{`KBTlY z^IHDypGKwqv+$dN&m%q_f3fb53)dBh-qdFMm`xE=hBum+zj?;Uv=L>uwrsXvKl5>v zb@!rs*A8~uetN{>`rRJXm~{NyrLRMm{oUot_OdCVdhVIN`*t&74(G;$ZqqCoJ_X_79TLEn>1JA6OQW{d%tf|UT9MM)E+22I zApBued>nqV=Mo1WPT=DGbcLA<#Uh#uece;;Ns|gUp(EBppA`4dy1S=YZqkLQYNbKT zdk-sVcpe`#e}|9eAzxGbwEm#9x6mtrnz|q1sjH+eV31e!(u@4`w#)khD`_1SUtJ}I z7o^!jaw$+!#VYH|oCGDgpEM%}`cOn0ppv9}vt&&AE>y6{#7`PPN&I1#Y+_P{o4=3d z?}EAyRgz7;itqwelDMrnCd~^Y+bSEA{I=b#Br!f#(gP|!*}HT2Ct+{W-bLvs`vD_li{GGJJ3ZqyIG;HJYgNWTU8~^h1F^gw2^;? zge@lhav*L9{|RAfOuB^d)K${la%5Z8SJHhdzPd_kS)OJK$)!L^oqyQf<^^Q8JCZtS z3!)8DNd<+~ZwN{Ck#7Ucc)M$?++1sfw+_ z4xF70S#qC#eRvr%X;ADyY}a!-6&cR5QcO_7=m={Bo|MH08u8HOd#g`$Qe1CEc41*` zrc-tAogAGOm)#)t6<~M%nQ$Tx#N<*?E8p_;ov+2mXz7H$ zF~Vc_gM2o|**=$xY^xf>3NJEtq~ZrVs&Kadg_%pipvnksUXGX2NJ+M@)R=Uks!IC5 zCIYmHeMt4ZG=r00uHJ+2)K${Z=44ydSJFu;zPd`{VDHj1zX89CZ6Uc7C~47=w`s6@GOj(pA5PYJPg-g;!S*+fa>qIgJ~Hx$blIX@p3DYT zepAlf^92~ax1!!*y8@Aw_QGp;wbl)icji=g-blq$5F0JSDGy(mjZ2W z>SeUdgDUj4q!K-hXqmO?_8$G9z=m#uMSA{YZlENFg97beH!CQAP~Zi^3sgzswqhks zizVACt0cc|m-hu$(oHHp*}HTC%*s%1l4p9w zW;oZ2#$aW(;li;~cN+mi$Gl>OlZiA2qlMLmbqQN$Hw1>^z)%kLbbK<60aiO%DSrOq zR>N4J2!(u%#q?hv8ikcvO!uDUIJ6eznGS^nX4srUV=!rz*nr)%J(b1)3ks|h{a#eR z-T~Y+PSO(t`q3$@tQ2|2bZFlZD30Y9`>Ap|jlyVRWjKFy)~R;Da6-axdH{{V#B9SS zA>VKRMYgYp4x%v_IaV8{Y&@B}B-n6Q5}L*jrZMPstPF7@bG47 zBP&DZSGTOaz=r&iG1vPm8iSEpuAg5on0p2E!ymwcZKySp%D@~q7JpJ-TLDJ&J2;+$ z$6T#ZGzLz~9Q~r=^9^Y$E7$MG&?rpI46a5So_+uf6(yOp`B*9gvs{~6+F$4m3{E(K zg*#&JI2wbMSxh7Y?ubznXbhZI1tXeFqET3x$J~tl-`Q~Kb}UTFfxbNdjm>Ns{{-qAv|FA@Y``S|%`* zlBA$X-_aN>%t52SVd@|94C@w98JNdg;+}Qm$AS$}lGytDA{v94S*+{6Jhb`=h;y0w@p~GBj@brsykUlSOK1!nbIj;GbZ@N+;3er?Zrd^%gO0hU$Fxk$I};dINVKF~ zPGjJhiw*xX-m*~T_#Y2C=Acn`<(`my=?HlvWCjQ?4`cv*H6%a4bsSW8|IMy zZ7?%uIR6Q#?>ZWTg?Yps?5O#Z|AOHGNmbbooaf&L19M#JQmydjVZdOA$cGcq(+yMx z))`8X_YP&m$x10>6P18D0qr?maD_KZV-rTf1k%5gm`6j;vk5=*+en{JPUvpr%CYdMZJWgZaw9H2MpP(!|L8CA-=Z9j}5$FC77H4urh(|=RQ#1xE zbKF>8+7ZF;L2Q@gxLapv3`XVzQT@YmOXmQ?MM-r(>314~p4kTfRprogR0d`-`Hvfw z&Qlqfl+3AAYED?ca6qiVjd3z=bg0~fT19){owe`U8gZ{T4su?W42GK3KY^L z^y}X=3KMf+%0DiQ8!a1{tT$;4R_2l^dCR{Yz1x1+O~vof7&tAn5fP2zzX5+}(!da` z*CKam6nbVO{8uzh?@<|;^=coxvh^(JYH4(}|4U_H9&@km|Eb>swT4D3_EMdPGzJ}W zKlGS5@qPJS>IP4#49o+f=ucBx7-2;q*(|nU!!sHK#~k}cJioqBe(j{;YbpbC{En{I z;_U+HhmjH+YWzoIFfeDi0uKkxcpn(HR}s%fBSJzbQ#t10u(!~e9X&y;(w)(Xxo8At zX0e{jnd?ATS%wyH4afg%)WDpm5B+tZ9)Dbk4;pyBnGQ=H(O-A6kdwPU}3hw|9Dtfn#N#ej;!Q~5FGd_m!&Z<4{7u7 zKUL%By3*QyN;w*VnK^@|+?^k5lI;dFY~A?pXbZDg+Z_or@%I9x`x|?qg!0c|X7-Z* z&{`Q5w)`^~m;+zP)f}tj*VT`}1eLIdsh-riwC@vi}kmc<}w>32;!*qb0tzL3#p5XLBO~+r;jO=Si~` z%ion8jPTg~;LeTW=!v7V$w9VN{V_F;icji1_~?9xnM=W#s#7Fyn*3eK_D<4;sw!!f z%LmPVv$5QuF@BWv5aFq-q?Jv{wyLirO*0z4x=QNC%%wm{$q$#Gh6Q-d4hT&6KH3pP ztE!Un!{er&cxUy@J^WTezW8Z7^mUT_Batl-p1MjZ2D@y&wyLkB1S-C|N;<^Mr9ero z8XX&52vl?)<{wx|`ZlBsgH#gE^ONDehLAbggAyqv{94Ny3>d7Ie3N?q9_GAHQESx@ z6Mn7bA)O#tHR0D<+H|B^Ly`q4CtNM$3Vs*cLUJikQuycd9l0ULNmoU7BHAEh63%f&;{}U2 zExVMW_LP|>|AJIU3>d7IaE>e63$<3<0ZKvze)+O5oj|?kYcuIYsy$y@9qwxiHH=iU zsy|;liO#3y^R@TrRO&rn+cc5tLv^38{V5wV6`!vy0QYMs+91PO*2wbv)`tAn1b&vc z7oAMa=W8?QRDnKU`_-8|%?m?ZegHpQELMdRB!mNl49vJ#9Mwm_HnKlM)+^tfxjkWx zQTm|WVT2cKSjNTTh%~aTN}{rO=?)i*XQ}uSo%$`R<#mdmdNTK;*+OzDNbx@n%$)=W zXEduN)7Zs`Hb5oOH)A#Ff<*@QZ$ibjJ9xG!D9Qa@-}hk^2R41-w`8~j;jt^px7bqP zWhroSQ<%lWkRFG~wLT zo{AsraKgE1BQuwR@f1CMO@FwZr{T|g;!qbcfplSzO2R?eJW+sVKPPm&=$$vsJgEt{ zbPx#_td4L{E;fZ|sTwlEK{=iVAFPUSP(Hv)r9ecwsHi)cAR;q}2nS{DRKkA&YDioi z;-K7ont*I(-|&fy*gg0Q5Rvp?$2SO%T}8g29JlpEW4N@TIU^ZL_E}_GRdvJY*#fkM zeY0X+o(WI*Pg?29h;vg0!c*dgqnmDgz+dO<3ix=Oj-E%hRaG~b=lh@oSkEf*$|moI z!3a-@8}vQ@JR1#e=pu20c`?~mRo!qCu8n!7re^lNh5?(Kua1=+6g8HRcuL$b=go%k zg}@ETlDW_2A4u!~-5{=YacrpfqX4b*sDYtU`FBnDIQdHDON7Vn29`>t)GD&Ak;zHj zd&KukiB9X0oRpf~j71(FS1O5A{9tnou2haOb16tNt-c&ya4UpY{`fSGE0)!y3sqH; zZH)lUdDdeXltj)Sam_ml;i;>n3hT+Xs;{I}D!#f(I?c?bKuP2r5-X{}2GWJ9Drw|K z0b1ut)C@{W&|RA&f28>k!c$jC(Oby2s;{JtRD5-nRD3JV7LrSWk~S6Z^adX7komIm zFhr}WlICp_EaE&zni-U|uHu^Q{Pby{s=ktrQ}M~(RkEywvs;~A zG+Rh61xh-7O+T~&WVTz9I%zJVRaHq<_Xrm0*cY~XrtiM(orvS?)(hdWE6F#9^8eBM zJO{|Os_KUN2L))(bK8VrK)tK{P!s!D%CZ@=c1b5^B`~Pnl{9w)*_#Ry0{ck=lby2W~ z3$TAC$}t3VqCl*AY{69-d`YATa0K`cq4GOQ<`YsMkqpf7!5w17+gI3Kvt`JFJE(x= zbXNwS?R0{>_2SOJYab0x3enB%*`@L8dSBjsUVYi2IH(S*OE#;%LU`=S%!i$)t7*(M zh{Su~ho@WS-^jKG7>VgiK&5^cpe^i0@{$$#AM?w@RV8ltAHq}OhRp|;)`07knx&Eo zugH0_tpU10tOmT(^38=1P3s;pY5m|!+ss$izB+PbU3a)q)(d_{A)NE$@H7brpB^Fp zSZ(fqSUHQD)CcE9rnT%#f?LJBItS5<5-p=p57CM0cVd~{q2urf4bzXM8-u*X= z#h|n3v?hyQXV#ir4u?5=YM)G}8Gq?C7c5>TvHIY3F}0Uj>$TdZwK$BN)@pPaTzZGY zu4k~?NB!0EFMb*c|EyhHZ1suTVrre%<9DaUW3^FhcNvT(m(gjnaxRC}7KqiMNgFO- zf|n>KKy1Md-}_cd?XlbLbpOTfH0iYlgT-vKT5Jx^Y_-&m@6ny!*FLKsJ=td54KKmX zhBr^W)G$6kW?^}A_*9!^uG5-jEf;BXTW^fCS#^4|NpEv%tqwD%HyCQC_Ggyaf+Csk z-Qs6k@bgjwGf+1wB&HS|&Us|U>GgJ(-Rj^tz0Pj3Mn>whcepR_!ql4gq|}nWc7V$b z&<%R%Xp_@w4y3Qkg;iV76=YUeBC}&9{8KwTGIQt*u1J&1>@ski9R`^p5bF7*CJrtJ zUklm`FEU}Pzb)^dT2MG=G~4VplhI(cI}K)&Gka=ZUzc%~tNH^(GX96D%UAPDEkrY$ z!EUx%t+q&$(W1Axw5CA%x~VN+WHNj<%;fMVYZfKv@-)G0);c0BI^fmA z&^8$(p|8^unM2B&e4mC4sIJk}t>LrUJ+3noa*76*TU%hZ!xKo&Mw8j7)4}*Mnw>f; zXAWp^-N-O&CPC_0CrKY0r}?8M(}#fra}5s8q&IRL7f|}BJ-ynVK_Ick&<9v%>t++w z?tE!6W*Khu1T&}3z*(I}tIGxH+Tk)-BdyTaiL5ca&g}xTSHmXqN%&#vZ|4!zIGRO9 zx_uAnI?`!$*&>|=y))9`)N+9+ynjsN{|%J2`j=k_YLV3*g}aO7#Z#eC&TBYR;^)iydw-Lb7&1jbPK;bWVpU5QopM*(9|QP``le zg{|I`JC`V$3B|ClHgoFi926-Av)*AdMY3crUkqPXb4GMXZH?wI{4jOjLQ-l^mEy`u zBU-J+VAAR$9ae)K@|GjgsSQZsMP|0Tv>mFHBuSNWwVssPBQ&4YTqKlboHfz~LDXO~ zIkL~!KC45UXg}%z)CDEfh3pK}Fy-J3E-TD{Oq@-pwP#Q53n>GhJv|W*sfzz$ho5Tf zms;zYb7^gQqsgE%n(Zde?6l}38LAYY)#p#9l$Z=5W$$}FYPZ6dHxW^DAZCxk-AR*k zSzKm|#irL8oJPCNWzy>dQTX|&s0o9Cx|&4c%UX%3wK58~7z|dM2{M=6qH|as0nI)_ zKJ4}LQFzm;3%n`ob-3H=Z#sym^=4yMDB+ASx8?r;pUq&l=^$lWxJZN5Y1ai}b-qt~ zR*eL!H4>|j#EYoqtadr|oW)^vnoMS`%K*_VfH_zC90<8&Yl;g|!d<=XJQdHmf{LL=9F;CO%fk(wq^d zffl>b!Z|I0#PHw4?@XEkfwUpC22=m=m6STGi=mT+*@wxfa~Sv-YKSz$!iF&rhqrG3 z^@VR>tX+klh~Z6=e||um|YG-K>51=+A;6!UuZOa62;Vf1tCAl<#g_{5S}Z7IfotE z!GX}7cBd_%vT#=EM>`T=aFvt{E=$qe5^8T>3)4L(r?)%p1~bRGbT%_&t^fwt+oKt! zhXVC9iGjChA)O6{-x&fMKIl4(Aej2 zcQkt)A)+>ztuEedA)3K-&%oJXVy$&JEH0BH(xA--0ERt+a{L!?z`D&Q$`!_b_SIu`-EyGfR!U)LwG19Ss@MZQx50ouZTl+OPxn(q*v z5;yq2MbpwwwpCR(d=e=@8?rm!=^NieivIgr{>;Thgvag%_W%}m8Qux2)|hN-r0Qo= zhfwj!4Zh$H8~n-4#k`s5>z>>*DxWzEF(m;86^<*7n~*LHQb~AkC-D;>H1lh_s}nL} zy{A@iOV^Tc!RiR#qWPo+(NZ;Jgm2NzqrnHOB7BSHH7k_@5jD+wxMDsK&@70`_!doE zOTvEvYKWeqx3%&iv)`imXRKw2d^CE8@B&qlxUD!E&23AzRaQoR^QwHgf=|ldr{YU= zlns~oi~&AN*s>kX7LrSWkor}A)SbT>3fq>VXtV{<2B;))uE5dgNqfN}_RFEK+OCOg z0!0pg-5f_FGpxgSZnEeDsBz@88jePpod{@I8Tmc^Cl8OK(FdI=@MO;_$!Rzm4P&KJ zAfmj@b)^r3h&T`tjz)J#)*v;6E9H>S1=n%xXXIB8oH(Whh)DW?yc6LC8jZwy$I<9o zSF){Y$OuOxQ#TrZusXugXeKk40wJaM9b4@KNNH1H0S1rpkZ96GRh85?#s|%Q1MJ4c zlOO6ey|Bv$*KB5RP`i(hgQq3Zhk4 zNj(LNbnMgCKCM3}Eq`xkBf?WxNiCDewyLkB#Z-KV0rhJ|>+-cMLm<6`$!c$jCiNnaYs;{KoRD7~`gICfA z!)dmVTuPMG_Va@UKt|5K+PTH3^p(oz$ayTxy!oQom1T`W(4?Lz!ydTQwTjv78$3 zB-ri9a-$1tQquF{#tv@7pD7$Kxe3t(;RQOx z#l3_l)#3Zdw#p9i09Ak|)!nK1IH zueGd1v_UG#n=ITh>CREXB2LRLrPE8!{VV@1tvbgLV6a-k?~gw^fxwlBNgOKh`{RvI zQVD{&>swK{zs27*T|y@c;@WR@#G^SyHAsaUzHU7=Hv;Vdf&`z@y2DN9U-?XsPrIx)Cwy;v9v=~Qet ze0>FC#OGzIdG}xND;xh|q96k^E*4AtF8IsDepade$0Z8%l1=fQ5nixi85fJi&y#Ic z5|zcpC@vOzQ1K-?&89FF>lCkc9%klJkm75+PRkyYHtyLsE)Aq4{qSlW1`Je7 z;@09~vHDHaT3Im#7%Fg{`I1hcUa|Nmok+D}(Q=FGG1ZI3d2~KCi^bP;D)oxRj<=~k zRJT~%k`0-P#p3&SsCJRzEcjw^Ae~IjV(}cED$rtaQTmaa`5`XHL0rbgqVXT(z#s!N zPVtlO3fM;W*M`Y6U%0KO5MHoh8K?N356HGEiOS-zk5l{(D!xRg0cHSPES7&rvxVeR zkmCJ+5MV5#RaHp~9|;y&**|;q{kpiE{UO6okQ9s85uUnATJel*tNKcMOT{O9H~2N` zF3)MUkX#Cs^s4ORN}obdDh*en@U-JFqE%H%$u9+qjO+)RC*3`K*Lx}+$E5WLPhBOo z_>XL>`bt_v#V30=cqN6rrP)GqDNs_#!8fsg!31`NWCGh8(FUj_@uU!ExB2e`i}dUV zzxqE287sdOat+}Hsw8n+ad!JIXA$onAGB3gN!d&)#rQb8J*483y_=<^Y`EwX*r;4I zTSzViN-`VHZ!mz09FR6}O!^hks;Z=hd3+YJFNOGjW_JX_Q&&ml3y^J9Ur8xce6n|g zSJEkFE(J>R|5EYC1xXjGs-)CVA2j>HFaMt-*o^ShRZ>(K*;e(Hw3Ldku99-UN3(_G zQlKRNpCjmlXaiJ|c)o(O+oo{AA|v~nTAc39YxyIDuMl3KN)opfXSZo3$hOKVDVzC} z7$0Z1n^b(VcZ08!8keNmLUJikQo?|-W#un^twXe`D(T+)K8x75@_*m;#|wESaivH+ zb(NG+mc&+HN#)DY@X6i{UP=GQ%%wm{74GD{&F?-+ztwsh(W!frj=cFgqoCr@{C52WZ+p4~jx>51fRnjhIE(J@(U(t-FGEgzFcNw%@;aHI=^ zR1)6C9n)0C36u?@92Ta{nBd1M8_n=WvL~bV_xD49?xdVG!j~CV&94C zsEe#CKT5kIJa*5@pQ6UInNkk2t?G}`L@K_zqx2Xvmx59H;pfIs`D05KC+R|FZOZo! zR#HEg0BvReknHt+qa6ceccQi+Jav^cyeZjM^_BD+6<=K?8Jp2;A-NPNX=}fn>!TpV zm6z;9Ekv|IDhbE?MlA%3I4yfn`gUe!Gw*c9`=KUiI)u$p7%*5Z;bTiJqEKtq5EDN3 zyO>Tu_OO!bL5DI-&NftQNHPU-`g(Waong=?cVNWh-NIzd8=#)VdoVaM9d9exq-TH9 zVsx90-|_1#>5|Vr7Hvo3v8&0K;UCu9e|05DlMm8(GiBwcB(|z<_@Sc@n*EKKNz+#h zlHcI{2jQ{1!JSORU4~QrsL#o^%8sdQw#vl#c;WI7Dn6<5tRa;R7kyjK`aha2B$t8_ zW%PSvbqS&kP)YQn@xLxUi`bW&9+m1-jQ?i5^g5fZD~ZRhB;SB?4H=nJ4}nFxJNe%i zBzAyq5Q_-Ml`mrjXdU~5l!=d9*W{molRmn%7vZtHfn`8-Ng&&*{(xFX#V17`{D2DY zL9>PAQZS(Q)CsGoh1qSWBCN0B&iq4l9&nrp#idlhyB%ZoTS~`TpR$oak zsrc$DsnbxJEhLu$C0*JVJx~5i-}?}4fJ&m*I#FK=78%%|VxQYR<85D1QVq!g+ZhNi zP$h}mimT=hBgnSOD#`D*pgZP?@p09>f{IV}u9Ar;KB`?{B+V9*OM#M#ESuOBzKX6f z!`mr1CiO$K0V+vcF5-t&#*G#%VxNVMJkk6R|3oJrl5k6pk#K?PNZeBV&TEfxL`!95 z_MnOfR*;IV8bAyjYFPOO$2JC1)cVneeFp$c`Up~AR22u!wWvrnLk~KgLiSs4S?T425T*rROVYqX8DSlN|`n99b zr6eA^ihLvKzq13T)&>telZ2B)%Sr42-5?Gp*bUAV0<@Vuo+PYV`hU^jhFX#d*I0z7 z#0@WRE*Yx>H{=0)JWlJbCfgdI8|Z4-wnl(9uwU%-e;w}~!ee)X{JaoXdUMv3ZIulw zK~;M9sQ8kok_{Jqx2DAgnk^)kg0SNMI^HjcR#he4*(g|KWo7Byg1C}ln>=v`lq;2BP~i+^*iX7pRVCRD_@LRhKQm`*i_0r%6v9(i zN#!%hwyLkB6e_;DN;<{Nr9eq{{&>3nI4G%wL`feXAzi4dl0G{sKsE(J>R|D}+jh&Dha(dS>I&j}V8*jL)$yS-~U zACshq1~U*|ph^n_n!*`N~Opo#%fEp6VW4uIK@m~Si%zh@t|JBOw2rp0-iQ9^EQ^aGkt+Fx-DmSH3@g+LS zhKs&7c!rrvfshKCtK@kLLK-4jY;X94bfKzBn($PBwy-~DVr?F=JwY}%oj`c(O7i8V zUw{7f^B3TTx02lS^-Hp?s=DF$D*@WfzS!Quu`M^h=O8`gRrEE9r^F47k63eD1UK}M zxMAO05?fU_Ja{KS8`xKh{qH##G-2My)c}v(4J>;OnK?;p_2Wv#Tr_-jC$h&DhaiK`r(p(^C@d5?V)FW1oqvCUyX@gFtEtIRP7FHj|k+ln*PyZmHZWt9|Q zp@U~nZ41!wB}&SMi=Ls@Gjl0W(#7*R8=fbe$_=O^AcA$P literal 0 HcmV?d00001 diff --git a/webodf/tests/odf/OdfContainerTests.js b/webodf/tests/odf/OdfContainerTests.js index e04c3c2e7..5c5827b41 100644 --- a/webodf/tests/odf/OdfContainerTests.js +++ b/webodf/tests/odf/OdfContainerTests.js @@ -394,11 +394,11 @@ odf.OdfContainerTests = function OdfContainerTests(runner) { ]); }; // A document of the real world, the standard itself as OASIS publishes it: - // 782 pages, 27 tables, 18 images and 102 objects, written by LibreOffice. + // 800 pages, 32 tables, 27 images and 109 objects, written by LibreOffice. // It answers the question the small documents of a test never do, which is // whether the library still reads what an office writes. function loadTheStandard(callback) { - t.odf = new odf.OdfContainer("documents/opendocument-v1.3-part3.odt", + t.odf = new odf.OdfContainer("documents/opendocument-v1.4-part3.odt", function (container) { t.odf = container; r.shouldBe(t, "t.odf.state", "odf.OdfContainer.DONE"); @@ -410,7 +410,7 @@ odf.OdfContainerTests = function OdfContainerTests(runner) { "urn:oasis:names:tc:opendocument:xmlns:text:1.0", "p" ).length; - r.shouldBe(t, "t.paragraphs > 10000", "true"); + r.shouldBe(t, "t.paragraphs > 16000", "true"); callback(); }); } From 3f6daeb300a1aa96bda6e2d476e14b62a482093a Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 340/385] Drawn the pages of a drawing, that were drawn of no size at all. --- webodf/lib/odf/OdfCanvas.js | 10 +++++++--- webodf/lib/odf/Style2CSS.js | 4 +++- webodf/webodf.css | 3 ++- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 7d8441632..230de0db8 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -138,11 +138,15 @@ // corresponding to a master page in #shadowContent, and in the same order. // So, when showing a page, also make it's master page (behind it) visible. sheet.insertRule('#shadowContent draw|page {display:none;}', 0); - sheet.insertRule('office|presentation draw|page {display:none;}', 1); + // A drawing is a run of pages, as a presentation is, and is + // read one page at a time in the same way. + sheet.insertRule("office|presentation draw|page," + + " office|drawing draw|page {display:none;}", 1); sheet.insertRule("#shadowContent draw|page:nth-of-type(" + position + ") {display:block;}", 2); - sheet.insertRule("office|presentation draw|page:nth-of-type(" + - position + ") {display:block;}", 3); + sheet.insertRule("office|presentation draw|page:nth-of-type(" + + position + "), office|drawing draw|page:nth-of-type(" + + position + ") {display:block;}", 3); } /** * @return {undefined} diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index ab67f2e14..e7360b09c 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -1300,7 +1300,9 @@ odf.Style2CSS = function Style2CSS() { } } - if (documentType === 'presentation') { + // A drawing is a run of pages, as a presentation is, and its pages are + // of the size their master page gives them in the same way. + if (documentType === 'presentation' || documentType === 'drawing') { masterStyles = domUtils.getDirectChild(/**@type{!Element}*/(node.parentNode.parentNode), officens, 'master-styles'); e = masterStyles && masterStyles.firstElementChild; while (e) { diff --git a/webodf/webodf.css b/webodf/webodf.css index 645058dbd..7877a45f2 100644 --- a/webodf/webodf.css +++ b/webodf/webodf.css @@ -170,7 +170,8 @@ office|spreadsheet { page-break-inside: avoid; overflow: hidden; } -office|presentation { +office|presentation, +office|drawing { display: inline-block; text-align: left; } From 1ea0e77dbd2d4dfc422e543e1a6acff0aaea4dc3 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 341/385] Set the pages right as they are drawn, and not at the end of the text. --- webodf/lib/odf/TextLayout.js | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index ba3b7b817..7ddee145c 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3824,6 +3824,12 @@ odf.TextLayout = function TextLayout() { // the edge of the box, as it is in a box that lays its children one // under another: a page that ends on it would be one spacing too // full, and the line above it moved to the next page for nothing. + // What is left of an element that was cut goes on at the head of the + // page that follows: the spacing over its first child was already + // written on the page before it, and writing it again pushes the + // whole of it a little past the end of its page. + sheet.insertRule("[webodfhelper|continued] > :first-child" + + " {margin-top:0;}", sheet.cssRules.length); sheet.insertRule(".webodf-pageBox > :last-child," + " office|text > :last-child, text|section > :last-child," + " text|table-of-content > :last-child," @@ -4338,6 +4344,14 @@ odf.TextLayout = function TextLayout() { if (fontsLanded) { fontsLanded = false; trimPages(fillingRoot, plan, 0, true); + } else { + // The pages of this slice are set right as they are drawn: the + // room the foot of a page takes is known once it is drawn, and a + // page that gives it back holds a line less. A reader would + // otherwise see that line cut in two until the whole text was + // broken, which is a minute on a document of eight hundred + // pages. + trimPages(fillingRoot, plan, from, true); } drawPageFurniture(fillingRoot, plan, fillingDiv, readMeta(fillingRoot), from); From 98d278e6fcb6d6832a529b057f5b0c146428a48f Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 342/385] Drawn a page on the whole of its paper, margins included. --- webodf/lib/odf/TextLayout.js | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 3fdca90ed..2525b3de7 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3256,8 +3256,16 @@ odf.TextLayout = function TextLayout() { /**@type{!number}*/ n; box.className = "webodf-pageBox"; - /**@type{!HTMLElement}*/(box).style.width = - (dims.pageWidth - dims.marginLeft - dims.marginRight) + "px"; + // The box is the whole width of the paper, with the margins of the + // page as its padding: a table written for a page of another size is + // wider than the text of this one, and runs into the margin, as an + // office draws it, rather than being cut off at the edge of the text. + /**@type{!HTMLElement}*/(box).style.boxSizing = "border-box"; + /**@type{!HTMLElement}*/(box).style.paddingLeft = + dims.marginLeft + "px"; + /**@type{!HTMLElement}*/(box).style.paddingRight = + dims.marginRight + "px"; + /**@type{!HTMLElement}*/(box).style.width = dims.pageWidth + "px"; /**@type{!HTMLElement}*/(box).style.height = (dims.pageHeight - dims.marginTop - dims.marginBottom) + "px"; // A page is set at the place of the page it is, and not left to @@ -3267,8 +3275,7 @@ odf.TextLayout = function TextLayout() { // are drawn on. /**@type{!HTMLElement}*/(box).style.position = "absolute"; place = pagePlace(/**@type{!PagePlan}*/(state.plan), state.page); - /**@type{!HTMLElement}*/(box).style.left = (place.left - + dims.marginLeft) + "px"; + /**@type{!HTMLElement}*/(box).style.left = place.left + "px"; /**@type{!HTMLElement}*/(box).style.top = (place.top + dims.marginTop) + "px"; state.top = place.top + dims.pageHeight + dims.pageSeparation; From 149ef75fa6e153edd9f996e23207514d0d161ba9 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 343/385] Followed the links of a document when a reader clicks one. --- webodf/lib/gui/SessionController.js | 5 ++ webodf/lib/odf/OdfCanvas.js | 98 +++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+) diff --git a/webodf/lib/gui/SessionController.js b/webodf/lib/gui/SessionController.js index 4619bf61c..9f3842f94 100644 --- a/webodf/lib/gui/SessionController.js +++ b/webodf/lib/gui/SessionController.js @@ -1136,6 +1136,11 @@ gui.SessionControllerOptions = function () { }; function init() { + // The canvas follows a link on a plain click, which is what a + // reader of a document asks for; an editor asks for a key beside + // the click and answers for it here, so the canvas is told to + // leave the links alone. + odtDocument.getOdfCanvas().setHyperlinksActive(false); drawShadowCursorTask = webodfcore.Task.createRedrawTask(updateShadowCursor); redrawRegionSelectionTask = webodfcore.Task.createRedrawTask(redrawRegionSelection); diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 145ae1b8d..cc7a600ea 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -3534,6 +3534,8 @@ pagesDiv = null, /**@type{!boolean}*/ paginated = false, + /**@type{!boolean}*/ + hyperlinksActive = true, /**@type{!Object.>}*/ eventHandlers = {}, waitingForDoneTimeoutId, @@ -4682,7 +4684,103 @@ webodfcore.Async.destroyAll(cleanup, callback); }; + /** + * The link a node stands in, if any. + * @param {?Node} node + * @return {?Element} + */ + function linkOf(node) { + var walk = node; + while (walk && walk !== element) { + if (walk.nodeType === 1 + && /**@type{!Element}*/(walk).namespaceURI === textns + && /**@type{!Element}*/(walk).localName === "a") { + return /**@type{!Element}*/(walk); + } + walk = walk.parentNode; + } + return null; + } + /** + * The place of the document a name stands for: a bookmark, or the + * mark of a reference, as the entries of a table of contents name. + * @param {!string} name + * @return {?Element} + */ + function markNamed(name) { + var wanted = ["bookmark-start", "bookmark", "reference-mark-start", + "reference-mark"], + /**@type{!NodeList}*/ + marks, + /**@type{!number}*/ + i, + /**@type{!number}*/ + k; + if (!odfcontainer) { + return null; + } + for (k = 0; k < wanted.length; k += 1) { + marks = odfcontainer.rootElement.getElementsByTagNameNS(textns, + wanted[k]); + for (i = 0; i < marks.length; i += 1) { + if (/**@type{!Element}*/(marks.item(i)).getAttributeNS( + textns, + "name" + ) === name) { + return /**@type{!Element}*/(marks.item(i)); + } + } + } + return null; + } + /** + * Follow a link of the document: a place of the document is shown, + * and anything else is opened as a browser opens it. + * + * A reader of a document follows a link by clicking it, as a reader + * of a page does; an editor asks for a key beside the click, and + * takes this over, see "SessionController.js". + * @param {!Event} e + * @return {undefined} + */ + function followLink(e) { + var link = hyperlinksActive + ? linkOf(/**@type{?Node}*/(e.target)) + : null, + /**@type{!string}*/ + url = link + ? link.getAttributeNS(xlinkns, "href") || "" + : "", + /**@type{?Element}*/ + mark; + if (!url) { + return; + } + if (url.charAt(0) === "#") { + mark = markNamed(url.substring(1)); + if (mark) { + mark.scrollIntoView(true); + } + } else if (/^\s*(javascript|data):/.test(url)) { + runtime.log("WARN: potentially malicious URL ignored"); + } else { + runtime.getWindow().open(url); + } + if (e.preventDefault) { + e.preventDefault(); + } + } + /** + * Whether a click follows the links of the document, which a reader + * does and an editor does its own way. + * @param {!boolean} active + * @return {undefined} + */ + this.setHyperlinksActive = function (active) { + hyperlinksActive = active; + }; function init() { + listenEvent(element, "click", followLink); webodfcss = addWebODFStyleSheet(doc); pageSwitcher = new PageSwitcher(addStyleSheet(doc)); fontcss = addStyleSheet(doc); From 27d64e4f7253b36583d697c28e5cc03866899d99 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 344/385] Looked for a break of page inside what holds a paragraph. --- webodf/lib/odf/TextLayout.js | 49 +++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 66edbe8e3..c1ef53969 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2242,6 +2242,49 @@ odf.TextLayout = function TextLayout() { } return pages; } + /** + * Tell the browser which paragraphs are written on a new page. + * @param {!odf.ODFDocumentElement} odfroot + * @return {undefined} + */ + /** + * The first paragraph a node writes, or the node itself. + * + * A document holds its appendixes in a list, one to a list, so what asks + * for a page of its own is the paragraph inside it and not the list: the + * style of a list says nothing of the pages, and a break would be looked + * for where none is ever written. + * @param {!Element} element + * @return {!Element} + */ + function firstWritten(element) { + var walk = element; + while (walk.namespaceURI === textns + && (walk.localName === "list" + || walk.localName === "list-item" + || walk.localName === "section") + && walk.firstElementChild) { + walk = walk.firstElementChild; + } + return walk; + } + /** + * The last paragraph a node writes, or the node itself, see + * "firstWritten". + * @param {!Element} element + * @return {!Element} + */ + function lastWritten(element) { + var walk = element; + while (walk.namespaceURI === textns + && (walk.localName === "list" + || walk.localName === "list-item" + || walk.localName === "section") + && walk.lastElementChild) { + walk = walk.lastElementChild; + } + return walk; + } /** * Tell the browser which paragraphs are written on a new page. * @param {!odf.ODFDocumentElement} odfroot @@ -2258,9 +2301,9 @@ odf.TextLayout = function TextLayout() { node = node.nextElementSibling; } nodes.forEach(function (element, index) { - if (asksForABreak(odfroot, element, "break-before") - || (index > 0 && asksForABreak(odfroot, nodes[index - 1], - "break-after"))) { + if (asksForABreak(odfroot, firstWritten(element), "break-before") + || (index > 0 && asksForABreak(odfroot, + lastWritten(nodes[index - 1]), "break-after"))) { element.setAttributeNS(webodfhelperns, "webodfhelper:breakbefore", "true"); } else { From 0c7b0b19e852aca3e202f06f739bbb494e9dff94 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 345/385] Drawn the first pages as soon as they are broken, and grow the slices after. --- webodf/lib/odf/TextLayout.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 40d023d12..68ffbfa06 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2998,6 +2998,7 @@ odf.TextLayout = function TextLayout() { plan: plan, waiting: waiting, chunk: 8, + slice: 0, page: 0, top: 0, sheet: sheet, @@ -3243,7 +3244,7 @@ odf.TextLayout = function TextLayout() { * @return {undefined} */ function fillSlice(round) { - var end = new Date().getTime() + 150, + var end, /**@type{!PagePlan}*/ plan, /**@type{!number}*/ @@ -3252,11 +3253,20 @@ odf.TextLayout = function TextLayout() { || !fillingDiv) { return; } + // The first pages are drawn as soon as they are broken, one and then + // two, and the slices grow from there: a reader is given the head of + // a document to read while the rest of it is broken, rather than + // waiting on a slice of a document of eight hundred pages. The + // slices are of a time and not of a count, so that a page that is + // slow to break does not hold the browser. + end = new Date().getTime() + filling.slice; from = filling.page; while (filling.waiting.length > 0 && filling.page < maxPages - && new Date().getTime() < end) { + && (filling.page === from + || new Date().getTime() < end)) { fillOnePage(filling); } + filling.slice = Math.min(150, filling.slice * 2 + 10); columnPages = Math.max(1, filling.page); // The text is as tall as the pages it was broken into, so that what // is drawn after it stands under them. @@ -3482,6 +3492,7 @@ odf.TextLayout.TabStop; plan:!Object, waiting:!Array., chunk:!number, + slice:!number, page:!number, top:!number, sheet:!CSSStyleSheet, From 1fb5c0e548943f35c29fe9d42fefd16358ab325d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 346/385] Given a page of A4 where a master page names no layout. --- webodf/lib/odf/Style2CSS.js | 42 +++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index e7360b09c..e95ebd412 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -1269,6 +1269,42 @@ odf.Style2CSS = function Style2CSS() { sheet.insertRule(rule, sheet.cssRules.length); } + /** + * Give a page of a slide or of a drawing the size of A4, where the + * document says none. + * + * A master page names the layout that gives its pages their size, and a + * document need not write either: the standard names no size to fall + * back on, and an office draws such a page at the size of the paper of + * the place it is used in. A4 is taken here, which is the paper of every + * place but a handful, and the pages are drawn rather than left of no + * size at all. + * @param {!CSSStyleSheet} sheet + * @param {!odf.ODFDocumentElement} rootNode + * @return {undefined} + */ + function addPageSizeOfLastResort(sheet, rootNode) { + var masterStyles = rootNode.masterStyles, + /**@type{?Element}*/ + page, + /**@type{!string}*/ + name; + if (!masterStyles) { + return; + } + page = masterStyles.firstElementChild; + while (page) { + if (page.namespaceURI === stylens + && page.localName === "master-page" + && !page.getAttributeNS(stylens, "page-layout-name")) { + name = page.getAttributeNS(stylens, "name") || ""; + sheet.insertRule('draw|page[draw|master-page-name="' + name + + '"] {width:21.001cm;height:29.7cm;}', + sheet.cssRules.length); + } + page = page.nextElementSibling; + } + } /** * @param {!CSSStyleSheet} sheet * @param {!Element} node / @@ -1464,6 +1500,12 @@ odf.Style2CSS = function Style2CSS() { documentType = doctype; defaultFontSize = runtime.getWindow().getComputedStyle(document.body, null).getPropertyValue('font-size') || '12pt'; + // A page of a slide or of a drawing whose master page names no layout + // is drawn at the size of A4, or it would be drawn of no size at all. + if (doctype === "presentation" || doctype === "drawing") { + addPageSizeOfLastResort(stylesheet, rootNode); + } + // add the various styles for (family in familynamespaceprefixes) { if (familynamespaceprefixes.hasOwnProperty(family)) { From 4b650258504948375de9823d20e46fb46b739160 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 347/385] Asked for the fonts of the document before breaking it into pages. --- webodf/lib/odf/OdfCanvas.js | 51 +++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 69905c810..e342a8a25 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -3972,7 +3972,9 @@ */ function drawPages(container, odfnode) { var /**@type{?FontFaceSet}*/ - fonts; + fonts, + /**@type{!Array.}*/ + askedFonts = []; if (pagesDiv && pagesDiv.parentNode) { pagesDiv.parentNode.removeChild(pagesDiv); } @@ -4032,6 +4034,23 @@ // another font and hold a line too many, which is only seen when // the pages are all broken. The pages are set right as soon as // the fonts have truly landed, and not at the end of the whole. + // The engine is asked to load the fonts the document names, and + // not only to say when the ones it knows of are ready: an engine + // may hold a font ready before it draws with it, and the pages + // would be broken with the letters of another font. A font that + // never comes is waited on for a moment and no longer, as a + // document is better drawn late than never. + if (fonts && fonts.load) { + askedFonts = Object.keys(formatting.getFontMap()).map( + function (name) { + var family = formatting.getFontMap()[name]; + return fonts.load("12px " + (family || name)) + .then(null, function () { + return null; + }); + } + ); + } if (fonts && fonts.ready) { fonts.ready.then(function () { var tries = 20; @@ -4061,7 +4080,12 @@ whenBroken(); }); } - loadingQueue.whenDrained(function () { + /** + * Break the text into pages, once what it is drawn with is + * there. + * @return {undefined} + */ + function breakPages() { if (!paginated || !pagesDiv || !pagesDiv.parentNode) { return; } @@ -4080,6 +4104,29 @@ /**@type{!HTMLDivElement}*/(pagesDiv)); } }, 0); + } + // The text is broken once the fonts it is written in are loaded: + // a line is of another width until then, and the pages would be + // broken twice. A font that never comes is waited on for three + // seconds and no longer. + loadingQueue.whenDrained(function () { + var waited = false; + /** + * @return {undefined} + */ + function once() { + if (!waited) { + waited = true; + breakPages(); + } + } + if (askedFonts.length > 0 && runtime.getWindow().Promise) { + runtime.setTimeout(once, 3000); + runtime.getWindow().Promise.all(askedFonts).then(once, + once); + return; + } + once(); }); } /** From 4f5db0a6d634f49e9f9049160829d68483151955 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 348/385] Put a row of two pages in the middle and scaled it to the window. --- webodf/lib/odf/OdfCanvas.js | 7 +++++++ webodf/lib/odf/TextLayout.js | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 9ad660372..64077a86f 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -4133,6 +4133,13 @@ // every master shape relative to its slide text. Make the sizer the // containing block so the overlay always lines up with the slides. sizer.style.position = "relative"; + // The document stands against the left of the box it is drawn + // in, and the box itself is what a reader puts in the middle of + // its window: a reader that lays its own text in the middle would + // otherwise set the document in the middle of the box, and a row + // of two pages, which is wider than the document, would hang off + // to the right of it. + sizer.style.textAlign = "left"; // When the window is shrunk such that the // canvas container has a horizontal scrollbar, // zooming out seems to not make the scrollable diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 2525b3de7..7b7fd48f5 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3934,8 +3934,11 @@ odf.TextLayout = function TextLayout() { plan = new PagePlan(odfroot); markPageBreaks(odfroot); columnPageOrigins = []; + // A row of two pages is what is drawn and what a reader scales to its + // window, so the size given is the size of the row. columnPageSize = { - width: plan.at(0).pageWidth, + width: pagesPerRow * (plan.at(0).pageWidth + + plan.at(0).pageSeparation) - plan.at(0).pageSeparation, height: plan.at(0).pageHeight }; lastPlan = plan; From 5f8e2ccb2477da0950d7bf0d42a2e362cb7b51ad Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 349/385] Drawn a header in its style, and held a number away from its heading. --- webodf/lib/odf/ListStylesToCss.js | 73 ++++++++++++++++++++++++++++++- webodf/lib/odf/Style2CSS.js | 21 ++++++++- webodf/lib/odf/TextLayout.js | 12 +++++ 3 files changed, 104 insertions(+), 2 deletions(-) diff --git a/webodf/lib/odf/ListStylesToCss.js b/webodf/lib/odf/ListStylesToCss.js index c45786970..97cb22727 100644 --- a/webodf/lib/odf/ListStylesToCss.js +++ b/webodf/lib/odf/ListStylesToCss.js @@ -1077,6 +1077,75 @@ } } } + /** + * Hold the number of a heading away from what it names. + * + * A level of an outline says how wide its label stands and how far + * it stands from the text — "text:min-label-width" and + * "text:min-label-distance" — and a document that says neither + * writes a suffix instead: without any of the three the number of a + * chapter and its name run into one another, "1.2Terminology". + * @param {!CSSStyleSheet} styleSheet + * @param {(!Object.|undefined)} listStyles + * @return {undefined} + */ + function spaceHeadings(styleSheet, listStyles) { + var /**@type{?Element}*/ + outline = null, + /**@type{?Element}*/ + node, + /**@type{!function(!Element):undefined}*/ + spaceOneLevel; + if (!listStyles) { + return; + } + Object.keys(listStyles).forEach(function (name) { + if (!outline + && listStyles[name].element.localName + === "outline-style") { + outline = listStyles[name].element; + } + }); + if (!outline) { + return; + } + spaceOneLevel = function (/**@type{!Element}*/ level) { + var /**@type{?Element}*/ + props = level.firstElementChild, + /**@type{!string}*/ + which = level.getAttributeNS(textns, "level") || "", + /**@type{!string}*/ + width = props + ? props.getAttributeNS(textns, "min-label-width") || "" + : "", + /**@type{!string}*/ + gap = props + ? props.getAttributeNS(textns, "min-label-distance") + || "" + : "", + /**@type{!string}*/ + rule = ""; + if (!which) { + return; + } + if (width) { + rule += "min-width:" + convertToPxValue(width) + "px;"; + } + if (gap) { + rule += "padding-right:" + convertToPxValue(gap) + "px;"; + } + if (rule) { + appendRule(styleSheet, + 'text|h[odf-list-label][text|outline-level="' + which + + '"]:before{' + rule + '}'); + } + }; + node = /**@type{!Element}*/(outline).firstElementChild; + while (node) { + spaceOneLevel(node); + node = node.nextElementSibling; + } + } /** * Creates CSS styles from the given ODF list styles and applies them to the stylesheet * @param {!CSSStyleSheet} styleSheet @@ -1103,7 +1172,9 @@ numberLists(odfBody, styleFamilyTree); numberHeadings(odfBody, styleFamilyTree); appendRule(styleSheet, 'text|h[odf-list-label]:before' - + '{content: attr(odf-list-label); white-space: pre;}'); + + '{content: attr(odf-list-label); white-space: pre;' + + 'display: inline-block;}'); + spaceHeadings(styleSheet, styleFamilyTree); }; }; }()); diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index 6064ca293..2ecf2f926 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -1493,6 +1493,10 @@ odf.Style2CSS.stampOne = function (element) { var /**@type{!Array.}*/ written = [], named = odf.Style2CSS.styleNameAttributes, + /**@type{!Array.}*/ + stale, + /**@type{!number}*/ + borne, /**@type{!number}*/ i, /**@type{!string}*/ @@ -1503,7 +1507,22 @@ odf.Style2CSS.stampOne = function (element) { written.push(odf.Style2CSS.classOfStyle(named[i].prefix, name)); } } - written.forEach(function (attribute) { + // What was written for a name the element no longer carries is taken + // off: a header is drawn from a copy whose style was stamped by the + // canvas and named again after, and the attribute of the stamped name + // would stand beside the one of the true name. + stale = []; + borne = element.attributes.length; + for (i = 0; i < borne; i += 1) { + name = String(/**@type{!Attr}*/(element.attributes.item(i)).name); + if (name.indexOf("odf-") === 0 && written.indexOf(name) === -1) { + stale.push(name); + } + } + stale.forEach(function (/**@type{!string}*/ attribute) { + element.removeAttribute(attribute); + }); + written.forEach(function (/**@type{!string}*/ attribute) { if (!element.hasAttribute(attribute)) { element.setAttribute(attribute, ""); } diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index c1ef53969..28059bb29 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -1210,6 +1210,12 @@ odf.TextLayout = function TextLayout() { } box.appendChild(doc.importNode(source, true)); unstampStyleNames(odfroot, box); + // The name of the style is the one of the document again, so the + // attribute the rules of that style are written against is written + // anew: it carried the name the canvas stamped, that names nothing + // any more, and a header drawn without its style is drawn of the + // size of a text and no longer of eight points. + odf.Style2CSS.stampStyleClasses(box); expandSpaces(box); paragraphsOf(box).forEach(function (paragraph, index) { layOutTabStops(odfroot, paragraph); @@ -1458,6 +1464,12 @@ odf.TextLayout = function TextLayout() { /**@type{!HTMLElement}*/(box).style.width = width + "px"; box.appendChild(doc.importNode(source, true)); unstampStyleNames(odfroot, box); + // The name of the style is the one of the document again, so the + // attribute the rules of that style are written against is written + // anew: it carried the name the canvas stamped, that names nothing + // any more, and a header drawn without its style is drawn of the + // size of a text and no longer of eight points. + odf.Style2CSS.stampStyleClasses(box); expandSpaces(box); odfroot.body.appendChild(box); height = box.getBoundingClientRect().height; From 00eaea2931e44284d4a2d6751e75f8c6ff11bdf9 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 350/385] Numbered the chapters, that a document numbers by its outline style. --- webodf/lib/odf/ListStylesToCss.js | 71 +++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/webodf/lib/odf/ListStylesToCss.js b/webodf/lib/odf/ListStylesToCss.js index 9680cc29e..c45786970 100644 --- a/webodf/lib/odf/ListStylesToCss.js +++ b/webodf/lib/odf/ListStylesToCss.js @@ -837,9 +837,11 @@ * @param {!Element} style the "text:list-style" * @param {!number} level from one * @param {!Array.} held the number each level stands at + * @param {!Element=} where what carries the label, the first child + * of the item by default * @return {undefined} */ - function labelOne(item, style, level, held) { + function labelOne(item, style, level, held, where) { var rule = levelOfStyle(style, level), /**@type{!string}*/ written = "", @@ -853,7 +855,8 @@ format, /**@type{!number}*/ l; - if (!rule || rule.localName !== "list-level-style-number") { + if (!rule || (rule.localName !== "list-level-style-number" + && rule.localName !== "outline-level-style")) { return; } start = parseInt(item.getAttributeNS(textns, "start-value") @@ -881,7 +884,7 @@ } } written += rule.getAttributeNS(stylens, "num-suffix") || ""; - /**@type{!Element}*/(item.firstElementChild).setAttribute( + (where || /**@type{!Element}*/(item.firstElementChild)).setAttribute( "odf-list-label", written ); @@ -1015,6 +1018,65 @@ numberWhole(/**@type{!Element}*/(lists.item(i))); } } + /** + * Write on every heading the number of its chapter. + * + * A document numbers its chapters with an outline style, that names + * a way of writing the number of each level: it is not a list, and + * the headings that carry those numbers stand in no list. A heading + * that stands in a list is numbered by the list and left alone here. + * @param {!Element} odfBody + * @param {(!Object.|undefined)} listStyles + * @return {undefined} + */ + function numberHeadings(odfBody, listStyles) { + var headings = odfBody.getElementsByTagNameNS(textns, "h"), + /**@type{?Element}*/ + outline = null, + /**@type{!Array.}*/ + held = [], + /**@type{!number}*/ + level, + /**@type{?Element}*/ + parent, + /**@type{!Element}*/ + heading, + /**@type{!number}*/ + i; + if (!listStyles) { + return; + } + Object.keys(listStyles).forEach(function (name) { + if (!outline + && listStyles[name].element.localName + === "outline-style") { + outline = listStyles[name].element; + } + }); + if (!outline) { + return; + } + for (i = 0; i < headings.length; i += 1) { + heading = /**@type{!Element}*/(headings.item(i)); + parent = heading.parentElement; + level = parseInt(heading.getAttributeNS(textns, + "outline-level") || "1", 10); + if (isNaN(level) || level < 1) { + level = 1; + } + // A heading of a list is numbered by its list, and one that + // the document writes as the head of a list carries no + // number at all. + if (parent && parent.namespaceURI === textns + && parent.localName === "list-item") { + parent = null; + } else if (heading.getAttributeNS(textns, "is-list-header") + !== "true") { + labelOne(heading, /**@type{!Element}*/(outline), level, + held, heading); + } + } + } /** * Creates CSS styles from the given ODF list styles and applies them to the stylesheet * @param {!CSSStyleSheet} styleSheet @@ -1039,6 +1101,9 @@ applyContentBasedStyles(styleSheet, odfBody, styleFamilyTree); numberLists(odfBody, styleFamilyTree); + numberHeadings(odfBody, styleFamilyTree); + appendRule(styleSheet, 'text|h[odf-list-label]:before' + + '{content: attr(odf-list-label); white-space: pre;}'); }; }; }()); From d866e3465ebe09b63487039219e5f70591d684c5 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 351/385] Kept one way of setting the pages right when the fonts land. --- webodf/lib/odf/OdfCanvas.js | 28 ++++------------------------ webodf/lib/odf/TextLayout.js | 4 +--- 2 files changed, 5 insertions(+), 27 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 230de0db8..237a2b93c 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -4136,32 +4136,12 @@ ); } if (fonts && fonts.ready) { + // A font that lands after the pages are broken, which an + // engine may do whatever it was asked: the pages already + // drawn are set right as the next slice of them is drawn, + // see "TextLayout.js". fonts.ready.then(function () { - var tries = 20; - // The pages that were broken with the letters of another - // font are set right as the next slice is drawn, and not - // at the end of the whole text. textLayout.fontsChanged(); - /** - * @return {undefined} - */ - function whenBroken() { - if (!paginated || !pagesDiv || !pagesDiv.parentNode) { - return; - } - if (textLayout.isBreaking()) { - tries -= 1; - if (tries > 0) { - runtime.setTimeout(whenBroken, 250); - } - return; - } - if (!textLayout.pagesFit(odfnode)) { - textLayout.repair(odfnode, - /**@type{!HTMLDivElement}*/(pagesDiv)); - } - } - whenBroken(); }); } /** diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 9c2ecee12..c171f6d85 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -4264,9 +4264,7 @@ odf.TextLayout = function TextLayout() { } guard -= 1; // The notes of what was moved went with it, so the foot - // of the page is drawn again before it is read anew, and - // what the cut left holding nothing keeps no spacing. - unspaceEmptyTail(box); + // of the page is drawn again before it is read anew. layNotes(box); over = firstOverflowing(box); } From 05d23a9f9b5009d2f2733c6c18cd3a995b105d2d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 352/385] Set right only the pages of the slice that was drawn. --- webodf/lib/odf/TextLayout.js | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 7ddee145c..df0536fcf 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3979,9 +3979,10 @@ odf.TextLayout = function TextLayout() { * furniture is drawn, and what no longer fits is moved on by the trim. * @param {!PagePlan} plan * @param {!Array.} boxes + * @param {!number=} from the first page to size, from zero * @return {undefined} */ - function resizePages(plan, boxes) { + function resizePages(plan, boxes, from) { var doc = boxes.length > 0 ? /**@type{!Document}*/(boxes[0].ownerDocument) : null, @@ -3998,6 +3999,9 @@ odf.TextLayout = function TextLayout() { - dims.marginBottom) + "px", /**@type{!number}*/ room; + if (index < (from || 0)) { + return; + } if (page.style.height !== tall) { page.style.height = tall; } @@ -4221,8 +4225,8 @@ odf.TextLayout = function TextLayout() { // The pages are given the size the plan gives them before they are // read: the room the headers and the feet take was not known when // the first of them were filled. - resizePages(plan, boxes); - placePages(plan, boxes, 0); + resizePages(plan, boxes, from); + placePages(plan, boxes, from || 0); i = from || 0; while (i < boxes.length && boxes.length < maxPages) { if (!keepLast || i < boxes.length - 1) { From 7e029ce1655f46d42b8c1dbbe2b7e6f236b8a699 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 353/385] Added an entry to close the document to the menu of the file. --- .../assets/viewer.js | 17 +++++++++++++++ .../opendocumentviewer-desktop/mainwindow.cpp | 21 ++++++++++++++++++- .../opendocumentviewer-desktop/mainwindow.h | 5 +++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/programs/opendocumentviewer-desktop/assets/viewer.js b/programs/opendocumentviewer-desktop/assets/viewer.js index ec256d1b0..efdae60d0 100644 --- a/programs/opendocumentviewer-desktop/assets/viewer.js +++ b/programs/opendocumentviewer-desktop/assets/viewer.js @@ -116,6 +116,23 @@ canvas.load("odf:/document"); }, + /** + * Put the document away and show what the window shows with none. + * @return {undefined} + */ + unload: function () { + if (canvas) { + canvas.destroy(function () { + return; + }); + canvas = null; + container.innerHTML = ""; + } + failure.hidden = true; + message.hidden = false; + ways.hidden = false; + }, + /** * @param {!number} factor */ diff --git a/programs/opendocumentviewer-desktop/mainwindow.cpp b/programs/opendocumentviewer-desktop/mainwindow.cpp index 180d4adbc..20737bb96 100644 --- a/programs/opendocumentviewer-desktop/mainwindow.cpp +++ b/programs/opendocumentviewer-desktop/mainwindow.cpp @@ -165,7 +165,8 @@ MainWindow::MainWindow(QWidget* parent) view(new QWebEngineView(this)), server(new ViewerScheme(this)), keeper(new QTimer(this)), - reading(nullptr) { + reading(nullptr), + closeAction(nullptr) { QWebEngineProfile::defaultProfile()->installUrlSchemeHandler("odf", server); @@ -233,6 +234,11 @@ void MainWindow::createMenus() { this, &MainWindow::chooseDocument); openAction->setStatusTip(words::of("Read a document of the OpenDocument" " format", "Lire un document au format OpenDocument")); + closeAction = file->addAction(words::of("&Close", "&Fermer"), + QKeySequence::Close, this, &MainWindow::closeDocument); + closeAction->setStatusTip(words::of("Put the document away", + "Refermer le document")); + closeAction->setEnabled(false); file->addSeparator(); file->addAction(words::of("&Print…", "Im&primer…"), QKeySequence::Print, this, &MainWindow::printDocument); @@ -311,12 +317,25 @@ bool MainWindow::open(const QString& wanted) { setWindowTitle(info.fileName() + " — " + QApplication::applicationDisplayName()); statusBar()->showMessage(path); + closeAction->setEnabled(true); // The page reads the document at a single address, so it is told to read it // again rather than sent to another one. ask("load()"); return true; } +void MainWindow::closeDocument() { + if (path.isEmpty()) { + return; + } + path.clear(); + server->setPath(QString()); + closeAction->setEnabled(false); + setWindowTitle(QApplication::applicationDisplayName()); + statusBar()->clearMessage(); + ask("unload()"); +} + QString MainWindow::lastDirectory() const { // The directory of the last document, so that the next one is looked for // where the last one was found rather than where the program was started diff --git a/programs/opendocumentviewer-desktop/mainwindow.h b/programs/opendocumentviewer-desktop/mainwindow.h index 3f583ca5d..50b4e4688 100644 --- a/programs/opendocumentviewer-desktop/mainwindow.h +++ b/programs/opendocumentviewer-desktop/mainwindow.h @@ -29,6 +29,7 @@ #include class ViewerScheme; +class QAction; class QTimer; class QWebEngineView; @@ -60,6 +61,8 @@ class MainWindow : public QMainWindow { private slots: void chooseDocument(); + /** Put the document away, leaving the window as it opens with none. */ + void closeDocument(); /** Show the page that tells what the format is worth and what this does. */ void aboutFormat(); void exportPdf(); @@ -81,6 +84,8 @@ private slots: QTimer* keeper; /** The window of the page above, kept so that one is opened at a time. */ QWidget* reading; + /** Turned off while no document is open, as there is none to close. */ + QAction* closeAction; QString path; }; From ddad5e80c24a97e5281eaf5d8125f2cf53c78de3 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 354/385] Read a document one page at a time, or two as a book is read. --- .../assets/viewer.js | 16 +++++++++++++ .../opendocumentviewer-desktop/mainwindow.cpp | 22 ++++++++++++++++++ .../_locales/en/messages.json | 12 ++++++++++ .../_locales/fr/messages.json | 12 ++++++++++ programs/opendocumentviewer-webext/viewer.css | 8 +++++++ .../opendocumentviewer-webext/viewer.html | 11 +++++++++ programs/opendocumentviewer-webext/viewer.js | 23 +++++++++++++++++++ 7 files changed, 104 insertions(+) diff --git a/programs/opendocumentviewer-desktop/assets/viewer.js b/programs/opendocumentviewer-desktop/assets/viewer.js index 5423b48ba..05ad95511 100644 --- a/programs/opendocumentviewer-desktop/assets/viewer.js +++ b/programs/opendocumentviewer-desktop/assets/viewer.js @@ -133,6 +133,22 @@ if (canvas) { canvas.fitToWidth(available()); } + }, + + /** + * How the pages are laid out: one to a row, as a document is + * scrolled; two to a row, as a book is read; or two to a row with + * the first on the right of its own, as the first page of a book + * faces nothing. + * @param {!number} perRow one or two + * @param {!boolean} firstAlone + * @return {undefined} + */ + setPages: function (perRow, firstAlone) { + if (canvas) { + canvas.setPagesPerRow(perRow); + canvas.setFirstPageOnItsOwn(firstAlone); + } } }; }()); diff --git a/programs/opendocumentviewer-desktop/mainwindow.cpp b/programs/opendocumentviewer-desktop/mainwindow.cpp index ac09f7ca1..180d4adbc 100644 --- a/programs/opendocumentviewer-desktop/mainwindow.cpp +++ b/programs/opendocumentviewer-desktop/mainwindow.cpp @@ -50,6 +50,7 @@ #include #include #include +#include #include #include @@ -254,6 +255,27 @@ void MainWindow::createMenus() { display->addAction(words::of("Fit to &width", "Ajuster à la &largeur"), QKeySequence(Qt::CTRL | Qt::Key_9), this, [this] { ask("fit()"); }); + // How the pages are laid out: one under another as a document is + // scrolled, or two beside one another as a book is read, where the first + // page faces nothing of its own. + display->addSeparator(); + QActionGroup* const rows = new QActionGroup(this); + QAction* const onePage = display->addAction( + words::of("&One page", "Une &page"), this, + [this] { ask("setPages(1, false)"); }); + QAction* const twoPages = display->addAction( + words::of("&Two pages", "&Deux pages"), this, + [this] { ask("setPages(2, false)"); }); + QAction* const twoPagesRight = display->addAction( + words::of("Two pages, first on the &right", + "Deux pages, la p&remière à droite"), this, + [this] { ask("setPages(2, true)"); }); + for (QAction* const one : {onePage, twoPages, twoPagesRight}) { + one->setCheckable(true); + rows->addAction(one); + } + onePage->setChecked(true); + QMenu* const help = menuBar()->addMenu(words::of("&Help", "Aid&e")); help->addAction(words::of("About &OpenDocument and this viewer", "À propos d’&OpenDocument et du lecteur"), diff --git a/programs/opendocumentviewer-webext/_locales/en/messages.json b/programs/opendocumentviewer-webext/_locales/en/messages.json index 870486628..44db71c16 100644 --- a/programs/opendocumentviewer-webext/_locales/en/messages.json +++ b/programs/opendocumentviewer-webext/_locales/en/messages.json @@ -18,5 +18,17 @@ "about": { "message": "About this viewer", "description": "The entry of the menu of the viewer that leads to the page of the welcome." + }, + "onePage": { + "message": "One page", + "description": "The entry of the menu that lays the pages one under another." + }, + "twoPages": { + "message": "Two pages", + "description": "The entry of the menu that lays the pages two to a row." + }, + "twoPagesRight": { + "message": "Two pages, first on the right", + "description": "The entry of the menu that lays the pages two to a row, the first one alone on the right." } } diff --git a/programs/opendocumentviewer-webext/_locales/fr/messages.json b/programs/opendocumentviewer-webext/_locales/fr/messages.json index 530f0c763..331c8b5d5 100644 --- a/programs/opendocumentviewer-webext/_locales/fr/messages.json +++ b/programs/opendocumentviewer-webext/_locales/fr/messages.json @@ -18,5 +18,17 @@ "about": { "message": "À propos de ce lecteur", "description": "The entry of the menu of the viewer that leads to the page of the welcome." + }, + "onePage": { + "message": "Une page", + "description": "L’entrée du menu qui dispose les pages l’une sous l’autre." + }, + "twoPages": { + "message": "Deux pages", + "description": "L’entrée du menu qui dispose les pages deux par rangée." + }, + "twoPagesRight": { + "message": "Deux pages, la première à droite", + "description": "L’entrée du menu qui dispose les pages deux par rangée, la première seule à droite." } } diff --git a/programs/opendocumentviewer-webext/viewer.css b/programs/opendocumentviewer-webext/viewer.css index 12761382f..2e662bc74 100644 --- a/programs/opendocumentviewer-webext/viewer.css +++ b/programs/opendocumentviewer-webext/viewer.css @@ -145,3 +145,11 @@ div#menu > #openlabel:focus-within { padding: 0; } } + +/* The parts of the menu are told apart by a line: what is done with the + document, how it is laid out, and what the viewer is. */ +div#menu > hr.parting { + border: 0; + border-top: 1px solid rgba(0, 0, 0, 0.2); + margin: 0.25em 0; +} diff --git a/programs/opendocumentviewer-webext/viewer.html b/programs/opendocumentviewer-webext/viewer.html index 92de6a9fb..1ab2e41ca 100644 --- a/programs/opendocumentviewer-webext/viewer.html +++ b/programs/opendocumentviewer-webext/viewer.html @@ -25,6 +25,17 @@ +


+ + + + +
About this viewer diff --git a/programs/opendocumentviewer-webext/viewer.js b/programs/opendocumentviewer-webext/viewer.js index 530060b4a..d7431f39a 100644 --- a/programs/opendocumentviewer-webext/viewer.js +++ b/programs/opendocumentviewer-webext/viewer.js @@ -155,6 +155,29 @@ api.runtime.getURL("welcome." + language + ".html"); }()); + // How the pages are laid out, which the menu asks of the canvas: one + // page under another as a document is scrolled, two beside one another as + // a book is read, and the first of them alone on the right where a book + // begins on a right page. + (function () { + var ways = [ + {id: "onepage", perRow: 1, alone: false}, + {id: "twopages", perRow: 2, alone: false}, + {id: "twopagesright", perRow: 2, alone: true} + ]; + ways.forEach(function (way) { + var entry = document.getElementById(way.id); + if (!entry) { + return; + } + entry.addEventListener("click", function () { + canvas.setPagesPerRow(way.perRow); + canvas.setFirstPageOnItsOwn(way.alone); + showMenu(false); + }); + }); + }()); + menubutton.addEventListener("click", function (event) { event.stopPropagation(); showMenu(menu.hidden); From 8c093fcec56fe747d96d3f18525178f71af8195e Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 355/385] Taken the measures a layout leans on out of the layout itself. --- webodf/lib/manifest.json | 4 + webodf/lib/odf/PageMeasure.js | 602 ++++++++++++++++++++++++++++++++++ webodf/lib/odf/TextLayout.js | 583 ++------------------------------ webodf/tools/karma.conf.js | 1 + 4 files changed, 636 insertions(+), 554 deletions(-) create mode 100644 webodf/lib/odf/PageMeasure.js diff --git a/webodf/lib/manifest.json b/webodf/lib/manifest.json index ca381d31f..654d587df 100644 --- a/webodf/lib/manifest.json +++ b/webodf/lib/manifest.json @@ -254,6 +254,9 @@ "odf.PageLayoutProperties": [ "odf.StyleParseUtils" ], + "odf.PageMeasure": [ + "odf.Namespaces" + ], "odf.ParagraphProperties": [ "odf.StyleParseUtils" ], @@ -285,6 +288,7 @@ "odf.Namespaces" ], "odf.TextLayout": [ + "odf.PageMeasure", "odf.Style2CSS" ], "odf.TextProperties": [ diff --git a/webodf/lib/odf/PageMeasure.js b/webodf/lib/odf/PageMeasure.js new file mode 100644 index 000000000..892d67d52 --- /dev/null +++ b/webodf/lib/odf/PageMeasure.js @@ -0,0 +1,602 @@ +/** + * Copyright (C) 2014 KO GmbH + * + * @licstart + * This file is part of WebODF. + * + * WebODF is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License (GNU AGPL) + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * WebODF is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with WebODF. If not, see . + * @licend + * + * @source: http://www.webodf.org/ + * @source: https://github.com/webodf/WebODF/ + */ + + + + +/*global odf, runtime, Node*/ + +/** + * What a page holds and where it ends: the measures a layout leans on, and + * the cuts it makes by them. + * + * Nothing here knows of the layout that is under way: each function is given + * the page and the nodes it works on and answers of those alone. What breaks + * a text into pages, and what is drawn around them, is in "TextLayout.js". + * @constructor + */ +odf.PageMeasureImpl = function PageMeasureImpl() { + "use strict"; + var /**@const@type{!string}*/ + drawns = odf.Namespaces.drawns, + /**@const@type{!string}*/ + tablens = odf.Namespaces.tablens, + /**@const@type{!string}*/ + textns = odf.Namespaces.textns, + /**@const@type{!string}*/ + webodfhelperns = "urn:webodf:names:helper"; + /** + * How many lines a paragraph is written over. + * + * The lines of a paragraph are the rectangles of the text it holds, of + * which there may be more than one to a line where the line holds text + * of more than one style: those that begin at the same height are of + * one line. + * @param {!Element} element + * @return {!number} + */ + function linesOf(element) { + var doc = /**@type{!Document}*/(element.ownerDocument), + range = doc.createRange(), + /**@type{!Object.}*/ + tops = {}, + /**@type{!ClientRectList}*/ + rects, + /**@type{!number}*/ + i; + range.selectNodeContents(element); + rects = range.getClientRects(); + for (i = 0; i < rects.length; i += 1) { + tops[String(Math.round(rects.item(i).top))] = true; + } + return Object.keys(tops).length; + } + /** + * The number a style asks for, or the one that stands for none. + * @param {!string} said + * @param {!number} fallback + * @return {!number} + */ + function askedNumber(said, fallback) { + var read = parseInt(said, 10); + return isNaN(read) || read < 1 + ? fallback + : read; + } + /** + * Whether a paragraph that was cut in two is cut where an office would + * cut it. + * + * An office leaves no line of a paragraph alone at the foot of a page, + * nor alone at the head of the next: "fo:orphans" says how many lines + * are kept at the foot and "fo:widows" how many at the head, and + * "fo:keep-together" says that the paragraph is not cut at all. They are + * read from the style the browser worked out, as the sheet of the + * document carries them under the names css gives them. + * @param {!Element} element what is left on the page + * @param {!number} whole how many lines it held before it was cut + * @return {!boolean} + */ + function cutWhereAnOfficeWould(element, whole) { + var style = runtime.getWindow().getComputedStyle(element), + /**@type{!number}*/ + head, + /**@type{!number}*/ + tail; + if (!style) { + return true; + } + if (style.getPropertyValue("break-inside") === "avoid") { + return false; + } + // The lines an office keeps together are the lines of a paragraph: a + // section, a list or a table of contents is cut wherever a paragraph + // of it may be cut, and the rule of the orphans is read of that + // paragraph and not of the whole of what holds it. + if (element.namespaceURI !== textns + || (element.localName !== "p" && element.localName !== "h")) { + return true; + } + head = linesOf(element); + tail = whole - head; + if (tail < 1) { + return true; + } + return head >= askedNumber(style.getPropertyValue("orphans"), 2) + && tail >= askedNumber(style.getPropertyValue("widows"), 2); + } + /** + * Whether a paragraph is written on the page of the one that follows it. + * + * "fo:keep-with-next" says it of a heading, that an office never leaves + * alone at the foot of a page. It is read from the style the browser + * worked out, under the name css gives it. + * @param {!Element} element + * @return {!boolean} + */ + function keepsWithWhatFollows(element) { + var style = runtime.getWindow().getComputedStyle(element); + return style + ? style.getPropertyValue("break-after") === "avoid" + : false; + } + /** + * Whether anything that is seen is written on a page before a node. + * @param {!Element} box + * @param {!Node} node + * @return {!boolean} + */ + function anythingBefore(box, node) { + var doc = /**@type{!Document}*/(box.ownerDocument), + range; + if (!box.firstChild || box.firstChild === node) { + return false; + } + range = doc.createRange(); + range.setStartBefore(/**@type{!Node}*/(box.firstChild)); + range.setEndBefore(node); + return range.getBoundingClientRect().height > 1; + } + /** + * Whether a page holds anything that is seen. + * + * A page may hold the leftover of what was cut at the end of the page + * before it and draw nothing of it — an empty table of contents, a + * section that holds no more text: what asks to be written on a new page + * is written on this one all the same, as the page is empty to a reader. + * @param {!Element} box + * @return {!boolean} + */ + function holdsSomething(box) { + var doc = /**@type{!Document}*/(box.ownerDocument), + range; + if (!box.firstChild) { + return false; + } + range = doc.createRange(); + range.setStartBefore(/**@type{!Node}*/(box.firstChild)); + range.setEndAfter(/**@type{!Node}*/(box.lastChild)); + return range.getBoundingClientRect().height > 1; + } + /** + * Write a page in the columns its layout asks for. + * @param {!Element} box the page + * @param {!{columnCount:!number,columnGap:!number}} dims what the layout + * of the page says of its columns + * @return {undefined} + */ + function setColumns(box, dims) { + if (dims.columnCount > 1) { + /**@type{!HTMLElement}*/(box).style.setProperty("column-count", + String(dims.columnCount)); + /**@type{!HTMLElement}*/(box).style.setProperty("column-gap", + dims.columnGap + "px"); + } + } + /** + * Whether a page is written in more than one column. + * @param {!Element} box the page + * @return {!boolean} + */ + function holdsColumns(box) { + var count = /**@type{!HTMLElement}*/(box).style + .getPropertyValue("column-count"); + return count !== "" && count !== "1" && count !== "auto"; + } + /** + * Where the text of a page ends. + * + * The notes of the foot of a page are drawn in the padding at the foot of + * the box, so the text ends where that padding begins and not at the edge + * of the box. + * @param {!Element} box the page + * @return {!number} + */ + function edgeOf(box) { + return box.getBoundingClientRect().bottom + - (parseFloat(/**@type{!HTMLElement}*/(box).style.paddingBottom) + || 0); + } + /** + * Where the last column of a page ends. + * + * A page written in columns is filled from the foot of one column to the + * head of the next, so what does not fit stands to the right of the last + * column and not under the text. + * @param {!Element} box the page + * @return {!number} + */ + function rightEdgeOf(box) { + return box.getBoundingClientRect().right + - (parseFloat(/**@type{!HTMLElement}*/(box).style.paddingRight) + || 0); + } + /** + * A range that holds one node. + * @param {!Document} doc + * @param {!Node} node + * @return {!Range} + */ + function rangeOf(doc, node) { + var range = doc.createRange(); + range.selectNode(node); + return range; + } + /** + * The first thing on a page that crosses the end of it, if any. + * + * The last thing on a page is not always the lowest of them: a frame set + * against the page stands where the page says, and it may stand high on + * a page it was written at the foot of. + * @param {!Element} box the page + * @return {?Element} + */ + function firstOverflowing(box) { + var edge = edgeOf(box), + /**@type{!boolean}*/ + columns = holdsColumns(box), + /**@type{!number}*/ + side = rightEdgeOf(box), + /**@type{?Element}*/ + node = box.firstElementChild, + /**@type{!ClientRect}*/ + rect; + while (node) { + rect = node.getBoundingClientRect(); + if (node.className !== "webodf-pageNotes" + && (rect.height > 0 || rect.width > 0) + && (columns + ? rect.right > side + 1 + : rect.bottom > edge + 1)) { + return node; + } + node = node.nextElementSibling; + } + return null; + } + /** + * Whether an element is drawn out of the flow of the text. + * + * A frame anchored to the page is set against the page and stands where + * the page says, so it is not read with what follows the text: the + * browser is asked, and only of the few elements that may be so. + * @param {!Element} element + * @return {!boolean} + */ + function isOutOfFlow(element) { + var style; + if (element.namespaceURI !== drawns) { + return false; + } + style = runtime.getWindow().getComputedStyle(element); + return style + ? style.position === "absolute" || style.position === "fixed" + : false; + } + /** + * How many of the nodes a page was given stand within it. + * + * The nodes are read where they stand and none of them is moved, so the + * page is laid out once for the whole of the reading: what is read after + * something is written is laid out anew, and taking the nodes back one + * at a time lays the page out once for each of them. + * @param {!Element} box + * @param {!Array.} added the nodes that were written on the page + * @return {!number} how many of them the page holds + */ + function firstOver(box, added) { + var doc = /**@type{!Document}*/(box.ownerDocument), + edge = box.getBoundingClientRect().bottom, + range = doc.createRange(), + /**@type{!ClientRect}*/ + rect, + /**@type{!number}*/ + i; + for (i = 0; i < added.length; i += 1) { + range.setStartBefore(added[i]); + range.setEndAfter(added[i]); + rect = range.getBoundingClientRect(); + if ((rect.height > 0 || rect.width > 0) && rect.bottom > edge + 1) { + return i; + } + } + return added.length; + } + /** + * Whether what a box holds is taller than the box. + * @param {!Element} box + * @param {?Node=} from the first node to read, the head of the box by + * default: what stands before it was read already. + * @return {!boolean} + */ + function overflows(box, from) { + var doc = /**@type{!Document}*/(box.ownerDocument), + /**@type{!number}*/ + edge = edgeOf(box), + /**@type{!boolean}*/ + columns = holdsColumns(box), + /**@type{!number}*/ + side = rightEdgeOf(box), + /**@type{?Node}*/ + last = box.lastElementChild + && box.lastElementChild.className === "webodf-pageNotes" + ? box.lastElementChild.previousSibling + : box.lastChild, + /**@type{?Node}*/ + node = from || box.firstChild, + range = doc.createRange(), + /**@type{!ClientRect}*/ + rect; + // Every child is read and not the last of them alone: a frame set + // against the page stands where the page says, so the last child of + // a page is not always the lowest of them. + // + // What was measured before and held is not measured again: a node + // that is written after another does not move it, so a page that is + // filled a few nodes at a time is read from the first of them and + // not from the head of the page, which would read a page of a + // hundred nodes a hundred times over. + if (!node) { + return false; + } + // The nodes are read in one measure and not one by one: a range that + // holds them all answers with the rectangle that holds what they are + // drawn as, which is the one the page is read against. A page filled + // by chunks of sixty-four nodes is measured once for the chunk and + // not sixty-four times. + if (!last) { + return false; + } + range.setStartBefore(node); + range.setEndAfter(last); + rect = range.getBoundingClientRect(); + if ((rect.height > 0 || rect.width > 0) + && (columns + ? rect.right > side + 1 + : rect.bottom > edge + 1)) { + return true; + } + // What is drawn out of the flow of the text — a frame set against the + // page — stands where the page says and is none of the range: those + // are read on their own, and there are few of them. + while (node) { + if (node.nodeType === Node.ELEMENT_NODE + && isOutOfFlow(/**@type{!Element}*/(node))) { + rect = /**@type{!Element}*/(node).getBoundingClientRect(); + if ((rect.height > 0 || rect.width > 0) + && rect.bottom > edge + 1) { + return true; + } + } + node = node.nextSibling; + } + return false; + } + /** + * Cut a text node where the page ends, and answer what is left of it. + * @param {!Element} box the page + * @param {!Text} node + * @param {!boolean} alone whether the page holds nothing else + * @return {?Text} what did not fit, or nothing if all of it fits + */ + function cutText(box, node, alone) { + var doc = /**@type{!Document}*/(box.ownerDocument), + range = doc.createRange(), + bottom = box.getBoundingClientRect().bottom, + /**@type{!number}*/ + low = 0, + /**@type{!number}*/ + high = node.length, + /**@type{!number}*/ + middle; + // The letter the page ends at is looked for by halving: the text up + // to it is measured, and the half that holds the end is kept. + while (low + 1 < high) { + middle = Math.floor((low + high) / 2); + range.setStart(node, 0); + range.setEnd(node, middle); + if (range.getBoundingClientRect().bottom <= bottom) { + low = middle; + } else { + high = middle; + } + } + if (low >= node.length) { + return null; + } + if (low === 0 && !alone) { + // Not a word of it fits on what is left of the page, so all of + // it is written on the next one: a page that holds nothing else + // keeps a letter of it all the same, or the text would be sent + // from page to page for ever. + return node.splitText(0); + } + // The cut is made at the last blank before the letter, so that a + // word is not written half on one page and half on the next. Where + // there is no blank to cut at, the whole of it is written on the + // page that follows: a page that ended with the "A" of "Appendix" + // and gave "ppendix" to the next is no page of a document. A page + // that holds nothing else cuts all the same, or the text would be + // sent from page to page for ever. + middle = String(node.data).lastIndexOf(" ", low); + if (middle <= 0) { + // Nothing of the word fits: the whole of it is written on the + // page that follows, unless the page holds nothing that is seen + // before it, where a page would else be left empty and the word + // sent on for ever. + return anythingBefore(box, node) + ? node.splitText(0) + : node.splitText(Math.max(1, low)); + } + return node.splitText(middle + 1); + } + /** + * How many nodes a node holds, counted no further than a bound. + * @param {!Node} node + * @param {!number} bound + * @return {!number} + */ + function nodesIn(node, bound) { + var count = 1, + /**@type{?Node}*/ + child = node.firstChild; + while (child && count < bound) { + count += nodesIn(child, bound - count); + child = child.nextSibling; + } + return count; + } + /** + * Take out of an element everything past the first so many nodes. + * + * A document holds elements that hold thousands of nodes: a table of + * contents is one of them, and a page of it was written by measuring the + * whole of what was left, page after page. The element is parted in two + * beforehand, by counting and not by measuring, so that a page is drawn + * against what a page may hold and not against everything that is left + * to write. + * + * What is taken out is put in a copy of the element, as a cut does, so + * that it is written in the style it was written in. + * @param {!Element} element + * @param {!number} bound how many nodes are left in it + * @return {?Element} what was taken out, or null where it held less + */ + function splitOff(element, bound) { + var count = 1, + /**@type{?Node}*/ + node = element.firstChild, + /**@type{!Element}*/ + tail = /**@type{!Element}*/(element.cloneNode(false)), + /**@type{?Element}*/ + inner, + /**@type{?Node}*/ + next; + tail.setAttributeNS(webodfhelperns, "webodfhelper:continued", "true"); + while (node && count < bound) { + count += nodesIn(node, bound - count); + if (count >= bound && node.firstChild + && node.nodeType === Node.ELEMENT_NODE) { + // The bound falls inside this one: what it holds past the + // bound is taken out of it in the same way. + inner = splitOff(/**@type{!Element}*/(node), bound); + if (inner) { + tail.appendChild(inner); + } + node = node.nextSibling; + break; + } + node = node.nextSibling; + } + while (node) { + next = node.nextSibling; + tail.appendChild(node); + node = next; + } + return tail.firstChild + ? tail + : null; + } + /** + * Whether what was cut off an element holds nothing worth a page. + * + * An element that is cut may leave a copy that holds no word and no + * shape of its own: the empty paragraph of a table of contents, for one. + * It is thrown away rather than written, as it would take the room of + * its spacings on the page that follows and leave a page half empty. + * @param {?Element} tail what was cut off + * @return {!boolean} + */ + function holdsNothing(tail) { + if (!tail) { + return true; + } + if (String(tail.textContent).trim() !== "") { + return false; + } + // A frame, an image or a shape is drawn although it holds no word. + return tail.getElementsByTagNameNS(drawns, "frame").length === 0 + && tail.getElementsByTagNameNS(drawns, "image").length === 0 + && tail.getElementsByTagNameNS(tablens, "table").length === 0; + } + /** + * Take the spacings from what a page ends on and that holds nothing. + * + * Cutting a paragraph between two of its words may leave nothing of it on + * the page it was cut on: the empty paragraph is drawn as its spacings + * and no more, and in a box that lays its children in a column those + * spacings are not folded into the edge of the box, so the page is a few + * pixels too full and the line above is moved on for nothing. + * @param {!Element} box the page + * @return {undefined} + */ + function unspaceEmptyTail(box) { + var node = box.lastElementChild, + /**@type{!number}*/ + guard = 8; + // The last thing on the page is looked for, and then everything it + // stands in that holds nothing either: a paragraph left empty by a + // cut holds the box its tabs were laid in, which is empty as well. + while (node && node.lastElementChild && guard > 0) { + node = node.lastElementChild; + guard -= 1; + } + guard = 8; + while (node && node !== box && guard > 0 + && node.getBoundingClientRect().height === 0) { + // An element of the document is of no namespace of html, where + // the browser leaves a "style" attribute alone: it is marked + // instead, and the rule of the mark takes its spacings away. + node.setAttributeNS(webodfhelperns, "webodfhelper:spaceless", + "true"); + node = node.parentElement; + guard -= 1; + } + } + this.rangeOf = rangeOf; + this.edgeOf = edgeOf; + this.rightEdgeOf = rightEdgeOf; + this.linesOf = linesOf; + this.askedNumber = askedNumber; + this.cutWhereAnOfficeWould = cutWhereAnOfficeWould; + this.keepsWithWhatFollows = keepsWithWhatFollows; + this.anythingBefore = anythingBefore; + this.holdsSomething = holdsSomething; + this.holdsNothing = holdsNothing; + this.isOutOfFlow = isOutOfFlow; + this.holdsColumns = holdsColumns; + this.setColumns = setColumns; + this.nodesIn = nodesIn; + this.splitOff = splitOff; + this.firstOverflowing = firstOverflowing; + this.firstOver = firstOver; + this.overflows = overflows; + this.cutText = cutText; + this.unspaceEmptyTail = unspaceEmptyTail; +}; + +/** + * @type {!odf.PageMeasureImpl} + */ +odf.PageMeasure = new odf.PageMeasureImpl(); diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index c171f6d85..e3cfd20a7 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -29,7 +29,9 @@ */ odf.TextLayout = function TextLayout() { "use strict"; - var /**@type{?odf.ODFDocumentElement}*/ + var /**@const@type{!odf.PageMeasureImpl}*/ + measure = odf.PageMeasure, + /**@type{?odf.ODFDocumentElement}*/ styleCacheRoot = null, /**@type{!Object.}*/ styleCache = {}, @@ -2462,139 +2464,6 @@ odf.TextLayout = function TextLayout() { } }); } - /** - * How many lines a paragraph is written over. - * - * The lines of a paragraph are the rectangles of the text it holds, of - * which there may be more than one to a line where the line holds text - * of more than one style: those that begin at the same height are of - * one line. - * @param {!Element} element - * @return {!number} - */ - function linesOf(element) { - var doc = /**@type{!Document}*/(element.ownerDocument), - range = doc.createRange(), - /**@type{!Object.}*/ - tops = {}, - /**@type{!ClientRectList}*/ - rects, - /**@type{!number}*/ - i; - range.selectNodeContents(element); - rects = range.getClientRects(); - for (i = 0; i < rects.length; i += 1) { - tops[String(Math.round(rects.item(i).top))] = true; - } - return Object.keys(tops).length; - } - /** - * The number a style asks for, or the one that stands for none. - * @param {!string} said - * @param {!number} fallback - * @return {!number} - */ - function askedNumber(said, fallback) { - var read = parseInt(said, 10); - return isNaN(read) || read < 1 - ? fallback - : read; - } - /** - * Whether a paragraph that was cut in two is cut where an office would - * cut it. - * - * An office leaves no line of a paragraph alone at the foot of a page, - * nor alone at the head of the next: "fo:orphans" says how many lines - * are kept at the foot and "fo:widows" how many at the head, and - * "fo:keep-together" says that the paragraph is not cut at all. They are - * read from the style the browser worked out, as the sheet of the - * document carries them under the names css gives them. - * @param {!Element} element what is left on the page - * @param {!number} whole how many lines it held before it was cut - * @return {!boolean} - */ - function cutWhereAnOfficeWould(element, whole) { - var style = runtime.getWindow().getComputedStyle(element), - /**@type{!number}*/ - head, - /**@type{!number}*/ - tail; - if (!style) { - return true; - } - if (style.getPropertyValue("break-inside") === "avoid") { - return false; - } - // The lines an office keeps together are the lines of a paragraph: a - // section, a list or a table of contents is cut wherever a paragraph - // of it may be cut, and the rule of the orphans is read of that - // paragraph and not of the whole of what holds it. - if (element.namespaceURI !== textns - || (element.localName !== "p" && element.localName !== "h")) { - return true; - } - head = linesOf(element); - tail = whole - head; - if (tail < 1) { - return true; - } - return head >= askedNumber(style.getPropertyValue("orphans"), 2) - && tail >= askedNumber(style.getPropertyValue("widows"), 2); - } - /** - * Whether a paragraph is written on the page of the one that follows it. - * - * "fo:keep-with-next" says it of a heading, that an office never leaves - * alone at the foot of a page. It is read from the style the browser - * worked out, under the name css gives it. - * @param {!Element} element - * @return {!boolean} - */ - function keepsWithWhatFollows(element) { - var style = runtime.getWindow().getComputedStyle(element); - return style - ? style.getPropertyValue("break-after") === "avoid" - : false; - } - /** - * Whether anything that is seen is written on a page before a node. - * @param {!Element} box - * @param {!Node} node - * @return {!boolean} - */ - function anythingBefore(box, node) { - var doc = /**@type{!Document}*/(box.ownerDocument), - range; - if (!box.firstChild || box.firstChild === node) { - return false; - } - range = doc.createRange(); - range.setStartBefore(/**@type{!Node}*/(box.firstChild)); - range.setEndBefore(node); - return range.getBoundingClientRect().height > 1; - } - /** - * Whether a page holds anything that is seen. - * - * A page may hold the leftover of what was cut at the end of the page - * before it and draw nothing of it — an empty table of contents, a - * section that holds no more text: what asks to be written on a new page - * is written on this one all the same, as the page is empty to a reader. - * @param {!Element} box - * @return {!boolean} - */ - function holdsSomething(box) { - var doc = /**@type{!Document}*/(box.ownerDocument), - range; - if (!box.firstChild) { - return false; - } - range = doc.createRange(); - range.setStartBefore(/**@type{!Node}*/(box.firstChild)); - range.setEndAfter(/**@type{!Node}*/(box.lastChild)); - return range.getBoundingClientRect().height > 1; - } /** * Whether a node was marked as beginning a page of its own. * @param {!Node} node @@ -2707,58 +2576,6 @@ odf.TextLayout = function TextLayout() { sheet.cssRules.length); }); } - /** - * Write a page in the columns its layout asks for. - * @param {!Element} box the page - * @param {!odf.TextLayout.PageDimensions} dims - * @return {undefined} - */ - function setColumns(box, dims) { - if (dims.columnCount > 1) { - /**@type{!HTMLElement}*/(box).style.setProperty("column-count", - String(dims.columnCount)); - /**@type{!HTMLElement}*/(box).style.setProperty("column-gap", - dims.columnGap + "px"); - } - } - /** - * Whether a page is written in more than one column. - * @param {!Element} box the page - * @return {!boolean} - */ - function holdsColumns(box) { - var count = /**@type{!HTMLElement}*/(box).style - .getPropertyValue("column-count"); - return count !== "" && count !== "1" && count !== "auto"; - } - /** - * Where the text of a page ends. - * - * The notes of the foot of a page are drawn in the padding at the foot of - * the box, so the text ends where that padding begins and not at the edge - * of the box. - * @param {!Element} box the page - * @return {!number} - */ - function edgeOf(box) { - return box.getBoundingClientRect().bottom - - (parseFloat(/**@type{!HTMLElement}*/(box).style.paddingBottom) - || 0); - } - /** - * Where the last column of a page ends. - * - * A page written in columns is filled from the foot of one column to the - * head of the next, so what does not fit stands to the right of the last - * column and not under the text. - * @param {!Element} box the page - * @return {!number} - */ - function rightEdgeOf(box) { - return box.getBoundingClientRect().right - - (parseFloat(/**@type{!HTMLElement}*/(box).style.paddingRight) - || 0); - } /** * Draw a table that is wider than the text to the width of the text. * @@ -2771,7 +2588,7 @@ odf.TextLayout = function TextLayout() { function fitTables(box) { var found = box.getElementsByTagNameNS(tablens, "table"), /**@type{!number}*/ - side = rightEdgeOf(box), + side = measure.rightEdgeOf(box), /**@type{!Element}*/ table, /**@type{!number}*/ @@ -2928,225 +2745,6 @@ odf.TextLayout = function TextLayout() { text.removeChild(box); }); } - /** - * A range that holds one node. - * @param {!Document} doc - * @param {!Node} node - * @return {!Range} - */ - function rangeOf(doc, node) { - var range = doc.createRange(); - range.selectNode(node); - return range; - } - /** - * The first thing on a page that crosses the end of it, if any. - * - * The last thing on a page is not always the lowest of them: a frame set - * against the page stands where the page says, and it may stand high on - * a page it was written at the foot of. - * @param {!Element} box the page - * @return {?Element} - */ - function firstOverflowing(box) { - var edge = edgeOf(box), - /**@type{!boolean}*/ - columns = holdsColumns(box), - /**@type{!number}*/ - side = rightEdgeOf(box), - /**@type{?Element}*/ - node = box.firstElementChild, - /**@type{!ClientRect}*/ - rect; - while (node) { - rect = node.getBoundingClientRect(); - if (node.className !== "webodf-pageNotes" - && (rect.height > 0 || rect.width > 0) - && (columns - ? rect.right > side + 1 - : rect.bottom > edge + 1)) { - return node; - } - node = node.nextElementSibling; - } - return null; - } - /** - * Whether an element is drawn out of the flow of the text. - * - * A frame anchored to the page is set against the page and stands where - * the page says, so it is not read with what follows the text: the - * browser is asked, and only of the few elements that may be so. - * @param {!Element} element - * @return {!boolean} - */ - function isOutOfFlow(element) { - var style; - if (element.namespaceURI !== drawns) { - return false; - } - style = runtime.getWindow().getComputedStyle(element); - return style - ? style.position === "absolute" || style.position === "fixed" - : false; - } - /** - * How many of the nodes a page was given stand within it. - * - * The nodes are read where they stand and none of them is moved, so the - * page is laid out once for the whole of the reading: what is read after - * something is written is laid out anew, and taking the nodes back one - * at a time lays the page out once for each of them. - * @param {!Element} box - * @param {!Array.} added the nodes that were written on the page - * @return {!number} how many of them the page holds - */ - function firstOver(box, added) { - var doc = /**@type{!Document}*/(box.ownerDocument), - edge = box.getBoundingClientRect().bottom, - range = doc.createRange(), - /**@type{!ClientRect}*/ - rect, - /**@type{!number}*/ - i; - for (i = 0; i < added.length; i += 1) { - range.setStartBefore(added[i]); - range.setEndAfter(added[i]); - rect = range.getBoundingClientRect(); - if ((rect.height > 0 || rect.width > 0) && rect.bottom > edge + 1) { - return i; - } - } - return added.length; - } - /** - * Whether what a box holds is taller than the box. - * @param {!Element} box - * @param {?Node=} from the first node to read, the head of the box by - * default: what stands before it was read already. - * @return {!boolean} - */ - function overflows(box, from) { - var doc = /**@type{!Document}*/(box.ownerDocument), - /**@type{!number}*/ - edge = edgeOf(box), - /**@type{!boolean}*/ - columns = holdsColumns(box), - /**@type{!number}*/ - side = rightEdgeOf(box), - /**@type{?Node}*/ - last = box.lastElementChild - && box.lastElementChild.className === "webodf-pageNotes" - ? box.lastElementChild.previousSibling - : box.lastChild, - /**@type{?Node}*/ - node = from || box.firstChild, - range = doc.createRange(), - /**@type{!ClientRect}*/ - rect; - // Every child is read and not the last of them alone: a frame set - // against the page stands where the page says, so the last child of - // a page is not always the lowest of them. - // - // What was measured before and held is not measured again: a node - // that is written after another does not move it, so a page that is - // filled a few nodes at a time is read from the first of them and - // not from the head of the page, which would read a page of a - // hundred nodes a hundred times over. - if (!node) { - return false; - } - // The nodes are read in one measure and not one by one: a range that - // holds them all answers with the rectangle that holds what they are - // drawn as, which is the one the page is read against. A page filled - // by chunks of sixty-four nodes is measured once for the chunk and - // not sixty-four times. - if (!last) { - return false; - } - range.setStartBefore(node); - range.setEndAfter(last); - rect = range.getBoundingClientRect(); - if ((rect.height > 0 || rect.width > 0) - && (columns - ? rect.right > side + 1 - : rect.bottom > edge + 1)) { - return true; - } - // What is drawn out of the flow of the text — a frame set against the - // page — stands where the page says and is none of the range: those - // are read on their own, and there are few of them. - while (node) { - if (node.nodeType === Node.ELEMENT_NODE - && isOutOfFlow(/**@type{!Element}*/(node))) { - rect = /**@type{!Element}*/(node).getBoundingClientRect(); - if ((rect.height > 0 || rect.width > 0) - && rect.bottom > edge + 1) { - return true; - } - } - node = node.nextSibling; - } - return false; - } - /** - * Cut a text node where the page ends, and answer what is left of it. - * @param {!Element} box the page - * @param {!Text} node - * @param {!boolean} alone whether the page holds nothing else - * @return {?Text} what did not fit, or nothing if all of it fits - */ - function cutText(box, node, alone) { - var doc = /**@type{!Document}*/(box.ownerDocument), - range = doc.createRange(), - bottom = box.getBoundingClientRect().bottom, - /**@type{!number}*/ - low = 0, - /**@type{!number}*/ - high = node.length, - /**@type{!number}*/ - middle; - // The letter the page ends at is looked for by halving: the text up - // to it is measured, and the half that holds the end is kept. - while (low + 1 < high) { - middle = Math.floor((low + high) / 2); - range.setStart(node, 0); - range.setEnd(node, middle); - if (range.getBoundingClientRect().bottom <= bottom) { - low = middle; - } else { - high = middle; - } - } - if (low >= node.length) { - return null; - } - if (low === 0 && !alone) { - // Not a word of it fits on what is left of the page, so all of - // it is written on the next one: a page that holds nothing else - // keeps a letter of it all the same, or the text would be sent - // from page to page for ever. - return node.splitText(0); - } - // The cut is made at the last blank before the letter, so that a - // word is not written half on one page and half on the next. Where - // there is no blank to cut at, the whole of it is written on the - // page that follows: a page that ended with the "A" of "Appendix" - // and gave "ppendix" to the next is no page of a document. A page - // that holds nothing else cuts all the same, or the text would be - // sent from page to page for ever. - middle = String(node.data).lastIndexOf(" ", low); - if (middle <= 0) { - // Nothing of the word fits: the whole of it is written on the - // page that follows, unless the page holds nothing that is seen - // before it, where a page would else be left empty and the word - // sent on for ever. - return anythingBefore(box, node) - ? node.splitText(0) - : node.splitText(Math.max(1, low)); - } - return node.splitText(middle + 1); - } /** * Whether a node is the rows of the head of a table. * @param {!Node} node @@ -3210,95 +2808,6 @@ odf.TextLayout = function TextLayout() { } return true; } - /** - * How many nodes a node holds, counted no further than a bound. - * @param {!Node} node - * @param {!number} bound - * @return {!number} - */ - function nodesIn(node, bound) { - var count = 1, - /**@type{?Node}*/ - child = node.firstChild; - while (child && count < bound) { - count += nodesIn(child, bound - count); - child = child.nextSibling; - } - return count; - } - /** - * Take out of an element everything past the first so many nodes. - * - * A document holds elements that hold thousands of nodes: a table of - * contents is one of them, and a page of it was written by measuring the - * whole of what was left, page after page. The element is parted in two - * beforehand, by counting and not by measuring, so that a page is drawn - * against what a page may hold and not against everything that is left - * to write. - * - * What is taken out is put in a copy of the element, as a cut does, so - * that it is written in the style it was written in. - * @param {!Element} element - * @param {!number} bound how many nodes are left in it - * @return {?Element} what was taken out, or null where it held less - */ - function splitOff(element, bound) { - var count = 1, - /**@type{?Node}*/ - node = element.firstChild, - /**@type{!Element}*/ - tail = /**@type{!Element}*/(element.cloneNode(false)), - /**@type{?Element}*/ - inner, - /**@type{?Node}*/ - next; - tail.setAttributeNS(webodfhelperns, "webodfhelper:continued", "true"); - while (node && count < bound) { - count += nodesIn(node, bound - count); - if (count >= bound && node.firstChild - && node.nodeType === Node.ELEMENT_NODE) { - // The bound falls inside this one: what it holds past the - // bound is taken out of it in the same way. - inner = splitOff(/**@type{!Element}*/(node), bound); - if (inner) { - tail.appendChild(inner); - } - node = node.nextSibling; - break; - } - node = node.nextSibling; - } - while (node) { - next = node.nextSibling; - tail.appendChild(node); - node = next; - } - return tail.firstChild - ? tail - : null; - } - /** - * Whether what was cut off an element holds nothing worth a page. - * - * An element that is cut may leave a copy that holds no word and no - * shape of its own: the empty paragraph of a table of contents, for one. - * It is thrown away rather than written, as it would take the room of - * its spacings on the page that follows and leave a page half empty. - * @param {?Element} tail what was cut off - * @return {!boolean} - */ - function holdsNothing(tail) { - if (!tail) { - return true; - } - if (String(tail.textContent).trim() !== "") { - return false; - } - // A frame, an image or a shape is drawn although it holds no word. - return tail.getElementsByTagNameNS(drawns, "frame").length === 0 - && tail.getElementsByTagNameNS(drawns, "image").length === 0 - && tail.getElementsByTagNameNS(tablens, "table").length === 0; - } /** * Whether a table may be cut between two of its rows. * @@ -3389,7 +2898,7 @@ odf.TextLayout = function TextLayout() { // ever be cut. The children answer for it. while (node && !from && !inner) { rect = node.nodeType === Node.TEXT_NODE - ? rangeOf(doc, node).getBoundingClientRect() + ? measure.rangeOf(doc, node).getBoundingClientRect() : /**@type{!Element}*/(node).getBoundingClientRect(); if (isTableColumns(node)) { // The columns say how wide the table is and hold nothing that @@ -3405,7 +2914,7 @@ odf.TextLayout = function TextLayout() { node = node.nextSibling; } else if (rect.bottom > bottom) { if (node.nodeType === Node.TEXT_NODE) { - from = cutText(box, /**@type{!Text}*/(node), alone) + from = measure.cutText(box, /**@type{!Text}*/(node), alone) || node; } else if (isTableRow(node) && !(alone && afterHeaderRowsOnly(element, node))) { @@ -3484,40 +2993,6 @@ odf.TextLayout = function TextLayout() { * @param {!PagePlan} plan * @return {!number} how many pages the text was broken into */ - /** - * Take the spacings from what a page ends on and that holds nothing. - * - * Cutting a paragraph between two of its words may leave nothing of it on - * the page it was cut on: the empty paragraph is drawn as its spacings - * and no more, and in a box that lays its children in a column those - * spacings are not folded into the edge of the box, so the page is a few - * pixels too full and the line above is moved on for nothing. - * @param {!Element} box the page - * @return {undefined} - */ - function unspaceEmptyTail(box) { - var node = box.lastElementChild, - /**@type{!number}*/ - guard = 8; - // The last thing on the page is looked for, and then everything it - // stands in that holds nothing either: a paragraph left empty by a - // cut holds the box its tabs were laid in, which is empty as well. - while (node && node.lastElementChild && guard > 0) { - node = node.lastElementChild; - guard -= 1; - } - guard = 8; - while (node && node !== box && guard > 0 - && node.getBoundingClientRect().height === 0) { - // An element of the document is of no namespace of html, where - // the browser leaves a "style" attribute alone: it is marked - // instead, and the rule of the mark takes its spacings away. - node.setAttributeNS(webodfhelperns, "webodfhelper:spaceless", - "true"); - node = node.parentElement; - guard -= 1; - } - } /** * Fill one page, and answer with the page that was filled. * @@ -3577,7 +3052,7 @@ odf.TextLayout = function TextLayout() { /**@type{!HTMLElement}*/(box).style.paddingRight = dims.marginRight + "px"; /**@type{!HTMLElement}*/(box).style.width = dims.pageWidth + "px"; - setColumns(box, dims); + measure.setColumns(box, dims); /**@type{!HTMLElement}*/(box).style.height = (dims.pageHeight - dims.marginTop - dims.marginBottom) + "px"; // A page is set at the place of the page it is, and not left to @@ -3601,7 +3076,7 @@ odf.TextLayout = function TextLayout() { // thing on it: a break before the first node would leave an // empty page behind, and the browser is asked for the same // where the pages are broken into columns. - if (asksForANewPage(node) && holdsSomething(box)) { + if (asksForANewPage(node) && measure.holdsSomething(box)) { break; } // An element of thousands of nodes — a table of contents, @@ -3610,8 +3085,8 @@ odf.TextLayout = function TextLayout() { // whole of what is left to write, which was drawn again for // every page of it. if (node.nodeType === Node.ELEMENT_NODE - && nodesIn(node, nodesToAPage + 1) > nodesToAPage) { - rest = splitOff(/**@type{!Element}*/(node), nodesToAPage); + && measure.nodesIn(node, nodesToAPage + 1) > nodesToAPage) { + rest = measure.splitOff(/**@type{!Element}*/(node), nodesToAPage); if (rest) { state.waiting.splice(1, 0, rest); } @@ -3625,7 +3100,7 @@ odf.TextLayout = function TextLayout() { webodfhelperns, "continued" ) - || !holdsNothing(/**@type{!Element}*/(node))) { + || !measure.holdsNothing(/**@type{!Element}*/(node))) { box.appendChild(node); added.push(node); } @@ -3633,7 +3108,7 @@ odf.TextLayout = function TextLayout() { if (added.length === 0) { break; } - if (added.length > 1 && overflows(box, added[0])) { + if (added.length > 1 && measure.overflows(box, added[0])) { // The chunk is more than the page holds: the first node of // it that crosses the end of the page is looked for, and // everything from there is taken back at once. @@ -3642,7 +3117,7 @@ odf.TextLayout = function TextLayout() { // page answering for all of them: taking them back one at a // time reads the page again for each, as the browser lays // out anew whatever is read after something is written. - held = firstOver(box, added); + held = measure.firstOver(box, added); while (added.length > held) { taken = /**@type{!Node}*/(added.pop()); box.removeChild(taken); @@ -3651,17 +3126,17 @@ odf.TextLayout = function TextLayout() { state.chunk = Math.max(1, added.length); } if (added.length === 0 - || !overflows(box, added[0])) { + || !measure.overflows(box, added[0])) { node = null; } else { node = /**@type{!Node}*/(added[added.length - 1]); if (node.nodeType === Node.ELEMENT_NODE) { held = String(node.textContent).length; - lines = linesOf(/**@type{!Element}*/(node)); + lines = measure.linesOf(/**@type{!Element}*/(node)); rest = cutElement(box, /**@type{!Element}*/(node), 8, box.childNodes.length === 1, state.root); if (rest && box.childNodes.length > 1 - && !cutWhereAnOfficeWould( + && !measure.cutWhereAnOfficeWould( /**@type{!Element}*/(node), lines )) { // The cut would leave a line alone at the foot of @@ -3684,7 +3159,7 @@ odf.TextLayout = function TextLayout() { } rest = null; } - if (rest && holdsNothing(rest)) { + if (rest && measure.holdsNothing(rest)) { // What was cut off holds nothing: it is thrown away // rather than sent to the next page, where it would // take the room of its spacings and no more. @@ -3710,7 +3185,7 @@ odf.TextLayout = function TextLayout() { // its end is cut there, and what was written after it goes to the // next page with what was cut off. guard = 2; - over = firstOverflowing(box); + over = measure.firstOverflowing(box); while (guard > 0 && over) { held = String(over.textContent).length; more = cutElement(box, over, 8, over === box.firstElementChild); @@ -3742,7 +3217,7 @@ odf.TextLayout = function TextLayout() { state.waiting.unshift(sent[n]); } guard -= 1; - over = firstOverflowing(box); + over = measure.firstOverflowing(box); } } // A heading is not left alone at the foot of a page: what asks to @@ -3751,7 +3226,7 @@ odf.TextLayout = function TextLayout() { // nothing would be left on the page. keeper = box.lastElementChild; while (keeper && keeper !== box.firstElementChild - && state.waiting.length > 0 && keepsWithWhatFollows(keeper)) { + && state.waiting.length > 0 && measure.keepsWithWhatFollows(keeper)) { state.waiting.unshift(keeper); box.removeChild(keeper); keeper = box.lastElementChild; @@ -3760,7 +3235,7 @@ odf.TextLayout = function TextLayout() { // on: the spacings of what holds nothing are taken away, or the page // is a few pixels too full and the line above it is moved on for // nothing. - unspaceEmptyTail(box); + measure.unspaceEmptyTail(box); // A table written for a page of another size is drawn to the width // of the text of this one before the notes are drawn: it is taller // for being narrower, and what it pushes past the end of the page is @@ -4162,14 +3637,14 @@ odf.TextLayout = function TextLayout() { // foot of the page, so what they push past the end of it is what // is moved to the page that follows, notes and all. layNotes(box); - over = firstOverflowing(box); + over = measure.firstOverflowing(box); while (guard > 0 && over) { held = String(over.textContent).length; - lines = linesOf(over); + lines = measure.linesOf(over); more = cutElement(box, over, 8, over === box.firstElementChild, odfroot); if (more && over !== box.firstElementChild - && !cutWhereAnOfficeWould(over, lines)) { + && !measure.cutWhereAnOfficeWould(over, lines)) { while (more.firstChild) { over.appendChild(more.firstChild); } @@ -4182,7 +3657,7 @@ odf.TextLayout = function TextLayout() { } more = null; } - if (more && holdsNothing(more)) { + if (more && measure.holdsNothing(more)) { more = null; } sent = []; @@ -4237,7 +3712,7 @@ odf.TextLayout = function TextLayout() { dims.marginRight + "px"; /**@type{!HTMLElement}*/(target).style.width = dims.pageWidth + "px"; - setColumns(target, dims); + measure.setColumns(target, dims); /**@type{!HTMLElement}*/(target).style.height = (dims.pageHeight - dims.marginTop - dims.marginBottom) + "px"; @@ -4266,7 +3741,7 @@ odf.TextLayout = function TextLayout() { // The notes of what was moved went with it, so the foot // of the page is drawn again before it is read anew. layNotes(box); - over = firstOverflowing(box); + over = measure.firstOverflowing(box); } } } @@ -4287,7 +3762,7 @@ odf.TextLayout = function TextLayout() { // to the page that follows for nothing. i = from || 0; while (i < boxes.length) { - unspaceEmptyTail(boxes[i]); + measure.unspaceEmptyTail(boxes[i]); i += 1; } columnPages = boxes.length; @@ -4313,7 +3788,7 @@ odf.TextLayout = function TextLayout() { fits = true; while (node && fits) { if (node.className === "webodf-pageBox" - && firstOverflowing(node)) { + && measure.firstOverflowing(node)) { fits = false; } node = node.nextElementSibling; diff --git a/webodf/tools/karma.conf.js b/webodf/tools/karma.conf.js index abefa8cbd..dc4d2de70 100644 --- a/webodf/tools/karma.conf.js +++ b/webodf/tools/karma.conf.js @@ -49,6 +49,7 @@ module.exports = function (config) { 'lib/odf/Formatting.js', 'lib/odf/StyleTree.js', 'lib/odf/ListStylesToCss.js', + 'lib/odf/PageMeasure.js', 'lib/odf/StyleParseUtils.js', 'lib/odf/Style2CSS.js', 'lib/odf/TextLayout.js', From a5e9521400d3b3cbe5f3cabd353b000c2d5992a6 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 356/385] Left the pages away from the window undrawn until they come near. --- .../assets/viewer.js | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/programs/opendocumentviewer-desktop/assets/viewer.js b/programs/opendocumentviewer-desktop/assets/viewer.js index 9ef898d08..0326cb31a 100644 --- a/programs/opendocumentviewer-desktop/assets/viewer.js +++ b/programs/opendocumentviewer-desktop/assets/viewer.js @@ -32,6 +32,36 @@ - parseFloat(style.paddingRight); } + // A document of eight hundred pages is a very tall thing to paint: the + // engine rasterises what is near the window and leaves the rest, and a + // reader that jumps far ahead lands on a page that was never painted. + // The pages are told to be drawn only when they come near the window, + // each keeping the room of a page while it is away, so that the reader + // scrolls over the same length and the engine paints far less. + function skipPagesAway(on) { + var sheet = document.getElementById("pagesaway"), + first = document.querySelector(".webodf-pageSheet"), + box; + if (!on) { + if (sheet) { + sheet.parentNode.removeChild(sheet); + } + return; + } + if (!first) { + return; + } + box = first.getBoundingClientRect(); + if (!sheet) { + sheet = document.createElement("style"); + sheet.id = "pagesaway"; + document.head.appendChild(sheet); + } + sheet.textContent = ".webodf-pageSheet {content-visibility:auto;" + + "contain-intrinsic-size:" + Math.round(box.width) + "px " + + Math.round(box.height) + "px;}"; + } + // How the first page came out: the height of its text, how far its text // reaches, and where the foot drawn on it begins. A foot that begins // above the end of the text is drawn over the last line of it. @@ -125,6 +155,7 @@ message.hidden = true; failure.hidden = true; ways.hidden = true; + skipPagesAway(false); canvas = new odf.OdfCanvas(container); // A row of two pages is twice as wide as one, so the document is // scaled to the window anew when the reader asks for another way @@ -136,6 +167,10 @@ // "webodf.viewer" is turned on: it tells a foot drawn over // the last line of a page apart from one that stands clear. window.console.log("pages " + pageReport()); + // The pages are all broken, so nothing of them is measured + // any more: the ones away from the window may be left + // undrawn until the reader comes to them. + skipPagesAway(true); if (!refitting) { return; } @@ -225,6 +260,9 @@ setPages: function (perRow, firstAlone) { if (canvas) { refitting = true; + // The pages are about to be broken again, and what is broken + // is measured: a page that is not drawn measures nothing. + skipPagesAway(false); canvas.setPagesPerRow(perRow); canvas.setFirstPageOnItsOwn(firstAlone); } From 27e89999c84fc6925e22a69a2c7fe16d2189a9c2 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 357/385] Drawn the notes of the foot at the foot of the page they are called on. --- webodf/lib/odf/TextLayout.js | 189 ++++++++++++++++++++++++-- webodf/tests/documents/footnotes.fodt | 12 ++ 2 files changed, 190 insertions(+), 11 deletions(-) create mode 100644 webodf/tests/documents/footnotes.fodt diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 7b7fd48f5..1e1592c3f 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2671,6 +2671,137 @@ odf.TextLayout = function TextLayout() { sheet.cssRules.length); }); } + /** + * Where the text of a page ends. + * + * The notes of the foot of a page are drawn in the padding at the foot of + * the box, so the text ends where that padding begins and not at the edge + * of the box. + * @param {!Element} box the page + * @return {!number} + */ + function edgeOf(box) { + return box.getBoundingClientRect().bottom + - (parseFloat(/**@type{!HTMLElement}*/(box).style.paddingBottom) + || 0); + } + /** + * Take the notes of the foot of a page away, and the room they took. + * @param {!Element} box the page + * @return {undefined} + */ + function clearNotes(box) { + var area = box.lastElementChild; + if (area && area.className === "webodf-pageNotes") { + box.removeChild(area); + } + /**@type{!HTMLElement}*/(box).style.paddingBottom = ""; + } + /** + * The notes of the foot of the page that are called for on a page. + * @param {!Element} box the page + * @return {!Array.} + */ + function notesOf(box) { + var found = box.getElementsByTagNameNS(textns, "note"), + /**@type{!Array.}*/ + notes = [], + /**@type{!Element}*/ + note, + /**@type{!number}*/ + i; + for (i = 0; i < found.length; i += 1) { + note = /**@type{!Element}*/(found.item(i)); + if (note.getAttributeNS(textns, "note-class") === "footnote") { + notes.push(note); + } + } + return notes; + } + /** + * Draw the notes called for on a page at the foot of it. + * + * A note is written at the foot of the page its number stands on, as an + * office writes it, and the text of the page is that much shorter: the + * room the notes take is the padding at the foot of the box, so what + * crosses into it is moved to the page that follows, see "trimPages". + * + * What is drawn is a copy: the note itself is left where it stands in the + * text, as the document is the reader's to show and not to write. + * @param {!Element} box the page + * @return {undefined} + */ + function layNotes(box) { + var doc = /**@type{!Document}*/(box.ownerDocument), + htmlns = /**@type{!string}*/(doc.documentElement.namespaceURI), + notes = notesOf(box), + /**@type{!HTMLElement}*/ + area, + /**@type{!HTMLElement}*/ + rule, + /**@type{!number}*/ + tall; + clearNotes(box); + if (notes.length === 0) { + return; + } + area = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); + area.className = "webodf-pageNotes"; + // The notes stand in the padding at the foot of the box, against the + // text and not against the paper: the padding of the box is the + // margin of the page, which the notes are no part of. + area.style.position = "absolute"; + area.style.bottom = "0"; + area.style.left = /**@type{!HTMLElement}*/(box).style.paddingLeft; + area.style.right = /**@type{!HTMLElement}*/(box).style.paddingRight; + // A line stands between the text and the notes, as an office draws + // it: a quarter of the width of the text, and no wider. + rule = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); + rule.style.width = "25%"; + rule.style.borderTop = "1px solid currentColor"; + rule.style.marginBottom = "0.2em"; + area.appendChild(rule); + notes.forEach(function (note) { + var line = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, + "div")), + number = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, + "span")), + citation = note.getElementsByTagNameNS(textns, + "note-citation").item(0), + body = note.getElementsByTagNameNS(textns, + "note-body").item(0), + /**@type{?Node}*/ + walk; + number.className = "webodf-pageNoteNumber"; + number.style.marginRight = "0.5em"; + number.appendChild(doc.createTextNode(citation + ? String(citation.textContent) + : "")); + // The body itself is not moved and not copied: what it holds is, + // as the rule that hides a body of a note would hide the copy of + // it as well. + walk = body + ? body.firstChild + : null; + while (walk) { + line.appendChild(walk.cloneNode(true)); + walk = walk.nextSibling; + } + // The number of the note is written at the head of the first + // line of it and not above it, in the letters of the note: it is + // put inside what was copied, and not before it. + if (line.firstElementChild) { + line.firstElementChild.insertBefore(number, + line.firstElementChild.firstChild); + } else { + line.insertBefore(number, line.firstChild); + } + area.appendChild(line); + }); + box.appendChild(area); + tall = area.getBoundingClientRect().height; + /**@type{!HTMLElement}*/(box).style.paddingBottom = tall + "px"; + } /** * Take away the boxes that hold the pages, giving the text back the * paragraphs they hold. @@ -2689,6 +2820,9 @@ odf.TextLayout = function TextLayout() { node = node.nextElementSibling; } boxes.forEach(function (box) { + // What was drawn of the notes at the foot of the page is drawn + // again with the pages, and is no part of the text. + clearNotes(box); while (box.firstChild) { text.insertBefore(box.firstChild, box); } @@ -2716,14 +2850,15 @@ odf.TextLayout = function TextLayout() { * @return {?Element} */ function firstOverflowing(box) { - var edge = box.getBoundingClientRect().bottom, + var edge = edgeOf(box), /**@type{?Element}*/ node = box.firstElementChild, /**@type{!ClientRect}*/ rect; while (node) { rect = node.getBoundingClientRect(); - if ((rect.height > 0 || rect.width > 0) + if (node.className !== "webodf-pageNotes" + && (rect.height > 0 || rect.width > 0) && rect.bottom > edge + 1) { return node; } @@ -2789,7 +2924,12 @@ odf.TextLayout = function TextLayout() { function overflows(box, from) { var doc = /**@type{!Document}*/(box.ownerDocument), /**@type{!number}*/ - edge = box.getBoundingClientRect().bottom, + edge = edgeOf(box), + /**@type{?Node}*/ + last = box.lastElementChild + && box.lastElementChild.className === "webodf-pageNotes" + ? box.lastElementChild.previousSibling + : box.lastChild, /**@type{?Node}*/ node = from || box.firstChild, range = doc.createRange(), @@ -2812,8 +2952,11 @@ odf.TextLayout = function TextLayout() { // drawn as, which is the one the page is read against. A page filled // by chunks of sixty-four nodes is measured once for the chunk and // not sixty-four times. + if (!last) { + return false; + } range.setStartBefore(node); - range.setEndAfter(/**@type{!Node}*/(box.lastChild)); + range.setEndAfter(last); rect = range.getBoundingClientRect(); if ((rect.height > 0 || rect.width > 0) && rect.bottom > edge + 1) { return true; @@ -3428,6 +3571,11 @@ odf.TextLayout = function TextLayout() { box.removeChild(keeper); keeper = box.lastElementChild; } + // The notes called for on the page are drawn at the foot of it, and + // the text of the page is that much shorter: what no longer fits is + // moved to the page that follows when the pages are set right, see + // "trimPages". + layNotes(box); // The pages that follow are filled by as many at a time as the page // that was just filled took: a page of a hundred short paragraphs is // not read a hundred times. @@ -3656,7 +3804,7 @@ odf.TextLayout = function TextLayout() { /**@type{!boolean}*/ fresh, /**@type{?Element}*/ - over = firstOverflowing(box), + over = null, /**@type{?Element}*/ more, /**@type{!Array.}*/ @@ -3675,6 +3823,11 @@ odf.TextLayout = function TextLayout() { lines, /**@type{!number}*/ n; + // The notes are drawn before the page is read: they take the + // foot of the page, so what they push past the end of it is what + // is moved to the page that follows, notes and all. + layNotes(box); + over = firstOverflowing(box); while (guard > 0 && over) { held = String(over.textContent).length; lines = linesOf(over); @@ -3698,8 +3851,15 @@ odf.TextLayout = function TextLayout() { walk = over.nextSibling; while (walk) { next = walk.nextSibling; - sent.push(walk); - box.removeChild(walk); + // What was drawn of the notes belongs to the page and + // not to the text: it is drawn again where the notes it + // copies stand. + if (walk.nodeType !== Node.ELEMENT_NODE + || /**@type{!Element}*/(walk).className + !== "webodf-pageNotes") { + sent.push(walk); + box.removeChild(walk); + } walk = next; } if (more) { @@ -3731,16 +3891,20 @@ odf.TextLayout = function TextLayout() { doc.createElementNS(htmlns, "div") ); target.className = "webodf-pageBox"; + /**@type{!HTMLElement}*/(target).style.boxSizing = + "border-box"; + /**@type{!HTMLElement}*/(target).style.paddingLeft = + dims.marginLeft + "px"; + /**@type{!HTMLElement}*/(target).style.paddingRight = + dims.marginRight + "px"; /**@type{!HTMLElement}*/(target).style.width = - (dims.pageWidth - dims.marginLeft - - dims.marginRight) + "px"; + dims.pageWidth + "px"; /**@type{!HTMLElement}*/(target).style.height = (dims.pageHeight - dims.marginTop - dims.marginBottom) + "px"; /**@type{!HTMLElement}*/(target).style.position = "absolute"; - /**@type{!HTMLElement}*/(target).style.left = - dims.marginLeft + "px"; + /**@type{!HTMLElement}*/(target).style.left = "0"; /**@type{!HTMLElement}*/(target).style.top = ((index + 1) * (dims.pageHeight + dims.pageSeparation) @@ -3760,6 +3924,9 @@ odf.TextLayout = function TextLayout() { target.insertBefore(sent[n], target.firstChild); } guard -= 1; + // The notes of what was moved went with it, so the foot + // of the page is drawn again before it is read anew. + layNotes(box); over = firstOverflowing(box); } } diff --git a/webodf/tests/documents/footnotes.fodt b/webodf/tests/documents/footnotes.fodt new file mode 100644 index 000000000..36adc7f7f --- /dev/null +++ b/webodf/tests/documents/footnotes.fodt @@ -0,0 +1,12 @@ + + + + + + + + + + +Paragraph 1. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 2. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 3. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 4. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 5. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 6. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 7. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 8. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 9. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 10. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 11. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 12. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.1Note 1: a word of the foot of the page, written where its number stands, and no shorter than a line of it.Paragraph 13. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 14. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 15. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 16. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 17. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 18. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 19. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 20. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 21. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 22. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 23. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 24. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.2Note 2: a word of the foot of the page, written where its number stands, and no shorter than a line of it.Paragraph 25. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 26. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 27. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 28. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 29. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 30. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 31. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 32. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 33. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 34. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 35. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 36. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.3Note 3: a word of the foot of the page, written where its number stands, and no shorter than a line of it.Paragraph 37. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 38. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 39. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 40. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 41. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 42. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 43. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 44. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 45. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 46. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 47. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 48. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.4Note 4: a word of the foot of the page, written where its number stands, and no shorter than a line of it.Paragraph 49. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 50. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 51. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 52. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 53. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 54. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 55. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 56. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 57. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 58. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 59. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.Paragraph 60. The text of the page goes on and on, of a length that fills a page and then another, so that the notes of the foot are read on the pages their numbers stand on.5Note 5: a word of the foot of the page, written where its number stands, and no shorter than a line of it. + \ No newline at end of file From 176811302659aa50e15d8172d633906fc050b68d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 358/385] Taken what is drawn around a page out of what breaks the text. --- webodf/lib/manifest.json | 9 +- webodf/lib/odf/PageFurniture.js | 859 ++++++++++++++++++++++++++++ webodf/lib/odf/PageMeasure.js | 62 +- webodf/lib/odf/TextLayout.js | 965 +++----------------------------- webodf/tools/karma.conf.js | 1 + 5 files changed, 1004 insertions(+), 892 deletions(-) create mode 100644 webodf/lib/odf/PageFurniture.js diff --git a/webodf/lib/manifest.json b/webodf/lib/manifest.json index 654d587df..180325fb0 100644 --- a/webodf/lib/manifest.json +++ b/webodf/lib/manifest.json @@ -251,11 +251,15 @@ "odf.OdfSchema", "webodfcore.DomUtils" ], + "odf.PageFurniture": [ + "odf.PageMeasure", + "odf.Style2CSS" + ], "odf.PageLayoutProperties": [ "odf.StyleParseUtils" ], "odf.PageMeasure": [ - "odf.Namespaces" + "odf.OdfContainer" ], "odf.ParagraphProperties": [ "odf.StyleParseUtils" @@ -288,8 +292,7 @@ "odf.Namespaces" ], "odf.TextLayout": [ - "odf.PageMeasure", - "odf.Style2CSS" + "odf.PageFurniture" ], "odf.TextProperties": [ "odf.StyleParseUtils" diff --git a/webodf/lib/odf/PageFurniture.js b/webodf/lib/odf/PageFurniture.js new file mode 100644 index 000000000..045de74b2 --- /dev/null +++ b/webodf/lib/odf/PageFurniture.js @@ -0,0 +1,859 @@ +/** + * Copyright (C) 2014 KO GmbH + * + * @licstart + * This file is part of WebODF. + * + * WebODF is free software: you can redistribute it and/or modify it + * under the terms of the GNU Affero General Public License (GNU AGPL) + * as published by the Free Software Foundation, either version 3 of + * the License, or (at your option) any later version. + * + * WebODF is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with WebODF. If not, see . + * @licend + * + * @source: http://www.webodf.org/ + * @source: https://github.com/webodf/WebODF/ + */ + + + + +/*global odf, runtime, Node*/ + +/** + * What is drawn around the text of a page: the header and the foot, the notes + * of the foot, the shapes of the master page, and the tabs of a line. + * + * Nothing here holds the state of a layout: what a function needs of the + * document is given to it, and what it needs of the layout — where the stops + * of a paragraph are read, how the names of the styles are taken off a copy — + * is given to it as a function to call. What breaks a text into pages is in + * "TextLayout.js". + * @constructor + */ +odf.PageFurnitureImpl = function PageFurnitureImpl() { + "use strict"; + var /**@const@type{!string}*/ + textns = odf.Namespaces.textns, + /**@const@type{!string}*/ + webodfhelperns = "urn:webodf:names:helper"; + /** + * Write the runs of spaces of a header as the spaces they stand for. + * + * The canvas does that for the text of the document alone, and a header + * is written in the styles of the document, so a "text:s" is still an + * element here and nothing of it is seen: "Page 1 of 809" was read + * "Page 1of 809". + * @param {!Element} box a header or a footer, drawn for a page + * @return {undefined} + */ + function expandSpaces(box) { + var doc = box.ownerDocument, + spaces = box.getElementsByTagNameNS(textns, "s"), + /**@type{!Array.}*/ + found = [], + i; + for (i = 0; i < spaces.length; i += 1) { + found.push(/**@type{!Element}*/(spaces.item(i))); + } + found.forEach(function (space) { + var count = parseInt(space.getAttributeNS(textns, "c"), 10), + run = ""; + if (!(count > 1)) { + count = 1; + } + while (count > 0) { + run += "\u00a0"; + count -= 1; + } + if (space.parentNode) { + space.parentNode.replaceChild(doc.createTextNode(run), space); + } + }); + } + /** + * Bring the tabs of a paragraph up to be children of the paragraph. + * + * A document may write a tab deep in the spans that carry the styles of + * a line, and the parts of the line are told apart at the paragraph: the + * spans around a tab are cut in two, so the tab stands between them and + * each part keeps the styles it was written with. + * @param {!Element} paragraph + * @return {undefined} + */ + function raiseTabs(paragraph) { + var tabs = paragraph.getElementsByTagNameNS(textns, "tab"), + /**@type{!Array.}*/ + found = [], + i; + for (i = 0; i < tabs.length; i += 1) { + found.push(/**@type{!Element}*/(tabs.item(i))); + } + found.forEach(function (tab) { + var /**@type{?Node}*/ + parent = tab.parentNode, + /**@type{!Element}*/ + tail, + /**@type{?Node}*/ + node; + while (parent && parent !== paragraph) { + tail = /**@type{!Element}*/( + /**@type{!Element}*/(parent).cloneNode(false) + ); + node = tab.nextSibling; + while (node) { + tail.appendChild(node); + node = tab.nextSibling; + } + if (parent.parentNode) { + parent.parentNode.insertBefore(tab, parent.nextSibling); + if (tail.firstChild) { + parent.parentNode.insertBefore(tail, + tab.nextSibling); + } + } + parent = tab.parentNode; + } + }); + } + /** + * The parts of a paragraph, that is what stands between its tabs. + * + * The nodes of the paragraph are taken out of it and put in a span for + * each part, the first of them holding what stands before the first tab. + * @param {!Element} paragraph + * @param {!Document} doc + * @param {!string} htmlns + * @return {!Array.} + */ + function partsOfParagraph(paragraph, doc, htmlns) { + var /**@type{!Array.}*/ + parts = [], + /**@type{!HTMLElement}*/ + part = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, + "span")), + /**@type{?Node}*/ + node = paragraph.firstChild, + /**@type{?Node}*/ + next, + /**@type{!Array.}*/ + pieces, + /**@type{!number}*/ + i; + parts.push(part); + while (node) { + next = node.nextSibling; + if (node.nodeType === Node.ELEMENT_NODE + && /**@type{!Element}*/(node).namespaceURI === textns + && /**@type{!Element}*/(node).localName === "tab") { + paragraph.removeChild(node); + part = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, + "span")); + parts.push(part); + } else if (node.nodeType === Node.TEXT_NODE + && String(node.textContent).indexOf("\t") !== -1) { + // The canvas writes a "text:tab" as a tab of a terminal + // before a text is drawn, so a tab is a letter here. + pieces = String(node.textContent).split("\t"); + paragraph.removeChild(node); + for (i = 0; i < pieces.length; i += 1) { + if (i > 0) { + part = /**@type{!HTMLElement}*/(doc.createElementNS( + htmlns, + "span" + )); + parts.push(part); + } + if (pieces[i] !== "") { + part.appendChild(doc.createTextNode(pieces[i])); + } + } + } else { + part.appendChild(node); + } + node = next; + } + return parts; + } + /** + * Set the parts of a paragraph against the tab stops it is written with. + * + * A tab is drawn as a tab of a terminal otherwise, that walks to the next + * stop of eight letters, so a title, a date and a number of a page ran + * into one another. Each part is laid where its stop says instead, and + * against it as its stop asks: the standard calls that "style:type" of a + * "style:tab-stop". + * @param {!odf.ODFDocumentElement} odfroot + * @param {!Element} paragraph + * @param {!function(!odf.ODFDocumentElement,!Element): + * !Array.} stopsFor the stops the + * style of a paragraph writes + * @return {undefined} + */ + function layOutTabStops(odfroot, paragraph, stopsFor) { + var doc = /**@type{!Document}*/(paragraph.ownerDocument), + htmlns = "http://www.w3.org/1999/xhtml", + stops = stopsFor(odfroot, paragraph), + /**@type{!Array.}*/ + parts, + /**@type{!HTMLElement}*/ + line; + if (stops.length === 0) { + return; + } + raiseTabs(paragraph); + if (!paragraph.getElementsByTagNameNS(textns, "tab").length + && String(paragraph.textContent).indexOf("\t") === -1) { + // A line without a tab is written as it stands: nothing of it is + // moved, and nothing of it can be lost. + return; + } + parts = partsOfParagraph(paragraph, doc, htmlns); + if (parts.length < 2) { + // Nothing was told apart, so what was taken from the paragraph + // is put back where it was. + while (parts[0].firstChild) { + paragraph.appendChild(parts[0].firstChild); + } + return; + } + // The parts are laid in a box of the page rather than in the + // paragraph: a style set on an element of the document is not the + // canvas's to set, and the document is read as broken when it is. + line = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); + line.style.position = "relative"; + // The stops of the line are written on it: a tab goes to the first + // stop past what stands before it, which is known once the line is + // drawn and measured, see "spreadLines". + line.setAttributeNS(webodfhelperns, "webodfhelper:stops", + stops.map(function (stop) { + return String(Math.round(stop.at)) + ":" + stop.type; + }).join(",")); + paragraph.appendChild(line); + // The line of the paragraph holds its own height from here on: the + // zero width space that keeps an empty paragraph from collapsing + // would add a line of the size of the style of the paragraph, and a + // footer of eight points would stand ten points apart. + paragraph.setAttributeNS(webodfhelperns, "webodfhelper:laidout", + "true"); + parts.forEach(function (piece, index) { + var /**@type{?odf.PageMeasure.TabStop}*/ + stop = index === 0 ? null : stops[index - 1]; + piece.style.position = "absolute"; + piece.style.whiteSpace = "pre"; + if (!stop) { + piece.style.left = "0"; + line.appendChild(piece); + return; + } + // A stop is written from the left edge of the text of the page, + // and a document may put one where the page is no longer wide + // enough for it: the last stop is then the right edge itself. + piece.style.left = "min(" + stop.at + "px, 100%)"; + if (stop.type === "center") { + piece.style.transform = "translateX(-50%)"; + } else if (stop.type === "right") { + piece.style.transform = "translateX(-100%)"; + } + line.appendChild(piece); + }); + + } + /** + * Lay the tabs of a paragraph of the text at their stops. + * + * A header is drawn in a box of its own and every part of it is laid at + * its stop; a paragraph of the text keeps the first of its parts in the + * flow of the text, so that the line holds its height and its words wrap + * as they would: an entry of a table of contents is written from the + * left, and the number of the page it names is laid against the stop on + * the right. + * + * Nothing is measured here: the stops are written where the document + * says, and the parts are laid there by the browser. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!Element} paragraph + * @param {!function(!odf.ODFDocumentElement,!Element): + * !Array.} stopsFor the stops the + * style of a paragraph writes + * @return {undefined} + */ + function layOutTabsInText(odfroot, paragraph, stopsFor) { + var doc = /**@type{!Document}*/(paragraph.ownerDocument), + htmlns = "http://www.w3.org/1999/xhtml", + stops = stopsFor(odfroot, paragraph), + /**@type{!Array.}*/ + parts, + /**@type{!HTMLElement}*/ + line; + if (stops.length === 0 + || paragraph.hasAttributeNS(webodfhelperns, "laidout")) { + return; + } + raiseTabs(paragraph); + if (!paragraph.getElementsByTagNameNS(textns, "tab").length + && String(paragraph.textContent).indexOf("\t") === -1) { + return; + } + parts = partsOfParagraph(paragraph, doc, htmlns); + if (parts.length < 2) { + while (parts[0].firstChild) { + paragraph.appendChild(parts[0].firstChild); + } + return; + } + line = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); + line.style.position = "relative"; + paragraph.appendChild(line); + paragraph.setAttributeNS(webodfhelperns, "webodfhelper:laidout", + "true"); + parts.forEach(function (piece, index) { + var /**@type{?odf.PageMeasure.TabStop}*/ + stop = index === 0 + ? null + : stops[Math.min(index, stops.length) - 1], + /**@type{?odf.PageMeasure.TabStop}*/ + before = index > 1 + ? stops[Math.min(index - 1, stops.length) - 1] + : null; + if (!stop) { + // The first part is written as the text is: it holds the + // height of the line and wraps where the page ends. + line.appendChild(piece); + return; + } + if (stop.type === "left" || stop.type === "char") { + // A part that begins at a stop on the left is written in the + // flow of the line, and what stands before it is held to the + // width of its own slot: a label longer than its slot pushes + // what follows to the right, as a tab of a text does, where + // a part laid against the stop would be written over it. + /**@type{!HTMLElement}*/(parts[index - 1]).style.display = + "inline-block"; + /**@type{!HTMLElement}*/(parts[index - 1]).style.minWidth = + Math.max(0, stop.at - (before + ? before.at + : 0)) + "px"; + piece.style.whiteSpace = "pre-wrap"; + line.appendChild(piece); + return; + } + piece.style.position = "absolute"; + piece.style.whiteSpace = "pre"; + piece.style.top = "0"; + piece.style.left = "min(" + stop.at + "px, 100%)"; + if (stop.type === "center") { + piece.style.transform = "translateX(-50%)"; + } else { + piece.style.transform = "translateX(-100%)"; + } + line.appendChild(piece); + }); + } + /** + * The tab stops a line was drawn with, as it carries them. + * @param {!HTMLElement} line + * @return {!Array.} + */ + function stopsOfLine(line) { + var written = line.getAttributeNS(webodfhelperns, "stops") || "", + /**@type{!Array.}*/ + stops = []; + if (!written) { + return stops; + } + written.split(",").forEach(function (one) { + var parts = one.split(":"); + if (parts.length === 2) { + stops.push({at: parseFloat(parts[0]), type: parts[1]}); + } + }); + return stops; + } + /** + * Push the parts of the lines apart where they would be written over. + * + * A part is laid at its stop, and a part that runs past the next stop + * would be written over by the one that follows it: the one that follows + * is pushed to the right, as a tab of a text does, so nothing is hidden. + * A part is never pushed off the page: a line too full for its stops is + * drawn tight rather than half of it lost. + * + * The parts of every page are read before any of them is moved: a read + * that follows a write asks the browser to lay the whole page out again, + * and a document of a hundred pages would be drawn a hundred times over. + * @param {!Array.} boxes the headers and the footers drawn + * @return {undefined} + */ + function spreadLines(boxes) { + var /**@type{!Array.>}*/ + lines = [], + /**@type{!Array.>}*/ + rects = [], + /**@type{!Array.}*/ + room = [], + /**@type{!Array.}*/ + boxOf = []; + boxes.forEach(function (box) { + var found = box.getElementsByTagName("div"), + l, + line, + parts, + pieces, + i; + for (l = 0; l < found.length; l += 1) { + line = /**@type{!HTMLElement}*/(found.item(l)); + parts = line.children; + pieces = []; + for (i = 0; i < parts.length; i += 1) { + pieces.push(/**@type{!HTMLElement}*/(parts.item(i))); + } + lines.push(pieces); + boxOf.push(line); + } + }); + lines.forEach(function (pieces, l) { + room.push(boxOf[l].getBoundingClientRect().right); + rects.push(pieces.map(function (piece) { + return piece.getBoundingClientRect(); + })); + }); + // Every part of a line is laid at a place of its own and none of them + // holds the line open, so the line is given the height of the tallest + // one: a line of a footer written in eight points is eight points + // tall, and not the ten points of the style of its paragraph. + rects.forEach(function (found, l) { + var /**@type{!number}*/ + tall = 0; + found.forEach(function (rect) { + tall = Math.max(tall, rect.height); + }); + boxOf[l].style.height = tall + "px"; + }); + lines.forEach(function (pieces, l) { + var /**@type{!number}*/ + edge = 0, + /**@type{!number}*/ + right = room[l], + /**@type{!number}*/ + gap = 4, + /**@type{!number}*/ + left = boxOf[l].getBoundingClientRect().left, + stops = stopsOfLine(boxOf[l]), + /**@type{!number}*/ + next = 0; + pieces.forEach(function (piece, i) { + var rect = rects[l][i], + /**@type{?odf.PageMeasure.TabStop}*/ + stop, + /**@type{!number}*/ + at, + push; + push = 0; + if (i > 0 && stops.length > 0) { + // A tab goes to the first stop past what stands before + // it, and not to the stop of its own number: a line whose + // words run past the stop in the middle goes on to the + // one on the right, as an office writes it. + while (next < stops.length + && left + stops[next].at < edge + gap) { + next += 1; + } + if (next < stops.length) { + stop = stops[next]; + // The stop is taken by the tab whether anything is + // written after it or not: a line that holds two + // tabs and nothing between them writes what follows + // against the second stop. + next += 1; + at = left + stop.at; + if (stop.type === "right") { + at -= rect.width; + } else if (stop.type === "center") { + at -= rect.width / 2; + } + // A stop written for a page of another size stands + // past the edge of this one: what it holds is drawn + // against the edge instead, as an office draws it, + // rather than in the margin or off the page. + at = Math.min(at, right - rect.width); + push = at - rect.left; + } + } + if (rect.width === 0) { + // Nothing is drawn of it, so nothing is moved and + // nothing stands in the way of what follows. + return; + } + if (edge > 0 && rect.left + push < edge + gap) { + // A blank is left between two parts that were pushed + // together, so the two are still read as two. + push = Math.min(edge + gap - rect.left, + Math.max(0, right - rect.right)); + } + if (push !== 0) { + // The part is already drawn against a stop, and is only + // moved from where it stands. + piece.style.transform = piece.style.transform + + " translateX(" + push + "px)"; + } + edge = rect.right + push; + }); + }); + } + /** + * Whether a line holds a field, that is written anew on every page. + * @param {!Element} paragraph + * @param {!Object.} meta + * @return {!boolean} + */ + function holdsAField(paragraph, meta) { + var names = ["page-number", "page-count"].concat(Object.keys(meta)), + /**@type{!number}*/ + i; + for (i = 0; i < names.length; i += 1) { + if (paragraph.getElementsByTagNameNS(textns, names[i]).length > 0) { + return true; + } + } + return false; + } + /** + * How far an element is from the top of the page it is drawn in. + * @param {!Element} element + * @return {!number} + */ + function getTop(element) { + var he = /**@type{!HTMLElement}*/(element), + top = he.offsetTop || 0; + if (he.offsetParent) { + top += getTop(/**@type{!Element}*/(he.offsetParent)); + } + return top; + } + /** + * The room a header or a foot takes once it is written. + * + * A document says how tall its furniture is, and writes in it what it + * writes: a foot of two lines in a box of one is drawn of two all the + * same, and the text of the page is left that much less room. The + * height is measured on a copy drawn out of sight, of the width the + * page gives it. + * @param {!odf.ODFDocumentElement} odfroot + * @param {?Element} source or + * @param {!number} width of the text area, in pixels + * @param {!function(!odf.ODFDocumentElement,!Element):undefined} unstamp + * takes off a copy the names of the styles the canvas + * stamped on it, so the copy is drawn in its own style + * @return {!number} + */ + function roomTaken(odfroot, source, width, unstamp) { + var doc = /**@type{!Document}*/(odfroot.ownerDocument), + htmlns = doc.documentElement.namespaceURI, + /**@type{!Element}*/ + box, + /**@type{!number}*/ + height; + if (!source || width <= 0) { + return 0; + } + box = /**@type{!Element}*/(doc.createElementNS(htmlns, "div")); + /**@type{!HTMLElement}*/(box).style.position = "absolute"; + /**@type{!HTMLElement}*/(box).style.visibility = "hidden"; + /**@type{!HTMLElement}*/(box).style.left = "-10000px"; + /**@type{!HTMLElement}*/(box).style.top = "0"; + /**@type{!HTMLElement}*/(box).style.width = width + "px"; + box.appendChild(doc.importNode(source, true)); + unstamp(odfroot, box); + // The name of the style is the one of the document again, so the + // attribute the rules of that style are written against is written + // anew: it carried the name the canvas stamped, that names nothing + // any more, and a header drawn without its style is drawn of the + // size of a text and no longer of eight points. + odf.Style2CSS.stampStyleClasses(box); + expandSpaces(box); + odfroot.body.appendChild(box); + height = box.getBoundingClientRect().height; + odfroot.body.removeChild(box); + return height; + } + /** + * The margins of a page, once the furniture is written inside them. + * + * A header and a foot are written between the edge of the page and its + * text, so the text is left that much less room: the height the + * document gives them, or the height what they hold takes where that is + * the greater, and the space that parts them from the text where it + * does not give way. The room a header takes is the room it takes on + * every page: the pages of a document are of one height, and a title + * page that carries no header is drawn with the same text area as the + * others. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!odf.PageMeasure.PageDimensions} dims + * @param {!function(!odf.ODFDocumentElement,!Element):undefined} unstamp + * takes off a copy the names of the styles the canvas + * stamped on it + * @return {!odf.PageMeasure.PageDimensions} + */ + function roomForFurniture(odfroot, dims, unstamp) { + var width = dims.pageWidth - dims.marginLeft - dims.marginRight, + /**@type{?Element}*/ + head = dims.otherPages.header || dims.otherPages.headerLeft + || dims.otherPages.headerFirst || dims.firstPage.header + || dims.firstPage.headerLeft || dims.firstPage.headerFirst, + /**@type{?Element}*/ + foot = dims.otherPages.footer || dims.otherPages.footerLeft + || dims.otherPages.footerFirst || dims.firstPage.footer + || dims.firstPage.footerLeft || dims.firstPage.footerFirst; + if (head) { + dims.marginTop += Math.max(dims.header.height, + roomTaken(odfroot, head, width, unstamp)) + dims.header.gap; + } + if (foot) { + dims.marginBottom += Math.max(dims.footer.height, + roomTaken(odfroot, foot, width, unstamp)) + dims.footer.gap; + } + return dims; + } + /** + * A box that holds the shapes of one page, of the size of the sheet. + * @param {!Document} doc + * @param {?string} htmlns + * @param {!odf.PageMeasure.PageDimensions} dims + * @param {!number} left where the page begins across + * @param {!number} top where the page begins + * @return {!HTMLDivElement} + */ + function pageShapesBox(doc, htmlns, dims, left, top) { + var box = /**@type{!HTMLDivElement}*/(doc.createElementNS(htmlns, + "div")); + box.className = "webodf-pageShapes"; + box.style.position = "absolute"; + box.style.left = left + "px"; + box.style.top = top + "px"; + box.style.width = dims.pageWidth + "px"; + box.style.height = dims.pageHeight + "px"; + return box; + } + /** + * @param {!odf.PageMeasure.PageShape} shape + * @return {!boolean} + */ + function behindTheText(shape) { + return shape.background; + } + /** + * @param {!odf.PageMeasure.PageShape} shape + * @return {!boolean} + */ + function overTheText(shape) { + return !shape.background; + } + /** + * Take away the boxes of a former layout, wherever they were put. + * @param {!Element} root + * @return {undefined} + */ + function removeBoxes(root) { + var boxes = root.getElementsByTagName("div"), + /**@type{!Element}*/ + box, + /**@type{!number}*/ + i; + for (i = boxes.length - 1; i >= 0; i -= 1) { + box = /**@type{!Element}*/(boxes.item(i)); + if (box.className === "webodf-pageShapes" + || box.className === "webodf-pageFurniture" + || box.className === "webodf-pageSheet") { + box.parentNode.removeChild(box); + } + } + } + /** + * Take the notes of the foot of a page away, and the room they took. + * @param {!Element} box the page + * @return {undefined} + */ + function clearNotes(box) { + var area = box.lastElementChild; + if (area && area.className === "webodf-pageNotes") { + box.removeChild(area); + } + /**@type{!HTMLElement}*/(box).style.paddingBottom = ""; + } + /** + * The notes of the foot of the page that are called for on a page. + * @param {!Element} box the page + * @return {!Array.} + */ + function notesOf(box) { + var found = box.getElementsByTagNameNS(textns, "note"), + /**@type{!Array.}*/ + notes = [], + /**@type{!Element}*/ + note, + /**@type{!number}*/ + i; + for (i = 0; i < found.length; i += 1) { + note = /**@type{!Element}*/(found.item(i)); + if (note.getAttributeNS(textns, "note-class") === "footnote") { + notes.push(note); + } + } + return notes; + } + /** + * Draw the notes called for on a page at the foot of it. + * + * A note is written at the foot of the page its number stands on, as an + * office writes it, and the text of the page is that much shorter: the + * room the notes take is the padding at the foot of the box, so what + * crosses into it is moved to the page that follows, see "trimPages". + * + * What is drawn is a copy: the note itself is left where it stands in the + * text, as the document is the reader's to show and not to write. + * @param {!Element} box the page + * @return {undefined} + */ + function layNotes(box) { + var doc = /**@type{!Document}*/(box.ownerDocument), + htmlns = /**@type{!string}*/(doc.documentElement.namespaceURI), + notes = notesOf(box), + /**@type{!HTMLElement}*/ + area, + /**@type{!HTMLElement}*/ + rule, + /**@type{!number}*/ + tall; + clearNotes(box); + if (notes.length === 0) { + return; + } + area = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); + area.className = "webodf-pageNotes"; + // The notes stand in the padding at the foot of the box, against the + // text and not against the paper: the padding of the box is the + // margin of the page, which the notes are no part of. + area.style.position = "absolute"; + area.style.bottom = "0"; + area.style.left = /**@type{!HTMLElement}*/(box).style.paddingLeft; + area.style.right = /**@type{!HTMLElement}*/(box).style.paddingRight; + // A line stands between the text and the notes, as an office draws + // it: a quarter of the width of the text, and no wider. + rule = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); + rule.style.width = "25%"; + rule.style.borderTop = "1px solid currentColor"; + rule.style.marginBottom = "0.2em"; + area.appendChild(rule); + notes.forEach(function (note) { + var line = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, + "div")), + number = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, + "span")), + citation = note.getElementsByTagNameNS(textns, + "note-citation").item(0), + body = note.getElementsByTagNameNS(textns, + "note-body").item(0), + /**@type{?Node}*/ + walk; + number.className = "webodf-pageNoteNumber"; + number.style.marginRight = "0.5em"; + number.appendChild(doc.createTextNode(citation + ? String(citation.textContent) + : "")); + // The body itself is not moved and not copied: what it holds is, + // as the rule that hides a body of a note would hide the copy of + // it as well. + walk = body + ? body.firstChild + : null; + while (walk) { + line.appendChild(walk.cloneNode(true)); + walk = walk.nextSibling; + } + // The number of the note is written at the head of the first + // line of it and not above it, in the letters of the note: it is + // put inside what was copied, and not before it. + if (line.firstElementChild) { + line.firstElementChild.insertBefore(number, + line.firstElementChild.firstChild); + } else { + line.insertBefore(number, line.firstChild); + } + area.appendChild(line); + }); + box.appendChild(area); + tall = area.getBoundingClientRect().height; + /**@type{!HTMLElement}*/(box).style.paddingBottom = tall + "px"; + } + /** + * How far the foot of a page reaches into the text of it. + * + * The foot is drawn under the text, in the margin: where it is taller + * than the margin left for it, it stands over the last lines, and this + * says by how much. + * @param {!Element} box the page + * @param {?Element} furniture what is drawn around the page + * @return {!number} nothing where the foot stands clear of the text + */ + function footOver(box, furniture) { + var bottom = box.getBoundingClientRect().bottom, + /**@type{!number}*/ + top = 0, + /**@type{!NodeList}*/ + parts, + /**@type{!ClientRect}*/ + rect, + /**@type{!number}*/ + i; + if (!furniture) { + return 0; + } + parts = furniture.getElementsByTagName("*"); + top = bottom; + for (i = 0; i < parts.length; i += 1) { + rect = /**@type{!Element}*/(parts.item(i)) + .getBoundingClientRect(); + // Only what is drawn under the middle of the page is the foot of + // it: a header stands over the text and takes nothing from it + // here. + if (rect.height > 0 + && rect.top > bottom - box.getBoundingClientRect().height + / 2) { + top = Math.min(top, rect.top); + } + } + return Math.max(0, Math.round(bottom - top)); + } + this.roomTaken = roomTaken; + this.roomForFurniture = roomForFurniture; + this.spreadLines = spreadLines; + this.getTop = getTop; + this.pageShapesBox = pageShapesBox; + this.behindTheText = behindTheText; + this.overTheText = overTheText; + this.removeBoxes = removeBoxes; + this.clearNotes = clearNotes; + this.footOver = footOver; + this.layNotes = layNotes; + this.notesOf = notesOf; + this.stopsOfLine = stopsOfLine; + this.layOutTabStops = layOutTabStops; + this.partsOfParagraph = partsOfParagraph; + this.raiseTabs = raiseTabs; + this.expandSpaces = expandSpaces; + this.holdsAField = holdsAField; + this.layOutTabsInText = layOutTabsInText; +}; + +/** + * @type {!odf.PageFurnitureImpl} + */ +odf.PageFurniture = new odf.PageFurnitureImpl(); diff --git a/webodf/lib/odf/PageMeasure.js b/webodf/lib/odf/PageMeasure.js index 892d67d52..eaa5f87b9 100644 --- a/webodf/lib/odf/PageMeasure.js +++ b/webodf/lib/odf/PageMeasure.js @@ -182,8 +182,7 @@ odf.PageMeasureImpl = function PageMeasureImpl() { /** * Write a page in the columns its layout asks for. * @param {!Element} box the page - * @param {!{columnCount:!number,columnGap:!number}} dims what the layout - * of the page says of its columns + * @param {!odf.PageMeasure.PageDimensions} dims * @return {undefined} */ function setColumns(box, dims) { @@ -600,3 +599,62 @@ odf.PageMeasureImpl = function PageMeasureImpl() { * @type {!odf.PageMeasureImpl} */ odf.PageMeasure = new odf.PageMeasureImpl(); + +/**@typedef{{ + node:!Element, + background:!boolean, + order:!number +}}*/ +odf.PageMeasure.PageShape; +/**@typedef{{ + at:!number, + type:!string +}}*/ +odf.PageMeasure.TabStop; +/**@typedef{{ + text:!Element, + root:!odf.ODFDocumentElement, + doc:!Document, + htmlns:?string, + plan:!Object, + waiting:!Array., + chunk:!number, + slice:!number, + page:!number, + top:!number, + sheet:!CSSStyleSheet, + heightRule:!number +}}*/ +odf.PageMeasure.Filling; + +/**@typedef{{ + shapes:!Array., + header:?Element, + footer:?Element, + headerLeft:?Element, + footerLeft:?Element, + headerFirst:?Element, + footerFirst:?Element +}}*/ +odf.PageMeasure.PageFurniture; +/**@typedef{{ + height:!number, + gap:!number +}}*/ +odf.PageMeasure.PageArea; +/**@typedef{{ + pageWidth:!number, + pageHeight:!number, + marginTop:!number, + marginBottom:!number, + marginLeft:!number, + marginRight:!number, + pageSeparation:!number, + columnCount:!number, + columnGap:!number, + header:!odf.PageMeasure.PageArea, + footer:!odf.PageMeasure.PageArea, + firstPage:!odf.PageMeasure.PageFurniture, + otherPages:!odf.PageMeasure.PageFurniture +}}*/ +odf.PageMeasure.PageDimensions; diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index e3cfd20a7..d1b2c7f2a 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -31,6 +31,8 @@ odf.TextLayout = function TextLayout() { "use strict"; var /**@const@type{!odf.PageMeasureImpl}*/ measure = odf.PageMeasure, + /**@const@type{!odf.PageFurnitureImpl}*/ + furniture = odf.PageFurniture, /**@type{?odf.ODFDocumentElement}*/ styleCacheRoot = null, /**@type{!Object.}*/ @@ -183,7 +185,7 @@ odf.TextLayout = function TextLayout() { * A4 in pixels at 96 dpi, and the margin LibreOffice writes, for a * document that declares no page layout at all. * @const - * @type{!odf.TextLayout.PageDimensions} + * @type{!odf.PageMeasure.PageDimensions} */ defaultDimensions = { pageWidth: 794, @@ -241,7 +243,7 @@ odf.TextLayout = function TextLayout() { * @param {!Element} layout the "style:page-layout" * @param {!string} name "header-style" or "footer-style" * @param {!string} gap "margin-bottom" for a header, "margin-top" for a footer - * @return {!odf.TextLayout.PageArea} + * @return {!odf.PageMeasure.PageArea} */ function readPageArea(layout, name, gap) { var style = domUtils.getDirectChild(layout, stylens, name), @@ -403,7 +405,7 @@ odf.TextLayout = function TextLayout() { * of a page carry no area of their own. * @param {!odf.ODFDocumentElement} odfroot * @param {?Element} masterPage - * @return {!Array.} + * @return {!Array.} */ function shapesOf(odfroot, masterPage) { var shapes = [], @@ -425,7 +427,7 @@ odf.TextLayout = function TextLayout() { * Draw the shapes of a master page on one page, where the shape itself * says where it goes: what a master page draws is placed against the * sheet, so the box is the sheet and the offsets are the ones written. - * @param {!Array.} shapes + * @param {!Array.} shapes * @param {!HTMLDivElement} box * @return {undefined} */ @@ -469,7 +471,7 @@ odf.TextLayout = function TextLayout() { * What a master page writes at the top and at the bottom of a page. * @param {!odf.ODFDocumentElement} odfroot * @param {?Element} masterPage - * @return {!odf.TextLayout.PageFurniture} + * @return {!odf.PageMeasure.PageFurniture} */ function readFurniture(odfroot, masterPage) { /** @@ -544,7 +546,7 @@ odf.TextLayout = function TextLayout() { * page of each paragraph, which it does not do yet. * @param {!odf.ODFDocumentElement} odfroot * @param {?Element} masterPage - * @return {!odf.TextLayout.PageDimensions} + * @return {!odf.PageMeasure.PageDimensions} */ function readPageDimensions(odfroot, masterPage) { var @@ -559,7 +561,7 @@ odf.TextLayout = function TextLayout() { pageLayout, /**@type{!Element}*/ layout, - /**@type{!odf.TextLayout.PageDimensions}*/ + /**@type{!odf.PageMeasure.PageDimensions}*/ dims, /**@type{!{count:!number,gap:!number}}*/ columns, @@ -725,7 +727,7 @@ odf.TextLayout = function TextLayout() { * of the page on the right, with a tab between each of them. * @param {!odf.ODFDocumentElement} odfroot * @param {!Element} paragraph - * @return {!Array.} + * @return {!Array.} */ function tabStopsOf(odfroot, paragraph) { var /**@type{!string}*/ @@ -738,7 +740,7 @@ odf.TextLayout = function TextLayout() { list = null, /**@type{!number}*/ depth = 0, - /**@type{!Array.}*/ + /**@type{!Array.}*/ stops = [], /**@type{?Element}*/ node; @@ -785,464 +787,6 @@ odf.TextLayout = function TextLayout() { } return stops; } - /** - * Write the runs of spaces of a header as the spaces they stand for. - * - * The canvas does that for the text of the document alone, and a header - * is written in the styles of the document, so a "text:s" is still an - * element here and nothing of it is seen: "Page 1 of 809" was read - * "Page 1of 809". - * @param {!Element} box a header or a footer, drawn for a page - * @return {undefined} - */ - function expandSpaces(box) { - var doc = box.ownerDocument, - spaces = box.getElementsByTagNameNS(textns, "s"), - /**@type{!Array.}*/ - found = [], - i; - for (i = 0; i < spaces.length; i += 1) { - found.push(/**@type{!Element}*/(spaces.item(i))); - } - found.forEach(function (space) { - var count = parseInt(space.getAttributeNS(textns, "c"), 10), - run = ""; - if (!(count > 1)) { - count = 1; - } - while (count > 0) { - run += "\u00a0"; - count -= 1; - } - if (space.parentNode) { - space.parentNode.replaceChild(doc.createTextNode(run), space); - } - }); - } - /** - * Bring the tabs of a paragraph up to be children of the paragraph. - * - * A document may write a tab deep in the spans that carry the styles of - * a line, and the parts of the line are told apart at the paragraph: the - * spans around a tab are cut in two, so the tab stands between them and - * each part keeps the styles it was written with. - * @param {!Element} paragraph - * @return {undefined} - */ - function raiseTabs(paragraph) { - var tabs = paragraph.getElementsByTagNameNS(textns, "tab"), - /**@type{!Array.}*/ - found = [], - i; - for (i = 0; i < tabs.length; i += 1) { - found.push(/**@type{!Element}*/(tabs.item(i))); - } - found.forEach(function (tab) { - var /**@type{?Node}*/ - parent = tab.parentNode, - /**@type{!Element}*/ - tail, - /**@type{?Node}*/ - node; - while (parent && parent !== paragraph) { - tail = /**@type{!Element}*/( - /**@type{!Element}*/(parent).cloneNode(false) - ); - node = tab.nextSibling; - while (node) { - tail.appendChild(node); - node = tab.nextSibling; - } - if (parent.parentNode) { - parent.parentNode.insertBefore(tab, parent.nextSibling); - if (tail.firstChild) { - parent.parentNode.insertBefore(tail, - tab.nextSibling); - } - } - parent = tab.parentNode; - } - }); - } - /** - * The parts of a paragraph, that is what stands between its tabs. - * - * The nodes of the paragraph are taken out of it and put in a span for - * each part, the first of them holding what stands before the first tab. - * @param {!Element} paragraph - * @param {!Document} doc - * @param {!string} htmlns - * @return {!Array.} - */ - function partsOfParagraph(paragraph, doc, htmlns) { - var /**@type{!Array.}*/ - parts = [], - /**@type{!HTMLElement}*/ - part = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, - "span")), - /**@type{?Node}*/ - node = paragraph.firstChild, - /**@type{?Node}*/ - next, - /**@type{!Array.}*/ - pieces, - /**@type{!number}*/ - i; - parts.push(part); - while (node) { - next = node.nextSibling; - if (node.nodeType === Node.ELEMENT_NODE - && /**@type{!Element}*/(node).namespaceURI === textns - && /**@type{!Element}*/(node).localName === "tab") { - paragraph.removeChild(node); - part = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, - "span")); - parts.push(part); - } else if (node.nodeType === Node.TEXT_NODE - && String(node.textContent).indexOf("\t") !== -1) { - // The canvas writes a "text:tab" as a tab of a terminal - // before a text is drawn, so a tab is a letter here. - pieces = String(node.textContent).split("\t"); - paragraph.removeChild(node); - for (i = 0; i < pieces.length; i += 1) { - if (i > 0) { - part = /**@type{!HTMLElement}*/(doc.createElementNS( - htmlns, - "span" - )); - parts.push(part); - } - if (pieces[i] !== "") { - part.appendChild(doc.createTextNode(pieces[i])); - } - } - } else { - part.appendChild(node); - } - node = next; - } - return parts; - } - /** - * Set the parts of a paragraph against the tab stops it is written with. - * - * A tab is drawn as a tab of a terminal otherwise, that walks to the next - * stop of eight letters, so a title, a date and a number of a page ran - * into one another. Each part is laid where its stop says instead, and - * against it as its stop asks: the standard calls that "style:type" of a - * "style:tab-stop". - * @param {!odf.ODFDocumentElement} odfroot - * @param {!Element} paragraph - * @return {undefined} - */ - function layOutTabStops(odfroot, paragraph) { - var doc = /**@type{!Document}*/(paragraph.ownerDocument), - htmlns = "http://www.w3.org/1999/xhtml", - stops = tabStopsOf(odfroot, paragraph), - /**@type{!Array.}*/ - parts, - /**@type{!HTMLElement}*/ - line; - if (stops.length === 0) { - return; - } - raiseTabs(paragraph); - if (!paragraph.getElementsByTagNameNS(textns, "tab").length - && String(paragraph.textContent).indexOf("\t") === -1) { - // A line without a tab is written as it stands: nothing of it is - // moved, and nothing of it can be lost. - return; - } - parts = partsOfParagraph(paragraph, doc, htmlns); - if (parts.length < 2) { - // Nothing was told apart, so what was taken from the paragraph - // is put back where it was. - while (parts[0].firstChild) { - paragraph.appendChild(parts[0].firstChild); - } - return; - } - // The parts are laid in a box of the page rather than in the - // paragraph: a style set on an element of the document is not the - // canvas's to set, and the document is read as broken when it is. - line = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); - line.style.position = "relative"; - // The stops of the line are written on it: a tab goes to the first - // stop past what stands before it, which is known once the line is - // drawn and measured, see "spreadLines". - line.setAttributeNS(webodfhelperns, "webodfhelper:stops", - stops.map(function (stop) { - return String(Math.round(stop.at)) + ":" + stop.type; - }).join(",")); - paragraph.appendChild(line); - // The line of the paragraph holds its own height from here on: the - // zero width space that keeps an empty paragraph from collapsing - // would add a line of the size of the style of the paragraph, and a - // footer of eight points would stand ten points apart. - paragraph.setAttributeNS(webodfhelperns, "webodfhelper:laidout", - "true"); - parts.forEach(function (piece, index) { - var /**@type{?odf.TextLayout.TabStop}*/ - stop = index === 0 ? null : stops[index - 1]; - piece.style.position = "absolute"; - piece.style.whiteSpace = "pre"; - if (!stop) { - piece.style.left = "0"; - line.appendChild(piece); - return; - } - // A stop is written from the left edge of the text of the page, - // and a document may put one where the page is no longer wide - // enough for it: the last stop is then the right edge itself. - piece.style.left = "min(" + stop.at + "px, 100%)"; - if (stop.type === "center") { - piece.style.transform = "translateX(-50%)"; - } else if (stop.type === "right") { - piece.style.transform = "translateX(-100%)"; - } - line.appendChild(piece); - }); - - } - /** - * Lay the tabs of a paragraph of the text at their stops. - * - * A header is drawn in a box of its own and every part of it is laid at - * its stop; a paragraph of the text keeps the first of its parts in the - * flow of the text, so that the line holds its height and its words wrap - * as they would: an entry of a table of contents is written from the - * left, and the number of the page it names is laid against the stop on - * the right. - * - * Nothing is measured here: the stops are written where the document - * says, and the parts are laid there by the browser. - * @param {!odf.ODFDocumentElement} odfroot - * @param {!Element} paragraph - * @return {undefined} - */ - function layOutTabsInText(odfroot, paragraph) { - var doc = /**@type{!Document}*/(paragraph.ownerDocument), - htmlns = "http://www.w3.org/1999/xhtml", - stops = tabStopsOf(odfroot, paragraph), - /**@type{!Array.}*/ - parts, - /**@type{!HTMLElement}*/ - line; - if (stops.length === 0 - || paragraph.hasAttributeNS(webodfhelperns, "laidout")) { - return; - } - raiseTabs(paragraph); - if (!paragraph.getElementsByTagNameNS(textns, "tab").length - && String(paragraph.textContent).indexOf("\t") === -1) { - return; - } - parts = partsOfParagraph(paragraph, doc, htmlns); - if (parts.length < 2) { - while (parts[0].firstChild) { - paragraph.appendChild(parts[0].firstChild); - } - return; - } - line = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); - line.style.position = "relative"; - paragraph.appendChild(line); - paragraph.setAttributeNS(webodfhelperns, "webodfhelper:laidout", - "true"); - parts.forEach(function (piece, index) { - var /**@type{?odf.TextLayout.TabStop}*/ - stop = index === 0 - ? null - : stops[Math.min(index, stops.length) - 1], - /**@type{?odf.TextLayout.TabStop}*/ - before = index > 1 - ? stops[Math.min(index - 1, stops.length) - 1] - : null; - if (!stop) { - // The first part is written as the text is: it holds the - // height of the line and wraps where the page ends. - line.appendChild(piece); - return; - } - if (stop.type === "left" || stop.type === "char") { - // A part that begins at a stop on the left is written in the - // flow of the line, and what stands before it is held to the - // width of its own slot: a label longer than its slot pushes - // what follows to the right, as a tab of a text does, where - // a part laid against the stop would be written over it. - /**@type{!HTMLElement}*/(parts[index - 1]).style.display = - "inline-block"; - /**@type{!HTMLElement}*/(parts[index - 1]).style.minWidth = - Math.max(0, stop.at - (before - ? before.at - : 0)) + "px"; - piece.style.whiteSpace = "pre-wrap"; - line.appendChild(piece); - return; - } - piece.style.position = "absolute"; - piece.style.whiteSpace = "pre"; - piece.style.top = "0"; - piece.style.left = "min(" + stop.at + "px, 100%)"; - if (stop.type === "center") { - piece.style.transform = "translateX(-50%)"; - } else { - piece.style.transform = "translateX(-100%)"; - } - line.appendChild(piece); - }); - } - /** - * The tab stops a line was drawn with, as it carries them. - * @param {!HTMLElement} line - * @return {!Array.} - */ - function stopsOfLine(line) { - var written = line.getAttributeNS(webodfhelperns, "stops") || "", - /**@type{!Array.}*/ - stops = []; - if (!written) { - return stops; - } - written.split(",").forEach(function (one) { - var parts = one.split(":"); - if (parts.length === 2) { - stops.push({at: parseFloat(parts[0]), type: parts[1]}); - } - }); - return stops; - } - /** - * Push the parts of the lines apart where they would be written over. - * - * A part is laid at its stop, and a part that runs past the next stop - * would be written over by the one that follows it: the one that follows - * is pushed to the right, as a tab of a text does, so nothing is hidden. - * A part is never pushed off the page: a line too full for its stops is - * drawn tight rather than half of it lost. - * - * The parts of every page are read before any of them is moved: a read - * that follows a write asks the browser to lay the whole page out again, - * and a document of a hundred pages would be drawn a hundred times over. - * @param {!Array.} boxes the headers and the footers drawn - * @return {undefined} - */ - function spreadLines(boxes) { - var /**@type{!Array.>}*/ - lines = [], - /**@type{!Array.>}*/ - rects = [], - /**@type{!Array.}*/ - room = [], - /**@type{!Array.}*/ - boxOf = []; - boxes.forEach(function (box) { - var found = box.getElementsByTagName("div"), - l, - line, - parts, - pieces, - i; - for (l = 0; l < found.length; l += 1) { - line = /**@type{!HTMLElement}*/(found.item(l)); - parts = line.children; - pieces = []; - for (i = 0; i < parts.length; i += 1) { - pieces.push(/**@type{!HTMLElement}*/(parts.item(i))); - } - lines.push(pieces); - boxOf.push(line); - } - }); - lines.forEach(function (pieces, l) { - room.push(boxOf[l].getBoundingClientRect().right); - rects.push(pieces.map(function (piece) { - return piece.getBoundingClientRect(); - })); - }); - // Every part of a line is laid at a place of its own and none of them - // holds the line open, so the line is given the height of the tallest - // one: a line of a footer written in eight points is eight points - // tall, and not the ten points of the style of its paragraph. - rects.forEach(function (found, l) { - var /**@type{!number}*/ - tall = 0; - found.forEach(function (rect) { - tall = Math.max(tall, rect.height); - }); - boxOf[l].style.height = tall + "px"; - }); - lines.forEach(function (pieces, l) { - var /**@type{!number}*/ - edge = 0, - /**@type{!number}*/ - right = room[l], - /**@type{!number}*/ - gap = 4, - /**@type{!number}*/ - left = boxOf[l].getBoundingClientRect().left, - stops = stopsOfLine(boxOf[l]), - /**@type{!number}*/ - next = 0; - pieces.forEach(function (piece, i) { - var rect = rects[l][i], - /**@type{?odf.TextLayout.TabStop}*/ - stop, - /**@type{!number}*/ - at, - push; - push = 0; - if (i > 0 && stops.length > 0) { - // A tab goes to the first stop past what stands before - // it, and not to the stop of its own number: a line whose - // words run past the stop in the middle goes on to the - // one on the right, as an office writes it. - while (next < stops.length - && left + stops[next].at < edge + gap) { - next += 1; - } - if (next < stops.length) { - stop = stops[next]; - // The stop is taken by the tab whether anything is - // written after it or not: a line that holds two - // tabs and nothing between them writes what follows - // against the second stop. - next += 1; - at = left + stop.at; - if (stop.type === "right") { - at -= rect.width; - } else if (stop.type === "center") { - at -= rect.width / 2; - } - // A stop written for a page of another size stands - // past the edge of this one: what it holds is drawn - // against the edge instead, as an office draws it, - // rather than in the margin or off the page. - at = Math.min(at, right - rect.width); - push = at - rect.left; - } - } - if (rect.width === 0) { - // Nothing is drawn of it, so nothing is moved and - // nothing stands in the way of what follows. - return; - } - if (edge > 0 && rect.left + push < edge + gap) { - // A blank is left between two parts that were pushed - // together, so the two are still read as two. - push = Math.min(edge + gap - rect.left, - Math.max(0, right - rect.right)); - } - if (push !== 0) { - // The part is already drawn against a stop, and is only - // moved from where it stands. - piece.style.transform = piece.style.transform - + " translateX(" + push + "px)"; - } - edge = rect.right + push; - }); - }); - } /** * Give back to the copies of a header the names of the styles the * document wrote, where the canvas stamped names of its own. @@ -1284,23 +828,6 @@ odf.TextLayout = function TextLayout() { } }); } - /** - * Whether a line holds a field, that is written anew on every page. - * @param {!Element} paragraph - * @param {!Object.} meta - * @return {!boolean} - */ - function holdsAField(paragraph, meta) { - var names = ["page-number", "page-count"].concat(Object.keys(meta)), - /**@type{!number}*/ - i; - for (i = 0; i < names.length; i += 1) { - if (paragraph.getElementsByTagNameNS(textns, names[i]).length > 0) { - return true; - } - } - return false; - } /** * The head or the foot of a page as it is drawn, ready to be copied. * @@ -1338,10 +865,10 @@ odf.TextLayout = function TextLayout() { // any more, and a header drawn without its style is drawn of the // size of a text and no longer of eight points. odf.Style2CSS.stampStyleClasses(box); - expandSpaces(box); + furniture.expandSpaces(box); paragraphsOf(box).forEach(function (paragraph, index) { - layOutTabStops(odfroot, paragraph); - if (holdsAField(paragraph, meta)) { + furniture.layOutTabStops(odfroot, paragraph, tabStopsOf); + if (furniture.holdsAField(paragraph, meta)) { fields.push(index); } }); @@ -1403,39 +930,10 @@ odf.TextLayout = function TextLayout() { lines = paragraphsOf(box); ready.fields.forEach(function (index) { if (lines[index]) { - layOutTabStops(odfroot, lines[index]); + furniture.layOutTabStops(odfroot, lines[index], tabStopsOf); } }); } - /** - * The header or the footer a page carries. A master page may write one for - * the pages on the left and another for the pages on the right, which is - * how a book puts the number of the page on the outer edge: the first page - * is a right one, so the pages of an even number are the left ones. Where - * "style:header-left" is not written, the header of the master page is the - * one of every page, see the part 1 of the standard, "style:header-left". - * - * A first page may carry a header of its own, "style:header-first", which - * the standard added in 1.3 and which the office suites of today write - * where a title page was written with a master page of its own before. - * @param {!PagePlan} plan - * @param {!string} which "header" or "footer" - * @param {!number} page the number of the page, from one - * @return {?Element} - */ - function pageArea(plan, which, page) { - var furniture = plan.furnitureAt(page - 1), - first = which === "header" ? furniture.headerFirst : furniture.footerFirst, - left = which === "header" ? furniture.headerLeft : furniture.footerLeft, - right = which === "header" ? furniture.header : furniture.footer; - if (page === 1 && first) { - return first; - } - if (page % 2 === 0 && left) { - return left; - } - return right; - } /** * @param {!odf.ODFDocumentElement} odfroot * @param {!string} name @@ -1464,19 +962,6 @@ odf.TextLayout = function TextLayout() { function getOfficeText(odfroot) { return domUtils.getDirectChild(odfroot.body, officens, "text"); } - /** - * How far an element is from the top of the page it is drawn in. - * @param {!Element} element - * @return {!number} - */ - function getTop(element) { - var he = /**@type{!HTMLElement}*/(element), - top = he.offsetTop || 0; - if (he.offsetParent) { - top += getTop(/**@type{!Element}*/(he.offsetParent)); - } - return top; - } /** * Lay the tabs of every paragraph of a text at their stops. * @@ -1493,7 +978,7 @@ odf.TextLayout = function TextLayout() { return; } paragraphsOf(text).forEach(function (paragraph) { - layOutTabsInText(odfroot, paragraph); + furniture.layOutTabsInText(odfroot, paragraph, tabStopsOf); }); } /** @@ -1574,84 +1059,6 @@ odf.TextLayout = function TextLayout() { } return sequence; } - /** - * The room a header or a foot takes once it is written. - * - * A document says how tall its furniture is, and writes in it what it - * writes: a foot of two lines in a box of one is drawn of two all the - * same, and the text of the page is left that much less room. The - * height is measured on a copy drawn out of sight, of the width the - * page gives it. - * @param {!odf.ODFDocumentElement} odfroot - * @param {?Element} source or - * @param {!number} width of the text area, in pixels - * @return {!number} - */ - function roomTaken(odfroot, source, width) { - var doc = /**@type{!Document}*/(odfroot.ownerDocument), - htmlns = doc.documentElement.namespaceURI, - /**@type{!Element}*/ - box, - /**@type{!number}*/ - height; - if (!source || width <= 0) { - return 0; - } - box = /**@type{!Element}*/(doc.createElementNS(htmlns, "div")); - /**@type{!HTMLElement}*/(box).style.position = "absolute"; - /**@type{!HTMLElement}*/(box).style.visibility = "hidden"; - /**@type{!HTMLElement}*/(box).style.left = "-10000px"; - /**@type{!HTMLElement}*/(box).style.top = "0"; - /**@type{!HTMLElement}*/(box).style.width = width + "px"; - box.appendChild(doc.importNode(source, true)); - unstampStyleNames(odfroot, box); - // The name of the style is the one of the document again, so the - // attribute the rules of that style are written against is written - // anew: it carried the name the canvas stamped, that names nothing - // any more, and a header drawn without its style is drawn of the - // size of a text and no longer of eight points. - odf.Style2CSS.stampStyleClasses(box); - expandSpaces(box); - odfroot.body.appendChild(box); - height = box.getBoundingClientRect().height; - odfroot.body.removeChild(box); - return height; - } - /** - * The margins of a page, once the furniture is written inside them. - * - * A header and a foot are written between the edge of the page and its - * text, so the text is left that much less room: the height the - * document gives them, or the height what they hold takes where that is - * the greater, and the space that parts them from the text where it - * does not give way. The room a header takes is the room it takes on - * every page: the pages of a document are of one height, and a title - * page that carries no header is drawn with the same text area as the - * others. - * @param {!odf.ODFDocumentElement} odfroot - * @param {!odf.TextLayout.PageDimensions} dims - * @return {!odf.TextLayout.PageDimensions} - */ - function roomForFurniture(odfroot, dims) { - var width = dims.pageWidth - dims.marginLeft - dims.marginRight, - /**@type{?Element}*/ - head = dims.otherPages.header || dims.otherPages.headerLeft - || dims.otherPages.headerFirst || dims.firstPage.header - || dims.firstPage.headerLeft || dims.firstPage.headerFirst, - /**@type{?Element}*/ - foot = dims.otherPages.footer || dims.otherPages.footerLeft - || dims.otherPages.footerFirst || dims.firstPage.footer - || dims.firstPage.footerLeft || dims.firstPage.footerFirst; - if (head) { - dims.marginTop += Math.max(dims.header.height, - roomTaken(odfroot, head, width)) + dims.header.gap; - } - if (foot) { - dims.marginBottom += Math.max(dims.footer.height, - roomTaken(odfroot, foot, width)) + dims.footer.gap; - } - return dims; - } /** * The plan of the pages: the geometry of each master page a text goes * through, and the page each one begins at. A page takes the geometry of @@ -1663,10 +1070,11 @@ odf.TextLayout = function TextLayout() { function PagePlan(odfroot) { var self = this, sequence = masterPageSequence(odfroot), - /**@type{!Array.}*/ + /**@type{!Array.}*/ geometry = sequence.map(function (entry) { - return roomForFurniture(odfroot, - readPageDimensions(odfroot, entry.master)); + return furniture.roomForFurniture(odfroot, + readPageDimensions(odfroot, entry.master), + unstampStyleNames); }), /**@type{!Array.}*/ // Until the pages are drawn, each change is taken to be one page @@ -1679,7 +1087,7 @@ odf.TextLayout = function TextLayout() { /** * The geometry of a page, from zero. * @param {!number} page - * @return {!odf.TextLayout.PageDimensions} + * @return {!odf.PageMeasure.PageDimensions} */ this.at = function (page) { var i = starts.length - 1; @@ -1704,7 +1112,7 @@ odf.TextLayout = function TextLayout() { /** * The furniture of a page, the master page in force at it. * @param {!number} page - * @return {!odf.TextLayout.PageFurniture} + * @return {!odf.PageMeasure.PageFurniture} */ this.furnitureAt = function (page) { var dims = self.at(page); @@ -1744,8 +1152,8 @@ odf.TextLayout = function TextLayout() { if (!sequence[i].paragraph) { page = Math.min(1, pages - 1); } else { - top = getTop(/**@type{!Element}*/(sequence[i].paragraph)) - - getTop(/**@type{!Element}*/(getOfficeText(odfroot))); + top = furniture.getTop(/**@type{!Element}*/(sequence[i].paragraph)) + - furniture.getTop(/**@type{!Element}*/(getOfficeText(odfroot))); page = 0; while (page + 1 < pages && self.top(page + 1) <= top) { page += 1; @@ -1794,58 +1202,39 @@ odf.TextLayout = function TextLayout() { }; } /** - * A box that holds the shapes of one page, of the size of the sheet. - * @param {!Document} doc - * @param {?string} htmlns - * @param {!odf.TextLayout.PageDimensions} dims - * @param {!number} left where the page begins across - * @param {!number} top where the page begins - * @return {!HTMLDivElement} - */ - function pageShapesBox(doc, htmlns, dims, left, top) { - var box = /**@type{!HTMLDivElement}*/(doc.createElementNS(htmlns, - "div")); - box.className = "webodf-pageShapes"; - box.style.position = "absolute"; - box.style.left = left + "px"; - box.style.top = top + "px"; - box.style.width = dims.pageWidth + "px"; - box.style.height = dims.pageHeight + "px"; - return box; - } - /** - * @param {!odf.TextLayout.PageShape} shape - * @return {!boolean} - */ - function behindTheText(shape) { - return shape.background; - } - /** - * @param {!odf.TextLayout.PageShape} shape - * @return {!boolean} - */ - function overTheText(shape) { - return !shape.background; - } - /** - * Take away the boxes of a former layout, wherever they were put. - * @param {!Element} root - * @return {undefined} + * The header or the footer a page carries. A master page may write one for + * the pages on the left and another for the pages on the right, which is + * how a book puts the number of the page on the outer edge: the first page + * is a right one, so the pages of an even number are the left ones. Where + * "style:header-left" is not written, the header of the master page is the + * one of every page, see the part 1 of the standard, "style:header-left". + * + * A first page may carry a header of its own, "style:header-first", which + * the standard added in 1.3 and which the office suites of today write + * where a title page was written with a master page of its own before. + * @param {!PagePlan} plan + * @param {!string} which "header" or "footer" + * @param {!number} page the number of the page, from one + * @return {?Element} */ - function removeBoxes(root) { - var boxes = root.getElementsByTagName("div"), - /**@type{!Element}*/ - box, - /**@type{!number}*/ - i; - for (i = boxes.length - 1; i >= 0; i -= 1) { - box = /**@type{!Element}*/(boxes.item(i)); - if (box.className === "webodf-pageShapes" - || box.className === "webodf-pageFurniture" - || box.className === "webodf-pageSheet") { - box.parentNode.removeChild(box); - } + function pageArea(plan, which, page) { + var drawn = plan.furnitureAt(page - 1), + first = which === "header" + ? drawn.headerFirst + : drawn.footerFirst, + left = which === "header" + ? drawn.headerLeft + : drawn.footerLeft, + right = which === "header" + ? drawn.header + : drawn.footer; + if (page === 1 && first) { + return first; } + if (page % 2 === 0 && left) { + return left; + } + return right; } /** * Draw the header and the footer of every page. @@ -1877,9 +1266,9 @@ odf.TextLayout = function TextLayout() { header, /**@type{?Element}*/ footer, - /**@type{!Array.}*/ + /**@type{!Array.}*/ shapes, - /**@type{!odf.TextLayout.PageDimensions}*/ + /**@type{!odf.PageMeasure.PageDimensions}*/ dims, /**@type{!Array.}*/ drawn = [], @@ -1895,8 +1284,8 @@ odf.TextLayout = function TextLayout() { n; first = from || 0; if (first === 0) { - removeBoxes(pagesDiv); - removeBoxes(behind); + furniture.removeBoxes(pagesDiv); + furniture.removeBoxes(behind); } // The body no longer paints the ground of the whole text: each page // is painted on its own, see the rule of "office|body" in @@ -1912,7 +1301,7 @@ odf.TextLayout = function TextLayout() { footer = pageArea(plan, "footer", n + 1); // The sheet of the page, that carries its fill: it is drawn // first, and everything of the page is drawn over it. - box = pageShapesBox(doc, htmlns, dims, left, top); + box = furniture.pageShapesBox(doc, htmlns, dims, left, top); box.className = "webodf-pageSheet"; behind.insertBefore(box, behind.firstChild); shapes = plan.furnitureAt(n).shapes; @@ -1921,11 +1310,11 @@ odf.TextLayout = function TextLayout() { // and the footer do. What is drawn behind it is put in the // body of the document instead: the body carries the fill of // the page, that would otherwise cover the shape. - box = pageShapesBox(doc, htmlns, dims, left, top); - fillPageShapes(shapes.filter(overTheText), box); + box = furniture.pageShapesBox(doc, htmlns, dims, left, top); + fillPageShapes(shapes.filter(furniture.overTheText), box); pagesDiv.appendChild(box); - box = pageShapesBox(doc, htmlns, dims, left, top); - fillPageShapes(shapes.filter(behindTheText), box); + box = furniture.pageShapesBox(doc, htmlns, dims, left, top); + fillPageShapes(shapes.filter(furniture.behindTheText), box); behind.insertBefore(box, behind.firstChild); } if (header) { @@ -1962,7 +1351,7 @@ odf.TextLayout = function TextLayout() { drawn.push(box); } } - spreadLines(drawn); + furniture.spreadLines(drawn); } /** * The paragraph a node stands in, if any. @@ -2014,7 +1403,7 @@ odf.TextLayout = function TextLayout() { } } lines.forEach(function (paragraph) { - layOutTabStops(odfroot, paragraph); + furniture.layOutTabStops(odfroot, paragraph, tabStopsOf); }); } /** @@ -2301,7 +1690,7 @@ odf.TextLayout = function TextLayout() { sheet.insertRule("*[webodfhelper|breakbefore] {break-before:column;}", sheet.cssRules.length); runs.forEach(function (run, index) { - var /**@type{!odf.TextLayout.PageDimensions}*/ + var /**@type{!odf.PageMeasure.PageDimensions}*/ dims = plan.at(sofar), /**@type{!number}*/ width = dims.pageWidth - dims.marginLeft - dims.marginRight, @@ -2348,7 +1737,7 @@ odf.TextLayout = function TextLayout() { count = 0; first = sheet.cssRules.length; pages.forEach(function (broken, index) { - var /**@type{!odf.TextLayout.PageDimensions}*/ + var /**@type{!odf.PageMeasure.PageDimensions}*/ dims = plan.at(count), /**@type{!number}*/ width = dims.pageWidth - dims.marginLeft @@ -2371,7 +1760,7 @@ odf.TextLayout = function TextLayout() { /**@type{!boolean}*/ settled = true; pages.forEach(function (broken, index) { - var /**@type{!odf.TextLayout.PageDimensions}*/ + var /**@type{!odf.PageMeasure.PageDimensions}*/ dims = plan.at(count), /**@type{!number}*/ pitch = dims.pageWidth + dims.pageSeparation + noteLane, @@ -2601,123 +1990,6 @@ odf.TextLayout = function TextLayout() { } } } - /** - * Take the notes of the foot of a page away, and the room they took. - * @param {!Element} box the page - * @return {undefined} - */ - function clearNotes(box) { - var area = box.lastElementChild; - if (area && area.className === "webodf-pageNotes") { - box.removeChild(area); - } - /**@type{!HTMLElement}*/(box).style.paddingBottom = ""; - } - /** - * The notes of the foot of the page that are called for on a page. - * @param {!Element} box the page - * @return {!Array.} - */ - function notesOf(box) { - var found = box.getElementsByTagNameNS(textns, "note"), - /**@type{!Array.}*/ - notes = [], - /**@type{!Element}*/ - note, - /**@type{!number}*/ - i; - for (i = 0; i < found.length; i += 1) { - note = /**@type{!Element}*/(found.item(i)); - if (note.getAttributeNS(textns, "note-class") === "footnote") { - notes.push(note); - } - } - return notes; - } - /** - * Draw the notes called for on a page at the foot of it. - * - * A note is written at the foot of the page its number stands on, as an - * office writes it, and the text of the page is that much shorter: the - * room the notes take is the padding at the foot of the box, so what - * crosses into it is moved to the page that follows, see "trimPages". - * - * What is drawn is a copy: the note itself is left where it stands in the - * text, as the document is the reader's to show and not to write. - * @param {!Element} box the page - * @return {undefined} - */ - function layNotes(box) { - var doc = /**@type{!Document}*/(box.ownerDocument), - htmlns = /**@type{!string}*/(doc.documentElement.namespaceURI), - notes = notesOf(box), - /**@type{!HTMLElement}*/ - area, - /**@type{!HTMLElement}*/ - rule, - /**@type{!number}*/ - tall; - clearNotes(box); - if (notes.length === 0) { - return; - } - area = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); - area.className = "webodf-pageNotes"; - // The notes stand in the padding at the foot of the box, against the - // text and not against the paper: the padding of the box is the - // margin of the page, which the notes are no part of. - area.style.position = "absolute"; - area.style.bottom = "0"; - area.style.left = /**@type{!HTMLElement}*/(box).style.paddingLeft; - area.style.right = /**@type{!HTMLElement}*/(box).style.paddingRight; - // A line stands between the text and the notes, as an office draws - // it: a quarter of the width of the text, and no wider. - rule = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); - rule.style.width = "25%"; - rule.style.borderTop = "1px solid currentColor"; - rule.style.marginBottom = "0.2em"; - area.appendChild(rule); - notes.forEach(function (note) { - var line = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, - "div")), - number = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, - "span")), - citation = note.getElementsByTagNameNS(textns, - "note-citation").item(0), - body = note.getElementsByTagNameNS(textns, - "note-body").item(0), - /**@type{?Node}*/ - walk; - number.className = "webodf-pageNoteNumber"; - number.style.marginRight = "0.5em"; - number.appendChild(doc.createTextNode(citation - ? String(citation.textContent) - : "")); - // The body itself is not moved and not copied: what it holds is, - // as the rule that hides a body of a note would hide the copy of - // it as well. - walk = body - ? body.firstChild - : null; - while (walk) { - line.appendChild(walk.cloneNode(true)); - walk = walk.nextSibling; - } - // The number of the note is written at the head of the first - // line of it and not above it, in the letters of the note: it is - // put inside what was copied, and not before it. - if (line.firstElementChild) { - line.firstElementChild.insertBefore(number, - line.firstElementChild.firstChild); - } else { - line.insertBefore(number, line.firstChild); - } - area.appendChild(line); - }); - box.appendChild(area); - tall = area.getBoundingClientRect().height; - /**@type{!HTMLElement}*/(box).style.paddingBottom = tall + "px"; - } /** * Take away the boxes that hold the pages, giving the text back the * paragraphs they hold. @@ -2738,7 +2010,7 @@ odf.TextLayout = function TextLayout() { boxes.forEach(function (box) { // What was drawn of the notes at the foot of the page is drawn // again with the pages, and is no part of the text. - clearNotes(box); + furniture.clearNotes(box); while (box.firstChild) { text.insertBefore(box.firstChild, box); } @@ -3006,7 +2278,7 @@ odf.TextLayout = function TextLayout() { */ function fillOnePage(state) { var doc = state.doc, - /**@type{!odf.TextLayout.PageDimensions}*/ + /**@type{!odf.PageMeasure.PageDimensions}*/ dims = /**@type{!PagePlan}*/(state.plan).at(state.page), /**@type{!Element}*/ box = /**@type{!Element}*/(doc.createElementNS(state.htmlns, @@ -3245,7 +2517,7 @@ odf.TextLayout = function TextLayout() { // the text of the page is that much shorter: what no longer fits is // moved to the page that follows when the pages are set right, see // "trimPages". - layNotes(box); + furniture.layNotes(box); // The pages that follow are filled by as many at a time as the page // that was just filled took: a page of a hundred short paragraphs is // not read a hundred times. @@ -3425,7 +2697,7 @@ odf.TextLayout = function TextLayout() { columnPageOrigins = []; ground = odfroot.body.getBoundingClientRect().left; perRun.forEach(function (pages, index) { - var /**@type{!odf.TextLayout.PageDimensions}*/ + var /**@type{!odf.PageMeasure.PageDimensions}*/ dims = plan.at(total), /**@type{!number}*/ pitch = dims.pageWidth + dims.pageSeparation + noteLane, @@ -3453,45 +2725,6 @@ odf.TextLayout = function TextLayout() { )); drawPageFurniture(odfroot, plan, pagesDiv, readMeta(odfroot)); } - /** - * How far the foot of a page reaches into the text of it. - * - * The foot is drawn under the text, in the margin: where it is taller - * than the margin left for it, it stands over the last lines, and this - * says by how much. - * @param {!Element} box the page - * @param {?Element} furniture what is drawn around the page - * @return {!number} nothing where the foot stands clear of the text - */ - function footOver(box, furniture) { - var bottom = box.getBoundingClientRect().bottom, - /**@type{!number}*/ - top = 0, - /**@type{!NodeList}*/ - parts, - /**@type{!ClientRect}*/ - rect, - /**@type{!number}*/ - i; - if (!furniture) { - return 0; - } - parts = furniture.getElementsByTagName("*"); - top = bottom; - for (i = 0; i < parts.length; i += 1) { - rect = /**@type{!Element}*/(parts.item(i)) - .getBoundingClientRect(); - // Only what is drawn under the middle of the page is the foot of - // it: a header stands over the text and takes nothing from it - // here. - if (rect.height > 0 - && rect.top > bottom - box.getBoundingClientRect().height - / 2) { - top = Math.min(top, rect.top); - } - } - return Math.max(0, Math.round(bottom - top)); - } /** * Give every page the size the plan gives it. * @@ -3534,7 +2767,7 @@ odf.TextLayout = function TextLayout() { // with, would be drawn over the last line of the text. What it // takes of the text is measured and given back to the foot. room = drawn - ? footOver(box, /**@type{?Element}*/(drawn.item(index))) + ? furniture.footOver(box, /**@type{?Element}*/(drawn.item(index))) : 0; if (room > 0) { page.style.height = (dims.pageHeight - dims.marginTop @@ -3556,7 +2789,7 @@ odf.TextLayout = function TextLayout() { function placePages(plan, boxes, from) { var /**@type{!number}*/ i, - /**@type{!odf.TextLayout.PageDimensions}*/ + /**@type{!odf.PageMeasure.PageDimensions}*/ dims, /**@type{!{left:!number,top:!number}}*/ place; @@ -3624,7 +2857,7 @@ odf.TextLayout = function TextLayout() { next, /**@type{!Element}*/ target, - /**@type{!odf.TextLayout.PageDimensions}*/ + /**@type{!odf.PageMeasure.PageDimensions}*/ dims, /**@type{!number}*/ held, @@ -3636,7 +2869,7 @@ odf.TextLayout = function TextLayout() { // The notes are drawn before the page is read: they take the // foot of the page, so what they push past the end of it is what // is moved to the page that follows, notes and all. - layNotes(box); + furniture.layNotes(box); over = measure.firstOverflowing(box); while (guard > 0 && over) { held = String(over.textContent).length; @@ -3740,7 +2973,7 @@ odf.TextLayout = function TextLayout() { guard -= 1; // The notes of what was moved went with it, so the foot // of the page is drawn again before it is read anew. - layNotes(box); + furniture.layNotes(box); over = measure.firstOverflowing(box); } } @@ -4121,18 +3354,7 @@ odf.TextLayout = function TextLayout() { : null; }; }; -/**@typedef{{ - node:!Element, - background:!boolean, - order:!number -}}*/ -odf.TextLayout.PageShape; -/**@typedef{{ - at:!number, - type:!string -}}*/ -odf.TextLayout.TabStop; /**@typedef{{ text:!Element, @@ -4150,39 +3372,8 @@ odf.TextLayout.TabStop; }}*/ odf.TextLayout.Filling; -/**@typedef{{ - shapes:!Array., - header:?Element, - footer:?Element, - headerLeft:?Element, - footerLeft:?Element, - headerFirst:?Element, - footerFirst:?Element -}}*/ -odf.TextLayout.PageFurniture; -/**@typedef{{ - height:!number, - gap:!number -}}*/ -odf.TextLayout.PageArea; -/**@typedef{{ - pageWidth:!number, - pageHeight:!number, - marginTop:!number, - marginBottom:!number, - marginLeft:!number, - marginRight:!number, - pageSeparation:!number, - columnCount:!number, - columnGap:!number, - header:!odf.TextLayout.PageArea, - footer:!odf.TextLayout.PageArea, - firstPage:!odf.TextLayout.PageFurniture, - otherPages:!odf.TextLayout.PageFurniture -}}*/ -odf.TextLayout.PageDimensions; /** * A head or a foot of a page as it was drawn, to be copied from page to page. * @typedef {!{source:!Element,width:!number,drawn:!DocumentFragment,fields:!Array.}} diff --git a/webodf/tools/karma.conf.js b/webodf/tools/karma.conf.js index dc4d2de70..81405cb66 100644 --- a/webodf/tools/karma.conf.js +++ b/webodf/tools/karma.conf.js @@ -52,6 +52,7 @@ module.exports = function (config) { 'lib/odf/PageMeasure.js', 'lib/odf/StyleParseUtils.js', 'lib/odf/Style2CSS.js', + 'lib/odf/PageFurniture.js', 'lib/odf/TextLayout.js', 'lib/webodfcore/Destroyable.js', 'lib/gui/ZoomHelper.js', From d2164a04e99526e0ba3c647a3dfc44991d0fea44 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 359/385] Added the spacings of an index alone, and left the text as it was. --- webodf/lib/odf/TextLayout.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index df0536fcf..ab2135e25 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -3811,13 +3811,16 @@ odf.TextLayout = function TextLayout() { // of css to the page: the labels of the lists are worked out once // and written on the elements, so nothing of the document is counted // by them any more, see "numberLists" in "ListStylesToCss.js". - // The spacing under a paragraph and the spacing over the next are - // added, as an office adds them, and not folded into one as the - // browser folds the margins of two elements that follow one another: - // a box that lays its children in a column keeps them apart. - - sheet.insertRule(".webodf-pageBox, office|text, text|section," - + " text|table-of-content, text|index-body" + // The spacing over an entry of an index and the spacing under the + // one before it are added, as an office adds them, and not folded + // into one as the browser folds the margins of two elements that + // follow one another: a box that lays its children in a column keeps + // them apart. The text itself is left as it is, where an office + // folds the two spacings into the larger of them, as the browser + // does: the table of contents of the schema of OpenDocument is drawn + // on seventy-two pages and its chapters begin on the pages an office + // begins them, which neither rule alone answers for. + sheet.insertRule("text|table-of-content, text|index-body" + " {display:flex;flex-direction:column;align-items:stretch;}", sheet.cssRules.length); // The spacing under the last child of such a box is not folded into From 9b0d622dd43c1bc45bf0d11727e563a86326cca4 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 360/385] Read a drawing and a formula in the add-ons, as the viewer does. --- .../opendocumentviewer-webext/background-chrome.js | 2 +- .../background-thunderbird.js | 8 ++++++-- programs/opendocumentviewer-webext/background.js | 10 ++++++++-- .../opendocumentviewer-webext/manifest-chrome.json.in | 2 +- .../manifest-thunderbird-v2.json.in | 2 +- .../manifest-thunderbird-v3.json.in | 2 +- programs/opendocumentviewer-webext/manifest-v2.json.in | 2 +- programs/opendocumentviewer-webext/manifest-v3.json.in | 2 +- programs/opendocumentviewer-webext/viewer.html | 2 +- 9 files changed, 21 insertions(+), 11 deletions(-) diff --git a/programs/opendocumentviewer-webext/background-chrome.js b/programs/opendocumentviewer-webext/background-chrome.js index 85f269599..02feb2f51 100644 --- a/programs/opendocumentviewer-webext/background-chrome.js +++ b/programs/opendocumentviewer-webext/background-chrome.js @@ -38,7 +38,7 @@ "use strict"; var /**@const@type{!string}*/ - extensions = "odt|fodt|ott|odp|fodp|otp|ods|fods|ots", + extensions = "odt|fodt|ott|odp|fodp|otp|ods|fods|ots|odg|fodg|otg|odf", /**@const@type{!number}*/ ruleId = 1; diff --git a/programs/opendocumentviewer-webext/background-thunderbird.js b/programs/opendocumentviewer-webext/background-thunderbird.js index 5fa8cf40c..cad7ce54c 100644 --- a/programs/opendocumentviewer-webext/background-thunderbird.js +++ b/programs/opendocumentviewer-webext/background-thunderbird.js @@ -54,9 +54,13 @@ "application/vnd.oasis.opendocument.spreadsheet-flat-xml", "application/vnd.oasis.opendocument.presentation", "application/vnd.oasis.opendocument.presentation-template", - "application/vnd.oasis.opendocument.presentation-flat-xml" + "application/vnd.oasis.opendocument.presentation-flat-xml", + "application/vnd.oasis.opendocument.graphics", + "application/vnd.oasis.opendocument.graphics-template", + "application/vnd.oasis.opendocument.graphics-flat-xml", + "application/vnd.oasis.opendocument.formula" ], - EXTENSIONS = /\.(odt|ott|fodt|ods|ots|fods|odp|otp|fodp)$/i, + EXTENSIONS = /\.(odt|ott|fodt|ods|ots|fods|odp|otp|fodp|odg|otg|fodg|odf)$/i, // The languages the page of the welcome is written in, beside the // English one every other language falls on. LANGUAGES = ["en", "fr"], diff --git a/programs/opendocumentviewer-webext/background.js b/programs/opendocumentviewer-webext/background.js index 6a8302814..a5cfc4eef 100644 --- a/programs/opendocumentviewer-webext/background.js +++ b/programs/opendocumentviewer-webext/background.js @@ -45,13 +45,19 @@ "application/vnd.oasis.opendocument.presentation-template", "application/vnd.oasis.opendocument.spreadsheet", "application/vnd.oasis.opendocument.spreadsheet-flat-xml", - "application/vnd.oasis.opendocument.spreadsheet-template" + "application/vnd.oasis.opendocument.spreadsheet-template", + "application/vnd.oasis.opendocument.graphics", + "application/vnd.oasis.opendocument.graphics-flat-xml", + "application/vnd.oasis.opendocument.graphics-template", + "application/vnd.oasis.opendocument.formula" ], /**@const@type{!Array.}*/ extensions = [ ".odt", ".fodt", ".ott", ".odp", ".fodp", ".otp", - ".ods", ".fods", ".ots" + ".ods", ".fods", ".ots", + ".odg", ".fodg", ".otg", + ".odf" ]; /** diff --git a/programs/opendocumentviewer-webext/manifest-chrome.json.in b/programs/opendocumentviewer-webext/manifest-chrome.json.in index fc630e71e..bac148d69 100644 --- a/programs/opendocumentviewer-webext/manifest-chrome.json.in +++ b/programs/opendocumentviewer-webext/manifest-chrome.json.in @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Light reader for .odt, .ods and .odp documents of LibreOffice and compatible applications, without an office suite.", + "description": "Light reader for the documents of LibreOffice and compatible applications, in the OpenDocument format — text, spreadsheet, presentation, drawing and formula — without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "default_locale": "en", diff --git a/programs/opendocumentviewer-webext/manifest-thunderbird-v2.json.in b/programs/opendocumentviewer-webext/manifest-thunderbird-v2.json.in index 391f415b4..90f47e5c3 100644 --- a/programs/opendocumentviewer-webext/manifest-thunderbird-v2.json.in +++ b/programs/opendocumentviewer-webext/manifest-thunderbird-v2.json.in @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Reads the .odt, .ods and .odp attachments of a message inside Thunderbird, without saving them and without an office suite.", + "description": "Reads the attachments of a message in the OpenDocument format — text, spreadsheet, presentation, drawing and formula — inside Thunderbird, without saving them and without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "default_locale": "en", diff --git a/programs/opendocumentviewer-webext/manifest-thunderbird-v3.json.in b/programs/opendocumentviewer-webext/manifest-thunderbird-v3.json.in index d747dd211..0f96f74fb 100644 --- a/programs/opendocumentviewer-webext/manifest-thunderbird-v3.json.in +++ b/programs/opendocumentviewer-webext/manifest-thunderbird-v3.json.in @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Reads the .odt, .ods and .odp attachments of a message inside Thunderbird, without saving them and without an office suite.", + "description": "Reads the attachments of a message in the OpenDocument format — text, spreadsheet, presentation, drawing and formula — inside Thunderbird, without saving them and without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "default_locale": "en", diff --git a/programs/opendocumentviewer-webext/manifest-v2.json.in b/programs/opendocumentviewer-webext/manifest-v2.json.in index d0d6e837e..f1082e1b5 100644 --- a/programs/opendocumentviewer-webext/manifest-v2.json.in +++ b/programs/opendocumentviewer-webext/manifest-v2.json.in @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Light reader for .odt, .ods and .odp documents of LibreOffice and compatible applications, without an office suite.", + "description": "Light reader for the documents of LibreOffice and compatible applications, in the OpenDocument format — text, spreadsheet, presentation, drawing and formula — without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "default_locale": "en", diff --git a/programs/opendocumentviewer-webext/manifest-v3.json.in b/programs/opendocumentviewer-webext/manifest-v3.json.in index 8354fb4bd..b62322736 100644 --- a/programs/opendocumentviewer-webext/manifest-v3.json.in +++ b/programs/opendocumentviewer-webext/manifest-v3.json.in @@ -2,7 +2,7 @@ "manifest_version": 3, "name": "OpenDocument Viewer", "version": "@WEBODF_MANIFEST_VERSION@", - "description": "Light reader for .odt, .ods and .odp documents of LibreOffice and compatible applications, without an office suite.", + "description": "Light reader for the documents of LibreOffice and compatible applications, in the OpenDocument format — text, spreadsheet, presentation, drawing and formula — without an office suite.", "author": "Daniel Berthereau", "homepage_url": "http://webodf.org/", "default_locale": "en", diff --git a/programs/opendocumentviewer-webext/viewer.html b/programs/opendocumentviewer-webext/viewer.html index 1ab2e41ca..f38424a31 100644 --- a/programs/opendocumentviewer-webext/viewer.html +++ b/programs/opendocumentviewer-webext/viewer.html @@ -21,7 +21,7 @@

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%0DicmcPMG4PY^{5R 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

Cn*^&C zJ(~MDe`9t6pK=oY&@Ww6NjGiVs|v2q&oI^8dxWN+Duc&33Emq6WBaTKJ|!hp1b_La zJ(*`F&-bGn?QvUc)s;sgfp4xbjE>Wnlv=XHTA=Di#Ol>ZZM&hFsjDPe$vpB|PY!WV zFH`Cgs@XdC-Ih^a=Jc$BP$i=W%}Nk0I}&3bq0|uGUu|cdk0Fw z^_Bv_wHeZt`b*4Kv*coQDuO}JNaQm>a35nTSwUJ*t>tc_S`VylT3@^s9b!>+6wpER zlwmSSlPpN{!jjGT4ZTF*S)ZkvZW>Ppkwgq1O!<33n#r%uLIe2z@+?0to0gnf{q(tL zNS?{ED|=QIQmE^hGADCM=jtz+(;4I_yOQhm4wn#IZPA(vx%aBTR^pE~s))LNgZ=9c z`D+v0Tp3{;wky%FG6ufV&n#Z+(gp)13XRh-YsuX^R^PA8I9|7^a+(v9)vY?|GD$~& z8y>s$>U!1aq;_pba6Pt*UmaCHfmv#|fhqK_j4bBu{x8*CNeaq_qbD5cMEc_`;10yQU7o%{YKMGAgQ^s?2mg;2qp68((jO78JO+#%Etny zS4FLLIT(qJ@5F`ny)Rd3n7^C+VuVoGcD`~?-=)SoN+Aa(a|vr}1K;`9;EUbdY9^Kh zz$6LJy813;j{_Z79MR8cm8;c{5XyMfzELs;+IH?$vMuwu&^-A1gMi#N*_x`$n#kS zSg2?%4SB4iK4QWgfC!?~^l$ELDK*T$3G)-KJVB}dy3jJ@Ok|8Ocy3fY&-Q=`S-e?< zo}L*b0Y2CKNUx=es*Xx3R~Z%20 zHUT_J>y8E4*c?-4&O5K}E6q~F-MKm9z*y%Gpqra!a$-_c3xg}e1LuINERf-A>{k@> z38An(h)=^TdyA+?NZx4w`Z|7@ESpz_*&*VU-X|3iC;{oO!z1&ywl9{n^B2R$37@(m zFm`9C0C=J=u@H#p@(B^xQEc?bE(P8Ci`)?0>}T)+*2|!mXK>tNOV?Zy38Oxc{njsJP?m?QXb;c3F&h$-3w@cR`6~6 zt$Cw#Rm?Asa~@k9ugd*Oqm@cY?^|Sa>GbkVa6)S-Ub>TASR5AQ4@%LU2wkfca(6DQ zOpy+x{cga2`b8$mb%vVr#TOFJ+1skW9)Uau$o(I)tq0CMJK%^O*m@{ga6o?nYFZXH z$R^OLzLK*f5;%>hJ$(6fenxmpV>qK(c-u)1Vb{1aJaa*w4?Z1tVtAc<+rP$~UnuDr zCxh^48eb+|6fd#gOlI~U9wlBk75|f?-H{YA1MWPaIQEHrk4aQuYwJ|iD_uUq=+@-6rm!*Z zlUP!YB>o~HEZvF!IquEn3~l~>-ay3ROeVh8`0;5!0#Vjls>nj6!DO7_Sjo4i%4!Oz zbSA@J{w=#!9&Bhq{%x%fe8RoLt1igsrk*C5^e7`ET$Qt4JSEDJjA!hYYZ?b#Q&KUU zNj9AuOP2#%C&ZS2RNuhfa1nejFa!}FPqvZQE}7L?9$lbc3$zARi4`jo$uSf(%tveb zP!w>8j%VFAovY6qHmI!=*Na0K!(qg$!LJ_`?J+t`;W5vEb9d)FvTl2oXeqankVo^#(M^U?nUHeT>Ol7}&BW_;Q2z%AYy;@=SnEFhSe&(m}AoA1x< zQyDD7I#gz2arKzP0iX=*UWu9rIQpGmic2g^1DCf%{68~j_?x7NsW&fk6+9=InYyuUOo5=SQ(%$M6cBDJXeEm@7p2D} zH+#!=W=^XD;w@H7c;NZai1+pnTOYW?I37`q4PxNZ7kLX^{v{^v($<;15D0C}nR_L| zU;)BdL8zZniqIEVTS=7#S&N^Cf(XaqQSJt~b=xE{ z8cQMKui*=8zCCs+zVieq(JiHaVwasOzDG}>B9zJ%=9_LwmM<#%5d6mv?=wlv{i@P_ z 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 n_J}L}1oQu||JNkY#qnZ6K`>)< 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 diff --git a/attic/programs/ios/WebODF/WebODF-Info.plist b/attic/programs/ios/WebODF/WebODF-Info.plist deleted file mode 100644 index 18518ec4c..000000000 --- a/attic/programs/ios/WebODF/WebODF-Info.plist +++ /dev/null @@ -1,122 +0,0 @@ - - - - - CFBundleDevelopmentRegion - English - CFBundleDisplayName - ${PRODUCT_NAME} - CFBundleDocumentTypes - - - CFBundleTypeIconFiles - - icon.png - - CFBundleTypeName - OpenDocument Text - CFBundleTypeRole - Viewer - LSHandlerRank - Owner - LSItemContentTypes - - org.oasis.opendocument.text - - - - CFBundleTypeIconFiles - - icon.png - - CFBundleTypeName - OpenDocument Presentation - CFBundleTypeRole - Viewer - LSHandlerRank - Owner - LSItemContentTypes - - org.oasis.opendocument.presentation - - - - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIconFile - icon.png - CFBundleIconFiles - - icon.png - icon@2x.png - icon-72.png - - CFBundleIdentifier - WebODF-03 - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - APPL - CFBundleShortVersionString - 1.0 - CFBundleSignature - ???? - CFBundleVersion - 1.0 - LSRequiresIPhoneOS - - UISupportedInterfaceOrientations - - UIInterfaceOrientationPortrait - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationLandscapeRight - - UISupportedInterfaceOrientations~ipad - - UIInterfaceOrientationPortrait - UIInterfaceOrientationLandscapeLeft - UIInterfaceOrientationPortraitUpsideDown - UIInterfaceOrientationLandscapeRight - - UTExportedTypeDeclarations - - - UTTypeConformsTo - - org.gnu.gnu-zip-archive - - UTTypeDescription - OpenDocument Text - UTTypeIdentifier - org.oasis.opendocument.text - UTTypeTagSpecification - - public.filename-extension - odt - public.mime-type - application/vnd.oasis.opendocument.text - - - - UTTypeConformsTo - - org.gnu.gnu-zip-archive - - UTTypeDescription - OpenDocument Presentation - UTTypeIdentifier - org.oasis.opendocument.presentation - UTTypeTagSpecification - - public.filename-extension - odp - public.mime-type - application/vnd.oasis.opendocument.presentation - - - - - diff --git a/attic/programs/ios/WebODF/WebODF-Prefix.pch b/attic/programs/ios/WebODF/WebODF-Prefix.pch deleted file mode 100644 index da48b6a1f..000000000 --- a/attic/programs/ios/WebODF/WebODF-Prefix.pch +++ /dev/null @@ -1,7 +0,0 @@ -// -// Prefix header for all source files of the 'WebODF' target in the 'WebODF' project -// - -#ifdef __OBJC__ - #import -#endif diff --git a/attic/programs/ios/WebODF/en.lproj/InfoPlist.strings b/attic/programs/ios/WebODF/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28ff8..000000000 --- a/attic/programs/ios/WebODF/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/attic/programs/ios/WebODF/main.m b/attic/programs/ios/WebODF/main.m deleted file mode 100644 index bda2f99ea..000000000 --- a/attic/programs/ios/WebODF/main.m +++ /dev/null @@ -1,32 +0,0 @@ -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. - */ -// -// main.m -// WebODF -// -// Created by KO GmbH on 2/2/12. -// Copyright __MyCompanyName__ 2012. All rights reserved. -// - -#import - -int main(int argc, char *argv[]) { - int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate"); - return retVal; -} diff --git a/attic/programs/ios/welcome.odt b/attic/programs/ios/welcome.odt deleted file mode 100644 index 9845da8c6bc856dcb596bc969ccf021e7cfd21eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 59294 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 a_78UmfDH1TtB>7B{PiL(ZH;qR@BSAF$Z~c7 diff --git a/attic/programs/ios/www/cordova-1.8.0.js b/attic/programs/ios/www/cordova-1.8.0.js deleted file mode 100644 index f03b4271e..000000000 --- a/attic/programs/ios/www/cordova-1.8.0.js +++ /dev/null @@ -1,5226 +0,0 @@ -// commit 109b8649b0e98597b147842a6f71999d2f7910f2 - -// File generated at :: Tue Jun 05 2012 14:10:19 GMT-0700 (PDT) - -/* - Licensed to the Apache Software Foundation (ASF) under one - or more contributor license agreements. See the NOTICE file - distributed with this work for additional information - regarding copyright ownership. The ASF licenses this file - to you under the Apache License, Version 2.0 (the - "License"); you may not use this file except in compliance - with the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, - software distributed under the License is distributed on an - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - KIND, either express or implied. See the License for the - specific language governing permissions and limitations - under the License. -*/ - -;(function() { - -// file: lib/scripts/require.js -var require, - define; - -(function () { - var modules = {}; - - function build(module) { - var factory = module.factory; - module.exports = {}; - delete module.factory; - factory(require, module.exports, module); - return module.exports; - } - - require = function (id) { - if (!modules[id]) { - throw "module " + id + " not found"; - } - return modules[id].factory ? build(modules[id]) : modules[id].exports; - }; - - define = function (id, factory) { - if (modules[id]) { - throw "module " + id + " already defined"; - } - - modules[id] = { - id: id, - factory: factory - }; - }; - - define.remove = function (id) { - delete modules[id]; - }; - -})(); - -//Export for use in node -if (typeof module === "object" && typeof require === "function") { - module.exports.require = require; - module.exports.define = define; -} -// file: lib/cordova.js -define("cordova", function(require, exports, module) { -var channel = require('cordova/channel'); - -/** - * Listen for DOMContentLoaded and notify our channel subscribers. - */ -document.addEventListener('DOMContentLoaded', function() { - channel.onDOMContentLoaded.fire(); -}, false); -if (document.readyState == 'complete' || document.readyState == 'interactive') { - channel.onDOMContentLoaded.fire(); -} - -/** - * Intercept calls to addEventListener + removeEventListener and handle deviceready, - * resume, and pause events. - */ -var m_document_addEventListener = document.addEventListener; -var m_document_removeEventListener = document.removeEventListener; -var m_window_addEventListener = window.addEventListener; -var m_window_removeEventListener = window.removeEventListener; - -/** - * Houses custom event handlers to intercept on document + window event listeners. - */ -var documentEventHandlers = {}, - windowEventHandlers = {}; - -document.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof documentEventHandlers[e] != 'undefined') { - if (evt === 'deviceready') { - documentEventHandlers[e].subscribeOnce(handler); - } else { - documentEventHandlers[e].subscribe(handler); - } - } else { - m_document_addEventListener.call(document, evt, handler, capture); - } -}; - -window.addEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - if (typeof windowEventHandlers[e] != 'undefined') { - windowEventHandlers[e].subscribe(handler); - } else { - m_window_addEventListener.call(window, evt, handler, capture); - } -}; - -document.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubcribing from an event that is handled by a plugin - if (typeof documentEventHandlers[e] != "undefined") { - documentEventHandlers[e].unsubscribe(handler); - } else { - m_document_removeEventListener.call(document, evt, handler, capture); - } -}; - -window.removeEventListener = function(evt, handler, capture) { - var e = evt.toLowerCase(); - // If unsubcribing from an event that is handled by a plugin - if (typeof windowEventHandlers[e] != "undefined") { - windowEventHandlers[e].unsubscribe(handler); - } else { - m_window_removeEventListener.call(window, evt, handler, capture); - } -}; - -function createEvent(type, data) { - var event = document.createEvent('Events'); - event.initEvent(type, false, false); - if (data) { - for (var i in data) { - if (data.hasOwnProperty(i)) { - event[i] = data[i]; - } - } - } - return event; -} - -if(typeof window.console === "undefined") { - window.console = { - log:function(){} - }; -} - -var cordova = { - define:define, - require:require, - /** - * Methods to add/remove your own addEventListener hijacking on document + window. - */ - addWindowEventHandler:function(event, opts) { - return (windowEventHandlers[event] = channel.create(event, opts)); - }, - addDocumentEventHandler:function(event, opts) { - return (documentEventHandlers[event] = channel.create(event, opts)); - }, - removeWindowEventHandler:function(event) { - delete windowEventHandlers[event]; - }, - removeDocumentEventHandler:function(event) { - delete documentEventHandlers[event]; - }, - /** - * Retreive original event handlers that were replaced by Cordova - * - * @return object - */ - getOriginalHandlers: function() { - return {'document': {'addEventListener': m_document_addEventListener, 'removeEventListener': m_document_removeEventListener}, - 'window': {'addEventListener': m_window_addEventListener, 'removeEventListener': m_window_removeEventListener}}; - }, - /** - * Method to fire event from native code - */ - fireDocumentEvent: function(type, data) { - var evt = createEvent(type, data); - if (typeof documentEventHandlers[type] != 'undefined') { - documentEventHandlers[type].fire(evt); - } else { - document.dispatchEvent(evt); - } - }, - fireWindowEvent: function(type, data) { - var evt = createEvent(type,data); - if (typeof windowEventHandlers[type] != 'undefined') { - windowEventHandlers[type].fire(evt); - } else { - window.dispatchEvent(evt); - } - }, - // TODO: this is Android only; think about how to do this better - shuttingDown:false, - UsePolling:false, - // END TODO - - // TODO: iOS only - // This queue holds the currently executing command and all pending - // commands executed with cordova.exec(). - commandQueue:[], - // Indicates if we're currently in the middle of flushing the command - // queue on the native side. - commandQueueFlushing:false, - // END TODO - /** - * Plugin callback mechanism. - */ - callbackId: 0, - callbacks: {}, - callbackStatus: { - NO_RESULT: 0, - OK: 1, - CLASS_NOT_FOUND_EXCEPTION: 2, - ILLEGAL_ACCESS_EXCEPTION: 3, - INSTANTIATION_EXCEPTION: 4, - MALFORMED_URL_EXCEPTION: 5, - IO_EXCEPTION: 6, - INVALID_ACTION: 7, - JSON_EXCEPTION: 8, - ERROR: 9 - }, - - /** - * Called by native code when returning successful result from an action. - * - * @param callbackId - * @param args - */ - callbackSuccess: function(callbackId, args) { - if (cordova.callbacks[callbackId]) { - - // If result is to be sent to callback - if (args.status == cordova.callbackStatus.OK) { - try { - if (cordova.callbacks[callbackId].success) { - cordova.callbacks[callbackId].success(args.message); - } - } - catch (e) { - console.log("Error in success callback: "+callbackId+" = "+e); - } - } - - // Clear callback if not expecting any more results - if (!args.keepCallback) { - delete cordova.callbacks[callbackId]; - } - } - }, - - /** - * Called by native code when returning error result from an action. - * - * @param callbackId - * @param args - */ - callbackError: function(callbackId, args) { - if (cordova.callbacks[callbackId]) { - try { - if (cordova.callbacks[callbackId].fail) { - cordova.callbacks[callbackId].fail(args.message); - } - } - catch (e) { - console.log("Error in error callback: "+callbackId+" = "+e); - } - - // Clear callback if not expecting any more results - if (!args.keepCallback) { - delete cordova.callbacks[callbackId]; - } - } - }, - // TODO: remove in 2.0. - addPlugin: function(name, obj) { - console.log("[DEPRECATION NOTICE] window.addPlugin and window.plugins will be removed in version 2.0."); - if (!window.plugins[name]) { - window.plugins[name] = obj; - } - else { - console.log("Error: Plugin "+name+" already exists."); - } - }, - - addConstructor: function(func) { - channel.onCordovaReady.subscribeOnce(function() { - try { - func(); - } catch(e) { - console.log("Failed to run constructor: " + e); - } - }); - } -}; - -// Register pause, resume and deviceready channels as events on document. -channel.onPause = cordova.addDocumentEventHandler('pause'); -channel.onResume = cordova.addDocumentEventHandler('resume'); -channel.onDeviceReady = cordova.addDocumentEventHandler('deviceready'); - -// Adds deprecation warnings to functions of an object (but only logs a message once) -function deprecateFunctions(obj, objLabel) { - var newObj = {}; - var logHash = {}; - for (var i in obj) { - if (obj.hasOwnProperty(i)) { - if (typeof obj[i] == 'function') { - newObj[i] = (function(prop){ - var oldFunk = obj[prop]; - var funkId = objLabel + '_' + prop; - return function() { - if (!logHash[funkId]) { - console.log('[DEPRECATION NOTICE] The "' + objLabel + '" global will be removed in version 2.0, please use lowercase "cordova".'); - logHash[funkId] = true; - } - oldFunk.apply(obj, arguments); - }; - })(i); - } else { - newObj[i] = (function(prop) { return obj[prop]; })(i); - } - } - } - return newObj; -} - -/** - * Legacy variable for plugin support - * TODO: remove in 2.0. - */ -if (!window.PhoneGap) { - window.PhoneGap = deprecateFunctions(cordova, 'PhoneGap'); -} -if (!window.Cordova) { - window.Cordova = deprecateFunctions(cordova, 'Cordova'); -} - -/** - * Plugins object - * TODO: remove in 2.0. - */ -if (!window.plugins) { - window.plugins = {}; -} - -module.exports = cordova; - -}); - -// file: lib/common/builder.js -define("cordova/builder", function(require, exports, module) { -var utils = require('cordova/utils'); - -function each(objects, func, context) { - for (var prop in objects) { - if (objects.hasOwnProperty(prop)) { - func.apply(context, [objects[prop], prop]); - } - } -} - -function include(parent, objects, clobber, merge) { - each(objects, function (obj, key) { - try { - var result = obj.path ? require(obj.path) : {}; - - if (clobber) { - // Clobber if it doesn't exist. - if (typeof parent[key] === 'undefined') { - parent[key] = result; - } else if (typeof obj.path !== 'undefined') { - // If merging, merge properties onto parent, otherwise, clobber. - if (merge) { - recursiveMerge(parent[key], result); - } else { - parent[key] = result; - } - } - result = parent[key]; - } else { - // Overwrite if not currently defined. - if (typeof parent[key] == 'undefined') { - parent[key] = result; - } else if (merge && typeof obj.path !== 'undefined') { - // If merging, merge parent onto result - recursiveMerge(result, parent[key]); - parent[key] = result; - } else { - // Set result to what already exists, so we can build children into it if they exist. - result = parent[key]; - } - } - - if (obj.children) { - include(result, obj.children, clobber, merge); - } - } catch(e) { - utils.alert('Exception building cordova JS globals: ' + e + ' for key "' + key + '"'); - } - }); -} - -/** - * Merge properties from one object onto another recursively. Properties from - * the src object will overwrite existing target property. - * - * @param target Object to merge properties into. - * @param src Object to merge properties from. - */ -function recursiveMerge(target, src) { - for (var prop in src) { - if (src.hasOwnProperty(prop)) { - if (typeof target.prototype !== 'undefined' && target.prototype.constructor === target) { - // If the target object is a constructor override off prototype. - target.prototype[prop] = src[prop]; - } else { - target[prop] = typeof src[prop] === 'object' ? recursiveMerge( - target[prop], src[prop]) : src[prop]; - } - } - } - return target; -} - -module.exports = { - build: function (objects) { - return { - intoButDontClobber: function (target) { - include(target, objects, false, false); - }, - intoAndClobber: function(target) { - include(target, objects, true, false); - }, - intoAndMerge: function(target) { - include(target, objects, true, true); - } - }; - } -}; - -}); - -// file: lib/common/channel.js -define("cordova/channel", function(require, exports, module) { -var utils = require('cordova/utils'); - -/** - * Custom pub-sub "channel" that can have functions subscribed to it - * This object is used to define and control firing of events for - * cordova initialization. - * - * The order of events during page load and Cordova startup is as follows: - * - * onDOMContentLoaded Internal event that is received when the web page is loaded and parsed. - * onNativeReady Internal event that indicates the Cordova native side is ready. - * onCordovaReady Internal event fired when all Cordova JavaScript objects have been created. - * onCordovaInfoReady Internal event fired when device properties are available. - * onCordovaConnectionReady Internal event fired when the connection property has been set. - * onDeviceReady User event fired to indicate that Cordova is ready - * onResume User event fired to indicate a start/resume lifecycle event - * onPause User event fired to indicate a pause lifecycle event - * onDestroy Internal event fired when app is being destroyed (User should use window.onunload event, not this one). - * - * The only Cordova events that user code should register for are: - * deviceready Cordova native code is initialized and Cordova APIs can be called from JavaScript - * pause App has moved to background - * resume App has returned to foreground - * - * Listeners can be registered as: - * document.addEventListener("deviceready", myDeviceReadyListener, false); - * document.addEventListener("resume", myResumeListener, false); - * document.addEventListener("pause", myPauseListener, false); - * - * The DOM lifecycle events should be used for saving and restoring state - * window.onload - * window.onunload - * - */ - -/** - * Channel - * @constructor - * @param type String the channel name - * @param opts Object options to pass into the channel, currently - * supports: - * onSubscribe: callback that fires when - * something subscribes to the Channel. Sets - * context to the Channel. - * onUnsubscribe: callback that fires when - * something unsubscribes to the Channel. Sets - * context to the Channel. - */ -var Channel = function(type, opts) { - this.type = type; - this.handlers = {}; - this.numHandlers = 0; - this.guid = 1; - this.fired = false; - this.enabled = true; - this.events = { - onSubscribe:null, - onUnsubscribe:null - }; - if (opts) { - if (opts.onSubscribe) this.events.onSubscribe = opts.onSubscribe; - if (opts.onUnsubscribe) this.events.onUnsubscribe = opts.onUnsubscribe; - } -}, - channel = { - /** - * Calls the provided function only after all of the channels specified - * have been fired. - */ - join: function (h, c) { - var i = c.length; - var len = i; - var f = function() { - if (!(--i)) h(); - }; - for (var j=0; j} phoneNumbers array of phone numbers -* @param {Array.} emails array of email addresses -* @param {Array.} addresses array of addresses -* @param {Array.} ims instant messaging user ids -* @param {Array.} organizations -* @param {DOMString} birthday contact's birthday -* @param {DOMString} note user notes about contact -* @param {Array.} photos -* @param {Array.} categories -* @param {Array.} urls contact's web sites -*/ -var Contact = function (id, displayName, name, nickname, phoneNumbers, emails, addresses, - ims, organizations, birthday, note, photos, categories, urls) { - this.id = id || null; - this.rawId = null; - this.displayName = displayName || null; - this.name = name || null; // ContactName - this.nickname = nickname || null; - this.phoneNumbers = phoneNumbers || null; // ContactField[] - this.emails = emails || null; // ContactField[] - this.addresses = addresses || null; // ContactAddress[] - this.ims = ims || null; // ContactField[] - this.organizations = organizations || null; // ContactOrganization[] - this.birthday = birthday || null; - this.note = note || null; - this.photos = photos || null; // ContactField[] - this.categories = categories || null; // ContactField[] - this.urls = urls || null; // ContactField[] -}; - -/** -* Removes contact from device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.remove = function(successCB, errorCB) { - var fail = function(code) { - errorCB(new ContactError(code)); - }; - if (this.id === null) { - fail(ContactError.UNKNOWN_ERROR); - } - else { - exec(successCB, fail, "Contacts", "remove", [this.id]); - } -}; - -/** -* Creates a deep copy of this Contact. -* With the contact ID set to null. -* @return copy of this Contact -*/ -Contact.prototype.clone = function() { - var clonedContact = utils.clone(this); - var i; - clonedContact.id = null; - clonedContact.rawId = null; - // Loop through and clear out any id's in phones, emails, etc. - if (clonedContact.phoneNumbers) { - for (i = 0; i < clonedContact.phoneNumbers.length; i++) { - clonedContact.phoneNumbers[i].id = null; - } - } - if (clonedContact.emails) { - for (i = 0; i < clonedContact.emails.length; i++) { - clonedContact.emails[i].id = null; - } - } - if (clonedContact.addresses) { - for (i = 0; i < clonedContact.addresses.length; i++) { - clonedContact.addresses[i].id = null; - } - } - if (clonedContact.ims) { - for (i = 0; i < clonedContact.ims.length; i++) { - clonedContact.ims[i].id = null; - } - } - if (clonedContact.organizations) { - for (i = 0; i < clonedContact.organizations.length; i++) { - clonedContact.organizations[i].id = null; - } - } - if (clonedContact.categories) { - for (i = 0; i < clonedContact.categories.length; i++) { - clonedContact.categories[i].id = null; - } - } - if (clonedContact.photos) { - for (i = 0; i < clonedContact.photos.length; i++) { - clonedContact.photos[i].id = null; - } - } - if (clonedContact.urls) { - for (i = 0; i < clonedContact.urls.length; i++) { - clonedContact.urls[i].id = null; - } - } - return clonedContact; -}; - -/** -* Persists contact to device storage. -* @param successCB success callback -* @param errorCB error callback -*/ -Contact.prototype.save = function(successCB, errorCB) { - var fail = function(code) { - errorCB(new ContactError(code)); - }; - var success = function(result) { - if (result) { - if (typeof successCB === 'function') { - var fullContact = require('cordova/plugin/contacts').create(result); - successCB(convertIn(fullContact)); - } - } - else { - // no Entry object returned - fail(ContactError.UNKNOWN_ERROR); - } - }; - var dupContact = convertOut(utils.clone(this)); - exec(success, fail, "Contacts", "save", [dupContact]); -}; - - -module.exports = Contact; - -}); - -// file: lib/common/plugin/ContactAddress.js -define("cordova/plugin/ContactAddress", function(require, exports, module) { -/** -* Contact address. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code -* @param formatted // NOTE: not a W3C standard -* @param streetAddress -* @param locality -* @param region -* @param postalCode -* @param country -*/ - -var ContactAddress = function(pref, type, formatted, streetAddress, locality, region, postalCode, country) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.formatted = formatted || null; - this.streetAddress = streetAddress || null; - this.locality = locality || null; - this.region = region || null; - this.postalCode = postalCode || null; - this.country = country || null; -}; - -module.exports = ContactAddress; -}); - -// file: lib/common/plugin/ContactError.js -define("cordova/plugin/ContactError", function(require, exports, module) { -/** - * ContactError. - * An error code assigned by an implementation when an error has occured - * @constructor - */ -var ContactError = function(err) { - this.code = (typeof err != 'undefined' ? err : null); -}; - -/** - * Error codes - */ -ContactError.UNKNOWN_ERROR = 0; -ContactError.INVALID_ARGUMENT_ERROR = 1; -ContactError.TIMEOUT_ERROR = 2; -ContactError.PENDING_OPERATION_ERROR = 3; -ContactError.IO_ERROR = 4; -ContactError.NOT_SUPPORTED_ERROR = 5; -ContactError.PERMISSION_DENIED_ERROR = 20; - -module.exports = ContactError; -}); - -// file: lib/common/plugin/ContactField.js -define("cordova/plugin/ContactField", function(require, exports, module) { -/** -* Generic contact field. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param type -* @param value -* @param pref -*/ -var ContactField = function(type, value, pref) { - this.id = null; - this.type = (type && type.toString()) || null; - this.value = (value && value.toString()) || null; - this.pref = (typeof pref != 'undefined' ? pref : false); -}; - -module.exports = ContactField; -}); - -// file: lib/common/plugin/ContactFindOptions.js -define("cordova/plugin/ContactFindOptions", function(require, exports, module) { -/** - * ContactFindOptions. - * @constructor - * @param filter used to match contacts against - * @param multiple boolean used to determine if more than one contact should be returned - */ - -var ContactFindOptions = function(filter, multiple) { - this.filter = filter || ''; - this.multiple = (typeof multiple != 'undefined' ? multiple : false); -}; - -module.exports = ContactFindOptions; -}); - -// file: lib/common/plugin/ContactName.js -define("cordova/plugin/ContactName", function(require, exports, module) { -/** -* Contact name. -* @constructor -* @param formatted // NOTE: not part of W3C standard -* @param familyName -* @param givenName -* @param middle -* @param prefix -* @param suffix -*/ -var ContactName = function(formatted, familyName, givenName, middle, prefix, suffix) { - this.formatted = formatted || null; - this.familyName = familyName || null; - this.givenName = givenName || null; - this.middleName = middle || null; - this.honorificPrefix = prefix || null; - this.honorificSuffix = suffix || null; -}; - -module.exports = ContactName; -}); - -// file: lib/common/plugin/ContactOrganization.js -define("cordova/plugin/ContactOrganization", function(require, exports, module) { -/** -* Contact organization. -* @constructor -* @param {DOMString} id unique identifier, should only be set by native code // NOTE: not a W3C standard -* @param name -* @param dept -* @param title -* @param startDate -* @param endDate -* @param location -* @param desc -*/ - -var ContactOrganization = function(pref, type, name, dept, title) { - this.id = null; - this.pref = (typeof pref != 'undefined' ? pref : false); - this.type = type || null; - this.name = name || null; - this.department = dept || null; - this.title = title || null; -}; - -module.exports = ContactOrganization; -}); - -// file: lib/common/plugin/Coordinates.js -define("cordova/plugin/Coordinates", function(require, exports, module) { -/** - * This class contains position information. - * @param {Object} lat - * @param {Object} lng - * @param {Object} alt - * @param {Object} acc - * @param {Object} head - * @param {Object} vel - * @param {Object} altacc - * @constructor - */ -var Coordinates = function(lat, lng, alt, acc, head, vel, altacc) { - /** - * The latitude of the position. - */ - this.latitude = lat; - /** - * The longitude of the position, - */ - this.longitude = lng; - /** - * The accuracy of the position. - */ - this.accuracy = acc; - /** - * The altitude of the position. - */ - this.altitude = (alt !== undefined ? alt : null); - /** - * The direction the device is moving at the position. - */ - this.heading = (head !== undefined ? head : null); - /** - * The velocity with which the device is moving at the position. - */ - this.speed = (vel !== undefined ? vel : null); - - if (this.speed === 0 || this.speed === null) { - this.heading = NaN; - } - - /** - * The altitude accuracy of the position. - */ - this.altitudeAccuracy = (altacc !== undefined) ? altacc : null; -}; - -module.exports = Coordinates; - -}); - -// file: lib/common/plugin/DirectoryEntry.js -define("cordova/plugin/DirectoryEntry", function(require, exports, module) { -var utils = require('cordova/utils'), - exec = require('cordova/exec'), - Entry = require('cordova/plugin/Entry'), - FileError = require('cordova/plugin/FileError'), - DirectoryReader = require('cordova/plugin/DirectoryReader'); - -/** - * An interface representing a directory on the file system. - * - * {boolean} isFile always false (readonly) - * {boolean} isDirectory always true (readonly) - * {DOMString} name of the directory, excluding the path leading to it (readonly) - * {DOMString} fullPath the absolute full path to the directory (readonly) - * {FileSystem} filesystem on which the directory resides (readonly) - */ -var DirectoryEntry = function(name, fullPath) { - DirectoryEntry.__super__.constructor.apply(this, [false, true, name, fullPath]); -}; - -utils.extend(DirectoryEntry, Entry); - -/** - * Creates a new DirectoryReader to read entries from this directory - */ -DirectoryEntry.prototype.createReader = function() { - return new DirectoryReader(this.fullPath); -}; - -/** - * Creates or looks up a directory - * - * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a directory - * @param {Flags} options to create or excluively create the directory - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getDirectory = function(path, options, successCallback, errorCallback) { - var win = typeof successCallback !== 'function' ? null : function(result) { - var entry = new DirectoryEntry(result.name, result.fullPath); - successCallback(entry); - }; - var fail = typeof errorCallback !== 'function' ? null : function(code) { - errorCallback(new FileError(code)); - }; - exec(win, fail, "File", "getDirectory", [this.fullPath, path, options]); -}; - -/** - * Deletes a directory and all of it's contents - * - * @param {Function} successCallback is called with no parameters - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.removeRecursively = function(successCallback, errorCallback) { - var fail = typeof errorCallback !== 'function' ? null : function(code) { - errorCallback(new FileError(code)); - }; - exec(successCallback, fail, "File", "removeRecursively", [this.fullPath]); -}; - -/** - * Creates or looks up a file - * - * @param {DOMString} path either a relative or absolute path from this directory in which to look up or create a file - * @param {Flags} options to create or excluively create the file - * @param {Function} successCallback is called with the new entry - * @param {Function} errorCallback is called with a FileError - */ -DirectoryEntry.prototype.getFile = function(path, options, successCallback, errorCallback) { - var win = typeof successCallback !== 'function' ? null : function(result) { - var FileEntry = require('cordova/plugin/FileEntry'); - var entry = new FileEntry(result.name, result.fullPath); - successCallback(entry); - }; - var fail = typeof errorCallback !== 'function' ? null : function(code) { - errorCallback(new FileError(code)); - }; - exec(win, fail, "File", "getFile", [this.fullPath, path, options]); -}; - -module.exports = DirectoryEntry; - -}); - -// file: lib/common/plugin/DirectoryReader.js -define("cordova/plugin/DirectoryReader", function(require, exports, module) { -var exec = require('cordova/exec'), - FileError = require('cordova/plugin/FileError') ; - -/** - * An interface that lists the files and directories in a directory. - */ -function DirectoryReader(path) { - this.path = path || null; -} - -/** - * Returns a list of entries from a directory. - * - * @param {Function} successCallback is called with a list of entries - * @param {Function} errorCallback is called with a FileError - */ -DirectoryReader.prototype.readEntries = function(successCallback, errorCallback) { - var win = typeof successCallback !== 'function' ? null : function(result) { - var retVal = []; - for (var i=0; i][;base64], - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsDataURL = function(file) { - this.fileName = ""; - if (typeof file.fullPath === "undefined") { - this.fileName = file; - } else { - this.fileName = file.fullPath; - } - - // Already loading something - if (this.readyState == FileReader.LOADING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // LOADING state - this.readyState = FileReader.LOADING; - - // If loadstart callback - if (typeof this.onloadstart === "function") { - this.onloadstart(new ProgressEvent("loadstart", {target:this})); - } - - var me = this; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // DONE state - me.readyState = FileReader.DONE; - - // Save result - me.result = r; - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // DONE state - me.readyState = FileReader.DONE; - - me.result = null; - - // Save error - me.error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, "File", "readAsDataURL", [this.fileName]); -}; - -/** - * Read file and return data as a binary data. - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsBinaryString = function(file) { - // TODO - Can't return binary data to browser. - console.log('method "readAsBinaryString" is not supported at this time.'); -}; - -/** - * Read file and return data as a binary data. - * - * @param file {File} File object containing file properties - */ -FileReader.prototype.readAsArrayBuffer = function(file) { - // TODO - Can't return binary data to browser. - console.log('This method is not supported at this time.'); -}; - -module.exports = FileReader; -}); - -// file: lib/common/plugin/FileSystem.js -define("cordova/plugin/FileSystem", function(require, exports, module) { -var DirectoryEntry = require('cordova/plugin/DirectoryEntry'); - -/** - * An interface representing a file system - * - * @constructor - * {DOMString} name the unique name of the file system (readonly) - * {DirectoryEntry} root directory of the file system (readonly) - */ -var FileSystem = function(name, root) { - this.name = name || null; - if (root) { - this.root = new DirectoryEntry(root.name, root.fullPath); - } -}; - -module.exports = FileSystem; -}); - -// file: lib/common/plugin/FileTransfer.js -define("cordova/plugin/FileTransfer", function(require, exports, module) { -var exec = require('cordova/exec'); - -/** - * FileTransfer uploads a file to a remote server. - * @constructor - */ -var FileTransfer = function() {}; - -/** -* Given an absolute file path, uploads a file on the device to a remote server -* using a multipart HTTP request. -* @param filePath {String} Full path of the file on the device -* @param server {String} URL of the server to receive the file -* @param successCallback (Function} Callback to be invoked when upload has completed -* @param errorCallback {Function} Callback to be invoked upon error -* @param options {FileUploadOptions} Optional parameters such as file name and mimetype -* @param trustAllHosts {Boolean} Optional trust all hosts (e.g. for self-signed certs), defaults to false -*/ -FileTransfer.prototype.upload = function(filePath, server, successCallback, errorCallback, options, trustAllHosts) { - // check for options - var fileKey = null; - var fileName = null; - var mimeType = null; - var params = null; - var chunkedMode = true; - if (options) { - fileKey = options.fileKey; - fileName = options.fileName; - mimeType = options.mimeType; - if (options.chunkedMode !== null || typeof options.chunkedMode != "undefined") { - chunkedMode = options.chunkedMode; - } - if (options.params) { - params = options.params; - } - else { - params = {}; - } - } - - exec(successCallback, errorCallback, 'FileTransfer', 'upload', [filePath, server, fileKey, fileName, mimeType, params, trustAllHosts, chunkedMode]); -}; - -/** - * Downloads a file form a given URL and saves it to the specified directory. - * @param source {String} URL of the server to receive the file - * @param target {String} Full path of the file on the device - * @param successCallback (Function} Callback to be invoked when upload has completed - * @param errorCallback {Function} Callback to be invoked upon error - */ -FileTransfer.prototype.download = function(source, target, successCallback, errorCallback) { - var win = function(result) { - var entry = null; - if (result.isDirectory) { - entry = new (require('cordova/plugin/DirectoryEntry'))(); - } - else if (result.isFile) { - entry = new (require('cordova/plugin/FileEntry'))(); - } - entry.isDirectory = result.isDirectory; - entry.isFile = result.isFile; - entry.name = result.name; - entry.fullPath = result.fullPath; - successCallback(entry); - }; - exec(win, errorCallback, 'FileTransfer', 'download', [source, target]); -}; - -module.exports = FileTransfer; - -}); - -// file: lib/common/plugin/FileTransferError.js -define("cordova/plugin/FileTransferError", function(require, exports, module) { -/** - * FileTransferError - * @constructor - */ -var FileTransferError = function(code) { - this.code = code || null; -}; - -FileTransferError.FILE_NOT_FOUND_ERR = 1; -FileTransferError.INVALID_URL_ERR = 2; -FileTransferError.CONNECTION_ERR = 3; - -module.exports = FileTransferError; -}); - -// file: lib/common/plugin/FileUploadOptions.js -define("cordova/plugin/FileUploadOptions", function(require, exports, module) { -/** - * Options to customize the HTTP request used to upload files. - * @constructor - * @param fileKey {String} Name of file request parameter. - * @param fileName {String} Filename to be used by the server. Defaults to image.jpg. - * @param mimeType {String} Mimetype of the uploaded file. Defaults to image/jpeg. - * @param params {Object} Object with key: value params to send to the server. - */ -var FileUploadOptions = function(fileKey, fileName, mimeType, params) { - this.fileKey = fileKey || null; - this.fileName = fileName || null; - this.mimeType = mimeType || null; - this.params = params || null; -}; - -module.exports = FileUploadOptions; -}); - -// file: lib/common/plugin/FileUploadResult.js -define("cordova/plugin/FileUploadResult", function(require, exports, module) { -/** - * FileUploadResult - * @constructor - */ -var FileUploadResult = function() { - this.bytesSent = 0; - this.responseCode = null; - this.response = null; -}; - -module.exports = FileUploadResult; -}); - -// file: lib/common/plugin/FileWriter.js -define("cordova/plugin/FileWriter", function(require, exports, module) { -var exec = require('cordova/exec'), - FileError = require('cordova/plugin/FileError'), - ProgressEvent = require('cordova/plugin/ProgressEvent'); - -/** - * This class writes to the mobile device file system. - * - * For Android: - * The root directory is the root of the file system. - * To write to the SD card, the file name is "sdcard/my_file.txt" - * - * @constructor - * @param file {File} File object containing file properties - * @param append if true write to the end of the file, otherwise overwrite the file - */ -var FileWriter = function(file) { - this.fileName = ""; - this.length = 0; - if (file) { - this.fileName = file.fullPath || file; - this.length = file.size || 0; - } - // default is to write at the beginning of the file - this.position = 0; - - this.readyState = 0; // EMPTY - - this.result = null; - - // Error - this.error = null; - - // Event handlers - this.onwritestart = null; // When writing starts - this.onprogress = null; // While writing the file, and reporting partial file data - this.onwrite = null; // When the write has successfully completed. - this.onwriteend = null; // When the request has completed (either in success or failure). - this.onabort = null; // When the write has been aborted. For instance, by invoking the abort() method. - this.onerror = null; // When the write has failed (see errors). -}; - -// States -FileWriter.INIT = 0; -FileWriter.WRITING = 1; -FileWriter.DONE = 2; - -/** - * Abort writing file. - */ -FileWriter.prototype.abort = function() { - // check for invalid state - if (this.readyState === FileWriter.DONE || this.readyState === FileWriter.INIT) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // set error - this.error = new FileError(FileError.ABORT_ERR); - - this.readyState = FileWriter.DONE; - - // If abort callback - if (typeof this.onabort === "function") { - this.onabort(new ProgressEvent("abort", {"target":this})); - } - - // If write end callback - if (typeof this.onwriteend === "function") { - this.onwriteend(new ProgressEvent("writeend", {"target":this})); - } -}; - -/** - * Writes data to the file - * - * @param text to be written - */ -FileWriter.prototype.write = function(text) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - me.onwritestart(new ProgressEvent("writestart", {"target":me})); - } - - // Write file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // position always increases by bytes written because file would be extended - me.position += r; - // The length of the file is now where we are done writing. - - me.length = me.position; - - // DONE state - me.readyState = FileWriter.DONE; - - // If onwrite callback - if (typeof me.onwrite === "function") { - me.onwrite(new ProgressEvent("write", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // DONE state - me.readyState = FileWriter.DONE; - - // Save error - me.error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, "File", "write", [this.fileName, text, this.position]); -}; - -/** - * Moves the file pointer to the location specified. - * - * If the offset is a negative number the position of the file - * pointer is rewound. If the offset is greater than the file - * size the position is set to the end of the file. - * - * @param offset is the location to move the file pointer to. - */ -FileWriter.prototype.seek = function(offset) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - if (!offset && offset !== 0) { - return; - } - - // See back from end of file. - if (offset < 0) { - this.position = Math.max(offset + this.length, 0); - } - // Offset is bigger then file size so set position - // to the end of the file. - else if (offset > this.length) { - this.position = this.length; - } - // Offset is between 0 and file size so set the position - // to start writing. - else { - this.position = offset; - } -}; - -/** - * Truncates the file to the size specified. - * - * @param size to chop the file at. - */ -FileWriter.prototype.truncate = function(size) { - // Throw an exception if we are already writing a file - if (this.readyState === FileWriter.WRITING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // WRITING state - this.readyState = FileWriter.WRITING; - - var me = this; - - // If onwritestart callback - if (typeof me.onwritestart === "function") { - me.onwritestart(new ProgressEvent("writestart", {"target":this})); - } - - // Write file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // DONE state - me.readyState = FileWriter.DONE; - - // Update the length of the file - me.length = r; - me.position = Math.min(me.position, r); - - // If onwrite callback - if (typeof me.onwrite === "function") { - me.onwrite(new ProgressEvent("write", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileWriter.DONE) { - return; - } - - // DONE state - me.readyState = FileWriter.DONE; - - // Save error - me.error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {"target":me})); - } - - // If onwriteend callback - if (typeof me.onwriteend === "function") { - me.onwriteend(new ProgressEvent("writeend", {"target":me})); - } - }, "File", "truncate", [this.fileName, size]); -}; - -module.exports = FileWriter; - -}); - -// file: lib/common/plugin/Flags.js -define("cordova/plugin/Flags", function(require, exports, module) { -/** - * Supplies arguments to methods that lookup or create files and directories. - * - * @param create - * {boolean} file or directory if it doesn't exist - * @param exclusive - * {boolean} used with create; if true the command will fail if - * target path exists - */ -function Flags(create, exclusive) { - this.create = create || false; - this.exclusive = exclusive || false; -} - -module.exports = Flags; -}); - -// file: lib/common/plugin/LocalFileSystem.js -define("cordova/plugin/LocalFileSystem", function(require, exports, module) { -var exec = require('cordova/exec'); - -/** - * Represents a local file system. - */ -var LocalFileSystem = function() { - -}; - -LocalFileSystem.TEMPORARY = 0; //temporary, with no guarantee of persistence -LocalFileSystem.PERSISTENT = 1; //persistent - -module.exports = LocalFileSystem; -}); - -// file: lib/common/plugin/Media.js -define("cordova/plugin/Media", function(require, exports, module) { -var utils = require('cordova/utils'), - exec = require('cordova/exec'); - -var mediaObjects = {}; - -/** - * This class provides access to the device media, interfaces to both sound and video - * - * @constructor - * @param src The file name or url to play - * @param successCallback The callback to be called when the file is done playing or recording. - * successCallback() - * @param errorCallback The callback to be called if there is an error. - * errorCallback(int errorCode) - OPTIONAL - * @param statusCallback The callback to be called when media status has changed. - * statusCallback(int statusCode) - OPTIONAL - */ -var Media = function(src, successCallback, errorCallback, statusCallback) { - - // successCallback optional - if (successCallback && (typeof successCallback !== "function")) { - console.log("Media Error: successCallback is not a function"); - return; - } - - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Media Error: errorCallback is not a function"); - return; - } - - // statusCallback optional - if (statusCallback && (typeof statusCallback !== "function")) { - console.log("Media Error: statusCallback is not a function"); - return; - } - - this.id = utils.createUUID(); - mediaObjects[this.id] = this; - this.src = src; - this.successCallback = successCallback; - this.errorCallback = errorCallback; - this.statusCallback = statusCallback; - this._duration = -1; - this._position = -1; - exec(null, this.errorCallback, "Media", "create", [this.id, this.src]); -}; - -// Media messages -Media.MEDIA_STATE = 1; -Media.MEDIA_DURATION = 2; -Media.MEDIA_POSITION = 3; -Media.MEDIA_ERROR = 9; - -// Media states -Media.MEDIA_NONE = 0; -Media.MEDIA_STARTING = 1; -Media.MEDIA_RUNNING = 2; -Media.MEDIA_PAUSED = 3; -Media.MEDIA_STOPPED = 4; -Media.MEDIA_MSG = ["None", "Starting", "Running", "Paused", "Stopped"]; - -// "static" function to return existing objs. -Media.get = function(id) { - return mediaObjects[id]; -}; - -/** - * Start or resume playing audio file. - */ -Media.prototype.play = function(options) { - exec(null, null, "Media", "startPlayingAudio", [this.id, this.src, options]); -}; - -/** - * Stop playing audio file. - */ -Media.prototype.stop = function() { - var me = this; - exec(function() { - me._position = 0; - me.successCallback(); - }, this.errorCallback, "Media", "stopPlayingAudio", [this.id]); -}; - -/** - * Seek or jump to a new time in the track.. - */ -Media.prototype.seekTo = function(milliseconds) { - var me = this; - exec(function(p) { - me._position = p; - }, this.errorCallback, "Media", "seekToAudio", [this.id, milliseconds]); -}; - -/** - * Pause playing audio file. - */ -Media.prototype.pause = function() { - exec(null, this.errorCallback, "Media", "pausePlayingAudio", [this.id]); -}; - -/** - * Get duration of an audio file. - * The duration is only set for audio that is playing, paused or stopped. - * - * @return duration or -1 if not known. - */ -Media.prototype.getDuration = function() { - return this._duration; -}; - -/** - * Get position of audio. - */ -Media.prototype.getCurrentPosition = function(success, fail) { - var me = this; - exec(function(p) { - me._position = p; - success(p); - }, fail, "Media", "getCurrentPositionAudio", [this.id]); -}; - -/** - * Start recording audio file. - */ -Media.prototype.startRecord = function() { - exec(this.successCallback, this.errorCallback, "Media", "startRecordingAudio", [this.id, this.src]); -}; - -/** - * Stop recording audio file. - */ -Media.prototype.stopRecord = function() { - exec(this.successCallback, this.errorCallback, "Media", "stopRecordingAudio", [this.id]); -}; - -/** - * Release the resources. - */ -Media.prototype.release = function() { - exec(null, this.errorCallback, "Media", "release", [this.id]); -}; - -/** - * Adjust the volume. - */ -Media.prototype.setVolume = function(volume) { - exec(null, null, "Media", "setVolume", [this.id, volume]); -}; - -/** - * Audio has status update. - * PRIVATE - * - * @param id The media object id (string) - * @param status The status code (int) - * @param msg The status message (string) - */ -Media.onStatus = function(id, msg, value) { - var media = mediaObjects[id]; - // If state update - if (msg === Media.MEDIA_STATE) { - if (value === Media.MEDIA_STOPPED) { - if (media.successCallback) { - media.successCallback(); - } - } - if (media.statusCallback) { - media.statusCallback(value); - } - } - else if (msg === Media.MEDIA_DURATION) { - media._duration = value; - } - else if (msg === Media.MEDIA_ERROR) { - if (media.errorCallback) { - // value should be a MediaError object when msg == MEDIA_ERROR - media.errorCallback(value); - } - } - else if (msg === Media.MEDIA_POSITION) { - media._position = value; - } -}; - -module.exports = Media; -}); - -// file: lib/common/plugin/MediaError.js -define("cordova/plugin/MediaError", function(require, exports, module) { -/** - * This class contains information about any Media errors. - * @constructor - */ -var MediaError = function(code, msg) { - this.code = (code !== undefined ? code : null); - this.message = msg || ""; -}; - -MediaError.MEDIA_ERR_NONE_ACTIVE = 0; -MediaError.MEDIA_ERR_ABORTED = 1; -MediaError.MEDIA_ERR_NETWORK = 2; -MediaError.MEDIA_ERR_DECODE = 3; -MediaError.MEDIA_ERR_NONE_SUPPORTED = 4; - -module.exports = MediaError; -}); - -// file: lib/common/plugin/MediaFile.js -define("cordova/plugin/MediaFile", function(require, exports, module) { -var utils = require('cordova/utils'), - exec = require('cordova/exec'), - File = require('cordova/plugin/File'), - CaptureError = require('cordova/plugin/CaptureError'); -/** - * Represents a single file. - * - * name {DOMString} name of the file, without path information - * fullPath {DOMString} the full path of the file, including the name - * type {DOMString} mime type - * lastModifiedDate {Date} last modified date - * size {Number} size of the file in bytes - */ -var MediaFile = function(name, fullPath, type, lastModifiedDate, size){ - MediaFile.__super__.constructor.apply(this, arguments); -}; - -utils.extend(MediaFile, File); - -/** - * Request capture format data for a specific file and type - * - * @param {Function} successCB - * @param {Function} errorCB - */ -MediaFile.prototype.getFormatData = function(successCallback, errorCallback) { - if (typeof this.fullPath === "undefined" || this.fullPath === null) { - errorCallback(new CaptureError(CaptureError.CAPTURE_INVALID_ARGUMENT)); - } else { - exec(successCallback, errorCallback, "Capture", "getFormatData", [this.fullPath, this.type]); - } -}; - -// TODO: can we axe this? -/** - * Casts a PluginResult message property (array of objects) to an array of MediaFile objects - * (used in Objective-C and Android) - * - * @param {PluginResult} pluginResult - */ -MediaFile.cast = function(pluginResult) { - var mediaFiles = []; - for (var i=0; i.dispatchEvent - // need to first figure out how to implement EventTarget - } - } - return event; - }; - try { - var ev = createEvent({type:"abort",target:document}); - return function ProgressEvent(type, data) { - data.type = type; - return createEvent(data); - }; - } catch(e){ - */ - return function ProgressEvent(type, dict) { - this.type = type; - this.bubbles = false; - this.cancelBubble = false; - this.cancelable = false; - this.lengthComputable = false; - this.loaded = dict && dict.loaded ? dict.loaded : 0; - this.total = dict && dict.total ? dict.total : 0; - this.target = dict && dict.target ? dict.target : null; - }; - //} -})(); - -module.exports = ProgressEvent; -}); - -// file: lib/common/plugin/accelerometer.js -define("cordova/plugin/accelerometer", function(require, exports, module) { -/** - * This class provides access to device accelerometer data. - * @constructor - */ -var utils = require("cordova/utils"), - exec = require("cordova/exec"), - Acceleration = require('cordova/plugin/Acceleration'); - -// Is the accel sensor running? -var running = false; - -// Keeps reference to watchAcceleration calls. -var timers = {}; - -// Array of listeners; used to keep track of when we should call start and stop. -var listeners = []; - -// Last returned acceleration object from native -var accel = null; - -// Tells native to start. -function start() { - exec(function(a) { - var tempListeners = listeners.slice(0); - accel = new Acceleration(a.x, a.y, a.z, a.timestamp); - for (var i = 0, l = tempListeners.length; i < l; i++) { - tempListeners[i].win(accel); - } - }, function(e) { - var tempListeners = listeners.slice(0); - for (var i = 0, l = tempListeners.length; i < l; i++) { - tempListeners[i].fail(e); - } - }, "Accelerometer", "start", []); - running = true; -} - -// Tells native to stop. -function stop() { - exec(null, null, "Accelerometer", "stop", []); - running = false; -} - -// Adds a callback pair to the listeners array -function createCallbackPair(win, fail) { - return {win:win, fail:fail}; -} - -// Removes a win/fail listener pair from the listeners array -function removeListeners(l) { - var idx = listeners.indexOf(l); - if (idx > -1) { - listeners.splice(idx, 1); - if (listeners.length === 0) { - stop(); - } - } -} - -var accelerometer = { - /** - * Asynchronously aquires the current acceleration. - * - * @param {Function} successCallback The function to call when the acceleration data is available - * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) - * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) - */ - getCurrentAcceleration: function(successCallback, errorCallback, options) { - // successCallback required - if (typeof successCallback !== "function") { - throw "getCurrentAcceleration must be called with at least a success callback function as first parameter."; - } - - var p; - var win = function(a) { - successCallback(a); - removeListeners(p); - }; - var fail = function(e) { - errorCallback(e); - removeListeners(p); - }; - - p = createCallbackPair(win, fail); - listeners.push(p); - - if (!running) { - start(); - } - }, - - /** - * Asynchronously aquires the acceleration repeatedly at a given interval. - * - * @param {Function} successCallback The function to call each time the acceleration data is available - * @param {Function} errorCallback The function to call when there is an error getting the acceleration data. (OPTIONAL) - * @param {AccelerationOptions} options The options for getting the accelerometer data such as timeout. (OPTIONAL) - * @return String The watch id that must be passed to #clearWatch to stop watching. - */ - watchAcceleration: function(successCallback, errorCallback, options) { - // Default interval (10 sec) - var frequency = (options && options.frequency && typeof options.frequency == 'number') ? options.frequency : 10000; - - // successCallback required - if (typeof successCallback !== "function") { - throw "watchAcceleration must be called with at least a success callback function as first parameter."; - } - - // Keep reference to watch id, and report accel readings as often as defined in frequency - var id = utils.createUUID(); - - var p = createCallbackPair(function(){}, function(e) { - errorCallback(e); - removeListeners(p); - }); - listeners.push(p); - - timers[id] = { - timer:window.setInterval(function() { - if (accel) { - successCallback(accel); - } - }, frequency), - listeners:p - }; - - if (running) { - // If we're already running then immediately invoke the success callback - successCallback(accel); - } else { - start(); - } - - return id; - }, - - /** - * Clears the specified accelerometer watch. - * - * @param {String} id The id of the watch returned from #watchAcceleration. - */ - clearWatch: function(id) { - // Stop javascript timer & remove from timer list - if (id && timers[id]) { - window.clearInterval(timers[id].timer); - removeListeners(timers[id].listeners); - delete timers[id]; - } - } -}; - -module.exports = accelerometer; - -}); - -// file: lib/common/plugin/battery.js -define("cordova/plugin/battery", function(require, exports, module) { -/** - * This class contains information about the current battery status. - * @constructor - */ -var cordova = require('cordova'), - exec = require('cordova/exec'); - -function handlers() { - return battery.channels.batterystatus.numHandlers + - battery.channels.batterylow.numHandlers + - battery.channels.batterycritical.numHandlers; -} - -var Battery = function() { - this._level = null; - this._isPlugged = null; - // Create new event handlers on the window (returns a channel instance) - var subscriptionEvents = { - onSubscribe:this.onSubscribe, - onUnsubscribe:this.onUnsubscribe - }; - this.channels = { - batterystatus:cordova.addWindowEventHandler("batterystatus", subscriptionEvents), - batterylow:cordova.addWindowEventHandler("batterylow", subscriptionEvents), - batterycritical:cordova.addWindowEventHandler("batterycritical", subscriptionEvents) - }; -}; -/** - * Event handlers for when callbacks get registered for the battery. - * Keep track of how many handlers we have so we can start and stop the native battery listener - * appropriately (and hopefully save on battery life!). - */ -Battery.prototype.onSubscribe = function() { - var me = battery; - // If we just registered the first handler, make sure native listener is started. - if (handlers() === 1) { - exec(me._status, me._error, "Battery", "start", []); - } -}; - -Battery.prototype.onUnsubscribe = function() { - var me = battery; - - // If we just unregistered the last handler, make sure native listener is stopped. - if (handlers() === 0) { - exec(null, null, "Battery", "stop", []); - } -}; - -/** - * Callback for battery status - * - * @param {Object} info keys: level, isPlugged - */ -Battery.prototype._status = function(info) { - if (info) { - var me = battery; - var level = info.level; - if (me._level !== level || me._isPlugged !== info.isPlugged) { - // Fire batterystatus event - cordova.fireWindowEvent("batterystatus", info); - - // Fire low battery event - if (level === 20 || level === 5) { - if (level === 20) { - cordova.fireWindowEvent("batterylow", info); - } - else { - cordova.fireWindowEvent("batterycritical", info); - } - } - } - me._level = level; - me._isPlugged = info.isPlugged; - } -}; - -/** - * Error callback for battery start - */ -Battery.prototype._error = function(e) { - console.log("Error initializing Battery: " + e); -}; - -var battery = new Battery(); - -module.exports = battery; -}); - -// file: lib/common/plugin/capture.js -define("cordova/plugin/capture", function(require, exports, module) { -var exec = require('cordova/exec'), - MediaFile = require('cordova/plugin/MediaFile'); - -/** - * Launches a capture of different types. - * - * @param (DOMString} type - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureVideoOptions} options - */ -function _capture(type, successCallback, errorCallback, options) { - var win = function(pluginResult) { - var mediaFiles = []; - var i; - for (i = 0; i < pluginResult.length; i++) { - var mediaFile = new MediaFile(); - mediaFile.name = pluginResult[i].name; - mediaFile.fullPath = pluginResult[i].fullPath; - mediaFile.type = pluginResult[i].type; - mediaFile.lastModifiedDate = pluginResult[i].lastModifiedDate; - mediaFile.size = pluginResult[i].size; - mediaFiles.push(mediaFile); - } - successCallback(mediaFiles); - }; - exec(win, errorCallback, "Capture", type, [options]); -} -/** - * The Capture interface exposes an interface to the camera and microphone of the hosting device. - */ -function Capture() { - this.supportedAudioModes = []; - this.supportedImageModes = []; - this.supportedVideoModes = []; -} - -/** - * Launch audio recorder application for recording audio clip(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureAudioOptions} options - */ -Capture.prototype.captureAudio = function(successCallback, errorCallback, options){ - _capture("captureAudio", successCallback, errorCallback, options); -}; - -/** - * Launch camera application for taking image(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureImageOptions} options - */ -Capture.prototype.captureImage = function(successCallback, errorCallback, options){ - _capture("captureImage", successCallback, errorCallback, options); -}; - -/** - * Launch device camera application for recording video(s). - * - * @param {Function} successCB - * @param {Function} errorCB - * @param {CaptureVideoOptions} options - */ -Capture.prototype.captureVideo = function(successCallback, errorCallback, options){ - _capture("captureVideo", successCallback, errorCallback, options); -}; - - -module.exports = new Capture(); - -}); - -// file: lib/common/plugin/compass.js -define("cordova/plugin/compass", function(require, exports, module) { -var exec = require('cordova/exec'), - utils = require('cordova/utils'), - CompassHeading = require('cordova/plugin/CompassHeading'), - CompassError = require('cordova/plugin/CompassError'), - timers = {}, - compass = { - /** - * Asynchronously acquires the current heading. - * @param {Function} successCallback The function to call when the heading - * data is available - * @param {Function} errorCallback The function to call when there is an error - * getting the heading data. - * @param {CompassOptions} options The options for getting the heading data (not used). - */ - getCurrentHeading:function(successCallback, errorCallback, options) { - // successCallback required - if (typeof successCallback !== "function") { - console.log("Compass Error: successCallback is not a function"); - return; - } - - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Compass Error: errorCallback is not a function"); - return; - } - - var win = function(result) { - var ch = new CompassHeading(result.magneticHeading, result.trueHeading, result.headingAccuracy, result.timestamp); - successCallback(ch); - }; - var fail = function(code) { - var ce = new CompassError(code); - errorCallback(ce); - }; - - // Get heading - exec(win, fail, "Compass", "getHeading", [options]); - }, - - /** - * Asynchronously acquires the heading repeatedly at a given interval. - * @param {Function} successCallback The function to call each time the heading - * data is available - * @param {Function} errorCallback The function to call when there is an error - * getting the heading data. - * @param {HeadingOptions} options The options for getting the heading data - * such as timeout and the frequency of the watch. For iOS, filter parameter - * specifies to watch via a distance filter rather than time. - */ - watchHeading:function(successCallback, errorCallback, options) { - // Default interval (100 msec) - var frequency = (options !== undefined && options.frequency !== undefined) ? options.frequency : 100; - var filter = (options !== undefined && options.filter !== undefined) ? options.filter : 0; - - // successCallback required - if (typeof successCallback !== "function") { - console.log("Compass Error: successCallback is not a function"); - return; - } - - // errorCallback optional - if (errorCallback && (typeof errorCallback !== "function")) { - console.log("Compass Error: errorCallback is not a function"); - return; - } - - var id = utils.createUUID(); - if (filter > 0) { - // is an iOS request for watch by filter, no timer needed - timers[id] = "iOS"; - compass.getCurrentHeading(successCallback, errorCallback, options); - } else { - // Start watch timer to get headings - timers[id] = window.setInterval(function() { - compass.getCurrentHeading(successCallback, errorCallback); - }, frequency); - } - - return id; - }, - - /** - * Clears the specified heading watch. - * @param {String} watchId The ID of the watch returned from #watchHeading. - */ - clearWatch:function(id) { - // Stop javascript timer & remove from timer list - if (id && timers[id]) { - if (timers[id] != "iOS") { - clearInterval(timers[id]); - } else { - // is iOS watch by filter so call into device to stop - exec(null, null, "Compass", "stopHeading", []); - } - delete timers[id]; - } - } - }; - -module.exports = compass; -}); - -// file: lib/common/plugin/console-via-logger.js -define("cordova/plugin/console-via-logger", function(require, exports, module) { -//------------------------------------------------------------------------------ - -var logger = require("cordova/plugin/logger"); -var utils = require("cordova/utils"); - -//------------------------------------------------------------------------------ -// object that we're exporting -//------------------------------------------------------------------------------ -var console = module.exports; - -//------------------------------------------------------------------------------ -// copy of the original console object -//------------------------------------------------------------------------------ -var WinConsole = window.console; - -//------------------------------------------------------------------------------ -// whether to use the logger -//------------------------------------------------------------------------------ -var UseLogger = false; - -//------------------------------------------------------------------------------ -// Timers -//------------------------------------------------------------------------------ -var Timers = {}; - -//------------------------------------------------------------------------------ -// used for unimplemented methods -//------------------------------------------------------------------------------ -function noop() {} - -//------------------------------------------------------------------------------ -// used for unimplemented methods -//------------------------------------------------------------------------------ -console.useLogger = function (value) { - if (arguments.length) UseLogger = !!value; - - if (UseLogger) { - if (logger.useConsole()) { - throw new Error("console and logger are too intertwingly"); - } - } - - return UseLogger; -}; - -//------------------------------------------------------------------------------ -console.log = function() { - if (logger.useConsole()) return; - logger.log.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.error = function() { - if (logger.useConsole()) return; - logger.error.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.warn = function() { - if (logger.useConsole()) return; - logger.warn.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.info = function() { - if (logger.useConsole()) return; - logger.info.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.debug = function() { - if (logger.useConsole()) return; - logger.debug.apply(logger, [].slice.call(arguments)); -}; - -//------------------------------------------------------------------------------ -console.assert = function(expression) { - if (expression) return; - - var message = utils.vformat(arguments[1], [].slice.call(arguments, 2)); - console.log("ASSERT: " + message); -}; - -//------------------------------------------------------------------------------ -console.clear = function() {}; - -//------------------------------------------------------------------------------ -console.dir = function(object) { - console.log("%o", object); -}; - -//------------------------------------------------------------------------------ -console.dirxml = function(node) { - console.log(node.innerHTML); -}; - -//------------------------------------------------------------------------------ -console.trace = noop; - -//------------------------------------------------------------------------------ -console.group = console.log; - -//------------------------------------------------------------------------------ -console.groupCollapsed = console.log; - -//------------------------------------------------------------------------------ -console.groupEnd = noop; - -//------------------------------------------------------------------------------ -console.time = function(name) { - Timers[name] = new Date().valueOf(); -}; - -//------------------------------------------------------------------------------ -console.timeEnd = function(name) { - var timeStart = Timers[name]; - if (!timeStart) { - console.warn("unknown timer: " + name); - return; - } - - var timeElapsed = new Date().valueOf() - timeStart; - console.log(name + ": " + timeElapsed + "ms"); -}; - -//------------------------------------------------------------------------------ -console.timeStamp = noop; - -//------------------------------------------------------------------------------ -console.profile = noop; - -//------------------------------------------------------------------------------ -console.profileEnd = noop; - -//------------------------------------------------------------------------------ -console.count = noop; - -//------------------------------------------------------------------------------ -console.exception = console.log; - -//------------------------------------------------------------------------------ -console.table = function(data, columns) { - console.log("%o", data); -}; - -//------------------------------------------------------------------------------ -// return a new function that calls both functions passed as args -//------------------------------------------------------------------------------ -function wrapperedOrigCall(orgFunc, newFunc) { - return function() { - var args = [].slice.call(arguments); - try { orgFunc.apply(WinConsole, args); } catch (e) {} - try { newFunc.apply(console, args); } catch (e) {} - }; -} - -//------------------------------------------------------------------------------ -// For every function that exists in the original console object, that -// also exists in the new console object, wrap the new console method -// with one that calls both -//------------------------------------------------------------------------------ -for (var key in console) { - if (typeof WinConsole[key] == "function") { - console[key] = wrapperedOrigCall(WinConsole[key], console[key]); - } -} - -}); - -// file: lib/common/plugin/contacts.js -define("cordova/plugin/contacts", function(require, exports, module) { -var exec = require('cordova/exec'), - ContactError = require('cordova/plugin/ContactError'), - utils = require('cordova/utils'), - Contact = require('cordova/plugin/Contact'); - -/** -* Represents a group of Contacts. -* @constructor -*/ -var contacts = { - /** - * Returns an array of Contacts matching the search criteria. - * @param fields that should be searched - * @param successCB success callback - * @param errorCB error callback - * @param {ContactFindOptions} options that can be applied to contact searching - * @return array of Contacts matching search criteria - */ - find:function(fields, successCB, errorCB, options) { - if (!successCB) { - throw new TypeError("You must specify a success callback for the find command."); - } - if (!fields || (utils.isArray(fields) && fields.length === 0)) { - if (typeof errorCB === "function") { - errorCB(new ContactError(ContactError.INVALID_ARGUMENT_ERROR)); - } - } else { - var win = function(result) { - var cs = []; - for (var i = 0, l = result.length; i < l; i++) { - cs.push(contacts.create(result[i])); - } - successCB(cs); - }; - exec(win, errorCB, "Contacts", "search", [fields, options]); - } - }, - - /** - * This function creates a new contact, but it does not persist the contact - * to device storage. To persist the contact to device storage, invoke - * contact.save(). - * @param properties an object who's properties will be examined to create a new Contact - * @returns new Contact object - */ - create:function(properties) { - var i; - var contact = new Contact(); - for (i in properties) { - if (typeof contact[i] !== 'undefined' && properties.hasOwnProperty(i)) { - contact[i] = properties[i]; - } - } - return contact; - } -}; - -module.exports = contacts; - -}); - -// file: lib/common/plugin/geolocation.js -define("cordova/plugin/geolocation", function(require, exports, module) { -var utils = require('cordova/utils'), - exec = require('cordova/exec'), - PositionError = require('cordova/plugin/PositionError'), - Position = require('cordova/plugin/Position'); - -var timers = {}; // list of timers in use - -// Returns default params, overrides if provided with values -function parseParameters(options) { - var opt = { - maximumAge: 0, - enableHighAccuracy: false, - timeout: Infinity - }; - - if (options) { - if (options.maximumAge !== undefined && !isNaN(options.maximumAge) && options.maximumAge > 0) { - opt.maximumAge = options.maximumAge; - } - if (options.enableHighAccuracy !== undefined) { - opt.enableHighAccuracy = options.enableHighAccuracy; - } - if (options.timeout !== undefined && !isNaN(options.timeout)) { - if (options.timeout < 0) { - opt.timeout = 0; - } else { - opt.timeout = options.timeout; - } - } - } - - return opt; -} - -// Returns a timeout failure, closed over a specified timeout value and error callback. -function createTimeout(errorCallback, timeout) { - var t = setTimeout(function() { - clearTimeout(t); - t = null; - errorCallback({ - code:PositionError.TIMEOUT, - message:"Position retrieval timed out." - }); - }, timeout); - return t; -} - -var geolocation = { - lastPosition:null, // reference to last known (cached) position returned - /** - * Asynchronously aquires the current position. - * - * @param {Function} successCallback The function to call when the position data is available - * @param {Function} errorCallback The function to call when there is an error getting the heading position. (OPTIONAL) - * @param {PositionOptions} options The options for getting the position data. (OPTIONAL) - */ - getCurrentPosition:function(successCallback, errorCallback, options) { - if (arguments.length === 0) { - throw new Error("getCurrentPosition must be called with at least one argument."); - } - options = parseParameters(options); - - // Timer var that will fire an error callback if no position is retrieved from native - // before the "timeout" param provided expires - var timeoutTimer = null; - - var win = function(p) { - clearTimeout(timeoutTimer); - if (!timeoutTimer) { - // Timeout already happened, or native fired error callback for - // this geo request. - // Don't continue with success callback. - return; - } - var pos = new Position( - { - latitude:p.latitude, - longitude:p.longitude, - altitude:p.altitude, - accuracy:p.accuracy, - heading:p.heading, - velocity:p.velocity, - altitudeAccuracy:p.altitudeAccuracy - }, - (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) - ); - geolocation.lastPosition = pos; - successCallback(pos); - }; - var fail = function(e) { - clearTimeout(timeoutTimer); - timeoutTimer = null; - var err = new PositionError(e.code, e.message); - if (errorCallback) { - errorCallback(err); - } - }; - - // Check our cached position, if its timestamp difference with current time is less than the maximumAge, then just - // fire the success callback with the cached position. - if (geolocation.lastPosition && options.maximumAge && (((new Date()).getTime() - geolocation.lastPosition.timestamp.getTime()) <= options.maximumAge)) { - successCallback(geolocation.lastPosition); - // If the cached position check failed and the timeout was set to 0, error out with a TIMEOUT error object. - } else if (options.timeout === 0) { - fail({ - code:PositionError.TIMEOUT, - message:"timeout value in PositionOptions set to 0 and no cached Position object available, or cached Position object's age exceed's provided PositionOptions' maximumAge parameter." - }); - // Otherwise we have to call into native to retrieve a position. - } else { - if (options.timeout !== Infinity) { - // If the timeout value was not set to Infinity (default), then - // set up a timeout function that will fire the error callback - // if no successful position was retrieved before timeout expired. - timeoutTimer = createTimeout(fail, options.timeout); - } else { - // This is here so the check in the win function doesn't mess stuff up - // may seem weird but this guarantees timeoutTimer is - // always truthy before we call into native - timeoutTimer = true; - } - exec(win, fail, "Geolocation", "getLocation", [options.enableHighAccuracy, options.maximumAge]); - } - return timeoutTimer; - }, - /** - * Asynchronously watches the geolocation for changes to geolocation. When a change occurs, - * the successCallback is called with the new location. - * - * @param {Function} successCallback The function to call each time the location data is available - * @param {Function} errorCallback The function to call when there is an error getting the location data. (OPTIONAL) - * @param {PositionOptions} options The options for getting the location data such as frequency. (OPTIONAL) - * @return String The watch id that must be passed to #clearWatch to stop watching. - */ - watchPosition:function(successCallback, errorCallback, options) { - if (arguments.length === 0) { - throw new Error("watchPosition must be called with at least one argument."); - } - options = parseParameters(options); - - var id = utils.createUUID(); - - // Tell device to get a position ASAP, and also retrieve a reference to the timeout timer generated in getCurrentPosition - timers[id] = geolocation.getCurrentPosition(successCallback, errorCallback, options); - - var fail = function(e) { - clearTimeout(timers[id]); - var err = new PositionError(e.code, e.message); - if (errorCallback) { - errorCallback(err); - } - }; - - var win = function(p) { - clearTimeout(timers[id]); - if (options.timeout !== Infinity) { - timers[id] = createTimeout(fail, options.timeout); - } - var pos = new Position( - { - latitude:p.latitude, - longitude:p.longitude, - altitude:p.altitude, - accuracy:p.accuracy, - heading:p.heading, - velocity:p.velocity, - altitudeAccuracy:p.altitudeAccuracy - }, - (p.timestamp === undefined ? new Date() : ((p.timestamp instanceof Date) ? p.timestamp : new Date(p.timestamp))) - ); - geolocation.lastPosition = pos; - successCallback(pos); - }; - - exec(win, fail, "Geolocation", "addWatch", [id, options.enableHighAccuracy]); - - return id; - }, - /** - * Clears the specified heading watch. - * - * @param {String} id The ID of the watch returned from #watchPosition - */ - clearWatch:function(id) { - if (id && timers[id] !== undefined) { - clearTimeout(timers[id]); - delete timers[id]; - exec(null, null, "Geolocation", "clearWatch", [id]); - } - } -}; - -module.exports = geolocation; - -}); - -// file: lib/ios/plugin/ios/Contact.js -define("cordova/plugin/ios/Contact", function(require, exports, module) { -var exec = require('cordova/exec'), - ContactError = require('cordova/plugin/ContactError'); - -/** - * Provides iOS Contact.display API. - */ -module.exports = { - display : function(errorCB, options) { - /* - * Display a contact using the iOS Contact Picker UI - * NOT part of W3C spec so no official documentation - * - * @param errorCB error callback - * @param options object - * allowsEditing: boolean AS STRING - * "true" to allow editing the contact - * "false" (default) display contact - */ - - if (this.id === null) { - if (typeof errorCB === "function") { - var errorObj = new ContactError(ContactError.UNKNOWN_ERROR); - errorCB(errorObj); - } - } - else { - exec(null, errorCB, "Contacts","displayContact", [this.id, options]); - } - } -}; -}); - -// file: lib/ios/plugin/ios/Entry.js -define("cordova/plugin/ios/Entry", function(require, exports, module) { -module.exports = { - toURL:function() { - // TODO: refactor path in a cross-platform way so we can eliminate - // these kinds of platform-specific hacks. - return "file://localhost" + this.fullPath; - }, - toURI: function() { - console.log("DEPRECATED: Update your code to use 'toURL'"); - return "file://localhost" + this.fullPath; - } -}; -}); - -// file: lib/ios/plugin/ios/FileReader.js -define("cordova/plugin/ios/FileReader", function(require, exports, module) { -var exec = require('cordova/exec'), - FileError = require('cordova/plugin/FileError'), - FileReader = require('cordova/plugin/FileReader'), - ProgressEvent = require('cordova/plugin/ProgressEvent'); - -module.exports = { - readAsText:function(file, encoding) { - // Figure out pathing - this.fileName = ''; - if (typeof file.fullPath === 'undefined') { - this.fileName = file; - } else { - this.fileName = file.fullPath; - } - - // Already loading something - if (this.readyState == FileReader.LOADING) { - throw new FileError(FileError.INVALID_STATE_ERR); - } - - // LOADING state - this.readyState = FileReader.LOADING; - - // If loadstart callback - if (typeof this.onloadstart === "function") { - this.onloadstart(new ProgressEvent("loadstart", {target:this})); - } - - // Default encoding is UTF-8 - var enc = encoding ? encoding : "UTF-8"; - - var me = this; - - // Read file - exec( - // Success callback - function(r) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // Save result - me.result = decodeURIComponent(r); - - // If onload callback - if (typeof me.onload === "function") { - me.onload(new ProgressEvent("load", {target:me})); - } - - // DONE state - me.readyState = FileReader.DONE; - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - // Error callback - function(e) { - // If DONE (cancelled), then don't do anything - if (me.readyState === FileReader.DONE) { - return; - } - - // DONE state - me.readyState = FileReader.DONE; - - // null result - me.result = null; - - // Save error - me.error = new FileError(e); - - // If onerror callback - if (typeof me.onerror === "function") { - me.onerror(new ProgressEvent("error", {target:me})); - } - - // If onloadend callback - if (typeof me.onloadend === "function") { - me.onloadend(new ProgressEvent("loadend", {target:me})); - } - }, - "File", "readAsText", [this.fileName, enc]); - } -}; -}); - -// file: lib/ios/plugin/ios/console.js -define("cordova/plugin/ios/console", function(require, exports, module) { -var exec = require('cordova/exec'); - -/** - * This class provides access to the debugging console. - * @constructor - */ -var DebugConsole = function() { - this.winConsole = window.console; - this.logLevel = DebugConsole.INFO_LEVEL; -}; - -// from most verbose, to least verbose -DebugConsole.ALL_LEVEL = 1; // same as first level -DebugConsole.INFO_LEVEL = 1; -DebugConsole.WARN_LEVEL = 2; -DebugConsole.ERROR_LEVEL = 4; -DebugConsole.NONE_LEVEL = 8; - -DebugConsole.prototype.setLevel = function(level) { - this.logLevel = level; -}; - -var stringify = function(message) { - try { - if (typeof message === "object" && JSON && JSON.stringify) { - try { - return JSON.stringify(message); - } - catch (e) { - return "error JSON.stringify()ing argument: " + e; - } - } else { - return message.toString(); - } - } catch (e) { - return e.toString(); - } -}; - -/** - * Print a normal log message to the console - * @param {Object|String} message Message or object to print to the console - */ -DebugConsole.prototype.log = function(message) { - if (this.logLevel <= DebugConsole.INFO_LEVEL) { - exec(null, null, 'Debug Console', 'log', [ stringify(message), { logLevel: 'INFO' } ]); - } - else if (this.winConsole && this.winConsole.log) { - this.winConsole.log(message); - } -}; - -/** - * Print a warning message to the console - * @param {Object|String} message Message or object to print to the console - */ -DebugConsole.prototype.warn = function(message) { - if (this.logLevel <= DebugConsole.WARN_LEVEL) { - exec(null, null, 'Debug Console', 'log', [ stringify(message), { logLevel: 'WARN' } ]); - } - else if (this.winConsole && this.winConsole.warn) { - this.winConsole.warn(message); - } -}; - -/** - * Print an error message to the console - * @param {Object|String} message Message or object to print to the console - */ -DebugConsole.prototype.error = function(message) { - if (this.logLevel <= DebugConsole.ERROR_LEVEL) { - exec(null, null, 'Debug Console', 'log', [ stringify(message), { logLevel: 'ERROR' } ]); - } - else if (this.winConsole && this.winConsole.error){ - this.winConsole.error(message); - } -}; - -module.exports = new DebugConsole(); -}); - -// file: lib/ios/plugin/ios/contacts.js -define("cordova/plugin/ios/contacts", function(require, exports, module) { -var exec = require('cordova/exec'); - -/** - * Provides iOS enhanced contacts API. - */ -module.exports = { - newContactUI : function(successCallback) { - /* - * Create a contact using the iOS Contact Picker UI - * NOT part of W3C spec so no official documentation - * - * returns: the id of the created contact as param to successCallback - */ - exec(successCallback, null, "Contacts","newContact", []); - }, - chooseContact : function(successCallback, options) { - /* - * Select a contact using the iOS Contact Picker UI - * NOT part of W3C spec so no official documentation - * - * @param errorCB error callback - * @param options object - * allowsEditing: boolean AS STRING - * "true" to allow editing the contact - * "false" (default) display contact - * - * returns: the id of the selected contact as param to successCallback - */ - exec(successCallback, null, "Contacts","chooseContact", [options]); - } -}; -}); - -// file: lib/ios/plugin/ios/device.js -define("cordova/plugin/ios/device", function(require, exports, module) { -/** - * this represents the mobile device, and provides properties for inspecting the model, version, UUID of the - * phone, etc. - * @constructor - */ -var exec = require('cordova/exec'), - utils = require('cordova/utils'), - channel = require('cordova/channel'); - -var Device = function() { - this.platform = null; - this.version = null; - this.name = null; - this.cordova = null; - this.uuid = null; -}; - -Device.prototype.setInfo = function(info) { - try { - this.platform = info.platform; - this.version = info.version; - this.name = info.name; - this.cordova = info.cordova; - this.uuid = info.uuid; - channel.onCordovaInfoReady.fire(); - } catch(e) { - utils.alert('Error during device info setting in cordova/plugin/ios/device!'); - } -}; - -module.exports = new Device(); - -}); - -// file: lib/ios/plugin/ios/nativecomm.js -define("cordova/plugin/ios/nativecomm", function(require, exports, module) { -var cordova = require('cordova'); - -/** - * Called by native code to retrieve all queued commands and clear the queue. - */ -module.exports = function() { - var json = JSON.stringify(cordova.commandQueue); - cordova.commandQueue = []; - return json; -}; -}); - -// file: lib/ios/plugin/ios/notification.js -define("cordova/plugin/ios/notification", function(require, exports, module) { -var Media = require('cordova/plugin/Media'); - -module.exports = { - beep:function(count) { - (new Media('beep.wav')).play(); - } -}; -}); - -// file: lib/common/plugin/logger.js -define("cordova/plugin/logger", function(require, exports, module) { -//------------------------------------------------------------------------------ -// The logger module exports the following properties/functions: -// -// LOG - constant for the level LOG -// ERROR - constant for the level ERROR -// WARN - constant for the level WARN -// INFO - constant for the level INFO -// DEBUG - constant for the level DEBUG -// logLevel() - returns current log level -// logLevel(value) - sets and returns a new log level -// useConsole() - returns whether logger is using console -// useConsole(value) - sets and returns whether logger is using console -// log(message,...) - logs a message at level LOG -// error(message,...) - logs a message at level ERROR -// warn(message,...) - logs a message at level WARN -// info(message,...) - logs a message at level INFO -// debug(message,...) - logs a message at level DEBUG -// logLevel(level,message,...) - logs a message specified level -// -//------------------------------------------------------------------------------ - -var logger = exports; - -var exec = require('cordova/exec'); -var utils = require('cordova/utils'); - -var UseConsole = true; -var Queued = []; -var DeviceReady = false; -var CurrentLevel; - -/** - * Logging levels - */ - -var Levels = [ - "LOG", - "ERROR", - "WARN", - "INFO", - "DEBUG" -]; - -/* - * add the logging levels to the logger object and - * to a separate levelsMap object for testing - */ - -var LevelsMap = {}; -for (var i=0; i CurrentLevel) return; - - // queue the message if not yet at deviceready - if (!DeviceReady && !UseConsole) { - Queued.push([level, message]); - return; - } - - // if not using the console, use the native logger - if (!UseConsole) { - exec(null, null, "Logger", "logLevel", [level, message]); - return; - } - - // make sure console is not using logger - if (console.__usingCordovaLogger) { - throw new Error("console and logger are too intertwingly"); - } - - // log to the console - switch (level) { - case logger.LOG: console.log(message); break; - case logger.ERROR: console.log("ERROR: " + message); break; - case logger.WARN: console.log("WARN: " + message); break; - case logger.INFO: console.log("INFO: " + message); break; - case logger.DEBUG: console.log("DEBUG: " + message); break; - } -}; - -// when deviceready fires, log queued messages -logger.__onDeviceReady = function() { - if (DeviceReady) return; - - DeviceReady = true; - - for (var i=0; i 3) { - fail(FileError.SYNTAX_ERR); - } else { - // if successful, return a FileSystem object - var success = function(file_system) { - if (file_system) { - if (typeof successCallback === 'function') { - // grab the name and root from the file system object - var result = new FileSystem(file_system.name, file_system.root); - successCallback(result); - } - } - else { - // no FileSystem object returned - fail(FileError.NOT_FOUND_ERR); - } - }; - exec(success, fail, "File", "requestFileSystem", [type, size]); - } -}; - -module.exports = requestFileSystem; -}); - -// file: lib/common/plugin/resolveLocalFileSystemURI.js -define("cordova/plugin/resolveLocalFileSystemURI", function(require, exports, module) { -var DirectoryEntry = require('cordova/plugin/DirectoryEntry'), - FileEntry = require('cordova/plugin/FileEntry'), - FileError = require('cordova/plugin/FileError'), - exec = require('cordova/exec'); - -/** - * Look up file system Entry referred to by local URI. - * @param {DOMString} uri URI referring to a local file or directory - * @param successCallback invoked with Entry object corresponding to URI - * @param errorCallback invoked if error occurs retrieving file system entry - */ -module.exports = function(uri, successCallback, errorCallback) { - // error callback - var fail = function(error) { - if (typeof errorCallback === 'function') { - errorCallback(new FileError(error)); - } - }; - // sanity check for 'not:valid:filename' - if(!uri || uri.split(":").length > 2) { - setTimeout( function() { - fail(FileError.ENCODING_ERR); - },0); - return; - } - // if successful, return either a file or directory entry - var success = function(entry) { - var result; - if (entry) { - if (typeof successCallback === 'function') { - // create appropriate Entry object - result = (entry.isDirectory) ? new DirectoryEntry(entry.name, entry.fullPath) : new FileEntry(entry.name, entry.fullPath); - try { - successCallback(result); - } - catch (e) { - console.log('Error invoking callback: ' + e); - } - } - } - else { - // no Entry object returned - fail(FileError.NOT_FOUND_ERR); - } - }; - - exec(success, fail, "File", "resolveLocalFileSystemURI", [uri]); -}; - -}); - -// file: lib/common/plugin/splashscreen.js -define("cordova/plugin/splashscreen", function(require, exports, module) { -var exec = require('cordova/exec'); - -var splashscreen = { - hide:function() { - exec(null, null, "SplashScreen", "hide", []); - } -}; - -module.exports = splashscreen; -}); - -// file: lib/common/utils.js -define("cordova/utils", function(require, exports, module) { -var utils = exports; - -/** - * Returns an indication of whether the argument is an array or not - */ -utils.isArray = function(a) { - return Object.prototype.toString.call(a) == '[object Array]'; -}; - -/** - * Returns an indication of whether the argument is a Date or not - */ -utils.isDate = function(d) { - return Object.prototype.toString.call(d) == '[object Date]'; -}; - -/** - * Does a deep clone of the object. - */ -utils.clone = function(obj) { - if(!obj || typeof obj == 'function' || utils.isDate(obj) || typeof obj != 'object') { - return obj; - } - - var retVal, i; - - if(utils.isArray(obj)){ - retVal = []; - for(i = 0; i < obj.length; ++i){ - retVal.push(utils.clone(obj[i])); - } - return retVal; - } - - retVal = {}; - for(i in obj){ - if(!(i in retVal) || retVal[i] != obj[i]) { - retVal[i] = utils.clone(obj[i]); - } - } - return retVal; -}; - -/** - * Returns a wrappered version of the function - */ -utils.close = function(context, func, params) { - if (typeof params == 'undefined') { - return function() { - return func.apply(context, arguments); - }; - } else { - return function() { - return func.apply(context, params); - }; - } -}; - -/** - * Create a UUID - */ -utils.createUUID = function() { - return UUIDcreatePart(4) + '-' + - UUIDcreatePart(2) + '-' + - UUIDcreatePart(2) + '-' + - UUIDcreatePart(2) + '-' + - UUIDcreatePart(6); -}; - -/** - * Extends a child object from a parent object using classical inheritance - * pattern. - */ -utils.extend = (function() { - // proxy used to establish prototype chain - var F = function() {}; - // extend Child from Parent - return function(Child, Parent) { - F.prototype = Parent.prototype; - Child.prototype = new F(); - Child.__super__ = Parent.prototype; - Child.prototype.constructor = Child; - }; -}()); - -/** - * Alerts a message in any available way: alert or console.log. - */ -utils.alert = function(msg) { - if (alert) { - alert(msg); - } else if (console && console.log) { - console.log(msg); - } -}; - -/** - * Formats a string and arguments following it ala sprintf() - * - * see utils.vformat() for more information - */ -utils.format = function(formatString /* ,... */) { - var args = [].slice.call(arguments, 1); - return utils.vformat(formatString, args); -}; - -/** - * Formats a string and arguments following it ala vsprintf() - * - * format chars: - * %j - format arg as JSON - * %o - format arg as JSON - * %c - format arg as '' - * %% - replace with '%' - * any other char following % will format it's - * arg via toString(). - * - * for rationale, see FireBug's Console API: - * http://getfirebug.com/wiki/index.php/Console_API - */ -utils.vformat = function(formatString, args) { - if (formatString === null || formatString === undefined) return ""; - if (arguments.length == 1) return formatString.toString(); - if (typeof formatString != "string") return formatString.toString(); - - var pattern = /(.*?)%(.)(.*)/; - var rest = formatString; - var result = []; - - while (args.length) { - var arg = args.shift(); - var match = pattern.exec(rest); - - if (!match) break; - - rest = match[3]; - - result.push(match[1]); - - if (match[2] == '%') { - result.push('%'); - args.unshift(arg); - continue; - } - - result.push(formatted(arg, match[2])); - } - - result.push(rest); - - return result.join(''); -}; - -//------------------------------------------------------------------------------ -function UUIDcreatePart(length) { - var uuidpart = ""; - for (var i=0; i - - - WebODF - - - - - - - - - - - - - - - - diff --git a/attic/programs/ios/www/nativezip.js b/attic/programs/ios/www/nativezip.js deleted file mode 100644 index 5c548fb87..000000000 --- a/attic/programs/ios/www/nativezip.js +++ /dev/null @@ -1,102 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global runtime, core, XMLHttpRequest*/ - -core.Zip = function (url, entriesReadCallback) { - "use strict"; - // remove 'odf:' prefix - url = url.substr(4); - var zip = this; - this.load = function (filename, callback) { - //alert(filename); - callback(null, ""); - }; - this.loadAsString = function (filename, callback) { - alert("loadAsString"); - }; - this.loadAsDOM = function (filename, callback) { - var xhr = new XMLHttpRequest(); - function handleResult() { - var xml; - runtime.log("loading " + filename + " status " + xhr.status + " readyState " + xhr.readyState); - if (xhr.readyState === 4) { - xml = xhr.responseXML; - runtime.log("done accessing responseXML " + xml + " " + (xhr.responseText && xhr.responseText.length) - + " " + xhr.statusText); - runtime.log("statusText " + xhr.statusText); - if (xhr.status === 0 && !xml) { - // empty files are considered as errors - callback("File " + filename + " is not valid XML."); - } else if (xhr.status === 200 || xhr.status === 0) { - try { - callback(null, xml); - } catch (e) { - runtime.log(e); - } - } else { - // report error - callback(xhr.responseText || xhr.statusText); - } - } - } - xhr.open('GET', "http://zipserver" + url + "?" + filename, true); - xhr.onreadystatechange = handleResult; - xhr.send(null); - }; - this.loadAsDataURL = function (filename, mimetype, callback) { - callback(null, "http://zipserver" + url + "?" + filename); - }; - this.getEntries = function () { - alert("getEntries"); - }; - this.loadContentXmlAsFragments = function (filename, handler) { - // the javascript implementation simply reads the file - zip.loadAsString(filename, function (err, data) { - if (err) { - return handler.rootElementReady(err); - } - handler.rootElementReady(null, data, true); - }); - }; - this.save = function () { - alert("save"); - }; - this.write = function () { - alert("write"); - }; - entriesReadCallback(null, this); -}; diff --git a/attic/programs/nativeQtClient/CMakeLists.txt b/attic/programs/nativeQtClient/CMakeLists.txt deleted file mode 100644 index dd72fad52..000000000 --- a/attic/programs/nativeQtClient/CMakeLists.txt +++ /dev/null @@ -1,45 +0,0 @@ -include(${QT_USE_FILE}) -include_directories(${CMAKE_CURRENT_BINARY_DIR} ${QT_QTCORE_INCLUDE_DIR}) -QT4_WRAP_CPP(NATIVEQTCLIENT_MOC - odfview.h - ../qtjsruntime/nativeio.h - ../qtjsruntime/nam.h -) -file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/application.qrc - "") -foreach(FILE ${TOUCHUI_FILES} index.html scripts.js webodf.js) - if (IS_ABSOLUTE ${FILE}) - GET_FILENAME_COMPONENT(_wwwfile ${FILE} NAME) - else (IS_ABSOLUTE ${FILE}) - SET(_wwwfile ${FILE}) - endif (IS_ABSOLUTE ${FILE}) - file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/application.qrc "www/${_wwwfile}\n") -endforeach(FILE ${TOUCHUI_FILES}) -file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/application.qrc - "") -COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/programs/touchui - ${CMAKE_CURRENT_BINARY_DIR}/www ${TOUCHUI_FILES}) -COPY_FILES(NATIVEDEPS ${CMAKE_CURRENT_SOURCE_DIR} - ${CMAKE_CURRENT_BINARY_DIR}/www scripts.js) -COPY_FILES(NATIVEDEPS ${CMAKE_SOURCE_DIR}/programs/touchui - ${CMAKE_CURRENT_BINARY_DIR}/www index.html) -QT4_ADD_RESOURCES(NATIVEQTCLIENT_RES - ${CMAKE_CURRENT_BINARY_DIR}/application.qrc) - -add_custom_target(nativeQtClientDepencencies DEPENDS ${NATIVEDEPS}) - -# creates a copy of the compiled webodf.js in the nativeQtClient build dir -add_custom_target(nativeQtClient-webodf.js-target - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/webodf/webodf.js ${CMAKE_CURRENT_BINARY_DIR}/www -) -add_dependencies(nativeQtClient-webodf.js-target webodf.js-target) - -add_executable(nativeQtClient EXCLUDE_FROM_ALL - main.cpp - odfview.cpp - ../qtjsruntime/nativeio.cpp - odfpage.cpp ${NATIVEQTCLIENT_MOC} ${NATIVEQTCLIENT_UI} - ${NATIVEQTCLIENT_RES}) - -target_link_libraries(nativeQtClient ${QT_LIBRARIES}) -add_dependencies(nativeQtClient nativeQtClient-webodf.js-target nativeQtClientDepencencies) diff --git a/attic/programs/nativeQtClient/README b/attic/programs/nativeQtClient/README deleted file mode 100644 index 4860fa1b0..000000000 --- a/attic/programs/nativeQtClient/README +++ /dev/null @@ -1 +0,0 @@ -This is a small app that can show ODF documents using mainly javascript. Some functions that are not fast in browers are provided in C++ and it gives the ability to open files on the file system. diff --git a/attic/programs/nativeQtClient/application.qrc b/attic/programs/nativeQtClient/application.qrc deleted file mode 100644 index 5010cdb8a..000000000 --- a/attic/programs/nativeQtClient/application.qrc +++ /dev/null @@ -1,18 +0,0 @@ - - - www/app/app.js - www/app/controller/Files.js - www/app/model/FileSystem.js - www/app/store/FileStore.js - www/app/views/FileDetail.js - www/app/views/FilesList.js - www/app/views/OdfView.js - www/app/views/Viewport.js - www/index.html - www/scripts.js - www/sencha-touch.css - www/sencha-touch.js - www/webodf.css - www/webodf.js - - diff --git a/attic/programs/nativeQtClient/main.cpp b/attic/programs/nativeQtClient/main.cpp deleted file mode 100644 index 62e5fa18b..000000000 --- a/attic/programs/nativeQtClient/main.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include "odfview.h" -#include -#include - -int main(int argc, char *argv[]) { - QApplication a(argc, argv); - OdfView view; - view.show(); - return a.exec(); -} diff --git a/attic/programs/nativeQtClient/mainwindow.cpp b/attic/programs/nativeQtClient/mainwindow.cpp deleted file mode 100644 index 861014399..000000000 --- a/attic/programs/nativeQtClient/mainwindow.cpp +++ /dev/null @@ -1,173 +0,0 @@ -#include "mainwindow.h" -#include "ui_mainwindow.h" -#include "odfview.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -MainWindow::MainWindow(QWidget *parent) : - QMainWindow(parent), - ui(new Ui::MainWindow) -{ - ui->setupUi(this); - - createActions(); - createToolBars(); - - QCoreApplication::setOrganizationName("KO"); - //QCoreApplication::setOrganizationDomain("example.com"); - QCoreApplication::setApplicationName("Odf Viewer"); - - QSettings settings; - - setWindowTitle(tr("Odf Viewer")); - setUnifiedTitleAndToolBarOnMac(true); - - QStringList odfNameFilter; - odfNameFilter << "*.odt" << "*.ods" << "*.odp"; - dirmodel = new QFileSystemModel(this); - dirmodel->setNameFilters(odfNameFilter); - dirmodel->setFilter(QDir::AllDirs|QDir::AllEntries|QDir::NoDotAndDotDot); - dirview = new QTreeView(this); - dirview->setModel(dirmodel); - dirview->setHeaderHidden(true); - dirview->setAnimated(true); - for (int i = 1; i < dirmodel->columnCount(); i++) { - dirview->setColumnHidden(i, true); - } - QString rootpath = settings.value("rootpath", QDir::homePath()).toString(); - dirmodel->setRootPath(rootpath); - const QModelIndex rootindex = dirmodel->index(rootpath); - dirview->setRootIndex(rootindex); - QLineEdit *dirPath = new QLineEdit(rootpath, this); - dirdock = new QDockWidget(this); - QWidget *w = new QWidget(dirdock); - QVBoxLayout *layout = new QVBoxLayout(w); - dirdock->setWidget(w); - layout->addWidget(dirPath); - layout->addWidget(dirview); - addDockWidget(Qt::LeftDockWidgetArea, dirdock); - - connect(dirview, SIGNAL(clicked(QModelIndex)), this, SLOT(loadOdf(QModelIndex))); - connect(dirPath, SIGNAL(textChanged(QString)), this, SLOT(setPath(QString))); -} - -MainWindow::~MainWindow() -{ - delete ui; -} - -void -MainWindow::openFile(const QString& path) -{ - QMdiSubWindow* w = findMdiChild(path); - OdfView* v = (w) ?dynamic_cast(w->widget()) :0; - if (v == 0) { - w = ui->mdiArea->activeSubWindow(); - v = (w) ?dynamic_cast(w->widget()) :0; - } - if (v == 0) { - v = new OdfView(this); - v->showMaximized(); - w = ui->mdiArea->addSubWindow(v); - w->showMaximized(); - } - ui->mdiArea->setActiveSubWindow(w); - v->loadFile(path); -} - -void MainWindow::changeEvent(QEvent *e) -{ - QMainWindow::changeEvent(e); - switch (e->type()) { - case QEvent::LanguageChange: - ui->retranslateUi(this); - break; - default: - break; - } -} -void MainWindow::open() -{ - QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), - tr("Office Files (*.odt *.odp *.ods)")); - if (!fileName.isEmpty()) { - QMdiSubWindow *existing = findMdiChild(fileName); - if (existing) { - ui->mdiArea->setActiveSubWindow(existing); - return; - } - - OdfView *child = createOdfView(); - if (child->loadFile(fileName)) { - statusBar()->showMessage(tr("File loaded"), 2000); - child->showMaximized(); - } else { - child->close(); - } - } -} -void MainWindow::createActions() -{ - //openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); - openAct = new QAction(tr("&Open..."), this); - openAct->setShortcuts(QKeySequence::Open); - openAct->setStatusTip(tr("Open an existing file")); - connect(openAct, SIGNAL(triggered()), this, SLOT(open())); -} -void MainWindow::createToolBars() -{ - fileToolBar = addToolBar(tr("File")); - fileToolBar->addAction(openAct); -} -QMdiSubWindow *MainWindow::findMdiChild(const QString &fileName) -{ - QString canonicalFilePath = QFileInfo(fileName).canonicalFilePath(); - - foreach (QMdiSubWindow *window, ui->mdiArea->subWindowList()) { - OdfView *odfView = qobject_cast(window->widget()); - if (odfView->currentFile() == canonicalFilePath) - return window; - } - return 0; -} - -OdfView *MainWindow::createOdfView() -{ - OdfView *view = new OdfView(this); - ui->mdiArea->addSubWindow(view); - return view; -} - -void -MainWindow::loadOdf(const QModelIndex& index) { - if (dirmodel->isDir(index)) { - if (dirview->isExpanded(index)) { - dirview->collapse(index); - } else { - dirview->expand(index); - } - return; - } - QString path = dirmodel->filePath(index); - path = QFileInfo(path).canonicalFilePath(); - openFile(path); -} - -void MainWindow::setPath(const QString &path) -{ - dirmodel->setRootPath(path); - const QModelIndex rootindex = dirmodel->index(path); - dirview->setRootIndex(rootindex); - QSettings settings; - settings.setValue("rootpath", path); -} - - - diff --git a/attic/programs/nativeQtClient/mainwindow.h b/attic/programs/nativeQtClient/mainwindow.h deleted file mode 100644 index d0bc822d0..000000000 --- a/attic/programs/nativeQtClient/mainwindow.h +++ /dev/null @@ -1,46 +0,0 @@ -#ifndef MAINWINDOW_H -#define MAINWINDOW_H - -#include -#include - -namespace Ui { - class MainWindow; -} - -class OdfView; -class QFileSystemModel; -class QTreeView; -class QDockWidget; -class QModelIndex; - -class MainWindow : public QMainWindow { - Q_OBJECT -public: - MainWindow(QWidget *parent = 0); - ~MainWindow(); - void openFile(const QString& path); - -private slots: - void open(); - OdfView *createOdfView(); - void loadOdf(const QModelIndex& index); - void setPath(const QString &path); - -private: - QMdiSubWindow *findMdiChild(const QString &fileName); - void createActions(); - void createToolBars(); - QToolBar *fileToolBar; - QAction *openAct; -protected: - void changeEvent(QEvent *e); - -private: - Ui::MainWindow *ui; - QFileSystemModel* dirmodel; - QTreeView* dirview; - QDockWidget* dirdock; -}; - -#endif // MAINWINDOW_H diff --git a/attic/programs/nativeQtClient/mainwindow.ui b/attic/programs/nativeQtClient/mainwindow.ui deleted file mode 100644 index 38682c701..000000000 --- a/attic/programs/nativeQtClient/mainwindow.ui +++ /dev/null @@ -1,46 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 800 - 600 - - - - MainWindow - - - - - - - - - - - - 0 - 0 - 800 - 23 - - - - - - TopToolBarArea - - - false - - - - - - - - diff --git a/attic/programs/nativeQtClient/odfpage.cpp b/attic/programs/nativeQtClient/odfpage.cpp deleted file mode 100644 index d87a8baa2..000000000 --- a/attic/programs/nativeQtClient/odfpage.cpp +++ /dev/null @@ -1 +0,0 @@ -#include "odfpage.h" diff --git a/attic/programs/nativeQtClient/odfpage.h b/attic/programs/nativeQtClient/odfpage.h deleted file mode 100644 index 487d16991..000000000 --- a/attic/programs/nativeQtClient/odfpage.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef ODFPAGE_H -#define ODFPAGE_H - -#include -#include - -class OdfPage : public QWebPage { -public: - OdfPage(QObject* parent) :QWebPage(parent) {} - void javaScriptConsoleMessage(const QString& message, int lineNumber, const QString & sourceID) { - qDebug() << sourceID << ":" << lineNumber << ":" << message; - } -}; - -#endif // ODFPAGE_H diff --git a/attic/programs/nativeQtClient/odfview.cpp b/attic/programs/nativeQtClient/odfview.cpp deleted file mode 100644 index 60da5c9ef..000000000 --- a/attic/programs/nativeQtClient/odfview.cpp +++ /dev/null @@ -1,80 +0,0 @@ -#include "odfview.h" - -#include "../qtjsruntime/nativeio.h" -#include "../qtjsruntime/nam.h" - -#include "odfpage.h" - -#include -#include -#include -#include -#include -#include -#include - -OdfView::OdfView(QWidget* parent) :QWebView(parent) -{ - QString prefix = "../android/assets/"; // set this to the right value when debugging - QString htmlfile = QDir(prefix).absoluteFilePath("www/index.html"); - if (!QFileInfo(htmlfile).exists()) { - prefix = "qrc:/"; - htmlfile = "qrc:/www/index.html"; - } - setPage(new OdfPage(this)); - nativeio = new NativeIO(this, QDir(prefix), QDir::current()); - connect(page(), SIGNAL(loadFinished(bool)), this, SLOT(slotLoadFinished(bool))); - page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); - - connect(page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), - this, SLOT(slotInitWindowObjects())); - - // use our own networkaccessmanager that gives limited access to the local - // file system - networkaccessmanager = new NAM(this); - page()->setNetworkAccessManager(networkaccessmanager); - setUrl(QUrl(htmlfile)); - loaded = false; -} - -OdfView::~OdfView() { -} - -void -OdfView::slotInitWindowObjects() -{ - QWebFrame *frame = page()->mainFrame(); - frame->addToJavaScriptWindowObject("nativeio", nativeio); -} - -bool -OdfView::loadFile(const QString &fileName) { - curFile = fileName; - // odf->addFile(identifier, fileName); - // networkaccessmanager->setCurrentFile(odf->getOpenContainer(identifier)); - if (loaded) { - slotLoadFinished(true); - } - return true; -} -void -OdfView::slotLoadFinished(bool ok) { - if (!ok) return; - loaded = true; - QWebFrame *frame = page()->mainFrame(); - QString js = - "var originalReadFileSync = runtime.readFileSync;" - "runtime.readFileSync = function (path, encoding) {" - " if (path.substr(path.length - 3) === '.js') {" - " return originalReadFileSync.apply(runtime," - " [path, encoding]);" - " }" - " return nativeio.readFileSync(path, encoding);" - "};" - "runtime.read = function (path, offset, length, callback) {" - " var data = nativeio.read(path, offset, length);" - " data = runtime.byteArrayFromString(data, 'binary');" - " callback(nativeio.error()||null, data);" - "};"; - frame->evaluateJavaScript(js); -} diff --git a/attic/programs/nativeQtClient/odfview.h b/attic/programs/nativeQtClient/odfview.h deleted file mode 100644 index f61ba3c92..000000000 --- a/attic/programs/nativeQtClient/odfview.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef ODFVIEW_H -#define ODFVIEW_H - -#include -#include -class NativeIO; - -class OdfView : public QWebView { -Q_OBJECT -public: - OdfView(QWidget* parent = 0); - ~OdfView(); - QString currentFile() { return curFile; } - -public slots: - bool loadFile(const QString &fileName); - -private slots: - void slotLoadFinished(bool ok); - void slotInitWindowObjects(); - -private: - bool loaded; - QString curFile; - QNetworkAccessManager* networkaccessmanager; - NativeIO* nativeio; -}; - -#endif // ODFVIEW_H diff --git a/attic/programs/nativeQtClient/scripts.js b/attic/programs/nativeQtClient/scripts.js deleted file mode 100644 index 120a641d9..000000000 --- a/attic/programs/nativeQtClient/scripts.js +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global alert, app, window, runtime*/ -var LocalFileSystem = { - PERSISTENT: 0, - TEMPORARY: 1 -}; -function FileEntry(name, fullPath) { - "use strict"; - this.isFile = true; - this.isDirectory = false; - this.name = name; - this.fullPath = fullPath; - this.file = function (onsuccess, onerror) { - function File(fullPath) { - this.name = name; - this.fullPath = fullPath; - this.type = ""; - this.size = -1; - this.lastModifiedDate = -1; - } - var file = new File(fullPath); - try { - onsuccess(file); - } catch (e) { - alert("Error on determining file properties: " + e); - onerror(e); - } - }; -} -function FileReader() { - "use strict"; - var fr = this; - this.readAsArrayBuffer = function (file) { - var path = file.fullPath.substr(7), - data = runtime.readFileSync(path, 'binary'); - data = runtime.byteArrayFromString(data, "binary"); - window.setTimeout(function () { - fr.onloadend({target: {result: data}}); - }, 1); - }; -} -var DirectoryReader; -function DirectoryEntry(name, fullPath) { - "use strict"; - this.isFile = false; - this.isDirectory = true; - this.name = name; - this.fullPath = fullPath; - this.createReader = function () { - var reader = new DirectoryReader(fullPath); - return reader; - }; -} -function DirectoryReader(fullPath) { - "use strict"; - this.readEntries = function (onsuccess, onerror) { - window.setTimeout(function () { - var entries = []; - entries[entries.length] = new FileEntry("welcome.odt", - "welcome.odt"); - entries[entries.length] = new FileEntry("Traktatenblad.odt", - "Traktatenblad.odt"); - try { - onsuccess(entries); - } catch (e) { - onerror(e); - } - }, 1); - }; -} -window.resolveLocalFileSystemURI = function (path, onsuccess, onerror) { - "use strict"; - var p = path.lastIndexOf("/"), - name = (p === -1) ? path : path.substr(p + 1); - onsuccess(new FileEntry(name, path)); -}; -window.requestFileSystem = function (filesystem, id, onsuccess, onerror) { - "use strict"; - var dirs = [], shared, subfolder, path; - try { - if (filesystem === LocalFileSystem.PERSISTENT) { - path = ""; - onsuccess({ - name: "root", - root: new DirectoryEntry("root", path) - }); - } else { - onerror("not defined"); - } - } catch (e) { - onerror(e); - } -}; -var device = {}; diff --git a/attic/programs/playbook/CMakeLists.txt b/attic/programs/playbook/CMakeLists.txt deleted file mode 100644 index e69de29bb..000000000 diff --git a/attic/programs/playbook/build_sign.bat b/attic/programs/playbook/build_sign.bat deleted file mode 100644 index 34e8deeab..000000000 --- a/attic/programs/playbook/build_sign.bat +++ /dev/null @@ -1,23 +0,0 @@ -@echo on -set WWSDK=M:\blackberrysdk\webworkssdk -set BBWP=%WWSDK%\bbwp\bbwp -set DEPLOY=%WWSDK%\bbwp\blackberry-tablet-sdk\bin\blackberry-deploy -set JAVA_HOME=%WWSDK%\jre -set PATH=%PATH%;%JAVA_HOME%\bin - -mkdir bin -mkdir signed - -zip -r webodf.zip config.xml index.html icon.png scripts.js app sencha-touch.js sencha-touch.css webodf.js webodf.css ZoomIn.png ZoomOut.png - -rem MAKE A DEBUG VERSION -del bin\webodf.bar -%BBWP% webodf.zip -d -o bin -if %errorlevel% neq 0 exit /b %errorlevel% - -%DEPLOY% -installApp -password ko -device 192.168.1.111 -package bin\webodf.bar -if %errorlevel% neq 0 exit /b %errorlevel% - -rem MAKE A SIGNED VERSION, (can be done only once for each buildId!) -rem %BBWP% webodf.zip -g U9gXpJXbGC -buildId 2 -o signed - diff --git a/attic/programs/playbook/config.xml b/attic/programs/playbook/config.xml deleted file mode 100644 index cab778831..000000000 --- a/attic/programs/playbook/config.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - KO GmbH - WebODF - - Viewer for OpenDocument files. - - - - - - - - - access_shared - - - - - - - - - diff --git a/attic/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js b/attic/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js deleted file mode 100644 index c707e32ac..000000000 --- a/attic/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_dispatcher.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -(function () { - var CUSTOM_FILEREADER_API_URL = "blackberry/custom/filereader"; - - var ARGS_PATH = "path"; - var ARGS_DATA = "data"; - - function CustomFileReader() { - }; - - CustomFileReader.prototype.readAsDataURL = function(path) { - var remoteCall = new blackberry.transport.RemoteFunctionCall(CUSTOM_FILEREADER_API_URL + "/readAsDataURL"); - remoteCall.addParam(ARGS_PATH, path); - return remoteCall.makeSyncCall(); - }; - - blackberry.Loader.javascriptLoaded("blackberry.custom.filereader", CustomFileReader); -})(); diff --git a/attic/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js b/attic/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js deleted file mode 100644 index 4d677965c..000000000 --- a/attic/programs/playbook/ext/blackberry.custom.filereader/js/common/custom_filereader_ns.js +++ /dev/null @@ -1,44 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -(function () { - - function CustomFileReader(disp) { - this.constructor.prototype.readAsDataURL = function(path) { return disp.readAsDataURL(path); }; - }; - - blackberry.Loader.javascriptLoaded("blackberry.custom.filereader", CustomFileReader); -})(); diff --git a/attic/programs/playbook/ext/blackberry.custom.filereader/library.xml b/attic/programs/playbook/ext/blackberry.custom.filereader/library.xml deleted file mode 100644 index a5a24c3d8..000000000 --- a/attic/programs/playbook/ext/blackberry.custom.filereader/library.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - blackberry.custom.filereader.CustomFileReader - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/attic/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as b/attic/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as deleted file mode 100644 index 3261fbcf4..000000000 --- a/attic/programs/playbook/ext/blackberry.custom.filereader/src/AIR/CustomFileReader/src/blackberry/custom/filereader/CustomFileReader.as +++ /dev/null @@ -1,34 +0,0 @@ -package blackberry.custom.filereader { - import flash.filesystem.File; - import flash.filesystem.FileMode; - import flash.filesystem.FileStream; - import flash.utils.ByteArray; - import mx.utils.Base64Encoder; - import webworks.extension.DefaultExtension; - - public class CustomFileReader extends DefaultExtension { - - public function CustomFileReader() { - super(); - } - - override public function getFeatureList():Array { - return new Array ("blackberry.custom.filereader"); - } - - public function readAsDataURL(path:String):String { - var file:File = new File(path); - if (!file.exists) { - return ""; - } - var bytes:ByteArray = new ByteArray(); - var stream:FileStream = new FileStream(); - stream.open(file, FileMode.READ); - stream.readBytes(bytes); - var btoa:Base64Encoder = new Base64Encoder(); - btoa.encodeBytes(bytes); - stream.close(); - return "data:;base64," + btoa.toString(); - } - } -} \ No newline at end of file diff --git a/attic/programs/playbook/icon.png b/attic/programs/playbook/icon.png deleted file mode 100644 index b7ccb848e3949b55361f2fb30dfe3a39756aa387..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19269 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 diff --git a/attic/programs/playbook/index.html b/attic/programs/playbook/index.html deleted file mode 100644 index 77d331c12..000000000 --- a/attic/programs/playbook/index.html +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - WebODF - - - - - diff --git a/attic/programs/playbook/scripts.js b/attic/programs/playbook/scripts.js deleted file mode 100644 index b67c1b3fb..000000000 --- a/attic/programs/playbook/scripts.js +++ /dev/null @@ -1,182 +0,0 @@ -/** - * Copyright (C) 2012 KO GmbH - - * @licstart - * The JavaScript code in this page is free software: you can redistribute it - * and/or modify it under the terms of the GNU Affero General Public License - * (GNU AGPL) as published by the Free Software Foundation, either version 3 of - * the License, or (at your option) any later version. The code is distributed - * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU AGPL for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this code. If not, see . - * - * As additional permission under GNU AGPL version 3 section 7, you - * may distribute non-source (e.g., minimized or compacted) forms of - * that code without the copy of the GNU GPL normally required by - * section 4, provided you include this license notice and a URL - * through which recipients can access the Corresponding Source. - * - * As a special exception to the AGPL, any HTML file which merely makes function - * calls to this code, and for that purpose includes it by reference shall be - * deemed a separate work for copyright law purposes. In addition, the copyright - * holders of this code give you permission to combine this code with free - * software libraries that are released under the GNU LGPL. You may copy and - * distribute such a system following the terms of the GNU AGPL for this code - * and the LGPL for the libraries. If you modify this code, you may extend this - * exception to your version of the code, but you are not obligated to do so. - * If you do not wish to do so, delete this exception statement from your - * version. - * - * This license applies to this entire compilation. - * @licend - * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ - */ -/*global blackberry, alert, document, window, app*/ -var LocalFileSystem = { - PERSISTENT: 0, - TEMPORARY: 1 -}; -function FileWriter(fullPath) { - "use strict"; - this.write = function (data) { - var blob; - try { - blob = blackberry.utils.stringToBlob(data, "UTF-8"); - blackberry.io.file.saveFile(fullPath, blob); - } catch (e) { - } - }; -} -function FileEntry(name, fullPath) { - "use strict"; - this.isFile = true; - this.isDirectory = false; - this.name = name; - this.fullPath = fullPath; - this.file = function (onsuccess, onerror) { - function File(fullPath) { - this.name = name; - this.fullPath = fullPath; - this.type = ""; - this.size = -1; - this.lastModifiedDate = -1; - } - var file = new File(fullPath), - properties; - try { - properties = blackberry.io.file.getFileProperties(fullPath); - file.type = properties.mimeType; - file.size = properties.size; - file.lastModifiedDate = properties.dateModified; - onsuccess(file); - } catch (e) { - alert("Error on determining file properties: " + e); - onerror(e); - } - }; - this.createWriter = function (onsuccess, onerror) { - onsuccess(new FileWriter(fullPath)); - }; -} -function FileReader() { - "use strict"; - var fr = this; - this.readAsDataURL = function (file) { - var path = file.fullPath.substr(7); - window.setTimeout(function () { - try { - var data = blackberry.custom.filereader.readAsDataURL(path); - fr.onloadend({target: {result: data}}); - } catch (e) { - alert("Error on reading file: " + e + " " + file.fullPath); - } - }, 1); - }; - this.readAsText = function (file) { - var path = file.fullPath.substr(7); - try { - blackberry.io.file.readFile(path, function (fullPath, blob) { - var str = blackberry.utils.blobToString(blob, "UTF-8"); - fr.onloadend({target: {result: str}}); - }, true); - } catch (e) { - fr.onloadend({target: {result: "[]"}}); - } - }; -} -var DirectoryReader; -function DirectoryEntry(name, fullPath) { - "use strict"; - this.isFile = false; - this.isDirectory = true; - this.name = name; - this.fullPath = fullPath; - this.createReader = function () { - var reader = new DirectoryReader(fullPath); - return reader; - }; -} -function DirectoryReader(fullPath) { - "use strict"; - this.readEntries = function (onsuccess, onerror) { - window.setTimeout(function () { - var entries = [], - dirs = blackberry.io.dir.listDirectories(fullPath), - files = blackberry.io.dir.listFiles(fullPath), - i; - try { - for (i = 0; i < dirs.length; i += 1) { - entries[entries.length] = new DirectoryEntry(dirs[i], - fullPath + "/" + dirs[i]); - } - for (i = 0; i < files.length; i += 1) { - entries[entries.length] = new FileEntry(files[i], - fullPath + "/" + files[i]); - } - onsuccess(entries); - } catch (e) { - onerror(e); - } - }, 1); - }; -} -window.resolveLocalFileSystemURI = function (path, onsuccess, onerror) { - "use strict"; - var p = path.lastIndexOf("/"), - name; - if (p === -1) { - name = path; - path = blackberry.io.dir.appDirs.shared.documents.path + "/" + path; - } else { - name = path.substr(p + 1); - } - onsuccess(new FileEntry(name, path)); -}; -window.requestFileSystem = function (filesystem, id, onsuccess, onerror) { - "use strict"; - var dirs = [], shared, subfolder; - try { - if (filesystem === LocalFileSystem.PERSISTENT) { - shared = blackberry.io.dir.appDirs.shared; - for (subfolder in shared) { - if (shared.hasOwnProperty(subfolder)) { - dirs[dirs.length] = subfolder; - } - } - onsuccess({ - name: "root", - root: new DirectoryEntry("root", shared.documents.path - //+ "/kofficetests/odf/odt" - ) - }); - } else { - onerror("not defined"); - } - } catch (e) { - onerror(e); - } -}; -var device = {}; From 0f8ec7ff521f4328a239b26255dd2e51730daa53 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 233/385] Drawn a text over pages laid one under another, and dropped the boxes that floated. --- webodf/lib/odf/OdfCanvas.js | 36 +-- webodf/lib/odf/TextLayout.js | 479 ++-------------------------- webodf/tests/odf/PageLayoutTests.js | 2 +- webodf/webodf.css | 11 +- 4 files changed, 45 insertions(+), 483 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 0a566e479..7af134bb7 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -3986,32 +3986,20 @@ } }; /** - * Break the text into columns, one column to a page, rather than - * write it as one run of text with the pages floating beside it. A - * column is broken by the browser itself, so a paragraph and a table - * are cut where a page ends, and the pages stand beside one another - * rather than under one another. - * @param {!boolean} enable - * @return {undefined} - */ - this.setPagesInColumns = function (enable) { - textLayout.setColumns(enable); - if (paginated && odfcontainer - && odfcontainer.state === odf.OdfContainer.DONE) { - drawPages(odfcontainer, odfcontainer.rootElement); - } - }; - /** - * Lay the pages one under another, as a reader scrolls a document, - * rather than beside one another, which is how two pages are shown - * side by side. The text is broken into a box for each page either - * way, so a paragraph or a table that crosses the end of a page is - * cut in two. - * @param {!boolean} enable + * The way a text is drawn over pages. + * + * "pages", which is what a reader is given, lays them one under + * another, each page a box of its own that holds what the page + * holds: a paragraph and a table that cross the end of a page are + * cut there, as an office cuts them. "columns" lays them beside one + * another, each page a column, which is how two pages are read side + * by side. "flow" writes the text as one run of text with the pages + * floating beside it, where nothing is ever cut where a page ends. + * @param {!string} mode * @return {undefined} */ - this.setPagesStacked = function (enable) { - textLayout.setStacked(enable); + this.setPageMode = function (mode) { + textLayout.setPageMode(mode); if (paginated && odfcontainer && odfcontainer.state === odf.OdfContainer.DONE) { drawPages(odfcontainer, odfcontainer.rootElement); diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 757ca0372..cf56c6d1a 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -76,31 +76,16 @@ odf.TextLayout = function TextLayout() { */ pageSeparation = 10, /** - * How wide the box that holds the height of a page is drawn. It is - * as narrow as a browser lets a box be and still count it: a box of - * no width at all is held to occupy nothing, and every page would be - * drawn at the top of the one before it. The width stands well above - * the grain of the engines, a sixtieth of a pixel in gecko and a - * sixty-fourth in blink and in webkit, and above it still once a - * reader has drawn the document small: a quarter of a pixel is - * counted down to a zoom of a fifteenth, where a twentieth of a - * pixel is already lost at a quarter. - * @const + * The way a text is drawn over pages: "pages" lays them one under + * another, each page a box of its own that holds what the page + * holds; "columns" lays them beside one another, each page a column, + * which is how two pages are read side by side; "flow" writes the + * text as one run of text with the pages floating beside it, where + * nothing is ever cut where a page ends. * @type{!string} */ - pageColumnWidth = "0.25px", - /** - * Whether the text is broken into columns, one column to a page, or - * written as one run of text with the pages floating beside it. - * @type{!boolean} - */ - columnsMode = false, - /** - * Whether the pages are laid one under another, each page a box of - * its own, or beside one another, each page a column. - * @type{!boolean} - */ - stackedMode = false, + pageMode = "pages", + /** * The plan of the pages of the last layout: the pages are set right * against it when what is drawn after them makes one of them hold @@ -577,156 +562,10 @@ odf.TextLayout = function TextLayout() { * @return {!number} */ function countPages(pagesDiv) { - return columnsMode + return pageMode !== "flow" ? columnPages : Math.ceil((pagesDiv.childElementCount - 1) / 2); } - /** - * @param {!PagePlan} plan - * @param {!HTMLDivElement} pagesDiv - * @return {!number} - */ - function getPagesHeight(plan, pagesDiv) { - var npages = countPages(pagesDiv); - return npages === 0 - ? 0 - : plan.top(npages) - plan.at(npages - 1).pageSeparation; - } - /** - * @param {!HTMLDivElement} pagesDiv - * @param {!number} count - * @return {undefined} - */ - function removePages(pagesDiv, count) { - var last = pagesDiv.lastElementChild; - while (count > 0) { - pagesDiv.removeChild(last); - last = pagesDiv.lastElementChild; - if (last) { - pagesDiv.removeChild(last); - last = pagesDiv.lastElementChild; - } - count -= 1; - } - last.style.marginBottom = 0; - last.style.height = 0; - } - /** - * @param {!PagePlan} plan - * @param {!HTMLDivElement} pagesDiv - * @param {!number} count - * @return {undefined} - */ - function addPages(plan, pagesDiv, count) { - var doc = pagesDiv.ownerDocument, - frag = doc.createDocumentFragment(), - htmlns = doc.documentElement.namespaceURI, - n = countPages(pagesDiv), - lastSeparator = pagesDiv.lastElementChild, - /**@type{!odf.TextLayout.PageDimensions}*/ - dims, - /**@type{!number}*/ - contentHeight, - div; - count += n; - while (n < count) { - dims = plan.at(n); - contentHeight = dims.pageHeight - dims.marginTop - - dims.marginBottom; - // make separator - div = doc.createElementNS(htmlns, "div"); - div.style.width = "100%"; - div.style.cssFloat = "right"; - div.style.position = "relative"; - div.style.zIndex = 10; - div.style.marginBottom = dims.marginTop + "px"; - if (n > 0) { - div.style.height = dims.pageSeparation + "px"; - div.style.marginTop = dims.marginBottom + "px"; - div.className = "webodf-pageSeparator"; - } - frag.appendChild(div); - div = doc.createElementNS(htmlns, "div"); - div.style.height = contentHeight + "px"; - div.style.width = pageColumnWidth; - div.style.cssFloat = "right"; - frag.appendChild(div); - n += 1; - } - div = doc.createElementNS(htmlns, "div"); - div.style.width = "100%"; - div.style.cssFloat = "right"; - div.style.position = "relative"; - div.style.zIndex = 10; - div.style.marginTop = plan.at(Math.max(0, count - 1)).marginBottom - + "px"; - frag.appendChild(div); - if (lastSeparator) { - pagesDiv.replaceChild(frag, lastSeparator); - } else { - pagesDiv.appendChild(frag); - } - } - /** - * @param {!PagePlan} plan - * @param {!HTMLDivElement} pagesDiv - * @param {!number} bodyHeight - * @return {!boolean} - */ - function adjustPages(plan, pagesDiv, bodyHeight) { - var pages = countPages(pagesDiv), - dims = plan.at(Math.max(0, pages - 1)), - missingHeight = bodyHeight - getPagesHeight(plan, pagesDiv), - missingPages = Math.ceil(missingHeight / dims.pageHeight), - pageCountChanged = false; - if (!isFinite(missingPages)) { - return false; - } - missingPages = Math.min(missingPages, - maxPages - countPages(pagesDiv)); - if (missingPages > 0) { - // too few pages - pageCountChanged = true; - addPages(plan, pagesDiv, missingPages); - } else if (missingPages < 0) { - // too many pages - pageCountChanged = true; - removePages(pagesDiv, -missingPages); - } - return pageCountChanged; - } - /** - * @param {!number} maxTime - * @return {!number} - */ - function endTime(maxTime) { - return new Date().getTime() + maxTime; - } - /** - * @param {!number} end - * @return {!boolean} - */ - function checkTime(end) { - var now = new Date().getTime(); - return now < end; - } - /** - * @param {!odf.ODFDocumentElement} odfroot - * @param {!PagePlan} plan - * @param {!HTMLDivElement} pagesDiv - * @param {!number} maxTime (milliseconds) - * @return {!boolean} - */ - function updateNumberOfPages(odfroot, plan, pagesDiv, maxTime) { - var text = odfroot.body.lastElementChild, - end = endTime(maxTime), - textHeight = text.clientHeight, - timeLeft = true; - while (timeLeft && adjustPages(plan, pagesDiv, textHeight)) { - timeLeft = checkTime(end); - } - return timeLeft; - } /** * What the metadata of the document says of itself, for the fields a * header or a footer may carry. A field that the metadata does not answer @@ -1596,10 +1435,10 @@ odf.TextLayout = function TextLayout() { // A page stands under the one before it when the text is one run // of text, and beside it when the text is broken into columns, // one column to a page. - left = columnsMode && !stackedMode + left = pageMode === "columns" ? columnPageOrigins[n] || 0 : 0; - top = columnsMode && !stackedMode + top = pageMode === "columns" ? 0 : plan.top(n); header = pageArea(plan, "header", n + 1); @@ -1729,225 +1568,6 @@ odf.TextLayout = function TextLayout() { breakCache[key] = false; return false; } - /** - * Take away the room left before the paragraphs that are written on a new - * page, so that a text is measured as it was written. - * @param {!Element} root - * @return {undefined} - */ - function removeGaps(root) { - var /**@type{?Element}*/ - node = root.firstElementChild, - /**@type{?Element}*/ - next; - // The room is left among the paragraphs themselves, so the children - // of the text answer for all of it: nothing deeper is read, which a - // text of a thousand pages would make dear. - while (node) { - next = node.nextElementSibling; - if (node.className === "webodf-pageBreak") { - root.removeChild(node); - } - node = next; - } - } - /** - * Write on a new page what the document asks to be written on one. - * - * A text is one run of text here, and a page is a box that floats beside - * it: a break is made by leaving as much room before the paragraph as - * what is left of the page it stands on. The room is a box of the reader - * and not of the document, so nothing of the document is moved, and it - * is taken away before it is measured again. - * @param {!odf.ODFDocumentElement} odfroot - * @param {!PagePlan} plan - * @param {!HTMLDivElement} pagesDiv - * @return {!boolean} whether room was left anywhere - */ - function forcePageBreaks(odfroot, plan, pagesDiv) { - var /**@type{!Element}*/ - text = /**@type{!Element}*/(odfroot.body.lastElementChild), - doc = pagesDiv.ownerDocument, - htmlns = pagesDiv.namespaceURI, - /**@type{!number}*/ - origin, - /**@type{!Array.}*/ - nodes = [], - /**@type{!Array.}*/ - wanted = [], - /**@type{!Array.}*/ - tops = [], - /**@type{!Array.}*/ - rooms = [], - /**@type{!Array.}*/ - starts = [], - /**@type{!number}*/ - shift = 0, - /**@type{!number}*/ - page = 0, - /**@type{!number}*/ - top, - /**@type{!number}*/ - room, - /**@type{!number}*/ - i, - /**@type{?Element}*/ - node; - removeGaps(text); - node = text.firstElementChild; - while (node) { - nodes.push(node); - node = node.nextElementSibling; - } - nodes.forEach(function (element, index) { - if (asksForABreak(odfroot, element, "break-before") - || (index > 0 && asksForABreak(odfroot, nodes[index - 1], - "break-after"))) { - wanted.push(element); - } - }); - if (wanted.length === 0) { - return false; - } - // Everything is read before anything is written: a browser lays the - // whole text out again at each read that follows a write, and a text - // of a thousand pages would be laid out a thousand times over. - origin = pagesDiv.getBoundingClientRect().top; - wanted.forEach(function (element) { - tops.push(element.getBoundingClientRect().top - origin); - }); - // Where each page begins, from the first to one beyond the last that - // may be asked for: the room left before a paragraph is read from it - // rather than from the pages that are drawn, which are not drawn yet. - top = 0; - for (i = 0; i < maxPages; i += 1) { - starts.push(top); - top += plan.at(i).pageHeight + plan.at(i).pageSeparation; - } - tops.forEach(function (start, index) { - top = start + shift; - while (page + 1 < starts.length && starts[page + 1] <= top) { - page += 1; - } - room = starts[page] + plan.at(page).marginTop; - if (top <= room + 1 || page + 1 >= starts.length) { - rooms.push(0); - return; - } - // The paragraph stands in the middle of a page, so it is given - // what is left of it: the room of a page and the room of the - // margin of the next one. - room = starts[page + 1] + plan.at(page + 1).marginTop - top; - rooms.push(room > 0 - ? room - : 0); - shift += rooms[index]; - }); - // A break is given its room, and one that needs none is given a box - // of no height all the same: the room is set anew once the text has - // been laid out again, and a paragraph that stands at the top of a - // page now may not stand there then. - wanted.forEach(function (element, index) { - var /**@type{!Element}*/ - gap = doc.createElementNS(htmlns, "div"); - gap.className = "webodf-pageBreak"; - /**@type{!HTMLElement}*/(gap).style.height = (rooms[index] > 0 - ? rooms[index] - : 0) + "px"; - element.parentNode.insertBefore(gap, element); - }); - return true; - } - /** - * Set the room left before a break to what the page really asks for. - * - * The room is worked out from where the paragraphs stood before any of - * it was left, and a text does not fall again exactly where it was - * reckoned it would: a line breaks elsewhere once the page it stands on - * has changed, and the boxes of the pages push what crosses them. The - * paragraphs are read once more, and each room is set to what is - * missing, or taken back to what was too much. - * @param {!odf.ODFDocumentElement} odfroot - * @param {!PagePlan} plan - * @param {!HTMLDivElement} pagesDiv - * @return {!boolean} whether any room was set anew - */ - function tunePageBreaks(odfroot, plan, pagesDiv) { - var /**@type{!Element}*/ - text = /**@type{!Element}*/(odfroot.body.lastElementChild), - /**@type{!Array.}*/ - gaps = [], - /**@type{!Array.}*/ - tops = [], - /**@type{!Array.}*/ - starts = [], - /**@type{!number}*/ - origin, - /**@type{!number}*/ - shift = 0, - /**@type{!number}*/ - page = 0, - /**@type{!number}*/ - changed = 0, - /**@type{!number}*/ - top, - /**@type{!number}*/ - i, - /**@type{?Element}*/ - node; - node = text.firstElementChild; - while (node) { - if (node.className === "webodf-pageBreak") { - gaps.push(/**@type{!HTMLElement}*/(node)); - } - node = node.nextElementSibling; - } - if (gaps.length === 0) { - return false; - } - origin = pagesDiv.getBoundingClientRect().top; - gaps.forEach(function (gap) { - var next = gap.nextElementSibling; - tops.push(next - ? next.getBoundingClientRect().top - origin - : 0); - }); - top = 0; - for (i = 0; i < maxPages; i += 1) { - starts.push(top); - top += plan.at(i).pageHeight + plan.at(i).pageSeparation; - } - gaps.forEach(function (gap, index) { - var /**@type{!number}*/ - room = parseFloat(gap.style.height) || 0, - /**@type{!number}*/ - bare, - /**@type{!number}*/ - wanted, - /**@type{!number}*/ - move; - top = tops[index] + shift; - // Where the paragraph would stand were no room left before it: - // the page it is sent to is read from that, and not from where - // it stands now, or a paragraph already sent to the top of a - // page would be sent to the top of the next one at every round. - bare = top - room; - while (page + 1 < starts.length && starts[page + 1] <= bare) { - page += 1; - } - wanted = starts[page] + plan.at(page).marginTop; - if (bare > wanted + 1 && page + 1 < starts.length) { - wanted = starts[page + 1] + plan.at(page + 1).marginTop; - } - move = wanted - top; - if (Math.abs(move) > 1 && room + move >= 0) { - gap.style.height = (room + move) + "px"; - shift += move; - changed += 1; - } - }); - return changed > 0; - } /** * The sheet of styles the layout writes its own rules in. * @@ -3136,67 +2756,28 @@ odf.TextLayout = function TextLayout() { * @return {!boolean} */ function layout(odfroot, pagesDiv, maxTime) { - var plan = new PagePlan(odfroot), - round = 0; - if (columnsMode) { - if (stackedMode) { - layoutInPages(odfroot, pagesDiv); - } else { - layoutInColumns(odfroot, pagesDiv); - } - return true; - } - // The pages are drawn, then it is read from them which page each - // change of master page falls on, and they are drawn again: a page of - // another size moves the ones that follow it. Two rounds answer for - // a text of one master page, and the third is there for the rest. - do { - updateNumberOfPages(odfroot, plan, pagesDiv, maxTime); - updateNumberOfPages(odfroot, plan, pagesDiv, maxTime); - round += 1; - } while (plan.follow(countPages(pagesDiv)) && round < 3); - // The paragraphs that ask for a page of their own are given one, and - // the pages are counted again, as the text is longer for it. A break - // made on one page may push the next one onto another page, so it is - // done again, twice, which answers for a text of breaks that follow - // one another. - if (forcePageBreaks(odfroot, plan, pagesDiv)) { - updateNumberOfPages(odfroot, plan, pagesDiv, maxTime); - // The room left before each break was worked out from where the - // text stood before any of it was left: it is read again and set - // to what the page really asks for. A break that is set anew - // moves the ones that follow it, so it is done until nothing - // moves, four rounds at the most. - round = 0; - while (round < 4 && tunePageBreaks(odfroot, plan, pagesDiv)) { - updateNumberOfPages(odfroot, plan, pagesDiv, maxTime); - round += 1; - } + if (pageMode === "columns") { + layoutInColumns(odfroot, pagesDiv); + } else { + layoutInPages(odfroot, pagesDiv); } - drawPageFurniture(odfroot, plan, pagesDiv, readMeta(odfroot)); return maxTime > 0; } this.layout = layout; /** - * Break the text into columns, one column to a page, rather than write - * it as one run of text with the pages floating beside it. A column is - * broken by the browser itself, so a paragraph and a table are cut where - * a page ends, which the boxes that float beside a text cannot do. - * @param {!boolean} enable - * @return {undefined} - */ - this.setColumns = function (enable) { - columnsMode = enable; - }; - /** - * Lay the pages one under another rather than beside one another: the - * text is broken into a box for each page, and a paragraph or a table - * that crosses the end of a page is cut in two. - * @param {!boolean} enable + * The way a text is drawn over pages. + * + * "pages" lays them one under another, each page a box of its own that + * holds what the page holds: a paragraph and a table that cross the end + * of a page are cut there, as an office cuts them. "columns" lays them + * beside one another, each page a column, which is how two pages are + * read side by side. "flow" writes the text as one run of text with the + * pages floating beside it, where nothing is ever cut where a page ends. + * @param {!string} mode * @return {undefined} */ - this.setStacked = function (enable) { - stackedMode = enable; + this.setPageMode = function (mode) { + pageMode = mode; }; /** * Whether every page holds what was written on it. @@ -3221,11 +2802,11 @@ odf.TextLayout = function TextLayout() { * @return {undefined} */ this.repair = function (odfroot, pagesDiv) { - if (!stackedMode || !lastPlan) { + if (pageMode !== "pages" || !lastPlan) { return; } trimPages(odfroot, lastPlan); - drawPageFurniture(odfroot, lastPlan, pagesDiv, readMeta(odfroot)); + drawPageFurniture(odfroot, lastPlan, pagesDiv, readMeta(odfroot), 0); }; /** * Leave a lane beside each page for the notes of the annotations, of the @@ -3245,7 +2826,7 @@ odf.TextLayout = function TextLayout() { */ this.pageAt = function (x) { var found = null; - if (!columnsMode) { + if (pageMode !== "columns") { return null; } columnPageOrigins.forEach(function (left) { @@ -3263,7 +2844,7 @@ odf.TextLayout = function TextLayout() { * @return {?{width:!number,height:!number}} */ this.pageSize = function () { - return columnsMode && columnPageSize.width > 0 + return pageMode !== "flow" && columnPageSize.width > 0 ? columnPageSize : null; }; diff --git a/webodf/tests/odf/PageLayoutTests.js b/webodf/tests/odf/PageLayoutTests.js index 9581ea1cf..9f4398b0f 100644 --- a/webodf/tests/odf/PageLayoutTests.js +++ b/webodf/tests/odf/PageLayoutTests.js @@ -90,7 +90,7 @@ odf.PageLayoutTests = function PageLayoutTests(runner) { callback(); }); t.odfCanvas.setPaginated(true); - t.odfCanvas.setPagesInColumns(true); + t.odfCanvas.setPageMode("columns"); t.odfCanvas.setOdfContainer(container); }); } diff --git a/webodf/webodf.css b/webodf/webodf.css index 7321cda4f..645058dbd 100644 --- a/webodf/webodf.css +++ b/webodf/webodf.css @@ -807,15 +807,8 @@ div.webodf-customScrollbars::-webkit-scrollbar-thumb font-weight: bold; } -/* The gap between two pages of a text, that shows the ground of the reader as - the gap between two slides does: each page is painted on its own, so nothing - is drawn here, see "TextLayout.js". */ -.webodf-pageSeparator { - background: none; -} - -/* The header and the footer of a page, laid over the room the boxes of the - pages left between the text and the edge of the sheet, see "TextLayout.js". +/* The header and the footer of a page, laid in the margins of the sheet the + page is drawn on, see "TextLayout.js". The nodes are of the document, so the styles of the document draw them. */ .webodf-pageFurniture { position: absolute; From 5670acfe0135722c404bbe2bbefbda87fdaf9b97 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 234/385] Held a table to the width the document gives it. --- webodf/lib/odf/Style2CSS.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index 91a9be50e..0e6240efd 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -1028,6 +1028,14 @@ odf.Style2CSS = function Style2CSS() { function getTableProperties(props) { var rule = '', borderModel; rule += applySimpleMapping(props, tablePropertySimpleMapping); + // A table of a width the document wrote keeps that width: the + // browser lays a table out from what is written in it unless it is + // told otherwise, and a long address in a cell made the table wider + // than the page, with a bar to scroll under it. + if (props.hasAttributeNS(stylens, 'width') + || props.hasAttributeNS(stylens, 'rel-width')) { + rule += 'table-layout:fixed;'; + } borderModel = props.getAttributeNS(tablens, 'border-model'); if (borderModel === 'collapsing') { From b7feb343499d28ba51d64e1d9c9a25280c41f74c Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 235/385] Clarified management of watermark and stamp. --- webodf/lib/odf/TextLayout.js | 220 +++++++++++++++++++++++++++++------ 1 file changed, 185 insertions(+), 35 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 2a5990af0..13f618995 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -146,20 +146,102 @@ odf.TextLayout = function TextLayout() { } return area; } + /** + * The graphic style of a shape, followed up its parents: a shape names a + * style of the family "graphic", that may name another one in turn. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!Element} shape + * @return {?Element} + */ + function graphicStyleOf(odfroot, shape) { + var /**@type{!string}*/ + name = shape.getAttributeNS(drawns, "style-name") || "", + /**@type{!Array.}*/ + roots = [odfroot.automaticStyles, odfroot.styles], + /**@type{?Element}*/ + style, + /**@type{!Element}*/ + candidate, + /**@type{!NodeList}*/ + styles, + /**@type{!number}*/ + depth = 0, + /**@type{!number}*/ + marker, + /**@type{!number}*/ + i, + /**@type{!number}*/ + r; + while (name !== "" && depth < 10) { + style = null; + for (r = 0; r < roots.length && style === null; r += 1) { + styles = roots[r].getElementsByTagNameNS(stylens, "style"); + for (i = 0; i < styles.length && style === null; i += 1) { + candidate = /**@type{!Element}*/(styles.item(i)); + if (candidate.getAttributeNS(stylens, "name") === name + && candidate.getAttributeNS(stylens, "family") + === "graphic") { + style = candidate; + } + } + } + if (style === null) { + // The container prefixes the automatic styles of "styles.xml" + // and every reference to them, so that they do not shadow the + // ones of "content.xml", see "prefixStyleNames": a reference + // that names no style of its own is read again without it. + marker = name.indexOf("_webodf_"); + if (marker === -1) { + return null; + } + name = name.substring(marker + "_webodf_".length); + depth += 1; + } else { + if (domUtils.getDirectChild(style, stylens, + "graphic-properties")) { + return style; + } + name = style.getAttributeNS(stylens, "parent-style-name") || ""; + depth += 1; + } + } + return null; + } + /** + * Whether a shape is drawn behind the text or over it. A watermark is + * written behind, "style:run-through" being "background", and a stamp over + * it, which is the default the standard gives. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!Element} shape + * @return {!boolean} + */ + function isBehindTheText(odfroot, shape) { + var style = graphicStyleOf(odfroot, shape), + props = style && domUtils.getDirectChild(style, stylens, + "graphic-properties"); + return Boolean(props + && props.getAttributeNS(stylens, "run-through") === "background"); + } /** * The shapes a master page draws on every page: a watermark, a banner * along an edge, a note in a margin. The standard allows them beside the * header and the footer, and it is where they are written, as the margins * of a page carry no area of their own. + * @param {!odf.ODFDocumentElement} odfroot * @param {?Element} masterPage - * @return {!Array.} + * @return {!Array.} */ - function shapesOf(masterPage) { + function shapesOf(odfroot, masterPage) { var shapes = [], node = masterPage && masterPage.firstElementChild; while (node) { if (node.namespaceURI === drawns) { - shapes.push(node); + shapes.push({ + node: node, + background: isBehindTheText(odfroot, node), + order: parseInt(node.getAttributeNS(drawns, "z-index"), 10) + || 0 + }); } node = node.nextElementSibling; } @@ -169,18 +251,19 @@ odf.TextLayout = function TextLayout() { * Draw the shapes of a master page on one page, where the shape itself * says where it goes: what a master page draws is placed against the * sheet, so the box is the sheet and the offsets are the ones written. - * @param {!Array.} shapes + * @param {!Array.} shapes * @param {!HTMLDivElement} box * @return {undefined} */ function fillPageShapes(shapes, box) { var doc = box.ownerDocument; shapes.forEach(function (shape) { - var copy = doc.importNode(shape, true), - x = shape.getAttributeNS(svgns, "x"), - y = shape.getAttributeNS(svgns, "y"), - width = shape.getAttributeNS(svgns, "width"), - height = shape.getAttributeNS(svgns, "height"), + var node = shape.node, + copy = doc.importNode(node, true), + x = node.getAttributeNS(svgns, "x"), + y = node.getAttributeNS(svgns, "y"), + width = node.getAttributeNS(svgns, "width"), + height = node.getAttributeNS(svgns, "height"), /**@type{!HTMLDivElement}*/ place = /**@type{!HTMLDivElement}*/(doc.createElementNS( box.namespaceURI, "div")); @@ -191,6 +274,13 @@ odf.TextLayout = function TextLayout() { place.style.position = "absolute"; place.style.left = x || "0"; place.style.top = y || "0"; + // A watermark is drawn behind the text and a stamp over it, and + // "draw:z-index" tells one shape of a layer from the next. The box + // of the page holds no stacking context of its own, so these are + // read against the text. + place.style.zIndex = String(shape.background + ? -1 - shape.order + : 10 + shape.order); if (width) { place.style.width = width; } @@ -203,10 +293,11 @@ odf.TextLayout = function TextLayout() { } /** * What a master page writes at the top and at the bottom of a page. + * @param {!odf.ODFDocumentElement} odfroot * @param {?Element} masterPage * @return {!odf.TextLayout.PageFurniture} */ - function readFurniture(masterPage) { + function readFurniture(odfroot, masterPage) { /** * @param {!string} name * @return {?Element} @@ -217,7 +308,7 @@ odf.TextLayout = function TextLayout() { : null; } return { - shapes: shapesOf(masterPage), + shapes: shapesOf(odfroot, masterPage), header: child("header"), footer: child("footer"), headerLeft: child("header-left"), @@ -320,9 +411,9 @@ odf.TextLayout = function TextLayout() { pageSeparation: pageSeparation, header: readPageArea(pageLayout, "header-style", "margin-bottom"), footer: readPageArea(pageLayout, "footer-style", "margin-top"), - firstPage: readFurniture(masterPage), - otherPages: readFurniture(nextMasterPage(odfroot, masterPage) - || masterPage) + firstPage: readFurniture(odfroot, masterPage), + otherPages: readFurniture(odfroot, + nextMasterPage(odfroot, masterPage) || masterPage) }; // One margin for the four sides, or one by side. if (properties.getAttributeNS(fons, "margin")) { @@ -585,20 +676,77 @@ odf.TextLayout = function TextLayout() { } return right; } + /** + * A box that holds the shapes of one page, of the size of the sheet. + * @param {!Document} doc + * @param {?string} htmlns + * @param {!odf.TextLayout.PageDimensions} dims + * @param {!number} top where the page begins + * @return {!HTMLDivElement} + */ + function pageShapesBox(doc, htmlns, dims, top) { + var box = /**@type{!HTMLDivElement}*/(doc.createElementNS(htmlns, + "div")); + box.className = "webodf-pageShapes"; + box.style.position = "absolute"; + box.style.left = 0; + box.style.right = 0; + box.style.top = top + "px"; + box.style.height = dims.pageHeight + "px"; + return box; + } + /** + * @param {!odf.TextLayout.PageShape} shape + * @return {!boolean} + */ + function behindTheText(shape) { + return shape.background; + } + /** + * @param {!odf.TextLayout.PageShape} shape + * @return {!boolean} + */ + function overTheText(shape) { + return !shape.background; + } + /** + * Take away the boxes of a former layout, wherever they were put. + * @param {!Element} root + * @return {undefined} + */ + function removeBoxes(root) { + var boxes = root.getElementsByTagName("div"), + /**@type{!Element}*/ + box, + /**@type{!number}*/ + i; + for (i = boxes.length - 1; i >= 0; i -= 1) { + box = /**@type{!Element}*/(boxes.item(i)); + if (box.className === "webodf-pageShapes" + || box.className === "webodf-pageFurniture") { + box.parentNode.removeChild(box); + } + } + } /** * Draw the header and the footer of every page. * * They are drawn beside the text rather than in it: the boxes of the pages * hold the text away from the margins, and these are laid over the room * that was left, one for each page. Nothing of the text is touched. + * @param {!odf.ODFDocumentElement} odfroot * @param {!odf.TextLayout.PageDimensions} dims * @param {!HTMLDivElement} pagesDiv * @param {!Object.} meta what the document says of itself * @return {undefined} */ - function drawPageFurniture(dims, pagesDiv, meta) { - var doc = pagesDiv.ownerDocument, + function drawPageFurniture(odfroot, dims, pagesDiv, meta) { + var /**@type{!Document}*/ + doc = /**@type{!Document}*/(pagesDiv.ownerDocument), + /**@type{?string}*/ htmlns = pagesDiv.namespaceURI, + /**@type{!Element}*/ + behind = odfroot.body, pages = countPages(pagesDiv), /**@type{!HTMLDivElement}*/ box, @@ -606,17 +754,12 @@ odf.TextLayout = function TextLayout() { header, /**@type{?Element}*/ footer, - /**@type{!Array.}*/ + /**@type{!Array.}*/ shapes, top, n; - while (pagesDiv.lastChild - && (/**@type{!Element}*/(pagesDiv.lastChild).className - === "webodf-pageFurniture" - || /**@type{!Element}*/(pagesDiv.lastChild).className - === "webodf-pageShapes")) { - pagesDiv.removeChild(pagesDiv.lastChild); - } + removeBoxes(pagesDiv); + removeBoxes(behind); if (!hasFurniture(dims.firstPage) && !hasFurniture(dims.otherPages)) { return; } @@ -626,16 +769,16 @@ odf.TextLayout = function TextLayout() { footer = pageArea(dims, "footer", n + 1); shapes = (n === 0 ? dims.firstPage : dims.otherPages).shapes; if (shapes.length > 0) { - box = /**@type{!HTMLDivElement}*/(doc.createElementNS(htmlns, - "div")); - box.className = "webodf-pageShapes"; - box.style.position = "absolute"; - box.style.left = 0; - box.style.right = 0; - box.style.top = top + "px"; - box.style.height = dims.pageHeight + "px"; - fillPageShapes(shapes, box); + // What is drawn over the text hangs beside it, as the header + // and the footer do. What is drawn behind it is put in the + // body of the document instead: the body carries the fill of + // the page, that would otherwise cover the shape. + box = pageShapesBox(doc, htmlns, dims, top); + fillPageShapes(shapes.filter(overTheText), box); pagesDiv.appendChild(box); + box = pageShapesBox(doc, htmlns, dims, top); + fillPageShapes(shapes.filter(behindTheText), box); + behind.insertBefore(box, behind.firstChild); } if (header) { box = /**@type{!HTMLDivElement}*/(doc.createElementNS(htmlns, @@ -684,13 +827,20 @@ odf.TextLayout = function TextLayout() { } updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); - drawPageFurniture(dims, pagesDiv, readMeta(odfroot)); + drawPageFurniture(odfroot, dims, pagesDiv, readMeta(odfroot)); return maxTime > 0; } this.layout = layout; }; /**@typedef{{ - shapes:!Array., + node:!Element, + background:!boolean, + order:!number +}}*/ +odf.TextLayout.PageShape; + +/**@typedef{{ + shapes:!Array., header:?Element, footer:?Element, headerLeft:?Element, From 337b113dde9dafc68bf7186d00b894f1e5078c8a Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 236/385] Updated .gitignore. --- .gitignore | 58 ++++++++++++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 35 deletions(-) diff --git a/.gitignore b/.gitignore index e0a8ce28f..9d4617af5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,41 +1,20 @@ -/webodf/tests/simple_slide.odp -#android/bin -#android/gen -programs/ios/WebODF.xcodeproj/project.xcworkspace -programs/ios/WebODF.xcodeproj/xcuserdata -programs/ios/www/ZoomIn.png -programs/ios/www/ZoomOut.png -programs/ios/www/app/ -programs/ios/www/sencha-touch.css -programs/ios/www/sencha-touch.js -programs/ios/www/webodf.js +# What an editor or a system leaves beside the sources. .DS_Store -webodf/webodf.css.js -build -*.sw? .idea -node_modules/.bin/ -node_modules/requirejs/ -webodf/coverage/ -node_modules/karma-chrome-launcher/ -node_modules/karma-coffee-preprocessor/ -node_modules/karma-coverage/ -node_modules/karma-firefox-launcher/ -node_modules/karma-html2js-preprocessor/ -node_modules/karma-jasmine/ -node_modules/karma-junit-reporter/ -node_modules/karma-phantomjs-launcher/ -node_modules/karma-requirejs/ -node_modules/karma-script-launcher/ -node_modules/karma/ -fontFaceDeclsTest.odt -test.odt -simple.odt -simpleFrame.odt -webodf/tests/*.odt -webodf/tests/odf/newloadsave.odt +*.sw? + +# What cmake leaves where it is run: a configuration made in the sources rather +# than in a directory of its own writes these two, and a stale cache in the +# sources makes every later build refuse to configure. +/CMakeCache.txt +/CMakeFiles/ +/cmake.log -# Build outputs and downloaded tools of the node build. +# The build with cmake, that is made in a directory of its own. +build + +# The build with node: its outputs, the tools it downloads and the report of +# the coverage. dist .tools coverage @@ -46,6 +25,15 @@ node_modules/* !node_modules/.package-lock.json !node_modules/@xmldom +# The css of the viewer, written as a string of javascript by the build. +webodf/webodf.css.js + +# The documents the tests write beside the ones they read. +webodf/tests/test.odt +webodf/tests/fontFaceDeclsTest.odt +webodf/tests/simple_slide.odp +webodf/tests/odf/newloadsave.odt + # The library is copied into the assets of the viewer of android. programs/opendocumentviewer-android/src/main/assets/webodf.js # The pages of the format are written by cmake from the text of "programs/text", From 5227d1ca5f171d323d309b99c08a6134988a6a17 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 237/385] Read a document as a book, two pages to a row. --- webodf/lib/odf/OdfCanvas.js | 35 +++++++++---- webodf/lib/odf/TextLayout.js | 95 ++++++++++++++++++++++++++++++------ 2 files changed, 107 insertions(+), 23 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 7af134bb7..a510973f2 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -3986,15 +3986,32 @@ } }; /** - * The way a text is drawn over pages. - * - * "pages", which is what a reader is given, lays them one under - * another, each page a box of its own that holds what the page - * holds: a paragraph and a table that cross the end of a page are - * cut there, as an office cuts them. "columns" lays them beside one - * another, each page a column, which is how two pages are read side - * by side. "flow" writes the text as one run of text with the pages - * floating beside it, where nothing is ever cut where a page ends. + * Whether the first page stands on its own, on the right of the + * first row, as the first page of a book does. + * @param {!boolean} alone + * @return {undefined} + */ + this.setFirstPageOnItsOwn = function (alone) { + textLayout.setFirstPageOnItsOwn(alone); + if (paginated && odfcontainer + && odfcontainer.state === odf.OdfContainer.DONE) { + drawPages(odfcontainer, odfcontainer.rootElement); + } + }; + /** + * How many pages stand side by side on a row, see "TextLayout.js". + * @param {!number} pages + * @return {undefined} + */ + this.setPagesPerRow = function (pages) { + textLayout.setPagesPerRow(pages); + if (paginated && odfcontainer + && odfcontainer.state === odf.OdfContainer.DONE) { + drawPages(odfcontainer, odfcontainer.rootElement); + } + }; + /** + * The way a text is drawn over pages, see "TextLayout.js". * @param {!string} mode * @return {undefined} */ diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index cf56c6d1a..d2292f0b2 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -85,6 +85,18 @@ odf.TextLayout = function TextLayout() { * @type{!string} */ pageMode = "pages", + /** + * How many pages stand side by side on a row: one for a reader who + * scrolls a document, two for one who reads it as a book. + * @type{!number} + */ + pagesPerRow = 1, + /** + * Whether the first page stands on its own, on the right of the + * first row, as the first page of a book does. + * @type{!boolean} + */ + firstPageOnItsOwn = false, /** * The plan of the pages of the last layout: the pages are set right @@ -1324,6 +1336,39 @@ odf.TextLayout = function TextLayout() { return moved; }; } + /** + * Where a page stands, from the corner of the drawn document. + * + * The pages are laid one under another, as a reader scrolls them, and + * two or more of them stand side by side on a row when a reader asks + * for that, as a book is read: the page of a row and the row it stands + * on are read from the number of the page. The pages of a text broken + * into columns stand where their column stands. + * @param {!PagePlan} plan + * @param {!number} page from zero + * @return {!{left:!number,top:!number}} + */ + function pagePlace(plan, page) { + var dims = plan.at(page), + // The first page of a book stands on the right, with the place + // of a page on its left left empty, as the first page of a book + // is a right hand page: a reader who asks for that is given it. + /**@type{!number}*/ + slot = page + (firstPageOnItsOwn && pagesPerRow > 1 + ? 1 + : 0), + /**@type{!number}*/ + row = Math.floor(slot / pagesPerRow), + /**@type{!number}*/ + column = slot % pagesPerRow; + if (pageMode === "columns") { + return {left: columnPageOrigins[page] || 0, top: 0}; + } + return { + left: column * (dims.pageWidth + dims.pageSeparation), + top: row * (dims.pageHeight + dims.pageSeparation) + }; + } /** * A box that holds the shapes of one page, of the size of the sheet. * @param {!Document} doc @@ -1418,6 +1463,8 @@ odf.TextLayout = function TextLayout() { top = 0, /**@type{!number}*/ first = 0, + /**@type{!{left:!number,top:!number}}*/ + place, /**@type{!number}*/ n; first = from || 0; @@ -1432,15 +1479,9 @@ odf.TextLayout = function TextLayout() { behind.setAttributeNS(webodfhelperns, "paginated", "true"); for (n = first; n < pages; n += 1) { dims = plan.at(n); - // A page stands under the one before it when the text is one run - // of text, and beside it when the text is broken into columns, - // one column to a page. - left = pageMode === "columns" - ? columnPageOrigins[n] || 0 - : 0; - top = pageMode === "columns" - ? 0 - : plan.top(n); + place = pagePlace(plan, n); + left = place.left; + top = place.top; header = pageArea(plan, "header", n + 1); footer = pageArea(plan, "footer", n + 1); // The sheet of the page, that carries its fill: it is drawn @@ -2263,6 +2304,8 @@ odf.TextLayout = function TextLayout() { held, /**@type{!number}*/ guard, + /**@type{!{left:!number,top:!number}}*/ + place, /**@type{!number}*/ n; box.className = "webodf-pageBox"; @@ -2276,10 +2319,12 @@ odf.TextLayout = function TextLayout() { // are used, and the pages would stand closer than the sheets they // are drawn on. /**@type{!HTMLElement}*/(box).style.position = "absolute"; - /**@type{!HTMLElement}*/(box).style.left = dims.marginLeft + "px"; - /**@type{!HTMLElement}*/(box).style.top = (state.top + dims.marginTop) - + "px"; - state.top += dims.pageHeight + dims.pageSeparation; + place = pagePlace(/**@type{!PagePlan}*/(state.plan), state.page); + /**@type{!HTMLElement}*/(box).style.left = (place.left + + dims.marginLeft) + "px"; + /**@type{!HTMLElement}*/(box).style.top = (place.top + + dims.marginTop) + "px"; + state.top = place.top + dims.pageHeight + dims.pageSeparation; state.text.appendChild(box); while (state.waiting.length > 0) { added = /**@type{!Array.}*/([]); @@ -2690,7 +2735,9 @@ odf.TextLayout = function TextLayout() { filling.heightRule = filling.sheet.cssRules.length; filling.sheet.insertRule("office|text {height:" + Math.max(0, filling.top - plan.at(Math.max(0, filling.page - 1)) - .pageSeparation) + "px;}", filling.heightRule); + .pageSeparation) + "px;width:" + (pagesPerRow + * (plan.at(0).pageWidth + plan.at(0).pageSeparation) + - plan.at(0).pageSeparation) + "px;}", filling.heightRule); drawPageFurniture(fillingRoot, plan, fillingDiv, readMeta(fillingRoot), from); if (filling.waiting.length > 0 && filling.page < maxPages) { @@ -2779,6 +2826,26 @@ odf.TextLayout = function TextLayout() { this.setPageMode = function (mode) { pageMode = mode; }; + /** + * How many pages stand side by side on a row: one, which is how a + * document is scrolled, or two, which is how a book is read. The pages + * are broken the same way either way; only where they are drawn changes. + * @param {!number} pages + * @return {undefined} + */ + this.setPagesPerRow = function (pages) { + pagesPerRow = Math.max(1, pages); + }; + /** + * Whether the first page stands on its own, on the right of the first + * row, as the first page of a book does: the place on its left is left + * empty. It is only of use where a row holds more than one page. + * @param {!boolean} alone + * @return {undefined} + */ + this.setFirstPageOnItsOwn = function (alone) { + firstPageOnItsOwn = alone; + }; /** * Whether every page holds what was written on it. * @param {!odf.ODFDocumentElement} odfroot From cf45aa59dfc2ef794fb6d141741067a72f457fa7 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 238/385] Drawn the notes of the annotations over the pane that carries them. --- programs/editor/CMakeLists.txt | 20 +++++++++++++++----- webodf/webodf.css | 7 +++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/programs/editor/CMakeLists.txt b/programs/editor/CMakeLists.txt index 55e2d8552..cc29fb10f 100644 --- a/programs/editor/CMakeLists.txt +++ b/programs/editor/CMakeLists.txt @@ -53,11 +53,19 @@ SET(SPLIT_SCREEN_EDITOR_ONLY_FILES vcs-locally-modified.png ) -# creates a copy of the compiled webodf.js in the editor build dir +# creates a copy of the compiled webodf.js in the editor build dir. The copy +# is a file of the build and not only a target, so that a build made after the +# library was compiled again carries the library that was compiled and not the +# one of the build before it. +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/webodf.js + COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/webodf/webodf.js + ${CMAKE_CURRENT_BINARY_DIR}/webodf.js + DEPENDS ${CMAKE_BINARY_DIR}/webodf/webodf.js webodf.js-target +) add_custom_target(editor-webodf.js-target - COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_BINARY_DIR}/webodf/webodf.js . + DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/webodf.js ) -add_dependencies(editor-webodf.js-target webodf.js-target) #################### @@ -177,7 +185,8 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy ${LIBJSLICENSEFILE} ${OPENDOCUMENTTEXTEDITORBUILDDIR} COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/HOWTO-wodotexteditor.md ${OPENDOCUMENTTEXTEDITORBUILDDIR}/HOWTO.md - DEPENDS dojo-amalgamation.js editor-webodf.js-target more-common-editorfiles-target + DEPENDS dojo-amalgamation.js ${CMAKE_CURRENT_BINARY_DIR}/webodf.js + editor-webodf.js-target more-common-editorfiles-target ) foreach(AE_FILE ${ALONE_EDITOR_FILES}) @@ -281,7 +290,8 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy ${LIBJSLICENSEFILE} ${OPENDOCUMENTTEXTCOLLABBUILDDIR} - DEPENDS dojo-amalgamation.js editor-webodf.js-target more-common-editorfiles-target + DEPENDS dojo-amalgamation.js ${CMAKE_CURRENT_BINARY_DIR}/webodf.js + editor-webodf.js-target more-common-editorfiles-target ) foreach(CE_FILE ${COMMON_COLLAB_FILES} ${COMMON_EDITOR_FILES}) diff --git a/webodf/webodf.css b/webodf/webodf.css index 9d1148787..7af20277b 100644 --- a/webodf/webodf.css +++ b/webodf/webodf.css @@ -44,6 +44,13 @@ office|body, office|document { display: inline-block; position: relative; } +office|document { + /* The document is drawn over the pane of the annotations, which stands + after it and would otherwise cover it: a note is drawn in the text, + which is a stacking context of its own, so a note cannot rise above + what follows the document on its own. */ + z-index: 1; +} office|body { /* The page, margins included, is white if document doesn't set background. */ background: white; From 36c440ca8c883a5b4993861fccd9700fae39d748 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 239/385] Painted each page of a text on its own. --- webodf/lib/odf/OdfCanvas.js | 14 ++++++++++++++ webodf/lib/odf/Style2CSS.js | 9 +++++++-- webodf/lib/odf/TextLayout.js | 27 +++++++++++++-------------- webodf/webodf.css | 27 ++++++++++++++------------- 4 files changed, 48 insertions(+), 29 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 60b675b57..cf37745b5 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -3863,8 +3863,22 @@ pagesDiv = null; if (!paginated || !domUtils.getDirectChild(odfnode.body, officens, 'text')) { + // A text drawn as one run is drawn on a ground of its own, as + // it was before the pages were drawn. A presentation keeps a + // clear ground, so that the gap between two slides is seen. + if (sizer + && domUtils.getDirectChild(odfnode.body, officens, + 'text')) { + sizer.style.background = "white"; + } return; } + // Each page paints itself from here on, so the box that holds them + // is left clear and the ground of the reader is seen between two + // of them, as it is between two slides. + if (sizer) { + sizer.style.background = ""; + } pagesDiv = /**@type{!HTMLDivElement}*/(doc.createElementNS(element.namespaceURI, 'div')); pagesDiv.className = 'webodf-pages'; // The header and the footer of each page are laid inside it. diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index f1a0f255e..08d412a37 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -1242,8 +1242,13 @@ odf.Style2CSS = function Style2CSS() { + applySimpleMapping(imageProps, bgImageSimpleMapping); } if (background) { - sheet.insertRule('office|body {' + background + '}', - sheet.cssRules.length); + // The same fill is given to the sheets a paginated text is + // drawn on, see "TextLayout.js": a page is painted on its own + // there, so the ground of the reader is seen between two of + // them, where the body is painted from the first page to the + // last. + sheet.insertRule('office|body, .webodf-pageSheet {' + + background + '}', sheet.cssRules.length); } // TODO: We want to use the simpleMapping for ODTs, but not until we have pagination. diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 13f618995..8072533b4 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -35,6 +35,7 @@ odf.TextLayout = function TextLayout() { stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", + webodfhelperns = "urn:webodf:names:helper", svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", dcns = "http://purl.org/dc/elements/1.1/", metans = "urn:oasis:names:tc:opendocument:xmlns:meta:1.0", @@ -317,16 +318,6 @@ odf.TextLayout = function TextLayout() { footerFirst: child("footer-first") }; } - /** - * @param {!odf.TextLayout.PageFurniture} furniture - * @return {!boolean} - */ - function hasFurniture(furniture) { - return Boolean(furniture.header || furniture.footer - || furniture.headerLeft || furniture.footerLeft - || furniture.headerFirst || furniture.footerFirst - || furniture.shapes.length > 0); - } /** * The master page a document names after the first one: a title page is * written with a master page of its own, that hands the pages that follow @@ -723,7 +714,8 @@ odf.TextLayout = function TextLayout() { for (i = boxes.length - 1; i >= 0; i -= 1) { box = /**@type{!Element}*/(boxes.item(i)); if (box.className === "webodf-pageShapes" - || box.className === "webodf-pageFurniture") { + || box.className === "webodf-pageFurniture" + || box.className === "webodf-pageSheet") { box.parentNode.removeChild(box); } } @@ -760,13 +752,20 @@ odf.TextLayout = function TextLayout() { n; removeBoxes(pagesDiv); removeBoxes(behind); - if (!hasFurniture(dims.firstPage) && !hasFurniture(dims.otherPages)) { - return; - } + // The body no longer paints the ground of the whole text: each page + // is painted on its own, see the rule of "office|body" in + // "webodf.css". A class would not do, as the engine of the styles + // reads none on an element of another namespace. + behind.setAttributeNS(webodfhelperns, "paginated", "true"); for (n = 0; n < pages; n += 1) { top = n * (dims.pageHeight + dims.pageSeparation); header = pageArea(dims, "header", n + 1); footer = pageArea(dims, "footer", n + 1); + // The sheet of the page, that carries its fill: it is drawn + // first, and everything of the page is drawn over it. + box = pageShapesBox(doc, htmlns, dims, top); + box.className = "webodf-pageSheet"; + behind.insertBefore(box, behind.firstChild); shapes = (n === 0 ? dims.firstPage : dims.otherPages).shapes; if (shapes.length > 0) { // What is drawn over the text hangs beside it, as the header diff --git a/webodf/webodf.css b/webodf/webodf.css index 4bd5889c5..6ab5fc701 100644 --- a/webodf/webodf.css +++ b/webodf/webodf.css @@ -48,6 +48,16 @@ office|body { /* The page, margins included, is white if document doesn't set background. */ background: white; } +/* A text drawn over pages paints each page on its own, so that the ground of + the reader is seen between two of them, see "TextLayout.js". The body is + then painted by nothing, as its fill would run from the first page to the + last. */ +office|body[webodfhelper|paginated] { + background: none; +} +.webodf-pageSheet { + background: white; +} text|p, text|h { display: block; @@ -766,20 +776,11 @@ div.webodf-customScrollbars::-webkit-scrollbar-thumb font-weight: bold; } -/* The pages a text is broken over, see "TextLayout.js": the boxes themselves - are never seen, the text flows around them, and only the gap between two - pages is drawn, in the grey a reader expects between two sheets. The gap is - the one the slides of a presentation are drawn with, ten pixels, see the - rule of "draw|page" above. - - TODO: the gap of the slides is a margin, that shows the ground of the - reader, where this one is painted: a text is one "office:text" whose fill - runs from the first page to the last, so a gap left clear would be white on - white and no page would be seen to end. Drawing the fill by page instead of - by document would make the two the same, and it touches what a document - says of its own ground, so it is left for later. */ +/* The gap between two pages of a text, that shows the ground of the reader as + the gap between two slides does: each page is painted on its own, so nothing + is drawn here, see "TextLayout.js". */ .webodf-pageSeparator { - background: rgba(0, 0, 0, 0.15); + background: none; } /* The header and the footer of a page, laid over the room the boxes of the From 933a22f34fd5bb746faeed5c9c622ff514ae9133 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 240/385] Asked of the pages what is of the document, not what is of the machine. --- webodf/tests/odf/PageLayoutTests.js | 31 ++++++++++++++++++++--------- 1 file changed, 22 insertions(+), 9 deletions(-) diff --git a/webodf/tests/odf/PageLayoutTests.js b/webodf/tests/odf/PageLayoutTests.js index 9f4398b0f..6d28ef8d3 100644 --- a/webodf/tests/odf/PageLayoutTests.js +++ b/webodf/tests/odf/PageLayoutTests.js @@ -237,15 +237,28 @@ odf.PageLayoutTests = function PageLayoutTests(runner) { draw(twoPageLayouts(paragraphs("Standard", 40) + "On its side." + paragraphs("Standard", 10)), function () { - var boxes = sheets(); - t.pages = boxes.length; - r.shouldBe(t, "t.pages", "2"); - t.first = boxes[0].width + "x" + boxes[0].height; - r.shouldBe(t, "t.first", "'768x960'"); - t.second = boxes[1].width + "x" + boxes[1].height; - r.shouldBe(t, "t.second", "'960x768'"); - t.gap = boxes[1].left - (boxes[0].left + boxes[0].width); - r.shouldBe(t, "t.gap", "10"); + var boxes = sheets(), + /**@type{!Array.}*/ + sizes = boxes.map(function (box) { + return box.width + "x" + box.height; + }), + /**@type{!Array.}*/ + gaps = boxes.slice(1).map(function (box, index) { + return box.left - (boxes[index].left + boxes[index].width); + }); + // How many pages the text takes is of the machine, as a line of + // another width holds another number of words: what is asked + // here is that a page is of the size its master page gives it, + // upright or laid on its side, and that the pages stand ten + // pixels apart whatever their size. + t.upright = sizes.indexOf("768x960") !== -1; + r.shouldBe(t, "t.upright", "true"); + t.onItsSide = sizes.indexOf("960x768") !== -1; + r.shouldBe(t, "t.onItsSide", "true"); + t.apart = gaps.length > 0 && gaps.every(function (gap) { + return gap === 10; + }); + r.shouldBe(t, "t.apart", "true"); callback(); }); } From 1d335818d858834fa2012c21e127d8d9ef6144ff Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 241/385] Drawn a text in the margins of the page it is written on. --- webodf/lib/odf/Style2CSS.js | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index 0e6240efd..2852a37a0 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -1234,6 +1234,27 @@ odf.Style2CSS = function Style2CSS() { } } else if (documentType === 'text') { + // A document holds a layout for each master page it was written + // with, and the text is drawn on one of them: the first master + // page of the document, which is the one a paragraph is written + // on unless it says otherwise. The rules of every other layout + // were written all the same, and the last of them won, so the + // text was drawn in the margins of the endnotes or of the html + // page rather than in its own. + masterStyles = domUtils.getDirectChild( + /**@type{!Element}*/(node.parentNode.parentNode), + officens, + 'master-styles' + ); + e = masterStyles && masterStyles.firstElementChild; + while (e && !(e.namespaceURI === stylens + && e.localName === "master-page")) { + e = e.nextElementSibling; + } + if (e && e.getAttributeNS(stylens, 'page-layout-name') + !== stylename) { + return; + } contentLayoutRule = 'office|text {' + rule + '}'; rule = ''; From fd9975e56f74ee1078d467efbc2d08341d89ec38 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 242/385] Wrote the type of a callback as the compiler reads it, in the editors. --- programs/editor/wodocollabtexteditor.js | 4 ++-- programs/editor/wodotexteditor.js | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/programs/editor/wodocollabtexteditor.js b/programs/editor/wodocollabtexteditor.js index 98382838c..7af966b9b 100644 --- a/programs/editor/wodocollabtexteditor.js +++ b/programs/editor/wodocollabtexteditor.js @@ -375,7 +375,7 @@ window.Wodo = window.Wodo || (function () { } /** - * @param {!function(err:?Error, !Uint8Array=):undefined} cb receiving zip as bytearray + * @param {!function(?Error, !Uint8Array=):undefined} cb receiving zip as bytearray * @return {undefined} */ function getDocumentAsByteArray(cb) { @@ -591,7 +591,7 @@ window.Wodo = window.Wodo || (function () { /** * @param {!string} mainContainerElementId * @param {!Object.} editorOptions - * @param {!function(err:?Error, editor:!CollabTextEditor=):undefined} onEditorCreated + * @param {!function(?Error, !CollabTextEditor=):undefined} onEditorCreated * @return {undefined} */ function createInstance(mainContainerElementId, editorOptions, onEditorCreated) { diff --git a/programs/editor/wodotexteditor.js b/programs/editor/wodotexteditor.js index 550b8f6ae..1b9e2c781 100644 --- a/programs/editor/wodotexteditor.js +++ b/programs/editor/wodotexteditor.js @@ -472,7 +472,7 @@ window.Wodo = window.Wodo || (function () { /** * @name TextEditor#getDocumentAsByteArray * @function - * @param {!function(err:?Error, file:!Uint8Array=):undefined} callback Called with the current document as ODT file as bytearray, passes an error object in case of error + * @param {!function(?Error, !Uint8Array=):undefined} callback Called with the current document as ODT file as bytearray, passes an error object in case of error * @return {undefined} */ this.getDocumentAsByteArray = function (callback) { @@ -809,7 +809,7 @@ window.Wodo = window.Wodo || (function () { * @param [editorOptions.userData] data about the user editing the document * @param [editorOptions.userData.fullName] full name of the user, used for annotations and in the metadata of the document * @param [editorOptions.userData.color="black"] color to use for any user related indicators like cursor or annotations - * @param {!function(err:?Error, editor:!TextEditor=):undefined} onEditorCreated + * @param {!function(?Error, !TextEditor=):undefined} onEditorCreated * @return {undefined} */ function createTextEditor(editorContainerElementId, editorOptions, onEditorCreated) { From 9a8e18582e6005281591111aa0b4fa82557ac04d Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 243/385] Managed size of each page and defaulted to master page. --- webodf/lib/odf/TextLayout.js | 321 ++++++++++++++++++++++++++++++----- 1 file changed, 277 insertions(+), 44 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 8072533b4..560d26db1 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -35,6 +35,7 @@ odf.TextLayout = function TextLayout() { stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", + officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", webodfhelperns = "urn:webodf:names:helper", svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", dcns = "http://purl.org/dc/elements/1.1/", @@ -83,6 +84,7 @@ odf.TextLayout = function TextLayout() { * @type{!odf.TextLayout.PageDimensions} */ defaultDimensions = { + pageWidth: 794, pageHeight: 1123, marginTop: 76, marginBottom: 76, @@ -351,16 +353,11 @@ odf.TextLayout = function TextLayout() { * and the pages are all of that size until the layout follows the master * page of each paragraph, which it does not do yet. * @param {!odf.ODFDocumentElement} odfroot + * @param {?Element} masterPage * @return {!odf.TextLayout.PageDimensions} */ - function readPageDimensions(odfroot) { - var /**@type{!NodeList}*/ - masterPages = odfroot.masterStyles.getElementsByTagNameNS(stylens, - "master-page"), - /**@type{?Element}*/ - masterPage = masterPages.length > 0 - ? /**@type{!Element}*/(masterPages[0]) - : null, + function readPageDimensions(odfroot, masterPage) { + var /**@type{!string}*/ layoutName = "", /**@type{!NodeList}*/ @@ -381,7 +378,7 @@ odf.TextLayout = function TextLayout() { || ""; } for (i = 0; i < layouts.length && properties === null; i += 1) { - layout = /**@type{!Element}*/(layouts[i]); + layout = /**@type{!Element}*/(layouts.item(i)); if (layoutName === "" || layout.getAttributeNS(stylens, "name") === layoutName) { properties = domUtils.getDirectChild(layout, stylens, @@ -395,6 +392,8 @@ odf.TextLayout = function TextLayout() { dims = { pageHeight: lengthInPx(properties, "page-height", defaultDimensions.pageHeight), + pageWidth: lengthInPx(properties, "page-width", + defaultDimensions.pageWidth), marginTop: defaultDimensions.marginTop, marginBottom: defaultDimensions.marginBottom, marginLeft: defaultDimensions.marginLeft, @@ -450,15 +449,15 @@ odf.TextLayout = function TextLayout() { return Math.ceil((pagesDiv.childElementCount - 1) / 2); } /** - * @param {!odf.TextLayout.PageDimensions} dims + * @param {!PagePlan} plan * @param {!HTMLDivElement} pagesDiv * @return {!number} */ - function getPagesHeight(dims, pagesDiv) { - var npages = countPages(pagesDiv), - height; - height = npages * dims.pageHeight + (npages - 1) * dims.pageSeparation; - return height; + function getPagesHeight(plan, pagesDiv) { + var npages = countPages(pagesDiv); + return npages === 0 + ? 0 + : plan.top(npages) - plan.at(npages - 1).pageSeparation; } /** * @param {!HTMLDivElement} pagesDiv @@ -480,21 +479,27 @@ odf.TextLayout = function TextLayout() { last.style.height = 0; } /** - * @param {!odf.TextLayout.PageDimensions} dims + * @param {!PagePlan} plan * @param {!HTMLDivElement} pagesDiv * @param {!number} count * @return {undefined} */ - function addPages(dims, pagesDiv, count) { + function addPages(plan, pagesDiv, count) { var doc = pagesDiv.ownerDocument, frag = doc.createDocumentFragment(), htmlns = doc.documentElement.namespaceURI, n = countPages(pagesDiv), lastSeparator = pagesDiv.lastElementChild, - contentHeight = dims.pageHeight - dims.marginTop - dims.marginBottom, + /**@type{!odf.TextLayout.PageDimensions}*/ + dims, + /**@type{!number}*/ + contentHeight, div; count += n; while (n < count) { + dims = plan.at(n); + contentHeight = dims.pageHeight - dims.marginTop + - dims.marginBottom; // make separator div = doc.createElementNS(htmlns, "div"); div.style.width = "100%"; @@ -520,7 +525,8 @@ odf.TextLayout = function TextLayout() { div.style.cssFloat = "right"; div.style.position = "relative"; div.style.zIndex = 10; - div.style.marginTop = dims.marginBottom + "px"; + div.style.marginTop = plan.at(Math.max(0, count - 1)).marginBottom + + "px"; frag.appendChild(div); if (lastSeparator) { pagesDiv.replaceChild(frag, lastSeparator); @@ -529,13 +535,15 @@ odf.TextLayout = function TextLayout() { } } /** - * @param {!odf.TextLayout.PageDimensions} dims + * @param {!PagePlan} plan * @param {!HTMLDivElement} pagesDiv * @param {!number} bodyHeight * @return {!boolean} */ - function adjustPages(dims, pagesDiv, bodyHeight) { - var missingHeight = bodyHeight - getPagesHeight(dims, pagesDiv), + function adjustPages(plan, pagesDiv, bodyHeight) { + var pages = countPages(pagesDiv), + dims = plan.at(Math.max(0, pages - 1)), + missingHeight = bodyHeight - getPagesHeight(plan, pagesDiv), missingPages = Math.ceil(missingHeight / dims.pageHeight), pageCountChanged = false; if (!isFinite(missingPages)) { @@ -546,7 +554,7 @@ odf.TextLayout = function TextLayout() { if (missingPages > 0) { // too few pages pageCountChanged = true; - addPages(dims, pagesDiv, missingPages); + addPages(plan, pagesDiv, missingPages); } else if (missingPages < 0) { // too many pages pageCountChanged = true; @@ -571,17 +579,17 @@ odf.TextLayout = function TextLayout() { } /** * @param {!odf.ODFDocumentElement} odfroot - * @param {!odf.TextLayout.PageDimensions} dims + * @param {!PagePlan} plan * @param {!HTMLDivElement} pagesDiv * @param {!number} maxTime (milliseconds) * @return {!boolean} */ - function updateNumberOfPages(odfroot, dims, pagesDiv, maxTime) { + function updateNumberOfPages(odfroot, plan, pagesDiv, maxTime) { var text = odfroot.body.lastElementChild, end = endTime(maxTime), textHeight = text.clientHeight, timeLeft = true; - while (timeLeft && adjustPages(dims, pagesDiv, textHeight)) { + while (timeLeft && adjustPages(plan, pagesDiv, textHeight)) { timeLeft = checkTime(end); } return timeLeft; @@ -649,13 +657,13 @@ odf.TextLayout = function TextLayout() { * A first page may carry a header of its own, "style:header-first", which * the standard added in 1.3 and which the office suites of today write * where a title page was written with a master page of its own before. - * @param {!odf.TextLayout.PageDimensions} dims + * @param {!PagePlan} plan * @param {!string} which "header" or "footer" * @param {!number} page the number of the page, from one * @return {?Element} */ - function pageArea(dims, which, page) { - var furniture = page === 1 ? dims.firstPage : dims.otherPages, + function pageArea(plan, which, page) { + var furniture = plan.furnitureAt(page - 1), first = which === "header" ? furniture.headerFirst : furniture.footerFirst, left = which === "header" ? furniture.headerLeft : furniture.footerLeft, right = which === "header" ? furniture.header : furniture.footer; @@ -667,6 +675,222 @@ odf.TextLayout = function TextLayout() { } return right; } + /** + * @param {!odf.ODFDocumentElement} odfroot + * @param {!string} name + * @return {?Element} + */ + function masterPageNamed(odfroot, name) { + var pages = odfroot.masterStyles.getElementsByTagNameNS(stylens, + "master-page"), + /**@type{!Element}*/ + page, + /**@type{!number}*/ + i; + for (i = 0; i < pages.length; i += 1) { + page = /**@type{!Element}*/(pages.item(i)); + if (page.getAttributeNS(stylens, "name") === name) { + return page; + } + } + return null; + } + /** + * The text of a document, that a page breaks it over. + * @param {!odf.ODFDocumentElement} odfroot + * @return {?Element} + */ + function getOfficeText(odfroot) { + return domUtils.getDirectChild(odfroot.body, officens, "text"); + } + /** + * How far an element is from the top of the page it is drawn in. + * @param {!Element} element + * @return {!number} + */ + function getTop(element) { + var he = /**@type{!HTMLElement}*/(element), + top = he.offsetTop || 0; + if (he.offsetParent) { + top += getTop(/**@type{!Element}*/(he.offsetParent)); + } + return top; + } + /** + * The master page a paragraph asks for, where it asks for one: a style of + * the family "paragraph" that names "style:master-page-name" begins a page + * with that master page, which is how a document lays a landscape page in + * the middle of a text. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!Element} paragraph + * @return {?Element} + */ + function masterPageOfParagraph(odfroot, paragraph) { + var /**@type{!string}*/ + name = paragraph.getAttributeNS(textns, "style-name") || "", + /**@type{!Array.}*/ + roots = [odfroot.automaticStyles, odfroot.styles], + /**@type{!NodeList}*/ + styles, + /**@type{!Element}*/ + candidate, + /**@type{?Element}*/ + style = null, + /**@type{!string}*/ + master = "", + /**@type{!number}*/ + i, + /**@type{!number}*/ + r; + if (name === "") { + return null; + } + for (r = 0; r < roots.length && style === null; r += 1) { + styles = roots[r].getElementsByTagNameNS(stylens, "style"); + for (i = 0; i < styles.length && style === null; i += 1) { + candidate = /**@type{!Element}*/(styles.item(i)); + if (candidate.getAttributeNS(stylens, "name") === name + && candidate.getAttributeNS(stylens, "family") + === "paragraph") { + style = candidate; + } + } + } + if (style === null) { + return null; + } + master = style.getAttributeNS(stylens, "master-page-name") || ""; + return master === "" ? null : masterPageNamed(odfroot, master); + } + /** + * The master pages a text goes through, in the order it goes through them, + * and the paragraph each change begins at. The first one is the master + * page of the document, that "style:next-style-name" hands over after the + * first page, and every one after it is asked for by a paragraph. + * @param {!odf.ODFDocumentElement} odfroot + * @return {!Array.} + */ + function masterPageSequence(odfroot) { + var pages = odfroot.masterStyles.getElementsByTagNameNS(stylens, + "master-page"), + first = pages.length > 0 + ? /**@type{!Element}*/(pages.item(0)) + : null, + sequence = [{master: first, paragraph: null}], + officeText = getOfficeText(odfroot), + /**@type{?Element}*/ + master, + /**@type{?Element}*/ + node = officeText && officeText.firstElementChild; + // The pages that follow the first one, where the document says so. + if (first && nextMasterPage(odfroot, first)) { + sequence.push({ + master: nextMasterPage(odfroot, first), + paragraph: null + }); + } + while (node) { + if (node.namespaceURI === textns + && (node.localName === "p" || node.localName === "h")) { + master = masterPageOfParagraph(odfroot, node); + if (master) { + sequence.push({master: master, paragraph: node}); + } + } + node = node.nextElementSibling; + } + return sequence; + } + /** + * The plan of the pages: the geometry of each master page a text goes + * through, and the page each one begins at. A page takes the geometry of + * the master page in force at it, so a landscape page in the middle of a + * text is drawn landscape. + * @constructor + * @param {!odf.ODFDocumentElement} odfroot + */ + function PagePlan(odfroot) { + var self = this, + sequence = masterPageSequence(odfroot), + /**@type{!Array.}*/ + geometry = sequence.map(function (entry) { + return readPageDimensions(odfroot, entry.master); + }), + /**@type{!Array.}*/ + // Until the pages are drawn, each change is taken to be one page + // after the one before it: where a change falls is read from the + // pages once they are drawn, see "follow". + starts = []; + while (starts.length < sequence.length) { + starts.push(starts.length); + } + /** + * The geometry of a page, from zero. + * @param {!number} page + * @return {!odf.TextLayout.PageDimensions} + */ + this.at = function (page) { + var i = starts.length - 1; + while (i > 0 && starts[i] > page) { + i -= 1; + } + return geometry[i]; + }; + /** + * Where a page begins, in pixels from the first one. + * @param {!number} page + * @return {!number} + */ + this.top = function (page) { + var top = 0, + n; + for (n = 0; n < page; n += 1) { + top += self.at(n).pageHeight + self.at(n).pageSeparation; + } + return top; + }; + /** + * The furniture of a page, the master page in force at it. + * @param {!number} page + * @return {!odf.TextLayout.PageFurniture} + */ + this.furnitureAt = function (page) { + var dims = self.at(page); + return page === 0 ? dims.firstPage : dims.otherPages; + }; + /** + * Read from the pages that are drawn which page each change of master + * page falls on, and answer whether that moved anything. + * @param {!number} pages how many pages are drawn + * @return {!boolean} + */ + this.follow = function (pages) { + var moved = false, + /**@type{!number}*/ + page, + /**@type{!number}*/ + top, + i; + for (i = 1; i < sequence.length; i += 1) { + if (!sequence[i].paragraph) { + page = Math.min(1, pages - 1); + } else { + top = getTop(/**@type{!Element}*/(sequence[i].paragraph)) + - getTop(/**@type{!Element}*/(getOfficeText(odfroot))); + page = 0; + while (page + 1 < pages && self.top(page + 1) <= top) { + page += 1; + } + } + page = Math.max(page, starts[i - 1] + (i > 1 ? 1 : 0)); + if (starts[i] !== page) { + starts[i] = page; + moved = true; + } + } + return moved; + }; + } /** * A box that holds the shapes of one page, of the size of the sheet. * @param {!Document} doc @@ -681,8 +905,8 @@ odf.TextLayout = function TextLayout() { box.className = "webodf-pageShapes"; box.style.position = "absolute"; box.style.left = 0; - box.style.right = 0; box.style.top = top + "px"; + box.style.width = dims.pageWidth + "px"; box.style.height = dims.pageHeight + "px"; return box; } @@ -727,12 +951,12 @@ odf.TextLayout = function TextLayout() { * hold the text away from the margins, and these are laid over the room * that was left, one for each page. Nothing of the text is touched. * @param {!odf.ODFDocumentElement} odfroot - * @param {!odf.TextLayout.PageDimensions} dims + * @param {!PagePlan} plan * @param {!HTMLDivElement} pagesDiv * @param {!Object.} meta what the document says of itself * @return {undefined} */ - function drawPageFurniture(odfroot, dims, pagesDiv, meta) { + function drawPageFurniture(odfroot, plan, pagesDiv, meta) { var /**@type{!Document}*/ doc = /**@type{!Document}*/(pagesDiv.ownerDocument), /**@type{?string}*/ @@ -748,6 +972,8 @@ odf.TextLayout = function TextLayout() { footer, /**@type{!Array.}*/ shapes, + /**@type{!odf.TextLayout.PageDimensions}*/ + dims, top, n; removeBoxes(pagesDiv); @@ -758,15 +984,16 @@ odf.TextLayout = function TextLayout() { // reads none on an element of another namespace. behind.setAttributeNS(webodfhelperns, "paginated", "true"); for (n = 0; n < pages; n += 1) { - top = n * (dims.pageHeight + dims.pageSeparation); - header = pageArea(dims, "header", n + 1); - footer = pageArea(dims, "footer", n + 1); + dims = plan.at(n); + top = plan.top(n); + header = pageArea(plan, "header", n + 1); + footer = pageArea(plan, "footer", n + 1); // The sheet of the page, that carries its fill: it is drawn // first, and everything of the page is drawn over it. box = pageShapesBox(doc, htmlns, dims, top); box.className = "webodf-pageSheet"; behind.insertBefore(box, behind.firstChild); - shapes = (n === 0 ? dims.firstPage : dims.otherPages).shapes; + shapes = plan.furnitureAt(n).shapes; if (shapes.length > 0) { // What is drawn over the text hangs beside it, as the header // and the footer do. What is drawn behind it is put in the @@ -817,16 +1044,21 @@ odf.TextLayout = function TextLayout() { * @param {!odf.ODFDocumentElement} odfroot * @param {!HTMLDivElement} pagesDiv * @param {!number} maxTime (milliseconds) - * @param {!odf.TextLayout.PageDimensions=} dims * @return {!boolean} */ - function layout(odfroot, pagesDiv, maxTime, dims) { - if (!dims) { - dims = readPageDimensions(odfroot); - } - updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); - updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); - drawPageFurniture(odfroot, dims, pagesDiv, readMeta(odfroot)); + function layout(odfroot, pagesDiv, maxTime) { + var plan = new PagePlan(odfroot), + round = 0; + // The pages are drawn, then it is read from them which page each + // change of master page falls on, and they are drawn again: a page of + // another size moves the ones that follow it. Two rounds answer for + // a text of one master page, and the third is there for the rest. + do { + updateNumberOfPages(odfroot, plan, pagesDiv, maxTime); + updateNumberOfPages(odfroot, plan, pagesDiv, maxTime); + round += 1; + } while (plan.follow(countPages(pagesDiv)) && round < 3); + drawPageFurniture(odfroot, plan, pagesDiv, readMeta(odfroot)); return maxTime > 0; } this.layout = layout; @@ -856,6 +1088,7 @@ odf.TextLayout.PageFurniture; odf.TextLayout.PageArea; /**@typedef{{ + pageWidth:!number, pageHeight:!number, marginTop:!number, marginBottom:!number, From 676ebf348d98d2f5a4880fa27c17c84048f007c4 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 244/385] Finalized pagination. --- webodf/lib/manifest.json | 3 +- webodf/lib/odf/OdfCanvas.js | 17 +- webodf/lib/odf/TextLayout.js | 398 ++++++++++++----------------------- webodf/webodf.css | 22 +- 4 files changed, 168 insertions(+), 272 deletions(-) diff --git a/webodf/lib/manifest.json b/webodf/lib/manifest.json index 33a6bba3f..f3efdb747 100644 --- a/webodf/lib/manifest.json +++ b/webodf/lib/manifest.json @@ -286,7 +286,8 @@ "odf.Namespaces" ], "odf.TextLayout": [ - "odf.OdfContainer" + "odf.OdfContainer", + "odf.OdfUtils" ], "odf.TextProperties": [ "odf.StyleParseUtils" diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index fb18918bd..d6ac696d2 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -3871,10 +3871,19 @@ container.getContentElement().appendChild(shadowContent); modifyDrawElements(odfnode, css); - pagesDiv = /**@type{!HTMLDivElement}*/(doc.createElementNS(element.namespaceURI, 'div')); - container.getContentElement().parentNode.insertBefore(pagesDiv, container.getContentElement()); - //textLayout.layout(odfnode, pagesDiv, 100); - textLayout.updateCompleteLayout(odfnode, pagesDiv); + // The pages are boxes that float to the right of the text, of the + // height a page has in the document: the text flows around them, so + // it breaks where a page ends, and the gap between two pages is a + // box of its own. Nothing of the text is moved, which is what lets + // a selection and a search cross a page. + // Only a text is broken over pages: a presentation is drawn as + // the slides it is made of, and a spreadsheet as its tables. + if (domUtils.getDirectChild(odfnode.body, officens, 'text')) { + pagesDiv = /**@type{!HTMLDivElement}*/(doc.createElementNS(element.namespaceURI, 'div')); + pagesDiv.className = 'webodf-pages'; + container.getContentElement().parentNode.insertBefore(pagesDiv, container.getContentElement()); + textLayout.layout(odfnode, pagesDiv, 100); + } cloneMasterPages(formatting, container, shadowContent, odfnode, css); modifyTables(odfnode.body, element.namespaceURI); modifyLineBreakElements(odfnode.body); diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index a10e25351..6e9ced0ea 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -23,15 +23,137 @@ */ -/*global odf, window, webodfcore, NodeFilter*/ +/*global odf, runtime, webodfcore*/ /** * @constructor */ odf.TextLayout = function TextLayout() { "use strict"; var domUtils = webodfcore.DomUtils, - officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", - textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0"; + odfUtils = odf.OdfUtils, + fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", + stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", + /** + * The gap between two pages, in pixels: the one the readers of pdf + * draw, ten pixels, and the one the slides of a presentation are drawn + * with here, see "draw|page + draw|page" in "webodf.css". OpenDocument + * says nothing of it, as it is a matter of the reader and not of the + * document. A zoom is a transform, so the gap follows it as the page + * does. + * @const + * @type{!number} + */ + pageSeparation = 10, + /** + * How many pages are drawn at the most. A document of a thousand pages + * is already far more than a reader shows at once, and the bound is + * what keeps a page height read as something absurd, or a text that + * grows as pages are added to it, from writing pages without end. + * @const + * @type{!number} + */ + maxPages = 2000, + /** + * A4 in pixels at 96 dpi, and the margin LibreOffice writes, for a + * document that declares no page layout at all. + * @const + * @type{!odf.TextLayout.PageDimensions} + */ + defaultDimensions = { + pageHeight: 1123, + marginTop: 76, + marginBottom: 76, + pageSeparation: pageSeparation + }; + /** + * Read a length of the page layout, in pixels, and fall back on the given + * one when the attribute is absent or written in a unit that is not read. + * @param {!Element} properties + * @param {!string} name + * @param {!number} fallback + * @return {!number} + */ + function lengthInPx(properties, name, fallback) { + var value = properties.getAttributeNS(fons, name), + px = fallback; + // A length in a unit that is not read, "em" for one, throws rather + // than answering, and a page that is drawn at the size of A4 is better + // than a page that is not drawn at all. + if (value) { + try { + px = odfUtils.convertToPx(value); + } catch (e) { + runtime.log("The page layout names a length that is not read: " + + value); + px = fallback; + } + } + if (!isFinite(px) || px <= 0) { + px = fallback; + } + return px; + } + /** + * The size of a page, read from the page layout the first master page + * names. A text document has one master page in all but the rarest cases, + * and the pages are all of that size until the layout follows the master + * page of each paragraph, which it does not do yet. + * @param {!odf.ODFDocumentElement} odfroot + * @return {!odf.TextLayout.PageDimensions} + */ + function readPageDimensions(odfroot) { + var /**@type{!NodeList}*/ + masterPages = odfroot.masterStyles.getElementsByTagNameNS(stylens, + "master-page"), + /**@type{!string}*/ + layoutName = "", + /**@type{!NodeList}*/ + layouts = odfroot.automaticStyles.getElementsByTagNameNS(stylens, + "page-layout"), + /**@type{?Element}*/ + properties = null, + /**@type{!Element}*/ + layout, + /**@type{!odf.TextLayout.PageDimensions}*/ + dims, + /**@type{!number}*/ + i; + if (masterPages.length > 0) { + layoutName = /**@type{!Element}*/(masterPages[0]) + .getAttributeNS(stylens, "page-layout-name") || ""; + } + for (i = 0; i < layouts.length && properties === null; i += 1) { + layout = /**@type{!Element}*/(layouts[i]); + if (layoutName === "" + || layout.getAttributeNS(stylens, "name") === layoutName) { + properties = domUtils.getDirectChild(layout, stylens, + "page-layout-properties"); + } + } + if (properties === null) { + return defaultDimensions; + } + dims = { + pageHeight: lengthInPx(properties, "page-height", + defaultDimensions.pageHeight), + marginTop: defaultDimensions.marginTop, + marginBottom: defaultDimensions.marginBottom, + pageSeparation: pageSeparation + }; + // One margin for the four sides, or one by side. + if (properties.getAttributeNS(fons, "margin")) { + dims.marginTop = lengthInPx(properties, "margin", + defaultDimensions.marginTop); + dims.marginBottom = dims.marginTop; + } else { + dims.marginTop = lengthInPx(properties, "margin-top", + defaultDimensions.marginTop); + dims.marginBottom = lengthInPx(properties, "margin-bottom", + defaultDimensions.marginBottom); + } + return dims; + } + this.readPageDimensions = readPageDimensions; /** * @param {!HTMLDivElement} pagesDiv * @return {!number} @@ -95,7 +217,7 @@ odf.TextLayout = function TextLayout() { if (n > 0) { div.style.height = dims.pageSeparation + "px"; div.style.marginTop = dims.marginBottom + "px"; - div.style.background = dims.background; + div.className = "webodf-pageSeparator"; } frag.appendChild(div); div = doc.createElementNS(htmlns, "div"); @@ -128,6 +250,11 @@ odf.TextLayout = function TextLayout() { var missingHeight = bodyHeight - getPagesHeight(dims, pagesDiv), missingPages = Math.ceil(missingHeight / dims.pageHeight), pageCountChanged = false; + if (!isFinite(missingPages)) { + return false; + } + missingPages = Math.min(missingPages, + maxPages - countPages(pagesDiv)); if (missingPages > 0) { // too few pages pageCountChanged = true; @@ -183,277 +310,18 @@ odf.TextLayout = function TextLayout() { */ function layout(odfroot, pagesDiv, maxTime, dims) { if (!dims) { - dims = { - pageHeight: 1130, // ~ 30 cm - marginTop: 60, - marginBottom: 60, - pageSeparation: 30,// ~ 1 cm - background: "black" - }; + dims = readPageDimensions(odfroot); } updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); updateNumberOfPages(odfroot, dims, pagesDiv, maxTime); return maxTime > 0; } this.layout = layout; - /** - * @param {!odf.ODFDocumentElement} odfRoot - * @return {?Element} - */ - function getOfficeText(odfRoot) { - return domUtils.getDirectChild(odfRoot.body, officens, "text"); - } - /** - * @param {!Node} node - * @return {!number} - */ - function paragraphNodeFilter(node) { - var r = NodeFilter.FILTER_ACCEPT; - if (node.localName !== "p" && node.localName !== "h") { - r = NodeFilter.FILTER_REJECT; - } else if (node.namespaceURI !== textns) { - r = NodeFilter.FILTER_REJECT; - } - return r; - } - /** - * @param {!Element} officeText - * @return {!TreeWalker} - */ - function createParagraphWalker(officeText) { - var doc = officeText.ownerDocument; - return doc.createTreeWalker(officeText, NodeFilter.SHOW_ELEMENT, - paragraphNodeFilter, false); - } - /** - * @param {!Element} element - * @return {!number} - */ - function getTop(element) { - var he = /**@type{!HTMLElement}*/(element), - top = he.offsetTop || 0; - if (he.offsetParent) { - top += getTop(he.offsetParent); - } - return top; - } - /** - * @param {!Element} element - * @return {!number} - */ - function getBottom(element) { - var height = /**@type{!HTMLElement}*/(element).offsetHeight || 0; - return height + getTop(element); - } - /** - * @param {!HTMLDivElement} pagesDiv - * @return {!HTMLDivElement} - */ - function createPageDiv(pagesDiv) { - var doc = pagesDiv.ownerDocument, - htmlns = pagesDiv.namespaceURI, - page = doc.createElementNS(htmlns, "div"), - header = doc.createElementNS(htmlns, "div"), - footer = doc.createElementNS(htmlns, "div"); - page.style.cssFloat = "right"; - page.style.width = "1px"; - page.style.height = "10cm"; - page.style.position = "relative"; - - header.style.position = "absolute"; - header.style.right = 0; - header.style.top = 0; - header.style.width = "1cm"; - header.style.height = "1cm"; - header.style.background = "yellow"; - - footer.style.position = "absolute"; - footer.style.right = 0; - footer.style.bottom = 0; - footer.style.width = "1cm"; - footer.style.height = "1cm"; - footer.style.background = "red"; - - page.appendChild(header); - page.appendChild(footer); - return /**@type{!HTMLDivElement}*/(page); - } - /** - * @param {!HTMLDivElement} pagesDiv - * @return {!HTMLDivElement} - */ - function createSeparator(pagesDiv) { - var doc = pagesDiv.ownerDocument, - htmlns = pagesDiv.namespaceURI, - separator = doc.createElementNS(htmlns, "div"); - separator.style.cssFloat = "right"; - separator.style.width = "100%"; - separator.style.height = "1cm"; - separator.style.background = "black"; - return /**@type{!HTMLDivElement}*/(separator); - } - /** - * @param {!number} page - * @param {!HTMLDivElement} pagesDiv - * @return {!HTMLDivElement} - */ - function getPageDiv(page, pagesDiv) { - var pageDiv = pagesDiv.firstElementChild; - if (pageDiv === null) { - pagesDiv.appendChild(createSeparator(pagesDiv)); - } - while (page > 0 && pageDiv !== null) { - pageDiv = pageDiv.nextElementSibling; - pageDiv = pageDiv && pageDiv.nextElementSibling; - if (pageDiv !== null) { - page -= 1; - } - } - if (pageDiv === null) { - while (page > 0) { - pageDiv = pagesDiv.appendChild(createPageDiv(pagesDiv)); - pagesDiv.appendChild(createSeparator(pagesDiv)); - page -= 1; - } - } - return /**@type{!HTMLDivElement}*/(pageDiv); - } - /** - * @param {!number} pageBottom - * @param {?Element} officeText - * @param {?Element} previousFirstPageParagraph - * @return {?Element} - */ - function getFirstPageParagraph(pageBottom, officeText, previousFirstPageParagraph) { - if (!officeText) { - return null; - } - var walker = createParagraphWalker(officeText), - top, - e; - if (previousFirstPageParagraph) { - walker.currentNode = previousFirstPageParagraph; - } - e = /**@type{?Element}*/(walker.nextNode()); - while (e) { - top = getTop(e); - if (top >= pageBottom) { - break; - } - e = /**@type{?Element}*/(walker.nextNode()); - } - return e; - } - /** - * @param {!Element} masterPageStyle - * @return {!odf.TextLayout.PageDimensions} - */ - function getPageDimensions(masterPageStyle) { - var dims = { - pageHeight: 1130, // ~ 30 cm - marginTop: 60, - marginBottom: 60, - pageSeparation: 30,// ~ 1 cm - background: "black" - }; - if (masterPageStyle) { - dims.background = "black"; - } - return dims; - } - /** - * @param {!HTMLDivElement} pageDiv - * @param {!Element} masterPageStyle - * @return {undefined} - */ - function updatePageSize(pageDiv, masterPageStyle) { - var dim = getPageDimensions(masterPageStyle), - h = dim.pageHeight + "px"; - if (pageDiv.style.height !== h) { - pageDiv.style.height = h; - } - } - /** - * @param {!number} currentPage - * @param {!Element} paragraph - * @param {!odf.ODFDocumentElement} odfroot - * @return {!Element} - */ - function getMasterPageStyle(currentPage, paragraph, odfroot) { - var styleElements = [odfroot.automaticStyles, odfroot.styles], - //styleName, - //style, - p = paragraph; - if (styleElements && currentPage) { - p = paragraph; - } -/* TODO: implement - do { - if (p.hasAttributeNS(textns, "style-name")) { - styleName = p.getAttributeNS(textns, "style-name"); - style = styleInfo.getStyleElement(styleName, "paragraph", - styleElements); - if (style) { - } - } else { - } - p = p.previousElementSibling; - } while (p !== null); -*/ - return p; - } - /** - * Update the layout of pages. - * Returns the number of the next page that should be layed out or 0 if - * layout is done. - * @param {!odf.ODFDocumentElement} odfroot - * @param {!HTMLDivElement} pagesDiv - * @param {!number} maxTime (milliseconds) - * @param {!number} currentPage - * @return {!number} - */ - function updateLayout(odfroot, pagesDiv, maxTime, currentPage) { - currentPage = Math.max(1, currentPage); - var officeText = getOfficeText(odfroot), - masterPageStyle, - firstPageParagraph = getFirstPageParagraph(0, officeText, null), - end = endTime(maxTime), - pageBottom, - pageDiv, - timeLeft = true; - while (timeLeft && firstPageParagraph) { - masterPageStyle = getMasterPageStyle(currentPage, - firstPageParagraph, odfroot); - pageDiv = getPageDiv(currentPage, pagesDiv); - updatePageSize(pageDiv, masterPageStyle); - currentPage += 1; - pageBottom = getBottom(pageDiv); - firstPageParagraph = getFirstPageParagraph(pageBottom, officeText, firstPageParagraph); - timeLeft = checkTime(end); - } - return timeLeft ? 0 : currentPage; - } - this.updateLayout = updateLayout; - /** - * @param {!odf.ODFDocumentElement} odfroot - * @param {!HTMLDivElement} pagesDiv - * @return {undefined} - */ - function updateCompleteLayout(odfroot, pagesDiv) { - var page = 1, - count = 0; - do { - page = updateLayout(odfroot, pagesDiv, 1, page); - count += 1; - } while (page !== 0 && count < 10); - } - this.updateCompleteLayout = updateCompleteLayout; }; /**@typedef{{ pageHeight:!number, marginTop:!number, marginBottom:!number, - pageSeparation:!number, - background:!string + pageSeparation:!number }}*/ odf.TextLayout.PageDimensions; diff --git a/webodf/webodf.css b/webodf/webodf.css index 4532d6626..afa13b7ee 100644 --- a/webodf/webodf.css +++ b/webodf/webodf.css @@ -153,7 +153,9 @@ draw|page { } /* The slides of a presentation are drawn one under the other, so the ground is seen between two of them and each is read as a page of its own. The gap is - written in the unit of a page, and follows the zoom as the page does. + ten pixels, the one the readers of pdf draw and the one the pages of a text + are drawn with, see "TextLayout.js"; a zoom is a transform, so it follows + the zoom as the page does. The rule holds for the slides of the document and for the master pages that are cloned behind them, in "#shadowContent": the two are stacked the same @@ -162,7 +164,7 @@ draw|page { layout of the document is written as "draw|page[draw|master-page-name=...]" and would otherwise set the margins back to its own. */ draw|page + draw|page[draw|master-page-name] { - margin-top: 0.5cm; + margin-top: 10px; } presentation|notes, presentation|footer-decl, presentation|date-time-decl { @@ -763,3 +765,19 @@ div.webodf-customScrollbars::-webkit-scrollbar-thumb display: block; font-weight: bold; } + +/* The pages a text is broken over, see "TextLayout.js": the boxes themselves + are never seen, the text flows around them, and only the gap between two + pages is drawn, in the grey a reader expects between two sheets. The gap is + the one the slides of a presentation are drawn with, ten pixels, see the + rule of "draw|page" above. + + TODO: the gap of the slides is a margin, that shows the ground of the + reader, where this one is painted: a text is one "office:text" whose fill + runs from the first page to the last, so a gap left clear would be white on + white and no page would be seen to end. Drawing the fill by page instead of + by document would make the two the same, and it touches what a document + says of its own ground, so it is left for later. */ +.webodf-pageSeparator { + background: rgba(0, 0, 0, 0.15); +} From 151372c7bb2df046571639bbf6714af820b840b1 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 245/385] Written the head of a table again, once, and only where a head belongs. --- webodf/lib/odf/TextLayout.js | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index d2292f0b2..73d436ada 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2149,6 +2149,16 @@ odf.TextLayout = function TextLayout() { ? middle + 1 : Math.max(1, low)); } + /** + * Whether a node is the rows of the head of a table. + * @param {!Node} node + * @return {!boolean} + */ + function isHeaderRows(node) { + return node.nodeType === Node.ELEMENT_NODE + && node.namespaceURI === tablens + && node.localName === "table-header-rows"; + } /** * Whether a node is a row of a table, of the kind that is written whole * on one page. @@ -2159,8 +2169,7 @@ odf.TextLayout = function TextLayout() { return node.nodeType === Node.ELEMENT_NODE && node.namespaceURI === tablens && (node.localName === "table-row" - || node.localName === "table-rows" - || node.localName === "table-header-rows"); + || node.localName === "table-rows"); } /** * Cut an element where the page ends, and answer what is left of it: a @@ -2200,7 +2209,14 @@ odf.TextLayout = function TextLayout() { rect = node.nodeType === Node.TEXT_NODE ? rangeOf(doc, node).getBoundingClientRect() : /**@type{!Element}*/(node).getBoundingClientRect(); - if (rect.bottom > bottom) { + if (isHeaderRows(node) && node === element.firstElementChild) { + // The rows of the head of a table belong to the head of it + // and are never moved: they are written again at the top of + // what follows, see below. A document that writes such rows + // further down, where it broke the table itself, writes rows + // like any other there, and they are moved like any other. + node = node.nextSibling; + } else if (rect.bottom > bottom) { if (node.nodeType === Node.TEXT_NODE) { from = cutText(box, /**@type{!Text}*/(node), alone) || node; @@ -2235,7 +2251,8 @@ odf.TextLayout = function TextLayout() { // A table that is cut in two writes the rows of its head again at // the top of what follows, as an office does. head = domUtils.getDirectChild(element, tablens, "table-header-rows"); - if (head && element.namespaceURI === tablens) { + if (head && element.namespaceURI === tablens + && !(from && isHeaderRows(from))) { tail.appendChild(head.cloneNode(true)); } if (inner) { @@ -2751,11 +2768,18 @@ odf.TextLayout = function TextLayout() { // that follows it. filling = null; runtime.setTimeout(function () { - if (round === fillingRound && fillingRoot && fillingDiv - && !pagesHold(fillingRoot)) { + var /**@type{!number}*/ + round2 = 0; + // Setting a page right moves what it could not hold to the next + // page, which may then hold one line too many in its turn: it is + // done until every page holds what was written on it, twice at + // the most. + while (round2 < 2 && round === fillingRound && fillingRoot + && fillingDiv && !pagesHold(fillingRoot)) { trimPages(fillingRoot, plan); drawPageFurniture(fillingRoot, plan, fillingDiv, readMeta(fillingRoot), 0); + round2 += 1; } }, 0); } From c40c42dbad90f97ae4475533b9015b7c9446f5b3 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 246/385] Said plainly that a document is being read, and say it where it is seen. --- webodf/lib/odf/OdfCanvas.js | 22 ++++++++++++++++++---- webodf/webodf.css | 10 ++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index abc7eeb75..80d90fa95 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -4137,6 +4137,21 @@ odfcontainer = container; refreshOdf(suppressEvent === true); }; + /** + * The word a reader is given while a document is read. + * + * The address of the document is not written beside it: a reader + * asked for the document and knows which one, and the address of a + * viewer is one of its own, "odf:/document", which says nothing. + * @param {!Document} doc + * @return {!Element} + */ + function loadingMessage(doc) { + var box = doc.createElementNS(element.namespaceURI, 'div'); + box.className = 'webodf-loading'; + box.appendChild(doc.createTextNode(runtime.tr('Loading the document…'))); + return box; + } /** * @param {string} url * @return {undefined} @@ -4145,11 +4160,10 @@ // clean up loadingQueue.clearQueue(); - // FIXME: We need to support parametrized strings, because - // drop-in word replacements are inadequate for translations; - // see http://techbase.kde.org/Development/Tutorials/Localization/i18n_Mistakes#Pitfall_.232:_Word_Puzzles domUtils.removeAllChildNodes(element); - element.appendChild(element.ownerDocument.createTextNode(runtime.tr('Loading') + url + '...')); + element.appendChild(loadingMessage( + /**@type{!Document}*/(element.ownerDocument) + )); element.removeAttribute('style'); // open the odf container odfcontainer = new odf.OdfContainer(url, function (container) { diff --git a/webodf/webodf.css b/webodf/webodf.css index 7af20277b..d7543eb65 100644 --- a/webodf/webodf.css +++ b/webodf/webodf.css @@ -642,6 +642,16 @@ office|annotation text|p { font-family: sans-serif; } +/* The word given to a reader while a document is read. The colour is one + that is read on a white ground as on a black one, as a reader may have + asked for either. */ +.webodf-loading { + display: block; + padding: 1em; + color: #808080; + font-family: sans-serif; +} + #annotationsPane { background-color: #EAEAEA; width: 4cm; From 20598777b64bd5d78371b1eae87218ed8e8faafd Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 247/385] Simplified building of products in one place. --- CMakeLists.txt | 64 +++++++++++++++++++ programs/docnosis/CMakeLists.txt | 2 + programs/editor/CMakeLists.txt | 6 ++ .../opendocumentviewer-android/CMakeLists.txt | 2 + .../opendocumentviewer-webext/CMakeLists.txt | 5 ++ 5 files changed, 79 insertions(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index b0b3cd344..c06e4cef7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -440,6 +440,24 @@ else() endif() + +############################# +## The products of the build +############################# + +# A product is a file someone is given: an add-on, a zip of the library, an +# apk. Each one is written where the target that packs it stands, so the list +# is kept here: the target "products" packs them all and tells where each one +# was written, as the paths are of no help to remember. The target is named +# beside the path, so that the list follows the targets and not the files, +# whose names hold the version of the build. +set_property(GLOBAL PROPERTY WEBODF_PRODUCTS "") +set_property(GLOBAL PROPERTY WEBODF_PRODUCT_TARGETS "") +macro(WEBODF_PRODUCT target path) + set_property(GLOBAL APPEND PROPERTY WEBODF_PRODUCTS ${path}) + set_property(GLOBAL APPEND PROPERTY WEBODF_PRODUCT_TARGETS ${target}) +endmacro(WEBODF_PRODUCT) + ############################# ## Build Library and programs ############################# @@ -462,4 +480,50 @@ else () endif () endif () +# The target that runs every test of this build, beside "products" that packs +# every product: the tests of the library, in each engine the build has, and +# the ones of the programs that carry some. +add_custom_target(tests + COMMAND ${CMAKE_COMMAND} -E echo "" + COMMAND ${CMAKE_COMMAND} -E echo "Every test of this build has run.") +add_dependencies(tests webodf.js-tests) +foreach (WEBODF_TEST_TARGET + test-opendocumenttexteditor + test-opendocumenttextcollab + test-opendocumentviewer-webext + test-opendocumentviewer-thunderbird) + if (TARGET ${WEBODF_TEST_TARGET}) + add_dependencies(tests ${WEBODF_TEST_TARGET}) + endif () +endforeach () + +# The target that packs every product of this build and gathers them in one +# place. Each product is written where the target that packs it stands, deep +# in the tree of the build, so "make products" or "ninja products" copies them +# all into "products/" and tells what is there: no one has to remember where +# an add-on or an apk was written. +get_property(WEBODF_PRODUCT_FILES GLOBAL PROPERTY WEBODF_PRODUCTS) +get_property(WEBODF_PRODUCT_TARGET_LIST GLOBAL PROPERTY WEBODF_PRODUCT_TARGETS) +if (WEBODF_PRODUCT_FILES) + set(WEBODF_PRODUCTS_DIR ${CMAKE_BINARY_DIR}/products) + set(WEBODF_PRODUCT_STEPS + COMMAND ${CMAKE_COMMAND} -E make_directory ${WEBODF_PRODUCTS_DIR}) + foreach (WEBODF_PRODUCT_FILE ${WEBODF_PRODUCT_FILES}) + list(APPEND WEBODF_PRODUCT_STEPS + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${WEBODF_PRODUCT_FILE} ${WEBODF_PRODUCTS_DIR}) + endforeach () + list(APPEND WEBODF_PRODUCT_STEPS + COMMAND ${CMAKE_COMMAND} -E echo "" + COMMAND ${CMAKE_COMMAND} -E echo + "The products of this build are in ${WEBODF_PRODUCTS_DIR}:") + foreach (WEBODF_PRODUCT_FILE ${WEBODF_PRODUCT_FILES}) + get_filename_component(WEBODF_PRODUCT_NAME ${WEBODF_PRODUCT_FILE} NAME) + list(APPEND WEBODF_PRODUCT_STEPS + COMMAND ${CMAKE_COMMAND} -E echo " ${WEBODF_PRODUCT_NAME}") + endforeach () + add_custom_target(products ${WEBODF_PRODUCT_STEPS}) + add_dependencies(products ${WEBODF_PRODUCT_TARGET_LIST}) +endif () + # vim:expandtab diff --git a/programs/docnosis/CMakeLists.txt b/programs/docnosis/CMakeLists.txt index 23c5cda27..80fbadabe 100644 --- a/programs/docnosis/CMakeLists.txt +++ b/programs/docnosis/CMakeLists.txt @@ -38,3 +38,5 @@ add_custom_command( ) add_custom_target(product-docnosis DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/docnosis-${WEBODF_VERSION}.zip) +WEBODF_PRODUCT(product-docnosis + ${CMAKE_CURRENT_BINARY_DIR}/docnosis-${WEBODF_VERSION}.zip) diff --git a/programs/editor/CMakeLists.txt b/programs/editor/CMakeLists.txt index 82931bfaf..49c0cc630 100644 --- a/programs/editor/CMakeLists.txt +++ b/programs/editor/CMakeLists.txt @@ -221,6 +221,10 @@ add_custom_target(build-opendocumenttexteditor DEPENDS ${OPENDOCUMENTTEXTEDITOR_ add_custom_target(test-opendocumenttexteditor DEPENDS webodf.js-tests) add_custom_target(product-opendocumenttexteditor DEPENDS build-opendocumenttexteditor test-opendocumenttexteditor) +# The zip is named without a path, so it is written where the build was +# started from, which is the root of the build and not this directory. +WEBODF_PRODUCT(product-opendocumenttexteditor + ${CMAKE_BINARY_DIR}/${OPENDOCUMENTTEXTEDITOR_ZIP}) ########################### @@ -292,6 +296,8 @@ add_custom_target(build-opendocumenttextcollab DEPENDS ${OPENDOCUMENTTEXTCOLLAB_ add_custom_target(test-opendocumenttextcollab DEPENDS webodf.js-tests) add_custom_target(product-opendocumenttextcollab DEPENDS build-opendocumenttextcollab test-opendocumenttextcollab) +# This one is named with the path of the root of the build already. +WEBODF_PRODUCT(product-opendocumenttextcollab ${OPENDOCUMENTTEXTCOLLAB_ZIP}) ################ diff --git a/programs/opendocumentviewer-android/CMakeLists.txt b/programs/opendocumentviewer-android/CMakeLists.txt index db720997f..66b6d138d 100644 --- a/programs/opendocumentviewer-android/CMakeLists.txt +++ b/programs/opendocumentviewer-android/CMakeLists.txt @@ -124,5 +124,7 @@ if (WEBODF_ANDROID) BUILD_OPENDOCUMENTVIEWER_ANDROID(${OPENDOCUMENTVIEWER_ANDROID_APK_DEBUG} assembleDebug) add_custom_target(product-opendocumentviewer-android DEPENDS ${OPENDOCUMENTVIEWER_ANDROID_APK}) + WEBODF_PRODUCT(product-opendocumentviewer-android + ${OPENDOCUMENTVIEWER_ANDROID_APK}) add_custom_target(opendocumentviewer-android-debug DEPENDS ${OPENDOCUMENTVIEWER_ANDROID_APK_DEBUG}) endif () diff --git a/programs/opendocumentviewer-webext/CMakeLists.txt b/programs/opendocumentviewer-webext/CMakeLists.txt index 70d74076e..0964e9be4 100644 --- a/programs/opendocumentviewer-webext/CMakeLists.txt +++ b/programs/opendocumentviewer-webext/CMakeLists.txt @@ -111,6 +111,9 @@ add_custom_target(build-opendocumentviewer-webext add_custom_target(test-opendocumentviewer-webext DEPENDS webodf.js-tests) add_custom_target(product-opendocumentviewer-webext DEPENDS build-opendocumentviewer-webext test-opendocumentviewer-webext) +WEBODF_PRODUCT(product-opendocumentviewer-webext ${OPENDOCUMENTVIEWER_FIREFOX}) +WEBODF_PRODUCT(product-opendocumentviewer-webext ${OPENDOCUMENTVIEWER_FIREFOX_MV2}) +WEBODF_PRODUCT(product-opendocumentviewer-webext ${OPENDOCUMENTVIEWER_CHROME}) # The add-on of Thunderbird is packed from the same files, and is a product of # its own, as it is published on addons.thunderbird.net and not on AMO. @@ -120,3 +123,5 @@ add_custom_target(build-opendocumentviewer-thunderbird add_custom_target(test-opendocumentviewer-thunderbird DEPENDS webodf.js-tests) add_custom_target(product-opendocumentviewer-thunderbird DEPENDS build-opendocumentviewer-thunderbird test-opendocumentviewer-thunderbird) +WEBODF_PRODUCT(product-opendocumentviewer-thunderbird ${OPENDOCUMENTVIEWER_THUNDERBIRD}) +WEBODF_PRODUCT(product-opendocumentviewer-thunderbird ${OPENDOCUMENTVIEWER_THUNDERBIRD_MV2}) From 0ec16b0d8b89c1056684de3dd1d4a6ac4d0a1838 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 248/385] Written a page and a section in the columns they ask for. --- webodf/lib/odf/Style2CSS.js | 34 ++++++++++++ webodf/lib/odf/TextLayout.js | 85 ++++++++++++++++++++++++++++- webodf/tests/documents/columns.fodt | 12 ++++ 3 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 webodf/tests/documents/columns.fodt diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index 2ecf2f926..fb02b9166 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -1170,6 +1170,35 @@ odf.Style2CSS = function Style2CSS() { insertFrameVisibilityRule(invisibleFrameClasses, "hidden"); } + /** + * The css of a section: the columns it is written in. + * + * A section of two columns is written in two columns by the browser, as + * an office writes it: what a section holds runs from the foot of one + * column to the head of the next. + * @param {!Element} props + * @return {!string} + */ + function getSectionProperties(props) { + var rule = '', + columns = domUtils.getDirectChild(props, stylens, 'columns'), + /**@type{!number}*/ + count = 0, + /**@type{!string}*/ + gap = ''; + if (columns) { + count = parseInt(columns.getAttributeNS(fons, 'column-count'), + 10) || 0; + gap = columns.getAttributeNS(fons, 'column-gap') || ''; + } + if (count > 1) { + rule += 'column-count:' + count + ';'; + if (gap) { + rule += 'column-gap:' + gap + ';'; + } + } + return rule; + } /** * @param {!CSSStyleSheet} sheet * @param {string} family @@ -1192,6 +1221,11 @@ odf.Style2CSS = function Style2CSS() { if (properties) { rule += getParagraphProperties(properties); } + properties = domUtils.getDirectChild(node.element, + stylens, 'section-properties'); + if (properties) { + rule += getSectionProperties(properties); + } properties = domUtils.getDirectChild(node.element, stylens, 'graphic-properties'); if (properties) { diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 1e1592c3f..445dbe11f 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -186,6 +186,8 @@ odf.TextLayout = function TextLayout() { pageHeight: 1123, marginTop: 76, marginBottom: 76, + columnCount: 1, + columnGap: 0, marginLeft: 76, marginRight: 76, pageSeparation: pageSeparation, @@ -512,6 +514,25 @@ odf.TextLayout = function TextLayout() { } return null; } + /** + * The columns a page or a section is written in. + * @param {!Element} properties the properties of the layout or the style + * @return {!{count:!number,gap:!number}} + */ + function columnsOf(properties) { + var columns = domUtils.getDirectChild(properties, stylens, "columns"), + /**@type{!number}*/ + count = 1; + if (!columns) { + return {count: 1, gap: 0}; + } + count = parseInt(columns.getAttributeNS(fons, "column-count"), 10) + || 1; + return { + count: Math.max(1, count), + gap: lengthInPx(columns, "column-gap", 0) + }; + } /** * The size of a page, read from the page layout the first master page * names. A text document has one master page in all but the rarest cases, @@ -536,6 +557,8 @@ odf.TextLayout = function TextLayout() { layout, /**@type{!odf.TextLayout.PageDimensions}*/ dims, + /**@type{!{count:!number,gap:!number}}*/ + columns, /**@type{!number}*/ i; if (masterPage) { @@ -554,6 +577,7 @@ odf.TextLayout = function TextLayout() { if (properties === null) { return defaultDimensions; } + columns = columnsOf(properties); dims = { pageHeight: lengthInPx(properties, "page-height", defaultDimensions.pageHeight), @@ -564,6 +588,8 @@ odf.TextLayout = function TextLayout() { marginLeft: defaultDimensions.marginLeft, marginRight: defaultDimensions.marginRight, pageSeparation: pageSeparation, + columnCount: columns.count, + columnGap: columns.gap, header: readPageArea(pageLayout, "header-style", "margin-bottom"), footer: readPageArea(pageLayout, "footer-style", "margin-top"), firstPage: readFurniture(odfroot, masterPage), @@ -2671,6 +2697,30 @@ odf.TextLayout = function TextLayout() { sheet.cssRules.length); }); } + /** + * Write a page in the columns its layout asks for. + * @param {!Element} box the page + * @param {!odf.TextLayout.PageDimensions} dims + * @return {undefined} + */ + function setColumns(box, dims) { + if (dims.columnCount > 1) { + /**@type{!HTMLElement}*/(box).style.setProperty("column-count", + String(dims.columnCount)); + /**@type{!HTMLElement}*/(box).style.setProperty("column-gap", + dims.columnGap + "px"); + } + } + /** + * Whether a page is written in more than one column. + * @param {!Element} box the page + * @return {!boolean} + */ + function holdsColumns(box) { + var count = /**@type{!HTMLElement}*/(box).style + .getPropertyValue("column-count"); + return count !== "" && count !== "1" && count !== "auto"; + } /** * Where the text of a page ends. * @@ -2685,6 +2735,20 @@ odf.TextLayout = function TextLayout() { - (parseFloat(/**@type{!HTMLElement}*/(box).style.paddingBottom) || 0); } + /** + * Where the last column of a page ends. + * + * A page written in columns is filled from the foot of one column to the + * head of the next, so what does not fit stands to the right of the last + * column and not under the text. + * @param {!Element} box the page + * @return {!number} + */ + function rightEdgeOf(box) { + return box.getBoundingClientRect().right + - (parseFloat(/**@type{!HTMLElement}*/(box).style.paddingRight) + || 0); + } /** * Take the notes of the foot of a page away, and the room they took. * @param {!Element} box the page @@ -2851,6 +2915,10 @@ odf.TextLayout = function TextLayout() { */ function firstOverflowing(box) { var edge = edgeOf(box), + /**@type{!boolean}*/ + columns = holdsColumns(box), + /**@type{!number}*/ + side = rightEdgeOf(box), /**@type{?Element}*/ node = box.firstElementChild, /**@type{!ClientRect}*/ @@ -2859,7 +2927,9 @@ odf.TextLayout = function TextLayout() { rect = node.getBoundingClientRect(); if (node.className !== "webodf-pageNotes" && (rect.height > 0 || rect.width > 0) - && rect.bottom > edge + 1) { + && (columns + ? rect.right > side + 1 + : rect.bottom > edge + 1)) { return node; } node = node.nextElementSibling; @@ -2925,6 +2995,10 @@ odf.TextLayout = function TextLayout() { var doc = /**@type{!Document}*/(box.ownerDocument), /**@type{!number}*/ edge = edgeOf(box), + /**@type{!boolean}*/ + columns = holdsColumns(box), + /**@type{!number}*/ + side = rightEdgeOf(box), /**@type{?Node}*/ last = box.lastElementChild && box.lastElementChild.className === "webodf-pageNotes" @@ -2958,7 +3032,10 @@ odf.TextLayout = function TextLayout() { range.setStartBefore(node); range.setEndAfter(last); rect = range.getBoundingClientRect(); - if ((rect.height > 0 || rect.width > 0) && rect.bottom > edge + 1) { + if ((rect.height > 0 || rect.width > 0) + && (columns + ? rect.right > side + 1 + : rect.bottom > edge + 1)) { return true; } // What is drawn out of the flow of the text — a frame set against the @@ -3409,6 +3486,7 @@ odf.TextLayout = function TextLayout() { /**@type{!HTMLElement}*/(box).style.paddingRight = dims.marginRight + "px"; /**@type{!HTMLElement}*/(box).style.width = dims.pageWidth + "px"; + setColumns(box, dims); /**@type{!HTMLElement}*/(box).style.height = (dims.pageHeight - dims.marginTop - dims.marginBottom) + "px"; // A page is set at the place of the page it is, and not left to @@ -3899,6 +3977,7 @@ odf.TextLayout = function TextLayout() { dims.marginRight + "px"; /**@type{!HTMLElement}*/(target).style.width = dims.pageWidth + "px"; + setColumns(target, dims); /**@type{!HTMLElement}*/(target).style.height = (dims.pageHeight - dims.marginTop - dims.marginBottom) + "px"; @@ -4320,6 +4399,8 @@ odf.TextLayout.PageArea; marginLeft:!number, marginRight:!number, pageSeparation:!number, + columnCount:!number, + columnGap:!number, header:!odf.TextLayout.PageArea, footer:!odf.TextLayout.PageArea, firstPage:!odf.TextLayout.PageFurniture, diff --git a/webodf/tests/documents/columns.fodt b/webodf/tests/documents/columns.fodt new file mode 100644 index 000000000..f87c6fa7a --- /dev/null +++ b/webodf/tests/documents/columns.fodt @@ -0,0 +1,12 @@ + + + + + + + + + + +Paragraph 1. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 2. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 3. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 4. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 5. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 6. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 7. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 8. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 9. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 10. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 11. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 12. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 13. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 14. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 15. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 16. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 17. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 18. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 19. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 20. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 21. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 22. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 23. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 24. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 25. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 26. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 27. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 28. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 29. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 30. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 31. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 32. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 33. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 34. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 35. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 36. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 37. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 38. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 39. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 40. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 41. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 42. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 43. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 44. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 45. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 46. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 47. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 48. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 49. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 50. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 51. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 52. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 53. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 54. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 55. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 56. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 57. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 58. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 59. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 60. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 61. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 62. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 63. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 64. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 65. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 66. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 67. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 68. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 69. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 70. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 71. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 72. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 73. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 74. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 75. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 76. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 77. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 78. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 79. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Paragraph 80. The text of the page goes on and on, of a length that fills a column and then the next one, so that the pages are broken where the last column of a page is full.Section paragraph 1. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 2. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 3. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 4. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 5. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 6. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 7. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 8. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 9. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 10. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 11. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 12. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 13. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 14. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 15. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 16. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 17. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 18. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 19. Two columns of a section of the text, that run from the foot of one to the head of the next.Section paragraph 20. Two columns of a section of the text, that run from the foot of one to the head of the next. + \ No newline at end of file From a8f4f134f7951f0683c60d069f05418df8d7d828 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 249/385] Drawn the pages in firefox, and taken the number of pages from the document. --- webodf/lib/odf/OdfContainer.js | 6 +++ webodf/lib/odf/TextLayout.js | 94 +++++++++++++++++++++++----------- webodf/lib/runtime.js | 29 ++++++++--- 3 files changed, 94 insertions(+), 35 deletions(-) diff --git a/webodf/lib/odf/OdfContainer.js b/webodf/lib/odf/OdfContainer.js index 3847ea1b0..24c481599 100644 --- a/webodf/lib/odf/OdfContainer.js +++ b/webodf/lib/odf/OdfContainer.js @@ -1456,6 +1456,12 @@ zip = new webodfcore.Zip(url, function (err, zipobject) { zip = zipobject; if (err) { + // A document that was read whole is not read again as a + // flat xml because a late answer says it failed: the + // second answer of one request would undo the first. + if (self.state === OdfContainer.DONE) { + return; + } loadFromXML(url, function (xmlerr) { if (err) { zip.error = err + "\n" + xmlerr; diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 73d436ada..65c37265f 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -598,6 +598,29 @@ odf.TextLayout = function TextLayout() { }); return meta; } + /** + * How many pages the document says it has, from the statistics its + * metadata carries, or zero where it says nothing. A text is broken into + * pages one slice at a time, so the number of pages that are drawn is not + * the number of pages of the document until the last one is broken: the + * footer of the first page would read "1 of 12" while the rest is still + * being laid out. The number the writer of the document recorded is the + * one a reader expects, and it is used until the text is broken whole. + * @param {!odf.ODFDocumentElement} odfroot + * @return {!number} + */ + function recordedPageCount(odfroot) { + var stat = odfroot.meta + ? domUtils.getDirectChild(odfroot.meta, metans, + "document-statistic") + : null, + count = stat + ? parseInt(stat.getAttributeNS(metans, "page-count"), 10) + : NaN; + return isNaN(count) || count < 1 + ? 0 + : count; + } /** * The paragraphs and the headings a box holds. * @param {!Element} box @@ -1445,6 +1468,8 @@ odf.TextLayout = function TextLayout() { /**@type{!Element}*/ behind = odfroot.body, pages = countPages(pagesDiv), + /**@type{!number}*/ + total = recordedPageCount(odfroot) || countPages(pagesDiv), /**@type{!HTMLDivElement}*/ box, /**@type{?Element}*/ @@ -1516,7 +1541,7 @@ odf.TextLayout = function TextLayout() { // two lines where one was asked for grows into the margin // rather than being cut. box.style.minHeight = dims.header.height + "px"; - fillPageArea(odfroot, header, box, n + 1, pages, meta); + fillPageArea(odfroot, header, box, n + 1, total, meta); pagesDiv.appendChild(box); drawn.push(box); } @@ -1531,7 +1556,7 @@ odf.TextLayout = function TextLayout() { box.style.top = (top + dims.pageHeight - dims.marginBottom + dims.footer.gap) + "px"; box.style.minHeight = dims.footer.height + "px"; - fillPageArea(odfroot, footer, box, n + 1, pages, meta); + fillPageArea(odfroot, footer, box, n + 1, total, meta); pagesDiv.appendChild(box); drawn.push(box); } @@ -1609,12 +1634,23 @@ odf.TextLayout = function TextLayout() { breakCache[key] = false; return false; } + /** + * The prefixes of the document, written as the head of a sheet of styles. + * @return {!string} + */ + function namespaceRules() { + var text = ""; + odf.Namespaces.forEachPrefix(function (prefix, ns) { + text += "@namespace " + prefix + " url(" + ns + ");\n"; + }); + return text + "@namespace webodfhelper url(" + webodfhelperns + ");\n"; + } /** * The sheet of styles the layout writes its own rules in. * - * The text is broken into columns by rules that are of the reader and - * not of the document, so they are kept in a sheet of their own, made - * once and written anew at each layout. + * The text is broken into pages by rules that are of the reader and not + * of the document, so they are kept in a sheet of their own, made once + * and written anew at each layout. * @param {!Document} doc * @return {!CSSStyleSheet} */ @@ -1625,12 +1661,32 @@ odf.TextLayout = function TextLayout() { "style"); element.id = "webodf-pageStyles"; /**@type{!HTMLStyleElement}*/(element).type = "text/css"; + // The prefixes are written in the sheet itself and not put in it + // by "insertRule": gecko parses a rule that names a prefix + // against the prefixes the sheet was written with, and threw + // "SyntaxError" on every selector of the layout, so no page was + // ever drawn in firefox. + element.appendChild(doc.createTextNode(namespaceRules())); doc.head.appendChild(element); } return /**@type{!CSSStyleSheet}*/( /**@type{!HTMLStyleElement}*/(element).sheet ); } + /** + * Drop the rules the layout wrote before, and keep the prefixes the sheet + * was written with, which are the first rules of it. + * @param {!CSSStyleSheet} sheet + * @return {undefined} + */ + function clearOwnRules(sheet) { + var i; + for (i = sheet.cssRules.length - 1; i >= 0; i -= 1) { + if (sheet.cssRules[i].type !== 10) { + sheet.deleteRule(i); + } + } + } /** * How many columns a box of columns holds. * @@ -1759,18 +1815,8 @@ odf.TextLayout = function TextLayout() { /**@type{!number}*/ round = 0, /**@type{!number}*/ - first = 0, - /**@type{!number}*/ - i; - for (i = sheet.cssRules.length - 1; i >= 0; i -= 1) { - sheet.deleteRule(i); - } - odf.Namespaces.forEachPrefix(function (prefix, ns) { - sheet.insertRule("@namespace " + prefix + " url(" + ns + ");", - sheet.cssRules.length); - }); - sheet.insertRule("@namespace webodfhelper url(" + webodfhelperns - + ");", sheet.cssRules.length); + first = 0; + clearOwnRules(sheet); // The runs stand beside one another, and the text no longer holds // the height of a page: each run holds its own. // The runs stand beside one another on one line, so neither the @@ -2458,18 +2504,8 @@ odf.TextLayout = function TextLayout() { /**@type{!DocumentFragment}*/ store = doc.createDocumentFragment(), /**@type{!Array.}*/ - waiting = [], - /**@type{!number}*/ - i; - for (i = sheet.cssRules.length - 1; i >= 0; i -= 1) { - sheet.deleteRule(i); - } - odf.Namespaces.forEachPrefix(function (prefix, ns) { - sheet.insertRule("@namespace " + prefix + " url(" + ns + ");", - sheet.cssRules.length); - }); - sheet.insertRule("@namespace webodfhelper url(" + webodfhelperns - + ");", sheet.cssRules.length); + waiting = []; + clearOwnRules(sheet); sheet.insertRule("office|text {width:auto;margin:0;padding:0;" + "position:relative;}", sheet.cssRules.length); sheet.insertRule(".webodf-pageBox {overflow:hidden;}", diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 989120fb5..7cbea7767 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -656,7 +656,9 @@ function BrowserRuntime() { * @return {undefined} */ function readFile(path, encoding, callback) { - var /**@type{!XMLHttpRequest}*/ xhr; + var /**@type{!XMLHttpRequest}*/ xhr, + /**@type{!boolean}*/ + answered; // A document that is already in memory is handed over as a data url, // which no request reaches: an add-on that reads an attachment, or a // page that made the document itself, names it that way. @@ -665,9 +667,15 @@ function BrowserRuntime() { return; } xhr = createXHR(path, encoding, true); + // A request answers once. Gecko raises the event of the last state + // more than once when a request is taken up again under it, and the + // second answer, an error, undid the first: a document that was read + // whole was then read as if it were broken. + answered = false; function handleResult() { var r; - if (xhr.readyState === 4) { + if (xhr.readyState === 4 && !answered) { + answered = true; r = handleXHRResult(path, encoding, xhr); callback(r.err, r.data); } @@ -676,7 +684,10 @@ function BrowserRuntime() { try { xhr.send(null); } catch (/**@type{!Error}*/e) { - callback(e.message, null); + if (!answered) { + answered = true; + callback(e.message, null); + } } } /** @@ -795,9 +806,12 @@ function BrowserRuntime() { * @return {undefined} */ function loadXML(path, callback) { - var xhr = new XMLHttpRequest(); + var xhr = new XMLHttpRequest(), + /**@type{!boolean}*/ + answered = false; function handleResult() { - if (xhr.readyState === 4) { + if (xhr.readyState === 4 && !answered) { + answered = true; if (xhr.status === 0 && !xhr.responseText) { callback("File " + path + " is empty.", null); } else if (xhr.status === 200 || xhr.status === 0) { @@ -817,7 +831,10 @@ function BrowserRuntime() { try { xhr.send(null); } catch (/**@type{!Error}*/e) { - callback(e.message, null); + if (!answered) { + answered = true; + callback(e.message, null); + } } } this.readFile = readFile; From 46e0674f9e7a23b867ebe863a84ba251bb57e42c Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 250/385] Set the lines of a header at the height of what is written in them. --- webodf/lib/odf/TextLayout.js | 24 +++++++++++++++++++----- webodf/webodf.css | 7 +++++++ 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 4c924c838..c9f9c1b02 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -945,6 +945,12 @@ odf.TextLayout = function TextLayout() { line = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "div")); line.style.position = "relative"; paragraph.appendChild(line); + // The line of the paragraph holds its own height from here on: the + // zero width space that keeps an empty paragraph from collapsing + // would add a line of the size of the style of the paragraph, and a + // footer of eight points would stand ten points apart. + paragraph.setAttributeNS(webodfhelperns, "webodfhelper:laidout", + "true"); parts.forEach(function (piece, index) { var /**@type{?odf.TextLayout.TabStop}*/ stop = index === 0 ? null : stops[index - 1]; @@ -966,11 +972,7 @@ odf.TextLayout = function TextLayout() { } line.appendChild(piece); }); - // The parts are laid over one another, so the line keeps the height of - // one of them: a part of its own holds the line open. - part = /**@type{!HTMLElement}*/(doc.createElementNS(htmlns, "span")); - part.textContent = "\u00a0"; - line.appendChild(part); + } /** * Push the parts of the lines apart where they would be written over. @@ -1020,6 +1022,18 @@ odf.TextLayout = function TextLayout() { return piece.getBoundingClientRect(); })); }); + // Every part of a line is laid at a place of its own and none of them + // holds the line open, so the line is given the height of the tallest + // one: a line of a footer written in eight points is eight points + // tall, and not the ten points of the style of its paragraph. + rects.forEach(function (found, l) { + var /**@type{!number}*/ + tall = 0; + found.forEach(function (rect) { + tall = Math.max(tall, rect.height); + }); + boxOf[l].style.height = tall + "px"; + }); lines.forEach(function (pieces, l) { var /**@type{!number}*/ edge = 0, diff --git a/webodf/webodf.css b/webodf/webodf.css index d7543eb65..7321cda4f 100644 --- a/webodf/webodf.css +++ b/webodf/webodf.css @@ -87,6 +87,13 @@ text|p::after, text|h::after { white-space: pre; } +/* A line of a header or of a footer laid against its tab stops holds its + own height, see "TextLayout.js": the space above would add a line of the + size of the style of the paragraph to it. */ +text|p[webodfhelper|laidout]::after, text|h[webodfhelper|laidout]::after { + content: none; +} + *[webodfhelper|containsparagraphanchor] { position: relative; } From 013e46857fec8012c865820c4590689841c43511 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 251/385] Added output for linux archive and packages. --- .../opendocumentviewer-desktop/CMakeLists.txt | 28 ++- .../data/copy-packages.cmake | 12 + .../data/org.webodf.OpenDocumentViewer.yml.in | 28 +++ .../packaging.cmake | 215 ++++++++++++++++++ 4 files changed, 274 insertions(+), 9 deletions(-) create mode 100644 programs/opendocumentviewer-desktop/data/copy-packages.cmake create mode 100644 programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.yml.in create mode 100644 programs/opendocumentviewer-desktop/packaging.cmake diff --git a/programs/opendocumentviewer-desktop/CMakeLists.txt b/programs/opendocumentviewer-desktop/CMakeLists.txt index cc5a7e9dd..e217fa5af 100644 --- a/programs/opendocumentviewer-desktop/CMakeLists.txt +++ b/programs/opendocumentviewer-desktop/CMakeLists.txt @@ -176,12 +176,22 @@ endif () # The libraries of qt are gathered beside the program by the tool of the # platform, "windeployqt" on windows and "macdeployqt" on macos, so that -# "cmake --install" writes a directory that runs on a machine without qt. On -# linux the program is installed among the files of the system, that carry -# them, and the tool does not exist: the script is then empty. -qt_generate_deploy_app_script( - TARGET opendocumentviewer-desktop - OUTPUT_SCRIPT OPENDOCUMENTVIEWER_DEPLOY - NO_UNSUPPORTED_PLATFORM_ERROR -) -install(SCRIPT ${OPENDOCUMENTVIEWER_DEPLOY}) +# "cmake --install" writes a directory that runs on a machine without qt. +# +# On linux the program is installed among the files of the system, that carry +# qt already, and a package of the system names them, see "packaging.cmake": +# the tool would only write a "qt.conf" that points the program at a prefix of +# its own, which is wrong once the program is installed in "/usr". What runs +# without the qt of the system is a universal package, that carries it. +if (WIN32 OR APPLE) + qt_generate_deploy_app_script( + TARGET opendocumentviewer-desktop + OUTPUT_SCRIPT OPENDOCUMENTVIEWER_DEPLOY + NO_UNSUPPORTED_PLATFORM_ERROR + ) + install(SCRIPT ${OPENDOCUMENTVIEWER_DEPLOY}) +endif () + +# The archives, the packages and the universal packages of the viewer. +include(${CMAKE_CURRENT_SOURCE_DIR}/packaging.cmake) + diff --git a/programs/opendocumentviewer-desktop/data/copy-packages.cmake b/programs/opendocumentviewer-desktop/data/copy-packages.cmake new file mode 100644 index 000000000..3816d12f9 --- /dev/null +++ b/programs/opendocumentviewer-desktop/data/copy-packages.cmake @@ -0,0 +1,12 @@ +# Copy the packages CPack wrote into the products of the build. The name of a +# package is settled by CPack itself, so it is looked for rather than written +# again here, and what CPack leaves beside it is left where it is. +file(GLOB PACKAGES "${DIR}/*.${EXT}") +if (NOT PACKAGES) + message(FATAL_ERROR "No package of the kind ${EXT} was written in ${DIR}.") +endif () +file(MAKE_DIRECTORY "${DEST}") +foreach (PACKAGE ${PACKAGES}) + file(COPY "${PACKAGE}" DESTINATION "${DEST}") + message("Wrote ${PACKAGE}") +endforeach () diff --git a/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.yml.in b/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.yml.in new file mode 100644 index 000000000..342033501 --- /dev/null +++ b/programs/opendocumentviewer-desktop/data/org.webodf.OpenDocumentViewer.yml.in @@ -0,0 +1,28 @@ +# The manifest of the flatpak of the viewer of OpenDocument. The runtime of +# KDE carries qt and its webengine, so nothing of qt is built here: the viewer +# alone is, from the sources of this tree. +# +# The sandbox is given what a reader of documents needs and no more: a window, +# and the files the reader opens by the portal of the desktop. It reaches no +# network, as a document is drawn on the machine and nothing of it is sent. +app-id: org.webodf.OpenDocumentViewer +runtime: org.kde.Platform +runtime-version: '6.8' +sdk: org.kde.Sdk +command: opendocumentviewer-desktop +finish-args: + - --share=ipc + - --socket=wayland + - --socket=fallback-x11 + - --device=dri + - --filesystem=xdg-documents + - --filesystem=xdg-download +modules: + - name: opendocumentviewer + buildsystem: cmake-ninja + config-opts: + - -DCMAKE_BUILD_TYPE=Release + - -DWEBODF_DESKTOP=ON + sources: + - type: dir + path: '@CMAKE_SOURCE_DIR@' diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake new file mode 100644 index 000000000..c0fe70ccf --- /dev/null +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -0,0 +1,215 @@ +# Copyright (C) 2026 Daniel Berthereau +# +# @licstart +# This file is part of WebODF. +# +# WebODF is free software: you can redistribute it and/or modify it under the +# terms of the GNU Affero General Public License (GNU AGPL) as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# WebODF is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License +# along with WebODF. If not, see . +# @licend +# +# @source: http://www.webodf.org/ +# @source: https://github.com/kogmbh/WebODF/ + +# The ways the viewer of the desktop is handed over, from the shortest to the +# most finished: +# +# * an archive, that is unpacked by hand and reads the qt of the machine; +# * a package, "deb" or "rpm", that a system installs and keeps up to date, +# and that names the qt it needs rather than carrying it; +# * a universal package, an AppImage or a flatpak, that carries qt itself and +# runs on any distribution. +# +# Each one is a target of its own, and "packages" makes the ones the tools of +# the machine allow. The tools are looked for rather than required: a machine +# that has none still builds the viewer. + +set(VIEWER_STAGE ${CMAKE_CURRENT_BINARY_DIR}/stage) +set(VIEWER_PRODUCTS ${CMAKE_BINARY_DIR}/products) +set(VIEWER_ID org.webodf.OpenDocumentViewer) + +# The version of a package is read by a machine, so it holds numbers alone: +# "0.5.10-274-gabc1234" of git becomes "0.5.10.274". +string(REGEX MATCH "^[0-9]+\\.[0-9]+\\.[0-9]+" VIEWER_VERSION ${WEBODF_VERSION}) +if (NOT VIEWER_VERSION) + set(VIEWER_VERSION "0.0.0") +endif () +string(REGEX MATCH "-([0-9]+)-g" VIEWER_COMMITS ${WEBODF_VERSION}) +if (CMAKE_MATCH_1) + set(VIEWER_VERSION "${VIEWER_VERSION}.${CMAKE_MATCH_1}") +endif () + +if (CMAKE_SYSTEM_PROCESSOR) + set(VIEWER_ARCH ${CMAKE_SYSTEM_PROCESSOR}) +else () + set(VIEWER_ARCH "x86_64") +endif () + +if (WIN32) + set(VIEWER_ARCHIVE + ${VIEWER_PRODUCTS}/opendocumentviewer-${WEBODF_VERSION}-windows-${VIEWER_ARCH}.zip) + set(VIEWER_ARCHIVE_FORMAT --format=zip) +elseif (APPLE) + set(VIEWER_ARCHIVE + ${VIEWER_PRODUCTS}/opendocumentviewer-${WEBODF_VERSION}-macos-${VIEWER_ARCH}.tar.gz) + set(VIEWER_ARCHIVE_FORMAT "") +else () + set(VIEWER_ARCHIVE + ${VIEWER_PRODUCTS}/opendocumentviewer-${WEBODF_VERSION}-linux-${VIEWER_ARCH}.tar.gz) + set(VIEWER_ARCHIVE_FORMAT "") +endif () + +# The archive holds what "cmake --install" writes: the program, the entry of +# the menu and the icon, and beside them the libraries of qt on the systems +# whose tool gathers them. +add_custom_target(package-archive + COMMAND ${CMAKE_COMMAND} -E rm -rf ${VIEWER_STAGE} + COMMAND ${CMAKE_COMMAND} -E make_directory ${VIEWER_PRODUCTS} + COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} + --prefix ${VIEWER_STAGE} + COMMAND ${CMAKE_COMMAND} -E chdir ${VIEWER_STAGE} + ${CMAKE_COMMAND} -E tar czf ${VIEWER_ARCHIVE} ${VIEWER_ARCHIVE_FORMAT} . + COMMAND ${CMAKE_COMMAND} -E echo "Wrote ${VIEWER_ARCHIVE}" + DEPENDS opendocumentviewer-desktop + COMMENT "The archive of the viewer of the desktop") + +# A package of a system, that names the qt it needs rather than carrying it. +# CPack writes it from the same "install" rules as everything else. +set(CPACK_PACKAGE_NAME "opendocumentviewer") +set(CPACK_PACKAGE_VERSION ${VIEWER_VERSION}) +set(CPACK_PACKAGE_DESCRIPTION_SUMMARY + "A reader of the OpenDocument format, that draws a document as it is printed") +set(CPACK_PACKAGE_VENDOR "webodf.org") +set(CPACK_PACKAGE_CONTACT "webodf@nlnet.nl") +set(CPACK_PACKAGE_HOMEPAGE_URL "https://webodf.org/") +set(CPACK_PACKAGE_FILE_NAME + "opendocumentviewer-${WEBODF_VERSION}-${VIEWER_ARCH}") +# CPack leaves a directory of its own beside what it writes, so it writes +# aside and the package alone is copied among the products. +set(VIEWER_CPACK_DIR ${CMAKE_CURRENT_BINARY_DIR}/packages) +set(CPACK_PACKAGE_DIRECTORY ${VIEWER_CPACK_DIR}) +set(CPACK_RESOURCE_FILE_LICENSE ${CMAKE_SOURCE_DIR}/AGPL-3.0.txt) +set(CPACK_STRIP_FILES TRUE) +# The names of the packages of Debian and of Fedora for the same libraries. +set(CPACK_DEBIAN_PACKAGE_SECTION "text") +set(CPACK_DEBIAN_PACKAGE_DEPENDS + "libqt6core6, libqt6gui6, libqt6widgets6, libqt6webenginewidgets6, libqt6webenginecore6") +set(CPACK_RPM_PACKAGE_LICENSE "AGPL-3.0") +set(CPACK_RPM_PACKAGE_GROUP "Applications/Publishing") +set(CPACK_RPM_PACKAGE_REQUIRES "qt6-qtbase, qt6-qtwebengine") +include(CPack) + +find_program(DPKG_DEB dpkg-deb) +if (DPKG_DEB) + add_custom_target(package-deb + COMMAND ${CMAKE_COMMAND} -E make_directory ${VIEWER_PRODUCTS} + COMMAND ${CMAKE_CPACK_COMMAND} -G DEB + --config ${CMAKE_BINARY_DIR}/CPackConfig.cmake + COMMAND ${CMAKE_COMMAND} -DDIR=${VIEWER_CPACK_DIR} + -DDEST=${VIEWER_PRODUCTS} -DEXT=deb + -P ${CMAKE_CURRENT_SOURCE_DIR}/data/copy-packages.cmake + DEPENDS opendocumentviewer-desktop + COMMENT "The package of debian of the viewer of the desktop") +endif () + +find_program(RPMBUILD rpmbuild) +if (RPMBUILD) + add_custom_target(package-rpm + COMMAND ${CMAKE_COMMAND} -E make_directory ${VIEWER_PRODUCTS} + COMMAND ${CMAKE_CPACK_COMMAND} -G RPM + --config ${CMAKE_BINARY_DIR}/CPackConfig.cmake + COMMAND ${CMAKE_COMMAND} -DDIR=${VIEWER_CPACK_DIR} + -DDEST=${VIEWER_PRODUCTS} -DEXT=rpm + -P ${CMAKE_CURRENT_SOURCE_DIR}/data/copy-packages.cmake + DEPENDS opendocumentviewer-desktop + COMMENT "The package of fedora of the viewer of the desktop") +endif () + +# A universal package carries qt with it and runs on any distribution, where a +# package of a system names the qt of that system. Two of them are made, as +# neither is the one everyone has: an AppImage is one file that is run as it +# is, a flatpak is installed from a repository and runs in a sandbox. +if (UNIX AND NOT APPLE) + set(VIEWER_APPDIR ${CMAKE_CURRENT_BINARY_DIR}/AppDir) + set(VIEWER_APPIMAGE + ${VIEWER_PRODUCTS}/OpenDocumentViewer-${WEBODF_VERSION}-${VIEWER_ARCH}.AppImage) + + # The tool of the AppImage gathers the libraries an executable reads, and + # the one of qt gathers what the webengine reads beside them, the + # process of the engine among the rest. + find_program(LINUXDEPLOY linuxdeploy) + find_program(LINUXDEPLOY_QT linuxdeploy-plugin-qt) + find_program(APPIMAGETOOL appimagetool) + + if (LINUXDEPLOY) + add_custom_target(package-appimage + COMMAND ${CMAKE_COMMAND} -E rm -rf ${VIEWER_APPDIR} + COMMAND ${CMAKE_COMMAND} -E make_directory ${VIEWER_PRODUCTS} + COMMAND ${CMAKE_COMMAND} --install ${CMAKE_BINARY_DIR} + --prefix ${VIEWER_APPDIR}/usr + COMMAND ${CMAKE_COMMAND} -E env + OUTPUT=${VIEWER_APPIMAGE} + QMAKE=${QT_QMAKE_EXECUTABLE} + ${LINUXDEPLOY} --appdir ${VIEWER_APPDIR} + --plugin qt --output appimage + COMMAND ${CMAKE_COMMAND} -E echo "Wrote ${VIEWER_APPIMAGE}" + DEPENDS opendocumentviewer-desktop + COMMENT "The AppImage of the viewer of the desktop") + else () + add_custom_target(package-appimage + COMMAND ${CMAKE_COMMAND} -E echo + "linuxdeploy is not installed: an AppImage carries qt with it, and the tool is what gathers it, see https://github.com/linuxdeploy/linuxdeploy" + COMMAND ${CMAKE_COMMAND} -E false + COMMENT "The AppImage of the viewer of the desktop") + endif () + + # The manifest of the flatpak names the runtime of qt, so nothing of qt is + # built here: the tool reads it and writes the package. + configure_file(data/org.webodf.OpenDocumentViewer.yml.in + ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_ID}.yml @ONLY) + find_program(FLATPAK_BUILDER flatpak-builder) + if (FLATPAK_BUILDER) + add_custom_target(package-flatpak + COMMAND ${CMAKE_COMMAND} -E make_directory ${VIEWER_PRODUCTS} + COMMAND ${FLATPAK_BUILDER} --force-clean --repo=${CMAKE_CURRENT_BINARY_DIR}/flatpak-repo + ${CMAKE_CURRENT_BINARY_DIR}/flatpak-build + ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_ID}.yml + COMMAND ${FLATPAK_BUILDER} --run + ${CMAKE_CURRENT_BINARY_DIR}/flatpak-build + ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_ID}.yml true + COMMAND flatpak build-bundle ${CMAKE_CURRENT_BINARY_DIR}/flatpak-repo + ${VIEWER_PRODUCTS}/${VIEWER_ID}-${WEBODF_VERSION}.flatpak ${VIEWER_ID} + DEPENDS opendocumentviewer-desktop + COMMENT "The flatpak of the viewer of the desktop") + else () + add_custom_target(package-flatpak + COMMAND ${CMAKE_COMMAND} -E echo + "flatpak-builder is not installed: the manifest is written in ${CMAKE_CURRENT_BINARY_DIR}/${VIEWER_ID}.yml, see https://docs.flatpak.org/" + COMMAND ${CMAKE_COMMAND} -E false + COMMENT "The flatpak of the viewer of the desktop") + endif () +endif () + +# Every way of handing the viewer over that the tools of this machine allow. +add_custom_target(packages DEPENDS package-archive) +if (TARGET package-deb) + add_dependencies(packages package-deb) +endif () +if (TARGET package-rpm) + add_dependencies(packages package-rpm) +endif () +if (LINUXDEPLOY) + add_dependencies(packages package-appimage) +endif () +if (FLATPAK_BUILDER) + add_dependencies(packages package-flatpak) +endif () From 317abf3e20cf5c880194b3ac5e7720a08e4702b6 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 252/385] Reordered documents in contextuel menu of thunderbird. --- .../background-thunderbird.js | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/programs/opendocumentviewer-webext/background-thunderbird.js b/programs/opendocumentviewer-webext/background-thunderbird.js index 5c0780be5..0e329f1ba 100644 --- a/programs/opendocumentviewer-webext/background-thunderbird.js +++ b/programs/opendocumentviewer-webext/background-thunderbird.js @@ -200,6 +200,38 @@ } /** + * Where a part of a message stands in it, as a list of numbers: the name + * of a part is written "1.2", "1.10", and the two are read as numbers so + * that the tenth part comes after the second one and not before it. + * @param {!Object} attachment + * @return {!Array.} + */ + function partNumbers(attachment) { + return String(attachment.partName || "").split(".").map(Number); + } + + /** + * @param {!Object} a + * @param {!Object} b + * @return {!number} + */ + function byPart(a, b) { + var left = partNumbers(a), + right = partNumbers(b), + i; + for (i = 0; i < left.length && i < right.length; i += 1) { + if (left[i] !== right[i]) { + return left[i] - right[i]; + } + } + return left.length - right.length; + } + + /** + * The documents a message carries, in the order the message carries them. + * The list the mail answers with follows no order of its own, so it is put + * back in the order of the parts, which is the order the attachments are + * shown in. * @param {!Array.} attachments * @return {!Array.} */ @@ -210,6 +242,7 @@ found.push(attachments[i]); } } + found.sort(byPart); return found; } From aa07e90ccd234683d92b16c15da5e0deaea34255 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 253/385] Drawn a table wider than the page to the width of the text. --- webodf/lib/odf/Style2CSS.js | 5 ++++ webodf/lib/odf/TextLayout.js | 44 ++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index fb02b9166..ab67f2e14 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -1085,6 +1085,11 @@ odf.Style2CSS = function Style2CSS() { || props.hasAttributeNS(stylens, 'rel-width'))) { rule += 'table-layout:fixed;'; } + // A table wider than the text of the page is drawn to the width of + // the text, its columns narrowed by as much, as an office draws it: + // a table written for a page of another size would otherwise run + // into the margin and be cut off at the edge of the paper. + rule += 'max-width:100%;'; borderModel = props.getAttributeNS(tablens, 'border-model'); if (borderModel === 'collapsing') { diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 445dbe11f..3417a242b 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2749,6 +2749,31 @@ odf.TextLayout = function TextLayout() { - (parseFloat(/**@type{!HTMLElement}*/(box).style.paddingRight) || 0); } + /** + * Draw a table that is wider than the text to the width of the text. + * + * A table is written at the width it had on the page it was written for, + * and a page of another size is narrower: the table is marked, and the + * rule of the mark shares the width of the text between its columns. + * @param {!Element} box the page + * @return {undefined} + */ + function fitTables(box) { + var found = box.getElementsByTagNameNS(tablens, "table"), + /**@type{!number}*/ + side = rightEdgeOf(box), + /**@type{!Element}*/ + table, + /**@type{!number}*/ + i; + for (i = 0; i < found.length; i += 1) { + table = /**@type{!Element}*/(found.item(i)); + if (table.getBoundingClientRect().right > side + 1) { + table.setAttributeNS(webodfhelperns, "webodfhelper:wide", + "true"); + } + } + } /** * Take the notes of the foot of a page away, and the room they took. * @param {!Element} box the page @@ -3649,6 +3674,11 @@ odf.TextLayout = function TextLayout() { box.removeChild(keeper); keeper = box.lastElementChild; } + // A table written for a page of another size is drawn to the width + // of the text of this one before the notes are drawn: it is taller + // for being narrower, and what it pushes past the end of the page is + // moved to the page that follows. + fitTables(box); // The notes called for on the page are drawn at the foot of it, and // the text of the page is that much shorter: what no longer fits is // moved to the page that follows when the pages are set right, see @@ -3703,6 +3733,19 @@ odf.TextLayout = function TextLayout() { clearOwnRules(sheet); sheet.insertRule("office|text {width:auto;margin:0;padding:0;" + "position:relative;}", sheet.cssRules.length); + // A table wider than the text of the page is drawn to the width of + // the text: the widths its columns were written at are dropped and + // the browser shares the width of the text between them, as an + // office does with a table written for a page of another size. + sheet.insertRule("table|table[webodfhelper|wide] {table-layout:auto;" + + "width:100%;max-width:100%;}", sheet.cssRules.length); + // A word longer than its column — the name of an element of the + // standard, that holds no blank — is broken across two lines rather + // than pushing the column wider than the text of the page, as an + // office breaks it. + sheet.insertRule("table|table[webodfhelper|wide] table|table-cell *" + + " {overflow-wrap:break-word;word-break:break-all;}", + sheet.cssRules.length); // A page holds what it holds and is of the size the plan gives it: // the browser is told so, so that a page that is filled is laid out // on its own and not with the pages that went before it. Without it @@ -3901,6 +3944,7 @@ odf.TextLayout = function TextLayout() { lines, /**@type{!number}*/ n; + fitTables(box); // The notes are drawn before the page is read: they take the // foot of the page, so what they push past the end of it is what // is moved to the page that follows, notes and all. From 8c6da7b25818cc782d806da4dd00322d9894aab9 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 254/385] Named the types the strict check asks for in the sheet of the layout. --- webodf/lib/odf/TextLayout.js | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 65c37265f..16acb35ea 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -1639,7 +1639,8 @@ odf.TextLayout = function TextLayout() { * @return {!string} */ function namespaceRules() { - var text = ""; + var /**@type{!string}*/ + text = ""; odf.Namespaces.forEachPrefix(function (prefix, ns) { text += "@namespace " + prefix + " url(" + ns + ");\n"; }); @@ -1680,9 +1681,15 @@ odf.TextLayout = function TextLayout() { * @return {undefined} */ function clearOwnRules(sheet) { - var i; + var /**@type{!number}*/ + i, + /**@type{!CSSRule}*/ + rule; for (i = sheet.cssRules.length - 1; i >= 0; i -= 1) { - if (sheet.cssRules[i].type !== 10) { + rule = /**@type{!CSSRule}*/(sheet.cssRules.item(i)); + // A rule of a prefix, "CSSRule.NAMESPACE_RULE", is of the sheet + // itself and is kept: only what a layout wrote is dropped. + if (rule.type !== 10) { sheet.deleteRule(i); } } From f72be87de69494997d0a1943bd8d7a0d70b44a03 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 255/385] Placed a table where the document sets it between the margins. --- webodf/lib/odf/Style2CSS.js | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index 2852a37a0..7e2f46eb3 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -1026,14 +1026,30 @@ odf.Style2CSS = function Style2CSS() { * @return {string} */ function getTableProperties(props) { - var rule = '', borderModel; + var rule = '', borderModel, align; rule += applySimpleMapping(props, tablePropertySimpleMapping); + // Where the table stands between the margins of the page, as + // "table:align" says. A table set against the margins takes the + // width of the text and not the width its style writes, which is + // the width it had when it was written; one that stands on a side + // or in the middle keeps its width and is moved by its margins. + align = props.getAttributeNS(tablens, 'align'); + if (align === 'margins') { + rule += 'width:100%;'; + } else if (align === 'center') { + rule += 'margin-left:auto;margin-right:auto;'; + } else if (align === 'right') { + rule += 'margin-left:auto;margin-right:0;'; + } else if (align === 'left') { + rule += 'margin-left:0;margin-right:auto;'; + } // A table of a width the document wrote keeps that width: the // browser lays a table out from what is written in it unless it is // told otherwise, and a long address in a cell made the table wider // than the page, with a bar to scroll under it. - if (props.hasAttributeNS(stylens, 'width') - || props.hasAttributeNS(stylens, 'rel-width')) { + if (align !== 'margins' + && (props.hasAttributeNS(stylens, 'width') + || props.hasAttributeNS(stylens, 'rel-width'))) { rule += 'table-layout:fixed;'; } borderModel = props.getAttributeNS(tablens, 'border-model'); From df9da243cb63adc3934d11cab514f48ebce5822b Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 256/385] Skipped output while while a document is being read. --- webodf/lib/odf/OdfCanvas.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index cf37745b5..9e3e1f5ce 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -4072,17 +4072,17 @@ if (odfcontainer.state === odf.OdfContainer.DONE) { callback(); } else { - // so the ODF is not done yet. take care that we'll - // do the work once it is done: - - // FIXME: use callback registry instead of replacing the onchange - runtime.log("WARNING: refreshOdf called but ODF was not DONE."); - + // The document is still being read, which is the ordinary + // course of things for a document of some size: the drawing + // waits for it and asks again, without a word, as a wait is not + // a fault. Only a document that never comes is told of. waitingForDoneTimeoutId = runtime.setTimeout(function later_cb() { if (odfcontainer.state === odf.OdfContainer.DONE) { callback(); + } else if (odfcontainer.state === odf.OdfContainer.INVALID) { + runtime.log("The document was not read: it is not an " + + "OpenDocument, or it is broken."); } else { - runtime.log("will be back later..."); waitingForDoneTimeoutId = runtime.setTimeout(later_cb, 500); } }, 100); From e181f2ba0f9c33b35cf83830eaa6d03696e5d5d4 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 257/385] Written the numbers of the lists and of the headings again as they change. --- webodf/lib/gui/SessionView.js | 26 +++++++++++++++++++++++++- webodf/lib/odf/ListStylesToCss.js | 17 +++++++++++++++++ webodf/lib/odf/OdfCanvas.js | 30 ++++++++++++++++++++++++++---- 3 files changed, 68 insertions(+), 5 deletions(-) diff --git a/webodf/lib/gui/SessionView.js b/webodf/lib/gui/SessionView.js index 839502362..a7171f4f7 100644 --- a/webodf/lib/gui/SessionView.js +++ b/webodf/lib/gui/SessionView.js @@ -92,6 +92,8 @@ gui.SessionViewOptions = function () { odfCanvas, /**@type{!webodfcore.ScheduledTask}*/ highlightRefreshTask, + /**@type{!webodfcore.ScheduledTask}*/ + numberingRefreshTask, showEditInfoMarkers = configOption(viewOptions.editInfoMarkersInitiallyVisible, true), showCaretAvatars = configOption(viewOptions.caretAvatarsInitiallyVisible, true), blinkOnRangeSelect = configOption(viewOptions.caretBlinksOnRangeSelect, true); @@ -401,6 +403,18 @@ gui.SessionViewOptions = function () { function onParagraphChanged(info) { highlightEdit(info.paragraphElement, info.memberId, info.timeStamp); highlightRefreshTask.trigger(); + // An item added to a list, or a heading added to the text, moves + // the numbers of everything that follows it: the labels are + // written again once the edits of the moment are done, and not + // at each one of them. + numberingRefreshTask.trigger(); + } + + /** + * @return {undefined} + */ + function refreshNumbering() { + odfCanvas.refreshNumbering(); } /** @@ -453,6 +467,9 @@ gui.SessionViewOptions = function () { odtDocument.unsubscribe(ops.OdtDocument.signalParagraphChanged, selectionViewManager.rerenderSelectionViews); odtDocument.unsubscribe(ops.OdtDocument.signalTableAdded, selectionViewManager.rerenderSelectionViews); + odtDocument.unsubscribe( + ops.OdtDocument.signalParagraphStyleModified, + numberingRefreshTask.trigger); odtDocument.unsubscribe(ops.OdtDocument.signalParagraphStyleModified, selectionViewManager.rerenderSelectionViews); sessionConstraints.unsubscribe(gui.CommonConstraints.EDIT.ANNOTATIONS.ONLY_DELETE_OWN, processConstraints); @@ -482,7 +499,8 @@ gui.SessionViewOptions = function () { * @return {undefined} */ this.destroy = function (callback) { - var cleanup = [highlightRefreshTask.destroy, destroy]; + var cleanup = [highlightRefreshTask.destroy, + numberingRefreshTask.destroy, destroy]; odtDocument.unsubscribe(ops.OdtDocument.signalAnnotationAdded, onAnnotationAdded); webodfcore.Async.destroyAll(cleanup, callback); }; @@ -501,6 +519,10 @@ gui.SessionViewOptions = function () { odtDocument.subscribe(ops.OdtDocument.signalParagraphChanged, selectionViewManager.rerenderSelectionViews); odtDocument.subscribe(ops.OdtDocument.signalTableAdded, selectionViewManager.rerenderSelectionViews); + // A paragraph that is made a heading, or a heading that is made + // a paragraph, is a number more or a number less. + odtDocument.subscribe(ops.OdtDocument.signalParagraphStyleModified, + numberingRefreshTask.trigger); odtDocument.subscribe(ops.OdtDocument.signalParagraphStyleModified, selectionViewManager.rerenderSelectionViews); sessionConstraints.subscribe(gui.CommonConstraints.EDIT.ANNOTATIONS.ONLY_DELETE_OWN, processConstraints); @@ -516,6 +538,8 @@ gui.SessionViewOptions = function () { processConstraints(); highlightRefreshTask = webodfcore.Task.createRedrawTask(refreshHighlights); + numberingRefreshTask = + webodfcore.Task.createRedrawTask(refreshNumbering); } init(); }; diff --git a/webodf/lib/odf/ListStylesToCss.js b/webodf/lib/odf/ListStylesToCss.js index 97cb22727..a862bd0c5 100644 --- a/webodf/lib/odf/ListStylesToCss.js +++ b/webodf/lib/odf/ListStylesToCss.js @@ -418,6 +418,8 @@ odf.ListStyleToCss = function ListStyleToCss() { var cssUnits = new webodfcore.CSSUnits(), + /**@type{(!Object.|undefined)}*/ + lastListStyles, odfUtils = odf.OdfUtils; /** @@ -1146,6 +1148,20 @@ node = node.nextElementSibling; } } + /** + * Write the labels of the lists and of the headings again. + * + * The numbers are worked out once, as the document is drawn: an + * editor that adds an item to a list, or a heading to the text, asks + * for them to be worked out again, and only for that, as the rules + * of the styles have not changed. + * @param {!Element} odfBody + * @return {undefined} + */ + this.renumber = function (odfBody) { + numberLists(odfBody, lastListStyles); + numberHeadings(odfBody, lastListStyles); + }; /** * Creates CSS styles from the given ODF list styles and applies them to the stylesheet * @param {!CSSStyleSheet} styleSheet @@ -1171,6 +1187,7 @@ applyContentBasedStyles(styleSheet, odfBody, styleFamilyTree); numberLists(odfBody, styleFamilyTree); numberHeadings(odfBody, styleFamilyTree); + lastListStyles = styleFamilyTree; appendRule(styleSheet, 'text|h[odf-list-label]:before' + '{content: attr(odf-list-label); white-space: pre;' + 'display: inline-block;}'); diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 64077a86f..47eb43fcf 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -246,10 +246,13 @@ /** * A new styles.xml has been loaded. Update the live document with it. + * + * What wrote the labels of the lists and of the headings is answered, so + * that an editor may ask for them to be written again. * @param {!odf.OdfContainer} odfcontainer * @param {!odf.Formatting} formatting * @param {!HTMLStyleElement} stylesxmlcss - * @return {undefined} + * @return {!odf.ListStyleToCss} **/ function handleStyles(odfcontainer, formatting, stylesxmlcss) { // update the css translation of the styles @@ -272,7 +275,7 @@ styleSheet, styleTree, odfcontainer.rootElement.body); - + return list2css; } /** @@ -3541,6 +3544,8 @@ waitingForDoneTimeoutId, /**@type{!webodfcore.ScheduledTask}*/redrawContainerTask, shouldRefreshCss = false, + /**@type{?odf.ListStyleToCss}*/ + numbering = null, shouldRerenderAnnotations = false, loadingQueue = new LoadingQueue(), /** @@ -3777,7 +3782,8 @@ */ function redrawContainer() { if (shouldRefreshCss) { - handleStyles(odfcontainer, formatting, stylesxmlcss); + numbering = handleStyles(odfcontainer, formatting, + stylesxmlcss); shouldRefreshCss = false; // different styles means different layout, thus different sizes } @@ -4071,6 +4077,21 @@ drawPages(odfcontainer, odfcontainer.rootElement); } }; + /** + * Write the labels of the lists and of the headings again. + * + * The numbers are worked out as the document is drawn: an editor + * that adds an item to a list, or a heading to the text, asks for + * them to be worked out again. The rules of the styles are left + * alone, so this is the work of the labels alone. + * @return {undefined} + */ + this.refreshNumbering = function () { + if (numbering && odfcontainer + && odfcontainer.state === odf.OdfContainer.DONE) { + numbering.renumber(odfcontainer.rootElement.body); + } + }; /** * How many pages stand side by side on a row, see "TextLayout.js". * @param {!number} pages @@ -4271,7 +4292,8 @@ formatting.setOdfContainer(odfcontainer); handleFonts(odfcontainer, fontcss); - handleStyles(odfcontainer, formatting, stylesxmlcss); + numbering = handleStyles(odfcontainer, formatting, + stylesxmlcss); // do content last, because otherwise the document is constantly // updated whenever the css changes handleContent(odfcontainer, odfnode); From f55a6028f5d8f15acf4ff5e5cbcdc6fbacccdd92 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 258/385] Read the style a paragraph names once, not once for every paragraph. --- webodf/lib/odf/TextLayout.js | 56 ++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 68ffbfa06..b196260c3 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -35,6 +35,12 @@ odf.TextLayout = function TextLayout() { styleCache = {}, /**@type{!Object.}*/ breakCache = {}, + /** + * The master page a style of a paragraph begins, by the name of the + * style: read once, and dropped with the styles themselves. + * @type{!Object.} + */ + masterCache = {}, domUtils = webodfcore.DomUtils, odfUtils = odf.OdfUtils, fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", @@ -280,6 +286,7 @@ odf.TextLayout = function TextLayout() { styleCacheRoot = odfroot; styleCache = {}; breakCache = {}; + masterCache = {}; } if (styleCache.hasOwnProperty(key)) { return styleCache[key]; @@ -1191,39 +1198,32 @@ odf.TextLayout = function TextLayout() { function masterPageOfParagraph(odfroot, paragraph) { var /**@type{!string}*/ name = paragraph.getAttributeNS(textns, "style-name") || "", - /**@type{!Array.}*/ - roots = [odfroot.automaticStyles, odfroot.styles], - /**@type{!NodeList}*/ - styles, - /**@type{!Element}*/ - candidate, /**@type{?Element}*/ - style = null, + style, /**@type{!string}*/ - master = "", - /**@type{!number}*/ - i, - /**@type{!number}*/ - r; + master = ""; if (name === "") { return null; } - for (r = 0; r < roots.length && style === null; r += 1) { - styles = roots[r].getElementsByTagNameNS(stylens, "style"); - for (i = 0; i < styles.length && style === null; i += 1) { - candidate = /**@type{!Element}*/(styles.item(i)); - if (candidate.getAttributeNS(stylens, "name") === name - && candidate.getAttributeNS(stylens, "family") - === "paragraph") { - style = candidate; - } - } - } - if (style === null) { - return null; - } - master = style.getAttributeNS(stylens, "master-page-name") || ""; - return master === "" ? null : masterPageNamed(odfroot, master); + // A document holds a handful of styles for thousands of paragraphs, + // and each paragraph is read: the style of a name is read once and + // kept beside the styles themselves, as the breaks are, rather than + // read again out of all the styles of the document for every + // paragraph that names it. + if (styleCacheRoot === odfroot && masterCache.hasOwnProperty(name)) { + return masterCache[name]; + } + style = styleOf(odfroot, name, "paragraph"); + if (!style && plainStyleName(name) !== name) { + style = styleOf(odfroot, plainStyleName(name), "paragraph"); + } + if (style) { + master = style.getAttributeNS(stylens, "master-page-name") || ""; + } + masterCache[name] = master === "" + ? null + : masterPageNamed(odfroot, master); + return masterCache[name]; } /** * The master pages a text goes through, in the order it goes through them, From 5e998cb15c203018347f71efffab99aac980922a Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 259/385] Read the columns of a table as the table and not as its content. --- webodf/lib/odf/TextLayout.js | 88 +++++++++++++++++++++++++++++++++++- 1 file changed, 86 insertions(+), 2 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 16acb35ea..9da2374a3 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -1563,6 +1563,28 @@ odf.TextLayout = function TextLayout() { } spreadLines(drawn); } + /** + * Write the number of pages the text was broken into in every header and + * every foot that asks for it. + * + * The pages are broken one slice at a time, so the count is not known + * until the last slice: the field carries the number the writer of the + * document recorded until then, and the true one once the text is broken + * whole. Nothing is laid out again for it: the fields stand in the + * furniture of the pages, beside the text and not in it, and only their + * text is written anew. + * @param {!HTMLDivElement} pagesDiv + * @param {!number} pages + * @return {undefined} + */ + function tellPageCount(pagesDiv, pages) { + var fields = pagesDiv.getElementsByTagNameNS(textns, "page-count"), + /**@type{!number}*/ + i; + for (i = 0; i < fields.length; i += 1) { + fields.item(i).textContent = String(pages); + } + } /** * Whether a paragraph or a table asks to be written on a new page. * @@ -2212,6 +2234,22 @@ odf.TextLayout = function TextLayout() { && node.namespaceURI === tablens && node.localName === "table-header-rows"; } + /** + * Whether a node says how wide the columns of a table are. + * + * Such an element holds no text and is drawn over the whole height of + * the table, so its foot is past the end of every page but the last: read + * as content, it sent every row to the next page for ever. + * @param {!Node} node + * @return {!boolean} + */ + function isTableColumns(node) { + return node.nodeType === Node.ELEMENT_NODE + && node.namespaceURI === tablens + && (node.localName === "table-column" + || node.localName === "table-columns" + || node.localName === "table-column-group"); + } /** * Whether a node is a row of a table, of the kind that is written whole * on one page. @@ -2224,6 +2262,31 @@ odf.TextLayout = function TextLayout() { && (node.localName === "table-row" || node.localName === "table-rows"); } + /** + * Whether nothing stands before this child of the element but the rows of + * the head of a table, which are written again at the top of every page + * the table runs over. + * + * A row that follows them alone is the first thing the page holds, and it + * is kept there whatever its height: a row taller than a page would + * otherwise be moved to a page of its own for ever, and every page would + * be written with the head of the table and nothing else. + * @param {!Element} element + * @param {!Node} node + * @return {!boolean} + */ + function afterHeaderRowsOnly(element, node) { + var before = element.firstChild; + while (before && before !== node) { + if (!isHeaderRows(before) + && !(before.nodeType === Node.TEXT_NODE + && !before.textContent.trim())) { + return false; + } + before = before.nextSibling; + } + return true; + } /** * Cut an element where the page ends, and answer what is left of it: a * copy of the element that holds what did not fit. @@ -2251,6 +2314,8 @@ odf.TextLayout = function TextLayout() { /**@type{?Element}*/ head, /**@type{?Node}*/ + column, + /**@type{?Node}*/ next, /**@type{!ClientRect}*/ rect; @@ -2262,7 +2327,12 @@ odf.TextLayout = function TextLayout() { rect = node.nodeType === Node.TEXT_NODE ? rangeOf(doc, node).getBoundingClientRect() : /**@type{!Element}*/(node).getBoundingClientRect(); - if (isHeaderRows(node) && node === element.firstElementChild) { + if (isTableColumns(node)) { + // The columns say how wide the table is and hold nothing that + // is read: they are of the table and not of the page. + node = node.nextSibling; + } else if (isHeaderRows(node) + && node === element.firstElementChild) { // The rows of the head of a table belong to the head of it // and are never moved: they are written again at the top of // what follows, see below. A document that writes such rows @@ -2274,7 +2344,7 @@ odf.TextLayout = function TextLayout() { from = cutText(box, /**@type{!Text}*/(node), alone) || node; } else if (isTableRow(node) - && !(alone && node === element.firstElementChild)) { + && !(alone && afterHeaderRowsOnly(element, node))) { // A row of a table is written whole on one page or on // the next, and never cut across, which would part the // cells of one row from one another. A row taller than @@ -2303,6 +2373,17 @@ odf.TextLayout = function TextLayout() { tail = /**@type{!Element}*/(element.cloneNode(false)); // A table that is cut in two writes the rows of its head again at // the top of what follows, as an office does. + if (element.namespaceURI === tablens) { + // The columns of the table are written again with it, before its + // head, as they are the width of what follows. + column = element.firstChild; + while (column) { + if (isTableColumns(column)) { + tail.appendChild(column.cloneNode(true)); + } + column = column.nextSibling; + } + } head = domUtils.getDirectChild(element, tablens, "table-header-rows"); if (head && element.namespaceURI === tablens && !(from && isHeaderRows(from))) { @@ -2824,6 +2905,9 @@ odf.TextLayout = function TextLayout() { readMeta(fillingRoot), 0); round2 += 1; } + if (round === fillingRound && fillingDiv) { + tellPageCount(fillingDiv, countPages(fillingDiv)); + } }, 0); } /** From 19fba3dad3d295422e50e8a371841d43e3d15b0c Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 260/385] Given back to the text the pixel the boxes of the pages took from it. --- webodf/lib/odf/TextLayout.js | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index c9f9c1b02..c4bdbbbde 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -72,6 +72,18 @@ odf.TextLayout = function TextLayout() { * @type{!number} */ pageSeparation = 10, + /** + * How wide the box that holds the height of a page is drawn. It is + * as narrow as a browser lets a box be and still count it: a box of + * no width at all is held to occupy nothing, and every page would be + * drawn at the top of the one before it. The width stands above the + * grain of the engines, a sixtieth of a pixel in gecko and a + * sixty-fourth in blink and in webkit, and what it takes is taken + * from the text beside it. + * @const + * @type{!string} + */ + pageColumnWidth = "0.05px", /** * How many pages are drawn at the most. A document of a thousand pages * is already far more than a reader shows at once, and the bound is @@ -570,7 +582,7 @@ odf.TextLayout = function TextLayout() { frag.appendChild(div); div = doc.createElementNS(htmlns, "div"); div.style.height = contentHeight + "px"; - div.style.width = "1px"; + div.style.width = pageColumnWidth; div.style.cssFloat = "right"; frag.appendChild(div); n += 1; From 8bf64c4c17e776e1123ee351375484d55388e67e Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 261/385] Built the layer of dojo with a minifier that leaves its modules alone. --- ChangeLog.md | 62 +++++++++---------- LicenseHeaderTemplate.js | 2 +- README-Building.md | 8 +-- README-Products.md | 2 +- README.md | 2 +- .../js/AlignCurrentSelectionJustified.js | 2 +- programs/benchmark/js/Benchmark.js | 2 +- programs/benchmark/js/BenchmarkAction.js | 2 +- programs/benchmark/js/BoldCurrentSelection.js | 2 +- programs/benchmark/js/EnterEditMode.js | 2 +- programs/benchmark/js/HTMLActionResult.js | 2 +- programs/benchmark/js/HTMLBenchmark.js | 2 +- programs/benchmark/js/HTMLMatrixRenderer.js | 2 +- programs/benchmark/js/HTMLResultsRenderer.js | 2 +- programs/benchmark/js/InsertLetterA.js | 2 +- programs/benchmark/js/MoveCursorLeft.js | 2 +- programs/benchmark/js/MoveCursorToEnd.js | 2 +- .../benchmark/js/MoveCursorToEndDirect.js | 2 +- programs/benchmark/js/MoveCursorToStart.js | 2 +- programs/benchmark/js/OdfBenchmarkContext.js | 2 +- programs/benchmark/js/OpenDocument.js | 2 +- programs/benchmark/js/PreloadDocument.js | 2 +- programs/benchmark/js/RangeCalculator.js | 2 +- .../benchmark/js/RemoveCurrentSelection.js | 2 +- programs/benchmark/js/RemovePositions.js | 2 +- programs/benchmark/js/SaveDocument.js | 2 +- programs/benchmark/js/SelectEntireDocument.js | 2 +- programs/benchmark/libexec/bundle.js | 2 +- programs/benchmark/runner.css | 2 +- programs/benchmark/webodf.js | 2 +- programs/cordova/config.xml.in | 2 +- .../org.webodf.starturl/www/starturl.js | 2 +- programs/cordova/www/FileScanner.js | 2 +- programs/cordova/www/OdfViewer.js | 2 +- programs/cordova/www/index.js | 2 +- programs/docnosis/docnosis.js | 2 +- programs/editor/CMakeLists.txt | 9 ++- programs/editor/EditorSession.js | 2 +- programs/editor/FullWindowZoomHelper.js | 2 +- programs/editor/MemberListView.js | 2 +- programs/editor/SessionBackend.js | 2 +- programs/editor/SessionList.js | 2 +- programs/editor/SessionListView.js | 2 +- programs/editor/Tools.js | 2 +- programs/editor/Translator.js | 2 +- programs/editor/backend/Server.js | 2 +- programs/editor/backend/ServerFactory.js | 2 +- .../backend/jsglobal/OperationRouter.js | 2 +- programs/editor/backend/jsglobal/Server.js | 2 +- .../editor/backend/jsglobal/ServerFactory.js | 2 +- .../editor/backend/jsglobal/SessionBackend.js | 2 +- .../editor/backend/jsglobal/SessionList.js | 2 +- .../editor/backend/pullbox/OperationRouter.js | 2 +- programs/editor/backend/pullbox/Server.js | 2 +- .../editor/backend/pullbox/ServerFactory.js | 2 +- .../editor/backend/pullbox/SessionBackend.js | 2 +- .../editor/backend/pullbox/SessionList.js | 2 +- programs/editor/bellaplugin.js | 2 +- .../editor/dojo-deps/profiles/app.profile.js | 12 ++-- programs/editor/libexec/mergeIntoDojo.js | 18 +++++- programs/editor/localfileeditor.js | 2 +- programs/editor/plugins/bella/Actions.js | 2 +- programs/editor/plugins/bella/Bella.js | 4 +- programs/editor/plugins/bella/BellaControl.js | 2 +- programs/editor/plugins/bella/CatHerder.js | 2 +- .../editor/plugins/bella/DocumentValidator.js | 2 +- programs/editor/plugins/bella/Random.js | 2 +- .../plugins/bella/SimpleStatusReporter.js | 2 +- .../plugins/bella/WrappedSessionController.js | 2 +- programs/editor/pullboxeditor.js | 2 +- programs/editor/revieweditor.js | 2 +- programs/editor/splitscreeneditor.js | 2 +- programs/editor/webodf.js | 2 +- programs/editor/widgets/aboutDialog.js | 2 +- programs/editor/widgets/annotation.js | 2 +- .../widgets/dialogWidgets/alignmentPane.js | 2 +- .../dialogWidgets/editHyperlinkPane.js | 2 +- .../widgets/dialogWidgets/fontEffectsPane.js | 2 +- .../editor/widgets/dialogWidgets/idMangler.js | 2 +- programs/editor/widgets/editHyperlinks.js | 2 +- programs/editor/widgets/fontPicker.js | 2 +- programs/editor/widgets/imageInserter.js | 2 +- programs/editor/widgets/paragraphAlignment.js | 2 +- programs/editor/widgets/paragraphStyles.js | 2 +- .../editor/widgets/paragraphStylesDialog.js | 2 +- programs/editor/widgets/simpleStyles.js | 2 +- .../widgets/toolbarWidgets/currentStyle.js | 2 +- programs/editor/widgets/undoRedoMenu.js | 2 +- programs/editor/widgets/zoomSlider.js | 2 +- programs/editor/wodocollabpane.css | 2 +- programs/editor/wodocollabtexteditor.js | 2 +- programs/editor/wodotexteditor.css | 2 +- programs/editor/wodotexteditor.js | 4 +- programs/opendocumentviewer-desktop/main.cpp | 2 +- .../opendocumentviewer-desktop/mainwindow.cpp | 2 +- .../opendocumentviewer-desktop/mainwindow.h | 2 +- .../packaging.cmake | 2 +- .../viewerscheme.cpp | 2 +- .../opendocumentviewer-desktop/viewerscheme.h | 2 +- programs/opendocumentviewer-desktop/words.h | 2 +- .../background-chrome.js | 2 +- .../background-thunderbird.js | 2 +- .../opendocumentviewer-webext/background.js | 2 +- programs/opendocumentviewer-webext/viewer.js | 2 +- .../opendocumentviewer-webext/welcome-open.js | 2 +- programs/opendocumentviewer-webext/welcome.js | 2 +- programs/qtjsruntime/bindings.cpp | 2 +- programs/qtjsruntime/bindings.h | 2 +- programs/qtjsruntime/main.cpp | 2 +- programs/qtjsruntime/nativeio.cpp | 2 +- programs/qtjsruntime/nativeio.h | 2 +- programs/qtjsruntime/requestfilter.h | 2 +- programs/qtjsruntime/runner.cpp | 2 +- programs/qtjsruntime/runner.h | 2 +- webodf/compare.js | 2 +- webodf/externs/JSZip.js | 2 +- webodf/filelister.js | 2 +- webodf/httpserver.js | 2 +- webodf/lib/HeaderCompiled.js | 2 +- webodf/lib/gui/AnnotationController.js | 2 +- webodf/lib/gui/AnnotationViewManager.js | 2 +- webodf/lib/gui/Avatar.js | 2 +- .../lib/gui/BlacklistNamespaceNodeFilter.js | 2 +- webodf/lib/gui/Caret.js | 2 +- webodf/lib/gui/CaretManager.js | 2 +- webodf/lib/gui/Clipboard.js | 2 +- webodf/lib/gui/ClosestXOffsetScanner.js | 2 +- webodf/lib/gui/CommonConstraints.js | 2 +- webodf/lib/gui/DirectFormattingController.js | 2 +- webodf/lib/gui/EditInfoHandle.js | 2 +- webodf/lib/gui/EditInfoMarker.js | 2 +- webodf/lib/gui/EventManager.js | 2 +- webodf/lib/gui/GuiStepUtils.js | 2 +- webodf/lib/gui/HyperlinkClickHandler.js | 2 +- webodf/lib/gui/HyperlinkController.js | 2 +- webodf/lib/gui/HyperlinkTooltipView.js | 2 +- webodf/lib/gui/IOSSafariSupport.js | 2 +- webodf/lib/gui/ImageController.js | 2 +- webodf/lib/gui/ImageSelector.js | 2 +- webodf/lib/gui/InputMethodEditor.js | 2 +- webodf/lib/gui/KeyboardHandler.js | 2 +- webodf/lib/gui/LineBoundaryScanner.js | 2 +- webodf/lib/gui/MetadataController.js | 2 +- webodf/lib/gui/MimeDataExporter.js | 2 +- webodf/lib/gui/OdfFieldView.js | 2 +- webodf/lib/gui/OdfTextBodyNodeFilter.js | 2 +- webodf/lib/gui/ParagraphBoundaryScanner.js | 2 +- webodf/lib/gui/PasteController.js | 2 +- webodf/lib/gui/SelectionController.js | 2 +- webodf/lib/gui/SelectionView.js | 2 +- webodf/lib/gui/SelectionViewManager.js | 2 +- webodf/lib/gui/SessionConstraints.js | 2 +- webodf/lib/gui/SessionContext.js | 2 +- webodf/lib/gui/SessionController.js | 2 +- webodf/lib/gui/SessionView.js | 2 +- webodf/lib/gui/ShadowCursor.js | 2 +- webodf/lib/gui/SingleScrollViewport.js | 2 +- webodf/lib/gui/StyleSummary.js | 2 +- webodf/lib/gui/SvgSelectionView.js | 2 +- webodf/lib/gui/TextController.js | 2 +- webodf/lib/gui/TrivialUndoManager.js | 2 +- webodf/lib/gui/UndoManager.js | 2 +- webodf/lib/gui/UndoStateRules.js | 2 +- webodf/lib/gui/Viewport.js | 2 +- webodf/lib/gui/VisualStepScanner.js | 2 +- webodf/lib/gui/ZoomHelper.js | 2 +- webodf/lib/odf/CollapsingRules.js | 2 +- webodf/lib/odf/CommandLineTools.js | 2 +- webodf/lib/odf/FontLoader.js | 2 +- webodf/lib/odf/Formatting.js | 2 +- webodf/lib/odf/GraphicProperties.js | 2 +- webodf/lib/odf/ListStylesToCss.js | 2 +- webodf/lib/odf/Namespaces.js | 2 +- webodf/lib/odf/ObjectNameGenerator.js | 2 +- webodf/lib/odf/OdfCanvas.js | 2 +- webodf/lib/odf/OdfContainer.js | 2 +- webodf/lib/odf/OdfNodeFilter.js | 2 +- webodf/lib/odf/OdfSchema.js | 2 +- webodf/lib/odf/OdfUtils.js | 2 +- webodf/lib/odf/PageLayoutProperties.js | 2 +- webodf/lib/odf/ParagraphProperties.js | 2 +- webodf/lib/odf/StepUtils.js | 2 +- webodf/lib/odf/Style2CSS.js | 2 +- webodf/lib/odf/StyleCache.js | 2 +- webodf/lib/odf/StyleInfo.js | 2 +- webodf/lib/odf/StyleParseUtils.js | 2 +- webodf/lib/odf/StyleTree.js | 2 +- webodf/lib/odf/TextLayout.js | 2 +- webodf/lib/odf/TextProperties.js | 2 +- webodf/lib/odf/TextSerializer.js | 2 +- webodf/lib/odf/TextStyleApplicator.js | 2 +- webodf/lib/odf/WordBoundaryFilter.js | 2 +- webodf/lib/ops/Canvas.js | 2 +- webodf/lib/ops/Document.js | 2 +- webodf/lib/ops/EditInfo.js | 2 +- webodf/lib/ops/Member.js | 2 +- webodf/lib/ops/OdtCursor.js | 2 +- webodf/lib/ops/OdtDocument.js | 2 +- webodf/lib/ops/OdtStepsTranslator.js | 2 +- webodf/lib/ops/OpAddAnnotation.js | 2 +- webodf/lib/ops/OpAddCursor.js | 2 +- webodf/lib/ops/OpAddMember.js | 2 +- webodf/lib/ops/OpAddStyle.js | 2 +- webodf/lib/ops/OpApplyDirectStyling.js | 2 +- webodf/lib/ops/OpApplyHyperlink.js | 2 +- webodf/lib/ops/OpInsertImage.js | 2 +- webodf/lib/ops/OpInsertTable.js | 2 +- webodf/lib/ops/OpInsertText.js | 2 +- webodf/lib/ops/OpMergeParagraph.js | 2 +- webodf/lib/ops/OpMoveCursor.js | 2 +- webodf/lib/ops/OpRemoveAnnotation.js | 2 +- webodf/lib/ops/OpRemoveBlob.js | 2 +- webodf/lib/ops/OpRemoveCursor.js | 2 +- webodf/lib/ops/OpRemoveHyperlink.js | 2 +- webodf/lib/ops/OpRemoveMember.js | 2 +- webodf/lib/ops/OpRemoveStyle.js | 2 +- webodf/lib/ops/OpRemoveText.js | 2 +- webodf/lib/ops/OpSetBlob.js | 2 +- webodf/lib/ops/OpSetParagraphStyle.js | 2 +- webodf/lib/ops/OpSplitParagraph.js | 2 +- webodf/lib/ops/OpUpdateMember.js | 2 +- webodf/lib/ops/OpUpdateMetadata.js | 2 +- webodf/lib/ops/OpUpdateParagraphStyle.js | 2 +- webodf/lib/ops/Operation.js | 2 +- webodf/lib/ops/OperationFactory.js | 2 +- webodf/lib/ops/OperationRouter.js | 2 +- webodf/lib/ops/OperationTransformMatrix.js | 2 +- webodf/lib/ops/OperationTransformer.js | 2 +- webodf/lib/ops/Session.js | 2 +- webodf/lib/ops/StepsCache.js | 2 +- webodf/lib/ops/TextPositionFilter.js | 2 +- webodf/lib/ops/TrivialOperationRouter.js | 2 +- webodf/lib/runtime.js | 2 +- webodf/lib/webodfcore/Async.js | 2 +- webodf/lib/webodfcore/Base64.js | 2 +- webodf/lib/webodfcore/CSSUnits.js | 2 +- webodf/lib/webodfcore/Cursor.js | 2 +- webodf/lib/webodfcore/Destroyable.js | 2 +- webodf/lib/webodfcore/DomUtils.js | 6 +- webodf/lib/webodfcore/EventNotifier.js | 2 +- webodf/lib/webodfcore/EventSource.js | 2 +- webodf/lib/webodfcore/EventSubscriptions.js | 2 +- webodf/lib/webodfcore/LazyProperty.js | 2 +- webodf/lib/webodfcore/LoopWatchDog.js | 2 +- webodf/lib/webodfcore/NodeFilterChain.js | 2 +- webodf/lib/webodfcore/PositionFilter.js | 2 +- webodf/lib/webodfcore/PositionFilterChain.js | 2 +- webodf/lib/webodfcore/PositionIterator.js | 2 +- webodf/lib/webodfcore/ScheduledTask.js | 2 +- webodf/lib/webodfcore/StepIterator.js | 2 +- webodf/lib/webodfcore/Task.js | 2 +- webodf/lib/webodfcore/Utils.js | 2 +- webodf/lib/webodfcore/Zip.js | 2 +- webodf/lib/webodfcore/enums.js | 2 +- webodf/lib/webodfcore/typedefs.js | 2 +- webodf/lib/xmldom/LSSerializer.js | 2 +- webodf/lib/xmldom/LSSerializerFilter.js | 2 +- webodf/lib/xmldom/RelaxNG.js | 2 +- webodf/lib/xmldom/RelaxNG2.js | 2 +- webodf/lib/xmldom/RelaxNGParser.js | 2 +- webodf/lib/xmldom/XPath.js | 2 +- webodf/misctests/testzip.js | 2 +- webodf/relaxngToCPP.js | 2 +- webodf/roundtripodf.js | 2 +- webodf/roundtripzip.js | 2 +- webodf/testrelaxng.js | 2 +- .../gui/DirectFormattingControllerTests.js | 2 +- webodf/tests/gui/GuiStepUtilsTests.js | 2 +- webodf/tests/gui/ImageControllerTests.js | 2 +- webodf/tests/gui/MetadataControllerTests.js | 2 +- webodf/tests/gui/SelectionControllerTests.js | 2 +- webodf/tests/gui/StyleSummaryTests.js | 2 +- webodf/tests/gui/TextControllerTests.js | 2 +- webodf/tests/gui/TrivialUndoManagerTests.js | 2 +- webodf/tests/gui/UndoStateRulesTests.js | 2 +- webodf/tests/odf/FormattingTests.js | 2 +- webodf/tests/odf/LayoutTests.js | 2 +- webodf/tests/odf/ListStyleToCssTests.js | 2 +- webodf/tests/odf/MaliciousDocumentTests.js | 2 +- webodf/tests/odf/ObjectNameGeneratorTests.js | 2 +- webodf/tests/odf/OdfContainerSafetyTests.js | 2 +- webodf/tests/odf/OdfContainerTests.js | 2 +- webodf/tests/odf/OdfUtilsTests.js | 2 +- webodf/tests/odf/StyleCacheTests.js | 2 +- webodf/tests/odf/StyleInfoTests.js | 2 +- webodf/tests/odf/StyleParseUtilsTests.js | 2 +- webodf/tests/odf/StyleTreeTests.js | 2 +- webodf/tests/odf/TextStyleApplicatorTests.js | 2 +- webodf/tests/odf/layouttests.xml | 2 +- webodf/tests/odf/odplayouttests.xml | 2 +- webodf/tests/ops/OdtDocumentTests.js | 2 +- webodf/tests/ops/OdtStepsTranslatorTests.js | 2 +- webodf/tests/ops/OperationTestHelper.js | 2 +- webodf/tests/ops/OperationTests.js | 2 +- webodf/tests/ops/SessionTests.js | 2 +- webodf/tests/ops/TransformationTests.js | 2 +- webodf/tests/ops/TransformerTests.js | 2 +- webodf/tests/ops/allowedpositions.xml | 2 +- webodf/tests/ops/operationtests.xml | 2 +- webodf/tests/ops/transformationtests.xml | 2 +- webodf/tests/ops/transformertests.xml | 2 +- webodf/tests/testruntimeadaption.js | 2 +- webodf/tests/tests.js | 2 +- webodf/tests/webodfcore/Base64Tests.js | 2 +- webodf/tests/webodfcore/CursorTests.js | 2 +- webodf/tests/webodfcore/DomUtilsTests.js | 2 +- .../webodfcore/EventSubscriptionsTests.js | 2 +- .../tests/webodfcore/PositionIteratorTests.js | 2 +- webodf/tests/webodfcore/RuntimeTests.js | 2 +- webodf/tests/webodfcore/StepIteratorTests.js | 2 +- webodf/tests/webodfcore/UnitTester.js | 2 +- webodf/tests/webodfcore/ZipTests.js | 2 +- webodf/tests/xmldom/LSSerializerTests.js | 2 +- webodf/tests/xmldom/XPathTests.js | 2 +- webodf/tools/css2js.js | 2 +- webodf/tools/dojoNlsCompile.js | 2 +- webodf/tools/externs.js | 2 +- webodf/tools/makeicns.js | 2 +- webodf/tools/makeico.js | 2 +- webodf/tools/odfRng2Config.js | 2 +- webodf/tools/replaceByFileContents.js | 2 +- webodf/tools/touchfile.js | 2 +- webodf/tools/updateJS.js | 2 +- webodf/tools/zipdir.js | 2 +- webodf/webodf.css | 2 +- webodf/webodfcmd.js | 2 +- 326 files changed, 390 insertions(+), 369 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index d2be39134..5242101b7 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,7 +4,7 @@ ## Fixes -* Fix an issue where ODF zip files were incorrectly generated ([#917](https://github.com/kogmbh/WebODF/pull/917)) +* Fix an issue where ODF zip files were incorrectly generated ([#917](https://github.com/webodf/WebODF/pull/917)) # Changes between 0.5.7 and 0.5.8 @@ -12,15 +12,15 @@ ### Fixes -* Fix chrome selections that cannot be collapsd by clicking inside them ([#905](https://github.com/kogmbh/WebODF/issues/905)) -* Fix Inserted images being 1cm by 1cm in LibreOffice/OO ([#904](https://github.com/kogmbh/WebODF/issues/904)) -* Fix exported zip file being uncompressed ([#21]https://github.com/kogmbh/WebODF/issues/21) +* Fix chrome selections that cannot be collapsd by clicking inside them ([#905](https://github.com/webodf/WebODF/issues/905)) +* Fix Inserted images being 1cm by 1cm in LibreOffice/OO ([#904](https://github.com/webodf/WebODF/issues/904)) +* Fix exported zip file being uncompressed ([#21]https://github.com/webodf/WebODF/issues/21) ## Wodo.TextEditor ### Fixes -* Disable custom buttons save/saveAs/close/download when there is no session ([#893](https://github.com/kogmbh/WebODF/pull/893)) +* Disable custom buttons save/saveAs/close/download when there is no session ([#893](https://github.com/webodf/WebODF/pull/893)) # Changes between 0.5.6 and 0.5.7 @@ -28,13 +28,13 @@ ### Fixes -* Fix breaking all empty annotations on merging the paragraph they are contained in with the one before ([#877](https://github.com/kogmbh/WebODF/pull/877))) -* Fix error message popup on deleting an annotation starting at the end of a paragraph or styled range ([#880](https://github.com/kogmbh/WebODF/pull/880))) -* Fix wrong style information for text in annotations ([#881](https://github.com/kogmbh/WebODF/pull/881))) +* Fix breaking all empty annotations on merging the paragraph they are contained in with the one before ([#877](https://github.com/webodf/WebODF/pull/877))) +* Fix error message popup on deleting an annotation starting at the end of a paragraph or styled range ([#880](https://github.com/webodf/WebODF/pull/880))) +* Fix wrong style information for text in annotations ([#881](https://github.com/webodf/WebODF/pull/881))) ### Improvements -* In OpAddAnnotation support annotated ranges with 0 length ([#879](https://github.com/kogmbh/WebODF/pull/879))) +* In OpAddAnnotation support annotated ranges with 0 length ([#879](https://github.com/webodf/WebODF/pull/879))) ### Breaking changes @@ -46,7 +46,7 @@ See also section about WebODF ### Improvements -* Add a "review" modus where users can add, edit and remove own annotations, but not modify the actual document content ([#883](https://github.com/kogmbh/WebODF/pull/883))) +* Add a "review" modus where users can add, edit and remove own annotations, but not modify the actual document content ([#883](https://github.com/webodf/WebODF/pull/883))) # Changes between 0.5.5 and 0.5.6 @@ -55,7 +55,7 @@ See also section about WebODF ### Fixes -* No longer fail due to possible Byte Order Marks in ODF-internal XML files with Chromium ([#872](https://github.com/kogmbh/WebODF/issues/872))) +* No longer fail due to possible Byte Order Marks in ODF-internal XML files with Chromium ([#872](https://github.com/webodf/WebODF/issues/872))) ## Wodo.TextEditor @@ -63,7 +63,7 @@ See also section about WebODF ### Improvements -* Add options for "Save as" and "Download" buttons in Wodo.TextEditor ([#865](https://github.com/kogmbh/WebODF/pull/865))) +* Add options for "Save as" and "Download" buttons in Wodo.TextEditor ([#865](https://github.com/webodf/WebODF/pull/865))) # Changes between 0.5.4 and 0.5.5 @@ -72,11 +72,11 @@ See also section about WebODF ### Improvements -* Add a "documentModified" state with change signal to UndoManager classes ([#857](https://github.com/kogmbh/WebODF/pull/857))) +* Add a "documentModified" state with change signal to UndoManager classes ([#857](https://github.com/webodf/WebODF/pull/857))) ### Fixes -* No longer fail on "draw:master-page-name" attributes values with non-alphabetic chars ([#742](https://github.com/kogmbh/WebODF/pull/742))) +* No longer fail on "draw:master-page-name" attributes values with non-alphabetic chars ([#742](https://github.com/webodf/WebODF/pull/742))) ## Wodo.TextEditor @@ -84,15 +84,15 @@ See also section about WebODF ### Improvements -* Add a "documentModified" state with change signal ([#857](https://github.com/kogmbh/WebODF/pull/857))) +* Add a "documentModified" state with change signal ([#857](https://github.com/webodf/WebODF/pull/857))) ### Fixes -* Fix wrongly enabled hyperlink tools with no document loaded ([#833](https://github.com/kogmbh/WebODF/pull/833)) -* Prevent Cross-Site Scripting from style names and font names ([#849](https://github.com/kogmbh/WebODF/pull/849)) (CVE-2015-3012) -* Avoid badly rendered toolbar element with subsets of tools ([#855](https://github.com/kogmbh/WebODF/pull/855))) -* Prevent Cross-Site Scripting from links ([#850](https://github.com/kogmbh/WebODF/pull/850)) (CVE-2015-3012) -* Prevent browser translation service breaking the editor logic ([#862](https://github.com/kogmbh/WebODF/pull/862))) +* Fix wrongly enabled hyperlink tools with no document loaded ([#833](https://github.com/webodf/WebODF/pull/833)) +* Prevent Cross-Site Scripting from style names and font names ([#849](https://github.com/webodf/WebODF/pull/849)) (CVE-2015-3012) +* Avoid badly rendered toolbar element with subsets of tools ([#855](https://github.com/webodf/WebODF/pull/855))) +* Prevent Cross-Site Scripting from links ([#850](https://github.com/webodf/WebODF/pull/850)) (CVE-2015-3012) +* Prevent browser translation service breaking the editor logic ([#862](https://github.com/webodf/WebODF/pull/862))) # Changes between 0.5.3 and 0.5.4 @@ -100,8 +100,8 @@ See also section about WebODF ### Fixes -* Only highlight ODF fields in edit mode ([#816](https://github.com/kogmbh/WebODF/issues/816)) -* Prevent Cross-Site Scripting from file names ([#851](https://github.com/kogmbh/WebODF/pull/851)) (CVE-2014-9716) +* Only highlight ODF fields in edit mode ([#816](https://github.com/webodf/WebODF/issues/816)) +* Prevent Cross-Site Scripting from file names ([#851](https://github.com/webodf/WebODF/pull/851)) (CVE-2014-9716) ## Wodo.TextEditor See also section about WebODF @@ -117,17 +117,17 @@ See also section about WebODF ### Improvements -* Add support for double line-through in Firefox (Chrome/Safari + IE don't support this feature) ([#758](https://github.com/kogmbh/WebODF/pull/758)) -* Add support for subscript & superscript ([#755](https://github.com/kogmbh/WebODF/pull/755)) +* Add support for double line-through in Firefox (Chrome/Safari + IE don't support this feature) ([#758](https://github.com/webodf/WebODF/pull/758)) +* Add support for subscript & superscript ([#755](https://github.com/webodf/WebODF/pull/755)) * In odf.OdfContainer allow creation of document template types as well as querying and setting the template state of the document ### Fixes -* Fixed occasional crash when splitting a paragraph ([#723](https://github.com/kogmbh/WebODF/issues/723)) +* Fixed occasional crash when splitting a paragraph ([#723](https://github.com/webodf/WebODF/issues/723)) * Keep IME composition menu & avatar in the correct position when entering characters * Allow screen-readers to read the document content correctly in OSX 10.8+ versions of Safari -* Scroll newly created annotations completely into view ([#486](https://github.com/kogmbh/WebODF/issues/486)) -* Improve line ending detection when word-wrapping occurs ([#774](https://github.com/kogmbh/WebODF/pull/774)) +* Scroll newly created annotations completely into view ([#486](https://github.com/webodf/WebODF/issues/486)) +* Improve line ending detection when word-wrapping occurs ([#774](https://github.com/webodf/WebODF/pull/774)) ## Wodo.TextEditor @@ -148,7 +148,7 @@ See also section about WebODF ### Fixes * For ODP files sometimes template elements from the master pages were rendered inside the actual slides. -* Navigation via home/end keys, or up/down cursor keys is more reliable on all browsers. ([#555](https://github.com/kogmbh/WebODF/issues/555), [#405](https://github.com/kogmbh/WebODF/issues/405), [#224](https://github.com/kogmbh/WebODF/issues/224), [#185](https://github.com/kogmbh/WebODF/issues/185), [#124](https://github.com/kogmbh/WebODF/issues/124), [#98](https://github.com/kogmbh/WebODF/issues/98)) +* Navigation via home/end keys, or up/down cursor keys is more reliable on all browsers. ([#555](https://github.com/webodf/WebODF/issues/555), [#405](https://github.com/webodf/WebODF/issues/405), [#224](https://github.com/webodf/WebODF/issues/224), [#185](https://github.com/webodf/WebODF/issues/185), [#124](https://github.com/webodf/WebODF/issues/124), [#98](https://github.com/webodf/WebODF/issues/98)) * More elements from master pages are now correctly positioned when displayed inside slides. * In slides hide elements of class "header", "footer", "page-number" and "date-time" from master pages when configured so. @@ -160,7 +160,7 @@ See also section about WebODF ### Improvements * numbering of multi-level lists is now well supported in rendering, including display of only a subset of the list numbers and continued numbering from previous lists (both `text:continue-numbering` and `text:continue-list`) -([#565](https://github.com/kogmbh/WebODF/pull/565)) +([#565](https://github.com/webodf/WebODF/pull/565)) ### Fixes @@ -175,6 +175,6 @@ See also section about WebODF * Start-up of editor no longer hangs in some browsers Two different bugs were fixed which so far broke the start-up with Safari and other browsers using older WebKit versions as well as the default browser on Android 4.0.3 -([#693](https://github.com/kogmbh/WebODF/issues/693)) +([#693](https://github.com/webodf/WebODF/issues/693)) * All toolbar elements are now disabled when no document is loaded. -([#709](https://github.com/kogmbh/WebODF/issues/709)) +([#709](https://github.com/webodf/WebODF/issues/709)) diff --git a/LicenseHeaderTemplate.js b/LicenseHeaderTemplate.js index 426000d1c..a23788221 100644 --- a/LicenseHeaderTemplate.js +++ b/LicenseHeaderTemplate.js @@ -19,5 +19,5 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ diff --git a/README-Building.md b/README-Building.md index 7b4d592ef..ec2cf9910 100644 --- a/README-Building.md +++ b/README-Building.md @@ -103,11 +103,11 @@ also a connection to the internet will be needed. Downloaded requirements will be cached in the build directory. [Closure Compiler]: https://developers.google.com/closure/compiler/ -With the requirements installed, either download the zip file from https://github.com/kogmbh/WebODF/archive/master.zip +With the requirements installed, either download the zip file from https://github.com/webodf/WebODF/archive/master.zip and unzip it: ```sh -wget https://github.com/kogmbh/WebODF/archive/master.zip +wget https://github.com/webodf/WebODF/archive/master.zip unzip master.zip mv WebODF-master webodf ``` @@ -115,7 +115,7 @@ mv WebODF-master webodf or get the complete repo with git: ```sh -git clone https://github.com/kogmbh/WebODF.git webodf +git clone https://github.com/webodf/WebODF.git webodf ``` For building now in the same directory where either of above commands were done @@ -198,7 +198,7 @@ These commands should be entered from the Visual Studio 2010 command prompt so that msbuild will be added to the PATH ```sh -git clone https://github.com/kogmbh/WebODF.git webodf +git clone https://github.com/webodf/WebODF.git webodf md build cd build cmake -G "Visual Studio 10" ..\webodf diff --git a/README-Products.md b/README-Products.md index 84c3bb828..38720890c 100644 --- a/README-Products.md +++ b/README-Products.md @@ -46,7 +46,7 @@ Download the latest officially released version from the [WebODF homepage](http: For those who want to get an OpenDocument Text editor with just a few lines of JavaScript in their HTML5 app, the component Wodo.TextEditor is the right choice. -This product bundles a [HOWTO](https://github.com/kogmbh/WebODF/blob/master/programs/editor/HOWTO-wodotexteditor.md), +This product bundles a [HOWTO](https://github.com/webodf/WebODF/blob/master/programs/editor/HOWTO-wodotexteditor.md), example files, API documentation and a subdirectory with all files belonging to the component in one zip file. diff --git a/README.md b/README.md index 29177f655..f682f2655 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ and compacts all JavaScript files, so that they are smaller and execute faster. CMake is used to setup the buildsystem, so webodf.js can be created: ```sh -git clone https://github.com/kogmbh/WebODF.git webodf +git clone https://github.com/webodf/WebODF.git webodf mkdir build cd build cmake -S ../webodf diff --git a/programs/benchmark/js/AlignCurrentSelectionJustified.js b/programs/benchmark/js/AlignCurrentSelectionJustified.js index 9491b690e..e32e510cf 100644 --- a/programs/benchmark/js/AlignCurrentSelectionJustified.js +++ b/programs/benchmark/js/AlignCurrentSelectionJustified.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/Benchmark.js b/programs/benchmark/js/Benchmark.js index b1d0a6fff..cc5f42da1 100644 --- a/programs/benchmark/js/Benchmark.js +++ b/programs/benchmark/js/Benchmark.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime, webodfcore, console, odf */ diff --git a/programs/benchmark/js/BenchmarkAction.js b/programs/benchmark/js/BenchmarkAction.js index bfccaca6e..eeaf07bec 100644 --- a/programs/benchmark/js/BenchmarkAction.js +++ b/programs/benchmark/js/BenchmarkAction.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime, webodfcore*/ diff --git a/programs/benchmark/js/BoldCurrentSelection.js b/programs/benchmark/js/BoldCurrentSelection.js index 554c4bef2..49acaaad2 100644 --- a/programs/benchmark/js/BoldCurrentSelection.js +++ b/programs/benchmark/js/BoldCurrentSelection.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime, gui, ops*/ diff --git a/programs/benchmark/js/EnterEditMode.js b/programs/benchmark/js/EnterEditMode.js index 1ca178001..0706259c7 100644 --- a/programs/benchmark/js/EnterEditMode.js +++ b/programs/benchmark/js/EnterEditMode.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime, gui, ops*/ diff --git a/programs/benchmark/js/HTMLActionResult.js b/programs/benchmark/js/HTMLActionResult.js index c04c6f2c0..fd298c048 100644 --- a/programs/benchmark/js/HTMLActionResult.js +++ b/programs/benchmark/js/HTMLActionResult.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, document*/ diff --git a/programs/benchmark/js/HTMLBenchmark.js b/programs/benchmark/js/HTMLBenchmark.js index 132609407..3cd2884c2 100644 --- a/programs/benchmark/js/HTMLBenchmark.js +++ b/programs/benchmark/js/HTMLBenchmark.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, document, window, webodf*/ diff --git a/programs/benchmark/js/HTMLMatrixRenderer.js b/programs/benchmark/js/HTMLMatrixRenderer.js index e5530eb24..0ee431762 100644 --- a/programs/benchmark/js/HTMLMatrixRenderer.js +++ b/programs/benchmark/js/HTMLMatrixRenderer.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, document*/ diff --git a/programs/benchmark/js/HTMLResultsRenderer.js b/programs/benchmark/js/HTMLResultsRenderer.js index 8490d5df4..4e15927b8 100644 --- a/programs/benchmark/js/HTMLResultsRenderer.js +++ b/programs/benchmark/js/HTMLResultsRenderer.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, document*/ diff --git a/programs/benchmark/js/InsertLetterA.js b/programs/benchmark/js/InsertLetterA.js index 0413560f1..9b3de985d 100644 --- a/programs/benchmark/js/InsertLetterA.js +++ b/programs/benchmark/js/InsertLetterA.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/MoveCursorLeft.js b/programs/benchmark/js/MoveCursorLeft.js index 6b7d6f8da..f74befc95 100644 --- a/programs/benchmark/js/MoveCursorLeft.js +++ b/programs/benchmark/js/MoveCursorLeft.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/MoveCursorToEnd.js b/programs/benchmark/js/MoveCursorToEnd.js index 982c3db76..e3c305a0a 100644 --- a/programs/benchmark/js/MoveCursorToEnd.js +++ b/programs/benchmark/js/MoveCursorToEnd.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/MoveCursorToEndDirect.js b/programs/benchmark/js/MoveCursorToEndDirect.js index a0207797c..8e92f5073 100644 --- a/programs/benchmark/js/MoveCursorToEndDirect.js +++ b/programs/benchmark/js/MoveCursorToEndDirect.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/MoveCursorToStart.js b/programs/benchmark/js/MoveCursorToStart.js index d8b813f87..2a1b494b5 100644 --- a/programs/benchmark/js/MoveCursorToStart.js +++ b/programs/benchmark/js/MoveCursorToStart.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/OdfBenchmarkContext.js b/programs/benchmark/js/OdfBenchmarkContext.js index 4e6a61722..fc7dad90b 100644 --- a/programs/benchmark/js/OdfBenchmarkContext.js +++ b/programs/benchmark/js/OdfBenchmarkContext.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime*/ diff --git a/programs/benchmark/js/OpenDocument.js b/programs/benchmark/js/OpenDocument.js index eced8336f..4db7f549c 100644 --- a/programs/benchmark/js/OpenDocument.js +++ b/programs/benchmark/js/OpenDocument.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/PreloadDocument.js b/programs/benchmark/js/PreloadDocument.js index 6ebdc247f..753c60c5e 100644 --- a/programs/benchmark/js/PreloadDocument.js +++ b/programs/benchmark/js/PreloadDocument.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime*/ diff --git a/programs/benchmark/js/RangeCalculator.js b/programs/benchmark/js/RangeCalculator.js index 669f63b69..5fa6d9ffd 100644 --- a/programs/benchmark/js/RangeCalculator.js +++ b/programs/benchmark/js/RangeCalculator.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime, odf, document, Node*/ diff --git a/programs/benchmark/js/RemoveCurrentSelection.js b/programs/benchmark/js/RemoveCurrentSelection.js index e014d3fda..4a541ddc0 100644 --- a/programs/benchmark/js/RemoveCurrentSelection.js +++ b/programs/benchmark/js/RemoveCurrentSelection.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/RemovePositions.js b/programs/benchmark/js/RemovePositions.js index 26598a48c..0eb930869 100644 --- a/programs/benchmark/js/RemovePositions.js +++ b/programs/benchmark/js/RemovePositions.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/SaveDocument.js b/programs/benchmark/js/SaveDocument.js index e1282cf02..4cc868768 100644 --- a/programs/benchmark/js/SaveDocument.js +++ b/programs/benchmark/js/SaveDocument.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/js/SelectEntireDocument.js b/programs/benchmark/js/SelectEntireDocument.js index a8013b516..46f6af840 100644 --- a/programs/benchmark/js/SelectEntireDocument.js +++ b/programs/benchmark/js/SelectEntireDocument.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/benchmark/libexec/bundle.js b/programs/benchmark/libexec/bundle.js index c06cd39f5..bdd5244c7 100644 --- a/programs/benchmark/libexec/bundle.js +++ b/programs/benchmark/libexec/bundle.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global require, process, console*/ diff --git a/programs/benchmark/runner.css b/programs/benchmark/runner.css index aba3b0f93..15e18d691 100644 --- a/programs/benchmark/runner.css +++ b/programs/benchmark/runner.css @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ html, body { diff --git a/programs/benchmark/webodf.js b/programs/benchmark/webodf.js index 2517ac451..83998fa83 100644 --- a/programs/benchmark/webodf.js +++ b/programs/benchmark/webodf.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global XMLHttpRequest, runtime*/ diff --git a/programs/cordova/config.xml.in b/programs/cordova/config.xml.in index 39af309b8..59f37d12a 100644 --- a/programs/cordova/config.xml.in +++ b/programs/cordova/config.xml.in @@ -4,7 +4,7 @@ A viewer for OpenDocument Format files. - + Jos van den Oever diff --git a/programs/cordova/plugins/org.webodf.starturl/www/starturl.js b/programs/cordova/plugins/org.webodf.starturl/www/starturl.js index cd19b99c0..b6646426a 100644 --- a/programs/cordova/plugins/org.webodf.starturl/www/starturl.js +++ b/programs/cordova/plugins/org.webodf.starturl/www/starturl.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global window, console, require*/ var exec = require('cordova/exec'); diff --git a/programs/cordova/www/FileScanner.js b/programs/cordova/www/FileScanner.js index 747275d5f..70a7ddc17 100644 --- a/programs/cordova/www/FileScanner.js +++ b/programs/cordova/www/FileScanner.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global window, console, navigator*/ diff --git a/programs/cordova/www/OdfViewer.js b/programs/cordova/www/OdfViewer.js index 9f4addf62..2a1eaabd1 100644 --- a/programs/cordova/www/OdfViewer.js +++ b/programs/cordova/www/OdfViewer.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global FileScanner, window, DirectoryEntry, FileScannerEntry, FileScannerFileEntry, Blob, XMLHttpRequest, odf, console, WebKitBlobBuilder, navigator, runtime, FileReader, Uint8Array, endsWith*/ diff --git a/programs/cordova/www/index.js b/programs/cordova/www/index.js index f5edc64c7..decf1db09 100644 --- a/programs/cordova/www/index.js +++ b/programs/cordova/www/index.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global alert, document, window, FileScanner, OdfViewer*/ diff --git a/programs/docnosis/docnosis.js b/programs/docnosis/docnosis.js index 9bab34a1f..d9f272fae 100644 --- a/programs/docnosis/docnosis.js +++ b/programs/docnosis/docnosis.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, Node, window, DOMParser, webodfcore, xmldom, NodeFilter, alert, FileReader*/ diff --git a/programs/editor/CMakeLists.txt b/programs/editor/CMakeLists.txt index 49c0cc630..fd2a9d44e 100644 --- a/programs/editor/CMakeLists.txt +++ b/programs/editor/CMakeLists.txt @@ -106,7 +106,14 @@ add_custom_command( COMMAND ${NODE} ${CMAKE_SOURCE_DIR}/webodf/tools/dojoNlsCompile.js dojo-deps/dist de fr nl it eu > dojobundle.js - COMMAND ${NODE} ${CMAKE_CURRENT_SOURCE_DIR}/libexec/mergeIntoDojo.js dojobuild=${DOJO_DEPS}/dist/dojo/dojo.js dojobundle.js > dojo-amalgamation.js + COMMAND ${NODE} ${CMAKE_CURRENT_SOURCE_DIR}/libexec/mergeIntoDojo.js dojobuild=${DOJO_DEPS}/dist/dojo/dojo.js dojobundle.js > dojo-amalgamation-full.js + + # The layer of dojo is built without a minifier, see the profile beside + # this file, and the whole of it is minified here instead, by terser, the + # one the library is minified with: it leaves the modules of dojo alone, + # where the closure compiler of today writes half of them wrong. + COMMAND ${NODE} ${CMAKE_SOURCE_DIR}/node_modules/terser/bin/terser + dojo-amalgamation-full.js -c -m -o dojo-amalgamation.js # cleanup # COMMAND ${CMAKE_COMMAND} -E remove_directory dojo-deps/dist diff --git a/programs/editor/EditorSession.js b/programs/editor/EditorSession.js index aa01e9a9b..2a0a71df8 100644 --- a/programs/editor/EditorSession.js +++ b/programs/editor/EditorSession.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, define, document, webodfcore, odf, gui, ops*/ diff --git a/programs/editor/FullWindowZoomHelper.js b/programs/editor/FullWindowZoomHelper.js index b3d88b928..81d5cae21 100644 --- a/programs/editor/FullWindowZoomHelper.js +++ b/programs/editor/FullWindowZoomHelper.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, document, window */ diff --git a/programs/editor/MemberListView.js b/programs/editor/MemberListView.js index c188e2af9..1fc98db0a 100644 --- a/programs/editor/MemberListView.js +++ b/programs/editor/MemberListView.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define,runtime */ diff --git a/programs/editor/SessionBackend.js b/programs/editor/SessionBackend.js index 15e194299..9b2f574da 100644 --- a/programs/editor/SessionBackend.js +++ b/programs/editor/SessionBackend.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops*/ diff --git a/programs/editor/SessionList.js b/programs/editor/SessionList.js index 1d9f0e2b9..7076e6ebb 100644 --- a/programs/editor/SessionList.js +++ b/programs/editor/SessionList.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, runtime */ diff --git a/programs/editor/SessionListView.js b/programs/editor/SessionListView.js index ff32f029e..9a7145bed 100644 --- a/programs/editor/SessionListView.js +++ b/programs/editor/SessionListView.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, define, runtime */ diff --git a/programs/editor/Tools.js b/programs/editor/Tools.js index e5e2e9bab..9a6c18daf 100644 --- a/programs/editor/Tools.js +++ b/programs/editor/Tools.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global window, define, require, document, dijit, dojo, runtime, ops*/ diff --git a/programs/editor/Translator.js b/programs/editor/Translator.js index 434fb7b92..19e059659 100644 --- a/programs/editor/Translator.js +++ b/programs/editor/Translator.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime, XMLHttpRequest */ diff --git a/programs/editor/backend/Server.js b/programs/editor/backend/Server.js index 4a95684bc..c7a083833 100644 --- a/programs/editor/backend/Server.js +++ b/programs/editor/backend/Server.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops*/ diff --git a/programs/editor/backend/ServerFactory.js b/programs/editor/backend/ServerFactory.js index 67340de8d..f9a61e608 100644 --- a/programs/editor/backend/ServerFactory.js +++ b/programs/editor/backend/ServerFactory.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, SessionList*/ diff --git a/programs/editor/backend/jsglobal/OperationRouter.js b/programs/editor/backend/jsglobal/OperationRouter.js index 95a23b6d3..64ea7ff66 100644 --- a/programs/editor/backend/jsglobal/OperationRouter.js +++ b/programs/editor/backend/jsglobal/OperationRouter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime, webodfcore, ops*/ diff --git a/programs/editor/backend/jsglobal/Server.js b/programs/editor/backend/jsglobal/Server.js index 12b7d75be..f9914269b 100644 --- a/programs/editor/backend/jsglobal/Server.js +++ b/programs/editor/backend/jsglobal/Server.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, window, runtime, webodfcore*/ diff --git a/programs/editor/backend/jsglobal/ServerFactory.js b/programs/editor/backend/jsglobal/ServerFactory.js index f200f36f5..fd018c1ce 100644 --- a/programs/editor/backend/jsglobal/ServerFactory.js +++ b/programs/editor/backend/jsglobal/ServerFactory.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, document, require, runtime, ops */ diff --git a/programs/editor/backend/jsglobal/SessionBackend.js b/programs/editor/backend/jsglobal/SessionBackend.js index 6e93aedcb..9a6416b85 100644 --- a/programs/editor/backend/jsglobal/SessionBackend.js +++ b/programs/editor/backend/jsglobal/SessionBackend.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, ops*/ diff --git a/programs/editor/backend/jsglobal/SessionList.js b/programs/editor/backend/jsglobal/SessionList.js index 1123ca2d6..02adb187c 100644 --- a/programs/editor/backend/jsglobal/SessionList.js +++ b/programs/editor/backend/jsglobal/SessionList.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, ops, runtime, webodfcore */ diff --git a/programs/editor/backend/pullbox/OperationRouter.js b/programs/editor/backend/pullbox/OperationRouter.js index e75b43ec4..4d8c88f40 100644 --- a/programs/editor/backend/pullbox/OperationRouter.js +++ b/programs/editor/backend/pullbox/OperationRouter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime, webodfcore, ops*/ diff --git a/programs/editor/backend/pullbox/Server.js b/programs/editor/backend/pullbox/Server.js index 83f369324..d3490ed5a 100644 --- a/programs/editor/backend/pullbox/Server.js +++ b/programs/editor/backend/pullbox/Server.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime, webodfcore, XMLHttpRequest*/ diff --git a/programs/editor/backend/pullbox/ServerFactory.js b/programs/editor/backend/pullbox/ServerFactory.js index 0ceb3a152..7f2f6ccf7 100644 --- a/programs/editor/backend/pullbox/ServerFactory.js +++ b/programs/editor/backend/pullbox/ServerFactory.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, document, require, runtime, ops */ diff --git a/programs/editor/backend/pullbox/SessionBackend.js b/programs/editor/backend/pullbox/SessionBackend.js index 1ea866f24..79338918f 100644 --- a/programs/editor/backend/pullbox/SessionBackend.js +++ b/programs/editor/backend/pullbox/SessionBackend.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, ops*/ diff --git a/programs/editor/backend/pullbox/SessionList.js b/programs/editor/backend/pullbox/SessionList.js index fa8ccd097..f6f18f8de 100644 --- a/programs/editor/backend/pullbox/SessionList.js +++ b/programs/editor/backend/pullbox/SessionList.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, ops, runtime */ diff --git a/programs/editor/bellaplugin.js b/programs/editor/bellaplugin.js index 7fc4d0f4e..d1eb7c772 100644 --- a/programs/editor/bellaplugin.js +++ b/programs/editor/bellaplugin.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global window*/ diff --git a/programs/editor/dojo-deps/profiles/app.profile.js b/programs/editor/dojo-deps/profiles/app.profile.js index 210674e9e..4615fa495 100644 --- a/programs/editor/dojo-deps/profiles/app.profile.js +++ b/programs/editor/dojo-deps/profiles/app.profile.js @@ -31,14 +31,16 @@ var profile = { // Excludes tests, demos, and original template files from being included in the built version. mini: true, - // Uses Closure Compiler as the JavaScript minifier. This can also be set to "shrinksafe" to use ShrinkSafe, - // though ShrinkSafe is deprecated and not recommended. - // This option defaults to "" (no compression) if not provided. - optimize: 'closure', + // Nothing is minified here: the closure compiler of today writes the + // modules of dojo wrong, as "define("a b c", f)" where the names of the + // dependencies belong in a list, and half of the modules of a build came + // out that way. The layer is minified by terser once it is whole, see + // "CMakeLists.txt" beside this file. + optimize: '', // We're building layers, so we need to set the minifier to use for those, too. // This defaults to "shrinksafe" if not provided. - layerOptimize: 'closure', + layerOptimize: '', // Strips all calls to console functions within the code. You can also set this to "warn" to strip everything // but console.error, and any other truthy value to strip everything but console.warn and console.error. diff --git a/programs/editor/libexec/mergeIntoDojo.js b/programs/editor/libexec/mergeIntoDojo.js index 42404b1b8..569c30afa 100644 --- a/programs/editor/libexec/mergeIntoDojo.js +++ b/programs/editor/libexec/mergeIntoDojo.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /* @@ -98,8 +98,20 @@ return 1; } - tail = dojo_build.slice(dojo_build.length-1000).toString(); - idx = dojo_build.length - 1000 + tail.lastIndexOf("\n"); + // The modules are put before the line that boots the loader, so that + // nothing is asked for on demand once the page runs. That line was looked + // for as the last line of the file, which held while dojo was minified + // into one line by its own build; it is looked for by what it does + // instead, so that a build that is not minified is read as well. + tail = dojo_build.toString(); + idx = tail.lastIndexOf("!require.async"); + if (idx === -1) { + idx = tail.lastIndexOf("\n"); + } + if (idx === -1) { + log("the boot of the loader was not found in the build of dojo."); + return 1; + } process.stdout.write(dojo_build.slice(0, idx)); diff --git a/programs/editor/localfileeditor.js b/programs/editor/localfileeditor.js index ed8e4e061..6aa03cecb 100644 --- a/programs/editor/localfileeditor.js +++ b/programs/editor/localfileeditor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global document, window, runtime, FileReader, alert, Uint8Array, Blob, saveAs, Wodo*/ diff --git a/programs/editor/plugins/bella/Actions.js b/programs/editor/plugins/bella/Actions.js index 414cf79ac..2636db4cb 100644 --- a/programs/editor/plugins/bella/Actions.js +++ b/programs/editor/plugins/bella/Actions.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, odf*/ diff --git a/programs/editor/plugins/bella/Bella.js b/programs/editor/plugins/bella/Bella.js index 548053fae..cad253e59 100644 --- a/programs/editor/plugins/bella/Bella.js +++ b/programs/editor/plugins/bella/Bella.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, window, ops*/ @@ -75,7 +75,7 @@ define("webodf/editor/plugins/bella/Bella", [ * Workaround a TrivialUndoManager bug with cursor positions not being * correctly restored. It's done by adding OpMoveCursors for all cursors * with the current cursor state as the very last operations. - * (see also https://github.com/kogmbh/WebODF/issues/903) + * (see also https://github.com/webodf/WebODF/issues/903) * @return {undefined} */ function saveCurrentCursorPositions() { diff --git a/programs/editor/plugins/bella/BellaControl.js b/programs/editor/plugins/bella/BellaControl.js index 84e6ed58d..36f3b84ba 100644 --- a/programs/editor/plugins/bella/BellaControl.js +++ b/programs/editor/plugins/bella/BellaControl.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, runtime*/ diff --git a/programs/editor/plugins/bella/CatHerder.js b/programs/editor/plugins/bella/CatHerder.js index d93dc00ed..0b938fe04 100644 --- a/programs/editor/plugins/bella/CatHerder.js +++ b/programs/editor/plugins/bella/CatHerder.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, window*/ diff --git a/programs/editor/plugins/bella/DocumentValidator.js b/programs/editor/plugins/bella/DocumentValidator.js index 38794a2b8..2fadfbc76 100644 --- a/programs/editor/plugins/bella/DocumentValidator.js +++ b/programs/editor/plugins/bella/DocumentValidator.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, window, NodeFilter, ops, runtime*/ diff --git a/programs/editor/plugins/bella/Random.js b/programs/editor/plugins/bella/Random.js index 6cbcff361..ea697d07a 100644 --- a/programs/editor/plugins/bella/Random.js +++ b/programs/editor/plugins/bella/Random.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define*/ diff --git a/programs/editor/plugins/bella/SimpleStatusReporter.js b/programs/editor/plugins/bella/SimpleStatusReporter.js index dba6e6494..e491f64df 100644 --- a/programs/editor/plugins/bella/SimpleStatusReporter.js +++ b/programs/editor/plugins/bella/SimpleStatusReporter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, window*/ diff --git a/programs/editor/plugins/bella/WrappedSessionController.js b/programs/editor/plugins/bella/WrappedSessionController.js index 2b0d502c1..69f5ca519 100644 --- a/programs/editor/plugins/bella/WrappedSessionController.js +++ b/programs/editor/plugins/bella/WrappedSessionController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, window*/ diff --git a/programs/editor/pullboxeditor.js b/programs/editor/pullboxeditor.js index 51978ad45..ee8dbac65 100644 --- a/programs/editor/pullboxeditor.js +++ b/programs/editor/pullboxeditor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global require, document, window, history, runtime, Wodo, alert*/ diff --git a/programs/editor/revieweditor.js b/programs/editor/revieweditor.js index f159701ab..0c45f26a4 100644 --- a/programs/editor/revieweditor.js +++ b/programs/editor/revieweditor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global document, window, runtime, FileReader, alert, Uint8Array, Blob, saveAs, Wodo*/ diff --git a/programs/editor/splitscreeneditor.js b/programs/editor/splitscreeneditor.js index 74c9c0e21..8f3fea128 100644 --- a/programs/editor/splitscreeneditor.js +++ b/programs/editor/splitscreeneditor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global require, define, document, window, runtime, alert, Wodo*/ diff --git a/programs/editor/webodf.js b/programs/editor/webodf.js index e8773cb3d..b9ec95eba 100644 --- a/programs/editor/webodf.js +++ b/programs/editor/webodf.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global XMLHttpRequest, runtime, WodoFromSource: true*/ diff --git a/programs/editor/widgets/aboutDialog.js b/programs/editor/widgets/aboutDialog.js index a42463d2a..cfca3923b 100644 --- a/programs/editor/widgets/aboutDialog.js +++ b/programs/editor/widgets/aboutDialog.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, dojo, runtime, webodf */ diff --git a/programs/editor/widgets/annotation.js b/programs/editor/widgets/annotation.js index 9f0e4319e..c77a71bce 100644 --- a/programs/editor/widgets/annotation.js +++ b/programs/editor/widgets/annotation.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require, runtime, gui */ diff --git a/programs/editor/widgets/dialogWidgets/alignmentPane.js b/programs/editor/widgets/dialogWidgets/alignmentPane.js index e8d6d69ee..c1f154bb9 100644 --- a/programs/editor/widgets/dialogWidgets/alignmentPane.js +++ b/programs/editor/widgets/dialogWidgets/alignmentPane.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime,webodfcore,define,require,dijit */ diff --git a/programs/editor/widgets/dialogWidgets/editHyperlinkPane.js b/programs/editor/widgets/dialogWidgets/editHyperlinkPane.js index c7cdd5368..b3fb56f7f 100644 --- a/programs/editor/widgets/dialogWidgets/editHyperlinkPane.js +++ b/programs/editor/widgets/dialogWidgets/editHyperlinkPane.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime,webodfcore,define,require,document,dijit */ diff --git a/programs/editor/widgets/dialogWidgets/fontEffectsPane.js b/programs/editor/widgets/dialogWidgets/fontEffectsPane.js index eb049463d..6faed5e8f 100644 --- a/programs/editor/widgets/dialogWidgets/fontEffectsPane.js +++ b/programs/editor/widgets/dialogWidgets/fontEffectsPane.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime,define,require,document,dijit */ diff --git a/programs/editor/widgets/dialogWidgets/idMangler.js b/programs/editor/widgets/dialogWidgets/idMangler.js index 4118b1468..7fb9d33c5 100644 --- a/programs/editor/widgets/dialogWidgets/idMangler.js +++ b/programs/editor/widgets/dialogWidgets/idMangler.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, document, dojo, dijit */ diff --git a/programs/editor/widgets/editHyperlinks.js b/programs/editor/widgets/editHyperlinks.js index b2c031c13..b5e2ef4d5 100644 --- a/programs/editor/widgets/editHyperlinks.js +++ b/programs/editor/widgets/editHyperlinks.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require, document, odf, runtime, webodfcore, gui */ diff --git a/programs/editor/widgets/fontPicker.js b/programs/editor/widgets/fontPicker.js index d243c6869..9c5775ac1 100644 --- a/programs/editor/widgets/fontPicker.js +++ b/programs/editor/widgets/fontPicker.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define,require,document */ define("webodf/editor/widgets/fontPicker", [ diff --git a/programs/editor/widgets/imageInserter.js b/programs/editor/widgets/imageInserter.js index ddac52156..ad3e6d0c4 100644 --- a/programs/editor/widgets/imageInserter.js +++ b/programs/editor/widgets/imageInserter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require, document, Image, FileReader, window, runtime, ops, gui */ diff --git a/programs/editor/widgets/paragraphAlignment.js b/programs/editor/widgets/paragraphAlignment.js index d0f35ad9f..70b358c02 100644 --- a/programs/editor/widgets/paragraphAlignment.js +++ b/programs/editor/widgets/paragraphAlignment.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require, ops, gui, runtime */ diff --git a/programs/editor/widgets/paragraphStyles.js b/programs/editor/widgets/paragraphStyles.js index c17b59fd4..c1a4687a5 100644 --- a/programs/editor/widgets/paragraphStyles.js +++ b/programs/editor/widgets/paragraphStyles.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require, runtime, ops */ diff --git a/programs/editor/widgets/paragraphStylesDialog.js b/programs/editor/widgets/paragraphStylesDialog.js index 1629a89bf..1a0beea37 100644 --- a/programs/editor/widgets/paragraphStylesDialog.js +++ b/programs/editor/widgets/paragraphStylesDialog.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require, dojo, dijit, runtime */ diff --git a/programs/editor/widgets/simpleStyles.js b/programs/editor/widgets/simpleStyles.js index c8b0edfad..7069ede70 100644 --- a/programs/editor/widgets/simpleStyles.js +++ b/programs/editor/widgets/simpleStyles.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require, runtime, gui, ops */ diff --git a/programs/editor/widgets/toolbarWidgets/currentStyle.js b/programs/editor/widgets/toolbarWidgets/currentStyle.js index 5503ceeb1..3bc13d068 100644 --- a/programs/editor/widgets/toolbarWidgets/currentStyle.js +++ b/programs/editor/widgets/toolbarWidgets/currentStyle.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require */ diff --git a/programs/editor/widgets/undoRedoMenu.js b/programs/editor/widgets/undoRedoMenu.js index 9c2f2c398..e1ad5ef83 100644 --- a/programs/editor/widgets/undoRedoMenu.js +++ b/programs/editor/widgets/undoRedoMenu.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require, runtime*/ diff --git a/programs/editor/widgets/zoomSlider.js b/programs/editor/widgets/zoomSlider.js index bf37cd8fc..d333cf318 100644 --- a/programs/editor/widgets/zoomSlider.js +++ b/programs/editor/widgets/zoomSlider.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global define, require, gui*/ diff --git a/programs/editor/wodocollabpane.css b/programs/editor/wodocollabpane.css index 13068bb5b..af3199a28 100644 --- a/programs/editor/wodocollabpane.css +++ b/programs/editor/wodocollabpane.css @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ .webodfeditor-members { diff --git a/programs/editor/wodocollabtexteditor.js b/programs/editor/wodocollabtexteditor.js index 7af966b9b..c0c6f1946 100644 --- a/programs/editor/wodocollabtexteditor.js +++ b/programs/editor/wodocollabtexteditor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Wodo, require, navigator, dojo, runtime, document, window, webodfcore, ops, gui, odf*/ diff --git a/programs/editor/wodotexteditor.css b/programs/editor/wodotexteditor.css index e9832af35..733d916ad 100644 --- a/programs/editor/wodotexteditor.css +++ b/programs/editor/wodotexteditor.css @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ .webodfeditor-editor *:focus { diff --git a/programs/editor/wodotexteditor.js b/programs/editor/wodotexteditor.js index 1b9e2c781..63f04369a 100644 --- a/programs/editor/wodotexteditor.js +++ b/programs/editor/wodotexteditor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global window, document, alert, navigator, require, dojo, runtime, webodfcore, gui, ops, odf, WodoFromSource*/ @@ -634,7 +634,7 @@ window.Wodo = window.Wodo || (function () { }; // TODO: - // this.openDocumentFromByteArray = openDocumentFromByteArray; see also https://github.com/kogmbh/WebODF/issues/375 + // this.openDocumentFromByteArray = openDocumentFromByteArray; see also https://github.com/webodf/WebODF/issues/375 // setReadOnly: setReadOnly, /** diff --git a/programs/opendocumentviewer-desktop/main.cpp b/programs/opendocumentviewer-desktop/main.cpp index 2c75e0a3c..2e267fcf0 100644 --- a/programs/opendocumentviewer-desktop/main.cpp +++ b/programs/opendocumentviewer-desktop/main.cpp @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /** diff --git a/programs/opendocumentviewer-desktop/mainwindow.cpp b/programs/opendocumentviewer-desktop/mainwindow.cpp index 6072c86a5..ac09f7ca1 100644 --- a/programs/opendocumentviewer-desktop/mainwindow.cpp +++ b/programs/opendocumentviewer-desktop/mainwindow.cpp @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #include "mainwindow.h" diff --git a/programs/opendocumentviewer-desktop/mainwindow.h b/programs/opendocumentviewer-desktop/mainwindow.h index 9fce9ab75..3f583ca5d 100644 --- a/programs/opendocumentviewer-desktop/mainwindow.h +++ b/programs/opendocumentviewer-desktop/mainwindow.h @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #ifndef MAINWINDOW_H diff --git a/programs/opendocumentviewer-desktop/packaging.cmake b/programs/opendocumentviewer-desktop/packaging.cmake index c0fe70ccf..b85f84ff7 100644 --- a/programs/opendocumentviewer-desktop/packaging.cmake +++ b/programs/opendocumentviewer-desktop/packaging.cmake @@ -18,7 +18,7 @@ # @licend # # @source: http://www.webodf.org/ -# @source: https://github.com/kogmbh/WebODF/ +# @source: https://github.com/webodf/WebODF/ # The ways the viewer of the desktop is handed over, from the shortest to the # most finished: diff --git a/programs/opendocumentviewer-desktop/viewerscheme.cpp b/programs/opendocumentviewer-desktop/viewerscheme.cpp index 442a15803..ca9de11a3 100644 --- a/programs/opendocumentviewer-desktop/viewerscheme.cpp +++ b/programs/opendocumentviewer-desktop/viewerscheme.cpp @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #include "viewerscheme.h" diff --git a/programs/opendocumentviewer-desktop/viewerscheme.h b/programs/opendocumentviewer-desktop/viewerscheme.h index 7c4875692..9a123df3f 100644 --- a/programs/opendocumentviewer-desktop/viewerscheme.h +++ b/programs/opendocumentviewer-desktop/viewerscheme.h @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #ifndef VIEWERSCHEME_H diff --git a/programs/opendocumentviewer-desktop/words.h b/programs/opendocumentviewer-desktop/words.h index 1f6240178..dfd3fe4e4 100644 --- a/programs/opendocumentviewer-desktop/words.h +++ b/programs/opendocumentviewer-desktop/words.h @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #ifndef WORDS_H diff --git a/programs/opendocumentviewer-webext/background-chrome.js b/programs/opendocumentviewer-webext/background-chrome.js index b6c864f1b..85f269599 100644 --- a/programs/opendocumentviewer-webext/background-chrome.js +++ b/programs/opendocumentviewer-webext/background-chrome.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global chrome*/ diff --git a/programs/opendocumentviewer-webext/background-thunderbird.js b/programs/opendocumentviewer-webext/background-thunderbird.js index 0e329f1ba..5fa8cf40c 100644 --- a/programs/opendocumentviewer-webext/background-thunderbird.js +++ b/programs/opendocumentviewer-webext/background-thunderbird.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global messenger*/ diff --git a/programs/opendocumentviewer-webext/background.js b/programs/opendocumentviewer-webext/background.js index 677feff30..6a8302814 100644 --- a/programs/opendocumentviewer-webext/background.js +++ b/programs/opendocumentviewer-webext/background.js @@ -20,7 +20,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global browser, URL*/ diff --git a/programs/opendocumentviewer-webext/viewer.js b/programs/opendocumentviewer-webext/viewer.js index 371ab1fbd..530060b4a 100644 --- a/programs/opendocumentviewer-webext/viewer.js +++ b/programs/opendocumentviewer-webext/viewer.js @@ -20,7 +20,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global document, window, browser, chrome, odf, URLSearchParams, URL*/ diff --git a/programs/opendocumentviewer-webext/welcome-open.js b/programs/opendocumentviewer-webext/welcome-open.js index 2fa53dbb9..5b1f22ddd 100644 --- a/programs/opendocumentviewer-webext/welcome-open.js +++ b/programs/opendocumentviewer-webext/welcome-open.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global window, browser, chrome*/ diff --git a/programs/opendocumentviewer-webext/welcome.js b/programs/opendocumentviewer-webext/welcome.js index 91ea22a6b..a81405baa 100644 --- a/programs/opendocumentviewer-webext/welcome.js +++ b/programs/opendocumentviewer-webext/welcome.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global document, window, browser, chrome, URLSearchParams, Image*/ diff --git a/programs/qtjsruntime/bindings.cpp b/programs/qtjsruntime/bindings.cpp index 3dfd8ad74..6cd3f3cf6 100644 --- a/programs/qtjsruntime/bindings.cpp +++ b/programs/qtjsruntime/bindings.cpp @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #include "bindings.h" diff --git a/programs/qtjsruntime/bindings.h b/programs/qtjsruntime/bindings.h index e8fe21d5b..1f8f27f8d 100644 --- a/programs/qtjsruntime/bindings.h +++ b/programs/qtjsruntime/bindings.h @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #ifndef BINDINGS_H diff --git a/programs/qtjsruntime/main.cpp b/programs/qtjsruntime/main.cpp index a29bc2283..055c48bb4 100644 --- a/programs/qtjsruntime/main.cpp +++ b/programs/qtjsruntime/main.cpp @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /** diff --git a/programs/qtjsruntime/nativeio.cpp b/programs/qtjsruntime/nativeio.cpp index 1bd31faa8..3e24febe9 100644 --- a/programs/qtjsruntime/nativeio.cpp +++ b/programs/qtjsruntime/nativeio.cpp @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #include "nativeio.h" diff --git a/programs/qtjsruntime/nativeio.h b/programs/qtjsruntime/nativeio.h index 3a07ef966..3917c5d99 100644 --- a/programs/qtjsruntime/nativeio.h +++ b/programs/qtjsruntime/nativeio.h @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #ifndef NATIVEIO_H diff --git a/programs/qtjsruntime/requestfilter.h b/programs/qtjsruntime/requestfilter.h index c63ad062a..1f3495400 100644 --- a/programs/qtjsruntime/requestfilter.h +++ b/programs/qtjsruntime/requestfilter.h @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #ifndef REQUESTFILTER_H diff --git a/programs/qtjsruntime/runner.cpp b/programs/qtjsruntime/runner.cpp index 79274fe6a..7b46e0a7c 100644 --- a/programs/qtjsruntime/runner.cpp +++ b/programs/qtjsruntime/runner.cpp @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #include "runner.h" diff --git a/programs/qtjsruntime/runner.h b/programs/qtjsruntime/runner.h index 113170b1e..8b0cf2bcc 100644 --- a/programs/qtjsruntime/runner.h +++ b/programs/qtjsruntime/runner.h @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ #ifndef RUNNER_H diff --git a/webodf/compare.js b/webodf/compare.js index e58d34595..58a7a2e3d 100644 --- a/webodf/compare.js +++ b/webodf/compare.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf*/ diff --git a/webodf/externs/JSZip.js b/webodf/externs/JSZip.js index 56f7d5737..72fa2566c 100644 --- a/webodf/externs/JSZip.js +++ b/webodf/externs/JSZip.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global externs*/ diff --git a/webodf/filelister.js b/webodf/filelister.js index 7d98d6121..229a64e42 100644 --- a/webodf/filelister.js +++ b/webodf/filelister.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global XMLHttpRequest*/ diff --git a/webodf/httpserver.js b/webodf/httpserver.js index 8c92bd13a..a611eda05 100644 --- a/webodf/httpserver.js +++ b/webodf/httpserver.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global require, console, process, Buffer, unescape*/ diff --git a/webodf/lib/HeaderCompiled.js b/webodf/lib/HeaderCompiled.js index 4c5e9c799..033039f77 100644 --- a/webodf/lib/HeaderCompiled.js +++ b/webodf/lib/HeaderCompiled.js @@ -22,5 +22,5 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ diff --git a/webodf/lib/gui/AnnotationController.js b/webodf/lib/gui/AnnotationController.js index 560c434cc..3a39168ad 100644 --- a/webodf/lib/gui/AnnotationController.js +++ b/webodf/lib/gui/AnnotationController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, ops, Node*/ diff --git a/webodf/lib/gui/AnnotationViewManager.js b/webodf/lib/gui/AnnotationViewManager.js index a2d2ddb4d..e87a813e1 100644 --- a/webodf/lib/gui/AnnotationViewManager.js +++ b/webodf/lib/gui/AnnotationViewManager.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui, webodfcore, odf, Node*/ diff --git a/webodf/lib/gui/Avatar.js b/webodf/lib/gui/Avatar.js index ae19c4483..293e19035 100644 --- a/webodf/lib/gui/Avatar.js +++ b/webodf/lib/gui/Avatar.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui*/ diff --git a/webodf/lib/gui/BlacklistNamespaceNodeFilter.js b/webodf/lib/gui/BlacklistNamespaceNodeFilter.js index e48f976d0..cdce430f2 100644 --- a/webodf/lib/gui/BlacklistNamespaceNodeFilter.js +++ b/webodf/lib/gui/BlacklistNamespaceNodeFilter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, NodeFilter*/ diff --git a/webodf/lib/gui/Caret.js b/webodf/lib/gui/Caret.js index 074693dac..575e7761b 100644 --- a/webodf/lib/gui/Caret.js +++ b/webodf/lib/gui/Caret.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, gui, odf, ops, runtime, Node*/ diff --git a/webodf/lib/gui/CaretManager.js b/webodf/lib/gui/CaretManager.js index 253db720a..e0df8b6f9 100644 --- a/webodf/lib/gui/CaretManager.js +++ b/webodf/lib/gui/CaretManager.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, ops*/ diff --git a/webodf/lib/gui/Clipboard.js b/webodf/lib/gui/Clipboard.js index 86bcedf44..65155e3a0 100644 --- a/webodf/lib/gui/Clipboard.js +++ b/webodf/lib/gui/Clipboard.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, runtime*/ diff --git a/webodf/lib/gui/ClosestXOffsetScanner.js b/webodf/lib/gui/ClosestXOffsetScanner.js index 7a9a4f82e..9762db896 100644 --- a/webodf/lib/gui/ClosestXOffsetScanner.js +++ b/webodf/lib/gui/ClosestXOffsetScanner.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, gui*/ diff --git a/webodf/lib/gui/CommonConstraints.js b/webodf/lib/gui/CommonConstraints.js index a86e00394..fbaf14f78 100644 --- a/webodf/lib/gui/CommonConstraints.js +++ b/webodf/lib/gui/CommonConstraints.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui*/ diff --git a/webodf/lib/gui/DirectFormattingController.js b/webodf/lib/gui/DirectFormattingController.js index 085623f68..96b2084fb 100644 --- a/webodf/lib/gui/DirectFormattingController.js +++ b/webodf/lib/gui/DirectFormattingController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, ops, odf, gui, runtime*/ diff --git a/webodf/lib/gui/EditInfoHandle.js b/webodf/lib/gui/EditInfoHandle.js index c79bca191..b5721946e 100644 --- a/webodf/lib/gui/EditInfoHandle.js +++ b/webodf/lib/gui/EditInfoHandle.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, gui*/ diff --git a/webodf/lib/gui/EditInfoMarker.js b/webodf/lib/gui/EditInfoMarker.js index dc22c259a..46755c8ba 100644 --- a/webodf/lib/gui/EditInfoMarker.js +++ b/webodf/lib/gui/EditInfoMarker.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, gui, runtime*/ diff --git a/webodf/lib/gui/EventManager.js b/webodf/lib/gui/EventManager.js index 80dc939b3..78333b5dc 100644 --- a/webodf/lib/gui/EventManager.js +++ b/webodf/lib/gui/EventManager.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui, webodfcore, Node */ diff --git a/webodf/lib/gui/GuiStepUtils.js b/webodf/lib/gui/GuiStepUtils.js index 6ca43c23b..7aa04bcd7 100644 --- a/webodf/lib/gui/GuiStepUtils.js +++ b/webodf/lib/gui/GuiStepUtils.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf, gui, webodfcore, Node*/ diff --git a/webodf/lib/gui/HyperlinkClickHandler.js b/webodf/lib/gui/HyperlinkClickHandler.js index 2e74dbe0a..2dfa5283b 100644 --- a/webodf/lib/gui/HyperlinkClickHandler.js +++ b/webodf/lib/gui/HyperlinkClickHandler.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui, odf, xmldom */ diff --git a/webodf/lib/gui/HyperlinkController.js b/webodf/lib/gui/HyperlinkController.js index c25a482aa..c1b6006c1 100644 --- a/webodf/lib/gui/HyperlinkController.js +++ b/webodf/lib/gui/HyperlinkController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, Node, ops, odf */ diff --git a/webodf/lib/gui/HyperlinkTooltipView.js b/webodf/lib/gui/HyperlinkTooltipView.js index 846dc6e5a..26fa370fa 100644 --- a/webodf/lib/gui/HyperlinkTooltipView.js +++ b/webodf/lib/gui/HyperlinkTooltipView.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui, odf, webodfcore */ diff --git a/webodf/lib/gui/IOSSafariSupport.js b/webodf/lib/gui/IOSSafariSupport.js index 19eb7d786..1ec152ed4 100644 --- a/webodf/lib/gui/IOSSafariSupport.js +++ b/webodf/lib/gui/IOSSafariSupport.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui, webodfcore*/ diff --git a/webodf/lib/gui/ImageController.js b/webodf/lib/gui/ImageController.js index 51bba4d2a..c35f5bf4a 100644 --- a/webodf/lib/gui/ImageController.js +++ b/webodf/lib/gui/ImageController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, ops */ diff --git a/webodf/lib/gui/ImageSelector.js b/webodf/lib/gui/ImageSelector.js index 0f5c82fd1..05bc37c48 100644 --- a/webodf/lib/gui/ImageSelector.js +++ b/webodf/lib/gui/ImageSelector.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui, odf */ diff --git a/webodf/lib/gui/InputMethodEditor.js b/webodf/lib/gui/InputMethodEditor.js index 17b82fbef..5c9f6e2c3 100644 --- a/webodf/lib/gui/InputMethodEditor.js +++ b/webodf/lib/gui/InputMethodEditor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui, webodfcore, ops, Node, odf*/ diff --git a/webodf/lib/gui/KeyboardHandler.js b/webodf/lib/gui/KeyboardHandler.js index f48913a88..d2121a2ad 100644 --- a/webodf/lib/gui/KeyboardHandler.js +++ b/webodf/lib/gui/KeyboardHandler.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, runtime */ diff --git a/webodf/lib/gui/LineBoundaryScanner.js b/webodf/lib/gui/LineBoundaryScanner.js index 0fe6f4469..0cf75186e 100644 --- a/webodf/lib/gui/LineBoundaryScanner.js +++ b/webodf/lib/gui/LineBoundaryScanner.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui*/ diff --git a/webodf/lib/gui/MetadataController.js b/webodf/lib/gui/MetadataController.js index 6502c7cbc..a68723a10 100644 --- a/webodf/lib/gui/MetadataController.js +++ b/webodf/lib/gui/MetadataController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, runtime, webodfcore, ops, odf*/ diff --git a/webodf/lib/gui/MimeDataExporter.js b/webodf/lib/gui/MimeDataExporter.js index 78e727c1e..a6a4e13f3 100644 --- a/webodf/lib/gui/MimeDataExporter.js +++ b/webodf/lib/gui/MimeDataExporter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, runtime, odf*/ diff --git a/webodf/lib/gui/OdfFieldView.js b/webodf/lib/gui/OdfFieldView.js index a4bc0d3c6..76d951216 100644 --- a/webodf/lib/gui/OdfFieldView.js +++ b/webodf/lib/gui/OdfFieldView.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, odf*/ diff --git a/webodf/lib/gui/OdfTextBodyNodeFilter.js b/webodf/lib/gui/OdfTextBodyNodeFilter.js index 5ecf5b1cd..79da5af11 100644 --- a/webodf/lib/gui/OdfTextBodyNodeFilter.js +++ b/webodf/lib/gui/OdfTextBodyNodeFilter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, NodeFilter, odf, Node*/ diff --git a/webodf/lib/gui/ParagraphBoundaryScanner.js b/webodf/lib/gui/ParagraphBoundaryScanner.js index 0f59d5f4a..669ff8368 100644 --- a/webodf/lib/gui/ParagraphBoundaryScanner.js +++ b/webodf/lib/gui/ParagraphBoundaryScanner.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, odf*/ diff --git a/webodf/lib/gui/PasteController.js b/webodf/lib/gui/PasteController.js index 04ed393b6..a87ab1e5a 100644 --- a/webodf/lib/gui/PasteController.js +++ b/webodf/lib/gui/PasteController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui, ops, odf, webodfcore*/ diff --git a/webodf/lib/gui/SelectionController.js b/webodf/lib/gui/SelectionController.js index b8e5ee73b..441a97dc1 100644 --- a/webodf/lib/gui/SelectionController.js +++ b/webodf/lib/gui/SelectionController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, ops, Node */ diff --git a/webodf/lib/gui/SelectionView.js b/webodf/lib/gui/SelectionView.js index bc807e0d5..6c6e33ccf 100644 --- a/webodf/lib/gui/SelectionView.js +++ b/webodf/lib/gui/SelectionView.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui*/ diff --git a/webodf/lib/gui/SelectionViewManager.js b/webodf/lib/gui/SelectionViewManager.js index dc4506a38..e70cf9b48 100644 --- a/webodf/lib/gui/SelectionViewManager.js +++ b/webodf/lib/gui/SelectionViewManager.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, ops*/ diff --git a/webodf/lib/gui/SessionConstraints.js b/webodf/lib/gui/SessionConstraints.js index 014af0885..e03372b3e 100644 --- a/webodf/lib/gui/SessionConstraints.js +++ b/webodf/lib/gui/SessionConstraints.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, runtime, gui*/ diff --git a/webodf/lib/gui/SessionContext.js b/webodf/lib/gui/SessionContext.js index 35a89df83..fa6a16070 100644 --- a/webodf/lib/gui/SessionContext.js +++ b/webodf/lib/gui/SessionContext.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui, odf */ diff --git a/webodf/lib/gui/SessionController.js b/webodf/lib/gui/SessionController.js index 6fca0513c..4619bf61c 100644 --- a/webodf/lib/gui/SessionController.js +++ b/webodf/lib/gui/SessionController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, Node, ops, odf */ diff --git a/webodf/lib/gui/SessionView.js b/webodf/lib/gui/SessionView.js index 39e22aa1b..839502362 100644 --- a/webodf/lib/gui/SessionView.js +++ b/webodf/lib/gui/SessionView.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, document, runtime, gui, ops, webodfcore */ diff --git a/webodf/lib/gui/ShadowCursor.js b/webodf/lib/gui/ShadowCursor.js index 120710c3a..95c3766ec 100644 --- a/webodf/lib/gui/ShadowCursor.js +++ b/webodf/lib/gui/ShadowCursor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, gui, ops, runtime*/ diff --git a/webodf/lib/gui/SingleScrollViewport.js b/webodf/lib/gui/SingleScrollViewport.js index 4b5f40d09..0fefb9176 100644 --- a/webodf/lib/gui/SingleScrollViewport.js +++ b/webodf/lib/gui/SingleScrollViewport.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui*/ diff --git a/webodf/lib/gui/StyleSummary.js b/webodf/lib/gui/StyleSummary.js index 86d4c19b3..73554cbed 100644 --- a/webodf/lib/gui/StyleSummary.js +++ b/webodf/lib/gui/StyleSummary.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, gui*/ diff --git a/webodf/lib/gui/SvgSelectionView.js b/webodf/lib/gui/SvgSelectionView.js index 07901776e..7e1a2a9a5 100644 --- a/webodf/lib/gui/SvgSelectionView.js +++ b/webodf/lib/gui/SvgSelectionView.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, NodeFilter, gui, odf, ops, runtime, webodfcore*/ diff --git a/webodf/lib/gui/TextController.js b/webodf/lib/gui/TextController.js index c0652e45d..b34cf1ba7 100644 --- a/webodf/lib/gui/TextController.js +++ b/webodf/lib/gui/TextController.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, ops, gui, odf, runtime*/ diff --git a/webodf/lib/gui/TrivialUndoManager.js b/webodf/lib/gui/TrivialUndoManager.js index eb8b5ff34..ddbdd699c 100644 --- a/webodf/lib/gui/TrivialUndoManager.js +++ b/webodf/lib/gui/TrivialUndoManager.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui,ops,webodfcore,runtime*/ diff --git a/webodf/lib/gui/UndoManager.js b/webodf/lib/gui/UndoManager.js index f7979e02f..8dee812bd 100644 --- a/webodf/lib/gui/UndoManager.js +++ b/webodf/lib/gui/UndoManager.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, gui*/ diff --git a/webodf/lib/gui/UndoStateRules.js b/webodf/lib/gui/UndoStateRules.js index 0e6c9dae9..287e4e0e1 100644 --- a/webodf/lib/gui/UndoStateRules.js +++ b/webodf/lib/gui/UndoStateRules.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, runtime*/ diff --git a/webodf/lib/gui/Viewport.js b/webodf/lib/gui/Viewport.js index 1ef376783..fdcf2d179 100644 --- a/webodf/lib/gui/Viewport.js +++ b/webodf/lib/gui/Viewport.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui*/ diff --git a/webodf/lib/gui/VisualStepScanner.js b/webodf/lib/gui/VisualStepScanner.js index 9b094359a..3541d7591 100644 --- a/webodf/lib/gui/VisualStepScanner.js +++ b/webodf/lib/gui/VisualStepScanner.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui*/ diff --git a/webodf/lib/gui/ZoomHelper.js b/webodf/lib/gui/ZoomHelper.js index 83d58fae5..cfe41ad48 100644 --- a/webodf/lib/gui/ZoomHelper.js +++ b/webodf/lib/gui/ZoomHelper.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui*/ diff --git a/webodf/lib/odf/CollapsingRules.js b/webodf/lib/odf/CollapsingRules.js index 5639b8777..02c5f4aef 100644 --- a/webodf/lib/odf/CollapsingRules.js +++ b/webodf/lib/odf/CollapsingRules.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global odf, webodfcore, Node, NodeFilter*/ diff --git a/webodf/lib/odf/CommandLineTools.js b/webodf/lib/odf/CommandLineTools.js index 4c0ea7f9c..fe014380d 100644 --- a/webodf/lib/odf/CommandLineTools.js +++ b/webodf/lib/odf/CommandLineTools.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf*/ diff --git a/webodf/lib/odf/FontLoader.js b/webodf/lib/odf/FontLoader.js index cfa11c79a..d0edfc205 100644 --- a/webodf/lib/odf/FontLoader.js +++ b/webodf/lib/odf/FontLoader.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf, webodfcore, document, xmldom*/ diff --git a/webodf/lib/odf/Formatting.js b/webodf/lib/odf/Formatting.js index 1d8ea32ad..a1b166098 100644 --- a/webodf/lib/odf/Formatting.js +++ b/webodf/lib/odf/Formatting.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, odf, runtime, webodfcore*/ diff --git a/webodf/lib/odf/GraphicProperties.js b/webodf/lib/odf/GraphicProperties.js index ef37f2f2b..6bb6bd5aa 100644 --- a/webodf/lib/odf/GraphicProperties.js +++ b/webodf/lib/odf/GraphicProperties.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf*/ diff --git a/webodf/lib/odf/ListStylesToCss.js b/webodf/lib/odf/ListStylesToCss.js index 006ba5bd4..dbdbe6604 100644 --- a/webodf/lib/odf/ListStylesToCss.js +++ b/webodf/lib/odf/ListStylesToCss.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global odf, webodfcore, runtime*/ diff --git a/webodf/lib/odf/Namespaces.js b/webodf/lib/odf/Namespaces.js index a3e342af1..335defc32 100644 --- a/webodf/lib/odf/Namespaces.js +++ b/webodf/lib/odf/Namespaces.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global odf*/ diff --git a/webodf/lib/odf/ObjectNameGenerator.js b/webodf/lib/odf/ObjectNameGenerator.js index 6fdcdf683..d976e4da2 100644 --- a/webodf/lib/odf/ObjectNameGenerator.js +++ b/webodf/lib/odf/ObjectNameGenerator.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global odf, runtime, webodfcore, Node*/ diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 9e3e1f5ce..8a9c6cf5f 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf, xmldom, webodf_css, webodfcore, gui, atob, Uint8Array */ diff --git a/webodf/lib/odf/OdfContainer.js b/webodf/lib/odf/OdfContainer.js index 7d26c66e4..3847ea1b0 100644 --- a/webodf/lib/odf/OdfContainer.js +++ b/webodf/lib/odf/OdfContainer.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, NodeFilter, runtime, webodfcore, xmldom, odf, DOMParser, document, webodf */ diff --git a/webodf/lib/odf/OdfNodeFilter.js b/webodf/lib/odf/OdfNodeFilter.js index 14ffc4382..cab2fc344 100644 --- a/webodf/lib/odf/OdfNodeFilter.js +++ b/webodf/lib/odf/OdfNodeFilter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, NodeFilter, odf*/ diff --git a/webodf/lib/odf/OdfSchema.js b/webodf/lib/odf/OdfSchema.js index cc1552a22..774a3ceb8 100644 --- a/webodf/lib/odf/OdfSchema.js +++ b/webodf/lib/odf/OdfSchema.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global odf, runtime*/ diff --git a/webodf/lib/odf/OdfUtils.js b/webodf/lib/odf/OdfUtils.js index fb22f9229..dbc6df13f 100644 --- a/webodf/lib/odf/OdfUtils.js +++ b/webodf/lib/odf/OdfUtils.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, runtime, odf, NodeFilter, webodfcore*/ diff --git a/webodf/lib/odf/PageLayoutProperties.js b/webodf/lib/odf/PageLayoutProperties.js index 041cc7c56..6a48134a7 100644 --- a/webodf/lib/odf/PageLayoutProperties.js +++ b/webodf/lib/odf/PageLayoutProperties.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf*/ diff --git a/webodf/lib/odf/ParagraphProperties.js b/webodf/lib/odf/ParagraphProperties.js index d3c814a39..087e22bbd 100644 --- a/webodf/lib/odf/ParagraphProperties.js +++ b/webodf/lib/odf/ParagraphProperties.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf*/ diff --git a/webodf/lib/odf/StepUtils.js b/webodf/lib/odf/StepUtils.js index 32ba41547..4f0dbc8f3 100644 --- a/webodf/lib/odf/StepUtils.js +++ b/webodf/lib/odf/StepUtils.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf, Node*/ diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index 66a02e9b0..91a9be50e 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global odf, runtime, xmldom, webodfcore, document*/ diff --git a/webodf/lib/odf/StyleCache.js b/webodf/lib/odf/StyleCache.js index b734772b4..d0944c211 100644 --- a/webodf/lib/odf/StyleCache.js +++ b/webodf/lib/odf/StyleCache.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf*/ diff --git a/webodf/lib/odf/StyleInfo.js b/webodf/lib/odf/StyleInfo.js index ba7d215b7..58611b97e 100644 --- a/webodf/lib/odf/StyleInfo.js +++ b/webodf/lib/odf/StyleInfo.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, odf, runtime, xmldom*/ diff --git a/webodf/lib/odf/StyleParseUtils.js b/webodf/lib/odf/StyleParseUtils.js index 5481d886d..79af03396 100644 --- a/webodf/lib/odf/StyleParseUtils.js +++ b/webodf/lib/odf/StyleParseUtils.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf*/ diff --git a/webodf/lib/odf/StyleTree.js b/webodf/lib/odf/StyleTree.js index 9c5a033cd..3f4f22380 100644 --- a/webodf/lib/odf/StyleTree.js +++ b/webodf/lib/odf/StyleTree.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global odf*/ diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 560d26db1..e3a506428 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ diff --git a/webodf/lib/odf/TextProperties.js b/webodf/lib/odf/TextProperties.js index 405564c91..0c0030a57 100644 --- a/webodf/lib/odf/TextProperties.js +++ b/webodf/lib/odf/TextProperties.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf*/ diff --git a/webodf/lib/odf/TextSerializer.js b/webodf/lib/odf/TextSerializer.js index 9a1f10ac4..673264db8 100644 --- a/webodf/lib/odf/TextSerializer.js +++ b/webodf/lib/odf/TextSerializer.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global odf, xmldom, Node, NodeFilter, runtime*/ diff --git a/webodf/lib/odf/TextStyleApplicator.js b/webodf/lib/odf/TextStyleApplicator.js index 310580e42..f950e89ba 100644 --- a/webodf/lib/odf/TextStyleApplicator.js +++ b/webodf/lib/odf/TextStyleApplicator.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, odf, runtime, webodfcore*/ diff --git a/webodf/lib/odf/WordBoundaryFilter.js b/webodf/lib/odf/WordBoundaryFilter.js index 770e09121..644981d64 100644 --- a/webodf/lib/odf/WordBoundaryFilter.js +++ b/webodf/lib/odf/WordBoundaryFilter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, NodeFilter, webodfcore, runtime, odf*/ diff --git a/webodf/lib/ops/Canvas.js b/webodf/lib/ops/Canvas.js index 880313784..117f308c8 100644 --- a/webodf/lib/ops/Canvas.js +++ b/webodf/lib/ops/Canvas.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops */ diff --git a/webodf/lib/ops/Document.js b/webodf/lib/ops/Document.js index 6661eeca4..8ee759330 100644 --- a/webodf/lib/ops/Document.js +++ b/webodf/lib/ops/Document.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops */ diff --git a/webodf/lib/ops/EditInfo.js b/webodf/lib/ops/EditInfo.js index 9e7af9503..365637ec7 100644 --- a/webodf/lib/ops/EditInfo.js +++ b/webodf/lib/ops/EditInfo.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, ops, runtime*/ diff --git a/webodf/lib/ops/Member.js b/webodf/lib/ops/Member.js index 15eb90605..dac018ec1 100644 --- a/webodf/lib/ops/Member.js +++ b/webodf/lib/ops/Member.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, runtime*/ diff --git a/webodf/lib/ops/OdtCursor.js b/webodf/lib/ops/OdtCursor.js index 58e78ac8d..5c7c6037a 100644 --- a/webodf/lib/ops/OdtCursor.js +++ b/webodf/lib/ops/OdtCursor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, ops, gui, runtime*/ diff --git a/webodf/lib/ops/OdtDocument.js b/webodf/lib/ops/OdtDocument.js index 25ef58edb..c110a1810 100644 --- a/webodf/lib/ops/OdtDocument.js +++ b/webodf/lib/ops/OdtDocument.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, runtime, webodfcore, gui, ops, odf, NodeFilter*/ diff --git a/webodf/lib/ops/OdtStepsTranslator.js b/webodf/lib/ops/OdtStepsTranslator.js index 7bce7e3c3..c96de59ac 100644 --- a/webodf/lib/ops/OdtStepsTranslator.js +++ b/webodf/lib/ops/OdtStepsTranslator.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, ops, odf*/ diff --git a/webodf/lib/ops/OpAddAnnotation.js b/webodf/lib/ops/OpAddAnnotation.js index 59dadd98b..de88fc599 100644 --- a/webodf/lib/ops/OpAddAnnotation.js +++ b/webodf/lib/ops/OpAddAnnotation.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, webodfcore, odf, runtime*/ diff --git a/webodf/lib/ops/OpAddCursor.js b/webodf/lib/ops/OpAddCursor.js index a3ade9ea0..40c93adfb 100644 --- a/webodf/lib/ops/OpAddCursor.js +++ b/webodf/lib/ops/OpAddCursor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops*/ diff --git a/webodf/lib/ops/OpAddMember.js b/webodf/lib/ops/OpAddMember.js index 5afce4329..08eed5591 100644 --- a/webodf/lib/ops/OpAddMember.js +++ b/webodf/lib/ops/OpAddMember.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, runtime*/ diff --git a/webodf/lib/ops/OpAddStyle.js b/webodf/lib/ops/OpAddStyle.js index 0a2d83fed..25b1519a4 100644 --- a/webodf/lib/ops/OpAddStyle.js +++ b/webodf/lib/ops/OpAddStyle.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf, ops*/ diff --git a/webodf/lib/ops/OpApplyDirectStyling.js b/webodf/lib/ops/OpApplyDirectStyling.js index 133e1feee..53ced30ad 100644 --- a/webodf/lib/ops/OpApplyDirectStyling.js +++ b/webodf/lib/ops/OpApplyDirectStyling.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, runtime, gui, odf, Node, webodfcore*/ diff --git a/webodf/lib/ops/OpApplyHyperlink.js b/webodf/lib/ops/OpApplyHyperlink.js index ba918b55a..64d25c225 100644 --- a/webodf/lib/ops/OpApplyHyperlink.js +++ b/webodf/lib/ops/OpApplyHyperlink.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, odf, webodfcore, runtime, Node */ diff --git a/webodf/lib/ops/OpInsertImage.js b/webodf/lib/ops/OpInsertImage.js index 190f433b9..e102be340 100644 --- a/webodf/lib/ops/OpInsertImage.js +++ b/webodf/lib/ops/OpInsertImage.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf, ops */ diff --git a/webodf/lib/ops/OpInsertTable.js b/webodf/lib/ops/OpInsertTable.js index a60d8b042..7c51b2ba9 100644 --- a/webodf/lib/ops/OpInsertTable.js +++ b/webodf/lib/ops/OpInsertTable.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, odf, runtime*/ diff --git a/webodf/lib/ops/OpInsertText.js b/webodf/lib/ops/OpInsertText.js index 14185dfc6..51d2a31a7 100644 --- a/webodf/lib/ops/OpInsertText.js +++ b/webodf/lib/ops/OpInsertText.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, odf, runtime*/ diff --git a/webodf/lib/ops/OpMergeParagraph.js b/webodf/lib/ops/OpMergeParagraph.js index 07dcd6207..af15735af 100644 --- a/webodf/lib/ops/OpMergeParagraph.js +++ b/webodf/lib/ops/OpMergeParagraph.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, runtime, odf, webodfcore, Node, NodeFilter*/ diff --git a/webodf/lib/ops/OpMoveCursor.js b/webodf/lib/ops/OpMoveCursor.js index 5bf2eb6ef..ab0f18129 100644 --- a/webodf/lib/ops/OpMoveCursor.js +++ b/webodf/lib/ops/OpMoveCursor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, ops*/ diff --git a/webodf/lib/ops/OpRemoveAnnotation.js b/webodf/lib/ops/OpRemoveAnnotation.js index f17043ad6..681857be1 100644 --- a/webodf/lib/ops/OpRemoveAnnotation.js +++ b/webodf/lib/ops/OpRemoveAnnotation.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, runtime, odf, webodfcore*/ diff --git a/webodf/lib/ops/OpRemoveBlob.js b/webodf/lib/ops/OpRemoveBlob.js index 487e7ff1c..68297c79a 100644 --- a/webodf/lib/ops/OpRemoveBlob.js +++ b/webodf/lib/ops/OpRemoveBlob.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops */ diff --git a/webodf/lib/ops/OpRemoveCursor.js b/webodf/lib/ops/OpRemoveCursor.js index 60eef7138..65b03941a 100644 --- a/webodf/lib/ops/OpRemoveCursor.js +++ b/webodf/lib/ops/OpRemoveCursor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops*/ diff --git a/webodf/lib/ops/OpRemoveHyperlink.js b/webodf/lib/ops/OpRemoveHyperlink.js index eef33ab6e..f4378b2ef 100644 --- a/webodf/lib/ops/OpRemoveHyperlink.js +++ b/webodf/lib/ops/OpRemoveHyperlink.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, odf, webodfcore, runtime */ diff --git a/webodf/lib/ops/OpRemoveMember.js b/webodf/lib/ops/OpRemoveMember.js index e7b08aff1..364814fea 100644 --- a/webodf/lib/ops/OpRemoveMember.js +++ b/webodf/lib/ops/OpRemoveMember.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, runtime*/ diff --git a/webodf/lib/ops/OpRemoveStyle.js b/webodf/lib/ops/OpRemoveStyle.js index e6dedade8..f3b2295f9 100644 --- a/webodf/lib/ops/OpRemoveStyle.js +++ b/webodf/lib/ops/OpRemoveStyle.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops*/ diff --git a/webodf/lib/ops/OpRemoveText.js b/webodf/lib/ops/OpRemoveText.js index cac9747bc..9a7f6a523 100644 --- a/webodf/lib/ops/OpRemoveText.js +++ b/webodf/lib/ops/OpRemoveText.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, runtime, odf, webodfcore*/ diff --git a/webodf/lib/ops/OpSetBlob.js b/webodf/lib/ops/OpSetBlob.js index 8978bd0fe..2ead07fe4 100644 --- a/webodf/lib/ops/OpSetBlob.js +++ b/webodf/lib/ops/OpSetBlob.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops */ diff --git a/webodf/lib/ops/OpSetParagraphStyle.js b/webodf/lib/ops/OpSetParagraphStyle.js index d2c6cdfcc..2cb25bd98 100644 --- a/webodf/lib/ops/OpSetParagraphStyle.js +++ b/webodf/lib/ops/OpSetParagraphStyle.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, odf, runtime*/ diff --git a/webodf/lib/ops/OpSplitParagraph.js b/webodf/lib/ops/OpSplitParagraph.js index d84f6167a..fc06e9d5f 100644 --- a/webodf/lib/ops/OpSplitParagraph.js +++ b/webodf/lib/ops/OpSplitParagraph.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, odf*/ diff --git a/webodf/lib/ops/OpUpdateMember.js b/webodf/lib/ops/OpUpdateMember.js index ce8f72597..a6d0c0565 100644 --- a/webodf/lib/ops/OpUpdateMember.js +++ b/webodf/lib/ops/OpUpdateMember.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, xmldom, odf, runtime*/ diff --git a/webodf/lib/ops/OpUpdateMetadata.js b/webodf/lib/ops/OpUpdateMetadata.js index aeb2f80c5..354083e9e 100644 --- a/webodf/lib/ops/OpUpdateMetadata.js +++ b/webodf/lib/ops/OpUpdateMetadata.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global odf, runtime, ops*/ diff --git a/webodf/lib/ops/OpUpdateParagraphStyle.js b/webodf/lib/ops/OpUpdateParagraphStyle.js index 0345cb301..9723d9f32 100644 --- a/webodf/lib/ops/OpUpdateParagraphStyle.js +++ b/webodf/lib/ops/OpUpdateParagraphStyle.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, odf, ops*/ diff --git a/webodf/lib/ops/Operation.js b/webodf/lib/ops/Operation.js index 8be5b8f45..d8771ae43 100644 --- a/webodf/lib/ops/Operation.js +++ b/webodf/lib/ops/Operation.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops*/ diff --git a/webodf/lib/ops/OperationFactory.js b/webodf/lib/ops/OperationFactory.js index af250a294..d935845d5 100644 --- a/webodf/lib/ops/OperationFactory.js +++ b/webodf/lib/ops/OperationFactory.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, ops */ diff --git a/webodf/lib/ops/OperationRouter.js b/webodf/lib/ops/OperationRouter.js index 28ddf51d9..98c154513 100644 --- a/webodf/lib/ops/OperationRouter.js +++ b/webodf/lib/ops/OperationRouter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops*/ diff --git a/webodf/lib/ops/OperationTransformMatrix.js b/webodf/lib/ops/OperationTransformMatrix.js index bfd28073d..28eda2a8e 100644 --- a/webodf/lib/ops/OperationTransformMatrix.js +++ b/webodf/lib/ops/OperationTransformMatrix.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, ops */ diff --git a/webodf/lib/ops/OperationTransformer.js b/webodf/lib/ops/OperationTransformer.js index a15408d17..588cc93ff 100644 --- a/webodf/lib/ops/OperationTransformer.js +++ b/webodf/lib/ops/OperationTransformer.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, ops */ diff --git a/webodf/lib/ops/Session.js b/webodf/lib/ops/Session.js index d16fe9024..1aa7f8234 100644 --- a/webodf/lib/ops/Session.js +++ b/webodf/lib/ops/Session.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, ops, odf*/ diff --git a/webodf/lib/ops/StepsCache.js b/webodf/lib/ops/StepsCache.js index 759d1cee9..5e2c3ac81 100644 --- a/webodf/lib/ops/StepsCache.js +++ b/webodf/lib/ops/StepsCache.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, ops, Node*/ diff --git a/webodf/lib/ops/TextPositionFilter.js b/webodf/lib/ops/TextPositionFilter.js index 11dcea745..88cd7686b 100644 --- a/webodf/lib/ops/TextPositionFilter.js +++ b/webodf/lib/ops/TextPositionFilter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, runtime, webodfcore, odf, ops*/ diff --git a/webodf/lib/ops/TrivialOperationRouter.js b/webodf/lib/ops/TrivialOperationRouter.js index ec8d69591..d3426ec3f 100644 --- a/webodf/lib/ops/TrivialOperationRouter.js +++ b/webodf/lib/ops/TrivialOperationRouter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global ops, runtime, webodfcore*/ diff --git a/webodf/lib/runtime.js b/webodf/lib/runtime.js index 3e6ea980c..989120fb5 100644 --- a/webodf/lib/runtime.js +++ b/webodf/lib/runtime.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*jslint nomen: true, bitwise: true, emptyblock: true, unparam: true */ diff --git a/webodf/lib/webodfcore/Async.js b/webodf/lib/webodfcore/Async.js index 54ea3d93d..943f3544a 100644 --- a/webodf/lib/webodfcore/Async.js +++ b/webodf/lib/webodfcore/Async.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore*/ diff --git a/webodf/lib/webodfcore/Base64.js b/webodf/lib/webodfcore/Base64.js index 2400cd6d3..19770b270 100644 --- a/webodf/lib/webodfcore/Base64.js +++ b/webodf/lib/webodfcore/Base64.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, runtime, ArrayBuffer, Uint8Array*/ diff --git a/webodf/lib/webodfcore/CSSUnits.js b/webodf/lib/webodfcore/CSSUnits.js index 2d4d22dd8..8dc9ec079 100644 --- a/webodf/lib/webodfcore/CSSUnits.js +++ b/webodf/lib/webodfcore/CSSUnits.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore*/ diff --git a/webodf/lib/webodfcore/Cursor.js b/webodf/lib/webodfcore/Cursor.js index ecb93ce89..204661aca 100644 --- a/webodf/lib/webodfcore/Cursor.js +++ b/webodf/lib/webodfcore/Cursor.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, webodfcore, ops, runtime*/ diff --git a/webodf/lib/webodfcore/Destroyable.js b/webodf/lib/webodfcore/Destroyable.js index 23c4e97d7..9b10529cf 100644 --- a/webodf/lib/webodfcore/Destroyable.js +++ b/webodf/lib/webodfcore/Destroyable.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore*/ diff --git a/webodf/lib/webodfcore/DomUtils.js b/webodf/lib/webodfcore/DomUtils.js index 8e5b67793..b9fd09fc6 100644 --- a/webodf/lib/webodfcore/DomUtils.js +++ b/webodf/lib/webodfcore/DomUtils.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, webodfcore, ops, runtime, NodeFilter, Range*/ @@ -623,7 +623,7 @@ * * Use this function instead of node.getElementsByTagNameNS when modifications are going to be made * to the document content during iteration. For read-only uses, node.getElementsByTagNameNS will perform - * faster and use less memory. See https://github.com/kogmbh/WebODF/issues/736 for further discussion. + * faster and use less memory. See https://github.com/webodf/WebODF/issues/736 for further discussion. * * @param {!Element|!Document} node * @param {!string} namespace @@ -646,7 +646,7 @@ * * Use this function instead of node.getElementsByTagName when modifications are going to be made * to the document content during iteration. For read-only uses, node.getElementsByTagName will perform - * faster and use less memory. See https://github.com/kogmbh/WebODF/issues/736 for further discussion. + * faster and use less memory. See https://github.com/webodf/WebODF/issues/736 for further discussion. * * @param {!Element|!Document} node * @param {!string} tagName diff --git a/webodf/lib/webodfcore/EventNotifier.js b/webodf/lib/webodfcore/EventNotifier.js index 26f8ca822..b052b98d4 100644 --- a/webodf/lib/webodfcore/EventNotifier.js +++ b/webodf/lib/webodfcore/EventNotifier.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, runtime*/ diff --git a/webodf/lib/webodfcore/EventSource.js b/webodf/lib/webodfcore/EventSource.js index d3903ddc3..442dc67f9 100644 --- a/webodf/lib/webodfcore/EventSource.js +++ b/webodf/lib/webodfcore/EventSource.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore*/ diff --git a/webodf/lib/webodfcore/EventSubscriptions.js b/webodf/lib/webodfcore/EventSubscriptions.js index e5b146a67..eb9833e1b 100644 --- a/webodf/lib/webodfcore/EventSubscriptions.js +++ b/webodf/lib/webodfcore/EventSubscriptions.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global gui, webodfcore*/ diff --git a/webodf/lib/webodfcore/LazyProperty.js b/webodf/lib/webodfcore/LazyProperty.js index 7220791d6..9679494d0 100644 --- a/webodf/lib/webodfcore/LazyProperty.js +++ b/webodf/lib/webodfcore/LazyProperty.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore*/ diff --git a/webodf/lib/webodfcore/LoopWatchDog.js b/webodf/lib/webodfcore/LoopWatchDog.js index 2f8a125f2..7835c6c0a 100644 --- a/webodf/lib/webodfcore/LoopWatchDog.js +++ b/webodf/lib/webodfcore/LoopWatchDog.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore,runtime */ diff --git a/webodf/lib/webodfcore/NodeFilterChain.js b/webodf/lib/webodfcore/NodeFilterChain.js index 215065c12..aca0caeab 100644 --- a/webodf/lib/webodfcore/NodeFilterChain.js +++ b/webodf/lib/webodfcore/NodeFilterChain.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, NodeFilter*/ diff --git a/webodf/lib/webodfcore/PositionFilter.js b/webodf/lib/webodfcore/PositionFilter.js index dce5c73fb..c9906479f 100644 --- a/webodf/lib/webodfcore/PositionFilter.js +++ b/webodf/lib/webodfcore/PositionFilter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore*/ diff --git a/webodf/lib/webodfcore/PositionFilterChain.js b/webodf/lib/webodfcore/PositionFilterChain.js index 0c1322687..3d39c5ea6 100644 --- a/webodf/lib/webodfcore/PositionFilterChain.js +++ b/webodf/lib/webodfcore/PositionFilterChain.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore*/ diff --git a/webodf/lib/webodfcore/PositionIterator.js b/webodf/lib/webodfcore/PositionIterator.js index ca39ac954..1ace958c8 100644 --- a/webodf/lib/webodfcore/PositionIterator.js +++ b/webodf/lib/webodfcore/PositionIterator.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, NodeFilter, runtime, webodfcore*/ diff --git a/webodf/lib/webodfcore/ScheduledTask.js b/webodf/lib/webodfcore/ScheduledTask.js index c9cce3cf0..5d10a5bb9 100644 --- a/webodf/lib/webodfcore/ScheduledTask.js +++ b/webodf/lib/webodfcore/ScheduledTask.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, webodfcore, runtime*/ diff --git a/webodf/lib/webodfcore/StepIterator.js b/webodf/lib/webodfcore/StepIterator.js index cac37b601..59ee614dd 100644 --- a/webodf/lib/webodfcore/StepIterator.js +++ b/webodf/lib/webodfcore/StepIterator.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore*/ diff --git a/webodf/lib/webodfcore/Task.js b/webodf/lib/webodfcore/Task.js index 1235a0d31..53cd77732 100644 --- a/webodf/lib/webodfcore/Task.js +++ b/webodf/lib/webodfcore/Task.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, runtime*/ diff --git a/webodf/lib/webodfcore/Utils.js b/webodf/lib/webodfcore/Utils.js index 410014ed9..f83485b0e 100644 --- a/webodf/lib/webodfcore/Utils.js +++ b/webodf/lib/webodfcore/Utils.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore*/ diff --git a/webodf/lib/webodfcore/Zip.js b/webodf/lib/webodfcore/Zip.js index 0dd9daf20..dab3c6c60 100644 --- a/webodf/lib/webodfcore/Zip.js +++ b/webodf/lib/webodfcore/Zip.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, externs*/ diff --git a/webodf/lib/webodfcore/enums.js b/webodf/lib/webodfcore/enums.js index 57dccb338..12bacd489 100644 --- a/webodf/lib/webodfcore/enums.js +++ b/webodf/lib/webodfcore/enums.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore*/ diff --git a/webodf/lib/webodfcore/typedefs.js b/webodf/lib/webodfcore/typedefs.js index ea2f1c0e6..5e2bf01e6 100644 --- a/webodf/lib/webodfcore/typedefs.js +++ b/webodf/lib/webodfcore/typedefs.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore*/ diff --git a/webodf/lib/xmldom/LSSerializer.js b/webodf/lib/xmldom/LSSerializer.js index e93a044b1..8b34329f5 100644 --- a/webodf/lib/xmldom/LSSerializer.js +++ b/webodf/lib/xmldom/LSSerializer.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, NodeFilter, xmldom, runtime*/ diff --git a/webodf/lib/xmldom/LSSerializerFilter.js b/webodf/lib/xmldom/LSSerializerFilter.js index 0b6455638..5ffa75f7e 100644 --- a/webodf/lib/xmldom/LSSerializerFilter.js +++ b/webodf/lib/xmldom/LSSerializerFilter.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global xmldom*/ diff --git a/webodf/lib/xmldom/RelaxNG.js b/webodf/lib/xmldom/RelaxNG.js index c468941ef..d39b6bf25 100644 --- a/webodf/lib/xmldom/RelaxNG.js +++ b/webodf/lib/xmldom/RelaxNG.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, runtime, xmldom*/ diff --git a/webodf/lib/xmldom/RelaxNG2.js b/webodf/lib/xmldom/RelaxNG2.js index daf8721aa..30bb77bd8 100644 --- a/webodf/lib/xmldom/RelaxNG2.js +++ b/webodf/lib/xmldom/RelaxNG2.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, runtime, xmldom*/ diff --git a/webodf/lib/xmldom/RelaxNGParser.js b/webodf/lib/xmldom/RelaxNGParser.js index cfb7e1de9..0ae34c2e2 100644 --- a/webodf/lib/xmldom/RelaxNGParser.js +++ b/webodf/lib/xmldom/RelaxNGParser.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, runtime, xmldom*/ diff --git a/webodf/lib/xmldom/XPath.js b/webodf/lib/xmldom/XPath.js index 4c9ef2f99..631bcd193 100644 --- a/webodf/lib/xmldom/XPath.js +++ b/webodf/lib/xmldom/XPath.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global Node, xmldom, XPathResult, runtime*/ diff --git a/webodf/misctests/testzip.js b/webodf/misctests/testzip.js index ba7f454fb..18ddc34e6 100644 --- a/webodf/misctests/testzip.js +++ b/webodf/misctests/testzip.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime webodfcore*/ diff --git a/webodf/relaxngToCPP.js b/webodf/relaxngToCPP.js index 16cd38252..ea08eb1eb 100644 --- a/webodf/relaxngToCPP.js +++ b/webodf/relaxngToCPP.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, xmldom*/ diff --git a/webodf/roundtripodf.js b/webodf/roundtripodf.js index 5385a3c0c..6a85b4f79 100644 --- a/webodf/roundtripodf.js +++ b/webodf/roundtripodf.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf*/ diff --git a/webodf/roundtripzip.js b/webodf/roundtripzip.js index bfe578aa0..1a45b486c 100644 --- a/webodf/roundtripzip.js +++ b/webodf/roundtripzip.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore*/ diff --git a/webodf/testrelaxng.js b/webodf/testrelaxng.js index a19deea3a..6cbd22e30 100644 --- a/webodf/testrelaxng.js +++ b/webodf/testrelaxng.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, xmldom, NodeFilter*/ diff --git a/webodf/tests/gui/DirectFormattingControllerTests.js b/webodf/tests/gui/DirectFormattingControllerTests.js index e75fd94be..7bfb4550b 100644 --- a/webodf/tests/gui/DirectFormattingControllerTests.js +++ b/webodf/tests/gui/DirectFormattingControllerTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, ops*/ diff --git a/webodf/tests/gui/GuiStepUtilsTests.js b/webodf/tests/gui/GuiStepUtilsTests.js index 90db6bf22..1d38fa56f 100644 --- a/webodf/tests/gui/GuiStepUtilsTests.js +++ b/webodf/tests/gui/GuiStepUtilsTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, gui, Node*/ diff --git a/webodf/tests/gui/ImageControllerTests.js b/webodf/tests/gui/ImageControllerTests.js index e6febee92..e48a03113 100644 --- a/webodf/tests/gui/ImageControllerTests.js +++ b/webodf/tests/gui/ImageControllerTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, ops, Node, NodeFilter, xmldom*/ diff --git a/webodf/tests/gui/MetadataControllerTests.js b/webodf/tests/gui/MetadataControllerTests.js index 5e9baae05..24d2eb58f 100644 --- a/webodf/tests/gui/MetadataControllerTests.js +++ b/webodf/tests/gui/MetadataControllerTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, ops, xmldom*/ diff --git a/webodf/tests/gui/SelectionControllerTests.js b/webodf/tests/gui/SelectionControllerTests.js index 8a27d71ae..b3b0ff7a7 100644 --- a/webodf/tests/gui/SelectionControllerTests.js +++ b/webodf/tests/gui/SelectionControllerTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, ops, Node, NodeFilter, xmldom*/ diff --git a/webodf/tests/gui/StyleSummaryTests.js b/webodf/tests/gui/StyleSummaryTests.js index 1bb4f1db0..45c9d79d1 100644 --- a/webodf/tests/gui/StyleSummaryTests.js +++ b/webodf/tests/gui/StyleSummaryTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, NodeFilter*/ diff --git a/webodf/tests/gui/TextControllerTests.js b/webodf/tests/gui/TextControllerTests.js index a33cecf99..2683ee032 100644 --- a/webodf/tests/gui/TextControllerTests.js +++ b/webodf/tests/gui/TextControllerTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, ops, Node, NodeFilter, xmldom*/ diff --git a/webodf/tests/gui/TrivialUndoManagerTests.js b/webodf/tests/gui/TrivialUndoManagerTests.js index 86c86dc32..a6a76eb19 100644 --- a/webodf/tests/gui/TrivialUndoManagerTests.js +++ b/webodf/tests/gui/TrivialUndoManagerTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, ops*/ diff --git a/webodf/tests/gui/UndoStateRulesTests.js b/webodf/tests/gui/UndoStateRulesTests.js index 4e85b2cd1..38a4eb990 100644 --- a/webodf/tests/gui/UndoStateRulesTests.js +++ b/webodf/tests/gui/UndoStateRulesTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, ops*/ diff --git a/webodf/tests/odf/FormattingTests.js b/webodf/tests/odf/FormattingTests.js index ebb464fd4..e638316fb 100644 --- a/webodf/tests/odf/FormattingTests.js +++ b/webodf/tests/odf/FormattingTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf, NodeFilter*/ diff --git a/webodf/tests/odf/LayoutTests.js b/webodf/tests/odf/LayoutTests.js index 216bb1c1c..c4e1bc10c 100644 --- a/webodf/tests/odf/LayoutTests.js +++ b/webodf/tests/odf/LayoutTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf, NodeFilter, Node, xmldom*/ diff --git a/webodf/tests/odf/ListStyleToCssTests.js b/webodf/tests/odf/ListStyleToCssTests.js index 00c2bb388..451fb324e 100644 --- a/webodf/tests/odf/ListStyleToCssTests.js +++ b/webodf/tests/odf/ListStyleToCssTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf*/ diff --git a/webodf/tests/odf/MaliciousDocumentTests.js b/webodf/tests/odf/MaliciousDocumentTests.js index cbe15fe10..ce790aa57 100644 --- a/webodf/tests/odf/MaliciousDocumentTests.js +++ b/webodf/tests/odf/MaliciousDocumentTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global webodfcore, odf, runtime, NodeFilter, Node*/ diff --git a/webodf/tests/odf/ObjectNameGeneratorTests.js b/webodf/tests/odf/ObjectNameGeneratorTests.js index f48a922c0..f265e4624 100644 --- a/webodf/tests/odf/ObjectNameGeneratorTests.js +++ b/webodf/tests/odf/ObjectNameGeneratorTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf*/ diff --git a/webodf/tests/odf/OdfContainerSafetyTests.js b/webodf/tests/odf/OdfContainerSafetyTests.js index b27f6e192..8cf34ad35 100644 --- a/webodf/tests/odf/OdfContainerSafetyTests.js +++ b/webodf/tests/odf/OdfContainerSafetyTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf, xmldom*/ diff --git a/webodf/tests/odf/OdfContainerTests.js b/webodf/tests/odf/OdfContainerTests.js index 2bd26c82f..6949a9c6d 100644 --- a/webodf/tests/odf/OdfContainerTests.js +++ b/webodf/tests/odf/OdfContainerTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf, xmldom*/ diff --git a/webodf/tests/odf/OdfUtilsTests.js b/webodf/tests/odf/OdfUtilsTests.js index 7319d65bd..6ccb68c53 100644 --- a/webodf/tests/odf/OdfUtilsTests.js +++ b/webodf/tests/odf/OdfUtilsTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf, NodeFilter*/ diff --git a/webodf/tests/odf/StyleCacheTests.js b/webodf/tests/odf/StyleCacheTests.js index 38488ea37..c9289b39a 100644 --- a/webodf/tests/odf/StyleCacheTests.js +++ b/webodf/tests/odf/StyleCacheTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf, NodeFilter, Node, xmldom*/ diff --git a/webodf/tests/odf/StyleInfoTests.js b/webodf/tests/odf/StyleInfoTests.js index 22332381a..52c1b7323 100644 --- a/webodf/tests/odf/StyleInfoTests.js +++ b/webodf/tests/odf/StyleInfoTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf*/ diff --git a/webodf/tests/odf/StyleParseUtilsTests.js b/webodf/tests/odf/StyleParseUtilsTests.js index 479733189..cbae7854f 100644 --- a/webodf/tests/odf/StyleParseUtilsTests.js +++ b/webodf/tests/odf/StyleParseUtilsTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf*/ diff --git a/webodf/tests/odf/StyleTreeTests.js b/webodf/tests/odf/StyleTreeTests.js index 0a170c966..a6fe68866 100644 --- a/webodf/tests/odf/StyleTreeTests.js +++ b/webodf/tests/odf/StyleTreeTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, odf*/ diff --git a/webodf/tests/odf/TextStyleApplicatorTests.js b/webodf/tests/odf/TextStyleApplicatorTests.js index 8403a98a0..f990ec97c 100644 --- a/webodf/tests/odf/TextStyleApplicatorTests.js +++ b/webodf/tests/odf/TextStyleApplicatorTests.js @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ */ /*global runtime, webodfcore, gui, odf, NodeFilter*/ diff --git a/webodf/tests/odf/layouttests.xml b/webodf/tests/odf/layouttests.xml index 3de11fc97..61779c485 100644 --- a/webodf/tests/odf/layouttests.xml +++ b/webodf/tests/odf/layouttests.xml @@ -19,7 +19,7 @@ * @licend * * @source: http://www.webodf.org/ - * @source: https://github.com/kogmbh/WebODF/ + * @source: https://github.com/webodf/WebODF/ --> Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 262/385] Drawn a document that holds no styles of its own. --- webodf/lib/odf/Formatting.js | 26 ++++++++++++++++++++------ webodf/lib/odf/OdfContainer.js | 19 ++++++++++++++++--- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/webodf/lib/odf/Formatting.js b/webodf/lib/odf/Formatting.js index a1b166098..5b71d34c4 100644 --- a/webodf/lib/odf/Formatting.js +++ b/webodf/lib/odf/Formatting.js @@ -635,14 +635,26 @@ odf.Formatting = function Formatting() { * @return {?Element} */ function firstPageLayoutElement() { - var masterPages = odfContainer.rootElement.masterStyles - .getElementsByTagNameNS(stylens, "master-page"), - layouts = odfContainer.rootElement.automaticStyles - .getElementsByTagNameNS(stylens, "page-layout"), + var masterStyles = odfContainer.rootElement.masterStyles, + automaticStyles = odfContainer.rootElement.automaticStyles, + /**@type{!NodeList}*/ + masterPages, + /**@type{!NodeList}*/ + layouts, layoutName = "", /**@type{!Element}*/ layout, i; + // A document holds no master styles and no automatic styles of its + // own where it was written by hand or by a program that wrote none: + // the page is then the one of the defaults. + if (!masterStyles || !automaticStyles) { + return null; + } + masterPages = masterStyles.getElementsByTagNameNS(stylens, + "master-page"); + layouts = automaticStyles.getElementsByTagNameNS(stylens, + "page-layout"); if (masterPages.length > 0) { layoutName = /**@type{!Element}*/(masterPages.item(0)) .getAttributeNS(stylens, "page-layout-name") || ""; @@ -688,10 +700,12 @@ odf.Formatting = function Formatting() { pageLayoutElement = styleName ? getPageLayoutStyleElement(styleName, styleFamily) : firstPageLayoutElement(); - if (!pageLayoutElement) { + if (!pageLayoutElement && odfContainer.rootElement.styles) { pageLayoutElement = domUtils.getDirectChild(odfContainer.rootElement.styles, stylens, "default-page-layout"); } - props = domUtils.getDirectChild(pageLayoutElement, stylens, "page-layout-properties"); + props = pageLayoutElement + ? domUtils.getDirectChild(pageLayoutElement, stylens, "page-layout-properties") + : null; if (props) { // set page's default width and height based on print orientation if (props.getAttributeNS(stylens, "print-orientation") === "landscape") { diff --git a/webodf/lib/odf/OdfContainer.js b/webodf/lib/odf/OdfContainer.js index 0cc4fbea4..85ca6e524 100644 --- a/webodf/lib/odf/OdfContainer.js +++ b/webodf/lib/odf/OdfContainer.js @@ -693,12 +693,25 @@ * @return {undefined} */ function setRootElement(root) { + var doc = /**@type{!Document}*/(root.ownerDocument); + /** + * The child of the root of that name, made empty where the + * document holds none: a document written by hand, or by a + * program that wrote no styles, holds none of them, and a reader + * that looks for a style in nothing at all throws. + * @param {!string} name + * @return {!Element} + */ + function childOrEmpty(name) { + return domUtils.getDirectChild(root, officens, name) + || doc.createElementNS(officens, name); + } contentElement = null; self.rootElement = /**@type{!odf.ODFDocumentElement}*/(root); root.fontFaceDecls = domUtils.getDirectChild(root, officens, 'font-face-decls'); - root.styles = domUtils.getDirectChild(root, officens, 'styles'); - root.automaticStyles = domUtils.getDirectChild(root, officens, 'automatic-styles'); - root.masterStyles = domUtils.getDirectChild(root, officens, 'master-styles'); + root.styles = childOrEmpty('styles'); + root.automaticStyles = childOrEmpty('automatic-styles'); + root.masterStyles = childOrEmpty('master-styles'); root.body = domUtils.getDirectChild(root, officens, 'body'); root.meta = domUtils.getDirectChild(root, officens, 'meta'); root.settings = domUtils.getDirectChild(root, officens, 'settings'); From 7ae69a29190966db5fdb063846478d95a69637ae Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 263/385] Read what the lines are drawn with before writing a rule for any of them. --- webodf/lib/odf/OdfCanvas.js | 36 +++++++++++++++++++++++++++++++----- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 77666b2ee..5334963fd 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -2721,12 +2721,13 @@ * @param {!string} lineId * @param {!odf.ODFDocumentElement} rootElement * @param {!CSSStyleSheet} stylesheet + * @param {?{borderTopStyle:!string,borderTopColor:!string,borderTopWidth:!string,color:!string}} computed + * what the line is drawn with, read before any rule was + * written, see "loadLines" * @return {undefined} */ - function renderLine(line, lineId, rootElement, stylesheet) { - var window = runtime.getWindow(), - computed = window && window.getComputedStyle(line, null), - x1 = parseLength(line.getAttributeNS(svgns, "x1")), + function renderLine(line, lineId, rootElement, stylesheet, computed) { + var x1 = parseLength(line.getAttributeNS(svgns, "x1")), y1 = parseLength(line.getAttributeNS(svgns, "y1")), x2 = parseLength(line.getAttributeNS(svgns, "x2")), y2 = parseLength(line.getAttributeNS(svgns, "y2")), @@ -2822,10 +2823,35 @@ */ function loadLines(odfbody, rootElement, stylesheet) { var lines = domUtils.getElementsByTagNameNS(odfbody, drawns, "line"), + /**@type{!Array.}*/ + styles = [], + /**@type{?CSSStyleDeclaration}*/ + computed, + window = runtime.getWindow(), i; + // The style each line is drawn with is read for all of them before + // any rule is written: a rule that is written tells the browser to + // work out the style of every element of the document again, and + // reading the style of the next line makes it do so at once. Seven + // lines in a document of twenty thousand nodes cost seven seconds + // that way, and one reading answers for all of them. + for (i = 0; i < lines.length; i += 1) { + computed = window + ? window.getComputedStyle(lines[i], null) + : null; + styles.push(computed + ? { + borderTopStyle: String(computed.borderTopStyle), + borderTopColor: String(computed.borderTopColor), + borderTopWidth: String(computed.borderTopWidth), + color: String(computed.color) + } + : null); + } for (i = 0; i < lines.length; i += 1) { try { - renderLine(lines[i], "line" + i, rootElement, stylesheet); + renderLine(lines[i], "line" + i, rootElement, stylesheet, + styles[i]); } catch (/**@type{*}*/e) { runtime.log("could not render line: " + String(e)); } From ceaa85c3fbd78b52b9fde2e0131d8ace57281299 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 264/385] Broken a page where the document asks for one. --- webodf/lib/odf/TextLayout.js | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 9da2374a3..ea05c4877 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -1989,6 +1989,16 @@ odf.TextLayout = function TextLayout() { } }); } + /** + * Whether a node was marked as beginning a page of its own. + * @param {!Node} node + * @return {!boolean} + */ + function asksForANewPage(node) { + return node.nodeType === Node.ELEMENT_NODE + && /**@type{!Element}*/(node).hasAttributeNS(webodfhelperns, + "breakbefore"); + } /** * The page a place across the drawn document falls on, from zero. * @param {!number} x from the left edge of the body of the document @@ -2480,10 +2490,22 @@ odf.TextLayout = function TextLayout() { while (state.waiting.length > 0) { added = /**@type{!Array.}*/([]); while (added.length < state.chunk && state.waiting.length > 0) { - node = /**@type{!Node}*/(state.waiting.shift()); + node = /**@type{!Node}*/(state.waiting[0]); + // What the document asks to be written on a new page ends + // the page that is being filled, unless it is the first + // thing on it: a break before the first node would leave an + // empty page behind, and the browser is asked for the same + // where the pages are broken into columns. + if (asksForANewPage(node) && box.firstChild) { + break; + } + state.waiting.shift(); box.appendChild(node); added.push(node); } + if (added.length === 0) { + break; + } if (overflows(box) && added.length > 1) { while (added.length > 0) { taken = /**@type{!Node}*/(added.pop()); From d54937181f2a93e2d9bcbe817632dfb07f96b16b Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 265/385] Begun a new page where the document asks for one. --- webodf/lib/odf/TextLayout.js | 203 +++++++++++++++++++++++++++++++++++ 1 file changed, 203 insertions(+) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index c4bdbbbde..98e08ea2c 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -33,12 +33,15 @@ odf.TextLayout = function TextLayout() { styleCacheRoot = null, /**@type{!Object.}*/ styleCache = {}, + /**@type{!Object.}*/ + breakCache = {}, domUtils = webodfcore.DomUtils, odfUtils = odf.OdfUtils, fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", textns = "urn:oasis:names:tc:opendocument:xmlns:text:1.0", drawns = "urn:oasis:names:tc:opendocument:xmlns:drawing:1.0", + tablens = "urn:oasis:names:tc:opendocument:xmlns:table:1.0", officens = "urn:oasis:names:tc:opendocument:xmlns:office:1.0", webodfhelperns = "urn:webodf:names:helper", svgns = "urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0", @@ -197,6 +200,7 @@ odf.TextLayout = function TextLayout() { if (styleCacheRoot !== odfroot) { styleCacheRoot = odfroot; styleCache = {}; + breakCache = {}; } if (styleCache.hasOwnProperty(key)) { return styleCache[key]; @@ -1553,6 +1557,197 @@ odf.TextLayout = function TextLayout() { } spreadLines(drawn); } + /** + * Whether a paragraph or a table asks to be written on a new page. + * + * The standard says it with "fo:break-before" on the style of the + * paragraph, and with "fo:break-after" on the style of the one before + * it, which comes to the same: what follows is written on a page of its + * own. A style says it for itself or leans on one that says it. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!Element} node + * @param {!string} which "break-before" or "break-after" + * @return {!boolean} + */ + function asksForABreak(odfroot, node, which) { + var /**@type{!string}*/ + first = node.getAttributeNS(textns, "style-name") + || node.getAttributeNS(tablens, "style-name") + || "", + /**@type{!string}*/ + key = which + "/" + first, + /**@type{!string}*/ + name = first, + /**@type{!string}*/ + family = node.namespaceURI === tablens + ? "table" + : "paragraph", + /**@type{?Element}*/ + style, + /**@type{?Element}*/ + properties, + /**@type{!string}*/ + box = family === "table" + ? "table-properties" + : "paragraph-properties", + /**@type{!number}*/ + depth = 0; + // A document holds a handful of styles for thousands of paragraphs, + // and each one is read once: the answer is kept beside the styles + // themselves, and dropped with them. + if (styleCacheRoot === odfroot && breakCache.hasOwnProperty(key)) { + return breakCache[key]; + } + while (name !== "" && depth < 16) { + style = styleOf(odfroot, name, family); + if (!style && plainStyleName(name) !== name) { + name = plainStyleName(name); + style = styleOf(odfroot, name, family); + } + if (!style) { + break; + } + properties = domUtils.getDirectChild(style, stylens, box); + if (properties + && properties.getAttributeNS(fons, which) === "page") { + breakCache[key] = true; + return true; + } + name = style.getAttributeNS(stylens, "parent-style-name") || ""; + depth += 1; + } + breakCache[key] = false; + return false; + } + /** + * Take away the room left before the paragraphs that are written on a new + * page, so that a text is measured as it was written. + * @param {!Element} root + * @return {undefined} + */ + function removeGaps(root) { + var /**@type{?Element}*/ + node = root.firstElementChild, + /**@type{?Element}*/ + next; + // The room is left among the paragraphs themselves, so the children + // of the text answer for all of it: nothing deeper is read, which a + // text of a thousand pages would make dear. + while (node) { + next = node.nextElementSibling; + if (node.className === "webodf-pageBreak") { + root.removeChild(node); + } + node = next; + } + } + /** + * Write on a new page what the document asks to be written on one. + * + * A text is one run of text here, and a page is a box that floats beside + * it: a break is made by leaving as much room before the paragraph as + * what is left of the page it stands on. The room is a box of the reader + * and not of the document, so nothing of the document is moved, and it + * is taken away before it is measured again. + * @param {!odf.ODFDocumentElement} odfroot + * @param {!PagePlan} plan + * @param {!HTMLDivElement} pagesDiv + * @return {!boolean} whether room was left anywhere + */ + function forcePageBreaks(odfroot, plan, pagesDiv) { + var /**@type{!Element}*/ + text = /**@type{!Element}*/(odfroot.body.lastElementChild), + doc = pagesDiv.ownerDocument, + htmlns = pagesDiv.namespaceURI, + /**@type{!number}*/ + origin, + /**@type{!Array.}*/ + nodes = [], + /**@type{!Array.}*/ + wanted = [], + /**@type{!Array.}*/ + tops = [], + /**@type{!Array.}*/ + rooms = [], + /**@type{!Array.}*/ + starts = [], + /**@type{!number}*/ + shift = 0, + /**@type{!number}*/ + page = 0, + /**@type{!number}*/ + top, + /**@type{!number}*/ + room, + /**@type{!number}*/ + i, + /**@type{?Element}*/ + node; + removeGaps(text); + node = text.firstElementChild; + while (node) { + nodes.push(node); + node = node.nextElementSibling; + } + nodes.forEach(function (element, index) { + if (asksForABreak(odfroot, element, "break-before") + || (index > 0 && asksForABreak(odfroot, nodes[index - 1], + "break-after"))) { + wanted.push(element); + } + }); + if (wanted.length === 0) { + return false; + } + // Everything is read before anything is written: a browser lays the + // whole text out again at each read that follows a write, and a text + // of a thousand pages would be laid out a thousand times over. + origin = pagesDiv.getBoundingClientRect().top; + wanted.forEach(function (element) { + tops.push(element.getBoundingClientRect().top - origin); + }); + // Where each page begins, from the first to one beyond the last that + // may be asked for: the room left before a paragraph is read from it + // rather than from the pages that are drawn, which are not drawn yet. + top = 0; + for (i = 0; i < maxPages; i += 1) { + starts.push(top); + top += plan.at(i).pageHeight + plan.at(i).pageSeparation; + } + tops.forEach(function (start, index) { + top = start + shift; + while (page + 1 < starts.length && starts[page + 1] <= top) { + page += 1; + } + room = starts[page] + plan.at(page).marginTop; + if (top <= room + 1 || page + 1 >= starts.length) { + rooms.push(0); + return; + } + // The paragraph stands in the middle of a page, so it is given + // what is left of it: the room of a page and the room of the + // margin of the next one. + room = starts[page + 1] + plan.at(page + 1).marginTop - top; + rooms.push(room > 0 + ? room + : 0); + shift += rooms[index]; + }); + i = 0; + wanted.forEach(function (element, index) { + var /**@type{!Element}*/ + gap; + if (rooms[index] <= 0) { + return; + } + gap = doc.createElementNS(htmlns, "div"); + gap.className = "webodf-pageBreak"; + /**@type{!HTMLElement}*/(gap).style.height = rooms[index] + "px"; + element.parentNode.insertBefore(gap, element); + i += 1; + }); + return i > 0; + } /** * Layout the text by resizing frames and updating the numbers of pages. * This function runs for the maximum allocated time and returns true if @@ -1574,6 +1769,14 @@ odf.TextLayout = function TextLayout() { updateNumberOfPages(odfroot, plan, pagesDiv, maxTime); round += 1; } while (plan.follow(countPages(pagesDiv)) && round < 3); + // The paragraphs that ask for a page of their own are given one, and + // the pages are counted again, as the text is longer for it. A break + // made on one page may push the next one onto another page, so it is + // done again, twice, which answers for a text of breaks that follow + // one another. + if (forcePageBreaks(odfroot, plan, pagesDiv)) { + updateNumberOfPages(odfroot, plan, pagesDiv, maxTime); + } drawPageFurniture(odfroot, plan, pagesDiv, readMeta(odfroot)); return maxTime > 0; } From b6463189117a9e43e3fddff0e0184f0799955ca6 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 266/385] Let the gap between two pages be seen again, that the text painted over. --- webodf/webodf.css | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/webodf/webodf.css b/webodf/webodf.css index 8ca4e301b..9d1148787 100644 --- a/webodf/webodf.css +++ b/webodf/webodf.css @@ -55,6 +55,13 @@ office|body { office|body[webodfhelper|paginated] { background: none; } +/* The fill of a page is painted by the sheet of each page, so neither the body + nor the text of the document paints it: a text that painted it would paint + the gap between two pages as well, and no page would be seen to end. The + fill is given to the text by the page layout, see "Style2CSS.js". */ +office|body[webodfhelper|paginated] office|text { + background: none; +} .webodf-pageSheet { background: white; } From e0c83366a7d760c8f75fb02af37dc7182d2fd3cb Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 267/385] Opened the editors again, that a page of grey was all they showed. --- programs/editor/CMakeLists.txt | 7 ++++++ programs/editor/libexec/mergeIntoDojo.js | 11 ++++++++- webodf/tools/dojoNlsCompile.js | 29 +++++++++++++++++------- 3 files changed, 38 insertions(+), 9 deletions(-) diff --git a/programs/editor/CMakeLists.txt b/programs/editor/CMakeLists.txt index fd2a9d44e..72062c80a 100644 --- a/programs/editor/CMakeLists.txt +++ b/programs/editor/CMakeLists.txt @@ -89,6 +89,11 @@ add_custom_command( COMMAND ${CMAKE_COMMAND} -E copy dojo-deps/dist/dojo/dojo.js dojo/ COMMAND ${CMAKE_COMMAND} -E copy_directory dojo-deps/dist/dojo/resources/ dojo/resources/ + # The words of the languages that dojo gathers into one file by language, + # "dojo/nls/dojo_ROOT.js" and its like: the loader asks a server for them + # by their own way, that no cache of the layer answers. + COMMAND ${CMAKE_COMMAND} -E copy_directory dojo-deps/dist/dojo/nls/ dojo/nls/ + COMMAND ${CMAKE_COMMAND} -E make_directory app/resources/ COMMAND ${CMAKE_COMMAND} -E copy dojo-deps/dist/app/resources/app.css app/resources/ @@ -157,6 +162,7 @@ add_custom_command( # more dojo (data) files COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/dojo COMMAND ${CMAKE_COMMAND} -E copy_directory dojo/resources ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/dojo/resources + COMMAND ${CMAKE_COMMAND} -E copy_directory dojo/nls ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/dojo/nls COMMAND ${CMAKE_COMMAND} -E copy_directory app/ ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/app/ COMMAND ${CMAKE_COMMAND} -E copy_directory dijit/ ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/dijit/ COMMAND ${CMAKE_COMMAND} -E copy_directory dojox/ ${OPENDOCUMENTTEXTEDITORCODE_BUILDDIR}/dojox/ @@ -260,6 +266,7 @@ add_custom_command( # more dojo (data) files COMMAND ${CMAKE_COMMAND} -E make_directory ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/dojo COMMAND ${CMAKE_COMMAND} -E copy_directory dojo/resources ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/dojo/resources + COMMAND ${CMAKE_COMMAND} -E copy_directory dojo/nls ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/dojo/nls COMMAND ${CMAKE_COMMAND} -E copy_directory app/ ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/app/ COMMAND ${CMAKE_COMMAND} -E copy_directory dijit/ ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/dijit/ COMMAND ${CMAKE_COMMAND} -E copy_directory dojox/ ${OPENDOCUMENTTEXTCOLLABCODE_BUILDDIR}/dojox/ diff --git a/programs/editor/libexec/mergeIntoDojo.js b/programs/editor/libexec/mergeIntoDojo.js index 569c30afa..f9cf1dcb8 100644 --- a/programs/editor/libexec/mergeIntoDojo.js +++ b/programs/editor/libexec/mergeIntoDojo.js @@ -103,8 +103,17 @@ // for as the last line of the file, which held while dojo was minified // into one line by its own build; it is looked for by what it does // instead, so that a build that is not minified is read as well. + // The modules are put before the block that boots the loader, which is + // the block that takes what the layer holds in its cache and hands it to + // the loader: a module written after it is a module the loader never + // finds there, and asks a server for. The block was looked for as the + // last line of the file, which held only while dojo minified its layer + // into one line; it is looked for by what it does instead. tail = dojo_build.toString(); - idx = tail.lastIndexOf("!require.async"); + idx = tail.lastIndexOf("require({cache:{}})"); + if (idx !== -1) { + idx = tail.lastIndexOf("(function(", idx); + } if (idx === -1) { idx = tail.lastIndexOf("\n"); } diff --git a/webodf/tools/dojoNlsCompile.js b/webodf/tools/dojoNlsCompile.js index 7bf602771..0239d56a2 100644 --- a/webodf/tools/dojoNlsCompile.js +++ b/webodf/tools/dojoNlsCompile.js @@ -141,20 +141,33 @@ done: function() { log("finished nls traversal."); file_list.sort(); + // The translations are handed to the loader as the layer of dojo + // hands its own modules over, in a cache of the module that each + // one is: a file that is written beside the layer instead is a + // module that waits in the queue of the loader, and the first + // module of the layer that declares itself without naming itself + // is then answered with the first one of that queue, which is a + // dictionary of words where a widget was asked for. + process.stdout.write("require({cache:{\n"); file_list.forEach( - function(x) { - var data = fs.readFileSync(x); + function(x, i) { + var data = fs.readFileSync(x), + id = x.substr(start.length).replace(/^\//, "") + .replace(/\.js$/, ""); if (!data) { log("failed to read ["+x+"]."); - process.stdout.write("/* FAILED TO READ NLS BUNDLE ENTRY ["+x+"] */\n"); - } else { - log("writing: "+x); - // process.stdout.write("/* START OF NLS BUNDLE ENTRY ["+x+"] */\n"); - process.stdout.write(data); - // process.stdout.write("\n/* END OF NLS BUNDLE ENTRY ["+x+"] */\n"); + return; + } + log("writing: "+x); + if (i > 0) { + process.stdout.write(",\n"); } + process.stdout.write(JSON.stringify(id) + ": function(){\n"); + process.stdout.write(data); + process.stdout.write("\n}"); } ); + process.stdout.write("\n}});\n"); } }); From 29ccadb6d7b22c720a51cec894803f156c616182 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 268/385] Improved output about what the schema says of an element. --- webodf/tools/odfRng2Config.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/webodf/tools/odfRng2Config.js b/webodf/tools/odfRng2Config.js index 1b2f1d81e..feb57084f 100644 --- a/webodf/tools/odfRng2Config.js +++ b/webodf/tools/odfRng2Config.js @@ -259,8 +259,15 @@ function onLoadRng(err, document) { resolveDefines(attributes, defines); elementNames = Object.keys(elements).sort(); + // The grammar says whether an element may hold text of its own, so the + // category the list of "OdfSchema.js" carries is told from it: an element + // that holds text is read as text, and one that holds none is read as an + // object. The list of that file was written by hand over the years, so + // what is written here is what the schema says and no more: it is read + // beside the list rather than put in its place. doc = elementNames.map(function (elementName) { - return "[" + pad('"' + elementName + '"', 40) + ", TODO]"; + var category = elements[elementName].text ? "TEXT" : "OBJECT"; + return "[" + pad('"' + elementName + '"', 40) + ", " + category + "]"; }).join(",\n"); console.log(doc + "\n"); From daf6439a4d159a6b67b679cd7a6e28a0534ff834 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 269/385] Added the spacings of two paragraphs that follow one another. --- webodf/lib/odf/TextLayout.js | 66 +++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 4 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 3417a242b..750f69f1a 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -2524,6 +2524,14 @@ odf.TextLayout = function TextLayout() { if (style.getPropertyValue("break-inside") === "avoid") { return false; } + // The lines an office keeps together are the lines of a paragraph: a + // section, a list or a table of contents is cut wherever a paragraph + // of it may be cut, and the rule of the orphans is read of that + // paragraph and not of the whole of what holds it. + if (element.namespaceURI !== textns + || (element.localName !== "p" && element.localName !== "h")) { + return true; + } head = linesOf(element); tail = whole - head; if (tail < 1) { @@ -3267,6 +3275,28 @@ odf.TextLayout = function TextLayout() { ? tail : null; } + /** + * Whether what was cut off an element holds nothing worth a page. + * + * An element that is cut may leave a copy that holds no word and no + * shape of its own: the empty paragraph of a table of contents, for one. + * It is thrown away rather than written, as it would take the room of + * its spacings on the page that follows and leave a page half empty. + * @param {?Element} tail what was cut off + * @return {!boolean} + */ + function holdsNothing(tail) { + if (!tail) { + return true; + } + if (String(tail.textContent).trim() !== "") { + return false; + } + // A frame, an image or a shape is drawn although it holds no word. + return tail.getElementsByTagNameNS(drawns, "frame").length === 0 + && tail.getElementsByTagNameNS(drawns, "image").length === 0 + && tail.getElementsByTagNameNS(tablens, "table").length === 0; + } /** * Whether a table may be cut between two of its rows. * @@ -3551,8 +3581,18 @@ odf.TextLayout = function TextLayout() { } } state.waiting.shift(); - box.appendChild(node); - added.push(node); + // A copy of what was cut that holds nothing is not written: + // it would take the room of its spacings on the page and + // leave the page that much emptier. + if (node.nodeType !== Node.ELEMENT_NODE + || !/**@type{!Element}*/(node).hasAttributeNS( + webodfhelperns, + "continued" + ) + || !holdsNothing(/**@type{!Element}*/(node))) { + box.appendChild(node); + added.push(node); + } } if (added.length === 0) { break; @@ -3608,6 +3648,12 @@ odf.TextLayout = function TextLayout() { } rest = null; } + if (rest && holdsNothing(rest)) { + // What was cut off holds nothing: it is thrown away + // rather than sent to the next page, where it would + // take the room of its spacings and no more. + rest = null; + } if (rest) { state.waiting.unshift(rest); } else if (box.childNodes.length > 1) { @@ -3763,6 +3809,14 @@ odf.TextLayout = function TextLayout() { // of css to the page: the labels of the lists are worked out once // and written on the elements, so nothing of the document is counted // by them any more, see "numberLists" in "ListStylesToCss.js". + // The spacing under a paragraph and the spacing over the next are + // added, as an office adds them, and not folded into one as the + // browser folds the margins of two elements that follow one another: + // a box that lays its children in a column keeps them apart. + sheet.insertRule(".webodf-pageBox, office|text, text|section," + + " text|table-of-content, text|index-body, text|index-title" + + " {display:flex;flex-direction:column;align-items:stretch;}", + sheet.cssRules.length); sheet.insertRule(".webodf-pageBox {overflow:hidden;contain:strict;}", sheet.cssRules.length); while (text.firstChild) { @@ -3879,8 +3933,9 @@ odf.TextLayout = function TextLayout() { for (i = from; i < boxes.length; i += 1) { dims = plan.at(i); place = pagePlace(plan, i); - /**@type{!HTMLElement}*/(boxes[i]).style.left = (place.left - + dims.marginLeft) + "px"; + // The box is the whole of the paper, its margins being its + // padding, so it stands where the page stands. + /**@type{!HTMLElement}*/(boxes[i]).style.left = place.left + "px"; /**@type{!HTMLElement}*/(boxes[i]).style.top = (place.top + dims.marginTop) + "px"; } @@ -3969,6 +4024,9 @@ odf.TextLayout = function TextLayout() { } more = null; } + if (more && holdsNothing(more)) { + more = null; + } sent = []; walk = over.nextSibling; while (walk) { From f42ab3d341471137ce0828930d0464cece84a0e3 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 270/385] Read the style of an element from an attribute of its own. --- webodf/lib/odf/OdfCanvas.js | 50 +++++++++++++++ webodf/lib/odf/Style2CSS.js | 119 +++++++++++++++++++++++++++++++++--- 2 files changed, 162 insertions(+), 7 deletions(-) diff --git a/webodf/lib/odf/OdfCanvas.js b/webodf/lib/odf/OdfCanvas.js index 5334963fd..1d85e7275 100644 --- a/webodf/lib/odf/OdfCanvas.js +++ b/webodf/lib/odf/OdfCanvas.js @@ -220,6 +220,8 @@ /**@const@type {!string}*/xlinkns = odf.Namespaces.xlinkns, /**@const@type {!string}*/presentationns = odf.Namespaces.presentationns, /**@const@type {!string}*/webodfhelperns = "urn:webodf:names:helper", + /**@type{?MutationObserver}*/ + styleNameWatcher = null, xpath = xmldom.XPath, domUtils = webodfcore.DomUtils, odfUtils = odf.OdfUtils, @@ -2857,6 +2859,49 @@ } } } + /** + * Keep the classes of the styles right while a document is written in. + * + * An editor writes the name of another style on a paragraph, and the + * class it carries is written anew: what is drawn answers to the class + * and no longer to the name. + * @param {!Element} root + * @return {undefined} + */ + function watchStyleNames(root) { + var window = runtime.getWindow(), + /**@type{!Array.}*/ + watched = [], + /**@type{!number}*/ + i; + if (!window || !window.MutationObserver) { + return; + } + if (styleNameWatcher) { + styleNameWatcher.disconnect(); + } + for (i = 0; i < odf.Style2CSS.styleNameAttributes.length; i += 1) { + watched.push(odf.Style2CSS.styleNameAttributes[i].prefix + + ":style-name"); + } + styleNameWatcher = new window.MutationObserver(function (records) { + records.forEach(function (record) { + // An element alone carries an attribute, so what answers + // here is one; the number is written rather than "Node", + // that the sources of this file do not name. + if (record.target.nodeType === 1) { + odf.Style2CSS.stampOne( + /**@type{!Element}*/(record.target) + ); + } + }); + }); + styleNameWatcher.observe(root, { + attributes: true, + subtree: true, + attributeFilter: watched + }); + } /** * @param {!Element} odfbody * @return {undefined} @@ -4112,6 +4157,11 @@ shadowContent.style.left = 0; container.getContentElement().appendChild(shadowContent); + // The classes of the styles are written by "Style2CSS.js", that + // the rules are read against; they are kept right here while a + // document is written in. + watchStyleNames(odfnode); + // The margins of the page, that a frame placed against the sheet is // written from, see "getHorizontalOffset". margins = formatting.getPageMargins("", "paragraph"); diff --git a/webodf/lib/odf/Style2CSS.js b/webodf/lib/odf/Style2CSS.js index e511b2405..6064ca293 100644 --- a/webodf/lib/odf/Style2CSS.js +++ b/webodf/lib/odf/Style2CSS.js @@ -294,19 +294,30 @@ odf.Style2CSS = function Style2CSS() { return null; } - // If there is no name, it is a default style, in which case style-name shall be used without a value + // The style a name stands for is read from an attribute of its own + // and not from the value of the attribute that names it: a browser + // sorts the rules by the attribute they read, and tries on an + // element only those that read an attribute it carries, where every + // rule reading the same attribute is tried on every element that + // carries it. A document of twenty thousand paragraphs and two + // thousand styles is read forty million times over that way, which + // is some seconds; by the name of the attribute it is read once by + // element, some tens of milliseconds. The attributes are written on + // the elements by "odf.Style2CSS.stampStyleClasses". + // + // A class would do the same and is not read at all here: the + // attribute of a class answers to css for the elements of html and + // of svg alone, and never for those of OpenDocument. + // + // Where there is no name it is a default style, that answers for + // every element of the family. if (name) { - namepart = '[' + prefix + '|style-name="' + name + '"]'; + namepart = '[' + odf.Style2CSS.classOfStyle(prefix, name) + ']'; } else { namepart = ''; } if (prefix === 'presentation') { prefix = 'draw'; - if (name) { - namepart = '[presentation|style-name="' + name + '"]'; - } else { - namepart = ''; - } } selector = prefix + '|' + familytagnames[family].join( namepart + ',' + prefix + '|' @@ -1395,6 +1406,9 @@ odf.Style2CSS = function Style2CSS() { } odfRoot = rootNode; + // Every element is given the class of the style it names, that the + // rules written below are read against. + odf.Style2CSS.stampStyleClasses(rootNode); // make stylesheet empty while (stylesheet.cssRules.length) { @@ -1422,3 +1436,94 @@ odf.Style2CSS = function Style2CSS() { } }; }; + +/** + * The attribute an element carries for the style of a name. + * + * A name of the OpenDocument standard holds letters, digits, dots and + * dashes, and a name of an attribute holds no dot: what is not a letter, a + * digit, a dash or an underscore is written as its number between + * underscores, and a letter of the upper case is written under an + * underscore, as an attribute of a document of html knows no case. Two + * names never come to one attribute that way. + * @param {!string} prefix the prefix of the family, "text" and its kin + * @param {!string} name + * @return {!string} + */ +odf.Style2CSS.classOfStyle = function (prefix, name) { + "use strict"; + var written = "", + /**@type{!string}*/ + letter, + /**@type{!number}*/ + i; + for (i = 0; i < name.length; i += 1) { + letter = name.charAt(i); + if (/[A-Z]/.test(letter)) { + written += "_" + letter.toLowerCase(); + } else if (/[a-z0-9\-]/.test(letter)) { + written += letter; + } else { + written += "_" + name.charCodeAt(i).toString(16) + "_"; + } + } + return "odf-" + prefix + "-" + written; +}; + +/** + * The attributes that name a style, by the prefix of the family they belong + * to. + * @const + * @type{!Array.} + */ +odf.Style2CSS.styleNameAttributes = [ + {ns: odf.Namespaces.textns, prefix: "text"}, + {ns: odf.Namespaces.drawns, prefix: "draw"}, + {ns: odf.Namespaces.tablens, prefix: "table"}, + {ns: odf.Namespaces.presentationns, prefix: "presentation"}, + {ns: odf.Namespaces.officens, prefix: "office"} +]; +/** + * Write on one element the attribute of each style it names. + * @param {!Element} element + * @return {undefined} + */ +odf.Style2CSS.stampOne = function (element) { + "use strict"; + var /**@type{!Array.}*/ + written = [], + named = odf.Style2CSS.styleNameAttributes, + /**@type{!number}*/ + i, + /**@type{!string}*/ + name; + for (i = 0; i < named.length; i += 1) { + name = element.getAttributeNS(named[i].ns, "style-name") || ""; + if (name) { + written.push(odf.Style2CSS.classOfStyle(named[i].prefix, name)); + } + } + written.forEach(function (attribute) { + if (!element.hasAttribute(attribute)) { + element.setAttribute(attribute, ""); + } + }); +}; +/** + * Write on every element of a tree the attribute of the style it names. + * + * A rule is written against an attribute of its own, see "createSelector": + * this writes those attributes on the elements that name the styles. + * @param {!Element} root + * @return {undefined} + */ +odf.Style2CSS.stampStyleClasses = function (root) { + "use strict"; + var elements = root.getElementsByTagName("*"), + /**@type{!number}*/ + i; + odf.Style2CSS.stampOne(root); + for (i = 0; i < elements.length; i += 1) { + odf.Style2CSS.stampOne(/**@type{!Element}*/(elements.item(i))); + } +}; From 6713dd28a36b8c9466995b4a8fd426f3dde510d6 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 271/385] Said what is wrong when node answers nothing, rather than fail on a string. --- CMakeLists.txt | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5636bd154..a8f191db4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -191,8 +191,22 @@ FIND_PROGRAM(NODEJS_EXECUTABLE IF(NODEJS_EXECUTABLE) execute_process(COMMAND ${NODEJS_EXECUTABLE} --version OUTPUT_VARIABLE NODEJS_VERSION + ERROR_VARIABLE NODEJS_SAID + RESULT_VARIABLE NODEJS_ANSWERED OUTPUT_STRIP_TRAILING_WHITESPACE) - string(SUBSTRING ${NODEJS_VERSION} 1 -1 NODEJS_VERSION) + # A node that is there and answers nothing is a node that cannot be used, + # and it is said as much: the version was read as it stood, so an answer + # of nothing ended the build on "string sub-command SUBSTRING requires + # four arguments", which tells a reader nothing of node. + if (NOT NODEJS_ANSWERED EQUAL 0 OR NODEJS_VERSION STREQUAL "") + message(FATAL_ERROR "Node.js was found at " ${NODEJS_EXECUTABLE} + " but it answered nothing when asked for its version" + " (\"${NODEJS_EXECUTABLE} --version\" said \"${NODEJS_SAID}\")." + "\nThe path may be one that cmake kept from a build that went" + " before, of a node that is no longer installed: run it again" + " with -U NODEJS_EXECUTABLE -U NPM.") + endif () + string(SUBSTRING "${NODEJS_VERSION}" 1 -1 NODEJS_VERSION) MESSAGE (STATUS "Installed Node.js found: ${NODEJS_EXECUTABLE} - ${NODEJS_VERSION}") ELSE(NODEJS_EXECUTABLE) MESSAGE (STATUS "No installed Node.js found. Node.js is not downloaded, but expected to be installed.") @@ -202,7 +216,7 @@ ENDIF(NODEJS_EXECUTABLE) # what it finds, so a node that was installed later, by nvm for instance, is # only seen once the entry is dropped: the path is named here, as it is often # an older one that is still in the cache. -if (${NODEJS_VERSION} VERSION_LESS ${REQUIRED_NODEJS_VERSION}) +if (NODEJS_VERSION VERSION_LESS REQUIRED_NODEJS_VERSION) message(FATAL_ERROR "Node.js is required in version " ${REQUIRED_NODEJS_VERSION} " or later, but " ${NODEJS_EXECUTABLE} " is " ${NODEJS_VERSION} From 46188f9f75adc8690ef6d9b0b09112b8c8b6fad8 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 272/385] Set the line of the foot right once the count of pages is known. --- webodf/lib/odf/TextLayout.js | 43 +++++++++++++++++++++++++++++++----- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index ea05c4877..ff5a09f84 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -1563,6 +1563,22 @@ odf.TextLayout = function TextLayout() { } spreadLines(drawn); } + /** + * The paragraph a node stands in, if any. + * @param {!Node} node + * @return {?Element} + */ + function paragraphOf(node) { + var walk = node.parentNode; + while (walk && walk.nodeType === Node.ELEMENT_NODE) { + if (walk.namespaceURI === textns + && (walk.localName === "p" || walk.localName === "h")) { + return /**@type{!Element}*/(walk); + } + walk = walk.parentNode; + } + return null; + } /** * Write the number of pages the text was broken into in every header and * every foot that asks for it. @@ -1570,20 +1586,35 @@ odf.TextLayout = function TextLayout() { * The pages are broken one slice at a time, so the count is not known * until the last slice: the field carries the number the writer of the * document recorded until then, and the true one once the text is broken - * whole. Nothing is laid out again for it: the fields stand in the - * furniture of the pages, beside the text and not in it, and only their - * text is written anew. + * whole. The line the field stands in is laid out again: a foot that + * writes "page 3 of 785" holds the count against a tab stop at the right + * margin, and a number of another width leaves the line askew where the + * stops are not measured anew. + * @param {!odf.ODFDocumentElement} odfroot * @param {!HTMLDivElement} pagesDiv * @param {!number} pages * @return {undefined} */ - function tellPageCount(pagesDiv, pages) { + function tellPageCount(odfroot, pagesDiv, pages) { var fields = pagesDiv.getElementsByTagNameNS(textns, "page-count"), + /**@type{!Array.}*/ + lines = [], + /**@type{?Element}*/ + paragraph, /**@type{!number}*/ i; for (i = 0; i < fields.length; i += 1) { fields.item(i).textContent = String(pages); } + for (i = 0; i < fields.length; i += 1) { + paragraph = paragraphOf(/**@type{!Node}*/(fields.item(i))); + if (paragraph && lines.indexOf(paragraph) === -1) { + lines.push(paragraph); + } + } + lines.forEach(function (paragraph) { + layOutTabStops(odfroot, paragraph); + }); } /** * Whether a paragraph or a table asks to be written on a new page. @@ -2928,7 +2959,9 @@ odf.TextLayout = function TextLayout() { round2 += 1; } if (round === fillingRound && fillingDiv) { - tellPageCount(fillingDiv, countPages(fillingDiv)); + tellPageCount( + /**@type{!odf.ODFDocumentElement}*/(fillingRoot), + fillingDiv, countPages(fillingDiv)); } }, 0); } From ff1ba623b8a57d12bd3a7030cd7d9d02e2f9cce5 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 273/385] Kept the boxes of the pages counted once a document is drawn small. --- webodf/lib/odf/TextLayout.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index 98e08ea2c..9a5e91fbc 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -79,14 +79,16 @@ odf.TextLayout = function TextLayout() { * How wide the box that holds the height of a page is drawn. It is * as narrow as a browser lets a box be and still count it: a box of * no width at all is held to occupy nothing, and every page would be - * drawn at the top of the one before it. The width stands above the - * grain of the engines, a sixtieth of a pixel in gecko and a - * sixty-fourth in blink and in webkit, and what it takes is taken - * from the text beside it. + * drawn at the top of the one before it. The width stands well above + * the grain of the engines, a sixtieth of a pixel in gecko and a + * sixty-fourth in blink and in webkit, and above it still once a + * reader has drawn the document small: a quarter of a pixel is + * counted down to a zoom of a fifteenth, where a twentieth of a + * pixel is already lost at a quarter. * @const * @type{!string} */ - pageColumnWidth = "0.05px", + pageColumnWidth = "0.25px", /** * How many pages are drawn at the most. A document of a thousand pages * is already far more than a reader shows at once, and the bound is From ed37559018a31eadacf60c275858a9a42a772cb2 Mon Sep 17 00:00:00 2001 From: Daniel Berthereau Date: Tue, 4 Aug 2026 00:00:00 +0000 Subject: [PATCH 274/385] Set the parts of a header and of a footer against their tab stops. --- webodf/lib/odf/TextLayout.js | 370 ++++++++++++++++++++++++++++++++++- 1 file changed, 363 insertions(+), 7 deletions(-) diff --git a/webodf/lib/odf/TextLayout.js b/webodf/lib/odf/TextLayout.js index e3a506428..1457af637 100644 --- a/webodf/lib/odf/TextLayout.js +++ b/webodf/lib/odf/TextLayout.js @@ -23,13 +23,17 @@ */ -/*global odf, runtime, webodfcore*/ +/*global odf, runtime, webodfcore, Node*/ /** * @constructor */ odf.TextLayout = function TextLayout() { "use strict"; - var domUtils = webodfcore.DomUtils, + var /**@type{?odf.ODFDocumentElement}*/ + styleCacheRoot = null, + /**@type{!Object.}*/ + styleCache = {}, + domUtils = webodfcore.DomUtils, odfUtils = odf.OdfUtils, fons = "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", stylens = "urn:oasis:names:tc:opendocument:xmlns:style:1.0", @@ -106,10 +110,11 @@ odf.TextLayout = function TextLayout() { * @param {!Element} properties * @param {!string} name * @param {!number} fallback + * @param {!string=} ns the namespace of the attribute, "fo" by default * @return {!number} */ - function lengthInPx(properties, name, fallback) { - var value = properties.getAttributeNS(fons, name), + function lengthInPx(properties, name, fallback, ns) { + var value = properties.getAttributeNS(ns || fons, name), px = fallback; // A length in a unit that is not read, "em" for one, throws rather // than answering, and a page that is drawn at the size of A4 is better @@ -149,6 +154,56 @@ odf.TextLayout = function TextLayout() { } return area; } + /** + * The style of a family a name stands for, wherever it is written: the + * styles of a document and the ones a document writes for one use of one + * element, "office:automatic-styles". + * @param {!odf.ODFDocumentElement} odfroot + * @param {!string} name + * @param {!string} family + * @return {?Element} + */ + function styleOf(odfroot, name, family) { + var /**@type{!Array.}*/ + roots = [odfroot.automaticStyles, odfroot.styles], + /**@type{!string}*/ + key = family + "/" + name, + /**@type{!NodeList}*/ + styles, + /**@type{!Element}*/ + candidate, + /**@type{!number}*/ + i, + /**@type{!number}*/ + r; + if (name === "") { + return null; + } + // A page reads the same few styles as every other page does, and a + // document holds thousands of them: they are read once, and the + // cache is dropped whenever another document is laid out. + if (styleCacheRoot !== odfroot) { + styleCacheRoot = odfroot; + styleCache = {}; + } + if (styleCache.hasOwnProperty(key)) { + return styleCache[key]; + } + styleCache[key] = null; + for (r = 0; r < roots.length; r += 1) { + styles = roots[r].getElementsByTagNameNS(stylens, "style"); + for (i = 0; i < styles.length; i += 1) { + candidate = /**@type{!Element}*/(styles.item(i)); + if (candidate.getAttributeNS(stylens, "name") === name + && candidate.getAttributeNS(stylens, "family") + === family) { + styleCache[key] = candidate; + return candidate; + } + } + } + return null; + } /** * The graphic style of a shape, followed up its parents: a shape names a * style of the family "graphic", that may name another one in turn. @@ -614,10 +669,293 @@ odf.TextLayout = function TextLayout() { }); return meta; } + /** + * The paragraphs and the headings a box holds. + * @param {!Element} box + * @return {!Array.} + */ + function paragraphsOf(box) { + var /**@type{!Array.}*/ + found = [], + /**@type{!Array.}*/ + names = ["p", "h"], + /**@type{!NodeList}*/ + nodes, + /**@type{!number}*/ + i, + /**@type{!number}*/ + n; + for (n = 0; n < names.length; n += 1) { + nodes = box.getElementsByTagNameNS(textns, names[n]); + for (i = 0; i < nodes.length; i += 1) { + found.push(/**@type{!Element}*/(nodes.item(i))); + } + } + return found; + } + /** + * Read the name a document gives a style behind the stamp of the canvas. + * + * A header is drawn twice, once for the page and once for the styles of + * the canvas, which writes a stamp of its own before the name of each + * style it draws a second time: "