You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tika.apache.org by ta...@apache.org on 2016/11/30 20:25:12 UTC
[1/6] tika git commit: TIKA-1321 -- add SAX based docx parser and
integrate it with the recent 2006ml parser work -- initial commit
Repository: tika
Updated Branches:
refs/heads/sax_docx [created] d19e4725f
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/test/resources/test-documents/testWORD_2006ml_src.docx
----------------------------------------------------------------------
diff --git a/tika-parsers/src/test/resources/test-documents/testWORD_2006ml_src.docx b/tika-parsers/src/test/resources/test-documents/testWORD_2006ml_src.docx
deleted file mode 100644
index 0be09f2..0000000
Binary files a/tika-parsers/src/test/resources/test-documents/testWORD_2006ml_src.docx and /dev/null differ
[4/6] tika git commit: TIKA-1321 -- add SAX based docx parser and
integrate it with the recent 2006ml parser work -- initial commit
Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLParserTest.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLParserTest.java b/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLParserTest.java
deleted file mode 100644
index 607e6ef..0000000
--- a/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLParserTest.java
+++ /dev/null
@@ -1,182 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-import static org.junit.Assert.assertEquals;
-
-import java.util.List;
-
-import org.apache.tika.TikaTest;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.Office;
-import org.apache.tika.metadata.OfficeOpenXMLCore;
-import org.apache.tika.metadata.OfficeOpenXMLExtended;
-import org.apache.tika.metadata.TikaCoreProperties;
-import org.apache.tika.parser.ParseContext;
-import org.apache.tika.parser.RecursiveParserWrapper;
-import org.apache.tika.parser.microsoft.MSOfficeParserConfig;
-import org.junit.Test;
-
-
-public class Word2006MLParserTest extends TikaTest {
-
- @Test
- public void basicTest() throws Exception {
-
-
-
- List<Metadata> metadataList = getRecursiveMetadata("testWORD_2006ml.xml");
-
- assertEquals(5, metadataList.size());
-
- Metadata m = metadataList.get(0);
-
- assertEquals("2016-11-23T12:07:00Z", m.get(TikaCoreProperties.CREATED));
- assertEquals("2016-11-23T12:07:00Z", m.get(TikaCoreProperties.MODIFIED));
- assertEquals("My Document Title", m.get(TikaCoreProperties.TITLE));
- assertEquals("This is the Author", m.get(TikaCoreProperties.CREATOR));
- assertEquals("2", m.get(OfficeOpenXMLCore.REVISION));
- assertEquals("Allison, Timothy B.", m.get(OfficeOpenXMLCore.LAST_MODIFIED_BY));
- assertEquals("0", m.get(OfficeOpenXMLExtended.DOC_SECURITY));
- assertEquals("225", m.get(Office.WORD_COUNT));
- assertEquals("3", m.get(Office.PARAGRAPH_COUNT));
- assertEquals("1506", m.get(Office.CHARACTER_COUNT_WITH_SPACES));
- assertEquals("10", m.get(Office.LINE_COUNT));
- assertEquals("16.0000", m.get(OfficeOpenXMLExtended.APP_VERSION));
-
-
- String content = m.get(RecursiveParserWrapper.TIKA_CONTENT);
-
-
- assertContainsCountTimes("engaging title page", content, 1);
- assertContainsCountTimes("<p>This is the Author</p>", content, 1);
- assertContainsCountTimes("<p>This is an engaging title page</p>", content, 1);
-
- assertContains("<p>My Document Title</p>", content);
- assertContains("<p>My Document Subtitle</p>", content);
-
- assertContains("<p>\tHeading1\t3</p>", content);
-
-
- //TODO: integrate numbering
- assertContains("Really basic 2.", content);
-
- assertContainsCountTimes("This is a text box", content, 1);
-
- assertContains("<p>This is a hyperlink: <a href=\"http://tika.apache.org\">tika</a></p>", content);
-
- assertContains("<p>This is a link to a local file: <a href=\"file:///C:\\data\\test.png\">test.png</a></p>", content);
-
- assertContains("<p>This is 10 spaces</p>", content);
-
- //caption
- assertContains("<p>Table 1: Table1 Caption</p>", content);
-
- //embedded table
- //TODO: figure out how to handle embedded tables in html
- assertContains("<p>Embedded table r1c1</p>", content);
-
- //shape
- assertContainsCountTimes("<p>This is text within a shape", content, 1);
-
- //sdt rich text
- assertContains("<p>Rich text content control", content);
-
- //sdt simple text
- assertContains("<p>Simple text content control", content);
-
- //sdt repeating
- assertContains("Repeating content", content);
-
- //sdt dropdown
- //TODO: get options for dropdown
- assertContains("Drop down1", content);
-
- //sdt date
- assertContains("<p>11/16/2016</p>", content);
-
- //test that <tab/> works
- assertContains("tab\ttab", content);
-
- assertContainsCountTimes("serious word art", content, 1);
- assertContainsCountTimes("Wordartr1c1", content, 1);
-
- //glossary document contents
- assertContains("Click or tap to enter a date", content);
-
- //basic formatting
- assertContains("<p>The <i>quick</i> brown <b>fox </b>j<i>um</i><b><i>ped</i></b> over",
- content);
-
- //TODO: add chart parsing
-// assertContains("This is the chart", content);
-
- assertContains("This is a comment", content);
-
- assertContains("This is an endnote", content);
-
- assertContains("this is the footnote", content);
-
- assertContains("First page header", content);
-
- assertContains("Even page header", content);
-
- assertContains("Odd page header", content);
-
- assertContains("First page footer", content);
-
- assertContains("Even page footer", content);
-
- assertContains("Odd page footer", content);
-
- //test default includes deleted
- assertContains("frog", content);
-
- assertContains("Mattmann", content);
-
- //TODO: extract this...Note that it is in "Backup" not "Choice"!!!
-// assertContains("This is the chart title", content);
-
-
-
- }
-
- private void assertContainsCountTimes(String needle, String haystack, int expectedCount) {
- int i = haystack.indexOf("engaging title page");
- int cnt = 0;
- while (i > -1) {
- cnt++;
- i = haystack.indexOf("engaging title page", i+1);
- }
- assertEquals("found needle >"+ needle+"<"+cnt+" times instead of expected: "+expectedCount,
- expectedCount, cnt);
-
- }
-
- @Test
- public void testSkipDeleted() throws Exception {
- ParseContext pc = new ParseContext();
- MSOfficeParserConfig msOfficeParserConfig = new MSOfficeParserConfig();
- msOfficeParserConfig.setIncludeDeletedContent(false);
- pc.set(MSOfficeParserConfig.class, msOfficeParserConfig);
-
- XMLResult r = getXML("testWORD_2006ml.xml", pc);
- assertNotContained("frog", r.xml);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParserTest.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParserTest.java b/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParserTest.java
new file mode 100644
index 0000000..79f1890
--- /dev/null
+++ b/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParserTest.java
@@ -0,0 +1,171 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.apache.tika.TikaTest;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.Office;
+import org.apache.tika.metadata.OfficeOpenXMLCore;
+import org.apache.tika.metadata.OfficeOpenXMLExtended;
+import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.RecursiveParserWrapper;
+import org.apache.tika.parser.microsoft.OfficeParserConfig;
+import org.junit.Test;
+
+
+public class Word2006MLParserTest extends TikaTest {
+
+ @Test
+ public void basicTest() throws Exception {
+
+ List<Metadata> metadataList = getRecursiveMetadata("testWORD_2006ml.xml");
+
+ assertEquals(9, metadataList.size());
+
+ Metadata m = metadataList.get(0);
+
+ assertEquals("2016-11-29T17:54:00Z", m.get(TikaCoreProperties.CREATED));
+ assertEquals("2016-11-29T17:54:00Z", m.get(TikaCoreProperties.MODIFIED));
+ assertEquals("My Document Title", m.get(TikaCoreProperties.TITLE));
+ assertEquals("This is the Author", m.get(TikaCoreProperties.CREATOR));
+ assertEquals("2", m.get(OfficeOpenXMLCore.REVISION));
+ assertEquals("Allison, Timothy B.", m.get(TikaCoreProperties.MODIFIER));
+ assertEquals("0", m.get(OfficeOpenXMLExtended.DOC_SECURITY));
+ assertEquals("260", m.get(Office.WORD_COUNT));
+ assertEquals("3", m.get(Office.PARAGRAPH_COUNT));
+ assertEquals("1742", m.get(Office.CHARACTER_COUNT_WITH_SPACES));
+ assertEquals("12", m.get(Office.LINE_COUNT));
+ assertEquals("16.0000", m.get(OfficeOpenXMLExtended.APP_VERSION));
+
+
+ String content = m.get(RecursiveParserWrapper.TIKA_CONTENT);
+
+ assertContainsCount("This is the Author", content, 1);
+ assertContainsCount("This is an engaging title page", content, 1);
+
+ assertContains("My Document Title", content);
+ assertContains("My Document Subtitle", content);
+
+ assertContains("<p>\tHeading1\t3</p>", content);
+
+
+ //TODO: integrate numbering
+ assertContains("Really basic 2.", content);
+
+ assertContainsCount("This is a text box", content, 1);
+
+// assertContains("<p>This is a hyperlink: <a href=\"http://tika.apache.org\">tika</a></p>", content);
+
+// assertContains("<p>This is a link to a local file: <a href=\"file:///C:\\data\\test.png\">test.png</a></p>", content);
+
+ assertContains("<p>This is 10 spaces</p>", content);
+
+ //caption
+ assertContains("<p>Table 1: Table1 Caption</p>", content);
+
+ //embedded table
+ //TODO: figure out how to handle embedded tables in html
+ assertContains("<p>Embedded table r1c1</p>", content);
+
+ //shape
+ assertContainsCount("<p>This is text within a shape", content, 1);
+
+ //sdt rich text
+ assertContains("<p>Rich text content control", content);
+
+ //sdt simple text
+ assertContains("<p>Simple text content control", content);
+
+ //sdt repeating
+ assertContains("Repeating content", content);
+
+ //sdt dropdown
+ //TODO: get options for dropdown
+ assertContains("Drop down1", content);
+
+ //sdt date
+ assertContains("<p>11/16/2016</p>", content);
+
+ //test that <tab/> works
+ assertContains("tab\ttab", content);
+
+ assertContainsCount("serious word art", content, 1);
+ assertContainsCount("Wordartr1c1", content, 1);
+
+ //glossary document contents
+ assertContains("Click or tap to enter a date", content);
+
+ //basic formatting
+ assertContains("<p>The <i>quick</i> brown <b>fox </b>j<i>um</i><b><i>ped</i></b> over",
+ content);
+
+ //TODO: add chart parsing
+// assertContains("This is the chart", content);
+
+ assertContains("This is a comment", content);
+
+ assertContains("This is an endnote", content);
+
+ assertContains("this is the footnote", content);
+
+ assertContains("First page header", content);
+
+ assertContains("Even page header", content);
+
+ assertContains("Odd page header", content);
+
+ assertContains("First page footer", content);
+
+ assertContains("Even page footer", content);
+
+ assertContains("Odd page footer", content);
+
+ //test default includes deleted
+ assertContains("frog", content);
+
+ assertContains("Mattmann", content);
+
+ //test default -- do not include moveFrom
+ assertContainsCount("Second paragraph", content, 1);
+
+ //TODO: figure out how to get this
+ //assertContains("This is the chart title", content);
+
+ }
+
+ @Test
+ public void testSkipDeletedAndMoveFrom() throws Exception {
+ ParseContext pc = new ParseContext();
+ OfficeParserConfig officeParserConfig = new OfficeParserConfig();
+ officeParserConfig.setIncludeDeletedContent(false);
+ officeParserConfig.setIncludeMoveFromContent(true);
+ pc.set(OfficeParserConfig.class, officeParserConfig);
+
+ XMLResult r = getXML("testWORD_2006ml.xml", pc);
+ assertNotContained("frog", r.xml);
+ assertContainsCount("Second paragraph", r.xml, 2);
+
+ }
+
+
+}
[5/6] tika git commit: TIKA-1321 -- add SAX based docx parser and
integrate it with the recent 2006ml parser work -- initial commit
Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFDocumentXMLBodyHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFDocumentXMLBodyHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFDocumentXMLBodyHandler.java
new file mode 100644
index 0000000..dce36a2
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFDocumentXMLBodyHandler.java
@@ -0,0 +1,318 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf;
+
+
+import java.util.Date;
+import java.util.Map;
+
+import org.apache.tika.utils.DateUtils;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * This class is intended to handle anything that might contain IBodyElements:
+ * main document, headers, footers, notes, etc.
+ */
+
+public class XWPFDocumentXMLBodyHandler extends DefaultHandler {
+
+
+ enum EditType {
+ NONE,
+ INSERT,
+ DELETE,
+ MOVE_TO,
+ MOVE_FROM
+ }
+
+
+ private final static String W_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
+ private final static String MC_NS = "http://schemas.openxmlformats.org/markup-compatibility/2006";
+ private final static String OFFICE_DOC_RELATIONSHIP_NS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
+
+ private final static char[] TAB = new char[1];
+
+ static {
+ TAB[0] = '\t';
+ }
+
+ private final XWPFBodyContentsHandler bodyContentsHandler;
+ //private final RelationshipsManager relationshipsManager;
+ private final Map<String, String> hyperlinks;
+
+ private final StringBuilder runBuffer = new StringBuilder();
+
+ private boolean inR = false;
+ private boolean inT = false;
+ private int pDepth = 0;
+ private boolean inRPr = false;
+ private boolean inNumPr = false;
+ private boolean inDelText = false;
+ private boolean inHyperlink = false;
+
+ //alternate content can be embedded in itself.
+ //need to track depth.
+ //if in alternate, choose fallback, maybe make this configurable?
+ private int inACChoiceDepth = 0;
+ private int inACFallbackDepth = 0;
+ private EditType editType = EditType.NONE;
+ private String hyperlink = null;
+
+ private XWPFRunProperties currRunProperties = new XWPFRunProperties();
+
+ public XWPFDocumentXMLBodyHandler(XWPFBodyContentsHandler bodyContentsHandler,
+ Map<String, String> hyperlinks) {
+ this.bodyContentsHandler = bodyContentsHandler;
+ this.hyperlinks = hyperlinks;
+ }
+
+
+ @Override
+ public void startDocument() throws SAXException {
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+ }
+
+ @Override
+ public void startPrefixMapping(String prefix, String uri) throws SAXException {
+ }
+
+ @Override
+ public void endPrefixMapping(String prefix) throws SAXException {
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+ if (uri != null && uri.equals(MC_NS)) {
+ if (localName.equals("Choice")) {
+ inACChoiceDepth++;
+ } else if (localName.equals("Fallback")) {
+ inACFallbackDepth++;
+ }
+ }
+
+ if (inACChoiceDepth > 0) {
+ return;
+ }
+
+ if (uri == null || uri.equals(W_NS)) {
+ if (localName.equals("p")) {
+ bodyContentsHandler.startParagraph();
+ pDepth++;
+ } else if (localName.equals("r")) {
+ inR = true;
+ } else if (localName.equals("t")) {
+ inT = true;
+ } else if (localName.equals("tab")) {
+ runBuffer.append("\t");
+ } else if (localName.equals("tbl")) {
+ bodyContentsHandler.startTable();
+ } else if (localName.equals("tc")) {
+ bodyContentsHandler.startTableCell();
+ } else if (localName.equals("tr")) {
+ bodyContentsHandler.startTableRow();
+ } else if (localName.equals("numPr")) {
+ inNumPr = true;
+ } else if (localName.equals("rPr")) {
+ inRPr = true;
+ } else if (inR && inRPr && localName.equals("i")) {
+ //rprs don't have to be inR; ignore those that aren't
+ currRunProperties.setItalics(true);
+ } else if (inR && inRPr && localName.equals("b")) {
+ currRunProperties.setBold(true);
+ } else if (localName.equals("delText")) {
+ inDelText = true;
+ } else if (localName.equals("ins")) {
+ startEditedSection(editType.INSERT, atts);
+ } else if (localName.equals("del")) {
+ startEditedSection(editType.DELETE, atts);
+ } else if (localName.equals("moveTo")) {
+ startEditedSection(EditType.MOVE_TO, atts);
+ } else if (localName.equals("moveFrom")) {
+ startEditedSection(editType.MOVE_FROM, atts);
+ } else if (localName.equals("hyperlink")) {
+ String hyperlinkId = atts.getValue(OFFICE_DOC_RELATIONSHIP_NS, "id");
+ if (hyperlinkId != null) {
+ hyperlink = hyperlinks.get(hyperlinkId);
+ }
+ inHyperlink = true;
+ } else if (localName.equals("footnoteReference")) {
+ String id = atts.getValue(W_NS, "id");
+ bodyContentsHandler.footnoteReference(id);
+ } else if (localName.equals("endnoteReference")) {
+ String id = atts.getValue(W_NS, "id");
+ bodyContentsHandler.endnoteReference(id);
+ } /*else if (localName.equals("headerReference")) {
+ //TODO
+ } else if (localName.equals("footerReference")) {
+ //TODO
+ } else if (localName.equals("commentRangeEnd")) {
+ //TODO
+ }*/
+ }
+ }
+
+ private void startEditedSection(EditType editType, Attributes atts) {
+ String editAuthor = atts.getValue(W_NS, "author");
+ String editDateString = atts.getValue(W_NS, "date");
+ Date editDate = null;
+ if (editDateString != null) {
+ editDate = DateUtils.tryToParse(editDateString);
+ }
+ bodyContentsHandler.startEditedSection(editAuthor, editDate, editType);
+ this.editType = editType;
+ }
+
+ private int getIntVal(Attributes atts) {
+ String valString = atts.getValue(W_NS, "val");
+ if (valString != null) {
+ try {
+ return Integer.parseInt(valString);
+ } catch (NumberFormatException e) {
+ //swallow
+ }
+ }
+ return -1;
+ }
+
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ if (uri.equals(MC_NS)) {
+ if (localName.equals("Choice")) {
+ inACChoiceDepth--;
+ } else if (localName.equals("Fallback")) {
+ inACFallbackDepth--;
+ }
+ }
+ if (uri == null || uri.equals(W_NS)) {
+ if (inACChoiceDepth > 0) {
+ return;
+ }
+
+
+ if (localName.equals("r") && !inHyperlink) {
+ bodyContentsHandler.run(currRunProperties, runBuffer.toString());
+ inR = false;
+ runBuffer.setLength(0);
+ currRunProperties.setBold(false);
+ currRunProperties.setItalics(false);
+ } else if (localName.equals("p")) {
+ bodyContentsHandler.endParagraph();
+ pDepth--;
+ } else if (localName.equals("t")) {
+ inT = false;
+ } else if (localName.equals("tbl")) {
+ bodyContentsHandler.endTable();
+ } else if (localName.equals("tc")) {
+ bodyContentsHandler.endTableCell();
+ } else if (localName.equals("tr")) {
+ bodyContentsHandler.endTableRow();
+ } else if (localName.equals("rPr")) {
+ inRPr = false;
+ } else if (localName.equals("delText")) {
+ inDelText = false;
+ } else if (localName.equals("ins") || localName.equals("del") ||
+ localName.equals("moveTo") || localName.equals("moveFrom")) {
+ editType = EditType.NONE;
+ } else if (localName.equals("hyperlink")) {
+ if (hyperlink != null) {
+ bodyContentsHandler.hyperlinkRun(hyperlink, runBuffer.toString());
+ } else {
+ bodyContentsHandler.run(currRunProperties, runBuffer.toString());
+ }
+ runBuffer.setLength(0);
+ inHyperlink = false;
+ }
+ }
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+
+ if (inACChoiceDepth > 0) {
+ return;
+ }
+ if (editType.equals(EditType.MOVE_FROM) && inT) {
+ if (bodyContentsHandler.getIncludeMoveFromText()) {
+ runBuffer.append(ch, start, length);
+ }
+ } else if (inT) {
+ runBuffer.append(ch, start, length);
+ } else if (bodyContentsHandler.getIncludeDeletedText() && editType.equals(EditType.DELETE)) {
+ runBuffer.append(ch, start, length);
+ }
+ }
+
+ @Override
+ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+ if (inACChoiceDepth > 0) {
+ return;
+ }
+
+ if (inT) {
+ runBuffer.append(ch, start, length);
+ } else if (bodyContentsHandler.getIncludeDeletedText() && inDelText) {
+ runBuffer.append(ch, start, length);
+ }
+ }
+
+
+ public interface XWPFBodyContentsHandler {
+
+ void run(XWPFRunProperties runProperties, String contents);
+
+ void hyperlinkRun(String link, String text);
+
+ void startParagraph();
+
+ void endParagraph();
+
+ void startTable();
+
+ void endTable();
+
+ void startTableRow();
+
+ void endTableRow();
+
+ void startTableCell();
+
+ void endTableCell();
+
+ void startSDT();
+
+ void endSDT();
+
+ void startEditedSection(String editor, Date date, EditType editType);
+
+ void endEditedSection();
+
+ boolean getIncludeDeletedText();
+
+ void footnoteReference(String id);
+
+ void endnoteReference(String id);
+
+ boolean getIncludeMoveFromText();
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFEventBasedWordExtractor.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFEventBasedWordExtractor.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFEventBasedWordExtractor.java
new file mode 100644
index 0000000..06ef951
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFEventBasedWordExtractor.java
@@ -0,0 +1,353 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf;
+
+import javax.xml.parsers.ParserConfigurationException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.input.CloseShieldInputStream;
+import org.apache.poi.POIXMLDocument;
+import org.apache.poi.POIXMLProperties;
+import org.apache.poi.POIXMLTextExtractor;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
+import org.apache.poi.util.SAXHelper;
+import org.apache.poi.xwpf.usermodel.XWPFNumbering;
+import org.apache.poi.xwpf.usermodel.XWPFRelation;
+import org.apache.tika.parser.microsoft.ooxml.XWPFListManager;
+import org.apache.xmlbeans.XmlException;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.XMLReader;
+
+//TODO: move this into POI?
+/**
+ * Experimental class that is based on POI's XSSFEventBasedExcelExtractor
+ *
+ */
+public class XWPFEventBasedWordExtractor extends POIXMLTextExtractor {
+
+ private OPCPackage container;
+ private POIXMLProperties properties;
+
+ public XWPFEventBasedWordExtractor(String path) throws XmlException, OpenXML4JException, IOException {
+ this(OPCPackage.open(path));
+ }
+
+ public XWPFEventBasedWordExtractor(OPCPackage container) throws XmlException, OpenXML4JException, IOException {
+ super((POIXMLDocument) null);
+ this.container = container;
+ this.properties = new POIXMLProperties(container);
+ }
+
+
+ public static void main(String[] args) throws Exception {
+ if (args.length < 1) {
+ System.err.println("Use:");
+ System.err.println(" XWPFEventBasedWordExtractor <filename.xlsx>");
+ System.exit(1);
+ }
+
+ XWPFEventBasedWordExtractor extractor = new XWPFEventBasedWordExtractor(args[0]);
+ System.out.println(extractor.getText());
+ extractor.close();
+ }
+
+ public OPCPackage getPackage() {
+ return this.container;
+ }
+
+ public POIXMLProperties.CoreProperties getCoreProperties() {
+ return this.properties.getCoreProperties();
+ }
+
+ public POIXMLProperties.ExtendedProperties getExtendedProperties() {
+ return this.properties.getExtendedProperties();
+ }
+
+ public POIXMLProperties.CustomProperties getCustomProperties() {
+ return this.properties.getCustomProperties();
+ }
+
+
+ @Override
+ public String getText() {
+ StringBuilder sb = new StringBuilder();
+ //handle main document
+ List<PackagePart> pps = container.getPartsByContentType(XWPFRelation.DOCUMENT.getContentType());
+ if (pps != null) {
+ for (PackagePart pp : pps) {
+ //likely only one, but why not...
+ try {
+ handleDocumentPart(pp, sb);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (SAXException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ //handle glossary document
+ pps = container.getPartsByContentType(XWPFRelation.GLOSSARY_DOCUMENT.getContentType());
+
+ if (pps != null) {
+ for (PackagePart pp : pps) {
+ //likely only one, but why not...
+ try {
+ handleDocumentPart(pp, sb);
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (SAXException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ return sb.toString();
+ }
+
+
+ private void handleDocumentPart(PackagePart documentPart, StringBuilder sb) throws IOException, SAXException {
+ //load the numbering/list manager and styles from the main document part
+ XWPFNumbering numbering = loadNumbering(documentPart);
+ XWPFListManager xwpfListManager = new XWPFListManager(numbering);
+ //TODO: XWPFStyles styles = loadStyles(documentPart);
+
+ //headers
+ try {
+ PackageRelationshipCollection headersPRC = documentPart.getRelationshipsByType(XWPFRelation.HEADER.getRelation());
+ if (headersPRC != null) {
+ for (int i = 0; i < headersPRC.size(); i++) {
+ PackagePart header = documentPart.getRelatedPart(headersPRC.getRelationship(i));
+ handlePart(header, xwpfListManager, sb);
+ }
+ }
+ } catch (InvalidFormatException e) {
+ //swallow
+ }
+
+ //main document
+ handlePart(documentPart, xwpfListManager, sb);
+
+ //for now, just dump other components at end
+ for (XWPFRelation rel : new XWPFRelation[]{
+ XWPFRelation.FOOTNOTE,
+ XWPFRelation.COMMENT,
+ XWPFRelation.FOOTER,
+ XWPFRelation.ENDNOTE
+ }) {
+ try {
+ PackageRelationshipCollection prc = documentPart.getRelationshipsByType(rel.getRelation());
+ if (prc != null) {
+ for (int i = 0; i < prc.size(); i++) {
+ PackagePart packagePart = documentPart.getRelatedPart(prc.getRelationship(i));
+ handlePart(packagePart, xwpfListManager, sb);
+ }
+ }
+ } catch (InvalidFormatException e) {
+ //swallow
+ }
+ }
+ }
+
+ private void handlePart(PackagePart packagePart,
+ XWPFListManager xwpfListManager, StringBuilder buffer) throws IOException, SAXException {
+
+ Map<String, String> hyperlinks = loadHyperlinkRelationships(packagePart);
+ try (InputStream stream = packagePart.getInputStream()) {
+ XMLReader reader = SAXHelper.newXMLReader();
+ reader.setContentHandler(new XWPFDocumentXMLBodyHandler(
+ new XWPFToTextContentHandler(buffer), hyperlinks));
+ reader.parse(new InputSource(new CloseShieldInputStream(stream)));
+
+ } catch (ParserConfigurationException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private Map<String, String> loadHyperlinkRelationships(PackagePart bodyPart) {
+ Map<String, String> hyperlinks = new HashMap<>();
+ try {
+ PackageRelationshipCollection prc = bodyPart.getRelationshipsByType(XWPFRelation.HYPERLINK.getRelation());
+ for (int i = 0; i < prc.size(); i++) {
+ PackageRelationship pr = prc.getRelationship(i);
+ if (pr == null) {
+ continue;
+ }
+ String id = pr.getId();
+ String url = (pr.getTargetURI() == null) ? null : pr.getTargetURI().toString();
+ if (id != null && url != null) {
+ hyperlinks.put(id, url);
+ }
+ }
+ } catch (InvalidFormatException e) {
+ }
+ return hyperlinks;
+ }
+/*
+ private XWPFStyles loadStyles(PackagePart packagePart) {
+ try {
+ PackageRelationshipCollection stylesParts =
+ packagePart.getRelationshipsByType(XWPFRelation.STYLES.getRelation());
+ if (stylesParts.size() > 0) {
+ PackageRelationship stylesRelationShip = stylesParts.getRelationship(0);
+ if (stylesRelationShip == null) {
+ return null;
+ }
+ PackagePart stylesPart = opcPackage.getPart(stylesRelationShip);
+ if (stylesPart == null) {
+ return null;
+ }
+ return new XWPFStyles(stylesPart);
+ }
+ } catch (IOException|OpenXML4JException e) {
+ //swallow
+ }
+ return null;
+
+ }
+*/
+ private XWPFNumbering loadNumbering(PackagePart packagePart) {
+ try {
+ PackageRelationshipCollection numberingParts = packagePart.getRelationshipsByType(XWPFRelation.NUMBERING.getRelation());
+ if (numberingParts.size() > 0) {
+ PackageRelationship numberingRelationShip = numberingParts.getRelationship(0);
+ if (numberingRelationShip == null) {
+ return null;
+ }
+ PackagePart numberingPart = container.getPart(numberingRelationShip);
+ if (numberingPart == null) {
+ return null;
+ }
+ return new XWPFNumbering(numberingPart);
+ }
+ } catch (IOException | OpenXML4JException e) {
+ //swallow
+ }
+ return null;
+ }
+
+ private class XWPFToTextContentHandler implements XWPFDocumentXMLBodyHandler.XWPFBodyContentsHandler {
+ private final StringBuilder buffer;
+
+ public XWPFToTextContentHandler(StringBuilder buffer) {
+ this.buffer = buffer;
+ }
+
+ @Override
+ public void run(XWPFRunProperties runProperties, String contents) {
+ buffer.append(contents);
+ }
+
+ @Override
+ public void hyperlinkRun(String link, String text) {
+ buffer.append(" (").append(text).append(") ");
+ }
+
+ @Override
+ public void startParagraph() {
+ //no-op
+ }
+
+ @Override
+ public void endParagraph() {
+ buffer.append("\n");
+ }
+
+ @Override
+ public void startTable() {
+
+ }
+
+ @Override
+ public void endTable() {
+
+ }
+
+ @Override
+ public void startTableRow() {
+
+ }
+
+ @Override
+ public void endTableRow() {
+ buffer.append("\n");
+ }
+
+ @Override
+ public void startTableCell() {
+
+ }
+
+ @Override
+ public void endTableCell() {
+ buffer.append("\t");
+ }
+
+ @Override
+ public void startSDT() {
+
+ }
+
+ @Override
+ public void endSDT() {
+ buffer.append("\n");
+ }
+
+ @Override
+ public void startEditedSection(String editor, Date date, XWPFDocumentXMLBodyHandler.EditType editType) {
+
+ }
+
+ @Override
+ public void endEditedSection() {
+
+ }
+
+ @Override
+ public boolean getIncludeDeletedText() {
+ return true;
+ }
+
+ @Override
+ public void footnoteReference(String id) {
+
+ }
+
+ @Override
+ public void endnoteReference(String id) {
+
+ }
+
+ @Override
+ public boolean getIncludeMoveFromText() {
+ return false;
+ }
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFRunProperties.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFRunProperties.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFRunProperties.java
new file mode 100644
index 0000000..ad2d656
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFRunProperties.java
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf;
+
+/**
+ * WARNING: This class is mutable. Make a copy of it
+ * if you want persistence!
+ */
+
+class XWPFRunProperties {
+ boolean italics = false;
+ boolean bold = false;
+
+ public boolean getItalics() {
+ return italics;
+ }
+
+ public boolean getBold() {
+ return bold;
+ }
+
+ public void setItalics(boolean italics) {
+ this.italics = italics;
+ }
+
+ public void setBold(boolean bold) {
+ this.bold = bold;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFTikaBodyPartHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFTikaBodyPartHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFTikaBodyPartHandler.java
new file mode 100644
index 0000000..2f27739
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/XWPFTikaBodyPartHandler.java
@@ -0,0 +1,224 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf;
+
+
+import java.util.Date;
+
+import org.apache.tika.parser.microsoft.OfficeParserConfig;
+import org.apache.tika.parser.microsoft.ooxml.XWPFListManager;
+import org.apache.tika.sax.XHTMLContentHandler;
+import org.xml.sax.SAXException;
+
+public class XWPFTikaBodyPartHandler implements XWPFDocumentXMLBodyHandler.XWPFBodyContentsHandler {
+
+ private final static char[] NEWLINE = new char[]{'\n'};
+ private final static char[] TAB = new char[]{'\t'};
+
+ private final XHTMLContentHandler xhtml;
+ private final XWPFListManager listManager;
+ private final boolean includeDeletedText;
+ private final boolean includeMoveFromText;
+
+ private int pDepth = 0; //paragraph depth
+ private boolean isItalics = false;
+ private boolean isBold = false;
+
+ public XWPFTikaBodyPartHandler(XHTMLContentHandler xhtml, XWPFListManager listManager, OfficeParserConfig parserConfig) {
+ this.xhtml = xhtml;
+ this.listManager = listManager;
+ this.includeDeletedText = parserConfig.getIncludeDeletedContent();
+ this.includeMoveFromText = parserConfig.getIncludeMoveFromContent();
+ }
+
+ @Override
+ public void run(XWPFRunProperties runProperties, String contents) {
+ //TODO: smooth out bold/italics to handle only changes
+ //If two runs are bold, only add <b> at beginning and end of the run pair
+ try {
+ if (runProperties.getBold()) {
+ xhtml.startElement("b");
+ }
+ if (runProperties.getItalics()) {
+ xhtml.startElement("i");
+ }
+
+ xhtml.characters(contents);
+ if (runProperties.getItalics()) {
+ xhtml.endElement("i");
+ }
+ if (runProperties.getBold()) {
+ xhtml.endElement("b");
+ }
+ } catch (SAXException e) {
+
+ }
+ }
+
+ @Override
+ public void hyperlinkRun(String link, String text) {
+ //System.out.println("tika handler: "+link + " :: "+text);
+ try {
+ if (link != null) {
+ xhtml.startElement("a", "href", link);
+ }
+ xhtml.characters(text);
+ if (link != null) {
+ xhtml.endElement("a");
+ }
+ } catch (SAXException e) {
+
+ }
+ }
+
+ @Override
+ public void startParagraph() {
+ if (pDepth == 0) {
+ try {
+ xhtml.startElement("p");
+ } catch (SAXException e) {
+
+ }
+ }
+ pDepth++;
+ }
+
+ @Override
+ public void endParagraph() {
+ try {
+ if (pDepth == 1) {
+ xhtml.endElement("p");
+ } else {
+ xhtml.characters(NEWLINE, 0, 1);
+ }
+ } catch (SAXException e) {
+
+ }
+ pDepth--;
+ }
+
+ @Override
+ public void startTable() {
+ try {
+ xhtml.startElement("table");
+ } catch (SAXException e) {
+
+ }
+ }
+
+ @Override
+ public void endTable() {
+ try {
+ xhtml.endElement("table");
+ } catch (SAXException e) {
+
+ }
+ }
+
+ @Override
+ public void startTableRow() {
+ try {
+ xhtml.startElement("tr");
+ } catch (SAXException e) {
+
+ }
+ }
+
+ @Override
+ public void endTableRow() {
+ try {
+ xhtml.endElement("tr");
+ } catch (SAXException e) {
+
+ }
+ }
+
+ @Override
+ public void startTableCell() {
+ try {
+ xhtml.startElement("td");
+ } catch (SAXException e) {
+
+ }
+ }
+
+ @Override
+ public void endTableCell() {
+ try {
+ xhtml.endElement("td");
+ } catch (SAXException e) {
+
+ }
+ }
+
+ @Override
+ public void startSDT() {
+ //no-op
+ }
+
+ @Override
+ public void endSDT() {
+ //no-op
+ }
+
+ @Override
+ public void startEditedSection(String editor, Date date, XWPFDocumentXMLBodyHandler.EditType editType) {
+ //no-op
+ }
+
+ @Override
+ public void endEditedSection() {
+ //no-op
+ }
+
+ @Override
+ public boolean getIncludeDeletedText() {
+ return includeDeletedText;
+ }
+
+ @Override
+ public void footnoteReference(String id) {
+ if (id != null) {
+ try {
+ xhtml.characters("[");
+ xhtml.characters(id);
+ xhtml.characters("]");
+ } catch (SAXException e) {
+
+ }
+ }
+ }
+
+ @Override
+ public void endnoteReference(String id) {
+ if (id != null) {
+ try {
+ xhtml.characters("[");
+ xhtml.characters(id);
+ xhtml.characters("]");
+ } catch (SAXException e) {
+
+ }
+ }
+ }
+
+ @Override
+ public boolean getIncludeMoveFromText() {
+ return includeMoveFromText;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/AbstractPartHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/AbstractPartHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/AbstractPartHandler.java
new file mode 100644
index 0000000..9aa5471
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/AbstractPartHandler.java
@@ -0,0 +1,43 @@
+/*
+ * 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.
+ */
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+import org.apache.tika.exception.TikaException;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+abstract class AbstractPartHandler extends DefaultHandler implements PartHandler {
+
+ private String name;
+
+ public abstract String getContentType();
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Override this to flush buffers, etc if necessary
+ */
+ public void endPart() throws SAXException, TikaException {
+ //no-op
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/BinaryDataHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/BinaryDataHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/BinaryDataHandler.java
new file mode 100644
index 0000000..4a13799
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/BinaryDataHandler.java
@@ -0,0 +1,120 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.apache.commons.codec.binary.Base64;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.extractor.EmbeddedDocumentExtractor;
+import org.apache.tika.extractor.EmbeddedDocumentUtil;
+import org.apache.tika.io.TikaInputStream;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.sax.XHTMLContentHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+class BinaryDataHandler extends AbstractPartHandler {
+
+ private final XHTMLContentHandler handler;
+ private final Metadata metadata;
+ private final ParseContext parseContext;
+
+ private boolean inBinaryData = false;
+ private StringBuilder buffer = new StringBuilder();
+
+ final Base64 base64 = new Base64();
+
+
+ public BinaryDataHandler(XHTMLContentHandler handler, Metadata metadata, ParseContext context) {
+ this.handler = handler;
+ this.metadata = metadata;
+ this.parseContext = context;
+ }
+
+
+ @Override
+ public void startDocument() throws SAXException {
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+
+ }
+
+ @Override
+ public void endPart() throws SAXException, TikaException {
+ if (hasData()) {
+ EmbeddedDocumentExtractor embeddedDocumentExtractor =
+ EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(parseContext);
+ Metadata embeddedMetadata = new Metadata();
+ try (TikaInputStream stream = TikaInputStream.get(getInputStream())) {
+ embeddedDocumentExtractor.parseEmbedded(stream, handler, embeddedMetadata, false);
+ } catch (IOException e) {
+ throw new TikaException("error in finishing part", e);
+ }
+ buffer.setLength(0);
+ }
+
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+
+ if (uri.equals(Word2006MLDocHandler.PKG_NS) && localName.equals("binaryData")) {
+ inBinaryData = true;
+ }
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ if (uri.equals(Word2006MLDocHandler.PKG_NS) && localName.equals("binaryData")) {
+ inBinaryData = false;
+ }
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ if (inBinaryData) {
+ buffer.append(ch, start, length);
+ }
+ }
+
+ @Override
+ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+
+ }
+
+ @Override
+ public String getContentType() {
+ return "";
+ }
+
+ boolean hasData() {
+ return buffer.length() > 0;
+ }
+
+ private InputStream getInputStream() {
+ byte[] bytes = base64.decode(buffer.toString());
+ return new ByteArrayInputStream(bytes);
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/BodyPartHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/BodyPartHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/BodyPartHandler.java
new file mode 100644
index 0000000..4d04b2b
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/BodyPartHandler.java
@@ -0,0 +1,64 @@
+/*
+ * 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.
+ */
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+import java.util.HashMap;
+
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.parser.microsoft.OfficeParserConfig;
+import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFDocumentXMLBodyHandler;
+import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFTikaBodyPartHandler;
+import org.apache.tika.sax.XHTMLContentHandler;
+import org.xml.sax.SAXException;
+
+
+/**
+ * Simple wrapper/extension of XWPFDocumentXMLBodyHandler to fit
+ * into the inline parsing scheme.
+ */
+class BodyPartHandler extends XWPFDocumentXMLBodyHandler implements PartHandler {
+
+ private final String contentType;
+ private String name;
+ public BodyPartHandler(String contentType, XHTMLContentHandler xhtml,
+ RelationshipsManager relationshipsManager,
+ OfficeParserConfig officeParserConfig) {
+ super(new XWPFTikaBodyPartHandler(xhtml, null, officeParserConfig),
+ new HashMap<String, String>());
+ this.contentType = contentType;
+ }
+
+ @Override
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String getContentType() {
+ return contentType;
+ }
+
+ @Override
+ public void endPart() throws SAXException, TikaException {
+ //no-op
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/CorePropertiesHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/CorePropertiesHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/CorePropertiesHandler.java
new file mode 100644
index 0000000..c746e5c
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/CorePropertiesHandler.java
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.poi.openxml4j.opc.ContentTypes;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.OfficeOpenXMLCore;
+import org.apache.tika.metadata.Property;
+import org.apache.tika.metadata.TikaCoreProperties;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+class CorePropertiesHandler extends AbstractPartHandler {
+
+ final static String DC_NS = "http://purl.org/dc/elements/1.1";
+ final static String DC_TERMS_NS = "http://purl.org/dc/terms";
+ final static String CP_NS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
+
+ private final Metadata metadata;
+
+ final StringBuilder buffer = new StringBuilder();
+ final Map<String, Map<String, Property>> properties = new HashMap<>();
+
+ public CorePropertiesHandler(Metadata metadata) {
+ this.metadata = metadata;
+ addProperties();
+ }
+
+ void addProperties() {
+ Map<String, Property> dc = properties.get(DC_NS);
+ if (dc == null) {
+ dc = new HashMap<>();
+ }
+ dc.put("creator", TikaCoreProperties.CREATOR);
+ dc.put("title", TikaCoreProperties.TITLE);
+ dc.put("description", TikaCoreProperties.DESCRIPTION);
+ properties.put(DC_NS, dc);
+
+ Map<String, Property> dcTerms = properties.get(DC_TERMS_NS);
+ if (dcTerms == null) {
+ dcTerms = new HashMap<>();
+ }
+ dcTerms.put("created", TikaCoreProperties.CREATED);
+ dcTerms.put("modified", TikaCoreProperties.MODIFIED);
+
+ properties.put(DC_TERMS_NS, dcTerms);
+
+ Map<String, Property> cp = properties.get(CP_NS);
+ if (cp == null) {
+ cp = new HashMap<>();
+ }
+ cp.put("category", OfficeOpenXMLCore.CATEGORY);
+ cp.put("contentStatus", OfficeOpenXMLCore.CONTENT_STATUS);
+ cp.put("lastModifiedBy", TikaCoreProperties.MODIFIER);
+ cp.put("lastPrinted", OfficeOpenXMLCore.LAST_PRINTED);
+ cp.put("revision", OfficeOpenXMLCore.REVISION);
+ cp.put("subject", OfficeOpenXMLCore.SUBJECT);
+ cp.put("version", OfficeOpenXMLCore.VERSION);
+ properties.put(CP_NS, cp);
+ }
+
+ @Override
+ public void startDocument() throws SAXException {
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+ buffer.setLength(0);
+ }
+
+ @Override
+ public void startPrefixMapping(String prefix, String uri) throws SAXException {
+ }
+
+ @Override
+ public void endPrefixMapping(String prefix) throws SAXException {
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ Property prop = getProperty(uri, localName);
+ if (prop != null) {
+
+ if (prop.isMultiValuePermitted()) {
+ metadata.add(prop, buffer.toString());
+ } else {
+ metadata.set(prop, buffer.toString());
+ }
+ }
+ buffer.setLength(0);
+
+ }
+
+ private Property getProperty(String uri, String localName) {
+ if (uri.endsWith("/")) {
+ uri = uri.substring(0, uri.length()-1);
+ }
+
+ Map<String, Property> m = properties.get(uri);
+ if (m != null) {
+ return m.get(localName);
+ }
+ return null;
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ buffer.append(ch, start, length);
+ }
+
+ @Override
+ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+ buffer.append(ch, start, length);
+ }
+
+ @Override
+ public String getContentType() {
+ return ContentTypes.CORE_PROPERTIES_PART;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/ExtendedPropertiesHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/ExtendedPropertiesHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/ExtendedPropertiesHandler.java
new file mode 100644
index 0000000..74238a6
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/ExtendedPropertiesHandler.java
@@ -0,0 +1,67 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.Office;
+import org.apache.tika.metadata.OfficeOpenXMLExtended;
+import org.apache.tika.metadata.Property;
+
+class ExtendedPropertiesHandler extends CorePropertiesHandler {
+
+ final static String EP_NS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties";
+
+ public ExtendedPropertiesHandler(Metadata metadata) {
+ super(metadata);
+ }
+
+ @Override
+ void addProperties() {
+ Map<String, Property> ep = properties.get(EP_NS);
+ if (ep == null) {
+ ep = new HashMap<>();
+ }
+ ep.put("AppVersion", OfficeOpenXMLExtended.APP_VERSION);
+ ep.put("Application", OfficeOpenXMLExtended.APPLICATION);
+ ep.put("Comments", OfficeOpenXMLExtended.COMMENTS);
+ ep.put("Company", OfficeOpenXMLExtended.COMPANY);
+ ep.put("DocSecurity", OfficeOpenXMLExtended.DOC_SECURITY);
+ ep.put("HiddenSlides", OfficeOpenXMLExtended.HIDDEN_SLIDES);
+ ep.put("Manager", OfficeOpenXMLExtended.MANAGER);
+ ep.put("Notes", OfficeOpenXMLExtended.NOTES);
+ ep.put("PresentationFormat", OfficeOpenXMLExtended.PRESENTATION_FORMAT);
+ ep.put("Template", OfficeOpenXMLExtended.TEMPLATE);
+ ep.put("TotalTime", OfficeOpenXMLExtended.TOTAL_TIME);
+ ep.put("Pages", Office.PAGE_COUNT);
+ ep.put("Words", Office.WORD_COUNT);
+ ep.put("Characters", Office.CHARACTER_COUNT);
+ ep.put("CharactersWithSpaces", Office.CHARACTER_COUNT_WITH_SPACES);
+ ep.put("Paragraphs", Office.PARAGRAPH_COUNT);
+ ep.put("Lines", Office.LINE_COUNT);
+ properties.put(EP_NS, ep);
+ }
+
+ @Override
+ public String getContentType() {
+ return "application/vnd.openxmlformats-officedocument.extended-properties+xml";
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/PartHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/PartHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/PartHandler.java
new file mode 100644
index 0000000..fee64de
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/PartHandler.java
@@ -0,0 +1,34 @@
+/*
+ * 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.
+ */
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+import org.apache.tika.exception.TikaException;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+interface PartHandler extends ContentHandler {
+ void setName(String name);
+
+ String getName();
+
+ String getContentType();
+
+ /**
+ * Override this to flush buffers, etc if necessary
+ */
+ void endPart() throws SAXException, TikaException;
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Relationship.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Relationship.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Relationship.java
new file mode 100644
index 0000000..eccb1bf
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Relationship.java
@@ -0,0 +1,52 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+
+import org.apache.poi.openxml4j.opc.TargetMode;
+
+class Relationship {
+
+ private final String contentType;
+
+ private final String target;
+
+ private final TargetMode targetMode;
+
+ public Relationship(String contentType, String target) {
+ this(contentType, target, null);
+ }
+
+ public Relationship(String contentType, String target, TargetMode targetMode) {
+ this.contentType = contentType;
+ this.target = target;
+ this.targetMode = targetMode;
+ }
+
+ public String getContentType() {
+ return contentType;
+ }
+
+ public String getTarget() {
+ return target;
+ }
+
+ public TargetMode getTargetMode() {
+ return targetMode;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/RelationshipsHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/RelationshipsHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/RelationshipsHandler.java
new file mode 100644
index 0000000..670ffab
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/RelationshipsHandler.java
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+
+import org.apache.poi.openxml4j.opc.ContentTypes;
+import org.apache.poi.openxml4j.opc.TargetMode;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+class RelationshipsHandler extends AbstractPartHandler {
+
+ final static String REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships";
+
+ private final RelationshipsManager relationshipsManager;
+
+ public RelationshipsHandler(RelationshipsManager relationshipsManager) {
+ this.relationshipsManager = relationshipsManager;
+ }
+
+
+ @Override
+ public void startDocument() throws SAXException {
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+ }
+
+ @Override
+ public void startPrefixMapping(String prefix, String uri) throws SAXException {
+ }
+
+ @Override
+ public void endPrefixMapping(String prefix) throws SAXException {
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+ if (uri.equals(REL_NS)) {
+ if (localName.equals("Relationship")) {
+ String id = atts.getValue("", "Id");
+ String type = atts.getValue("", "Type");
+ String target = atts.getValue("", "Target");
+ String targetModeString = atts.getValue("", "TargetMode");
+ TargetMode targetMode = "EXTERNAL".equals(targetModeString)? TargetMode.EXTERNAL :
+ TargetMode.INTERNAL;
+ relationshipsManager.addRelationship(getName(), id, type, target, targetMode);
+ }
+ }
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ }
+
+ @Override
+ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+
+ }
+
+ @Override
+ public String getContentType() {
+ return ContentTypes.RELATIONSHIPS_PART;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/RelationshipsManager.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/RelationshipsManager.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/RelationshipsManager.java
new file mode 100644
index 0000000..5773fbb
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/RelationshipsManager.java
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.poi.openxml4j.opc.TargetMode;
+
+class RelationshipsManager {
+
+ Map<String, Map<String, Relationship>> map = new HashMap<>();
+
+ public void addRelationship(String relsFileName, String id, String type, String target, TargetMode targetMode) {
+ String packageName = convertRelsFileNameToPackageName(relsFileName);
+ Map<String, Relationship> thisPackageRels = map.get(packageName);
+ if (thisPackageRels == null) {
+ thisPackageRels = new HashMap<>();
+ }
+ thisPackageRels.put(id, new Relationship(type, target, targetMode));
+ map.put(packageName, thisPackageRels);
+ }
+
+ public Relationship getRelationship(String packageName, String id) {
+ Map<String, Relationship> thisPackageRels = map.get(packageName);
+ if (thisPackageRels != null) {
+ return thisPackageRels.get(id);
+ }
+ return null;
+ }
+
+ private String convertRelsFileNameToPackageName(String relsFileName) {
+ if ("/_rels/.rels".equals(relsFileName)) {
+ return "/";
+ }
+
+ String tmp = relsFileName;
+ tmp = tmp.replaceFirst("\\/_rels\\/", "/");
+ tmp = tmp.replaceFirst(".rels\\Z", "");
+ return tmp;
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLDocHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLDocHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLDocHandler.java
new file mode 100644
index 0000000..4276671
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLDocHandler.java
@@ -0,0 +1,171 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.poi.xwpf.usermodel.XWPFRelation;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.microsoft.OfficeParserConfig;
+import org.apache.tika.sax.XHTMLContentHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+class Word2006MLDocHandler extends DefaultHandler {
+
+ final static String PKG_NS = "http://schemas.microsoft.com/office/2006/xmlPackage";
+
+
+ private final XHTMLContentHandler xhtml;
+ private final Metadata metadata;
+ private final ParseContext parseContext;
+
+ private final Map<String, PartHandler> partHandlers = new HashMap<>();
+ private final BinaryDataHandler binaryDataHandler;
+ private final RelationshipsManager relationshipsManager = new RelationshipsManager();
+ private PartHandler currentPartHandler = null;
+
+ public Word2006MLDocHandler(XHTMLContentHandler xhtml, Metadata metadata,
+ ParseContext context) {
+ this.xhtml = xhtml;
+ this.metadata = metadata;
+ this.parseContext = context;
+ OfficeParserConfig officeParserConfig = context.get(OfficeParserConfig.class);
+
+ addPartHandler(new RelationshipsHandler(relationshipsManager));
+
+ addPartHandler(new BodyPartHandler(
+ XWPFRelation.DOCUMENT.getContentType(),
+ xhtml, relationshipsManager, officeParserConfig));
+
+ addPartHandler(new BodyPartHandler(
+ XWPFRelation.FOOTNOTE.getContentType(),
+ xhtml, relationshipsManager, officeParserConfig));
+
+ addPartHandler(new BodyPartHandler(
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml",
+ xhtml, relationshipsManager, officeParserConfig));
+
+ addPartHandler(new BodyPartHandler(
+ XWPFRelation.HEADER.getContentType(),
+ xhtml, relationshipsManager, officeParserConfig));
+
+ addPartHandler(new BodyPartHandler(
+ XWPFRelation.FOOTER.getContentType(),
+ xhtml, relationshipsManager, officeParserConfig));
+
+ addPartHandler(new BodyPartHandler(
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml",
+ xhtml, relationshipsManager, officeParserConfig));
+
+
+ addPartHandler(new BodyPartHandler(
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml",
+ xhtml, relationshipsManager, officeParserConfig));
+
+ addPartHandler(new BodyPartHandler(
+ "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml",
+ xhtml, relationshipsManager, officeParserConfig));
+
+ addPartHandler(new CorePropertiesHandler(metadata));
+ addPartHandler(new ExtendedPropertiesHandler(metadata));
+ binaryDataHandler = new BinaryDataHandler(xhtml, metadata, context);
+ }
+
+ private void addPartHandler(PartHandler partHandler) {
+ partHandlers.put(partHandler.getContentType(), partHandler);
+ }
+
+
+ @Override
+ public void startDocument() throws SAXException {
+ }
+
+ @Override
+ public void endDocument() throws SAXException {
+ }
+
+ @Override
+ public void startPrefixMapping(String prefix, String uri) throws SAXException {
+ }
+
+ @Override
+ public void endPrefixMapping(String prefix) throws SAXException {
+
+ }
+
+ @Override
+ public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
+ if (uri.equals(PKG_NS) && localName.equals("part")) {
+ //start of a package
+ String name = atts.getValue(PKG_NS, "name");
+ String contentType = atts.getValue(PKG_NS, "contentType");
+ currentPartHandler = partHandlers.get(contentType);
+ //for now treat every unknown part type
+ //as if it contained binary data
+ if (currentPartHandler == null) {
+ currentPartHandler = binaryDataHandler;
+ }
+ if (currentPartHandler != null) {
+ currentPartHandler.setName(name);
+ }
+ } else if (currentPartHandler != null) {
+ currentPartHandler.startElement(uri, localName, qName, atts);
+ }
+
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qName) throws SAXException {
+ if (uri.equals(PKG_NS) && localName.equals("part")) {
+ //do post processing
+ if (currentPartHandler != null) {
+ try {
+ currentPartHandler.endPart();
+ } catch (TikaException e) {
+ throw new SAXException(e);
+ }
+ }
+ //then reset
+ currentPartHandler = null;
+ } else if (currentPartHandler != null) {
+ currentPartHandler.endElement(uri, localName, qName);
+ }
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int length) throws SAXException {
+ if (currentPartHandler != null) {
+ currentPartHandler.characters(ch, start, length);
+ }
+ }
+
+ @Override
+ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
+ if (currentPartHandler != null) {
+ currentPartHandler.characters(ch, start, length);
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParser.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParser.java
new file mode 100644
index 0000000..ff8a43d
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ml2006/Word2006MLParser.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collections;
+import java.util.Set;
+
+import org.apache.commons.io.input.CloseShieldInputStream;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.mime.MediaType;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.microsoft.AbstractOfficeParser;
+import org.apache.tika.sax.EmbeddedContentHandler;
+import org.apache.tika.sax.OfflineContentHandler;
+import org.apache.tika.sax.XHTMLContentHandler;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+
+public class Word2006MLParser extends AbstractOfficeParser {
+
+ protected static final Set<MediaType> SUPPORTED_TYPES = Collections.singleton(
+ MediaType.application("vnd.ms-word2006ml"));
+
+ @Override
+ public Set<MediaType> getSupportedTypes(ParseContext context) {
+ return SUPPORTED_TYPES;
+ }
+
+ @Override
+ public void parse(InputStream stream, ContentHandler handler,
+ Metadata metadata, ParseContext context) throws IOException, SAXException, TikaException {
+ //set OfficeParserConfig if the user hasn't specified one
+ configure(context);
+
+ final XHTMLContentHandler xhtml =
+ new XHTMLContentHandler(handler, metadata);
+
+ xhtml.startDocument();
+
+ try {
+ context.getSAXParser().parse(
+ new CloseShieldInputStream(stream),
+ new OfflineContentHandler(new EmbeddedContentHandler(
+ new Word2006MLDocHandler(xhtml, metadata, context))));
+ } catch (SAXException e) {
+ throw new TikaException("XML parse error", e);
+ } finally {
+ xhtml.endDocument();
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/resources/META-INF/services/org.apache.tika.parser.Parser b/tika-parsers/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
index fcd5840..4d6e6d4 100644
--- a/tika-parsers/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
+++ b/tika-parsers/src/main/resources/META-INF/services/org.apache.tika.parser.Parser
@@ -42,7 +42,7 @@ org.apache.tika.parser.microsoft.OfficeParser
org.apache.tika.parser.microsoft.OldExcelParser
org.apache.tika.parser.microsoft.TNEFParser
org.apache.tika.parser.microsoft.ooxml.OOXMLParser
-org.apache.tika.parser.microsoft.ooxml.xwpf.Word2006MLParser
+org.apache.tika.parser.microsoft.ooxml.xwpf.ml2006.Word2006MLParser
org.apache.tika.parser.microsoft.xml.WordMLParser
org.apache.tika.parser.microsoft.xml.SpreadsheetMLParser
org.apache.tika.parser.mp3.Mp3Parser
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParserTest.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParserTest.java b/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParserTest.java
index 5e0fc1e..bfbd8ce 100644
--- a/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParserTest.java
+++ b/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParserTest.java
@@ -25,10 +25,12 @@ import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.StringWriter;
import java.util.Arrays;
+import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
@@ -44,10 +46,12 @@ import org.apache.tika.metadata.OfficeOpenXMLExtended;
import org.apache.tika.metadata.TikaCoreProperties;
import org.apache.tika.metadata.TikaMetadataKeys;
import org.apache.tika.parser.AutoDetectParser;
+import org.apache.tika.parser.EmptyParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.Parser;
import org.apache.tika.parser.PasswordProvider;
import org.apache.tika.parser.RecursiveParserWrapper;
+import org.apache.tika.parser.microsoft.OfficeParserConfig;
import org.apache.tika.parser.microsoft.WordParserTest;
import org.apache.tika.sax.BodyContentHandler;
import org.junit.Ignore;
@@ -1299,6 +1303,33 @@ public class OOXMLParserTest extends TikaTest {
assertContainsAtLeast(minExpected, getRecursiveMetadata("testEXCEL_macro.xlsm"));
}
+ //@Test //use this for lightweight benchmarking to compare xwpf options
+ public void testBatch() throws Exception {
+ OfficeParserConfig officeParserConfig = new OfficeParserConfig();
+ officeParserConfig.setUseSAXDocxExtractor(true);
+ long started = new Date().getTime();
+ int ex = 0;
+ for (int i = 0; i < 100; i++) {
+ for (File f : getResourceAsFile("/test-documents").listFiles()) {
+ if (!f.getName().endsWith(".docx")) {
+ continue;
+ }
+ try (InputStream is = TikaInputStream.get(f)) {
+ ParseContext parseContext = new ParseContext();
+ parseContext.set(OfficeParserConfig.class, officeParserConfig);
+ //test only the extraction of the main docx content, not embedded docs
+ parseContext.set(Parser.class, new EmptyParser());
+ Metadata metadata = new Metadata();
+ XMLResult r = getXML(is, parser, metadata, parseContext);
+ } catch (Exception e) {
+ ex++;
+
+ }
+ }
+ }
+ System.out.println("elapsed: "+(new Date().getTime()-started) + " with " + ex + " exceptions");
+ }
+
}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/SXWPFExtractorTest.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/SXWPFExtractorTest.java b/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/SXWPFExtractorTest.java
new file mode 100644
index 0000000..f5512cb
--- /dev/null
+++ b/tika-parsers/src/test/java/org/apache/tika/parser/microsoft/ooxml/xwpf/SXWPFExtractorTest.java
@@ -0,0 +1,187 @@
+/*
+ * 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.
+ */
+
+package org.apache.tika.parser.microsoft.ooxml.xwpf;
+
+import static org.junit.Assert.assertEquals;
+
+import java.util.List;
+
+import org.apache.tika.TikaTest;
+import org.apache.tika.metadata.Metadata;
+import org.apache.tika.metadata.Office;
+import org.apache.tika.metadata.OfficeOpenXMLCore;
+import org.apache.tika.metadata.OfficeOpenXMLExtended;
+import org.apache.tika.metadata.TikaCoreProperties;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.RecursiveParserWrapper;
+import org.apache.tika.parser.microsoft.OfficeParserConfig;
+import org.junit.Test;
+
+
+public class SXWPFExtractorTest extends TikaTest {
+
+ @Test
+ public void basicTest() throws Exception {
+ ParseContext pc = new ParseContext();
+ OfficeParserConfig officeParserConfig = new OfficeParserConfig();
+ officeParserConfig.setUseSAXDocxExtractor(true);
+
+ pc.set(OfficeParserConfig.class, officeParserConfig);
+ List<Metadata> metadataList = getRecursiveMetadata("testWORD_2006ml.docx", pc);
+
+ assertEquals(8, metadataList.size());
+ Metadata m = metadataList.get(0);
+
+ assertEquals("2016-11-29T00:58:00Z", m.get(TikaCoreProperties.CREATED));
+ assertEquals("2016-11-29T17:54:00Z", m.get(TikaCoreProperties.MODIFIED));
+ assertEquals("My Document Title", m.get(TikaCoreProperties.TITLE));
+ assertEquals("This is the Author", m.get(TikaCoreProperties.CREATOR));
+ assertEquals("3", m.get(OfficeOpenXMLCore.REVISION));
+ assertEquals("Allison, Timothy B.", m.get(TikaCoreProperties.MODIFIER));
+ //assertEquals("0", m.get(OfficeOpenXMLExtended.DOC_SECURITY));
+ assertEquals("260", m.get(Office.WORD_COUNT));
+ assertEquals("3", m.get(Office.PARAGRAPH_COUNT));
+ assertEquals("1742", m.get(Office.CHARACTER_COUNT_WITH_SPACES));
+ assertEquals("12", m.get(Office.LINE_COUNT));
+ assertEquals("16.0000", m.get(OfficeOpenXMLExtended.APP_VERSION));
+
+
+ String content = m.get(RecursiveParserWrapper.TIKA_CONTENT);
+
+
+ assertContainsCountTimes("engaging title page", content, 1);
+ assertContainsCountTimes("This is the Author", content, 1);
+ assertContainsCountTimes("This is an engaging title page", content, 1);
+
+ assertContains("My Document Title", content);
+ assertContains("My Document Subtitle", content);
+
+ assertContains("<p>\tHeading1\t3</p>", content);
+
+
+ //TODO: integrate numbering
+ assertContains("Really basic 2.", content);
+
+ assertContainsCountTimes("This is a text box", content, 1);
+
+ assertContains("<p>This is a hyperlink: <a href=\"http://tika.apache.org\">tika</a></p>", content);
+
+ assertContains("<p>This is a link to a local file: <a href=\"file:///C:/data/test.png\">test.png</a></p>", content);
+
+ assertContains("<p>This is 10 spaces</p>", content);
+
+ //caption
+ assertContains("<p>Table 1: Table1 Caption</p>", content);
+
+ //embedded table
+ //TODO: figure out how to handle embedded tables in html
+ assertContains("<p>Embedded table r1c1</p>", content);
+
+ //shape
+ assertContainsCountTimes("<p>This is text within a shape", content, 1);
+
+ //sdt rich text
+ assertContains("<p>Rich text content control", content);
+
+ //sdt simple text
+ assertContains("<p>Simple text content control", content);
+
+ //sdt repeating
+ assertContains("Repeating content", content);
+
+ //sdt dropdown
+ //TODO: get options for dropdown
+ assertContains("Drop down1", content);
+
+ //sdt date
+ assertContains("<p>11/16/2016</p>", content);
+
+ //test that <tab/> works
+ assertContains("tab\ttab", content);
+
+ assertContainsCountTimes("serious word art", content, 1);
+ assertContainsCountTimes("Wordartr1c1", content, 1);
+
+ //glossary document contents
+ assertContains("Click or tap to enter a date", content);
+
+ //basic formatting
+ assertContains("<p>The <i>quick</i> brown <b>fox </b>j<i>um</i><b><i>ped</i></b> over",
+ content);
+
+ //TODO: add chart parsing
+// assertContains("This is the chart", content);
+
+ assertContains("This is a comment", content);
+
+ assertContains("This is an endnote", content);
+
+ assertContains("this is the footnote", content);
+
+ assertContains("First page header", content);
+
+ assertContains("Even page header", content);
+
+ assertContains("Odd page header", content);
+
+ assertContains("First page footer", content);
+
+ assertContains("Even page footer", content);
+
+ assertContains("Odd page footer", content);
+
+ //test default includes deleted
+ assertContains("frog", content);
+
+ assertContains("Mattmann", content);
+
+ //TODO: extract chart text
+// assertContains("This is the chart title", content);
+
+ }
+
+ @Test
+ public void testSkipDeleted() throws Exception {
+ ParseContext pc = new ParseContext();
+ OfficeParserConfig officeParserConfig = new OfficeParserConfig();
+ officeParserConfig.setIncludeDeletedContent(false);
+ officeParserConfig.setUseSAXDocxExtractor(true);
+ officeParserConfig.setIncludeMoveFromContent(true);
+ pc.set(OfficeParserConfig.class, officeParserConfig);
+
+ XMLResult r = getXML("testWORD_2006ml.docx", pc);
+ assertNotContained("frog", r.xml);
+ assertContainsCount("Second paragraph", r.xml, 2);
+
+ }
+
+ private void assertContainsCountTimes(String needle, String haystack, int expectedCount) {
+ int i = haystack.indexOf("engaging title page");
+ int cnt = 0;
+ while (i > -1) {
+ cnt++;
+ i = haystack.indexOf("engaging title page", i+1);
+ }
+ assertEquals("found needle >"+ needle+"<"+cnt+" times instead of expected: "+expectedCount,
+ expectedCount, cnt);
+
+ }
+
+
+
+}
[3/6] tika git commit: TIKA-1321 -- add SAX based docx parser and
integrate it with the recent 2006ml parser work -- initial commit
Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/test/resources/test-documents/testWORD_2003ml.xml
----------------------------------------------------------------------
diff --git a/tika-parsers/src/test/resources/test-documents/testWORD_2003ml.xml b/tika-parsers/src/test/resources/test-documents/testWORD_2003ml.xml
index e6735db..741273f 100644
--- a/tika-parsers/src/test/resources/test-documents/testWORD_2003ml.xml
+++ b/tika-parsers/src/test/resources/test-documents/testWORD_2003ml.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
-<w:wordDocument xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" w:macrosPresent="no" w:embeddedObjPresent
="yes" w:ocxPresent="no" xml:space="preserve"><w:ignoreSubtree w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>My Document Title</o:Title><o:Subject>My Document Subtitle</o:Subject><o:Author>This is the Author</o:Author><o:LastAuthor>Allison, Timothy B.</o:LastAuthor><o:Revision>2</o:Revision><o:TotalTime>1</o:TotalTime><o:Created>2016-11-23T12:08:00Z</o:Created><o:LastSaved>2016-11-23T12:08:00Z</o:LastSaved><o:Pages>7</o:Pages><o:Words>217</o:Words><o:Characters>1243</o:Characters><o:Lines>10</o:Lines><o:Paragraphs>2</o:Paragraphs><o:CharactersWithSpaces>1458</o:CharactersWithSpaces><o:Version>16</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Calibri" w:fareast="PMingLiU" w:h-ansi="Calibri" w:cs="Arial"/><w:font w:name="Times New Roman"><w:panose-1 w:val="02020603050405020304"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:pitch w:val="variable"/><w:sig w:usb-0="E0002EFF" w:usb-1="C0007843" w:usb-2="00000009
" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="Arial"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="E0002EFF" w:usb-1="C0007843" w:usb-2="00000009" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="PMingLiU"><w:altName w:val="Microsoft JhengHei"/><w:panose-1 w:val="02010601000101010101"/><w:charset w:val="88"/><w:family w:val="auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="08080000" w:usb-2="00000010" w:usb-3="00000000" w:csb-0="00100000" w:csb-1="00000000"/></w:font><w:font w:name="Cambria Math"><w:panose-1 w:val="02040503050406030204"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:pitch w:val="variable"/><w:sig w:usb-0="E00002FF" w:usb-1="420024FF" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000019F" w:csb-1="00000000"/></w:font><w:font w:name="Calibri Light"><w:panose-1 w:val="020F0302020204030
204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="A00002EF" w:usb-1="4000207B" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000019F" w:csb-1="00000000"/></w:font><w:font w:name="Calibri"><w:panose-1 w:val="020F0502020204030204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="E00002FF" w:usb-1="4000ACFF" w:usb-2="00000001" w:usb-3="00000000" w:csb-0="0000019F" w:csb-1="00000000"/></w:font><w:font w:name="Segoe UI"><w:panose-1 w:val="020B0502040204020203"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="E4002EFF" w:usb-1="C000E47F" w:usb-2="00000009" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="@PMingLiU"><w:panose-1 w:val="02010601000101010101"/><w:charset w:val="88"/><w:family w:val="auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="08080000" w:usb-2="00000010" w:usb-3="00000000" w:csb-0="001
00000" w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="6A7C56AD"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C2908A46"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="
4"/><w:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="0"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylena
mes w:val="7"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="372"><w:lsdException w:name="Normal"/><w:lsdException w:name="heading 1"/><w:lsdException w:name="heading 2"/><w:lsdException w:name="heading 3"/><w:lsdException w:name="heading 4"/><w:lsdException w:name="heading 5"/><w:lsdException w:name="heading 6"/><w:lsdException w:name="heading 7"/><w:lsdException w:name="heading 8"/><w:lsdException w:name="heading 9"/><w:lsdException w:name="index 1"/><w:lsdException w:name="index 2"/><w:lsdException w:name="index 3"/><w:lsdException w:name="index 4"/><w:lsdException w:name="index 5"/><w:lsdException w:name="index 6"/><w:lsdException w:name="index 7"/><w:lsdException w:name="index 8"/><w:lsdException w:name="index 9"/><w:lsdException w:name="toc 1"/><w:lsdException w:name="toc 2"/><w:lsdException w:name="toc 3"/><w:lsdException w:name="toc 4"/><w:lsdException w:name="toc 5"/><w:lsdException w:name="toc 6"/><w:lsdException w:name="toc 7"/><w:lsdException w:name="toc 8"/
><w:lsdException w:name="toc 9"/><w:lsdException w:name="Normal Indent"/><w:lsdException w:name="footnote text"/><w:lsdException w:name="annotation text"/><w:lsdException w:name="header"/><w:lsdException w:name="footer"/><w:lsdException w:name="index heading"/><w:lsdException w:name="caption"/><w:lsdException w:name="table of figures"/><w:lsdException w:name="envelope address"/><w:lsdException w:name="envelope return"/><w:lsdException w:name="footnote reference"/><w:lsdException w:name="annotation reference"/><w:lsdException w:name="line number"/><w:lsdException w:name="page number"/><w:lsdException w:name="endnote reference"/><w:lsdException w:name="endnote text"/><w:lsdException w:name="table of authorities"/><w:lsdException w:name="macro"/><w:lsdException w:name="toa heading"/><w:lsdException w:name="List"/><w:lsdException w:name="List Bullet"/><w:lsdException w:name="List Number"/><w:lsdException w:name="List 2"/><w:lsdException w:name="List 3"/><w:lsdException w:name="List 4"/>
<w:lsdException w:name="List 5"/><w:lsdException w:name="List Bullet 2"/><w:lsdException w:name="List Bullet 3"/><w:lsdException w:name="List Bullet 4"/><w:lsdException w:name="List Bullet 5"/><w:lsdException w:name="List Number 2"/><w:lsdException w:name="List Number 3"/><w:lsdException w:name="List Number 4"/><w:lsdException w:name="List Number 5"/><w:lsdException w:name="Title"/><w:lsdException w:name="Closing"/><w:lsdException w:name="Signature"/><w:lsdException w:name="Default Paragraph Font"/><w:lsdException w:name="Body Text"/><w:lsdException w:name="Body Text Indent"/><w:lsdException w:name="List Continue"/><w:lsdException w:name="List Continue 2"/><w:lsdException w:name="List Continue 3"/><w:lsdException w:name="List Continue 4"/><w:lsdException w:name="List Continue 5"/><w:lsdException w:name="Message Header"/><w:lsdException w:name="Subtitle"/><w:lsdException w:name="Salutation"/><w:lsdException w:name="Date"/><w:lsdException w:name="Body Text First Indent"/><w:lsdExcepti
on w:name="Body Text First Indent 2"/><w:lsdException w:name="Note Heading"/><w:lsdException w:name="Body Text 2"/><w:lsdException w:name="Body Text 3"/><w:lsdException w:name="Body Text Indent 2"/><w:lsdException w:name="Body Text Indent 3"/><w:lsdException w:name="Block Text"/><w:lsdException w:name="Hyperlink"/><w:lsdException w:name="FollowedHyperlink"/><w:lsdException w:name="Strong"/><w:lsdException w:name="Emphasis"/><w:lsdException w:name="Document Map"/><w:lsdException w:name="Plain Text"/><w:lsdException w:name="E-mail Signature"/><w:lsdException w:name="HTML Top of Form"/><w:lsdException w:name="HTML Bottom of Form"/><w:lsdException w:name="Normal (Web)"/><w:lsdException w:name="HTML Acronym"/><w:lsdException w:name="HTML Address"/><w:lsdException w:name="HTML Cite"/><w:lsdException w:name="HTML Code"/><w:lsdException w:name="HTML Definition"/><w:lsdException w:name="HTML Keyboard"/><w:lsdException w:name="HTML Preformatted"/><w:lsdException w:name="HTML Sample"/><w:lsdEx
ception w:name="HTML Typewriter"/><w:lsdException w:name="HTML Variable"/><w:lsdException w:name="Normal Table"/><w:lsdException w:name="annotation subject"/><w:lsdException w:name="No List"/><w:lsdException w:name="Outline List 1"/><w:lsdException w:name="Outline List 2"/><w:lsdException w:name="Outline List 3"/><w:lsdException w:name="Table Simple 1"/><w:lsdException w:name="Table Simple 2"/><w:lsdException w:name="Table Simple 3"/><w:lsdException w:name="Table Classic 1"/><w:lsdException w:name="Table Classic 2"/><w:lsdException w:name="Table Classic 3"/><w:lsdException w:name="Table Classic 4"/><w:lsdException w:name="Table Colorful 1"/><w:lsdException w:name="Table Colorful 2"/><w:lsdException w:name="Table Colorful 3"/><w:lsdException w:name="Table Columns 1"/><w:lsdException w:name="Table Columns 2"/><w:lsdException w:name="Table Columns 3"/><w:lsdException w:name="Table Columns 4"/><w:lsdException w:name="Table Columns 5"/><w:lsdException w:name="Table Grid 1"/><w:lsdExcepti
on w:name="Table Grid 2"/><w:lsdException w:name="Table Grid 3"/><w:lsdException w:name="Table Grid 4"/><w:lsdException w:name="Table Grid 5"/><w:lsdException w:name="Table Grid 6"/><w:lsdException w:name="Table Grid 7"/><w:lsdException w:name="Table Grid 8"/><w:lsdException w:name="Table List 1"/><w:lsdException w:name="Table List 2"/><w:lsdException w:name="Table List 3"/><w:lsdException w:name="Table List 4"/><w:lsdException w:name="Table List 5"/><w:lsdException w:name="Table List 6"/><w:lsdException w:name="Table List 7"/><w:lsdException w:name="Table List 8"/><w:lsdException w:name="Table 3D effects 1"/><w:lsdException w:name="Table 3D effects 2"/><w:lsdException w:name="Table 3D effects 3"/><w:lsdException w:name="Table Contemporary"/><w:lsdException w:name="Table Elegant"/><w:lsdException w:name="Table Professional"/><w:lsdException w:name="Table Subtle 1"/><w:lsdException w:name="Table Subtle 2"/><w:lsdException w:name="Table Web 1"/><w:lsdException w:name="Table Web 2"/><w
:lsdException w:name="Table Web 3"/><w:lsdException w:name="Balloon Text"/><w:lsdException w:name="Table Grid"/><w:lsdException w:name="Table Theme"/><w:lsdException w:name="Placeholder Text"/><w:lsdException w:name="No Spacing"/><w:lsdException w:name="Light Shading"/><w:lsdException w:name="Light List"/><w:lsdException w:name="Light Grid"/><w:lsdException w:name="Medium Shading 1"/><w:lsdException w:name="Medium Shading 2"/><w:lsdException w:name="Medium List 1"/><w:lsdException w:name="Medium List 2"/><w:lsdException w:name="Medium Grid 1"/><w:lsdException w:name="Medium Grid 2"/><w:lsdException w:name="Medium Grid 3"/><w:lsdException w:name="Dark List"/><w:lsdException w:name="Colorful Shading"/><w:lsdException w:name="Colorful List"/><w:lsdException w:name="Colorful Grid"/><w:lsdException w:name="Light Shading Accent 1"/><w:lsdException w:name="Light List Accent 1"/><w:lsdException w:name="Light Grid Accent 1"/><w:lsdException w:name="Medium Shading 1 Accent 1"/><w:lsdException
w:name="Medium Shading 2 Accent 1"/><w:lsdException w:name="Medium List 1 Accent 1"/><w:lsdException w:name="Revision"/><w:lsdException w:name="List Paragraph"/><w:lsdException w:name="Quote"/><w:lsdException w:name="Intense Quote"/><w:lsdException w:name="Medium List 2 Accent 1"/><w:lsdException w:name="Medium Grid 1 Accent 1"/><w:lsdException w:name="Medium Grid 2 Accent 1"/><w:lsdException w:name="Medium Grid 3 Accent 1"/><w:lsdException w:name="Dark List Accent 1"/><w:lsdException w:name="Colorful Shading Accent 1"/><w:lsdException w:name="Colorful List Accent 1"/><w:lsdException w:name="Colorful Grid Accent 1"/><w:lsdException w:name="Light Shading Accent 2"/><w:lsdException w:name="Light List Accent 2"/><w:lsdException w:name="Light Grid Accent 2"/><w:lsdException w:name="Medium Shading 1 Accent 2"/><w:lsdException w:name="Medium Shading 2 Accent 2"/><w:lsdException w:name="Medium List 1 Accent 2"/><w:lsdException w:name="Medium List 2 Accent 2"/><w:lsdException w:name="Mediu
m Grid 1 Accent 2"/><w:lsdException w:name="Medium Grid 2 Accent 2"/><w:lsdException w:name="Medium Grid 3 Accent 2"/><w:lsdException w:name="Dark List Accent 2"/><w:lsdException w:name="Colorful Shading Accent 2"/><w:lsdException w:name="Colorful List Accent 2"/><w:lsdException w:name="Colorful Grid Accent 2"/><w:lsdException w:name="Light Shading Accent 3"/><w:lsdException w:name="Light List Accent 3"/><w:lsdException w:name="Light Grid Accent 3"/><w:lsdException w:name="Medium Shading 1 Accent 3"/><w:lsdException w:name="Medium Shading 2 Accent 3"/><w:lsdException w:name="Medium List 1 Accent 3"/><w:lsdException w:name="Medium List 2 Accent 3"/><w:lsdException w:name="Medium Grid 1 Accent 3"/><w:lsdException w:name="Medium Grid 2 Accent 3"/><w:lsdException w:name="Medium Grid 3 Accent 3"/><w:lsdException w:name="Dark List Accent 3"/><w:lsdException w:name="Colorful Shading Accent 3"/><w:lsdException w:name="Colorful List Accent 3"/><w:lsdException w:name="Colorful Grid Accent 3"/
><w:lsdException w:name="Light Shading Accent 4"/><w:lsdException w:name="Light List Accent 4"/><w:lsdException w:name="Light Grid Accent 4"/><w:lsdException w:name="Medium Shading 1 Accent 4"/><w:lsdException w:name="Medium Shading 2 Accent 4"/><w:lsdException w:name="Medium List 1 Accent 4"/><w:lsdException w:name="Medium List 2 Accent 4"/><w:lsdException w:name="Medium Grid 1 Accent 4"/><w:lsdException w:name="Medium Grid 2 Accent 4"/><w:lsdException w:name="Medium Grid 3 Accent 4"/><w:lsdException w:name="Dark List Accent 4"/><w:lsdException w:name="Colorful Shading Accent 4"/><w:lsdException w:name="Colorful List Accent 4"/><w:lsdException w:name="Colorful Grid Accent 4"/><w:lsdException w:name="Light Shading Accent 5"/><w:lsdException w:name="Light List Accent 5"/><w:lsdException w:name="Light Grid Accent 5"/><w:lsdException w:name="Medium Shading 1 Accent 5"/><w:lsdException w:name="Medium Shading 2 Accent 5"/><w:lsdException w:name="Medium List 1 Accent 5"/><w:lsdException w
:name="Medium List 2 Accent 5"/><w:lsdException w:name="Medium Grid 1 Accent 5"/><w:lsdException w:name="Medium Grid 2 Accent 5"/><w:lsdException w:name="Medium Grid 3 Accent 5"/><w:lsdException w:name="Dark List Accent 5"/><w:lsdException w:name="Colorful Shading Accent 5"/><w:lsdException w:name="Colorful List Accent 5"/><w:lsdException w:name="Colorful Grid Accent 5"/><w:lsdException w:name="Light Shading Accent 6"/><w:lsdException w:name="Light List Accent 6"/><w:lsdException w:name="Light Grid Accent 6"/><w:lsdException w:name="Medium Shading 1 Accent 6"/><w:lsdException w:name="Medium Shading 2 Accent 6"/><w:lsdException w:name="Medium List 1 Accent 6"/><w:lsdException w:name="Medium List 2 Accent 6"/><w:lsdException w:name="Medium Grid 1 Accent 6"/><w:lsdException w:name="Medium Grid 2 Accent 6"/><w:lsdException w:name="Medium Grid 3 Accent 6"/><w:lsdException w:name="Dark List Accent 6"/><w:lsdException w:name="Colorful Shading Accent 6"/><w:lsdException w:name="Colorful Lis
t Accent 6"/><w:lsdException w:name="Colorful Grid Accent 6"/><w:lsdException w:name="Subtle Emphasis"/><w:lsdException w:name="Intense Emphasis"/><w:lsdException w:name="Subtle Reference"/><w:lsdException w:name="Intense Reference"/><w:lsdException w:name="Book Title"/><w:lsdException w:name="Bibliography"/><w:lsdException w:name="TOC Heading"/><w:lsdException w:name="Plain Table 1"/><w:lsdException w:name="Plain Table 2"/><w:lsdException w:name="Plain Table 3"/><w:lsdException w:name="Plain Table 4"/><w:lsdException w:name="Plain Table 5"/><w:lsdException w:name="Grid Table Light"/><w:lsdException w:name="Grid Table 1 Light"/><w:lsdException w:name="Grid Table 2"/><w:lsdException w:name="Grid Table 3"/><w:lsdException w:name="Grid Table 4"/><w:lsdException w:name="Grid Table 5 Dark"/><w:lsdException w:name="Grid Table 6 Colorful"/><w:lsdException w:name="Grid Table 7 Colorful"/><w:lsdException w:name="Grid Table 1 Light Accent 1"/><w:lsdException w:name="Grid Table 2 Accent 1"/><w
:lsdException w:name="Grid Table 3 Accent 1"/><w:lsdException w:name="Grid Table 4 Accent 1"/><w:lsdException w:name="Grid Table 5 Dark Accent 1"/><w:lsdException w:name="Grid Table 6 Colorful Accent 1"/><w:lsdException w:name="Grid Table 7 Colorful Accent 1"/><w:lsdException w:name="Grid Table 1 Light Accent 2"/><w:lsdException w:name="Grid Table 2 Accent 2"/><w:lsdException w:name="Grid Table 3 Accent 2"/><w:lsdException w:name="Grid Table 4 Accent 2"/><w:lsdException w:name="Grid Table 5 Dark Accent 2"/><w:lsdException w:name="Grid Table 6 Colorful Accent 2"/><w:lsdException w:name="Grid Table 7 Colorful Accent 2"/><w:lsdException w:name="Grid Table 1 Light Accent 3"/><w:lsdException w:name="Grid Table 2 Accent 3"/><w:lsdException w:name="Grid Table 3 Accent 3"/><w:lsdException w:name="Grid Table 4 Accent 3"/><w:lsdException w:name="Grid Table 5 Dark Accent 3"/><w:lsdException w:name="Grid Table 6 Colorful Accent 3"/><w:lsdException w:name="Grid Table 7 Colorful Accent 3"/><w:lsd
Exception w:name="Grid Table 1 Light Accent 4"/><w:lsdException w:name="Grid Table 2 Accent 4"/><w:lsdException w:name="Grid Table 3 Accent 4"/><w:lsdException w:name="Grid Table 4 Accent 4"/><w:lsdException w:name="Grid Table 5 Dark Accent 4"/><w:lsdException w:name="Grid Table 6 Colorful Accent 4"/><w:lsdException w:name="Grid Table 7 Colorful Accent 4"/><w:lsdException w:name="Grid Table 1 Light Accent 5"/><w:lsdException w:name="Grid Table 2 Accent 5"/><w:lsdException w:name="Grid Table 3 Accent 5"/><w:lsdException w:name="Grid Table 4 Accent 5"/><w:lsdException w:name="Grid Table 5 Dark Accent 5"/><w:lsdException w:name="Grid Table 6 Colorful Accent 5"/><w:lsdException w:name="Grid Table 7 Colorful Accent 5"/><w:lsdException w:name="Grid Table 1 Light Accent 6"/><w:lsdException w:name="Grid Table 2 Accent 6"/><w:lsdException w:name="Grid Table 3 Accent 6"/><w:lsdException w:name="Grid Table 4 Accent 6"/><w:lsdException w:name="Grid Table 5 Dark Accent 6"/><w:lsdException w:name
="Grid Table 6 Colorful Accent 6"/><w:lsdException w:name="Grid Table 7 Colorful Accent 6"/><w:lsdException w:name="List Table 1 Light"/><w:lsdException w:name="List Table 2"/><w:lsdException w:name="List Table 3"/><w:lsdException w:name="List Table 4"/><w:lsdException w:name="List Table 5 Dark"/><w:lsdException w:name="List Table 6 Colorful"/><w:lsdException w:name="List Table 7 Colorful"/><w:lsdException w:name="List Table 1 Light Accent 1"/><w:lsdException w:name="List Table 2 Accent 1"/><w:lsdException w:name="List Table 3 Accent 1"/><w:lsdException w:name="List Table 4 Accent 1"/><w:lsdException w:name="List Table 5 Dark Accent 1"/><w:lsdException w:name="List Table 6 Colorful Accent 1"/><w:lsdException w:name="List Table 7 Colorful Accent 1"/><w:lsdException w:name="List Table 1 Light Accent 2"/><w:lsdException w:name="List Table 2 Accent 2"/><w:lsdException w:name="List Table 3 Accent 2"/><w:lsdException w:name="List Table 4 Accent 2"/><w:lsdException w:name="List Table 5 Dar
k Accent 2"/><w:lsdException w:name="List Table 6 Colorful Accent 2"/><w:lsdException w:name="List Table 7 Colorful Accent 2"/><w:lsdException w:name="List Table 1 Light Accent 3"/><w:lsdException w:name="List Table 2 Accent 3"/><w:lsdException w:name="List Table 3 Accent 3"/><w:lsdException w:name="List Table 4 Accent 3"/><w:lsdException w:name="List Table 5 Dark Accent 3"/><w:lsdException w:name="List Table 6 Colorful Accent 3"/><w:lsdException w:name="List Table 7 Colorful Accent 3"/><w:lsdException w:name="List Table 1 Light Accent 4"/><w:lsdException w:name="List Table 2 Accent 4"/><w:lsdException w:name="List Table 3 Accent 4"/><w:lsdException w:name="List Table 4 Accent 4"/><w:lsdException w:name="List Table 5 Dark Accent 4"/><w:lsdException w:name="List Table 6 Colorful Accent 4"/><w:lsdException w:name="List Table 7 Colorful Accent 4"/><w:lsdException w:name="List Table 1 Light Accent 5"/><w:lsdException w:name="List Table 2 Accent 5"/><w:lsdException w:name="List Table 3 A
ccent 5"/><w:lsdException w:name="List Table 4 Accent 5"/><w:lsdException w:name="List Table 5 Dark Accent 5"/><w:lsdException w:name="List Table 6 Colorful Accent 5"/><w:lsdException w:name="List Table 7 Colorful Accent 5"/><w:lsdException w:name="List Table 1 Light Accent 6"/><w:lsdException w:name="List Table 2 Accent 6"/><w:lsdException w:name="List Table 3 Accent 6"/><w:lsdException w:name="List Table 4 Accent 6"/><w:lsdException w:name="List Table 5 Dark Accent 6"/><w:lsdException w:name="List Table 6 Colorful Accent 6"/><w:lsdException w:name="List Table 7 Colorful Accent 6"/><w:lsdException w:name="Mention"/></w:latentStyles><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:pPr><w:spacing w:after="160" w:line="259" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="ZH-TW" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><
w:name w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading1Char"/><w:rsid w:val="00814CC8"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="240" w:after="0"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Calibri Light" w:h-ansi="Calibri Light" w:cs="Times New Roman"/><wx:font wx:val="Calibri Light"/><w:color w:val="2E74B5"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:rPr><wx:font wx:val="Calibri"/><w:lang w:val="EN-US" w:fareast="ZH-TW" w:bidi="AR-SA"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:ty
pe="dxa"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:link w:val="HeaderChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:tabs><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:spacing w:after="0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="character" w:styleId="HeaderChar"><w:name w:val="Header Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Header"/><w:rsid w:val="00814CC8"/></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:link w:val="FooterChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:tabs><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:spacing w:
after="0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="character" w:styleId="FooterChar"><w:name w:val="Footer Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Footer"/><w:rsid w:val="00814CC8"/></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:link w:val="BalloonTextChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:spacing w:after="0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Segoe UI" w:h-ansi="Segoe UI" w:cs="Segoe UI"/><wx:font wx:val="Segoe UI"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="character" w:styleId="BalloonTextChar"><w:name w:val="Balloon Text Char"/><w:link w:val="BalloonText"/><w:rsid w:val="00814CC8"/><w:rPr><w:rFonts w:ascii="Segoe UI" w:h-ansi="Segoe UI" w:cs="Segoe UI"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="L
istParagraph"><w:name w:val="List Paragraph"/><w:basedOn w:val="Normal"/><w:rsid w:val="00814CC8"/><w:pPr><w:ind w:left="720"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:rsid w:val="00814CC8"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:link w:val="CommentTextChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:spacing w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentTextChar"><w:name w:val="Comment Text Char"/><w:link w:val="CommentText"/><w:rsid w:val="00814CC8"/><w:rPr><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style
><w:style w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:link w:val="CommentSubjectChar"/><w:rsid w:val="00814CC8"/><w:rPr><wx:font wx:val="Calibri"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentSubjectChar"><w:name w:val="Comment Subject Char"/><w:link w:val="CommentSubject"/><w:rsid w:val="00814CC8"/><w:rPr><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="FootnoteText"><w:name w:val="footnote text"/><wx:uiName wx:val="Footnote Text"/><w:basedOn w:val="Normal"/><w:link w:val="FootnoteTextChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:spacing w:after="0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="FootnoteTextChar"><w:name w:val="Foot
note Text Char"/><w:link w:val="FootnoteText"/><w:rsid w:val="00814CC8"/><w:rPr><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="FootnoteReference"><w:name w:val="footnote reference"/><wx:uiName wx:val="Footnote Reference"/><w:rsid w:val="00814CC8"/><w:rPr><w:vertAlign w:val="superscript"/></w:rPr></w:style><w:style w:type="character" w:styleId="Heading1Char"><w:name w:val="Heading 1 Char"/><w:link w:val="Heading1"/><w:rsid w:val="00814CC8"/><w:rPr><w:rFonts w:ascii="Calibri Light" w:fareast="PMingLiU" w:h-ansi="Calibri Light" w:cs="Times New Roman"/><w:color w:val="2E74B5"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCHeading"><w:name w:val="TOC Heading"/><w:basedOn w:val="Heading1"/><w:next w:val="Normal"/><w:rsid w:val="00814CC8"/><w:pPr><w:outlineLvl w:val="9"/></w:pPr><w:rPr><wx:font wx:val="Calibri Light"/><w:lang w:fareast="EN-US"/></w:rPr></w:style><w:style w:type="character"
w:styleId="Hyperlink"><w:name w:val="Hyperlink"/><w:rsid w:val="00814CC8"/><w:rPr><w:color w:val="0563C1"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="00814CC8"/><w:rPr><wx:font wx:val="Calibri"/></w:rPr><w:tblPr><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders></w:tblPr></w:style><w:style w:type="character" w:styleId="PlaceholderText"><w:name w:val="Placeholder Text"/><w:rsid w:val="00814CC8"/><w:rPr><w:color w:val="808080"/>
</w:rPr></w:style><w:style w:type="paragraph" w:styleId="EndnoteText"><w:name w:val="endnote text"/><wx:uiName wx:val="Endnote Text"/><w:basedOn w:val="Normal"/><w:link w:val="EndnoteTextChar"/><w:rsid w:val="00670AA1"/><w:pPr><w:spacing w:after="0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="EndnoteTextChar"><w:name w:val="Endnote Text Char"/><w:link w:val="EndnoteText"/><w:rsid w:val="00670AA1"/><w:rPr><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="EndnoteReference"><w:name w:val="endnote reference"/><wx:uiName wx:val="Endnote Reference"/><w:rsid w:val="00670AA1"/><w:rPr><w:vertAlign w:val="superscript"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Date"><w:name w:val="Date"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="DateChar"/><w:rsid w:val="00670AA1"/><w:rPr><wx:font wx:
val="Calibri"/></w:rPr></w:style><w:style w:type="character" w:styleId="DateChar"><w:name w:val="Date Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Date"/><w:rsid w:val="00670AA1"/></w:style><w:style w:type="paragraph" w:styleId="NoSpacing"><w:name w:val="No Spacing"/><w:link w:val="NoSpacingChar"/><w:rsid w:val="00711569"/><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="NoSpacingChar"><w:name w:val="No Spacing Char"/><w:link w:val="NoSpacing"/><w:rsid w:val="00711569"/><w:rPr><w:lang w:fareast="EN-US"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="100"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="paragraph" w:sty
leId="Bibliography"><w:name w:val="Bibliography"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><wx:uiName wx:val="Caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="200" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:i/><w:i-cs/><w:color w:val="44546A"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofFigures"><w:name w:val="table of figures"/><wx:uiName wx:val="Table of Figures"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Index1"><w:name w:val="index 1"/><wx:uiName wx:val="Index 1"/><w:basedOn w:val="Normal"/><w:next w:va
l="Normal"/><w:autoRedefine/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="0" w:line="240" w:line-rule="auto"/><w:ind w:left="220" w:hanging="220"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOAHeading"><w:name w:val="toa heading"/><wx:uiName wx:val="TOA Heading"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:before="120"/></w:pPr><w:rPr><w:rFonts w:ascii="Calibri Light" w:h-ansi="Calibri Light" w:cs="Times New Roman"/><wx:font wx:val="Calibri Light"/><w:b/><w:b-cs/><w:sz w:val="24"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofAuthorities"><w:name w:val="table of authorities"/><wx:uiName wx:val="Table of Authorities"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="0"/><w:ind w:left="220" w:hanging="220"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style></w:styles>
<w:divs><w:div w:id="230694882"><w:bodyDiv w:val="on"/><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div><w:div w:id="1411732106"><w:bodyDiv w:val="on"/><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div></w:divs><w:docOleData><w:binData w:name="oledata.mso" xml:s
pace="preserve">0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAA
-EAAAAgAAAAEAAAD+////AAAAAAAAAAD/////////////////////////////////////////////
+<w:wordDocument xmlns:aml="http://schemas.microsoft.com/aml/2001/core" xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://schemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml" xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2" xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core" w:macrosPresent="no" w:embeddedObjPresent
="yes" w:ocxPresent="no" xml:space="preserve"><w:ignoreSubtree w:val="http://schemas.microsoft.com/office/word/2003/wordml/sp2"/><o:DocumentProperties><o:Title>My Document Title</o:Title><o:Subject>My Document Subtitle</o:Subject><o:Author>This is the Author</o:Author><o:LastAuthor>Allison, Timothy B.</o:LastAuthor><o:Revision>2</o:Revision><o:TotalTime>0</o:TotalTime><o:Created>2016-11-29T19:21:00Z</o:Created><o:LastSaved>2016-11-29T19:21:00Z</o:LastSaved><o:Pages>7</o:Pages><o:Words>253</o:Words><o:Characters>1443</o:Characters><o:Lines>12</o:Lines><o:Paragraphs>3</o:Paragraphs><o:CharactersWithSpaces>1693</o:CharactersWithSpaces><o:Version>16</o:Version></o:DocumentProperties><w:fonts><w:defaultFonts w:ascii="Calibri" w:fareast="PMingLiU" w:h-ansi="Calibri" w:cs="Arial"/><w:font w:name="Times New Roman"><w:panose-1 w:val="02020603050405020304"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:pitch w:val="variable"/><w:sig w:usb-0="E0002EFF" w:usb-1="C0007843" w:usb-2="00000009
" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="Arial"><w:panose-1 w:val="020B0604020202020204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="E0002EFF" w:usb-1="C0007843" w:usb-2="00000009" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="PMingLiU"><w:altName w:val="\u65b0\u7d30\u660e\u9ad4"/><w:panose-1 w:val="02010601000101010101"/><w:charset w:val="88"/><w:family w:val="auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="08080000" w:usb-2="00000010" w:usb-3="00000000" w:csb-0="00100000" w:csb-1="00000000"/></w:font><w:font w:name="Cambria Math"><w:panose-1 w:val="02040503050406030204"/><w:charset w:val="00"/><w:family w:val="Roman"/><w:pitch w:val="variable"/><w:sig w:usb-0="E00002FF" w:usb-1="420024FF" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000019F" w:csb-1="00000000"/></w:font><w:font w:name="Calibri Light"><w:panose-1 w:val="020F0302020204030204"/>
<w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="A00002EF" w:usb-1="4000207B" w:usb-2="00000000" w:usb-3="00000000" w:csb-0="0000019F" w:csb-1="00000000"/></w:font><w:font w:name="Calibri"><w:panose-1 w:val="020F0502020204030204"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="E00002FF" w:usb-1="4000ACFF" w:usb-2="00000001" w:usb-3="00000000" w:csb-0="0000019F" w:csb-1="00000000"/></w:font><w:font w:name="Segoe UI"><w:panose-1 w:val="020B0502040204020203"/><w:charset w:val="00"/><w:family w:val="Swiss"/><w:pitch w:val="variable"/><w:sig w:usb-0="E4002EFF" w:usb-1="C000E47F" w:usb-2="00000009" w:usb-3="00000000" w:csb-0="000001FF" w:csb-1="00000000"/></w:font><w:font w:name="@PMingLiU"><w:panose-1 w:val="02010601000101010101"/><w:charset w:val="88"/><w:family w:val="auto"/><w:pitch w:val="variable"/><w:sig w:usb-0="00000000" w:usb-1="08080000" w:usb-2="00000010" w:usb-3="00000000" w:csb-0="00100000"
w:csb-1="00000000"/></w:font></w:fonts><w:lists><w:listDef w:listDefId="0"><w:lsid w:val="6A7C56AD"/><w:plt w:val="HybridMultilevel"/><w:tmpl w:val="C2908A46"/><w:lvl w:ilvl="0" w:tplc="0409000F"><w:start w:val="1"/><w:lvlText w:val="%1."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="720" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="1" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%2."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="1440" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="2" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%3."/><w:lvlJc w:val="right"/><w:pPr><w:ind w:left="2160" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%4."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="2880" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="4" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w
:lvlText w:val="%5."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="3600" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="5" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%6."/><w:lvlJc w:val="right"/><w:pPr><w:ind w:left="4320" w:hanging="180"/></w:pPr></w:lvl><w:lvl w:ilvl="6" w:tplc="0409000F" w:tentative="on"><w:start w:val="1"/><w:lvlText w:val="%7."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5040" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="7" w:tplc="04090019" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="4"/><w:lvlText w:val="%8."/><w:lvlJc w:val="left"/><w:pPr><w:ind w:left="5760" w:hanging="360"/></w:pPr></w:lvl><w:lvl w:ilvl="8" w:tplc="0409001B" w:tentative="on"><w:start w:val="1"/><w:nfc w:val="2"/><w:lvlText w:val="%9."/><w:lvlJc w:val="right"/><w:pPr><w:ind w:left="6480" w:hanging="180"/></w:pPr></w:lvl></w:listDef><w:list w:ilfo="1"><w:ilst w:val="0"/></w:list></w:lists><w:styles><w:versionOfBuiltInStylenames w:
val="7"/><w:latentStyles w:defLockedState="off" w:latentStyleCount="372"><w:lsdException w:name="Normal"/><w:lsdException w:name="heading 1"/><w:lsdException w:name="heading 2"/><w:lsdException w:name="heading 3"/><w:lsdException w:name="heading 4"/><w:lsdException w:name="heading 5"/><w:lsdException w:name="heading 6"/><w:lsdException w:name="heading 7"/><w:lsdException w:name="heading 8"/><w:lsdException w:name="heading 9"/><w:lsdException w:name="index 1"/><w:lsdException w:name="index 2"/><w:lsdException w:name="index 3"/><w:lsdException w:name="index 4"/><w:lsdException w:name="index 5"/><w:lsdException w:name="index 6"/><w:lsdException w:name="index 7"/><w:lsdException w:name="index 8"/><w:lsdException w:name="index 9"/><w:lsdException w:name="toc 1"/><w:lsdException w:name="toc 2"/><w:lsdException w:name="toc 3"/><w:lsdException w:name="toc 4"/><w:lsdException w:name="toc 5"/><w:lsdException w:name="toc 6"/><w:lsdException w:name="toc 7"/><w:lsdException w:name="toc 8"/><w:ls
dException w:name="toc 9"/><w:lsdException w:name="Normal Indent"/><w:lsdException w:name="footnote text"/><w:lsdException w:name="annotation text"/><w:lsdException w:name="header"/><w:lsdException w:name="footer"/><w:lsdException w:name="index heading"/><w:lsdException w:name="caption"/><w:lsdException w:name="table of figures"/><w:lsdException w:name="envelope address"/><w:lsdException w:name="envelope return"/><w:lsdException w:name="footnote reference"/><w:lsdException w:name="annotation reference"/><w:lsdException w:name="line number"/><w:lsdException w:name="page number"/><w:lsdException w:name="endnote reference"/><w:lsdException w:name="endnote text"/><w:lsdException w:name="table of authorities"/><w:lsdException w:name="macro"/><w:lsdException w:name="toa heading"/><w:lsdException w:name="List"/><w:lsdException w:name="List Bullet"/><w:lsdException w:name="List Number"/><w:lsdException w:name="List 2"/><w:lsdException w:name="List 3"/><w:lsdException w:name="List 4"/><w:lsd
Exception w:name="List 5"/><w:lsdException w:name="List Bullet 2"/><w:lsdException w:name="List Bullet 3"/><w:lsdException w:name="List Bullet 4"/><w:lsdException w:name="List Bullet 5"/><w:lsdException w:name="List Number 2"/><w:lsdException w:name="List Number 3"/><w:lsdException w:name="List Number 4"/><w:lsdException w:name="List Number 5"/><w:lsdException w:name="Title"/><w:lsdException w:name="Closing"/><w:lsdException w:name="Signature"/><w:lsdException w:name="Default Paragraph Font"/><w:lsdException w:name="Body Text"/><w:lsdException w:name="Body Text Indent"/><w:lsdException w:name="List Continue"/><w:lsdException w:name="List Continue 2"/><w:lsdException w:name="List Continue 3"/><w:lsdException w:name="List Continue 4"/><w:lsdException w:name="List Continue 5"/><w:lsdException w:name="Message Header"/><w:lsdException w:name="Subtitle"/><w:lsdException w:name="Salutation"/><w:lsdException w:name="Date"/><w:lsdException w:name="Body Text First Indent"/><w:lsdException w:n
ame="Body Text First Indent 2"/><w:lsdException w:name="Note Heading"/><w:lsdException w:name="Body Text 2"/><w:lsdException w:name="Body Text 3"/><w:lsdException w:name="Body Text Indent 2"/><w:lsdException w:name="Body Text Indent 3"/><w:lsdException w:name="Block Text"/><w:lsdException w:name="Hyperlink"/><w:lsdException w:name="FollowedHyperlink"/><w:lsdException w:name="Strong"/><w:lsdException w:name="Emphasis"/><w:lsdException w:name="Document Map"/><w:lsdException w:name="Plain Text"/><w:lsdException w:name="E-mail Signature"/><w:lsdException w:name="HTML Top of Form"/><w:lsdException w:name="HTML Bottom of Form"/><w:lsdException w:name="Normal (Web)"/><w:lsdException w:name="HTML Acronym"/><w:lsdException w:name="HTML Address"/><w:lsdException w:name="HTML Cite"/><w:lsdException w:name="HTML Code"/><w:lsdException w:name="HTML Definition"/><w:lsdException w:name="HTML Keyboard"/><w:lsdException w:name="HTML Preformatted"/><w:lsdException w:name="HTML Sample"/><w:lsdExceptio
n w:name="HTML Typewriter"/><w:lsdException w:name="HTML Variable"/><w:lsdException w:name="Normal Table"/><w:lsdException w:name="annotation subject"/><w:lsdException w:name="No List"/><w:lsdException w:name="Outline List 1"/><w:lsdException w:name="Outline List 2"/><w:lsdException w:name="Outline List 3"/><w:lsdException w:name="Table Simple 1"/><w:lsdException w:name="Table Simple 2"/><w:lsdException w:name="Table Simple 3"/><w:lsdException w:name="Table Classic 1"/><w:lsdException w:name="Table Classic 2"/><w:lsdException w:name="Table Classic 3"/><w:lsdException w:name="Table Classic 4"/><w:lsdException w:name="Table Colorful 1"/><w:lsdException w:name="Table Colorful 2"/><w:lsdException w:name="Table Colorful 3"/><w:lsdException w:name="Table Columns 1"/><w:lsdException w:name="Table Columns 2"/><w:lsdException w:name="Table Columns 3"/><w:lsdException w:name="Table Columns 4"/><w:lsdException w:name="Table Columns 5"/><w:lsdException w:name="Table Grid 1"/><w:lsdException w:n
ame="Table Grid 2"/><w:lsdException w:name="Table Grid 3"/><w:lsdException w:name="Table Grid 4"/><w:lsdException w:name="Table Grid 5"/><w:lsdException w:name="Table Grid 6"/><w:lsdException w:name="Table Grid 7"/><w:lsdException w:name="Table Grid 8"/><w:lsdException w:name="Table List 1"/><w:lsdException w:name="Table List 2"/><w:lsdException w:name="Table List 3"/><w:lsdException w:name="Table List 4"/><w:lsdException w:name="Table List 5"/><w:lsdException w:name="Table List 6"/><w:lsdException w:name="Table List 7"/><w:lsdException w:name="Table List 8"/><w:lsdException w:name="Table 3D effects 1"/><w:lsdException w:name="Table 3D effects 2"/><w:lsdException w:name="Table 3D effects 3"/><w:lsdException w:name="Table Contemporary"/><w:lsdException w:name="Table Elegant"/><w:lsdException w:name="Table Professional"/><w:lsdException w:name="Table Subtle 1"/><w:lsdException w:name="Table Subtle 2"/><w:lsdException w:name="Table Web 1"/><w:lsdException w:name="Table Web 2"/><w:lsdEx
ception w:name="Table Web 3"/><w:lsdException w:name="Balloon Text"/><w:lsdException w:name="Table Grid"/><w:lsdException w:name="Table Theme"/><w:lsdException w:name="Placeholder Text"/><w:lsdException w:name="No Spacing"/><w:lsdException w:name="Light Shading"/><w:lsdException w:name="Light List"/><w:lsdException w:name="Light Grid"/><w:lsdException w:name="Medium Shading 1"/><w:lsdException w:name="Medium Shading 2"/><w:lsdException w:name="Medium List 1"/><w:lsdException w:name="Medium List 2"/><w:lsdException w:name="Medium Grid 1"/><w:lsdException w:name="Medium Grid 2"/><w:lsdException w:name="Medium Grid 3"/><w:lsdException w:name="Dark List"/><w:lsdException w:name="Colorful Shading"/><w:lsdException w:name="Colorful List"/><w:lsdException w:name="Colorful Grid"/><w:lsdException w:name="Light Shading Accent 1"/><w:lsdException w:name="Light List Accent 1"/><w:lsdException w:name="Light Grid Accent 1"/><w:lsdException w:name="Medium Shading 1 Accent 1"/><w:lsdException w:nam
e="Medium Shading 2 Accent 1"/><w:lsdException w:name="Medium List 1 Accent 1"/><w:lsdException w:name="Revision"/><w:lsdException w:name="List Paragraph"/><w:lsdException w:name="Quote"/><w:lsdException w:name="Intense Quote"/><w:lsdException w:name="Medium List 2 Accent 1"/><w:lsdException w:name="Medium Grid 1 Accent 1"/><w:lsdException w:name="Medium Grid 2 Accent 1"/><w:lsdException w:name="Medium Grid 3 Accent 1"/><w:lsdException w:name="Dark List Accent 1"/><w:lsdException w:name="Colorful Shading Accent 1"/><w:lsdException w:name="Colorful List Accent 1"/><w:lsdException w:name="Colorful Grid Accent 1"/><w:lsdException w:name="Light Shading Accent 2"/><w:lsdException w:name="Light List Accent 2"/><w:lsdException w:name="Light Grid Accent 2"/><w:lsdException w:name="Medium Shading 1 Accent 2"/><w:lsdException w:name="Medium Shading 2 Accent 2"/><w:lsdException w:name="Medium List 1 Accent 2"/><w:lsdException w:name="Medium List 2 Accent 2"/><w:lsdException w:name="Medium Grid
1 Accent 2"/><w:lsdException w:name="Medium Grid 2 Accent 2"/><w:lsdException w:name="Medium Grid 3 Accent 2"/><w:lsdException w:name="Dark List Accent 2"/><w:lsdException w:name="Colorful Shading Accent 2"/><w:lsdException w:name="Colorful List Accent 2"/><w:lsdException w:name="Colorful Grid Accent 2"/><w:lsdException w:name="Light Shading Accent 3"/><w:lsdException w:name="Light List Accent 3"/><w:lsdException w:name="Light Grid Accent 3"/><w:lsdException w:name="Medium Shading 1 Accent 3"/><w:lsdException w:name="Medium Shading 2 Accent 3"/><w:lsdException w:name="Medium List 1 Accent 3"/><w:lsdException w:name="Medium List 2 Accent 3"/><w:lsdException w:name="Medium Grid 1 Accent 3"/><w:lsdException w:name="Medium Grid 2 Accent 3"/><w:lsdException w:name="Medium Grid 3 Accent 3"/><w:lsdException w:name="Dark List Accent 3"/><w:lsdException w:name="Colorful Shading Accent 3"/><w:lsdException w:name="Colorful List Accent 3"/><w:lsdException w:name="Colorful Grid Accent 3"/><w:ls
dException w:name="Light Shading Accent 4"/><w:lsdException w:name="Light List Accent 4"/><w:lsdException w:name="Light Grid Accent 4"/><w:lsdException w:name="Medium Shading 1 Accent 4"/><w:lsdException w:name="Medium Shading 2 Accent 4"/><w:lsdException w:name="Medium List 1 Accent 4"/><w:lsdException w:name="Medium List 2 Accent 4"/><w:lsdException w:name="Medium Grid 1 Accent 4"/><w:lsdException w:name="Medium Grid 2 Accent 4"/><w:lsdException w:name="Medium Grid 3 Accent 4"/><w:lsdException w:name="Dark List Accent 4"/><w:lsdException w:name="Colorful Shading Accent 4"/><w:lsdException w:name="Colorful List Accent 4"/><w:lsdException w:name="Colorful Grid Accent 4"/><w:lsdException w:name="Light Shading Accent 5"/><w:lsdException w:name="Light List Accent 5"/><w:lsdException w:name="Light Grid Accent 5"/><w:lsdException w:name="Medium Shading 1 Accent 5"/><w:lsdException w:name="Medium Shading 2 Accent 5"/><w:lsdException w:name="Medium List 1 Accent 5"/><w:lsdException w:name=
"Medium List 2 Accent 5"/><w:lsdException w:name="Medium Grid 1 Accent 5"/><w:lsdException w:name="Medium Grid 2 Accent 5"/><w:lsdException w:name="Medium Grid 3 Accent 5"/><w:lsdException w:name="Dark List Accent 5"/><w:lsdException w:name="Colorful Shading Accent 5"/><w:lsdException w:name="Colorful List Accent 5"/><w:lsdException w:name="Colorful Grid Accent 5"/><w:lsdException w:name="Light Shading Accent 6"/><w:lsdException w:name="Light List Accent 6"/><w:lsdException w:name="Light Grid Accent 6"/><w:lsdException w:name="Medium Shading 1 Accent 6"/><w:lsdException w:name="Medium Shading 2 Accent 6"/><w:lsdException w:name="Medium List 1 Accent 6"/><w:lsdException w:name="Medium List 2 Accent 6"/><w:lsdException w:name="Medium Grid 1 Accent 6"/><w:lsdException w:name="Medium Grid 2 Accent 6"/><w:lsdException w:name="Medium Grid 3 Accent 6"/><w:lsdException w:name="Dark List Accent 6"/><w:lsdException w:name="Colorful Shading Accent 6"/><w:lsdException w:name="Colorful List Acce
nt 6"/><w:lsdException w:name="Colorful Grid Accent 6"/><w:lsdException w:name="Subtle Emphasis"/><w:lsdException w:name="Intense Emphasis"/><w:lsdException w:name="Subtle Reference"/><w:lsdException w:name="Intense Reference"/><w:lsdException w:name="Book Title"/><w:lsdException w:name="Bibliography"/><w:lsdException w:name="TOC Heading"/><w:lsdException w:name="Plain Table 1"/><w:lsdException w:name="Plain Table 2"/><w:lsdException w:name="Plain Table 3"/><w:lsdException w:name="Plain Table 4"/><w:lsdException w:name="Plain Table 5"/><w:lsdException w:name="Grid Table Light"/><w:lsdException w:name="Grid Table 1 Light"/><w:lsdException w:name="Grid Table 2"/><w:lsdException w:name="Grid Table 3"/><w:lsdException w:name="Grid Table 4"/><w:lsdException w:name="Grid Table 5 Dark"/><w:lsdException w:name="Grid Table 6 Colorful"/><w:lsdException w:name="Grid Table 7 Colorful"/><w:lsdException w:name="Grid Table 1 Light Accent 1"/><w:lsdException w:name="Grid Table 2 Accent 1"/><w:lsdEx
ception w:name="Grid Table 3 Accent 1"/><w:lsdException w:name="Grid Table 4 Accent 1"/><w:lsdException w:name="Grid Table 5 Dark Accent 1"/><w:lsdException w:name="Grid Table 6 Colorful Accent 1"/><w:lsdException w:name="Grid Table 7 Colorful Accent 1"/><w:lsdException w:name="Grid Table 1 Light Accent 2"/><w:lsdException w:name="Grid Table 2 Accent 2"/><w:lsdException w:name="Grid Table 3 Accent 2"/><w:lsdException w:name="Grid Table 4 Accent 2"/><w:lsdException w:name="Grid Table 5 Dark Accent 2"/><w:lsdException w:name="Grid Table 6 Colorful Accent 2"/><w:lsdException w:name="Grid Table 7 Colorful Accent 2"/><w:lsdException w:name="Grid Table 1 Light Accent 3"/><w:lsdException w:name="Grid Table 2 Accent 3"/><w:lsdException w:name="Grid Table 3 Accent 3"/><w:lsdException w:name="Grid Table 4 Accent 3"/><w:lsdException w:name="Grid Table 5 Dark Accent 3"/><w:lsdException w:name="Grid Table 6 Colorful Accent 3"/><w:lsdException w:name="Grid Table 7 Colorful Accent 3"/><w:lsdExcept
ion w:name="Grid Table 1 Light Accent 4"/><w:lsdException w:name="Grid Table 2 Accent 4"/><w:lsdException w:name="Grid Table 3 Accent 4"/><w:lsdException w:name="Grid Table 4 Accent 4"/><w:lsdException w:name="Grid Table 5 Dark Accent 4"/><w:lsdException w:name="Grid Table 6 Colorful Accent 4"/><w:lsdException w:name="Grid Table 7 Colorful Accent 4"/><w:lsdException w:name="Grid Table 1 Light Accent 5"/><w:lsdException w:name="Grid Table 2 Accent 5"/><w:lsdException w:name="Grid Table 3 Accent 5"/><w:lsdException w:name="Grid Table 4 Accent 5"/><w:lsdException w:name="Grid Table 5 Dark Accent 5"/><w:lsdException w:name="Grid Table 6 Colorful Accent 5"/><w:lsdException w:name="Grid Table 7 Colorful Accent 5"/><w:lsdException w:name="Grid Table 1 Light Accent 6"/><w:lsdException w:name="Grid Table 2 Accent 6"/><w:lsdException w:name="Grid Table 3 Accent 6"/><w:lsdException w:name="Grid Table 4 Accent 6"/><w:lsdException w:name="Grid Table 5 Dark Accent 6"/><w:lsdException w:name="Grid
Table 6 Colorful Accent 6"/><w:lsdException w:name="Grid Table 7 Colorful Accent 6"/><w:lsdException w:name="List Table 1 Light"/><w:lsdException w:name="List Table 2"/><w:lsdException w:name="List Table 3"/><w:lsdException w:name="List Table 4"/><w:lsdException w:name="List Table 5 Dark"/><w:lsdException w:name="List Table 6 Colorful"/><w:lsdException w:name="List Table 7 Colorful"/><w:lsdException w:name="List Table 1 Light Accent 1"/><w:lsdException w:name="List Table 2 Accent 1"/><w:lsdException w:name="List Table 3 Accent 1"/><w:lsdException w:name="List Table 4 Accent 1"/><w:lsdException w:name="List Table 5 Dark Accent 1"/><w:lsdException w:name="List Table 6 Colorful Accent 1"/><w:lsdException w:name="List Table 7 Colorful Accent 1"/><w:lsdException w:name="List Table 1 Light Accent 2"/><w:lsdException w:name="List Table 2 Accent 2"/><w:lsdException w:name="List Table 3 Accent 2"/><w:lsdException w:name="List Table 4 Accent 2"/><w:lsdException w:name="List Table 5 Dark Acce
nt 2"/><w:lsdException w:name="List Table 6 Colorful Accent 2"/><w:lsdException w:name="List Table 7 Colorful Accent 2"/><w:lsdException w:name="List Table 1 Light Accent 3"/><w:lsdException w:name="List Table 2 Accent 3"/><w:lsdException w:name="List Table 3 Accent 3"/><w:lsdException w:name="List Table 4 Accent 3"/><w:lsdException w:name="List Table 5 Dark Accent 3"/><w:lsdException w:name="List Table 6 Colorful Accent 3"/><w:lsdException w:name="List Table 7 Colorful Accent 3"/><w:lsdException w:name="List Table 1 Light Accent 4"/><w:lsdException w:name="List Table 2 Accent 4"/><w:lsdException w:name="List Table 3 Accent 4"/><w:lsdException w:name="List Table 4 Accent 4"/><w:lsdException w:name="List Table 5 Dark Accent 4"/><w:lsdException w:name="List Table 6 Colorful Accent 4"/><w:lsdException w:name="List Table 7 Colorful Accent 4"/><w:lsdException w:name="List Table 1 Light Accent 5"/><w:lsdException w:name="List Table 2 Accent 5"/><w:lsdException w:name="List Table 3 Accent
5"/><w:lsdException w:name="List Table 4 Accent 5"/><w:lsdException w:name="List Table 5 Dark Accent 5"/><w:lsdException w:name="List Table 6 Colorful Accent 5"/><w:lsdException w:name="List Table 7 Colorful Accent 5"/><w:lsdException w:name="List Table 1 Light Accent 6"/><w:lsdException w:name="List Table 2 Accent 6"/><w:lsdException w:name="List Table 3 Accent 6"/><w:lsdException w:name="List Table 4 Accent 6"/><w:lsdException w:name="List Table 5 Dark Accent 6"/><w:lsdException w:name="List Table 6 Colorful Accent 6"/><w:lsdException w:name="List Table 7 Colorful Accent 6"/><w:lsdException w:name="Mention"/></w:latentStyles><w:style w:type="paragraph" w:default="on" w:styleId="Normal"><w:name w:val="Normal"/><w:pPr><w:spacing w:after="160" w:line="259" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="ZH-TW" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Heading1"><w:name
w:val="heading 1"/><wx:uiName wx:val="Heading 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="Heading1Char"/><w:rsid w:val="00814CC8"/><w:pPr><w:keepNext/><w:keepLines/><w:spacing w:before="240" w:after="0"/><w:outlineLvl w:val="0"/></w:pPr><w:rPr><w:rFonts w:ascii="Calibri Light" w:h-ansi="Calibri Light" w:cs="Times New Roman"/><wx:font wx:val="Calibri Light"/><w:color w:val="2E74B5"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="character" w:default="on" w:styleId="DefaultParagraphFont"><w:name w:val="Default Paragraph Font"/></w:style><w:style w:type="table" w:default="on" w:styleId="TableNormal"><w:name w:val="Normal Table"/><wx:uiName wx:val="Table Normal"/><w:rPr><wx:font wx:val="Calibri"/><w:lang w:val="EN-US" w:fareast="ZH-TW" w:bidi="AR-SA"/></w:rPr><w:tblPr><w:tblInd w:w="0" w:type="dxa"/><w:tblCellMar><w:top w:w="0" w:type="dxa"/><w:left w:w="108" w:type="dxa"/><w:bottom w:w="0" w:type="dxa"/><w:right w:w="108" w:type="dx
a"/></w:tblCellMar></w:tblPr></w:style><w:style w:type="list" w:default="on" w:styleId="NoList"><w:name w:val="No List"/></w:style><w:style w:type="paragraph" w:styleId="Header"><w:name w:val="header"/><wx:uiName wx:val="Header"/><w:basedOn w:val="Normal"/><w:link w:val="HeaderChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:tabs><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:spacing w:after="0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="character" w:styleId="HeaderChar"><w:name w:val="Header Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Header"/><w:rsid w:val="00814CC8"/></w:style><w:style w:type="paragraph" w:styleId="Footer"><w:name w:val="footer"/><wx:uiName wx:val="Footer"/><w:basedOn w:val="Normal"/><w:link w:val="FooterChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:tabs><w:tab w:val="center" w:pos="4680"/><w:tab w:val="right" w:pos="9360"/></w:tabs><w:spacing w:after=
"0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="character" w:styleId="FooterChar"><w:name w:val="Footer Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Footer"/><w:rsid w:val="00814CC8"/></w:style><w:style w:type="paragraph" w:styleId="BalloonText"><w:name w:val="Balloon Text"/><w:basedOn w:val="Normal"/><w:link w:val="BalloonTextChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:spacing w:after="0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><w:rFonts w:ascii="Segoe UI" w:h-ansi="Segoe UI" w:cs="Segoe UI"/><wx:font wx:val="Segoe UI"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="character" w:styleId="BalloonTextChar"><w:name w:val="Balloon Text Char"/><w:link w:val="BalloonText"/><w:rsid w:val="00814CC8"/><w:rPr><w:rFonts w:ascii="Segoe UI" w:h-ansi="Segoe UI" w:cs="Segoe UI"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="ListPar
agraph"><w:name w:val="List Paragraph"/><w:basedOn w:val="Normal"/><w:rsid w:val="00814CC8"/><w:pPr><w:ind w:left="720"/><w:contextualSpacing/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentReference"><w:name w:val="annotation reference"/><wx:uiName wx:val="Comment Reference"/><w:rsid w:val="00814CC8"/><w:rPr><w:sz w:val="16"/><w:sz-cs w:val="16"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="CommentText"><w:name w:val="annotation text"/><wx:uiName wx:val="Comment Text"/><w:basedOn w:val="Normal"/><w:link w:val="CommentTextChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:spacing w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentTextChar"><w:name w:val="Comment Text Char"/><w:link w:val="CommentText"/><w:rsid w:val="00814CC8"/><w:rPr><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:st
yle w:type="paragraph" w:styleId="CommentSubject"><w:name w:val="annotation subject"/><wx:uiName wx:val="Comment Subject"/><w:basedOn w:val="CommentText"/><w:next w:val="CommentText"/><w:link w:val="CommentSubjectChar"/><w:rsid w:val="00814CC8"/><w:rPr><wx:font wx:val="Calibri"/><w:b/><w:b-cs/></w:rPr></w:style><w:style w:type="character" w:styleId="CommentSubjectChar"><w:name w:val="Comment Subject Char"/><w:link w:val="CommentSubject"/><w:rsid w:val="00814CC8"/><w:rPr><w:b/><w:b-cs/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="FootnoteText"><w:name w:val="footnote text"/><wx:uiName wx:val="Footnote Text"/><w:basedOn w:val="Normal"/><w:link w:val="FootnoteTextChar"/><w:rsid w:val="00814CC8"/><w:pPr><w:spacing w:after="0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="FootnoteTextChar"><w:name w:val="Footnote T
ext Char"/><w:link w:val="FootnoteText"/><w:rsid w:val="00814CC8"/><w:rPr><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="FootnoteReference"><w:name w:val="footnote reference"/><wx:uiName wx:val="Footnote Reference"/><w:rsid w:val="00814CC8"/><w:rPr><w:vertAlign w:val="superscript"/></w:rPr></w:style><w:style w:type="character" w:styleId="Heading1Char"><w:name w:val="Heading 1 Char"/><w:link w:val="Heading1"/><w:rsid w:val="00814CC8"/><w:rPr><w:rFonts w:ascii="Calibri Light" w:fareast="PMingLiU" w:h-ansi="Calibri Light" w:cs="Times New Roman"/><w:color w:val="2E74B5"/><w:sz w:val="32"/><w:sz-cs w:val="32"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOCHeading"><w:name w:val="TOC Heading"/><w:basedOn w:val="Heading1"/><w:next w:val="Normal"/><w:rsid w:val="00814CC8"/><w:pPr><w:outlineLvl w:val="9"/></w:pPr><w:rPr><wx:font wx:val="Calibri Light"/><w:lang w:fareast="EN-US"/></w:rPr></w:style><w:style w:type="character" w:sty
leId="Hyperlink"><w:name w:val="Hyperlink"/><w:rsid w:val="00814CC8"/><w:rPr><w:color w:val="0563C1"/><w:u w:val="single"/></w:rPr></w:style><w:style w:type="table" w:styleId="TableGrid"><w:name w:val="Table Grid"/><w:basedOn w:val="TableNormal"/><w:rsid w:val="00814CC8"/><w:rPr><wx:font wx:val="Calibri"/></w:rPr><w:tblPr><w:tblBorders><w:top w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:bottom w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:right w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideH w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/><w:insideV w:val="single" w:sz="4" wx:bdrwidth="10" w:space="0" w:color="auto"/></w:tblBorders></w:tblPr></w:style><w:style w:type="character" w:styleId="PlaceholderText"><w:name w:val="Placeholder Text"/><w:rsid w:val="00814CC8"/><w:rPr><w:color w:val="808080"/></w:rP
r></w:style><w:style w:type="paragraph" w:styleId="EndnoteText"><w:name w:val="endnote text"/><wx:uiName wx:val="Endnote Text"/><w:basedOn w:val="Normal"/><w:link w:val="EndnoteTextChar"/><w:rsid w:val="00670AA1"/><w:pPr><w:spacing w:after="0" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="EndnoteTextChar"><w:name w:val="Endnote Text Char"/><w:link w:val="EndnoteText"/><w:rsid w:val="00670AA1"/><w:rPr><w:sz w:val="20"/><w:sz-cs w:val="20"/></w:rPr></w:style><w:style w:type="character" w:styleId="EndnoteReference"><w:name w:val="endnote reference"/><wx:uiName wx:val="Endnote Reference"/><w:rsid w:val="00670AA1"/><w:rPr><w:vertAlign w:val="superscript"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Date"><w:name w:val="Date"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:link w:val="DateChar"/><w:rsid w:val="00670AA1"/><w:rPr><wx:font wx:val="C
alibri"/></w:rPr></w:style><w:style w:type="character" w:styleId="DateChar"><w:name w:val="Date Char"/><w:basedOn w:val="DefaultParagraphFont"/><w:link w:val="Date"/><w:rsid w:val="00670AA1"/></w:style><w:style w:type="paragraph" w:styleId="NoSpacing"><w:name w:val="No Spacing"/><w:link w:val="NoSpacingChar"/><w:rsid w:val="00711569"/><w:rPr><wx:font wx:val="Calibri"/><w:sz w:val="22"/><w:sz-cs w:val="22"/><w:lang w:val="EN-US" w:fareast="EN-US" w:bidi="AR-SA"/></w:rPr></w:style><w:style w:type="character" w:styleId="NoSpacingChar"><w:name w:val="No Spacing Char"/><w:link w:val="NoSpacing"/><w:rsid w:val="00711569"/><w:rPr><w:lang w:fareast="EN-US"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOC1"><w:name w:val="toc 1"/><wx:uiName wx:val="TOC 1"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:autoRedefine/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="100"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="
Bibliography"><w:name w:val="Bibliography"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Caption"><w:name w:val="caption"/><wx:uiName wx:val="Caption"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="200" w:line="240" w:line-rule="auto"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/><w:i/><w:i-cs/><w:color w:val="44546A"/><w:sz w:val="18"/><w:sz-cs w:val="18"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofFigures"><w:name w:val="table of figures"/><wx:uiName wx:val="Table of Figures"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="0"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="Index1"><w:name w:val="index 1"/><wx:uiName wx:val="Index 1"/><w:basedOn w:val="Normal"/><w:next w:val="Nor
mal"/><w:autoRedefine/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="0" w:line="240" w:line-rule="auto"/><w:ind w:left="220" w:hanging="220"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TOAHeading"><w:name w:val="toa heading"/><wx:uiName wx:val="TOA Heading"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:before="120"/></w:pPr><w:rPr><w:rFonts w:ascii="Calibri Light" w:h-ansi="Calibri Light" w:cs="Times New Roman"/><wx:font wx:val="Calibri Light"/><w:b/><w:b-cs/><w:sz w:val="24"/><w:sz-cs w:val="24"/></w:rPr></w:style><w:style w:type="paragraph" w:styleId="TableofAuthorities"><w:name w:val="table of authorities"/><wx:uiName wx:val="Table of Authorities"/><w:basedOn w:val="Normal"/><w:next w:val="Normal"/><w:rsid w:val="0049479F"/><w:pPr><w:spacing w:after="0"/><w:ind w:left="220" w:hanging="220"/></w:pPr><w:rPr><wx:font wx:val="Calibri"/></w:rPr></w:style></w:styles><w:div
s><w:div w:id="230694882"><w:bodyDiv w:val="on"/><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div><w:div w:id="1411732106"><w:bodyDiv w:val="on"/><w:marLeft w:val="0"/><w:marRight w:val="0"/><w:marTop w:val="0"/><w:marBottom w:val="0"/><w:divBdr><w:top w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:left w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:bottom w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/><w:right w:val="none" w:sz="0" wx:bdrwidth="0" w:space="0" w:color="auto"/></w:divBdr></w:div></w:divs><w:docOleData><w:binData w:name="oledata.mso" xml:space="
preserve">0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAACAAAAAQAAAAAAAAAA
+EAAAAgAAAAEAAAD+////AAAAAAAAAAB1AAAA////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
@@ -9,24 +9,24 @@ EAAAAgAAAAEAAAD+////AAAAAAAAAAD/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////9
-/////v////7///8VAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8A
+////cwAAAP7///8VAAAABQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADgAAAA8A
AAAQAAAAEQAAABIAAAATAAAAFAAAAAMAAAAWAAAAFwAAABgAAAAZAAAAGgAAAP7///8tAAAAHQAA
AB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJgAAACcAAAAoAAAAKQAAACoAAAArAAAA
-LAAAABsAAAAuAAAALwAAADAAAAAxAAAAMgAAAP7/////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-////////////////////////////////////////////////////////////////////////////
-/////////////////////////////////////////////////////////////////////////1IA
+LAAAABsAAAAuAAAALwAAADAAAAAxAAAAMgAAAP7///9FAAAANQAAADYAAAA3AAAAOAAAADkAAAA6
+AAAAOwAAADwAAAA9AAAAPgAAAD8AAABAAAAAQQAAAEIAAABDAAAARAAAADMAAABGAAAARwAAAEgA
+AABJAAAASgAAAEsAAABMAAAATQAAAE4AAABPAAAAUAAAAFEAAABSAAAAUwAAAFQAAABVAAAAVgAA
+AFcAAABYAAAAWQAAAFoAAABbAAAAXAAAAF0AAABeAAAAXwAAAGAAAABhAAAAYgAAAGMAAABkAAAA
+ZQAAAGYAAABnAAAAaAAAAGkAAABqAAAAawAAAGwAAABtAAAAbgAAAG8AAABwAAAAcQAAAHIAAAD+
+/////v///4cAAAD9////dwAAAHgAAAB5AAAAegAAAHsAAAB8AAAAfQAAAH4AAAB/AAAAgAAAAFIA
bwBvAHQAIABFAG4AdAByAHkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAWAAUA//////////8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANC3B0OCRdIB
-/v///wAAAAAAAAAAXwAxADUANAAxADMAOQAwADAANQAyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAABgAAgH/////AgAAAP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAEAAAA0S4AAAAAAABfADEANQA0ADEAMwA5ADAAMAA1ADMAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAACAP///////////////wAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAD0LgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
-////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////
+AAAAAAAWAAUA//////////8CAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABOQsJ1StIB
+/v///wAAAAAAAAAAXwAxADUANAAxADkAMwA0ADQAMwA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAABgAAgH///////////////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAEAAAA0y4AAAAAAABfADEANQA0ADEAOQAzADQANAAzADYAAAAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGAACAQEAAAADAAAA/////wAAAAAAAAAA
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAAAD0LgAAAAAAAF8AMQA1ADQAMQA5ADMANAA0
+ADMANwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYAAIB/////wQA
+AAD/////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANAAAAOl/AAAAAAAA////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
@@ -35,438 +35,1462 @@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////+rhk0P
-6Di22gXyHz+Vy0JPUlpeHtrni/zzNhPyX/o2E7VyUs034B7Gmthn3oQqD0dizOhw7ltNN+Me2aqf
-V77PJrWcf+jzY4fSK/WUhdbBmSd21yk53tYwPbLTY1FB5jfbY7tCpBValusETTups5wqFTTtstn3
-MHzB/TPOoWuzTNJt66xdpdUv0kmHd7c7LpjX/m5uFrPpeWbunPJc+bKMtKnFQZ8cN3lPdMk43OTc
-T9Hp9Ju5btsNXLIGnmoyP/w27s2CH7cUj+nr928qnnZ9VLLj28yVOnff6Rvf2Tza0/uJrWrtxFVq
-p+xoDiNUzWZPlLUfhmNbHKAH7qsanTryafvii7LN7rRl5yQvU2rrXmZ5Hz7fpzJGTk9j+5jTs1Kj
-ymX64oZrNhre7jBSVWWwfuz99SW7TrvPsUxt/9Ol9w5rt/gycrQlj5o6GiqXXy74NGdH/eMhP2KR
-7NZTC/Y1vLaTX6iVPEht07PJ3vlrfn5ecCg9TNHv853G4tpX02tNzjYunLvmwxT3+aZnpWm/WmO/
-lG6V9z/2ViurUTv2y5xzx2sOBCcpXntbZTNv35nafSdNzkp7ZhkctWEdv/X4jdmEYJedqQPsG9tG
-zK9+eG1zjtHu5dvP3FUPWH917HGNHeWpysjWZPVRGUnM9KfGeS5jZ6oMDPM56646wi/JeACKAAB4
-nOw9B1gTy9ab0EIPRRQQCQEFlBI6Kr2IBSkiqBdRA4QaA4ag2LGLIkoTxIIF7BW7qAgWREGxIDZA
-RBRFxI49/8xuAmlEuO+9/7/v/nf4ZrJ79pSZM+ecnZmdXapvqjzZdkSrERFITogE8osti0jzwHCc
-jCYiguA557/YbDYXzP4n/VelnyBLcvrQnfML+1wGZALIsiDLgSwPsgLIiiArgayMmQCiArIqyGog
-q4PcB2QNkPuC3A9kTZC1QNYGuT/IOiAPAFkXZBLIeiCTQdYH2QDkgSAPAtkQZCOQjUEeDPIQkE1A
-NgXZDGRzkCkgW4BsCbIVyNYg24BsC7IdyPYgDwV5GMjDQXYA2RG1bQRxBtkFZFeQ3Tjt/vV/2xX/
-J2kcEgf+WKAvPBEG+GUiswVDgdikgUh1+jyMB3oEPAq/gF0ewYd8Vsp9sedtnATUvQQGwiG+CB2h
-9Uomb5JD8Dje9vSUTh3hyncH7Z+OxIN6hCIxvZavCuTDGAh9qKfyIX4o51iCI3cU0H4EqMmfkd/b
-9kPVc+P6L06/ce1finNNhgMT9P//jz7yd0447Db+pxMOWISEHGb7gr4P7wNjo8OYcQlxESySZ1IY
-jU5yj6IyWaiFuUVHRNij9xL0ihl6xcwe+Ti0aEYvKoCXQO9Jfzb9Ah4jjRdWAfTRJ8vy33/1jSLu
-SycgQwyPPqAA2CkE8w143QXB/H4kgt0rwxHsXpiMYL6Si2D3ywIEuz8eRjBlP5PE7oEwBrnS6dEJ
-cQwT0vjo6XGsqNkkN7PfXiMiQnpF65K8dXrlIhBf0WMZphs31opLE0DMYSKxIAbB+0Bsr/UH4g8a
-T2DcgDbQExqIWzeXexyAJIL4Ox2hovcebhxkohAWEg2OGWJ4GXHin3Qv5MM+a+msiweQEIbWgYbe
-AXtXH3vQfl5/6ol8aCvquN+i9Tj1Vj5vkiUQgQNIITpuVTKloC3SoHKN4PewZClqq09Bngzujmoi
-zZH0H0tuaB2oOFiHC0BXjjhJAMEhm0CpAkaVEK6KlmpoeQjFPIuWjqgXAjq9w2pD0SMcMhHvguKt
-QUsyWiqhHE+iNA9RiAXwr8cI7KF1sH/wSJoMzh30Ox30eyiwgei/EMZgJAoHx7pcDEUBDBLiDcpI
-JApYLeRnAsYptshZfPcSJX+L8Rj5PQacE/yuXeq/xXD4LYbTbzBwYIz/u7ZY/7Yt1r+VIvtbHnK/
-4YEHs6XfSSH8VoqsWB5Xu6wJEY1xDIGzInEY/XDiMAZI9gfRFMz7yAZkfRN9fcpU4+GTjbgnk40H
-SOqB+35/vuvB42jhIfxIZHB71elCMqPw8wHnEMsQNIYsiCXAjYNqBzwFzBCnQvhgElcy53SyEUcw
-F0A2JaNXXaYCUjMw/TSGpLx0/EQCFM5gkjqMXxhWN355aNV4RDo7d7GwBXNdCx6hXHohYgHKJ5w5
-zSc2iSe+XyD9A//PwHEIDxyPwaW4+Mc4cMmN3cAPdQNP6Qae1w08vxv43m7g+3tZn/XdwPf1kj+G
-36cbfGH4oW7g67uBd8f/SDfw073EP94N/GQ38KPdwM+LrY+8EPwAClfmwrNUVHLkc+S5elDphEdE
-lOiW6HLrIwViCAr/wuGDcO3TuBu4STfwwSLhaly5H/nhckL1x+xQhgu/i/iBuUk/Lj6BDw4XDjG4
-bBecJBIuIFdRSD+Y/RC7+ExD0IVIDF9BqJ4C9rxJRUVDXkOe63dKPPwxPXP9QlakfqS7qad6V32o
-CHKkUw+qIvDnEdSReQSEJzkhWcSWofMJpsh8PjhMeKADdXQmBm/P3DuEEqghXpgA11sCfG8JJHpL
-INlbAqneEkj3lkCmtwSE3hLI9pZArrcE8r0lUOgtgWJvCZR6S6DcW4IhvSUw6S2BaW8JzHpLMKy3
-BMP5CCQECHDzCa4CBBYoWncEeALnAnRMbIBJIgkzsewJE7azeCZWPWFiacXPRLD91mLbjxeWSumU
-iq7+URE2H4Ek58KV9hvs7qtuxMdkEyItmgm7XBwTO34mtG5qwm7dxMMkXYAJfPAl08nE2XlmN0wq
-N3QykeHAFi5cyOauuxBEwGR5YFxxciJgwpUaKlApZ9GVev/+vVClILJgpXhhsjwwwUrxwoQrZcxX
-qW/zu1G3qEr9+zQlaAO2fDYgVCmuMHYyTowNDO5sGXfZV2TLCgsL/4PqFnRM+MQV39kygMgWcEzB
-VtjztUIo9HVaMrtSqBVFRUVCreCFyfLABFvBCxNuhTlfK2BfCrQiUIAAPmyW7L4VMiLCK2/I5dZY
-2FLICG+0FNnJv4/bRD4mInUsgdAixDPR6AmTSm/xTPr3pDmCwV+QiX7PdCIllolKz3QinknfnulE
-PBOdnulEPBODnulEWiwT1Z7pRDyTfj3TiXgmA3qmE/FMBvZMJzJimaj1TCfimWj2TCfimej2TCfi
-mQzqmU4IYpmo90wn4plo9Uwn4pmQeqYT8UwMe6YTWbFM+vRMJ+KZaPdMJ+KZ6PVMJ7xMMvGq4CYB
-JneWlIEkU5JrWBiNwbLIIIxFMnhY4yQHsBXBJIACPIsEZkUkxBUJA3/Yk1RshoEDc0oZSVpEXWsH
-WwoeY88P2AOhaChGRVCMpbAYshgxll1ipGgRP57dEy1GVVCMlbCYQWLEWHWJkaZFtLW1iRajJijG
-WljMYDFirLvEyNAi2O8rRYtRFxRjIyzGTIwYmy4xBFrEg8b3osX0ERRjKyzGUowY2y4xsrSIp+0P
-RYvRgGKsxVuaLhBj3QNLq/Q+V/tGtJi+gmJEWJq+GDG8llbp/eX6AdFi+gmKEWFphmLE8Fpapfej
-R49Ei9EUFCPC0oaIEcNraZXe7OcbRIvREhQjwtLMxYjhtbRK72NXXogWoy0oRoSlWYkRw2tpld5X
-nhwTLaY/FGMr3tJIQIxtDyzN0mpj2XNMDILtwugUoyMoRoSlGYgRw2tpllYfDy8VLWaAoBgRlmYk
-RgyvpVlaVVRUiBajKyhGhKWZiBHDa2mWVuwHEaLFkATFiLA0ihgxvJZmaZW255FoMXqCYkRYmrUY
-MbyWZmm1pzpNlBgFBD7IRjptzFVAgA5bplu7QpDgjTWimep3MbUUZqonwJTXihCkbb6FaKYGXUyt
-hJkOFGDKazPYWoJIpgO7mFoLMzUWYMprIYDRBUQ000FdTG2EmZoKMOW1BwTxYF4SzdSwi6mtMFML
-Aaa8vY8g8Qe8RDElIEZwqOVGDc8gDOVniNNmSyBuCBXdLYgxkmJjK4RSnGO4jMhhRESM4Rq+O5Ue
-lkinsqLjGBmERfwM8RpseQTbigG3sdH5tqnJdAqAy1lcAXB5CRUgjSihALiegQPIvGcEvjNZvrNM
-vDIyGD6NcI+ihcWS3Gl0egZhoUC9+rLlQL2igN7CkFjgQ+7giA7+eGsl0ny4tYLrStKdtcLOCHxn
-snxnmWAkOyRZgp1BIPFXRUoCCMH2ecNdfDBBXJNkaYBrJIArzZblwSUhwSAMhHTSmCZLAppBAjSS
-bAKgSUSY4A+aSRhnFz2kMEuWARRmAhQybAUhCn5ZfRBzuEzjmRRPpzKorDjmbNJ4WhIrg+AloGcb
-NhHxRJKQeLTvGWj/x6GbF0nIeMA8CZzDxStu78Mu5JiXLJAHwo1XXBww1OEChqrFlkS80G2h/KYK
-V8S5vOCyOYeXEohhwCNG0qjh0YxIkoVQRSWIQLMjQYWg7UeDikaCCmJxDzUB4DAe42MwdrDTuwIh
-ZG7Jy9xSmLmKCOaW4piznfdXvuIwt+JlbiXMXFUEcytxzLGhAR5lbs3L3FooIEioiWBu3dljfMwz
-8XIgqoFYPooRnwhMIVHAFNRBe+CO1XhgWSw+R4Pr/txOgw8H/kX3J4I4COKSdzQjlhbO8f8xApXp
-B+KSN9qiWNC6cL4IIIEIxSKueLjEDX1ZAbGDYcGHlshiUulCgRnXHwRmH8AwEX1rhcph29ne1k1d
-8ZTWaaSScHc2cEcrAWYIEOnTuc2X3qV9/vGjLGIP/cUnjkXLIIQKtFcO+IsP+jINfJ1Fqqsq7Eo2
-V9NwkblL09gZge9Mlu8sEy+PDIVrdL6JLLTHZwkI7QNY+6I6EO5z3pAPI6RQcMXxBVccX3DF8QVX
-HBrKhiVLAd0ZCIQyKdARfqDNzM57JBbA5JDh0FTHR7PoQFsWAlavDKo2HlgHi/P6j7C14yALB5RF
-HAtagMAgTUITZQEVjnWZpHCXSfPEEay13DNoYiqII3zgPYHKZEDfxMKrs4CG5UGknoDuBmd0uqeo
-sMrmykwjTETSeFisQ+DasgogoiKhaGsDAOls9Ggs6hnR6JZzS6DFaGQm2qAuDN5NvLbINHSz8jLQ
-jmb0ga80gr42YQEhpFlQmjQSEEWjsSzyCP2QPN6G8PzuIBBBRvhSKlAfDvwdxDZaS/YF1oBD8XFI
-KY4AMob3A7QCknJyAI0ZTUsgWXQdWnYdWsERApVFi4Q3LwveE0veEz40ayCHxAZjCwLiaIbtRwgj
-aIDcVVUNzi8eWU+QV1zPc2VfMh7xGyMhCXfgQLAe8rJeuQTep/rjsYXbYPc4BguM9KaOnx1PSwgx
-S5pO359+3ecihejZMfLHkmbT0ZuKXAgDXy4uTyvfPu/C1Q0GGhX3i3YFfu/wvj3ebTdJg27ywKpj
-y/Am5jldmeMXczftGn3ovdsQg1Ztr5DCBjvfBweCUhZp9XOgFirnfjxz/qyR3YrkUSl54wrnPo+P
-9C5yTFvH1F1XcPubPf66zcxByT+TlaoS/R/3a01Jt2+qcK9tljhxWGei45vmr7kGT9cdO+Ns67N/
-tDthydELGXdf7/46okLDzezaacNPZgVDUrZVTSob/1XzcMsUms0tm931pPfyqaoXDyukTL0ZSdI0
-fV4yfEvK60f3JtHP1qUVpc2znVLpU8pWn/bJuUXtTuXC4IV4GJokBPRVeG/XiwvgyBaHbR6ZyqTR
-E8zNYLl07c2YixSFFe3Lzi25Nd//9sV+A2eaF65zN98xH2k0WhhF1n6k3frIt1xarpiwtKC9Y4/j
-r4OrvzZmvSBp5O2VvvjU3fl6VONMx5KFiyuWFewaSAhOil++Y+6j41PP+t3a4VBloV048gQlW1V5
-5QPfs+MOuoXfqiDeHu35yDrUYOGu9BlTa3Vzt2g+sfW+80ljXK3dtINrd1ewj16kVG7xLV14yKTZ
-U5Jhl+Ud/Sx0227zpoBz63bT9t4dUH381Nd7P3GiGho7e73GEnC0CsGeQbGiaNNp5jzlWDDqiqQx
-oYUoVI6Vu0giujTO3zZr3QO7sGIjz9Ci6weLPyPum7Rcy7fezn9U29y0xO5Gg3rNxjGKk0w2ySiu
-olWZrTz5dp7JLu3dD0f2v2xCbyzv8/xlUr+KY2vUGkZdTfCfr1+zbtmB43Wke8eH1Oi1m9RNOW0Q
-47jaa0LLnQ7jp56tQwbJ4e1FV/7gq6G0JeDmeIWEeYNQ5S1gtV9Pqlqt7aVRYv5sYdQ3s9Z9wbpL
-aDt8fV9rPppY5J5mM25UyJZXZv6BeUcoy6flfy46vE7xtCTzup6J9kjSoJwfFtIbDb57vd73KmhW
-9viiSOmj4TmapdUh385NKJnTXjPXN9Auznn1nlnLT5NMXn6p0e7TcLEiq2pkUcuXtYY7xl3vWOpR
-oeC//klayZWykvmtmSWPPWQsyyw+uzipyOxu8hpnpnyNZrGMasA4PNDnSfHQJouMt9f6Nmt6vdhq
-t7P5j8LbRuUrDc7nbO131yn3ZoX6XLXC2yXH/Z0K3uaN3Ca9M2ttdgx9VNTr18f2EkNNv2XNjVw5
-c15u5JUbhl82fHRctXSp+bAFnuyvzcF211tIatuZa/fr2d1euGHyIMrwAy+Hfn1qkG9NKNt6q+pT
-LJJdfIqacL+fLXO+VvLOgInR1y7f1fz88JxrLlXR71tLtWOU0qtA+biWQ+3xb5a/Cmu0MarRff3E
-a4fTxFtlsX6rlGe9da3e/0lC/pCr8fkjS+KCzizZGg2QthsMrXOdUDbiXMmk6UobrOa0LD15cdrd
-/bRr8uoe7gNCYlYNHfPs/MTVtwKueCF+LqsMRjmcnvJ0aJ6beofKQMNNSV7hKq5PTP3LJBUmxGT7
-FyqxawyrfR+SWxB99z/e4QeFRo589+5SVmbh6y+zXPfFudSfX/DzebNv3JRfP57X7LMzZ2dXHQic
-xFxhNCmXuXBeR8fChR+WdXxf2/DrXbPz7T0n35VdKvn+YmrDz/et3+9eXCUfcPbnqxWznH++/dxa
-8vPzzxyltpA0H+8vSy9NTOp4d7pj5eXDLjIL55WZG1qkEI8Y+Eme0dm7wrIouaN25Zl4R/rGt7Ir
-TJrw9ZMcj59K0z+fccniwzmjE8nlqbcGNPlIPA5I0NTYsj9j2VzmecsZa4nDEqrqvFKanzTGyL7M
-PjX+sz791ryR/uRbeMOJc14Nn7nqSFhivlrog0+53kPV6GbnbqbUul+KzpAdegS/hzjMwOILrY1M
-OHiCnvDjUqvFqz8+IfkPRt7XWDnsqi/leGWSzAGDVSGDDY127ixduy51skF5rJPNDHe90jvy3hvs
-NlH1Jlsq2++vjf/meJXCOKl7J5Guf9pgl9lmr5UWakOn7fpJuDym70zvjKuXFgz20fNI71g3qu+P
-3AfDPc4t0fUrqq3zJZx4/LPR422/jH2j9hCIn6pWDZ83W8ZqyILy2GFe97NpZxxOFMXmqEWyPgbJ
-Dzm2lrKzpX8V5fOAha+mVYeNuf5c6mWxSni2+2u5/cVX0wI/bZmGm57xKnZmwDMVlaCrae8WtzUm
-nK0f7RCbdWll+515umcZD+cRAm9sGK1b/XKP7FnfrT+XJM3Qal6E6IyIb6/5RnELahvXXqZzKJbx
-tZ08V+Fzc8DqK1KfB159Mua6S6gdrT52o+z2e5KeF7yJ1v0OsuTJ67/LqwROOH7/mrHdSbvpjdJR
-qfsXGA6qkNmYf+CE4Y/2Y45pdW9naA04GTqEFlJU8yBnnNJJrU3zT7FLT0QkB1W4K2SH20WGzLKp
-DVnDXthQ8/rR9dpzlefTms7kvNtWfuoNrSgze+2d6+pt8izbV8f0HZtvRTq9q9fPH7qNZVKrris7
-/5X+k75VdMklo310Zz39QYjXLN0xOIGyaFlwfAHN4cazSI8RTQTTxqjdr4YMlE/fM4UQVyG5qd9L
-6i7Gsl37vuRW3c68ERO4OWZndiBpUuqEsnn9ffaEr2JYr75TPPlcRHH1rv3a+NGfLQ1SK+iqiTIp
-zyP8NEflv1x8q7/Bx2tOcqtPLPEcs6fhVMwKKb/r5/DOpx2/bKt/dxHxcCEoNW11zDd2LjxYnzRh
-+IewOXPyLQ4QkjXmquGW7Xq0qrW+eU9N4baZON9gg9T4o6OirrdI+3q8dbdf7WMzR0Ur51Nicfwe
-T98NbjdltgVWR52oL3+697z06bbHLmpWAdWXhrd/WTOHoGfleT3NeYVaWFJqDnG4289XbixcrVlA
-xR3FhdmVRc/clNatHLektSAzYknuyErH0U/TDq3PL140aNiKKEaNlsFSZ9PTtgXZztpD48+0hTvk
-N+2xrmOkGo3ZdWhd453JjT+CVk/V2W/wQO6xY1rEi3rZkHdeBDcTelA2LtLjwmVXm+PPUy+Mnbjl
-6qovjwZ7T3poc2g7S6GwaaWZflagutWGXfGbryUM+2Z6ctG79Qc0FWJyDYYsNZQPnDZ2xx811oe0
-jFecC+y46HaNOeK2CVT9+BpWpEXs8rGa94uaa1adLY0JC70aHbHMN6Bj5rXpccy6oPx1E2QpSQxn
-r5pzLq6U3X0yJ91Vb6qz3s+caRtTm1aFd3ZpI3uWXf22Zs1D0+Jmm7KhOgpT9rxf8njm3bLqeXcm
-xIxpHZLwIWjjZodlzyySzWZ5FlYfXHo0JG2rnlbrFoOx2oc9t1TQYy9knnxa0OR8aGnd1qny3wtH
-D+m/fvEcP+PjZYxzdxUvzknsFzRkyZQ2KXUNzcs1lHMHdUv7SIdE5nyeM+/FU6f6x7cf5xadqvx4
-ed4ktdq+HTUPf62eu9bl9uz63Wsefpp5yD+mtnjHOErL8dFtC3ZM0LL+VlUaVa0c3HZLvmH4nSdb
-g9tl1lD33d39+XvhVn//j8Ft46x215xxPfpIS7qu7yRtiSG+d7wi5CmHnie2ws9LCN+2FW+tyz8B
-jrRx2CNm3ts2NtASHHlwBl5j5coo6ks7Fs8ixMXdOUNMH1S3svrAXYmlz2wUbZ0N/F+3KR40IZit
-oJ7fEF2cs7lCLcyy3iJqrxZh2MvsGXml00+9TnMZp+GT8mB4+OFpi9Pi7Nr6RKaPMRo7yGCckZlF
-LlPJcHTmpupV478mH7TfsTboGXnHTterxdUjOxLnb323ETfvssG5UOLcGkRzvV8e++hPe62USHNd
-jZBf/q4JD5ZJGW2/UvlEf+Neb8lrwWfOXGrobDoOb4p0PxLnTyLG5YIMBIemXYmC4xuoChIKDvW6
-kiZe/MBPkJPguKsr3RPFyUIUD0Ej6Epr5HpsEn5jpNAvOEiBvxDAaCWqkFQwr0sVmPPBLePYS74k
-vpd8/cD80A/8KilJgt8/CFTwF0OIJWwm7CRwP+SyBN3sthQtB4HqR6DpubMhz7ERwhXY4mzMc7wN
-3aiGzR9x6G40BLFC0x1n7i/c+ou+1EsYBLKQTXQmByvuEfbKL46IvpBAJPLgHMbBuakVAG3lzGTD
-iQSE+9EiSyL2ggG8LkNUQC5cuIBAM4XdKAf4cN+chtiyYFY+jqAAMtL5aQHuuQznawkFhAxcgUCN
-U+oUU+cABg7OoJdIM2nMhOg4hiPZwoxCJtEYYXFw/c+RHDh+hKk9mZTAojLCqfQ4Bs2RPJuWQHZ2
-UpRzoA5LiPdjkgA5I2EY1ZEcxWLFDzM3TwgDJkBNMIuLpzHAtYg45nQqC5wyI83DmdRZgO10urkl
-hWJrPp0azSA7QT5x9OjwEdF0OnoC6WnudCZpJpXuSA6NtCCbOzmYC2DRGaRZjuShNpY2ZFIYNd6R
-HEGnssDh9PhwR3ICI5JMotIjQXvCWMzfimAlWaA49MTpY+PCMZiFDYVCgYJRsG9EBAa254LNebgI
-144Zl8gIx7DoDAigRUTQwljeCSwOKVCcUwDopQACtn8LJmvQ2xKgtyVQC5REexdagD9RmfPZCxl0
-oz24oEiERk/ABaALWdGgTEBXp/2Jagi65gJCznAE5QNtC4Lx/GCY/IHJSXAWSqTBMfd9fCh0Kmq0
-0Phggl/NIQBDg8ZnVVmJGiAkhGvo8ihmBFEa14STfwtfUUpGeS7CBW+swS/GQXlL4FcP8EvR42W4
-jwhCXF4KcVag5UoUPwUtV6HlarRMRcs1aJmGlmvREnunNx0tM9AyEy2z0DIbLdejZQ7KPxc93oCW
-eWi5ES03we9NuJTg+iO6yFGE/A5+WWkL+n2GfLTcCrFI21Ae21HIDrQsQOGFKHwnCtmFliUAPg2R
-JXK/1oOg4WIs+HPgcUoFASdV4rh2AYGN8DvpItzo7O2sF8hf30mp2INj0Y4KS0YcPO+pRyjxeIQn
-al7cKwo8V3rkK/hufMVSlK/gwV+PfQXXKbR7X2FHIJ2+YiPWV9rmW/zjKyJ9BcfnK7hufeVeWseN
-/x5fsfwL+opEN75iJcpXJMBfj30Fj8oR7yvr16/v9BU7sb5SWFj4j6+I9BU8n6/gu/WVy5PvNf/3
-+IrV/66veIDRN9yrbkCEZjuQSAI2jlnzmLdsdvmHrs8WUcAMgjIYM2xfojqCR4Q/zTUIcNFAXYL7
-UIvbQXhOBxUSOkDuoihVzc9o+hc7h5X07+mc0Ljw2X5MbBicwApgzabT0JN4tACqBT/htIhxKI55
-J4jGCPejMqkATKJTYW1pDNPAAE43xqMlrGFnx3DVBtUP1S4hVu1H/pTaIe8RROg5rkRVlAuCTAKE
-y4BV+Mjxc4N7sW4Bul/g2mhgGzpEVSEJGAWJSOBMGnFIKAcLh3Q9wGzv7G5u4p5Lcs6DwHkQAX6P
-DWvHACL68ggOzDlFyHTmtK0votcZSbnTQ0nQ4gJCjMBULz9jmopTxri/yFSv02H/FlO4QkISntd1
-pZWttofj/0quS2LGsRzJprYULAGp8WEjopkJLG9qAgv6KKgdGdaU5QuKCHoc6BIanR4dnxCdgMFB
-HeKYc8ikWUzYRwkzEqlMGugaRhgAY53DOXFnMSGzngQLUsIc0POwOqGOZFBGo2WiI5kBtAE1w4yO
-pcGzAPSITIqlMaEeLVESagKNHg21RvlTdmEr2i6semYXcF8jg8SaHU+LoIaBOgyZzjClszB2NKrA
-BRoVuxCWIHAhLIEjCdPHn4mdWwgDkC08tgeXzpBoMIlpMAPjsWnyYMxBMOLDUOdgSDb4o/FJcsy4
-zjjFjcTcqASjJYx6OEQwwainSxwsIjaJTro4cRGNJDKiwQTHhgpgjKOHxmzBZTDeKArrWEC4IzDK
-sdq+N8X+eTHyF4x7PR+5FBCm8oVzHGgWDOdef5Fw/jeM4S5HqP/E8H9i+P9KDBcVddV55nmCcbcv
-URrRRh6BMzJRrvOKMtIH0IyQAmNnMF5VBL9w4CyDw3eOaeH2Tg/O9RQEe6GeO8KGUVl4YuOMuBj+
-foTdV2iELfjoghvJO1fEeD766sPz6EKKA+Oey3KYdj3KwJJwnKduLw3ZL/FfHudFPQvYTHAAuauh
-ZfyPEX+bCgnxQoFt8l8wsP0T0P4+AU30oFQZDErhJ0ngoJRr6bI8ls6FSYmAITywXQQPkLtgWIiw
-AVP1X0qjFZAeJ97Qt1EK+/cG4SBuHUAZOqO15g19X9lwKAqm0gj28Q4Y+vrxhT5FInx7oy9uPBKF
-RKOLpljJQt8oIiFh4BduymahMO4+cixYSvQ6WHKD8e+DYwLyNw2OhuBOiOleMEx+7OV3xXcSvuJ3
-8tBT9u7Oa/4XwyQzOixqBJP1t46UFtZ/MlSCJqDof/OQiRXCARNESqckwYQGUJS6e1o+hfExEqDu
-QbDmGGg38VoTi9foeEPUEq3girWpQdX/lxVr0QqTAgoLRvhvcIo8CkPw2KMHbJwPP2tCQx8uSOJ1
-OvmgHyiHb2NFdr4PacFBwP0OAS8eAde9CEsOQrciuAjdisAQ8N2LsOIgdCuCi9CtCAxBonsR1hyE
-bkVwEboVYY32CA6RwHMfEmHbvlRcMAiuEyLBgfDMiFAI70qZJAcCYXkbYFLhQASpeOdVChwIpKqq
-hOmHMwbpwiKgOLz/J0WVA4FU2DY3aQ6ki0rdhYY+VXHCyyES0lz4FsJgPltG9whG4xGphpnoUAy+
-HmeKBCIB4JgZsYWwSY0Xe6Uahi3TYIWkArvn3zxqnCkbAJ8Bm/TsTSab4Cx72iJizG2ptTprPb8m
-p1uNMsk4QitG32Ty4LzJlPCi3qrp03PKxxhfvT/KB+5/j1c/MuN484mlHW0BM+UHD3qmNbd8fFk6
-mb73+upPn1uMB798PtEtJ6PkzrC8NOnU0x8ujYue3I9SYXPs4Y6vF9Z/TPR/HNVkr7LLZM0AvwO6
-u0tD8u82uW7xNVj0jfDql0H/o6Nd2ufGUmT31Cf8NB24UY35cpP1kaNOU2SlW47KhjW/SD7dHhik
-Rh/7StF9TqkrhZWh97L1a6rJjmU/ZpVbXT0YvX/bww11pNZ0bnLjq6BEv7rlJa+Ca0tYHtVKI5Yf
-fyrlfenhuqdNKbKGe15/yV80oSF507kF8799rHl5p8En33H4/G9jnE7OpD3Q2Wpg3Vb/68unBvPz
-b399+7Ti5M2Sip1TLsursZ+/MG/48au8+PHFVdf9Ns3//r5qX05kw/xPL3xv6tR32GttfKuScuTt
-mydq7U6rqYuUfiVVmkdYrCJamH7O8NsquWdS/1/fLYuqZ2msJMswdB/NmHfVNWbyheAP5RqN1Esv
-Muwd6tNC5ZMu9auLfKy57FGMmX7ljtmqZwxfJKjN0t0WVvs4JGvipDc3A6onPmU+WHPY88MAzxQP
-PZ/DH+862l68f+SM19KJMxzJajckN45uV3n3WWXG8nCPK0E22SNkDJafNZksqdcQRE8bMOd76pmg
-uovltqqfpbcrvdf3PkCpd0tICc25rrJqj+ZbdwP9vhWNi329J08deZW10vjDN5xGGS0h5+KcNQUN
-0htm7Pq50ixUu2LghtPzBpCveIevrTqjsiqg78yR6MtMEX7brxaXF8gvuPRaZ/tBPWWjB7lvVkgG
-v3SaqjgguSwv6xref9bzx+nXg3MnfRo+udq47I+YrbiJZwZkPpucPjW940qJYTtpe2RDSfz+lhiD
-urb718qlLs9bq/aCMWxi+tuxpwIb31gOWKc89eTcqC2PLx4OvLexll30s4T+nT37Qf2x/ENT9o+Z
-L/0yqPze61MHldvfXTn6PctvWJb8KuVlTuflW0aXItLZmxcYXL58dLJWqe/xTCpevi+zYLrDjWcv
-PEZcJBTGXzn09dooI2bttrfjBj1pObRi8/k+W2406WuEr91/PG+OQ9Uld9KktAnal+0dGFcV6ujZ
-a6nL5lbZqmtmpiYXnSPIhlluvHRiiUfs0N2LC3Rv6EUpqc6hTSjb3jZtRsjpqTtj1kj5DSnClw9S
-VgrWKfGXUaMs3jXYY8bW91mFczaE6JTtq/y4c9offZDIlTSprA2MIQe1c3YFddRvODGyX3NEZnX6
-LUdvD8KU+pa+g2fLfVA8otGcccUzoc4sIOZWwLaJb5ZnjGj9Vrx4xoPJS+r22lZfGi+Xl2SoU3K6
-Ljljw9ZjTb6Nt3QXXDG+m+ZXHuLhnuRpm+7w6G2O//os+Qfu5Gv4g56GAV0vBU0dLzH22PIoxnFT
-4lLl9ZO1w5vd9WVGncxM3RXgkB7xcI1Kn5evVdWdHkndKH744/00WsXzdW+o6puSwoa96FDJmrgj
-MACnsDLZzuW4SR5u0YS8ZeuyP528nct8YNNg/Err2hWVsfpZs9QDKq1OrX+/OO384NBpk5tjlydr
-6VVoN9qPV7ynsLdm7OqD6TPu30+8aTcu3crj6OsN6/fuPvhSIyB2OU17Ykpzc97Z0hjN0KiciBU3
-8z7ufXYi54+TTB+jM5KSZ1fm72g979VqtzsbfSUo8X8mGTZrbv+tvck7DxSv2Os/2WCWf/HLMtU8
-1/4CP/bm6a/+JGyP2mpgEjtPu3TJ2vr8N/+YsdUamTuWye0BsrQZSdxMc5DrkIGAy/um/wLf8i5X
-CUxU29txYbLCV2anTbnNuUKTNL69v7uY9eDjNxvy0149s/V/02oY+Z4lxJWTZ+63Y7scD+zd/abv
-QFDYuRUnrUU2JDS55Zl/5VWf+lKz10zFTWQ6S49lu/Bzz36L1SE/Gvrm3DsemTqp8IHjy3apCe9P
-fzrw2Jz5SdfJKGWFbcuYruk2Tvq/ufZ+dG/6+vnGu/4oN6W/ag2fJb3WkWm1RYLYBqtw1lA2vex9
-szQQu4lQt5KgNwlRAUVbakDb8MnaUiNL4pYa9MofAW5hMwmlKYBuFnqSQAABTrK21qQCDRIEd0jZ
-gf2ZF+zobfLbdb+ZPjBA1kIKM3AwYQlyhUUsTBoLsMz2jIIRBWom7Pc7AuxvlKvcU/zUNUuErSXg
-svQPY8UdDysY4l9tE8wUOvqwpLb60r2NCgndyf//1BZttvTzk9HYyBt3eOsaxwnmCzfXXfiwr3rd
-O4cCt/sLueeZnDmyIVNff9ZdmU5Xz+prBs9k3k9NMr7UouOsEm9V6yH8LGiZo6uJvMWEXStfR6c2
-nX9SPHW67AWz/iuPl59+9DJin79ap0xzhQWvng6vxOLNbMWGoez3/y4ISW/SOVna5i79c1VGw6+p
-G0r+sc0pzn9qcrJMZduMT9p+rs4zN+6Jz3Awzv/+6b9p9/MjoS+qsz3WeW5Xe/wv2nft9Jz9DNgK
-a6XE038OAFmy4IKGgwmpaBnNIKMABHLOHwR1yNke/E54n1AS
<TRUNCATED>
[2/6] tika git commit: TIKA-1321 -- add SAX based docx parser and
integrate it with the recent 2006ml parser work -- initial commit
Posted by ta...@apache.org.
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/test/resources/test-documents/testWORD_2006ml.docx
----------------------------------------------------------------------
diff --git a/tika-parsers/src/test/resources/test-documents/testWORD_2006ml.docx b/tika-parsers/src/test/resources/test-documents/testWORD_2006ml.docx
new file mode 100644
index 0000000..682a64f
Binary files /dev/null and b/tika-parsers/src/test/resources/test-documents/testWORD_2006ml.docx differ
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/test/resources/test-documents/testWORD_2006ml.xml
----------------------------------------------------------------------
diff --git a/tika-parsers/src/test/resources/test-documents/testWORD_2006ml.xml b/tika-parsers/src/test/resources/test-documents/testWORD_2006ml.xml
index 920bfa2..71dbf50 100644
--- a/tika-parsers/src/test/resources/test-documents/testWORD_2006ml.xml
+++ b/tika-parsers/src/test/resources/test-documents/testWORD_2006ml.xml
@@ -1,631 +1,760 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
-<pkg:package xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage"><pkg:part pkg:name="/_rels/.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="512"><pkg:xmlData><Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties" Target="docProps/app.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties" Target="docProps/core.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument" Target="word/document.xml"/></Relationships></pkg:xmlData></pkg:part><pkg:part pkg:name="/word/_rels/document.xml.rels" pkg:contentType="application/vnd.openxmlformats-package.relationships+xml" pkg:padding="256"><pkg:xmlData><Relationships xmlns="http://schemas.openxmlformats.org/package/2
006/relationships"><Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/endnotes" Target="endnotes.xml"/><Relationship Id="rId13" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart" Target="charts/chart1.xml"/><Relationship Id="rId18" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header2.xml"/><Relationship Id="rId26" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme" Target="theme/theme1.xml"/><Relationship Id="rId3" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/numbering" Target="numbering.xml"/><Relationship Id="rId21" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header3.xml"/><Relationship Id="rId7" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footnotes" Target="footnotes.xml"/><Relationship Id="rId12" Type="http://schemas.openxmlfor
mats.org/officeDocument/2006/relationships/hyperlink" Target="file:///C:\data\test.png" TargetMode="External"/><Relationship Id="rId17" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/header" Target="header1.xml"/><Relationship Id="rId25" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/glossaryDocument" Target="glossary/document.xml"/><Relationship Id="rId2" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml" Target="../customXml/item2.xml"/><Relationship Id="rId16" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image2.jpg"/><Relationship Id="rId20" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" Target="footer2.xml"/><Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml" Target="../customXml/item1.xml"/><Relationship Id="rId6" Type="http://schemas.openxmlformats.or
g/officeDocument/2006/relationships/webSettings" Target="webSettings.xml"/><Relationship Id="rId11" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" Target="http://tika.apache.org" TargetMode="External"/><Relationship Id="rId24" Type="http://schemas.microsoft.com/office/2011/relationships/people" Target="people.xml"/><Relationship Id="rId5" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/settings" Target="settings.xml"/><Relationship Id="rId15" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="embeddings/oleObject1.bin"/><Relationship Id="rId23" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/fontTable" Target="fontTable.xml"/><Relationship Id="rId10" Type="http://schemas.microsoft.com/office/2011/relationships/commentsExtended" Target="commentsExtended.xml"/><Relationship Id="rId19" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationshi
ps/footer" Target="footer1.xml"/><Relationship Id="rId4" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles" Target="styles.xml"/><Relationship Id="rId9" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments" Target="comments.xml"/><Relationship Id="rId14" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image" Target="media/image1.emf"/><Relationship Id="rId22" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/footer" Target="footer3.xml"/></Relationships></pkg:xmlData></pkg:part><pkg:part pkg:name="/word/document.xml" pkg:contentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"><pkg:xmlData><w:document xmlns:wpc="http://schemas.microsoft.com/office/word/2010/wordprocessingCanvas" xmlns:cx="http://schemas.microsoft.com/office/drawing/2014/chartex" xmlns:cx1="http://schemas.microsoft.com/office/drawing/2015/9/8/chartex" xmlns:cx2="http://s
chemas.microsoft.com/office/drawing/2015/10/21/chartex" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:wpg="http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" xmlns:wpi="http://schemas.microsoft.com/office/word/2010/wordprocess
ingInk" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" mc:Ignorable="w14 w15 w16se wp14"><w:body><w:sdt><w:sdtPr><w:id w:val="987518934"/><w:docPartObj><w:docPartGallery w:val="Cover Pages"/><w:docPartUnique/></w:docPartObj></w:sdtPr><w:sdtContent><w:p w14:paraId="44B71F4F" w14:textId="29914BFA" w:rsidR="00711569" w:rsidRDefault="0049479F"><w:r><w:rPr><w:noProof/></w:rPr><mc:AlternateContent><mc:Choice Requires="wps"><w:drawing><wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251666432" behindDoc="1" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="43E31E0F" wp14:editId="348304CE"><wp:simplePos x="0" y="0"/><wp:positionH relativeFrom="page"><wp:posOffset>910590</wp:posOffset></wp:positionH><wp:positionV relativeFrom="margin"><wp:align>top</wp:align></wp:positionV><wp:extent cx="6290310" cy="8130540"/><wp:effectExtent l="0" t="0" r="0" b
="3810"/><wp:wrapNone/><wp:docPr id="466" name="Rectangle 466"/><wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/></wp:cNvGraphicFramePr><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"><wps:wsp><wps:cNvSpPr><a:spLocks/></wps:cNvSpPr><wps:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="6290310" cy="8130540"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:gradFill><a:gsLst><a:gs pos="0"><a:schemeClr val="accent1"><a:lumMod val="20000"/><a:lumOff val="80000"/></a:schemeClr></a:gs><a:gs pos="100000"><a:schemeClr val="accent1"><a:lumMod val="60000"/><a:lumOff val="40000"/></a:schemeClr></a:gs></a:gsLst></a:gradFill><a:ln><a:noFill/></a:ln></wps:spPr><wps:style><a:lnRef idx="2"><a:schemeClr val="accent1"><a:shade val="50000"/></a:schemeClr></a:lnRef><a:fillRef idx="1003"><a:schemeClr val="lt2"/></a:fillRef><a:ef
fectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></wps:style><wps:txbx><w:txbxContent><w:p w14:paraId="04A3866B" w14:textId="77777777" w:rsidR="00711569" w:rsidRDefault="00711569"/></w:txbxContent></wps:txbx><wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="square" lIns="274320" tIns="45720" rIns="274320" bIns="45720" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="ctr" anchorCtr="0" forceAA="0" compatLnSpc="1"><a:prstTxWarp prst="textNoShape"><a:avLst/></a:prstTxWarp><a:noAutofit/></wps:bodyPr></wps:wsp></a:graphicData></a:graphic><wp14:sizeRelH relativeFrom="page"><wp14:pctWidth>0</wp14:pctWidth></wp14:sizeRelH><wp14:sizeRelV relativeFrom="page"><wp14:pctHeight>0</wp14:pctHeight></wp14:sizeRelV></wp:anchor></w:drawing></mc:Choice><mc:Fallback><w:pict><v:rect w14:anchorId="43E31E0F" id="Rectangle 466" o:spid="_x0000_s1026" style="position:absolute;ma
rgin-left:71.7pt;margin-top:0;width:495.3pt;height:640.2pt;z-index:-251650048;visibility:visible;mso-wrap-style:square;mso-width-percent:0;mso-height-percent:0;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;mso-position-horizontal-relative:page;mso-position-vertical:top;mso-position-vertical-relative:margin;mso-width-percent:0;mso-height-percent:0;mso-width-relative:page;mso-height-relative:page;v-text-anchor:middle" o:gfxdata="UEsDBBQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJU67QAgl6YK0S0CoHGBkTxKLZGx5TGhvj5O2G0SRWNoz/78nu9wcxkFMGNg6quQqL6RA
0s5Y6ir5vt9lD1JwBDIwOMJKHpHlpr69KfdHjyxSmriSfYz+USnWPY7AufNIadK6MEJMx9ApD/oD
OlTrorhX2lFEilmcO2RdNtjC5xDF9pCuTyYBB5bi6bQ4syoJ3g9WQ0ymaiLzg5KdCXlKLjvcW893
SUOqXwnz5DrgnHtJTxOsQfEKIT7DmDSUCaxw7Rqn8787ZsmRM9e2VmPeBN4uqYvTtW7jvijg9N/y
JsXecLq0q+WD6m8AAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAX3Jl
bHMvLnJl
bHOkkMFqwzAMhu+DvYPRfXGawxijTi+j0GvpHsDYimMaW0Yy2fr2M4PBMnrbUb/Q94l/f/hMi1qR
JVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb25HMsYhqlCwG5lrLq9biZkxWOiqY
22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/sFB2T0FQ7R0nTNEV3j6o9feQzro1i
OWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3pcvwCAAD//wMAUEsDBBQABgAIAAAA
IQBM8ucW1wIAAIQGAAAOAAAAZHJzL2Uyb0RvYy54bWysVVtv0zAUfkfiP1h+Z7m0KyNaOlWbhpDK
Nm1De3Ydp4lwfIzttim/nmPnsm4UEIiX6Pjcz3cuOb9oG0m2wtgaVE6Tk5gSoTgUtVrn9Mvj9bsz
SqxjqmASlMjpXlh6MX/75nynM5FCBbIQhqATZbOdzmnlnM6iyPJKNMyegBYKhSWYhjl8mnVUGLZD
742M0jieRTswhTbAhbXIveqEdB78l6Xg7rYsrXBE5hRzc+Frwnflv9H8nGVrw3RV8z4N9g9ZNKxW
GHR0dcUcIxtT/+SqqbkBC6U74dBEUJY1F6EGrCaJX1XzUDEtQi0IjtUjTPb/ueU32ztD6iKn09mM
EsUabNI9wsbUWgrimQjRTtsMNR/0nfFFWr0E/tWiIHoh8Q/b67SlabwulkjagPd+xFu0jnBkztIP
8STBtnCUnSWT+HQaOhKxbDDXxrqPAhriiZwazCzgzLZL63wCLBtUeviL61rKQFtU6QiiATGLg2UY
LXEpDdkyHArGuVAuCSK5aT5D0fFxuOJ+PJCNQ9SxzwY2Bh49hTTW9jBW4vX+KuBs8Myyw4DTgX00
IDLXXZmeMmws
XiqfjQIPRgeT54R2dR0KvXJ7KbyeVPeixCnAnqR/AslWrBAdGKe/zC049J5LjD/6
RlAmx9xLl/opwxJ6dW8pwvaOtr/FsjMeLUJgUG40bmoF5njkZIjc6Q8Ydch4kFy7atG/J1dQ7HFb
DHRnxGp+XeNYLpl1d8zg3cBRxlvobvFTStjlFHqKkgrM92N8r4/rjFJKdniHcmq/bZgRlMhPCoc2
fT+dpP5yhdf09L1/mBei1aFIbZpLwLlO8O5qHkhv4ORAlgaaJzyaCx8XRUxxjJ5T7szwuHTdhcSz
y8ViEdTwXGnmlupBc+/cQ+wX77F9Ykb32+lwsW9guFose7Wkna63VLDYOCjrsMHPyPbg46kLw9Cf
ZX9LD99B6/nnMf8BAAD//wMAUEsDBBQABgAIAAAAIQAJRQxG2gAAAAoBAAAPAAAAZHJzL2Rvd25y
ZXYueG1sTE9LTsMwFNwjcQfrIbGjTpOA2hCnQiAO0LTA1rXdJMJ+jmy3TTg9ryvYzWhG86k3k7Ps
bEIcPApYLjJgBpXXA3YC9rv3hxWwmCRqaT0aAbOJsGlub2pZaX/BrTm3qWMUgrGSAvqUxorzqHrj
ZFz40SBpRx+cTERDx3WQFwp3ludZ9sSdHJAaejma196o7/bkBPxs+XoXVZrfis/w+OVsm3+oWYj7
u+nlGVgyU/ozw3U+TYeGNh38CXVklnhZlGQVQI+u8rIoCR0I5ausBN7U/P+F5hcAAP//AwBQSwEC
LQAUAAYACAAAACEAtoM4kv4AAADhAQAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNd
LnhtbFBLAQItABQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAAAAAAAAAAAAAAC8BAABfcmVscy8u
cmVsc1BLAQItABQABgAIAAAAIQBM8ucW1wIAA
IQGAAAOAAAAAAAAAAAAAAAAAC4CAABkcnMvZTJv
RG9jLnhtbFBLAQItABQABgAIAAAAIQAJRQxG2gAAAAoBAAAPAAAAAAAAAAAAAAAAADEFAABkcnMv
ZG93bnJldi54bWxQSwUGAAAAAAQABADzAAAAOAYAAAAA
" fillcolor="#deeaf6 [660]" stroked="f" strokeweight="1pt"><v:fill color2="#9cc2e5 [1940]" rotate="t" focus="100%" type="gradient"><o:fill v:ext="view" type="gradientUnscaled"/></v:fill><v:path arrowok="t"/><v:textbox inset="21.6pt,,21.6pt"><w:txbxContent><w:p w14:paraId="04A3866B" w14:textId="77777777" w:rsidR="00711569" w:rsidRDefault="00711569"/></w:txbxContent></v:textbox><w10:wrap anchorx="page" anchory="margin"/></v:rect></w:pict></mc:Fallback></mc:AlternateContent></w:r><w:r w:rsidR="00711569"><w:rPr><w:noProof/></w:rPr><mc:AlternateContent><mc:Choice Requires="wps"><w:drawing><wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251667456" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="4038FA82" wp14:editId="35151E3F"><wp:simplePos x="0" y="
0"/><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionH relativeFrom="page"><wp14:pctPosHOffset>45500</wp14:pctPosHOffset></wp:positionH></mc:Choice><mc:Fallback><wp:positionH relativeFrom="page"><wp:posOffset>3536315</wp:posOffset></wp:positionH></mc:Fallback></mc:AlternateContent><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionV relativeFrom="page"><wp14:pctPosVOffset>66000</wp14:pctPosVOffset></wp:positionV></mc:Choice><mc:Fallback><wp:positionV relativeFrom="page"><wp:posOffset>6638290</wp:posOffset></wp:positionV></mc:Fallback></mc:AlternateContent><wp:extent cx="2797810" cy="268605"/><wp:effectExtent l="0" t="0" r="0" b="0"/><wp:wrapSquare wrapText="bothSides"/><wp:docPr id="465" name="Text Box 465"/><wp:cNvGraphicFramePr/><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"><wps:wsp><wps:cNvSpPr txBox="1"/><wps:spPr><a:xfrm><a:off x="0" y="0"/><a:
ext cx="2797810" cy="268605"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/><a:ln w="6350"><a:noFill/></a:ln><a:effectLst/></wps:spPr><wps:txbx><w:txbxContent><w:p w14:paraId="338CAC5A" w14:textId="21AD983E" w:rsidR="00711569" w:rsidRDefault="00711569" w:rsidP="00711569"><w:pPr><w:pStyle w:val="NoSpacing"/><w:rPr><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/></w:rPr></w:pPr><w:sdt><w:sdtPr><w:rPr><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/></w:rPr><w:alias w:val="Author"/><w:id w:val="15524260"/><w:dataBinding w:prefixMappings="xmlns:ns0='http://schemas.openxmlformats.org/package/2006/metadata/core-properties' xmlns:ns1='http://purl.org/dc/elements/1.1/'" w:xpath="/ns0:coreProperties[1]/ns1:creator[1]" w:storeItemID="{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"/><w:text/></w:sdtPr><w:sdtContent><w:r><w:rPr><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/></w:rPr><w:t>This is the Author</w:t></w:r></w:sdtContent></w:sdt></w:p></w:txb
xContent></wps:txbx><wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="b" anchorCtr="0" forceAA="0" compatLnSpc="1"><a:prstTxWarp prst="textNoShape"><a:avLst/></a:prstTxWarp><a:spAutoFit/></wps:bodyPr></wps:wsp></a:graphicData></a:graphic><wp14:sizeRelH relativeFrom="page"><wp14:pctWidth>36000</wp14:pctWidth></wp14:sizeRelH><wp14:sizeRelV relativeFrom="margin"><wp14:pctHeight>0</wp14:pctHeight></wp14:sizeRelV></wp:anchor></w:drawing></mc:Choice><mc:Fallback><w:pict><v:shapetype w14:anchorId="4038FA82" id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe"><v:stroke joinstyle="miter"/><v:path gradientshapeok="t" o:connecttype="rect"/></v:shapetype><v:shape id="Text Box 465" o:spid="_x0000_s1027" type="#_x0000_t202" style="position:absolute;margin-left:0;margin-top:0;width:220.3pt;hei
ght:21.15pt;z-index:251667456;visibility:visible;mso-wrap-style:square;mso-width-percent:360;mso-height-percent:0;mso-left-percent:455;mso-top-percent:660;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal-relative:page;mso-position-vertical-relative:page;mso-width-percent:360;mso-height-percent:0;mso-left-percent:455;mso-top-percent:660;mso-width-relative:page;mso-height-relative:margin;v-text-anchor:bottom" o:gfxdata="UEsDBBQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJU67QAgl6YK0S0CoHGBkTxKLZGx5TGhvj5O2G0SRWNoz/78nu9wcxkFMGNg6quQqL6RA
0s5Y6ir5vt9lD1JwBDIwOMJKHpHlpr69KfdHjyxSmriSfYz+USnWPY7AufNIadK6MEJMx9ApD/oD
OlTrorhX2lFEilmcO2RdNtjC5xDF9pCuTyYBB5bi6bQ4syoJ3g9WQ0ymaiLzg5KdCXlKLjvcW893
SUOqXwnz5DrgnHtJTxOsQfEKIT7DmDSUCaxw7Rqn8787ZsmRM9e2VmPeBN4uqYvTtW7jvijg9N/y
JsXecLq0q+WD6m8AAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAX3JlbHMvLnJl
bHOkkMFq
wzAMhu+DvYPRfXGawxijTi+j0GvpHsDYimMaW0Yy2fr2M4PBMnrbUb/Q94l/f/hMi1qR
JVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb25HMsYhqlCwG5lrLq9biZkxWOiqY
22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/sFB2T0FQ7R0nTNEV3j6o9feQzro1i
OWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3pcvwCAAD//wMAUEsDBBQABgAIAAAA
IQDGYqwVOAIAAGoEAAAOAAAAZHJzL2Uyb0RvYy54bWysVNuO2jAQfa/Uf7D8XhIot0WEFd0VVSW0
uxKs9tk4DokUX2obEvr1PXaARds+VX1x5ubxzDkzmd+3siZHYV2lVUb7vZQSobjOK7XP6Ot29WVK
ifNM5azWSmT0JBy9X3z+NG/MTAx0qetcWIIkys0ak9HSezNLEsdLIZnraSMUnIW2knmodp/kljXI
LutkkKbjpNE2N1Zz4Rysj52TLmL+ohDcPxeFE57UGUVtPp42nrtwJos5m+0tM2XFz2Wwf6hCskrh
0WuqR+YZOdjqj1Sy4lY7Xfge1zLRRVFxEXtAN/30QzebkhkRewE4zlxhcv8vLX86vlhS5RkdjkeU
KCZB0la0nnzTLQk2INQYN0PgxiDUt3CA6YvdwRgabwsrwxctEfiB9emKb0jHYRxM7ibTPlwcvsF4
Ok5j+uT9trHOfxdakiBk1IK/CCs7rp1HJQi9hITHlF5VdR05rBVpMjr+OkrjhasHN2oVYkWchnOa
0FFXeZB8u2sjBteudjo/oVmru4Fxhq8qVLRmzr8wiwlBE5h6/4yjqDVe1meJklLbX3+zh3gQBy8l
DSYuo+7ngVlBSf1DgdK7/nAYRjQqw9FkA
MXeena3HnWQDxpD3cd+GR7FEO/ri1hYLd+wHMvwKlxM
cbyd0d1FfPDdHmC5uFguYxCG0jC/VhvDQ+qAW8B7274xa86keND5pC+zyWYfuOliw01nlgcPhiJx
AecOVbAYFAx05PO8fGFjbvUY9f6LWPwGAAD//wMAUEsDBBQABgAIAAAAIQBTzbbv3gAAAAQBAAAP
AAAAZHJzL2Rvd25yZXYueG1sTI9PS8NAEMXvgt9hGcFLsZvEUkuaTSmCBxGh9g/0uM2OSTQ7G7Lb
NPXTd/RSL8Mb3vDeb7LFYBvRY+drRwricQQCqXCmplLBdvPyMAPhgyajG0eo4IweFvntTaZT4070
gf06lIJDyKdaQRVCm0rpiwqt9mPXIrH36TqrA69dKU2nTxxuG5lE0VRaXRM3VLrF5wqL7/XRKhgt
w/bt9T0erfb9/ml3jpPZ10+i1P3dsJyDCDiE6zH84jM65Mx0cEcyXjQK+JHwN9mbTKIpiAOL5BFk
nsn/8PkFAAD//wMAUEsBAi0AFAAGAAgAAAAhALaDOJL+AAAA4QEAABMAAAAAAAAAAAAAAAAAAAAA
AFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAOP0h/9YAAACUAQAACwAAAAAAAAAA
AAAAAAAvAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAxmKsFTgCAABqBAAADgAAAAAAAAAA
AAAAAAAuAgAAZHJzL2Uyb0RvYy54bWxQSwECLQAUAAYACAAAACEAU822794AAAAEAQAADwAAAAAA
AAAAAAAAAACSBAAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAAEAAQA8wAAAJ0FAAAAAA==
" filled="f" stroked="f" strokeweight=".5pt"><v:textbox style="mso
-fit-shape-to-text:t"><w:txbxContent><w:p w14:paraId="338CAC5A" w14:textId="21AD983E" w:rsidR="00711569" w:rsidRDefault="00711569" w:rsidP="00711569"><w:pPr><w:pStyle w:val="NoSpacing"/><w:rPr><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/></w:rPr></w:pPr><w:sdt><w:sdtPr><w:rPr><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/></w:rPr><w:alias w:val="Author"/><w:id w:val="15524260"/><w:dataBinding w:prefixMappings="xmlns:ns0='http://schemas.openxmlformats.org/package/2006/metadata/core-properties' xmlns:ns1='http://purl.org/dc/elements/1.1/'" w:xpath="/ns0:coreProperties[1]/ns1:creator[1]" w:storeItemID="{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"/><w:text/></w:sdtPr><w:sdtContent><w:r><w:rPr><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/></w:rPr><w:t>This is the Author</w:t></w:r></w:sdtContent></w:sdt></w:p></w:txbxContent></v:textbox><w10:wrap type="square" anchorx="page" anchory="page"/></v:shape></w:pict></mc:Fallback></mc:AlternateContent></w:r><w:r w
:rsidR="00711569"><w:rPr><w:noProof/></w:rPr><mc:AlternateContent><mc:Choice Requires="wps"><w:drawing><wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251663360" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="077DE5AF" wp14:editId="03E11211"><wp:simplePos x="0" y="0"/><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionH relativeFrom="page"><wp14:pctPosHOffset>45500</wp14:pctPosHOffset></wp:positionH></mc:Choice><mc:Fallback><wp:positionH relativeFrom="page"><wp:posOffset>3536315</wp:posOffset></wp:positionH></mc:Fallback></mc:AlternateContent><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionV relativeFrom="page"><wp14:pctPosVOffset>2500</wp14:pctPosVOffset></wp:positionV></mc:Choice><mc:Fallback><wp:positionV relativeFrom="page"><wp:posOffset>251460</wp:posOffset></wp:positionV></mc:Fallback></mc:AlternateContent><wp:extent cx="2875915" cy="3017520"/><wp:effectExtent l="0" t="0" r="0" b="0"/><w
p:wrapNone/><wp:docPr id="467" name="Rectangle 467"/><wp:cNvGraphicFramePr/><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"><wps:wsp><wps:cNvSpPr/><wps:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="2875915" cy="3017520"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:solidFill><a:schemeClr val="tx2"/></a:solidFill><a:ln><a:noFill/></a:ln></wps:spPr><wps:style><a:lnRef idx="2"><a:schemeClr val="accent1"><a:shade val="50000"/></a:schemeClr></a:lnRef><a:fillRef idx="1"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></wps:style><wps:txbx><w:txbxContent><w:p w14:paraId="13682B9E" w14:textId="3ADEEABC" w:rsidR="00711569" w:rsidRDefault="00711569" w:rsidP="00711569"><w:pPr><w:spacing w:before="240"/><w:jc w:val="center"/><w:rPr><w:color w:val="FFFFFF" w:t
hemeColor="background1"/></w:rPr></w:pPr><w:sdt><w:sdtPr><w:rPr><w:color w:val="FFFFFF" w:themeColor="background1"/></w:rPr><w:alias w:val="Abstract"/><w:id w:val="8276291"/><w:dataBinding w:prefixMappings="xmlns:ns0='http://schemas.microsoft.com/office/2006/coverPageProps'" w:xpath="/ns0:CoverPageProperties[1]/ns0:Abstract[1]" w:storeItemID="{55AF091B-3C7A-41E3-B477-F2FDAA23CFDA}"/><w:text/></w:sdtPr><w:sdtContent><w:r><w:rPr><w:color w:val="FFFFFF" w:themeColor="background1"/></w:rPr><w:t>This is an engaging title page</w:t></w:r></w:sdtContent></w:sdt></w:p></w:txbxContent></wps:txbx><wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="square" lIns="182880" tIns="182880" rIns="182880" bIns="365760" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="b" anchorCtr="0" forceAA="0" compatLnSpc="1"><a:prstTxWarp prst="textNoShape"><a:avLst/></a:prstTxWarp><a:noAutofit/></wps:bodyPr></wps:wsp></a:graphicData></a:graphic><wp14:s
izeRelH relativeFrom="page"><wp14:pctWidth>37000</wp14:pctWidth></wp14:sizeRelH><wp14:sizeRelV relativeFrom="page"><wp14:pctHeight>30000</wp14:pctHeight></wp14:sizeRelV></wp:anchor></w:drawing></mc:Choice><mc:Fallback><w:pict><v:rect w14:anchorId="077DE5AF" id="Rectangle 467" o:spid="_x0000_s1028" style="position:absolute;margin-left:0;margin-top:0;width:226.45pt;height:237.6pt;z-index:251663360;visibility:visible;mso-wrap-style:square;mso-width-percent:370;mso-height-percent:300;mso-left-percent:455;mso-top-percent:25;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal-relative:page;mso-position-vertical-relative:page;mso-width-percent:370;mso-height-percent:300;mso-left-percent:455;mso-top-percent:25;mso-width-relative:page;mso-height-relative:page;v-text-anchor:bottom" o:gfxdata="UEsDBBQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJU67QAgl6YK0S0CoHGBkTxKLZGx5TGhvj5O2
G0SRWNoz/78nu9wcxkFMGNg6quQqL6RA
0s5Y6ir5vt9lD1JwBDIwOMJKHpHlpr69KfdHjyxSmriSfYz+USnWPY7AufNIadK6MEJMx9ApD/oD
OlTrorhX2lFEilmcO2RdNtjC5xDF9pCuTyYBB5bi6bQ4syoJ3g9WQ0ymaiLzg5KdCXlKLjvcW893
SUOqXwnz5DrgnHtJTxOsQfEKIT7DmDSUCaxw7Rqn8787ZsmRM9e2VmPeBN4uqYvTtW7jvijg9N/y
JsXecLq0q+WD6m8AAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAX3JlbHMvLnJl
bHOkkMFqwzAMhu+DvYPRfXGawxijTi+j0GvpHsDYimMaW0Yy2fr2M4PBMnrbUb/Q94l/f/hMi1qR
JVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb25HMsYhqlCwG5lrLq9biZkxWOiqY
22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/sFB2T0FQ7R0nTNEV3j6o9feQzro1i
OWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3pcvwCAAD//wMAUEsDBBQABgAIAAAA
IQA0ER1KoAIAAJ0FAAAOAAAAZHJzL2Uyb0RvYy54bWysVMlu2zAQvRfoPxC8N5KceqkROTAcuCgQ
JEGSImeaIi0BFIclaUvu13dILW7SoIeiPtCzL08zc3Xd1oochXUV6JxmFyklQnMoKr3P6ffn7acF
Jc4zXTAFWuT0JBy9Xn38cNWYpZhACaoQlmAQ7ZaNyWnpvVkmieOlqJm7ACM0KiXYmnlk7T4pLGsw
eq2SSZrOkgZsYSxw4RxKbzolXcX4Ugru76V0whOVU6zNx9fGdxfeZHXFlnvLTFnxvgz2D
1XUrNKY
dAx1wzwjB1v9EaquuAUH0l9wqBOQsuIi9oDdZOmbbp5KZkTsBcFxZoTJ/b+w/O74YElV5PTzbE6J
ZjV+pEeEjem9EiQIEaLGuCVaPpkH23MOydBvK20d/rET0kZYTyOsovWEo3CymE+/ZFNKOOou02w+
nUTgk7O7sc5/FVCTQOTUYgERTna8dR5ToulgErI5UFWxrZSKTJgVsVGWHBl+Zd9OQsno8cpK6WCr
IXh16iBJQmddL5HyJyWCndKPQiIsofpYSBzIcxLGudA+61QlK0SXe5rib8g+lBVriQFDZIn5x9h9
gMGyCzLE7qrs7YOriPM8Oqd/K6xzHj1iZtB+dK4rDfa9AAq76jN39gNIHTQBJd/u2jgyEegg2UFx
wjGy0O2XM3xb4Ye8Zc4/MIsLhauHR8Lf4yMVNDmFnqKkBPvzPXmwxzlHLSUNLmhO3Y8Ds4IS9U3j
BmSLyWIRVvoVZ19xu8hdzqbzGVrqQ70BnJAMT5LhkUSp9WogpYX6Be/JOmRGFdMc8+d0N5Ab350O
vEdcrNfRCPfYMH+rnwwPoQPSYVSf2xdmTT/PHlfhDoZ1Zss3Y93ZBk8N64MHWcWZPyPbfwO8AXGY
+nsVjszvfLQ6X9XVLwAAAP//AwBQSwMEFAAGAAgAAAAhAHjHifzaAAAABQEAAA8AAABkcnMvZG93
bnJldi54bWxMj0FLxEAMhe+C/2GI4KW4U6vdrrXTRQRF2JOrP2C2E9tiJ1M66W7990YvegkvvPDe
l2q7+EEdcYp9IAPXqxQUUhNcT62B97enqw2oyJacHQKhgS+MsK3PzypbunCiVzzuuVUSQrG0Bjrm
sdQ6Nh16G1dhRBLvI0zesqxTq91kTxLuB52l6Vp725M0dHbExw6bz/3sDTD2uzwUc/a8bpMXnWwo
0cWNMZcXy8M9K
MaF/47hB1/QoRamQ5jJRTUYkEf4d4p3m2d3oA4iijwDXVf6P339DQAA//8DAFBL
AQItABQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAAAAAAAAAAAAAAAAAAABbQ29udGVudF9UeXBl
c10ueG1sUEsBAi0AFAAGAAgAAAAhADj9If/WAAAAlAEAAAsAAAAAAAAAAAAAAAAALwEAAF9yZWxz
Ly5yZWxzUEsBAi0AFAAGAAgAAAAhADQRHUqgAgAAnQUAAA4AAAAAAAAAAAAAAAAALgIAAGRycy9l
Mm9Eb2MueG1sUEsBAi0AFAAGAAgAAAAhAHjHifzaAAAABQEAAA8AAAAAAAAAAAAAAAAA+gQAAGRy
cy9kb3ducmV2LnhtbFBLBQYAAAAABAAEAPMAAAABBgAAAAA=
" fillcolor="#44546a [3215]" stroked="f" strokeweight="1pt"><v:textbox inset="14.4pt,14.4pt,14.4pt,28.8pt"><w:txbxContent><w:p w14:paraId="13682B9E" w14:textId="3ADEEABC" w:rsidR="00711569" w:rsidRDefault="00711569" w:rsidP="00711569"><w:pPr><w:spacing w:before="240"/><w:jc w:val="center"/><w:rPr><w:color w:val="FFFFFF" w:themeColor="background1"/></w:rPr></w:pPr><w:sdt><w:sdtPr><w:rPr><w:color w:val="FFFFFF" w:themeColor="background1"/></w:rPr><w:alias w:val="Abstract"/><w:id w:val="8276291"/><w:dataBinding w:prefixMappings="xmlns:ns0='http://sc
hemas.microsoft.com/office/2006/coverPageProps'" w:xpath="/ns0:CoverPageProperties[1]/ns0:Abstract[1]" w:storeItemID="{55AF091B-3C7A-41E3-B477-F2FDAA23CFDA}"/><w:text/></w:sdtPr><w:sdtContent><w:r><w:rPr><w:color w:val="FFFFFF" w:themeColor="background1"/></w:rPr><w:t>This is an engaging title page</w:t></w:r></w:sdtContent></w:sdt></w:p></w:txbxContent></v:textbox><w10:wrap anchorx="page" anchory="page"/></v:rect></w:pict></mc:Fallback></mc:AlternateContent></w:r><w:r w:rsidR="00711569"><w:rPr><w:noProof/></w:rPr><mc:AlternateContent><mc:Choice Requires="wps"><w:drawing><wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251662336" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="6C7EBF16" wp14:editId="55758F93"><wp:simplePos x="0" y="0"/><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionH relativeFrom="page"><wp14:pctPosHOffset>44000</wp14:pctPosHOffset></wp:positionH></mc:Choice><mc:Fallback><wp:positionH r
elativeFrom="page"><wp:posOffset>3419475</wp:posOffset></wp:positionH></mc:Fallback></mc:AlternateContent><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionV relativeFrom="page"><wp14:pctPosVOffset>2500</wp14:pctPosVOffset></wp:positionV></mc:Choice><mc:Fallback><wp:positionV relativeFrom="page"><wp:posOffset>251460</wp:posOffset></wp:positionV></mc:Fallback></mc:AlternateContent><wp:extent cx="3108960" cy="7040880"/><wp:effectExtent l="0" t="0" r="0" b="0"/><wp:wrapNone/><wp:docPr id="468" name="Rectangle 468"/><wp:cNvGraphicFramePr/><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"><wps:wsp><wps:cNvSpPr/><wps:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="3108960" cy="7040880"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:solidFill><a:schemeClr val="bg1"/></a:solidFill><a:ln w="15875"><a:solidFill><a:schemeClr val="bg2"><a:lumMod val="50000"/></a:sch
emeClr></a:solidFill></a:ln></wps:spPr><wps:style><a:lnRef idx="2"><a:schemeClr val="accent1"><a:shade val="50000"/></a:schemeClr></a:lnRef><a:fillRef idx="1"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:schemeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></wps:style><wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="ctr" anchorCtr="0" forceAA="0" compatLnSpc="1"><a:prstTxWarp prst="textNoShape"><a:avLst/></a:prstTxWarp><a:noAutofit/></wps:bodyPr></wps:wsp></a:graphicData></a:graphic><wp14:sizeRelH relativeFrom="page"><wp14:pctWidth>40000</wp14:pctWidth></wp14:sizeRelH><wp14:sizeRelV relativeFrom="page"><wp14:pctHeight>70000</wp14:pctHeight></wp14:sizeRelV></wp:anchor></w:drawing></mc:Choice><mc:Fallback><w:pict><v:rect w14:anchorId="04809C04" id="R
ectangle 468" o:spid="_x0000_s1026" style="position:absolute;margin-left:0;margin-top:0;width:244.8pt;height:554.4pt;z-index:251662336;visibility:visible;mso-wrap-style:square;mso-width-percent:400;mso-height-percent:700;mso-left-percent:440;mso-top-percent:25;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal-relative:page;mso-position-vertical-relative:page;mso-width-percent:400;mso-height-percent:700;mso-left-percent:440;mso-top-percent:25;mso-width-relative:page;mso-height-relative:page;v-text-anchor:middle" o:gfxdata="UEsDBBQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJU67QAgl6YK0S0CoHGBkTxKLZGx5TGhvj5O2G0SRWNoz/78nu9wcxkFMGNg6quQqL6RA
0s5Y6ir5vt9lD1JwBDIwOMJKHpHlpr69KfdHjyxSmriSfYz+USnWPY7AufNIadK6MEJMx9ApD/oD
OlTrorhX2lFEilmcO2RdNtjC5xDF9pCuTyYBB5bi6bQ4syoJ3g9WQ0ymaiLzg5KdCXlKLjvcW893
SUOqXwnz5DrgnHtJTxOsQfEKIT7DmDSUCaxw7Rqn8787ZsmRM9e2VmPeBN4uqYvTt
W7jvijg9N/y
JsXecLq0q+WD6m8AAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAX3JlbHMvLnJl
bHOkkMFqwzAMhu+DvYPRfXGawxijTi+j0GvpHsDYimMaW0Yy2fr2M4PBMnrbUb/Q94l/f/hMi1qR
JVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb25HMsYhqlCwG5lrLq9biZkxWOiqY
22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/sFB2T0FQ7R0nTNEV3j6o9feQzro1i
OWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3pcvwCAAD//wMAUEsDBBQABgAIAAAA
IQAdj/pWqwIAAN8FAAAOAAAAZHJzL2Uyb0RvYy54bWysVN9PGzEMfp+0/yHK+7hr10KpuKIKxDSJ
AQImntNc0jspibMk7bX76+fkflA6tEnT+pDGsf3Z/s72xeVOK7IVztdgCjo6ySkRhkNZm3VBvz/f
fJpR4gMzJVNgREH3wtPLxccPF42dizFUoErhCIIYP29sQasQ7DzLPK+EZv4ErDColOA0Cyi6dVY6
1iC6Vtk4z0+zBlxpHXDhPb5et0q6SPhSCh7upfQiEFVQzC2k06VzFc9sccHma8dsVfMuDfYPWWhW
Gww6QF2zwMjG1b9B6Zo78CDDCQedgZQ1F6kGrGaUH1XzVDErUi1IjrcDTf7/wfK77YMjdVnQySl+
KsM0fqRHpI2ZtRIkPiJFjfVztHyyD66TPF5jvTvpdPzHSsgu0bofaBW7QDg+fh7ls/NTZJ+j7iyf
5LNZIj57dbfOhy8CNImXgjpMINHJtrc+YEg07U1iNA+qLm9qpZIQe0VcKUe2DL/yaj2KKaPHGytl
SIMNOp2dT
RPyG2Vqt0OIcbJRG/0NyhZ2muOvB+4jHofBoMrgY+SrZSjdwl6JmKkyj0Ii2chJG+Ao
LuNcmDBq86tYKf4WOgFGZIlcDNgdQJ9kC9Jjt9R09tFVpCkZnPM2+p+cB48UGUwYnHVtwL0HoLCq
LnJr35PUUhNZWkG5x1Z00M6ot/ymxma4ZT48MIdDiQ2Eiybc4yEV4MeE7kZJBe7ne+/RHmcFtZQ0
OOQF9T82zAlK1FeDU3Q+mkziVkjCZHo2RsEdalaHGrPRV4AdNsKVZnm6Rvug+qt0oF9wHy1jVFQx
wzF2QXlwvXAV2uWDG42L5TKZ4SawLNyaJ8sjeGQ1Nvvz7oU5201EwGG6g34hsPnRYLS20dPAchNA
1mlqXnnt+MYtknq223hxTR3Kyep1Ly9+AQAA//8DAFBLAwQUAAYACAAAACEAlei4fN0AAAAGAQAA
DwAAAGRycy9kb3ducmV2LnhtbEyPQWvCQBCF7wX/wzJCb3WjFIlpNiLSFnoRYoXgbc1Ok9DsbLq7
avz3nfbSXh4M7/HeN/l6tL24oA+dIwXzWQICqXamo0bB4f3lIQURoiaje0eo4IYB1sXkLteZcVcq
8bKPjeASCplW0MY4ZFKGukWrw8wNSOx9OG915NM30nh95XLby0WSLKXVHfFCqwfctlh/7s9WQXVz
fhHf7HF13FXVrpSH8uv1Wan76bh5AhFxjH9h+MFndCiY6eTOZILoFfAj8VfZe0xXSxAnDs2TNAVZ
5PI/fvENAAD//wMAUEsBAi0AFAAGAAgAAAAhALaDOJL+AAAA4QEAABMAAAAAAAAAAAAAAAAAAAAA
AFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAOP0h/9YAAACUAQAACwAAAAAAAAAA
AAAAAAAvAQAAX3JlbHMvLnJlbHNQSwECLQ
AUAAYACAAAACEAHY/6VqsCAADfBQAADgAAAAAAAAAA
AAAAAAAuAgAAZHJzL2Uyb0RvYy54bWxQSwECLQAUAAYACAAAACEAlei4fN0AAAAGAQAADwAAAAAA
AAAAAAAAAAAFBQAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAAEAAQA8wAAAA8GAAAAAA==
" fillcolor="white [3212]" strokecolor="#747070 [1614]" strokeweight="1.25pt"><w10:wrap anchorx="page" anchory="page"/></v:rect></w:pict></mc:Fallback></mc:AlternateContent></w:r><w:r w:rsidR="00711569"><w:rPr><w:noProof/></w:rPr><mc:AlternateContent><mc:Choice Requires="wps"><w:drawing><wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251665408" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="1A11D97D" wp14:editId="39D15725"><wp:simplePos x="0" y="0"/><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionH relativeFrom="page"><wp14:pctPosHOffset>45500</wp14:pctPosHOffset></wp:positionH></mc:Choice><mc:Fallback><wp:positionH relativeFrom="page"><wp:posOffset>3536315</wp:posOffset></wp:positionH></mc:Fallback></mc:
AlternateContent><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionV relativeFrom="page"><wp14:pctPosVOffset>69000</wp14:pctPosVOffset></wp:positionV></mc:Choice><mc:Fallback><wp:positionV relativeFrom="page"><wp:posOffset>6939915</wp:posOffset></wp:positionV></mc:Fallback></mc:AlternateContent><wp:extent cx="2875915" cy="118745"/><wp:effectExtent l="0" t="0" r="0" b="0"/><wp:wrapNone/><wp:docPr id="469" name="Rectangle 469"/><wp:cNvGraphicFramePr/><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"><wps:wsp><wps:cNvSpPr/><wps:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="2875915" cy="118745"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:ln><a:noFill/></a:ln></wps:spPr><wps:style><a:lnRef idx="2"><a:schemeClr val="accent1"><a:shade val="50000"/></a:schemeClr></a:lnRef><a:fillRef idx="1"><a:schemeClr val="accent1"/></a:fillRef><a:effectRef idx="0"><a:sch
emeClr val="accent1"/></a:effectRef><a:fontRef idx="minor"><a:schemeClr val="lt1"/></a:fontRef></wps:style><wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="ctr" anchorCtr="0" forceAA="0" compatLnSpc="1"><a:prstTxWarp prst="textNoShape"><a:avLst/></a:prstTxWarp><a:noAutofit/></wps:bodyPr></wps:wsp></a:graphicData></a:graphic><wp14:sizeRelH relativeFrom="page"><wp14:pctWidth>37000</wp14:pctWidth></wp14:sizeRelH><wp14:sizeRelV relativeFrom="margin"><wp14:pctHeight>0</wp14:pctHeight></wp14:sizeRelV></wp:anchor></w:drawing></mc:Choice><mc:Fallback><w:pict><v:rect w14:anchorId="6BEA8823" id="Rectangle 469" o:spid="_x0000_s1026" style="position:absolute;margin-left:0;margin-top:0;width:226.45pt;height:9.35pt;z-index:251665408;visibility:visible;mso-wrap-style:square;mso-width-percent:370;mso-height-percent:0;mso-left-
percent:455;mso-top-percent:690;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal-relative:page;mso-position-vertical-relative:page;mso-width-percent:370;mso-height-percent:0;mso-left-percent:455;mso-top-percent:690;mso-width-relative:page;mso-height-relative:margin;v-text-anchor:middle" o:gfxdata="UEsDBBQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJU67QAgl6YK0S0CoHGBkTxKLZGx5TGhvj5O2G0SRWNoz/78nu9wcxkFMGNg6quQqL6RA
0s5Y6ir5vt9lD1JwBDIwOMJKHpHlpr69KfdHjyxSmriSfYz+USnWPY7AufNIadK6MEJMx9ApD/oD
OlTrorhX2lFEilmcO2RdNtjC5xDF9pCuTyYBB5bi6bQ4syoJ3g9WQ0ymaiLzg5KdCXlKLjvcW893
SUOqXwnz5DrgnHtJTxOsQfEKIT7DmDSUCaxw7Rqn8787ZsmRM9e2VmPeBN4uqYvTtW7jvijg9N/y
JsXecLq0q+WD6m8AAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAX3JlbHMvLnJl
bHOkkMFqwzAMhu+DvYPRfXGawxijTi+j0GvpHsDYimMaW0Yy2fr2M4PBMnrbUb/Q94l/f/hMi1qR
JVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb25
HMsYhqlCwG5lrLq9biZkxWOiqY
22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/sFB2T0FQ7R0nTNEV3j6o9feQzro1i
OWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3pcvwCAAD//wMAUEsDBBQABgAIAAAA
IQD+yuLsgQIAAFUFAAAOAAAAZHJzL2Uyb0RvYy54bWysVE1v2zAMvQ/YfxB0Xx0HST+COkXQosOA
oi3aDj2rshQbkEWNUuJkv36U5LhFW+wwLAdFEslH8vlR5xe7zrCtQt+CrXh5NOFMWQl1a9cV//l0
/e2UMx+ErYUBqyq+V55fLL9+Oe/dQk2hAVMrZARi/aJ3FW9CcIui8LJRnfBH4JQlowbsRKAjrosa
RU/onSmmk8lx0QPWDkEq7+n2Khv5MuFrrWS409qrwEzFqbaQVkzrS1yL5blYrFG4ppVDGeIfquhE
aynpCHUlgmAbbD9Ada1E8KDDkYSuAK1bqVIP1E05edfNYyOcSr0QOd6NNPn/Bytvt/fI2rris+Mz
zqzo6CM9EG3Cro1i8ZIo6p1fkOeju8fh5Gkb+91p7OI/dcJ2idb9SKvaBSbpcnp6Mj8r55xJspXl
6clsHkGL12iHPnxX0LG4qThS/sSm2N74kF0PLjGZsXG1cN0ak63xpohV5rrSLuyNyt4PSlOLsZKE
msSlLg2yrSBZCCmVDWU2NaJW+Xo+od9Q5xiRqjaWACOypvwj9gAQhfsRO1c5+MdQlbQ5Bk/+VlgO
HiNSZrBhDO5aC/gZgKGuhszZ/0BSpiay9AL1ngSAkCfDO3nd0je4ET7cC6RRoKGh8Q53tGgDfcVh
2HHWAP7+7D76k0LJyllPo1Vx/2sjUHFmfljS7lk5m8VZTIfZ/GRKB3xreXlrsZvuEugzlfSQOJm
2
0T+Yw1YjdM/0CqxiVjIJKyl3xWXAw+Ey5JGnd0Sq1Sq50fw5EW7so5MRPLIaNfa0exboBiEGkvAt
HMZQLN7pMfvGSAurTQDdJrG+8jrwTbObhDO8M/FxeHtOXq+v4fIPAAAA//8DAFBLAwQUAAYACAAA
ACEA3ymaJN0AAAAEAQAADwAAAGRycy9kb3ducmV2LnhtbEyPQUvDQBCF74L/YRnBi9jdFKtNzKaI
4EW0YPWgt212kg1mZ0N228b+ekcvenkwvMd735Sryfdij2PsAmnIZgoEUh1sR62Gt9eHyyWImAxZ
0wdCDV8YYVWdnpSmsOFAL7jfpFZwCcXCaHApDYWUsXboTZyFAYm9JozeJD7HVtrRHLjc93Ku1LX0
piNecGbAe4f152bnNTTP73SxOOaNexof84+gMrU+Zlqfn013tyASTukvDD/4jA4VM23DjmwUvQZ+
JP0qe1eLeQ5iy6HlDciqlP/hq28AAAD//wMAUEsBAi0AFAAGAAgAAAAhALaDOJL+AAAA4QEAABMA
AAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAOP0h/9YA
AACUAQAACwAAAAAAAAAAAAAAAAAvAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEA/sri7IEC
AABVBQAADgAAAAAAAAAAAAAAAAAuAgAAZHJzL2Uyb0RvYy54bWxQSwECLQAUAAYACAAAACEA3yma
JN0AAAAEAQAADwAAAAAAAAAAAAAAAADbBAAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAAEAAQA8wAA
AOUFAAAAAA==
" fillcolor="#5b9bd5 [3204]" stroked="f" strokeweight="1pt"><w10:wrap anchorx="page
" anchory="page"/></v:rect></w:pict></mc:Fallback></mc:AlternateContent></w:r><w:r w:rsidR="00711569"><w:rPr><w:noProof/></w:rPr><mc:AlternateContent><mc:Choice Requires="wps"><w:drawing><wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251664384" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="2F08EBE7" wp14:editId="044EBF02"><wp:simplePos x="0" y="0"/><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionH relativeFrom="page"><wp14:pctPosHOffset>45500</wp14:pctPosHOffset></wp:positionH></mc:Choice><mc:Fallback><wp:positionH relativeFrom="page"><wp:posOffset>3536315</wp:posOffset></wp:positionH></mc:Fallback></mc:AlternateContent><mc:AlternateContent><mc:Choice Requires="wp14"><wp:positionV relativeFrom="page"><wp14:pctPosVOffset>35000</wp14:pctPosVOffset></wp:positionV></mc:Choice><mc:Fallback><wp:positionV relativeFrom="page"><wp:posOffset>3520440</wp:posOffset></wp:positionV></mc:Fallback></mc:AlternateCont
ent><wp:extent cx="2797810" cy="2475230"/><wp:effectExtent l="0" t="0" r="0" b="0"/><wp:wrapSquare wrapText="bothSides"/><wp:docPr id="470" name="Text Box 470"/><wp:cNvGraphicFramePr/><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"><wps:wsp><wps:cNvSpPr txBox="1"/><wps:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="2797810" cy="2475230"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:noFill/><a:ln w="6350"><a:noFill/></a:ln><a:effectLst/></wps:spPr><wps:txbx><w:txbxContent><w:sdt><w:sdtPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="5B9BD5" w:themeColor="accent1"/><w:sz w:val="72"/><w:szCs w:val="72"/></w:rPr><w:alias w:val="Title"/><w:id w:val="-958338334"/><w:dataBinding w:prefixMappings="xmlns:ns0='http://schemas.openxmlformats.org/package/2006/metadata/
core-properties' xmlns:ns1='http://purl.org/dc/elements/1.1/'" w:xpath="/ns0:coreProperties[1]/ns1:title[1]" w:storeItemID="{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"/><w:text/></w:sdtPr><w:sdtContent><w:p w14:paraId="15B576FE" w14:textId="3B569532" w:rsidR="00711569" w:rsidRDefault="00711569" w:rsidP="00711569"><w:pPr><w:spacing w:line="240" w:lineRule="auto"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="5B9BD5" w:themeColor="accent1"/><w:sz w:val="72"/><w:szCs w:val="144"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="5B9BD5" w:themeColor="accent1"/><w:sz w:val="72"/><w:szCs w:val="72"/></w:rPr><w:t>My Document Title</w:t></w:r></w:p></w:sdtContent></w:sdt><w:sdt><w:sdtPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiT
heme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr><w:alias w:val="Subtitle"/><w:id w:val="15524255"/><w:dataBinding w:prefixMappings="xmlns:ns0='http://schemas.openxmlformats.org/package/2006/metadata/core-properties' xmlns:ns1='http://purl.org/dc/elements/1.1/'" w:xpath="/ns0:coreProperties[1]/ns1:subject[1]" w:storeItemID="{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"/><w:text/></w:sdtPr><w:sdtContent><w:p w14:paraId="6DA2A412" w14:textId="2A9F0B12" w:rsidR="00711569" w:rsidRDefault="00711569" w:rsidP="00711569"><w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/><w:sz w:val="32"/><w:szCs w:val="40"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:c
olor w:val="44546A" w:themeColor="text2"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr><w:t>My Document Subtitle</w:t></w:r></w:p></w:sdtContent></w:sdt></w:txbxContent></wps:txbx><wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="t" anchorCtr="0" forceAA="0" compatLnSpc="1"><a:prstTxWarp prst="textNoShape"><a:avLst/></a:prstTxWarp><a:spAutoFit/></wps:bodyPr></wps:wsp></a:graphicData></a:graphic><wp14:sizeRelH relativeFrom="page"><wp14:pctWidth>36000</wp14:pctWidth></wp14:sizeRelH><wp14:sizeRelV relativeFrom="page"><wp14:pctHeight>28000</wp14:pctHeight></wp14:sizeRelV></wp:anchor></w:drawing></mc:Choice><mc:Fallback><w:pict><v:shape w14:anchorId="2F08EBE7" id="Text Box 470" o:spid="_x0000_s1029" type="#_x0000_t202" style="position:absolute;margin-left:0;margin-top:0;width:220.3pt;height:194.9pt;z-index:251664384
;visibility:visible;mso-wrap-style:square;mso-width-percent:360;mso-height-percent:280;mso-left-percent:455;mso-top-percent:350;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:0;mso-position-horizontal-relative:page;mso-position-vertical-relative:page;mso-width-percent:360;mso-height-percent:280;mso-left-percent:455;mso-top-percent:350;mso-width-relative:page;mso-height-relative:page;v-text-anchor:top" o:gfxdata="UEsDBBQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJU67QAgl6YK0S0CoHGBkTxKLZGx5TGhvj5O2G0SRWNoz/78nu9wcxkFMGNg6quQqL6RA
0s5Y6ir5vt9lD1JwBDIwOMJKHpHlpr69KfdHjyxSmriSfYz+USnWPY7AufNIadK6MEJMx9ApD/oD
OlTrorhX2lFEilmcO2RdNtjC5xDF9pCuTyYBB5bi6bQ4syoJ3g9WQ0ymaiLzg5KdCXlKLjvcW893
SUOqXwnz5DrgnHtJTxOsQfEKIT7DmDSUCaxw7Rqn8787ZsmRM9e2VmPeBN4uqYvTtW7jvijg9N/y
JsXecLq0q+WD6m8AAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAX3JlbHMvLnJl
bHOkkMFqwzAMhu+DvYPRfXGawxijTi+j0GvpHs
DYimMaW0Yy2fr2M4PBMnrbUb/Q94l/f/hMi1qR
JVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb25HMsYhqlCwG5lrLq9biZkxWOiqY
22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/sFB2T0FQ7R0nTNEV3j6o9feQzro1i
OWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3pcvwCAAD//wMAUEsDBBQABgAIAAAA
IQCTj5HdOQIAAGsEAAAOAAAAZHJzL2Uyb0RvYy54bWysVF1v2jAUfZ+0/2D5fQQClDYiVKwV06Sq
rQRTn43jkEjxx2xDwn79jh2gqNvTtBfnfvn43nvuzfy+kw05COtqrXI6GgwpEYrrola7nP7YrL7c
UuI8UwVrtBI5PQpH7xefP81bk4lUV7ophCUAUS5rTU4r702WJI5XQjI30EYoOEttJfNQ7S4pLGuB
LpskHQ5vklbbwljNhXOwPvZOuoj4ZSm4fylLJzxpcorcfDxtPLfhTBZzlu0sM1XNT2mwf8hCslrh
0QvUI/OM7G39B5SsudVOl37AtUx0WdZcxBpQzWj4oZp1xYyItaA5zlza5P4fLH8+vFpSFzmdzNAf
xSRI2ojOk6+6I8GGDrXGZQhcG4T6Dg4wfbY7GEPhXWll+KIkAj+wjpf+BjgOYzq7m92O4OLwpZPZ
NB1H/OT9urHOfxNakiDk1ILA2Fd2eHIeqSD0HBJeU3pVN00ksVGkzenNeDqMFy4e3GhUiBVxHE4w
oaQ+9SD5btvFJozPZW11cUS1VvcT4wxf1cjoiTn/yixGBFVg7P0LjrLReFmfJEoqbX/9zR7iwRy8
lLQYuZy6n3tmBSXNdwVO70aTCWB9VCbTWQrFXnu21x61lw8aUz3CghkexRDvm7N
YWi3fsB3L8Cpc
THG8nVN/Fh98vwjYLi6WyxiEqTTMP6m14QE69C30e9O9MWtOpHjw+azPw8myD9z0seGmM8u9B0OR
uNDnvqtgMSiY6MjnafvCylzrMer9H7H4DQAA//8DAFBLAwQUAAYACAAAACEAeUQr7toAAAAFAQAA
DwAAAGRycy9kb3ducmV2LnhtbEyPwU7DMBBE70j8g7VI3KgDVFGaxqkQKhwrkQLnbbx1AvE62G4b
/h7DpVxWGs1o5m21muwgjuRD71jB7SwDQdw63bNR8Lp9uilAhIiscXBMCr4pwKq+vKiw1O7EL3Rs
ohGphEOJCroYx1LK0HZkMczcSJy8vfMWY5LeSO3xlMrtIO+yLJcWe04LHY702FH72Rysgjf7/pU/
Fxsjt+aj2W/WYe05KHV9NT0sQUSa4jkMv/gJHerEtHMH1kEMCtIj8e8mbz7PchA7BffFogBZV/I/
ff0DAAD//wMAUEsBAi0AFAAGAAgAAAAhALaDOJL+AAAA4QEAABMAAAAAAAAAAAAAAAAAAAAAAFtD
b250ZW50X1R5cGVzXS54bWxQSwECLQAUAAYACAAAACEAOP0h/9YAAACUAQAACwAAAAAAAAAAAAAA
AAAvAQAAX3JlbHMvLnJlbHNQSwECLQAUAAYACAAAACEAk4+R3TkCAABrBAAADgAAAAAAAAAAAAAA
AAAuAgAAZHJzL2Uyb0RvYy54bWxQSwECLQAUAAYACAAAACEAeUQr7toAAAAFAQAADwAAAAAAAAAA
AAAAAACTBAAAZHJzL2Rvd25yZXYueG1sUEsFBgAAAAAEAAQA8wAAAJoFAAAAAA==
" filled="f" stroked="f" strokeweight=".5pt"><v:textbox style="mso-fit-shape-to-text:t"><w:txbxConte
nt><w:sdt><w:sdtPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="5B9BD5" w:themeColor="accent1"/><w:sz w:val="72"/><w:szCs w:val="72"/></w:rPr><w:alias w:val="Title"/><w:id w:val="-958338334"/><w:dataBinding w:prefixMappings="xmlns:ns0='http://schemas.openxmlformats.org/package/2006/metadata/core-properties' xmlns:ns1='http://purl.org/dc/elements/1.1/'" w:xpath="/ns0:coreProperties[1]/ns1:title[1]" w:storeItemID="{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"/><w:text/></w:sdtPr><w:sdtContent><w:p w14:paraId="15B576FE" w14:textId="3B569532" w:rsidR="00711569" w:rsidRDefault="00711569" w:rsidP="00711569"><w:pPr><w:spacing w:line="240" w:lineRule="auto"/><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="5B9BD5" w:themeColor="accent1"/><w:sz w:val="72"/><w:szCs w:val="144"/></w:rPr></w:pP
r><w:r><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="5B9BD5" w:themeColor="accent1"/><w:sz w:val="72"/><w:szCs w:val="72"/></w:rPr><w:t>My Document Title</w:t></w:r></w:p></w:sdtContent></w:sdt><w:sdt><w:sdtPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr><w:alias w:val="Subtitle"/><w:id w:val="15524255"/><w:dataBinding w:prefixMappings="xmlns:ns0='http://schemas.openxmlformats.org/package/2006/metadata/core-properties' xmlns:ns1='http://purl.org/dc/elements/1.1/'" w:xpath="/ns0:coreProperties[1]/ns1:subject[1]" w:storeItemID="{6C3C8BC8-F283-45AE-878A-BAB7291924A1}"/><w:text/></w:sdtPr><w:sdtContent><w:p w14:paraId="6DA2A412" w14:textId="2A9F0B12" w:rsidR="00711569" w:rsidRDefault="00711569" w:rsidP=
"00711569"><w:pPr><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/><w:sz w:val="32"/><w:szCs w:val="40"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:asciiTheme="majorHAnsi" w:eastAsiaTheme="majorEastAsia" w:hAnsiTheme="majorHAnsi" w:cstheme="majorBidi"/><w:noProof/><w:color w:val="44546A" w:themeColor="text2"/><w:sz w:val="32"/><w:szCs w:val="32"/></w:rPr><w:t>My Document Subtitle</w:t></w:r></w:p></w:sdtContent></w:sdt></w:txbxContent></v:textbox><w10:wrap type="square" anchorx="page" anchory="page"/></v:shape></w:pict></mc:Fallback></mc:AlternateContent></w:r></w:p><w:p w14:paraId="19497EA8" w14:textId="253CF686" w:rsidR="00711569" w:rsidRDefault="00711569"><w:r><w:br w:type="page"/></w:r></w:p></w:sdtContent></w:sdt><w:sdt><w:sdtPr><w:id w:val="-927495122"/><w:docPartObj><w:docPartGallery w:val="Table of Contents"/><w:docPartUnique/></w:docPartObj></w:s
dtPr><w:sdtEndPr><w:rPr><w:rFonts w:asciiTheme="minorHAnsi" w:eastAsiaTheme="minorEastAsia" w:hAnsiTheme="minorHAnsi" w:cstheme="minorBidi"/><w:b/><w:bCs/><w:noProof/><w:color w:val="auto"/><w:sz w:val="22"/><w:szCs w:val="22"/><w:lang w:eastAsia="zh-TW"/></w:rPr></w:sdtEndPr><w:sdtContent><w:p w14:paraId="7CE430A1" w14:textId="013188DE" w:rsidR="0049479F" w:rsidRDefault="0049479F"><w:pPr><w:pStyle w:val="TOCHeading"/></w:pPr><w:r><w:t>Contents</w:t></w:r></w:p><w:p w14:paraId="36F4886F" w14:textId="64DE0044" w:rsidR="0049479F" w:rsidRDefault="0049479F"><w:pPr><w:pStyle w:val="TOC1"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:rPr><w:noProof/></w:rPr></w:pPr><w:r><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText xml:space="preserve"> TOC \o "1-3" \h \z \u </w:instrText></w:r><w:r><w:fldChar w:fldCharType="separate"/></w:r><w:hyperlink w:anchor="_Toc467647605" w:history="1"><w:r w:rsidRPr="00454652"><w:rPr><w:rStyle w:val="Hyperlink"/><w:noProof/></w
:rPr><w:t>Heading1</w:t></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:tab/></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:instrText xml:space="preserve"> PAGEREF _Toc467647605 \h </w:instrText></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:t>3</w:t></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:fldChar w:fldCharType="end"/></w:r></w:hyperlink></w:p><w:p w14:paraId="5E22E210" w14:textId="13004ED8" w:rsidR="0049479F" w:rsidRDefault="0049479F"><w:pPr><w:pStyle w:val="TOC1"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:rPr><w:noProof/></w:rPr></w:pPr><w:hyperlink w:anchor="_Toc467647606" w:history="1"><w:r w:rsidRPr="00454652"><w:rPr><w:rStyle w:val="Hyperlink"/><w:noProof/></w:rPr><w:t>Heading2</w:t></w:r>
<w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:tab/></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:instrText xml:space="preserve"> PAGEREF _Toc467647606 \h </w:instrText></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:t>3</w:t></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:fldChar w:fldCharType="end"/></w:r></w:hyperlink></w:p><w:p w14:paraId="592A970F" w14:textId="0DDD6327" w:rsidR="0049479F" w:rsidRDefault="0049479F"><w:r><w:rPr><w:b/><w:bCs/><w:noProof/></w:rPr><w:fldChar w:fldCharType="end"/></w:r></w:p></w:sdtContent></w:sdt><w:p w14:paraId="3C74C203" w14:textId="3917CDC3" w:rsidR="0049479F" w:rsidRDefault="0049479F"><w:pPr><w:pStyle w:val="TableofFigures"/><w:tabs><w:tab w:val="right" w:leader="dot" w:pos="9350"/></w:tabs><w:rPr>
<w:noProof/></w:rPr></w:pPr><w:r><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:instrText xml:space="preserve"> TOC \h \z \c "Table" </w:instrText></w:r><w:r><w:fldChar w:fldCharType="separate"/></w:r><w:hyperlink w:anchor="_Toc467647797" w:history="1"><w:r w:rsidRPr="00212BB5"><w:rPr><w:rStyle w:val="Hyperlink"/><w:noProof/></w:rPr><w:t>Table 1: Table1 Caption</w:t></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:tab/></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:fldChar w:fldCharType="begin"/></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:instrText xml:space="preserve"> PAGEREF _Toc467647797 \h </w:instrText></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:fldChar w:fldCharType="separate"/></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:t>2</w:t></w:r><w:r><w:rPr><w:noProof/><w:webHidden/></w:rPr><w:fldChar w:fldCharType="end"/></w:r></w:hyperlink></w:p><w:p w14:paraId="4AC97A41" w14:textId="6
13D7C18" w:rsidR="0049479F" w:rsidRDefault="0049479F"><w:r><w:fldChar w:fldCharType="end"/></w:r></w:p><w:p w14:paraId="0ECE95CA" w14:textId="4EEA8BDC" w:rsidR="0049479F" w:rsidRDefault="0049479F"/><w:p w14:paraId="4836E461" w14:textId="77777777" w:rsidR="0049479F" w:rsidRDefault="0049479F"/><w:p w14:paraId="54EF84BF" w14:textId="2E63DD8B" w:rsidR="0049479F" w:rsidRDefault="0049479F"><w:r><w:br w:type="page"/></w:r></w:p><w:p w14:paraId="48EC6F4D" w14:textId="3176C161" w:rsidR="0049479F" w:rsidRDefault="0049479F"/><w:p w14:paraId="33E56900" w14:textId="77777777" w:rsidR="0049479F" w:rsidRDefault="0049479F"><w:bookmarkStart w:id="0" w:name="_GoBack"/><w:bookmarkEnd w:id="0"/></w:p><w:p w14:paraId="7F7144D9" w14:textId="4BC4B8BA" w:rsidR="006B1ECB" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:r><w:t xml:space="preserve">The </w:t></w:r><w:r><w:rPr><w:i/><w:iCs/></w:rPr><w:t>quick</w:t></w:r><w:r><w:t xml:space="preserve"> brown </w:t></w:r><w:r><w:rPr><w:b/><w:bCs/></w:rPr><w:t xml
:space="preserve">fox </w:t></w:r><w:r><w:t>j</w:t></w:r><w:r><w:rPr><w:i/><w:iCs/></w:rPr><w:t>um</w:t></w:r><w:r><w:rPr><w:b/><w:bCs/><w:i/><w:iCs/></w:rPr><w:t>ped</w:t></w:r><w:r><w:t xml:space="preserve"> over the lazy brown </w:t></w:r><w:ins w:id="1" w:author="Allison, Timothy B." w:date="2016-11-22T13:45:00Z"><w:r><w:t>dog</w:t></w:r></w:ins><w:del w:id="2" w:author="Allison, Timothy B." w:date="2016-11-22T13:45:00Z"><w:r w:rsidDel="00814CC8"><w:delText>frog</w:delText></w:r></w:del><w:r><w:t>.</w:t></w:r></w:p><w:p w14:paraId="376B3823" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:pPr><w:pStyle w:val="ListParagraph"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/></w:numPr></w:pPr><w:r><w:t>this is a basic list 1.</w:t></w:r></w:p><w:p w14:paraId="27556192" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:pPr><w:pStyle w:val="ListParagraph"/><w:numPr><w:ilvl w:val="0"/><w:numId w:val="1"/><
/w:numPr></w:pPr><w:r><w:t xml:space="preserve">Really basic </w:t></w:r><w:commentRangeStart w:id="3"/><w:r><w:t>2</w:t></w:r><w:commentRangeEnd w:id="3"/><w:r><w:rPr><w:rStyle w:val="CommentReference"/></w:rPr><w:commentReference w:id="3"/></w:r><w:r><w:t>.</w:t></w:r></w:p><w:p w14:paraId="118CE320" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/><w:p w14:paraId="64F2083B" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:r><w:rPr><w:noProof/></w:rPr><mc:AlternateContent><mc:Choice Requires="wps"><w:drawing><wp:anchor distT="45720" distB="45720" distL="114300" distR="114300" simplePos="0" relativeHeight="251659264" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="43BED150" wp14:editId="0A70AFC0"><wp:simplePos x="0" y="0"/><wp:positionH relativeFrom="column"><wp:align>center</wp:align></wp:positionH><wp:positionV relativeFrom="paragraph"><wp:posOffset>182880</wp:posOffset></wp:po
sitionV><wp:extent cx="2360930" cy="1404620"/><wp:effectExtent l="0" t="0" r="22860" b="11430"/><wp:wrapSquare wrapText="bothSides"/><wp:docPr id="217" name="Text Box 2"/><wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"/></wp:cNvGraphicFramePr><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"><wps:wsp><wps:cNvSpPr txBox="1"><a:spLocks noChangeArrowheads="1"/></wps:cNvSpPr><wps:spPr bwMode="auto"><a:xfrm><a:off x="0" y="0"/><a:ext cx="2360930" cy="1404620"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:solidFill><a:srgbClr val="FFFFFF"/></a:solidFill><a:ln w="9525"><a:solidFill><a:srgbClr val="000000"/></a:solidFill><a:miter lim="800000"/><a:headEnd/><a:tailEnd/></a:ln></wps:spPr><wps:txbx><w:txbxContent><w:p w14:paraId="56615764" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP
="00814CC8"><w:r><w:t>This is a text box</w:t></w:r></w:p></w:txbxContent></wps:txbx><wps:bodyPr rot="0" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" anchor="t" anchorCtr="0"><a:spAutoFit/></wps:bodyPr></wps:wsp></a:graphicData></a:graphic><wp14:sizeRelH relativeFrom="margin"><wp14:pctWidth>40000</wp14:pctWidth></wp14:sizeRelH><wp14:sizeRelV relativeFrom="margin"><wp14:pctHeight>20000</wp14:pctHeight></wp14:sizeRelV></wp:anchor></w:drawing></mc:Choice><mc:Fallback><w:pict><v:shape w14:anchorId="43BED150" id="Text Box 2" o:spid="_x0000_s1030" type="#_x0000_t202" style="position:absolute;margin-left:0;margin-top:14.4pt;width:185.9pt;height:110.6pt;z-index:251659264;visibility:visible;mso-wrap-style:square;mso-width-percent:400;mso-height-percent:200;mso-wrap-distance-left:9pt;mso-wrap-distance-top:3.6pt;mso-wrap-distance-right:9pt;mso-wrap-distance-bottom:3.6pt;mso-position-horizontal:center;mso-position-horizontal-relative:text;mso-position-vertical:a
bsolute;mso-position-vertical-relative:text;mso-width-percent:400;mso-height-percent:200;mso-width-relative:margin;mso-height-relative:margin;v-text-anchor:top" o:gfxdata="UEsDBBQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJU67QAgl6YK0S0CoHGBkTxKLZGx5TGhvj5O2G0SRWNoz/78nu9wcxkFMGNg6quQqL6RA
0s5Y6ir5vt9lD1JwBDIwOMJKHpHlpr69KfdHjyxSmriSfYz+USnWPY7AufNIadK6MEJMx9ApD/oD
OlTrorhX2lFEilmcO2RdNtjC5xDF9pCuTyYBB5bi6bQ4syoJ3g9WQ0ymaiLzg5KdCXlKLjvcW893
SUOqXwnz5DrgnHtJTxOsQfEKIT7DmDSUCaxw7Rqn8787ZsmRM9e2VmPeBN4uqYvTtW7jvijg9N/y
JsXecLq0q+WD6m8AAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAX3JlbHMvLnJl
bHOkkMFqwzAMhu+DvYPRfXGawxijTi+j0GvpHsDYimMaW0Yy2fr2M4PBMnrbUb/Q94l/f/hMi1qR
JVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb25HMsYhqlCwG5lrLq9biZkxWOiqY
22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/sFB2T0FQ7R0nTNEV3j6o9feQzro1i
OWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3pcvwCAAD//wMAUEsDBBQABgAIAAAA
IQAcbA6VKQIAAE4
EAAAOAAAAZHJzL2Uyb0RvYy54bWysVNtu2zAMfR+wfxD0vvhSJ22MOEWXLsOA
7gK0+wBalmNhsqRJSuzu60fJSRZ028swPwiiSB2R55Be3Y69JAdundCqotkspYQrphuhdhX9+rR9
c0OJ86AakFrxij5zR2/Xr1+tBlPyXHdaNtwSBFGuHExFO+9NmSSOdbwHN9OGK3S22vbg0bS7pLEw
IHovkzxNF8mgbWOsZtw5PL2fnHQd8duWM/+5bR33RFYUc/NxtXGtw5qsV1DuLJhOsGMa8A9Z9CAU
PnqGugcPZG/Fb1C9YFY73foZ032i21YwHmvAarL0RTWPHRgea0FynDnT5P4fLPt0+GKJaCqaZ9eU
KOhRpCc+evJWjyQP/AzGlRj2aDDQj3iMOsdanXnQ7JsjSm86UDt+Z60eOg4N5peFm8nF1QnHBZB6
+KgbfAb2XkegsbV9IA/pIIiOOj2ftQmpMDzMrxbp8gpdDH1ZkRaLPKqXQHm6bqzz77nuSdhU1KL4
ER4OD86HdKA8hYTXnJai2Qopo2F39UZacgBslG38YgUvwqQiQ0WX83w+MfBXiDR+f4LohceOl6Kv
6M05CMrA2zvVxH70IOS0x5SlOhIZuJtY9GM9Rs2Kkz61bp6RWaunBseBxE2n7Q9KBmzuirrve7Cc
EvlBoTrLrCjCNESjmF8jlcReeupLDyiGUBX1lEzbjY8TFHkzd6jiVkR+g9xTJseUsWkj7ccBC1Nx
aceoX7+B9U8AAAD//wMAUEsDBBQABgAIAAAAIQBIWydy2wAAAAcBAAAPAAAAZHJzL2Rvd25yZXYu
eG1sTI9BT8MwDIXvSPyHyEjcWLICYypNp6mC66RtSFy9JrSFxClN2pV/jzmxm5+f9d7nYjN7JyY7
xC6QhuVCgbBUB9NRo+Ht+Hq3BhETkkEXyGr4sRE2
5fVVgbkJZ9rb6ZAawSEUc9TQptTnUsa6tR7j
IvSW2PsIg8fEcmikGfDM4d7JTKmV9NgRN7TY26q19ddh9BrGY7Wd9lX2+T7tzMNu9YIe3bfWtzfz
9hlEsnP6P4Y/fEaHkplOYSQThdPAjyQN2Zr52b1/WvJw4sWjUiDLQl7yl78AAAD//wMAUEsBAi0A
FAAGAAgAAAAhALaDOJL+AAAA4QEAABMAAAAAAAAAAAAAAAAAAAAAAFtDb250ZW50X1R5cGVzXS54
bWxQSwECLQAUAAYACAAAACEAOP0h/9YAAACUAQAACwAAAAAAAAAAAAAAAAAvAQAAX3JlbHMvLnJl
bHNQSwECLQAUAAYACAAAACEAHGwOlSkCAABOBAAADgAAAAAAAAAAAAAAAAAuAgAAZHJzL2Uyb0Rv
Yy54bWxQSwECLQAUAAYACAAAACEASFsnctsAAAAHAQAADwAAAAAAAAAAAAAAAACDBAAAZHJzL2Rv
d25yZXYueG1sUEsFBgAAAAAEAAQA8wAAAIsFAAAAAA==
"><v:textbox style="mso-fit-shape-to-text:t"><w:txbxContent><w:p w14:paraId="56615764" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:r><w:t>This is a text box</w:t></w:r></w:p></w:txbxContent></v:textbox><w10:wrap type="square"/></v:shape></w:pict></mc:Fallback></mc:AlternateContent></w:r><w:r><w:t>This should have a footnote</w:t></w:r><w:r><w:rPr><w:rStyle w:val="FootnoteRe
ference"/></w:rPr><w:footnoteReference w:id="1"/></w:r></w:p><w:p w14:paraId="3432B5D2" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/><w:p w14:paraId="385F1ACB" w14:textId="77777777" w:rsidR="00565706" w:rsidRDefault="00565706" w:rsidP="00565706"/><w:p w14:paraId="187612D5" w14:textId="68D40D35" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00565706"><w:r><w:t xml:space="preserve">This is a hyperlink: </w:t></w:r><w:hyperlink r:id="rId11" w:history="1"><w:proofErr w:type="spellStart"/><w:r w:rsidR="00565706" w:rsidRPr="00565706"><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr><w:t>tika</w:t></w:r><w:proofErr w:type="spellEnd"/></w:hyperlink></w:p><w:p w14:paraId="2A0B8B96" w14:textId="0EBDF598" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="00565706"><w:r><w:t xml:space="preserve">This is a link to a local file: </w:t></w:r><w:hyperlink r:id="rId12" w:history="1"><w:r w:rsidRPr="0049479F"><w:rPr><w:rStyle w:val="Hyperlink"/></w:rPr
><w:t>test.png</w:t></w:r></w:hyperlink></w:p><w:p w14:paraId="72CE58C8" w14:textId="77777777" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="00565706"/><w:p w14:paraId="45360452" w14:textId="1A9054D0" w:rsidR="00565706" w:rsidRDefault="00565706" w:rsidP="00565706"><w:r><w:t>This is 10 spaces</w:t></w:r></w:p><w:p w14:paraId="04BD2B2E" w14:textId="2CE83448" w:rsidR="00814CC8" w:rsidRDefault="0049479F" w:rsidP="00814CC8"><w:r><w:rPr><w:noProof/></w:rPr><w:drawing><wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="12803AD4" wp14:editId="1E83955D"><wp:extent cx="5486400" cy="3200400"/><wp:effectExtent l="0" t="0" r="0" b="0"/><wp:docPr id="3" name="Chart 3"/><wp:cNvGraphicFramePr/><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/chart"><c:chart xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:r="http://schemas.openxmlformats.org/officeDocum
ent/2006/relationships" r:id="rId13"/></a:graphicData></a:graphic></wp:inline></w:drawing></w:r></w:p><w:p w14:paraId="632A7616" w14:textId="6F011237" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="00814CC8"/><w:p w14:paraId="1724BB39" w14:textId="772F3B44" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="00814CC8"/><w:p w14:paraId="6A019D6E" w14:textId="30DB363E" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="00814CC8"/><w:p w14:paraId="4DD41676" w14:textId="6C7EEA9B" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="0049479F"><w:pPr><w:pStyle w:val="Caption"/><w:keepNext/></w:pPr><w:bookmarkStart w:id="4" w:name="_Toc467647797"/><w:r><w:lastRenderedPageBreak/><w:t xml:space="preserve">Table </w:t></w:r><w:fldSimple w:instr=" SEQ Table \* ARABIC "><w:r><w:rPr><w:noProof/></w:rPr><w:t>1</w:t></w:r></w:fldSimple><w:r><w:t>: Table1 Caption</w:t></w:r><w:bookmarkEnd w:id="4"/></w:p><w:tbl><w:tblPr><w:tblStyle w:val="TableGrid"/><w:tblW w:w="0" w:type="auto"/><w:t
blLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/></w:tblPr><w:tblGrid><w:gridCol w:w="3116"/><w:gridCol w:w="3117"/><w:gridCol w:w="3117"/></w:tblGrid><w:tr w:rsidR="00814CC8" w14:paraId="788CDAED" w14:textId="77777777" w:rsidTr="00814CC8"><w:tc><w:tcPr><w:tcW w:w="3116" w:type="dxa"/></w:tcPr><w:p w14:paraId="682E4738" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:r><w:t>R1c1</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w14:paraId="526F226F" w14:textId="1CF7A91D" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:r><w:t>R1c2</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w14:paraId="0C88D62B" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:r><w:t>R1c3</w:t></w:r></w:p></w:tc></w:tr><w:tr w:rsidR="00814CC8" w14:paraId="1E237BC8" w14:textId="777777
77" w:rsidTr="00814CC8"><w:tc><w:tcPr><w:tcW w:w="3116" w:type="dxa"/></w:tcPr><w:p w14:paraId="4EB7B5DA" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w14:paraId="78C83A7E" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w14:paraId="3478ECDC" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc></w:tr><w:tr w:rsidR="00814CC8" w14:paraId="347A9757" w14:textId="77777777" w:rsidTr="00814CC8"><w:tc><w:tcPr><w:tcW w:w="3116" w:type="dxa"/></w:tcPr><w:p w14:paraId="5250628D" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w14:paraId="70E18C38" w14:textId="34C3624D" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:
tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w14:paraId="17CD27BF" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc></w:tr><w:tr w:rsidR="00814CC8" w14:paraId="68F3C5E3" w14:textId="77777777" w:rsidTr="00814CC8"><w:tc><w:tcPr><w:tcW w:w="3116" w:type="dxa"/></w:tcPr><w:p w14:paraId="5E0CACFC" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:tbl><w:tblPr><w:tblStyle w:val="TableGrid"/><w:tblW w:w="0" w:type="auto"/><w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/></w:tblPr><w:tblGrid><w:gridCol w:w="1181"/><w:gridCol w:w="570"/><w:gridCol w:w="570"/><w:gridCol w:w="570"/></w:tblGrid><w:tr w:rsidR="00814CC8" w14:paraId="496D177E" w14:textId="77777777" w:rsidTr="00814CC8"><w:tc><w:tcPr><w:tcW w:w="722" w:type="dxa"/></w:tcPr><w:p w14:paraId="27552B38" w14:
textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:r><w:t>Embedded table r1c1</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="723" w:type="dxa"/></w:tcPr><w:p w14:paraId="0967DDDC" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="723" w:type="dxa"/></w:tcPr><w:p w14:paraId="70B70494" w14:textId="33BA09EE" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="723" w:type="dxa"/></w:tcPr><w:p w14:paraId="3837A2CB" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc></w:tr><w:tr w:rsidR="00814CC8" w14:paraId="6BAA8ADD" w14:textId="77777777" w:rsidTr="00814CC8"><w:tc><w:tcPr><w:tcW w:w="722" w:type="dxa"/></w:tcPr><w:p w14:paraId="792B1D21" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="723" w:type="dxa"/></w:tcPr><w:p w14:pa
raId="06096B76" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="723" w:type="dxa"/></w:tcPr><w:p w14:paraId="326C33B5" w14:textId="72FA82E1" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="723" w:type="dxa"/></w:tcPr><w:p w14:paraId="7C08762D" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc></w:tr><w:tr w:rsidR="00814CC8" w14:paraId="55C3E931" w14:textId="77777777" w:rsidTr="00814CC8"><w:tc><w:tcPr><w:tcW w:w="722" w:type="dxa"/></w:tcPr><w:p w14:paraId="089E3D7E" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="723" w:type="dxa"/></w:tcPr><w:p w14:paraId="39A9D255" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="723" w:type="dxa"/></w:tcPr><w:p w14:paraId="42F6CC43" w14:textId
="6674C8C0" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="723" w:type="dxa"/></w:tcPr><w:p w14:paraId="110707D3" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc></w:tr></w:tbl><w:p w14:paraId="57D5D7D6" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc><w:tc><w:tcPr><w:tcW w:w="3117" w:type="dxa"/></w:tcPr><w:p w14:paraId="41C6212E" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/></w:tc></w:tr></w:tbl><w:p w14:paraId="6AFB900C" w14:textId="0FCE6CA9" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/><w:p w14:paraId="4FD1FC7E" w14:textId="5588F66C" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/><w:p w14:paraId="45D04969" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"><w:r><w:rPr><w:noProof/></w:rPr><mc:AlternateContent><mc:Choice Requir
es="wps"><w:drawing><wp:anchor distT="0" distB="0" distL="114300" distR="114300" simplePos="0" relativeHeight="251660288" behindDoc="0" locked="0" layoutInCell="1" allowOverlap="1" wp14:anchorId="20130961" wp14:editId="155BA3A9"><wp:simplePos x="0" y="0"/><wp:positionH relativeFrom="column"><wp:posOffset>3787140</wp:posOffset></wp:positionH><wp:positionV relativeFrom="paragraph"><wp:posOffset>189230</wp:posOffset></wp:positionV><wp:extent cx="1676400" cy="990600"/><wp:effectExtent l="0" t="0" r="19050" b="19050"/><wp:wrapNone/><wp:docPr id="2" name="Text Box 2"/><wp:cNvGraphicFramePr/><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.microsoft.com/office/word/2010/wordprocessingShape"><wps:wsp><wps:cNvSpPr txBox="1"/><wps:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="1676400" cy="990600"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom><a:solidFill><a:schemeClr val="lt1"/></a:solidFill><a:ln w="6350"><a:solidFill><a:p
rstClr val="black"/></a:solidFill></a:ln></wps:spPr><wps:txbx><w:txbxContent><w:p w14:paraId="3159B0BD" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8"><w:r><w:t>This is text within a shape</w:t></w:r></w:p></w:txbxContent></wps:txbx><wps:bodyPr rot="0" spcFirstLastPara="0" vertOverflow="overflow" horzOverflow="overflow" vert="horz" wrap="square" lIns="91440" tIns="45720" rIns="91440" bIns="45720" numCol="1" spcCol="0" rtlCol="0" fromWordArt="0" anchor="t" anchorCtr="0" forceAA="0" compatLnSpc="1"><a:prstTxWarp prst="textNoShape"><a:avLst/></a:prstTxWarp><a:noAutofit/></wps:bodyPr></wps:wsp></a:graphicData></a:graphic></wp:anchor></w:drawing></mc:Choice><mc:Fallback><w:pict><v:shape w14:anchorId="20130961" id="_x0000_s1031" type="#_x0000_t202" style="position:absolute;margin-left:298.2pt;margin-top:14.9pt;width:132pt;height:78pt;z-index:251660288;visibility:visible;mso-wrap-style:square;mso-wrap-distance-left:9pt;mso-wrap-distance-top:0;mso-wrap-distance-right:9pt
;mso-wrap-distance-bottom:0;mso-position-horizontal:absolute;mso-position-horizontal-relative:text;mso-position-vertical:absolute;mso-position-vertical-relative:text;v-text-anchor:top" o:gfxdata="UEsDBBQABgAIAAAAIQC2gziS/gAAAOEBAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbJSRQU7DMBBF
90jcwfIWJU67QAgl6YK0S0CoHGBkTxKLZGx5TGhvj5O2G0SRWNoz/78nu9wcxkFMGNg6quQqL6RA
0s5Y6ir5vt9lD1JwBDIwOMJKHpHlpr69KfdHjyxSmriSfYz+USnWPY7AufNIadK6MEJMx9ApD/oD
OlTrorhX2lFEilmcO2RdNtjC5xDF9pCuTyYBB5bi6bQ4syoJ3g9WQ0ymaiLzg5KdCXlKLjvcW893
SUOqXwnz5DrgnHtJTxOsQfEKIT7DmDSUCaxw7Rqn8787ZsmRM9e2VmPeBN4uqYvTtW7jvijg9N/y
JsXecLq0q+WD6m8AAAD//wMAUEsDBBQABgAIAAAAIQA4/SH/1gAAAJQBAAALAAAAX3JlbHMvLnJl
bHOkkMFqwzAMhu+DvYPRfXGawxijTi+j0GvpHsDYimMaW0Yy2fr2M4PBMnrbUb/Q94l/f/hMi1qR
JVI2sOt6UJgd+ZiDgffL8ekFlFSbvV0oo4EbChzGx4f9GRdb25HMsYhqlCwG5lrLq9biZkxWOiqY
22YiTra2kYMu1l1tQD30/bPm3wwYN0x18gb45AdQl1tp5j/sFB2T0FQ7R0nTNEV3j6o9feQzro1i
OWA14Fm+Q8a1a8+Bvu/d/dMb2JY5uiPbhG/ktn4cqGU/er3pcvwCAAD//wMAUEsDBBQABgAI
AAAA
IQAlGwpzTgIAAKgEAAAOAAAAZHJzL2Uyb0RvYy54bWysVFFv2jAQfp+0/2D5fSQwoAURKkbFNKlq
K8HUZ+PYJJrj82xDwn79zk5CabenaS/O2ff58913d1ncNZUiJ2FdCTqjw0FKidAc8lIfMvp9t/l0
S4nzTOdMgRYZPQtH75YfPyxqMxcjKEDlwhIk0W5em4wW3pt5kjheiIq5ARih0SnBVszj1h6S3LIa
2SuVjNJ0mtRgc2OBC+fw9L510mXkl1Jw/ySlE56ojGJsPq42rvuwJssFmx8sM0XJuzDYP0RRsVLj
oxeqe+YZOdryD6qq5BYcSD/gUCUgZclFzAGzGabvstkWzIiYC4rjzEUm9/9o+ePp2ZIyz+iIEs0q
LNFONJ58gYaMgjq1cXMEbQ3CfIPHWOX+3OFhSLqRtgpfTIegH3U+X7QNZDxcmt5Mxym6OPpms3SK
NtInr7eNdf6rgIoEI6MWaxclZacH51toDwmPOVBlvimVipvQL2KtLDkxrLTyMUYkf4NSmtQZnX6e
pJH4jS9QX+7vFeM/uvCuUMinNMYcNGlzD5Zv9k1UcNLrsof8jHJZaNvNGb4pkf6BOf/MLPYXyoAz
459wkQowJugsSgqwv/52HvBYdvRSUmO/ZtT9PDIrKFHfNDbEbDgehwaPm/HkZoQbe+3ZX3v0sVoD
CjXE6TQ8mgHvVW9KC9ULjtYqvIoupjm+nVHfm2vfThGOJherVQRhSxvmH/TW8EAdChNk3TUvzJqu
rB4b4hH6zmbzd9VtseGmhtXRgyxj6YPOraqd/DgOsXm60Q3zdr2PqNcfzPI3AAAA//8DAFBLAwQU
AAYACAAAACEAR9/lXtwAAAAKAQAADwAAAGRycy9kb3ducmV2LnhtbEyPwU7DMAyG70i8Q2Qkbixl
YlVamk6ABhdODMQ5
a7IkonGqJOvK22NOcLT96ff3d9sljGw2KfuIEm5XFTCDQ9QerYSP9+cbASwX
hVqNEY2Eb5Nh219edKrV8YxvZt4XyygEc6skuFKmlvM8OBNUXsXJIN2OMQVVaEyW66TOFB5Gvq6q
mgflkT44NZknZ4av/SlI2D3axg5CJbcT2vt5+Ty+2hcpr6+Wh3tgxSzlD4ZffVKHnpwO8YQ6s1HC
pqnvCJWwbqgCAaKuaHEgUmwE8L7j/yv0PwAAAP//AwBQSwECLQAUAAYACAAAACEAtoM4kv4AAADh
AQAAEwAAAAAAAAAAAAAAAAAAAAAAW0NvbnRlbnRfVHlwZXNdLnhtbFBLAQItABQABgAIAAAAIQA4
/SH/1gAAAJQBAAALAAAAAAAAAAAAAAAAAC8BAABfcmVscy8ucmVsc1BLAQItABQABgAIAAAAIQAl
GwpzTgIAAKgEAAAOAAAAAAAAAAAAAAAAAC4CAABkcnMvZTJvRG9jLnhtbFBLAQItABQABgAIAAAA
IQBH3+Ve3AAAAAoBAAAPAAAAAAAAAAAAAAAAAKgEAABkcnMvZG93bnJldi54bWxQSwUGAAAAAAQA
BADzAAAAsQUAAAAA
" fillcolor="white [3201]" strokeweight=".5pt"><v:textbox><w:txbxContent><w:p w14:paraId="3159B0BD" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8"><w:r><w:t>This is text within a shape</w:t></w:r></w:p></w:txbxContent></v:textbox></v:shape></w:pict></mc:Fallback></mc:AlternateContent></w:r><w:r><w:object w:dxaOrig="1740" w
:dyaOrig="823" w14:anchorId="77A24091"><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><v:shape id="_x0000_i1037" type="#_x0000_t75" style="width:87pt;height:41.1pt" o:ole=""><v:imagedata r:id="rId14" o:title=""/></v:shape><o:OLEObject Type="Embed" ProgID="Package" ShapeID="_x0000_i1037" DrawAspect="Content" ObjectID="_1541390034" r:id="rId15"/></w:object></w:r><w:r>
<w:rPr><w:noProof/></w:rPr><w:drawing><wp:inline distT="0" distB="0" distL="0" distR="0" wp14:anchorId="2693E108" wp14:editId="122CA82E"><wp:extent cx="1767840" cy="1321591"/><wp:effectExtent l="0" t="0" r="3810" b="0"/><wp:docPr id="1" name="Picture 1"/><wp:cNvGraphicFramePr><a:graphicFrameLocks xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" noChangeAspect="1"/></wp:cNvGraphicFramePr><a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main"><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:pic xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture"><pic:nvPicPr><pic:cNvPr id="1" name="testJPEG_commented.jpg"/><pic:cNvPicPr/></pic:nvPicPr><pic:blipFill><a:blip r:embed="rId16"><a:extLst><a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"><a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/></a:ext></a:extLst></a:blip><a:stretch><a:fillRect/></a:stretch></pic:blipFill
><pic:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="1792893" cy="1340320"/></a:xfrm><a:prstGeom prst="rect"><a:avLst/></a:prstGeom></pic:spPr></pic:pic></a:graphicData></a:graphic></wp:inline></w:drawing></w:r></w:p><w:p w14:paraId="629D209A" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/><w:p w14:paraId="40F89D85" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRPr="00814CC8" w:rsidRDefault="00BF1B94" w:rsidP="00814CC8"><m:oMathPara><m:oMath><m:f><m:fPr><m:ctrlPr><w:rPr><w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/><w:i/></w:rPr></m:ctrlPr></m:fPr><m:num><m:r><w:rPr><w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/></w:rPr><m:t>3</m:t></m:r></m:num><m:den><m:r><w:rPr><w:rFonts w:ascii="Cambria Math" w:hAnsi="Cambria Math"/></w:rPr><m:t>4</m:t></m:r></m:den></m:f></m:oMath></m:oMathPara></w:p><w:p w14:paraId="1CBFCE89" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="00814CC8" w:rsidP="00814CC8"/><w:sdt><w:sdtPr><w:id w:
val="2018969565"/><w:placeholder><w:docPart w:val="DefaultPlaceholder_-1854013440"/></w:placeholder></w:sdtPr><w:sdtEndPr/><w:sdtContent><w:p w14:paraId="056321BC" w14:textId="77777777" w:rsidR="00814CC8" w:rsidRDefault="008D093B" w:rsidP="008D093B"><w:r><w:t>Rich text content control</w:t></w:r></w:p></w:sdtContent></w:sdt><w:p w14:paraId="4711D31B" w14:textId="77777777" w:rsidR="008D093B" w:rsidRDefault="008D093B" w:rsidP="008D093B"/><w:sdt><w:sdtPr><w:id w:val="63389495"/><w:placeholder><w:docPart w:val="DefaultPlaceholder_-1854013440"/></w:placeholder><w:text/></w:sdtPr><w:sdtEndPr/><w:sdtContent><w:p w14:paraId="11DC9A4A" w14:textId="392143FC" w:rsidR="008D093B" w:rsidRDefault="008D093B" w:rsidP="008D093B"><w:r><w:t>Simple text content control</w:t></w:r></w:p></w:sdtContent></w:sdt><w:p w14:paraId="4C39EC71" w14:textId="65309958" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:sdt><w:sdtPr><w:id w:val="-1040121459"/><w15:repeatingSection/></w:sdtPr><w:sdtCo
ntent><w:sdt><w:sdtPr><w:id w:val="1779676866"/><w:placeholder><w:docPart w:val="DefaultPlaceholder_-1854013436"/></w:placeholder><w15:repeatingSectionItem/></w:sdtPr><w:sdtContent><w:p w14:paraId="1477AD32" w14:textId="214E32E5" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:r><w:t>Repeating content</w:t></w:r></w:p></w:sdtContent></w:sdt><w:sdt><w:sdtPr><w:id w:val="1651629823"/><w:placeholder><w:docPart w:val="FE0C30F9E67D4EE9A0DDD467396DA574"/></w:placeholder><w15:repeatingSectionItem/></w:sdtPr><w:sdtContent><w:p w14:paraId="1A2F730E" w14:textId="64A32FA4" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:r><w:t>Repeating content</w:t></w:r></w:p></w:sdtContent></w:sdt><w:sdt><w:sdtPr><w:id w:val="1769044590"/><w:placeholder><w:docPart w:val="2C5C5F75ACA34E72AEDAA4410EBB7125"/></w:placeholder><w15:repeatingSectionItem/></w:sdtPr><w:sdtContent><w:p w14:paraId="12E21112" w14:textId="4D83CF08" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsid
P="00670AA1"><w:r><w:t>Repeating content</w:t></w:r></w:p></w:sdtContent></w:sdt><w:sdt><w:sdtPr><w:id w:val="587659077"/><w:placeholder><w:docPart w:val="BC889040C4B84F3D943433D5A37B6047"/></w:placeholder><w15:repeatingSectionItem/></w:sdtPr><w:sdtContent><w:p w14:paraId="41E5B962" w14:textId="24D1D7BD" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:r><w:t>Repeating content</w:t></w:r></w:p></w:sdtContent></w:sdt></w:sdtContent></w:sdt><w:p w14:paraId="29F07071" w14:textId="77777777" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:sdt><w:sdtPr><w:alias w:val="DropDownTitle"/><w:tag w:val="DropDownTag"/><w:id w:val="960615370"/><w:placeholder><w:docPart w:val="C5ED39B2DD8646A782AFAF595D16F926"/></w:placeholder><w:showingPlcHdr/><w:comboBox><w:listItem w:value="Choose an item."/><w:listItem w:displayText="DropdownOption1" w:value="DropdownValue1"/><w:listItem w:displayText="DropDownOption2" w:value="DropDownValue2"/></w:comboBox></w:sdtPr><w:sd
tContent><w:p w14:paraId="6139D3B9" w14:textId="7ACA0131" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:r><w:rPr><w:rStyle w:val="PlaceholderText"/></w:rPr><w:t>Drop down1</w:t></w:r></w:p></w:sdtContent></w:sdt><w:p w14:paraId="74C59944" w14:textId="360252E0" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:sdt><w:sdtPr><w:id w:val="-1177260324"/><w:placeholder><w:docPart w:val="DefaultPlaceholder_-1854013438"/></w:placeholder><w:date w:fullDate="2016-11-16T00:00:00Z"><w:dateFormat w:val="M/d/yyyy"/><w:lid w:val="en-US"/><w:storeMappedDataAs w:val="dateTime"/><w:calendar w:val="gregorian"/></w:date></w:sdtPr><w:sdtContent><w:p w14:paraId="12323345" w14:textId="5AFB1EA8" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"><w:r><w:t>11/16/2016</w:t></w:r></w:p></w:sdtContent></w:sdt><w:p w14:paraId="6ED3EEF7" w14:textId="2F08A289" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:p w14:paraId="79502786" w14:textId=
"77777777" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:p w14:paraId="5717B670" w14:textId="027C473D" w:rsidR="008D093B" w:rsidRDefault="00D72479" w:rsidP="008D093B"><w:r><w:t xml:space="preserve">This </w:t></w:r><w:r><w:tab/><w:t xml:space="preserve">is </w:t></w:r><w:r><w:tab/><w:t xml:space="preserve">tabbed </w:t></w:r><w:r><w:tab/><w:t>tab</w:t></w:r><w:r><w:tab/></w:r><w:proofErr w:type="spellStart"/><w:r><w:t>tab</w:t></w:r><w:proofErr w:type="spellEnd"/></w:p><w:p w14:paraId="5D8D6093" w14:textId="77777777" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="008D093B"/><w:p w14:paraId="60F02B20" w14:textId="6079CEB9" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:p w14:paraId="14166FB6" w14:textId="3BC850CA" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:p w14:paraId="0ED02DA7" w14:textId="53F769DD" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:pPr><w:pStyle w:val="Heading1"/></w:pPr><w:
bookmarkStart w:id="5" w:name="_Toc467647605"/><w:r><w:t>Heading1</w:t></w:r><w:bookmarkEnd w:id="5"/></w:p><w:p w14:paraId="55A5225E" w14:textId="3A019CF9" w:rsidR="00670AA1" w:rsidDel="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:pPr><w:rPr><w:del w:id="6" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"/></w:rPr></w:pPr><w:del w:id="7" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"><w:r w:rsidDel="00670AA1"><w:delText>Deleted paragraph1</w:delText></w:r></w:del></w:p><w:tbl><w:tblPr><w:tblStyle w:val="TableGrid"/><w:tblW w:w="0" w:type="auto"/><w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/></w:tblPr><w:tblGrid><w:gridCol w:w="4675"/><w:gridCol w:w="4675"/></w:tblGrid><w:tr w:rsidR="00670AA1" w:rsidDel="00670AA1" w14:paraId="209378AA" w14:textId="256239A3" w:rsidTr="00670AA1"><w:trPr><w:del w:id="8" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"/></w:trPr><w:t
c><w:tcPr><w:tcW w:w="4675" w:type="dxa"/></w:tcPr><w:p w14:paraId="2A4A0E6E" w14:textId="7FC8DBC8" w:rsidR="00670AA1" w:rsidDel="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:pPr><w:rPr><w:del w:id="9" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"/></w:rPr></w:pPr><w:del w:id="10" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"><w:r w:rsidDel="00670AA1"><w:delText>Del r1c1</w:delText></w:r></w:del></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="4675" w:type="dxa"/></w:tcPr><w:p w14:paraId="761862CE" w14:textId="6D9C6F2E" w:rsidR="00670AA1" w:rsidDel="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:pPr><w:rPr><w:del w:id="11" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"/></w:rPr></w:pPr><w:del w:id="12" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"><w:r w:rsidDel="00670AA1"><w:delText>Del r1c2</w:delText></w:r></w:del></w:p></w:tc></w:tr><w:tr w:rsidR="00670AA1" w:rsidDel="00670AA1" w14:paraId="36EBAB90" w14:tex
tId="0ED1EAB7" w:rsidTr="00670AA1"><w:trPr><w:del w:id="13" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="4675" w:type="dxa"/></w:tcPr><w:p w14:paraId="5488E71A" w14:textId="2B4F14A2" w:rsidR="00670AA1" w:rsidDel="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:pPr><w:rPr><w:del w:id="14" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"/></w:rPr></w:pPr><w:del w:id="15" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"><w:r w:rsidDel="00670AA1"><w:delText>Del r2c1</w:delText></w:r></w:del></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="4675" w:type="dxa"/></w:tcPr><w:p w14:paraId="2316A604" w14:textId="1B405A39" w:rsidR="00670AA1" w:rsidDel="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:pPr><w:rPr><w:del w:id="16" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"/></w:rPr></w:pPr><w:del w:id="17" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"><w:r w:rsidDel="00670AA1"><w:d
elText>Del r2c2</w:delText></w:r></w:del></w:p></w:tc></w:tr></w:tbl><w:p w14:paraId="43D00E29" w14:textId="26263630" w:rsidR="00670AA1" w:rsidDel="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:pPr><w:rPr><w:del w:id="18" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"/></w:rPr></w:pPr></w:p><w:p w14:paraId="51F5F8D3" w14:textId="22F9A2C3" w:rsidR="00670AA1" w:rsidDel="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w:pPr><w:rPr><w:del w:id="19" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"/></w:rPr></w:pPr><w:del w:id="20" w:author="Allison, Timothy B." w:date="2016-11-23T06:48:00Z"><w:r w:rsidDel="00670AA1"><w:delText>Deleted paragraph2</w:delText></w:r></w:del></w:p><w:p w14:paraId="7F413F67" w14:textId="77777777" w:rsidR="00670AA1" w:rsidRPr="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"/><w:p w14:paraId="2086F510" w14:textId="714089E7" w:rsidR="00670AA1" w:rsidRPr="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="00670AA1"><w
:pPr><w:pStyle w:val="Heading1"/></w:pPr><w:bookmarkStart w:id="21" w:name="_Toc467647606"/><w:r><w:t>Heading2</w:t></w:r><w:bookmarkEnd w:id="21"/></w:p><w:p w14:paraId="76E705EC" w14:textId="17DB1B75" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:p w14:paraId="4BB9208F" w14:textId="1822EB9D" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:p w14:paraId="0EB59B76" w14:textId="08AFC42E" w:rsidR="00670AA1" w:rsidRPr="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"><w:pPr><w:rPr><w:b/><w:bCs/></w:rPr></w:pPr><w:r w:rsidRPr="00670AA1"><w:rPr><w:b/><w:bCs/></w:rPr><w:t>Some text</w:t></w:r></w:p><w:p w14:paraId="3FA38CE3" w14:textId="64BCC788" w:rsidR="00670AA1" w:rsidRDefault="00670AA1" w:rsidP="008D093B"/><w:p w14:paraId="393F9289" w14:textId="4C1C7415" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="008D093B"/><w:p w14:paraId="7A9E39A5" w14:textId="23165DFD" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="008D093B"/><w:p w14
:paraId="2C206DE1" w14:textId="6CF6144B" w:rsidR="0049479F" w:rsidRDefault="0049479F" w:rsidP="008D093B"><w:r><w
<TRUNCATED>
[6/6] tika git commit: TIKA-1321 -- add SAX based docx parser and
integrate it with the recent 2006ml parser work -- initial commit
Posted by ta...@apache.org.
TIKA-1321 -- add SAX based docx parser and integrate it with the recent 2006ml parser work -- initial commit
Project: http://git-wip-us.apache.org/repos/asf/tika/repo
Commit: http://git-wip-us.apache.org/repos/asf/tika/commit/d19e4725
Tree: http://git-wip-us.apache.org/repos/asf/tika/tree/d19e4725
Diff: http://git-wip-us.apache.org/repos/asf/tika/diff/d19e4725
Branch: refs/heads/sax_docx
Commit: d19e4725ff0549597f9156bb0c1e7759f6ce08d9
Parents: 7b4f6fa
Author: tballison <ta...@mitre.org>
Authored: Wed Nov 30 15:24:57 2016 -0500
Committer: tballison <ta...@mitre.org>
Committed: Wed Nov 30 15:24:57 2016 -0500
----------------------------------------------------------------------
CHANGES.txt | 3 +
.../java/org/apache/tika/utils/DateUtils.java | 72 +-
.../parser/microsoft/AbstractOfficeParser.java | 69 +
.../parser/microsoft/MSOfficeParserConfig.java | 38 -
.../tika/parser/microsoft/OfficeParser.java | 5 +-
.../parser/microsoft/OfficeParserConfig.java | 82 +
.../microsoft/ooxml/MetadataExtractor.java | 4 +-
.../microsoft/ooxml/OOXMLExtractorFactory.java | 36 +-
.../parser/microsoft/ooxml/OOXMLParser.java | 6 +-
.../ooxml/SXWPFWordExtractorDecorator.java | 222 ++
.../parser/microsoft/ooxml/XWPFListManager.java | 25 +-
.../ooxml/XWPFWordExtractorDecorator.java | 2 +-
.../microsoft/ooxml/xwpf/BinaryDataHandler.java | 120 -
.../ooxml/xwpf/BodyContentHandler.java | 271 --
.../ooxml/xwpf/CorePropertiesHandler.java | 144 -
.../ooxml/xwpf/ExtendedPropertiesHandler.java | 67 -
.../microsoft/ooxml/xwpf/PartHandler.java | 43 -
.../microsoft/ooxml/xwpf/Relationship.java | 52 -
.../ooxml/xwpf/RelationshipsHandler.java | 86 -
.../ooxml/xwpf/RelationshipsManager.java | 58 -
.../microsoft/ooxml/xwpf/Word2006MLHandler.java | 168 -
.../microsoft/ooxml/xwpf/Word2006MLParser.java | 67 -
.../ooxml/xwpf/XWPFDocumentXMLBodyHandler.java | 318 ++
.../ooxml/xwpf/XWPFEventBasedWordExtractor.java | 353 ++
.../microsoft/ooxml/xwpf/XWPFRunProperties.java | 44 +
.../ooxml/xwpf/XWPFTikaBodyPartHandler.java | 224 ++
.../ooxml/xwpf/ml2006/AbstractPartHandler.java | 43 +
.../ooxml/xwpf/ml2006/BinaryDataHandler.java | 120 +
.../ooxml/xwpf/ml2006/BodyPartHandler.java | 64 +
.../xwpf/ml2006/CorePropertiesHandler.java | 144 +
.../xwpf/ml2006/ExtendedPropertiesHandler.java | 67 +
.../ooxml/xwpf/ml2006/PartHandler.java | 34 +
.../ooxml/xwpf/ml2006/Relationship.java | 52 +
.../ooxml/xwpf/ml2006/RelationshipsHandler.java | 86 +
.../ooxml/xwpf/ml2006/RelationshipsManager.java | 58 +
.../ooxml/xwpf/ml2006/Word2006MLDocHandler.java | 171 +
.../ooxml/xwpf/ml2006/Word2006MLParser.java | 71 +
.../services/org.apache.tika.parser.Parser | 2 +-
.../parser/microsoft/ooxml/OOXMLParserTest.java | 31 +
.../ooxml/xwpf/SXWPFExtractorTest.java | 187 +
.../ooxml/xwpf/Word2006MLParserTest.java | 182 -
.../ooxml/xwpf/ml2006/Word2006MLParserTest.java | 171 +
.../test-documents/testWORD_2003ml.xml | 2058 +++++++---
.../test-documents/testWORD_2006ml.docx | Bin 0 -> 165566 bytes
.../test-documents/testWORD_2006ml.xml | 3621 +++++++++++++++---
.../test-documents/testWORD_2006ml_src.docx | Bin 99960 -> 0 bytes
46 files changed, 7350 insertions(+), 2391 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 17128b7..2462e1a 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,8 @@
Release 1.15 - ??
+ * Added experimental SAX parser for .docx files. To select this parser,
+ set useSAXDocxExtractor(true) on OfficeConfig (TIKA-1321).
+
* Change default behavior to parse embedded documents even if the user
forgets to specify a Parser.class in the ParseContext (TIKA-2096).
Users who wish to parse only the container document should set
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-core/src/main/java/org/apache/tika/utils/DateUtils.java
----------------------------------------------------------------------
diff --git a/tika-core/src/main/java/org/apache/tika/utils/DateUtils.java b/tika-core/src/main/java/org/apache/tika/utils/DateUtils.java
index 6b764c8..6ccc74e 100644
--- a/tika-core/src/main/java/org/apache/tika/utils/DateUtils.java
+++ b/tika-core/src/main/java/org/apache/tika/utils/DateUtils.java
@@ -16,9 +16,14 @@
*/
package org.apache.tika.utils;
+import java.text.DateFormat;
+import java.text.DateFormatSymbols;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
+import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
@@ -26,6 +31,7 @@ import java.util.TimeZone;
* Date related utility methods and constants
*/
public class DateUtils {
+
/**
* The UTC time zone. Not sure if {@link TimeZone#getTimeZone(String)}
* understands "UTC" in all environments, but it'll fall back to GMT
@@ -44,8 +50,49 @@ public class DateUtils {
*/
public static final TimeZone MIDDAY = TimeZone.getTimeZone("GMT-12:00");
+ private static ThreadLocal<DateFormat> createDateFormat(String format, TimeZone timezone) {
+ final SimpleDateFormat sdf =
+ new SimpleDateFormat(format, new DateFormatSymbols(Locale.US));
+ if (timezone != null) {
+ sdf.setTimeZone(timezone);
+ }
+ return new ThreadLocal<DateFormat>() {
+ @Override
+ public DateFormat initialValue() {
+ return sdf;
+ }
+ };
+ }
+
+ /**
+ * Some parsers will have the date as a ISO-8601 string
+ * already, and will set that into the Metadata object.
+ * So we can return Date objects for these, this is the
+ * list (in preference order) of the various ISO-8601
+ * variants that we try when processing a date based
+ * property.
+ */
+ private static final List<ThreadLocal<DateFormat>> ISO_8601_INPUT_FORMATS = loadDateFormats();
+
+ private static List<ThreadLocal<DateFormat>> loadDateFormats() {
+ List<ThreadLocal<DateFormat>> dateFormats = new ArrayList<>();
+ // yyyy-mm-ddThh...
+ dateFormats.add(createDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", UTC)); // UTC/Zulu
+ dateFormats.add(createDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", null)); // With timezone
+ dateFormats.add(createDateFormat("yyyy-MM-dd'T'HH:mm:ss", null)); // Without timezone
+ // yyyy-mm-dd hh...
+ dateFormats.add(createDateFormat("yyyy-MM-dd' 'HH:mm:ss'Z'", UTC)); // UTC/Zulu
+ dateFormats.add(createDateFormat("yyyy-MM-dd' 'HH:mm:ssZ", null)); // With timezone
+ dateFormats.add(createDateFormat("yyyy-MM-dd' 'HH:mm:ss", null)); // Without timezone
+ // Date without time, set to Midday UTC
+ dateFormats.add(createDateFormat("yyyy-MM-dd", MIDDAY)); // Normal date format
+ dateFormats.add(createDateFormat("yyyy:MM:dd", MIDDAY)); // Image (IPTC/EXIF) format
+
+ return dateFormats;
+ }
+
/**
- * Returns a ISO 8601 representation of the given date. This method
+ * Returns a ISO 8601 representation of the given date. This method
* is thread safe and non-blocking.
*
* @see <a href="https://issues.apache.org/jira/browse/TIKA-495">TIKA-495</a>
@@ -58,7 +105,7 @@ public class DateUtils {
return doFormatDate(calendar);
}
/**
- * Returns a ISO 8601 representation of the given date. This method
+ * Returns a ISO 8601 representation of the given date. This method
* is thread safe and non-blocking.
*
* @see <a href="https://issues.apache.org/jira/browse/TIKA-495">TIKA-495</a>
@@ -66,7 +113,7 @@ public class DateUtils {
* @return ISO 8601 date string, including timezone details
*/
public static String formatDate(Calendar date) {
- // Explicitly switch it into UTC before formatting
+ // Explicitly switch it into UTC before formatting
date.setTimeZone(UTC);
return doFormatDate(date);
}
@@ -98,4 +145,23 @@ public class DateUtils {
calendar.get(Calendar.MINUTE),
calendar.get(Calendar.SECOND));
}
+
+ /**
+ * Tries to parse the date string; returns null if no parse was possible.
+ *
+ * This is thread safe because it relies on threadlocal dateformats.
+ *
+ * @param dateString
+ * @return
+ */
+ public static Date tryToParse(String dateString) {
+ for (ThreadLocal<DateFormat> df : ISO_8601_INPUT_FORMATS) {
+ try {
+ return df.get().parse(dateString);
+ } catch (java.text.ParseException e){
+
+ }
+ }
+ return null;
+ }
}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/AbstractOfficeParser.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/AbstractOfficeParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/AbstractOfficeParser.java
new file mode 100644
index 0000000..d8186bc
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/AbstractOfficeParser.java
@@ -0,0 +1,69 @@
+package org.apache.tika.parser.microsoft;
+
+import org.apache.tika.config.Field;
+import org.apache.tika.parser.AbstractParser;
+import org.apache.tika.parser.ParseContext;
+
+/**
+ * Intermediate layer to set {@link OfficeParserConfig} uniformly.
+ */
+public abstract class AbstractOfficeParser extends AbstractParser {
+
+ private final OfficeParserConfig defaultOfficeParserConfig = new OfficeParserConfig();
+
+ /**
+ * Checks to see if the user has specified an {@link OfficeParserConfig}.
+ * If so, no changes are made; if not, one is added to the context.
+ *
+ * @param parseContext
+ */
+ public void configure(ParseContext parseContext) {
+ OfficeParserConfig officeParserConfig = parseContext.get(OfficeParserConfig.class, defaultOfficeParserConfig);
+ parseContext.set(OfficeParserConfig.class, officeParserConfig);
+ }
+
+ /**
+ * @see OfficeParserConfig#getIncludeDeletedContent
+ *
+ * @return
+ */
+ public boolean getIncludeDeletedContent() {
+ return defaultOfficeParserConfig.getIncludeDeletedContent();
+ }
+
+ /**
+ * @see OfficeParserConfig#getIncludeMoveFromContent()
+ *
+ * @return
+ */
+
+ public boolean getIncludeMoveFromContent() {
+ return defaultOfficeParserConfig.getIncludeMoveFromContent();
+ }
+
+ /**
+ * @see OfficeParserConfig#getUseSAXDocxExtractor()
+ *
+ * @return
+ */
+ public boolean getUseSAXDocxExtractor() {
+ return defaultOfficeParserConfig.getUseSAXDocxExtractor();
+ }
+
+
+ @Field
+ public void setIncludeDeletedContent(boolean includeDeletedConent) {
+ defaultOfficeParserConfig.setIncludeDeletedContent(includeDeletedConent);
+ }
+
+ @Field
+ public void setIncludeMoveFromContent(boolean includeMoveFromContent) {
+ defaultOfficeParserConfig.setIncludeMoveFromContent(includeMoveFromContent);
+ }
+
+ @Field
+ public void setUseSAXDocxExtractor(boolean useSAXDocxExtractor) {
+ defaultOfficeParserConfig.setUseSAXDocxExtractor(useSAXDocxExtractor);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/MSOfficeParserConfig.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/MSOfficeParserConfig.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/MSOfficeParserConfig.java
deleted file mode 100644
index 8f8086a..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/MSOfficeParserConfig.java
+++ /dev/null
@@ -1,38 +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.
- */
-package org.apache.tika.parser.microsoft;
-
-
-public class MSOfficeParserConfig {
-
- private boolean includeDeletedContent = true;
-
- /**
- * Sets whether or not the parser should include deleted content.
- * <b>This has not been implemented in all MSOffice parsers yet!!!</b>
- * @param includeDeletedContent
- */
- public void setIncludeDeletedContent(boolean includeDeletedContent) {
- this.includeDeletedContent = includeDeletedContent;
- }
-
- public boolean getIncludeDeletedContent() {
- return includeDeletedContent;
- }
-}
-
-
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
index 5218dfa..7e21ba8 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParser.java
@@ -48,7 +48,6 @@ import org.apache.tika.io.TikaInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.metadata.TikaCoreProperties;
import org.apache.tika.mime.MediaType;
-import org.apache.tika.parser.AbstractParser;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.PasswordProvider;
import org.apache.tika.parser.microsoft.ooxml.OOXMLParser;
@@ -61,7 +60,7 @@ import org.xml.sax.SAXException;
/**
* Defines a Microsoft document content extractor.
*/
-public class OfficeParser extends AbstractParser {
+public class OfficeParser extends AbstractOfficeParser {
/**
* Serial version UID
@@ -98,6 +97,8 @@ public class OfficeParser extends AbstractParser {
InputStream stream, ContentHandler handler,
Metadata metadata, ParseContext context)
throws IOException, SAXException, TikaException {
+
+ configure(context);
XHTMLContentHandler xhtml = new XHTMLContentHandler(handler, metadata);
xhtml.startDocument();
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParserConfig.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParserConfig.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParserConfig.java
new file mode 100644
index 0000000..55f4673
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/OfficeParserConfig.java
@@ -0,0 +1,82 @@
+/*
+ * 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.
+ */
+package org.apache.tika.parser.microsoft;
+
+
+import java.io.Serializable;
+
+public class OfficeParserConfig implements Serializable {
+
+ private boolean includeDeletedContent = true;
+ private boolean includeMoveFromContent = false;
+
+ private boolean useSAXDocxExtractor = false;
+
+ /**
+ * Sets whether or not the parser should include deleted content.
+ * <p/>
+ * <b>This has only been implemented in the streaming docx parser
+ * ({@link org.apache.tika.parser.microsoft.ooxml.SXWPFWordExtractorDecorator} so far!!!</b>
+ * @param includeDeletedContent
+ */
+ public void setIncludeDeletedContent(boolean includeDeletedContent) {
+ this.includeDeletedContent = includeDeletedContent;
+ }
+
+ public boolean getIncludeDeletedContent() {
+ return includeDeletedContent;
+ }
+
+ /**
+ * With track changes on, when a section is moved, the content
+ * is stored in both the "moveFrom" section and in the "moveTo" section.
+ * <p/>
+ * If you'd like to include the section both in its original location (moveFrom)
+ * and in its new location (moveTo), set this to <code>true</code>
+ * <p/>
+ * Default: <code>false</code>
+ * <p/>
+ * <b>This has only been implemented in the streaming docx parser
+ * ({@link org.apache.tika.parser.microsoft.ooxml.SXWPFWordExtractorDecorator} so far!!!</b>
+ * @param includeMoveFromContent
+ */
+ public void setIncludeMoveFromContent(boolean includeMoveFromContent) {
+ this.includeMoveFromContent = includeMoveFromContent;
+ }
+
+ public boolean getIncludeMoveFromContent() {
+ return includeMoveFromContent;
+ }
+
+ public boolean getUseSAXDocxExtractor() {
+ return useSAXDocxExtractor;
+ }
+
+ /**
+ * Use the experimental SAX-based streaming DOCX parser?
+ * If set to <code>false</code>, the classic parser will be used; if <code>true</code>,
+ * the new experimental parser will be used.
+ * <p/>
+ * Default: classic parser
+ * @param useSAXDocxExtractor
+ */
+ public void setUseSAXDocxExtractor(boolean useSAXDocxExtractor) {
+ this.useSAXDocxExtractor = useSAXDocxExtractor;
+ }
+}
+
+
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/MetadataExtractor.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/MetadataExtractor.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/MetadataExtractor.java
index 91d49c7..d392346 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/MetadataExtractor.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/MetadataExtractor.java
@@ -36,6 +36,7 @@ import org.apache.tika.metadata.PagedText;
import org.apache.tika.metadata.Property;
import org.apache.tika.metadata.TikaCoreProperties;
import org.apache.tika.parser.microsoft.SummaryExtractor;
+import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFEventBasedWordExtractor;
import org.apache.xmlbeans.impl.values.XmlValueOutOfRangeException;
import org.openxmlformats.schemas.officeDocument.x2006.customProperties.CTProperty;
import org.openxmlformats.schemas.officeDocument.x2006.extendedProperties.CTProperties;
@@ -57,7 +58,8 @@ public class MetadataExtractor {
public void extract(Metadata metadata) throws TikaException {
if (extractor.getDocument() != null ||
- (extractor instanceof XSSFEventBasedExcelExtractor &&
+ ((extractor instanceof XSSFEventBasedExcelExtractor ||
+ extractor instanceof XWPFEventBasedWordExtractor) &&
extractor.getPackage() != null)) {
extractMetadata(extractor.getCoreProperties(), metadata);
extractMetadata(extractor.getExtendedProperties(), metadata);
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
index e2c7717..bbee6b7 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLExtractorFactory.java
@@ -28,17 +28,22 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xssf.extractor.XSSFEventBasedExcelExtractor;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
+import org.apache.poi.xwpf.usermodel.XWPFRelation;
import org.apache.tika.exception.TikaException;
import org.apache.tika.io.TikaInputStream;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.mime.MediaType;
import org.apache.tika.parser.EmptyParser;
import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.microsoft.OfficeParserConfig;
+import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFEventBasedWordExtractor;
import org.apache.tika.parser.pkg.ZipContainerDetector;
import org.apache.xmlbeans.XmlException;
import org.xml.sax.ContentHandler;
@@ -83,12 +88,22 @@ public class OOXMLExtractorFactory {
metadata.set(Metadata.CONTENT_TYPE, type.toString());
// Have the appropriate OOXML text extractor picked
- POIXMLTextExtractor poiExtractor = ExtractorFactory.createExtractor(pkg);
+ POIXMLTextExtractor poiExtractor = null;
+ OfficeParserConfig config = context.get(OfficeParserConfig.class, new OfficeParserConfig());
+ if (config.getUseSAXDocxExtractor()) {
+ poiExtractor = trySXWPF(pkg);
+ }
+ if (poiExtractor == null) {
+ poiExtractor = ExtractorFactory.createExtractor(pkg);
+ }
POIXMLDocument document = poiExtractor.getDocument();
if (poiExtractor instanceof XSSFEventBasedExcelExtractor) {
extractor = new XSSFExcelExtractorDecorator(
context, (XSSFEventBasedExcelExtractor) poiExtractor, locale);
+ } else if (poiExtractor instanceof XWPFEventBasedWordExtractor) {
+ extractor = new SXWPFWordExtractorDecorator(context,
+ (XWPFEventBasedWordExtractor)poiExtractor);
} else if (document == null) {
throw new TikaException(
"Expecting UserModel based POI OOXML extractor with a document, but none found. " +
@@ -129,4 +144,23 @@ public class OOXMLExtractorFactory {
}
}
+ private static POIXMLTextExtractor trySXWPF(OPCPackage pkg) throws XmlException, OpenXML4JException, IOException {
+ PackageRelationshipCollection packageRelationshipCollection = pkg.getRelationshipsByType("http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument");
+ if(packageRelationshipCollection.size() == 0) {
+ packageRelationshipCollection = pkg.getRelationshipsByType("http://purl.oclc.org/ooxml/officeDocument/relationships/officeDocument");
+ }
+
+ if (packageRelationshipCollection.size() == 0) {
+ return null;
+ }
+ PackagePart corePart = pkg.getPart(packageRelationshipCollection.getRelationship(0));
+ String targetContentType = corePart.getContentType();
+ for (XWPFRelation relation : XWPFWordExtractor.SUPPORTED_TYPES) {
+ if (targetContentType.equals(relation.getContentType())) {
+ return new XWPFEventBasedWordExtractor(pkg);
+ }
+ }
+ return null;
+ }
+
}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParser.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParser.java
index 22f2cac..a6d0b34 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParser.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/OOXMLParser.java
@@ -27,15 +27,15 @@ import org.apache.poi.openxml4j.util.ZipSecureFile;
import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.mime.MediaType;
-import org.apache.tika.parser.AbstractParser;
import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.microsoft.AbstractOfficeParser;
import org.xml.sax.ContentHandler;
import org.xml.sax.SAXException;
/**
* Office Open XML (OOXML) parser.
*/
-public class OOXMLParser extends AbstractParser {
+public class OOXMLParser extends AbstractOfficeParser {
static {
//turn off POI's zip bomb detection because we have our own
ZipSecureFile.setMinInflateRatio(-1.0d);
@@ -83,6 +83,8 @@ public class OOXMLParser extends AbstractParser {
InputStream stream, ContentHandler handler,
Metadata metadata, ParseContext context)
throws IOException, SAXException, TikaException {
+ //set OfficeParserConfig if the user hasn't specified one
+ configure(context);
// Have the OOXML file processed
OOXMLExtractorFactory.parse(stream, handler, metadata, context);
}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXWPFWordExtractorDecorator.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXWPFWordExtractorDecorator.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXWPFWordExtractorDecorator.java
new file mode 100644
index 0000000..e08dab1
--- /dev/null
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/SXWPFWordExtractorDecorator.java
@@ -0,0 +1,222 @@
+/*
+ * 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.
+ */
+package org.apache.tika.parser.microsoft.ooxml;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.commons.io.input.CloseShieldInputStream;
+import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
+import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
+import org.apache.poi.openxml4j.opc.OPCPackage;
+import org.apache.poi.openxml4j.opc.PackagePart;
+import org.apache.poi.openxml4j.opc.PackageRelationship;
+import org.apache.poi.openxml4j.opc.PackageRelationshipCollection;
+import org.apache.poi.xwpf.usermodel.XWPFNumbering;
+import org.apache.poi.xwpf.usermodel.XWPFRelation;
+import org.apache.tika.exception.TikaException;
+import org.apache.tika.parser.ParseContext;
+import org.apache.tika.parser.microsoft.OfficeParserConfig;
+import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFDocumentXMLBodyHandler;
+import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFEventBasedWordExtractor;
+import org.apache.tika.parser.microsoft.ooxml.xwpf.XWPFTikaBodyPartHandler;
+import org.apache.tika.sax.EmbeddedContentHandler;
+import org.apache.tika.sax.OfflineContentHandler;
+import org.apache.tika.sax.XHTMLContentHandler;
+import org.apache.xmlbeans.XmlException;
+import org.xml.sax.SAXException;
+
+/**
+ * This is an experimental, alternative extractor for docx files.
+ * This streams the main document content rather than loading the
+ * full document into memory.
+ * <p>
+ * This will be better for some use cases than the classic docx extractor; and,
+ * it will be worse for others.
+ * </p>
+ *
+ * @since 1.15
+ */
+public class SXWPFWordExtractorDecorator extends AbstractOOXMLExtractor {
+
+
+ private final OPCPackage opcPackage;
+ private final ParseContext context;
+
+ public SXWPFWordExtractorDecorator(ParseContext context,
+ XWPFEventBasedWordExtractor extractor) {
+ super(context, extractor);
+ this.context = context;
+ this.opcPackage = extractor.getPackage();
+ }
+
+
+ @Override
+ protected void buildXHTML(XHTMLContentHandler xhtml)
+ throws SAXException, XmlException, IOException {
+ //handle main document
+ List<PackagePart> pps = opcPackage.getPartsByContentType(XWPFRelation.DOCUMENT.getContentType());
+ if (pps != null) {
+ for (PackagePart pp : pps) {
+ //likely only one, but why not...
+ handleDocumentPart(pp, xhtml);
+ }
+ }
+ //handle glossary document
+ pps = opcPackage.getPartsByContentType(XWPFRelation.GLOSSARY_DOCUMENT.getContentType());
+
+ if (pps != null) {
+ for (PackagePart pp : pps) {
+ //likely only one, but why not...
+ handleDocumentPart(pp, xhtml);
+ }
+ }
+ }
+
+ private void handleDocumentPart(PackagePart documentPart, XHTMLContentHandler xhtml) throws IOException, SAXException {
+ //load the numbering/list manager and styles from the main document part
+ XWPFNumbering numbering = loadNumbering(documentPart);
+ XWPFListManager xwpfListManager = new XWPFListManager(numbering);
+ //TODO: XWPFStyles styles = loadStyles(documentPart);
+
+ //headers
+ try {
+ PackageRelationshipCollection headersPRC = documentPart.getRelationshipsByType(XWPFRelation.HEADER.getRelation());
+ if (headersPRC != null) {
+ for (int i = 0; i < headersPRC.size(); i++) {
+ PackagePart header = documentPart.getRelatedPart(headersPRC.getRelationship(i));
+ handlePart(header, xwpfListManager, xhtml);
+ }
+ }
+ } catch (InvalidFormatException e) {
+ //swallow
+ }
+
+ //main document
+ handlePart(documentPart, xwpfListManager, xhtml);
+
+ //for now, just dump other components at end
+ for (XWPFRelation rel : new XWPFRelation[]{
+ XWPFRelation.FOOTNOTE,
+ XWPFRelation.COMMENT,
+ XWPFRelation.FOOTER,
+ XWPFRelation.ENDNOTE
+ }) {
+ try {
+ PackageRelationshipCollection prc = documentPart.getRelationshipsByType(rel.getRelation());
+ if (prc != null) {
+ for (int i = 0; i < prc.size(); i++) {
+ PackagePart packagePart = documentPart.getRelatedPart(prc.getRelationship(i));
+ handlePart(packagePart, xwpfListManager, xhtml);
+ }
+ }
+ } catch (InvalidFormatException e) {
+ //swallow
+ }
+ }
+ }
+
+ private void handlePart(PackagePart packagePart,
+ XWPFListManager xwpfListManager, XHTMLContentHandler xhtml) throws IOException, SAXException {
+
+ Map<String, String> hyperlinks = loadHyperlinkRelationships(packagePart);
+ try (InputStream stream = packagePart.getInputStream()) {
+ context.getSAXParser().parse(
+ new CloseShieldInputStream(stream),
+ new OfflineContentHandler(new EmbeddedContentHandler(
+ new XWPFDocumentXMLBodyHandler(
+ new XWPFTikaBodyPartHandler(xhtml, xwpfListManager,
+ context.get(OfficeParserConfig.class)), hyperlinks))));
+ } catch (TikaException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private Map<String, String> loadHyperlinkRelationships(PackagePart bodyPart) {
+ Map<String, String> hyperlinks = new HashMap<>();
+ try {
+ PackageRelationshipCollection prc = bodyPart.getRelationshipsByType(XWPFRelation.HYPERLINK.getRelation());
+ for (int i = 0; i < prc.size(); i++) {
+ PackageRelationship pr = prc.getRelationship(i);
+ if (pr == null) {
+ continue;
+ }
+ String id = pr.getId();
+ String url = (pr.getTargetURI() == null) ? null : pr.getTargetURI().toString();
+ if (id != null && url != null) {
+ hyperlinks.put(id, url);
+ }
+ }
+ } catch (InvalidFormatException e) {
+ }
+ return hyperlinks;
+ }
+/*
+ private XWPFStyles loadStyles(PackagePart packagePart) {
+ try {
+ PackageRelationshipCollection stylesParts =
+ packagePart.getRelationshipsByType(XWPFRelation.STYLES.getRelation());
+ if (stylesParts.size() > 0) {
+ PackageRelationship stylesRelationShip = stylesParts.getRelationship(0);
+ if (stylesRelationShip == null) {
+ return null;
+ }
+ PackagePart stylesPart = opcPackage.getPart(stylesRelationShip);
+ if (stylesPart == null) {
+ return null;
+ }
+ return new XWPFStyles(stylesPart);
+ }
+ } catch (IOException|OpenXML4JException e) {
+ //swallow
+ }
+ return null;
+
+ }
+*/
+ private XWPFNumbering loadNumbering(PackagePart packagePart) {
+ try {
+ PackageRelationshipCollection numberingParts = packagePart.getRelationshipsByType(XWPFRelation.NUMBERING.getRelation());
+ if (numberingParts.size() > 0) {
+ PackageRelationship numberingRelationShip = numberingParts.getRelationship(0);
+ if (numberingRelationShip == null) {
+ return null;
+ }
+ PackagePart numberingPart = opcPackage.getPart(numberingRelationShip);
+ if (numberingPart == null) {
+ return null;
+ }
+ return new XWPFNumbering(numberingPart);
+ }
+ } catch (IOException | OpenXML4JException e) {
+ //swallow
+ }
+ return null;
+ }
+
+ /**
+ * This returns the main document only.
+ */
+ @Override
+ protected List<PackagePart> getMainDocumentParts() {
+ return opcPackage.getPartsByContentType(XWPFRelation.DOCUMENT.getContentType());
+ }
+}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFListManager.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFListManager.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFListManager.java
index a938c2f..2a99126 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFListManager.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFListManager.java
@@ -16,8 +16,9 @@
*/
package org.apache.tika.parser.microsoft.ooxml;
+import java.math.BigInteger;
+
import org.apache.poi.xwpf.usermodel.XWPFAbstractNum;
-import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFNum;
import org.apache.poi.xwpf.usermodel.XWPFNumbering;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
@@ -47,8 +48,8 @@ public class XWPFListManager extends AbstractListManager {
private final XWPFNumbering numbering;
//map of numId (which paragraph series is this a member of?), levelcounts
- public XWPFListManager(XWPFDocument document) {
- numbering = document.getNumbering();
+ public XWPFListManager(XWPFNumbering numbering) {
+ this.numbering = numbering;
}
/**
@@ -57,12 +58,19 @@ public class XWPFListManager extends AbstractListManager {
* @return the formatted number or an empty string if something went wrong
*/
public String getFormattedNumber(final XWPFParagraph paragraph) {
- if (numbering == null) {
+ return getFormattedNumber(paragraph.getNumID(),
+ paragraph.getNumIlvl() == null ? -1 : paragraph.getNumIlvl().intValue());
+ }
+
+ public String getFormattedNumber(BigInteger numId, int iLvl) {
+ if (numbering == null || iLvl < 0 || numId == null) {
return "";
}
- int currNumId = paragraph.getNumID().intValue();
- XWPFNum xwpfNum = numbering.getNum(paragraph.getNumID());
+ int currNumId = numId.intValue();
+
+ XWPFNum xwpfNum = numbering.getNum(numId);
+
if (xwpfNum == null) {
return "";
}
@@ -79,14 +87,15 @@ public class XWPFListManager extends AbstractListManager {
overrideTuples = loadOverrideTuples(ctNum, lc.getNumberOfLevels());
}
- String formattedString = lc.incrementLevel(paragraph.getNumIlvl().intValue(), overrideTuples);
+ String formattedString = lc.incrementLevel(iLvl, overrideTuples);
listLevelMap.put(currAbNumId, lc);
overrideTupleMap.put(currNumId, overrideTuples);
return formattedString;
+
}
-
+
private LevelTuple[] loadOverrideTuples(CTNum ctNum, int length) {
LevelTuple[] levelTuples = new LevelTuple[length];
int overrideLength = ctNum.sizeOfLvlOverrideArray();
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFWordExtractorDecorator.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFWordExtractorDecorator.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFWordExtractorDecorator.java
index da3a606..ccbf45e 100644
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFWordExtractorDecorator.java
+++ b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/XWPFWordExtractorDecorator.java
@@ -83,7 +83,7 @@ public class XWPFWordExtractorDecorator extends AbstractOOXMLExtractor {
protected void buildXHTML(XHTMLContentHandler xhtml)
throws SAXException, XmlException, IOException {
XWPFHeaderFooterPolicy hfPolicy = document.getHeaderFooterPolicy();
- XWPFListManager listManager = new XWPFListManager(document);
+ XWPFListManager listManager = new XWPFListManager(document.getNumbering());
// headers
if (hfPolicy != null) {
extractHeaders(xhtml, hfPolicy, listManager);
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/BinaryDataHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/BinaryDataHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/BinaryDataHandler.java
deleted file mode 100644
index c2177cf..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/BinaryDataHandler.java
+++ /dev/null
@@ -1,120 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-
-import org.apache.commons.codec.binary.Base64;
-import org.apache.tika.exception.TikaException;
-import org.apache.tika.extractor.EmbeddedDocumentExtractor;
-import org.apache.tika.extractor.EmbeddedDocumentUtil;
-import org.apache.tika.io.TikaInputStream;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.parser.ParseContext;
-import org.apache.tika.sax.XHTMLContentHandler;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-class BinaryDataHandler extends PartHandler {
-
- private final XHTMLContentHandler handler;
- private final Metadata metadata;
- private final ParseContext parseContext;
-
- private boolean inBinaryData = false;
- private StringBuilder buffer = new StringBuilder();
-
- final Base64 base64 = new Base64();
-
-
- public BinaryDataHandler(XHTMLContentHandler handler, Metadata metadata, ParseContext context) {
- this.handler = handler;
- this.metadata = metadata;
- this.parseContext = context;
- }
-
-
- @Override
- public void startDocument() throws SAXException {
- }
-
- @Override
- public void endDocument() throws SAXException {
-
- }
-
- @Override
- void endPart() throws SAXException, TikaException {
- if (hasData()) {
- EmbeddedDocumentExtractor embeddedDocumentExtractor =
- EmbeddedDocumentUtil.getEmbeddedDocumentExtractor(parseContext);
- Metadata embeddedMetadata = new Metadata();
- try (TikaInputStream stream = TikaInputStream.get(getInputStream())) {
- embeddedDocumentExtractor.parseEmbedded(stream, handler, embeddedMetadata, false);
- } catch (IOException e) {
- throw new TikaException("error in finishing part", e);
- }
- buffer.setLength(0);
- }
-
- }
-
- @Override
- public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
-
- if (uri.equals(Word2006MLHandler.PKG_NS) && localName.equals("binaryData")) {
- inBinaryData = true;
- }
- }
-
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
- if (uri.equals(Word2006MLHandler.PKG_NS) && localName.equals("binaryData")) {
- inBinaryData = false;
- }
- }
-
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- if (inBinaryData) {
- buffer.append(ch, start, length);
- }
- }
-
- @Override
- public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
-
- }
-
- @Override
- public String getPartContentType() {
- return "";
- }
-
- boolean hasData() {
- return buffer.length() > 0;
- }
-
- private InputStream getInputStream() {
- byte[] bytes = base64.decode(buffer.toString());
- return new ByteArrayInputStream(bytes);
- }
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/BodyContentHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/BodyContentHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/BodyContentHandler.java
deleted file mode 100644
index ea16191..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/BodyContentHandler.java
+++ /dev/null
@@ -1,271 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-
-import org.apache.poi.xwpf.usermodel.XWPFRelation;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.parser.ParseContext;
-import org.apache.tika.parser.microsoft.MSOfficeParserConfig;
-import org.apache.tika.sax.XHTMLContentHandler;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-/**
- * This class is intended to handle anything that might contain IBodyElements:
- * main document, headers, footers, notes, etc.
- */
-
-class BodyContentHandler extends PartHandler {
-
-
- private enum EditType{
- NONE,
- INSERT,
- DELETE
- };
-
- private final static String W_NS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
- private final static String MC_NS = "http://schemas.openxmlformats.org/markup-compatibility/2006";
- private final static String OFFICE_DOC_RELATIONSHIP_NS = "http://schemas.openxmlformats.org/officeDocument/2006/relationships";
-
- private final static char[] TAB = new char[1];
-
- static {
- TAB[0] = '\t';
- }
-
- private final String partName;
- private final RelationshipsManager relationshipsManager;
- private final XHTMLContentHandler handler;
- private final Metadata metadata;
- private final ParseContext parseContext;
- private final boolean includeDeletedContent;
-
- private boolean inR = false;
- private boolean inT = false;
- private boolean inRPr = false;
- private boolean inDelText = false;
- private boolean inAlternateContent = false; //in alternate content section
- private boolean inACChoice = false; //if in alternate, choice or fallback?
- private boolean inACFallback = false;
- private boolean hasWrittenAHref = false;
- private boolean hasWrittenFormatting = false;
- private String editAuthor = null;
- private String editDate = null;
- private EditType editType = EditType.NONE;
- private String hyperlink = null;
-
- private TmpFormatting currFormat = new TmpFormatting();
-
- public BodyContentHandler(String partName, RelationshipsManager relationshipsManager,
- XHTMLContentHandler handler, Metadata metadata, ParseContext context) {
- this.partName = partName;
- this.relationshipsManager = relationshipsManager;
- this.handler = handler;
- this.metadata = metadata;
- this.parseContext = context;
- MSOfficeParserConfig config = context.get(MSOfficeParserConfig.class);
- boolean tmpIncludeDeleted = true;
- if (config != null) {
- tmpIncludeDeleted = config.getIncludeDeletedContent();
- }
- includeDeletedContent = tmpIncludeDeleted;
- }
-
-
- @Override
- public void startDocument() throws SAXException {
- }
-
- @Override
- public void endDocument() throws SAXException {
- }
-
- @Override
- public void startPrefixMapping(String prefix, String uri) throws SAXException {
- }
-
- @Override
- public void endPrefixMapping(String prefix) throws SAXException {
- }
-
- @Override
- public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
- if (uri.equals(MC_NS)) {
- if (localName.equals("AlternateContent")) {
- inAlternateContent = true;
- } else if (localName.equals("Choice")) {
- inACChoice = true;
- } else if (localName.equals("Fallback")) {
- inACFallback = true;
- }
- }
- if (inACFallback) {
- return;
- }
-
- if (uri.equals(W_NS)) {
- if (localName.equals("p")) {
- handler.startElement("p");
- } else if (localName.equals("r")) {
- inR = true;
- } else if (localName.equals("t")) {
- inT = true;
- } else if (localName.equals("tab")) {
- handler.characters(TAB, 0, 1);
- } else if (localName.equals("tbl")) {
- handler.startElement("table");
- } else if (localName.equals("tc")) {
- handler.startElement("td");
- } else if (localName.equals("tr")) {
- handler.startElement("tr");
- } else if (localName.equals("rPr")) {
- inRPr = true;
- } else if (inR && inRPr && localName.equals("i")) {
- //rprs don't have to be inR; ignore those that aren't
- currFormat.italics = true;
- } else if (inR && inRPr && localName.equals("b")) {
- currFormat.bold = true;
- } else if (localName.equals("delText")) {
- inDelText = true;
- } else if (localName.equals("ins")) {
- editAuthor = atts.getValue(W_NS, "author");
- editDate = atts.getValue(W_NS, "date");
- editType = EditType.INSERT;
- } else if (localName.equals("del")) {
- editAuthor = atts.getValue(W_NS, "author");
- editDate = atts.getValue(W_NS, "date");
- editType = EditType.DELETE;
- } else if (localName.equals("hyperlink")) {
- String hyperlinkId = atts.getValue(OFFICE_DOC_RELATIONSHIP_NS, "id");
- if (hyperlinkId != null) {
- Relationship relationship = relationshipsManager.getRelationship(getName(), hyperlinkId);
- if (relationship != null && XWPFRelation.HYPERLINK.getRelation().equals(relationship.getContentType())) {
- hyperlink = relationship.getTarget();
- handler.startElement("a", "href", hyperlink);
- hasWrittenAHref = true;
- }
- }
- }
- }
- }
-
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
- if (uri.equals(MC_NS)) {
- if (localName.equals("AlternateContent")) {
- inAlternateContent = false;
- } else if (localName.equals("Choice")) {
- inACChoice = false;
- } else if (localName.equals("Fallback")) {
- inACFallback = false;
- }
- }
- if (uri.equals(W_NS)) {
- if (inACFallback) {
- return;
- }
- if (localName.equals("p")) {
- handler.endElement("p");
- } else if (localName.equals("r")) {
- closeStyleTags();
- inR = false;
- hasWrittenFormatting = false;
- } else if (localName.equals("t")) {
- inT = false;
- } else if (localName.equals("tbl")) {
- handler.endElement("table");
- } else if (localName.equals("tc")) {
- handler.endElement("td");
- } else if (localName.equals("tr")) {
- handler.endElement("tr");
- } else if (localName.equals("rPr")) {
- inRPr = false;
- } else if (localName.equals("delText")) {
- inDelText = false;
- } else if (localName.equals("ins") || localName.equals("del")) {
- editType = EditType.NONE;
- editAuthor = null;
- editDate = null;
- } else if (localName.equals("hyperlink") && hasWrittenAHref) {
- handler.endElement("a");
- hasWrittenAHref = false;
- }
- }
- }
-
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- if (inACFallback) {
- return;
- }
-
- if (inR && !hasWrittenFormatting) {
- if (currFormat.bold) {
- handler.startElement("b");
- }
- if (currFormat.italics) {
- handler.startElement("i");
- }
- hasWrittenFormatting = true;
- }
- if (inT) {
- handler.characters(ch, start, length);
- } else if (includeDeletedContent && inDelText) {
- handler.characters(ch, start, length);
- }
- }
-
- @Override
- public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
- if (inACFallback) {
- return;
- }
-
- if (inT) {
- handler.characters(ch, start, length);
- }
- }
-
- @Override
- public String getPartContentType() {
- return partName;
- }
-
-
-
- void closeStyleTags() throws SAXException {
- if (hasWrittenFormatting) {
- if (currFormat.italics) {
- handler.endElement("i");
- }
- if (currFormat.bold) {
- handler.endElement("b");
- }
- }
-
- currFormat.bold = false;
- currFormat.italics = false;
- }
-
- private class TmpFormatting {
- boolean italics = false;
- boolean bold = false;
- }
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/CorePropertiesHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/CorePropertiesHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/CorePropertiesHandler.java
deleted file mode 100644
index b0bca08..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/CorePropertiesHandler.java
+++ /dev/null
@@ -1,144 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.poi.openxml4j.opc.ContentTypes;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.OfficeOpenXMLCore;
-import org.apache.tika.metadata.Property;
-import org.apache.tika.metadata.TikaCoreProperties;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-class CorePropertiesHandler extends PartHandler {
-
- final static String DC_NS = "http://purl.org/dc/elements/1.1";
- final static String DC_TERMS_NS = "http://purl.org/dc/terms";
- final static String CP_NS = "http://schemas.openxmlformats.org/package/2006/metadata/core-properties";
-
- private final Metadata metadata;
-
- final StringBuilder buffer = new StringBuilder();
- final Map<String, Map<String, Property>> properties = new HashMap<>();
-
- public CorePropertiesHandler(Metadata metadata) {
- this.metadata = metadata;
- addProperties();
- }
-
- void addProperties() {
- Map<String, Property> dc = properties.get(DC_NS);
- if (dc == null) {
- dc = new HashMap<>();
- }
- dc.put("creator", TikaCoreProperties.CREATOR);
- dc.put("title", TikaCoreProperties.TITLE);
- dc.put("description", TikaCoreProperties.DESCRIPTION);
- properties.put(DC_NS, dc);
-
- Map<String, Property> dcTerms = properties.get(DC_TERMS_NS);
- if (dcTerms == null) {
- dcTerms = new HashMap<>();
- }
- dcTerms.put("created", TikaCoreProperties.CREATED);
- dcTerms.put("modified", TikaCoreProperties.MODIFIED);
-
- properties.put(DC_TERMS_NS, dcTerms);
-
- Map<String, Property> cp = properties.get(CP_NS);
- if (cp == null) {
- cp = new HashMap<>();
- }
- cp.put("category", OfficeOpenXMLCore.CATEGORY);
- cp.put("contentStatus", OfficeOpenXMLCore.CONTENT_STATUS);
- cp.put("lastModifiedBy", OfficeOpenXMLCore.LAST_MODIFIED_BY);
- cp.put("lastPrinted", OfficeOpenXMLCore.LAST_PRINTED);
- cp.put("revision", OfficeOpenXMLCore.REVISION);
- cp.put("subject", OfficeOpenXMLCore.SUBJECT);
- cp.put("version", OfficeOpenXMLCore.VERSION);
- properties.put(CP_NS, cp);
- }
-
- @Override
- public void startDocument() throws SAXException {
- }
-
- @Override
- public void endDocument() throws SAXException {
- buffer.setLength(0);
- }
-
- @Override
- public void startPrefixMapping(String prefix, String uri) throws SAXException {
- }
-
- @Override
- public void endPrefixMapping(String prefix) throws SAXException {
- }
-
- @Override
- public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
-
- }
-
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
- Property prop = getProperty(uri, localName);
- if (prop != null) {
-
- if (prop.isMultiValuePermitted()) {
- metadata.add(prop, buffer.toString());
- } else {
- metadata.set(prop, buffer.toString());
- }
- }
- buffer.setLength(0);
-
- }
-
- private Property getProperty(String uri, String localName) {
- if (uri.endsWith("/")) {
- uri = uri.substring(0, uri.length()-1);
- }
-
- Map<String, Property> m = properties.get(uri);
- if (m != null) {
- return m.get(localName);
- }
- return null;
- }
-
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- buffer.append(ch, start, length);
- }
-
- @Override
- public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
- buffer.append(ch, start, length);
- }
-
- @Override
- public String getPartContentType() {
- return ContentTypes.CORE_PROPERTIES_PART;
- }
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ExtendedPropertiesHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ExtendedPropertiesHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ExtendedPropertiesHandler.java
deleted file mode 100644
index 07e5e23..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/ExtendedPropertiesHandler.java
+++ /dev/null
@@ -1,67 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.metadata.Office;
-import org.apache.tika.metadata.OfficeOpenXMLExtended;
-import org.apache.tika.metadata.Property;
-
-class ExtendedPropertiesHandler extends CorePropertiesHandler {
-
- final static String EP_NS = "http://schemas.openxmlformats.org/officeDocument/2006/extended-properties";
-
- public ExtendedPropertiesHandler(Metadata metadata) {
- super(metadata);
- }
-
- @Override
- void addProperties() {
- Map<String, Property> ep = properties.get(EP_NS);
- if (ep == null) {
- ep = new HashMap<>();
- }
- ep.put("AppVersion", OfficeOpenXMLExtended.APP_VERSION);
- ep.put("Application", OfficeOpenXMLExtended.APPLICATION);
- ep.put("Comments", OfficeOpenXMLExtended.COMMENTS);
- ep.put("Company", OfficeOpenXMLExtended.COMPANY);
- ep.put("DocSecurity", OfficeOpenXMLExtended.DOC_SECURITY);
- ep.put("HiddenSlides", OfficeOpenXMLExtended.HIDDEN_SLIDES);
- ep.put("Manager", OfficeOpenXMLExtended.MANAGER);
- ep.put("Notes", OfficeOpenXMLExtended.NOTES);
- ep.put("PresentationFormat", OfficeOpenXMLExtended.PRESENTATION_FORMAT);
- ep.put("Template", OfficeOpenXMLExtended.TEMPLATE);
- ep.put("TotalTime", OfficeOpenXMLExtended.TOTAL_TIME);
- ep.put("Pages", Office.PAGE_COUNT);
- ep.put("Words", Office.WORD_COUNT);
- ep.put("Characters", Office.CHARACTER_COUNT);
- ep.put("CharactersWithSpaces", Office.CHARACTER_COUNT_WITH_SPACES);
- ep.put("Paragraphs", Office.PARAGRAPH_COUNT);
- ep.put("Lines", Office.LINE_COUNT);
- properties.put(EP_NS, ep);
- }
-
- @Override
- public String getPartContentType() {
- return "application/vnd.openxmlformats-officedocument.extended-properties+xml";
- }
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/PartHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/PartHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/PartHandler.java
deleted file mode 100644
index 79bcafe..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/PartHandler.java
+++ /dev/null
@@ -1,43 +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.
- */
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-import org.apache.tika.exception.TikaException;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-abstract class PartHandler extends DefaultHandler {
-
- private String name;
-
- public abstract String getPartContentType();
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- /**
- * Override this to flush buffers, etc if necessary
- */
- void endPart() throws SAXException, TikaException {
-
- }
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Relationship.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Relationship.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Relationship.java
deleted file mode 100644
index 19b0dd4..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Relationship.java
+++ /dev/null
@@ -1,52 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-
-import org.apache.poi.openxml4j.opc.TargetMode;
-
-class Relationship {
-
- private final String contentType;
-
- private final String target;
-
- private final TargetMode targetMode;
-
- public Relationship(String contentType, String target) {
- this(contentType, target, null);
- }
-
- public Relationship(String contentType, String target, TargetMode targetMode) {
- this.contentType = contentType;
- this.target = target;
- this.targetMode = targetMode;
- }
-
- public String getContentType() {
- return contentType;
- }
-
- public String getTarget() {
- return target;
- }
-
- public TargetMode getTargetMode() {
- return targetMode;
- }
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/RelationshipsHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/RelationshipsHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/RelationshipsHandler.java
deleted file mode 100644
index 211b048..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/RelationshipsHandler.java
+++ /dev/null
@@ -1,86 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-
-import org.apache.poi.openxml4j.opc.ContentTypes;
-import org.apache.poi.openxml4j.opc.TargetMode;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-
-class RelationshipsHandler extends PartHandler {
-
- final static String REL_NS = "http://schemas.openxmlformats.org/package/2006/relationships";
-
- private final RelationshipsManager relationshipsManager;
-
- public RelationshipsHandler(RelationshipsManager relationshipsManager) {
- this.relationshipsManager = relationshipsManager;
- }
-
-
- @Override
- public void startDocument() throws SAXException {
- }
-
- @Override
- public void endDocument() throws SAXException {
- }
-
- @Override
- public void startPrefixMapping(String prefix, String uri) throws SAXException {
- }
-
- @Override
- public void endPrefixMapping(String prefix) throws SAXException {
- }
-
- @Override
- public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
- if (uri.equals(REL_NS)) {
- if (localName.equals("Relationship")) {
- String id = atts.getValue("", "Id");
- String type = atts.getValue("", "Type");
- String target = atts.getValue("", "Target");
- String targetModeString = atts.getValue("", "TargetMode");
- TargetMode targetMode = "EXTERNAL".equals(targetModeString)? TargetMode.EXTERNAL :
- TargetMode.INTERNAL;
- relationshipsManager.addRelationship(getName(), id, type, target, targetMode);
- }
- }
- }
-
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
- }
-
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- }
-
- @Override
- public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
-
- }
-
- @Override
- public String getPartContentType() {
- return ContentTypes.RELATIONSHIPS_PART;
- }
-
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/RelationshipsManager.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/RelationshipsManager.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/RelationshipsManager.java
deleted file mode 100644
index d1954ac..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/RelationshipsManager.java
+++ /dev/null
@@ -1,58 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.poi.openxml4j.opc.TargetMode;
-
-class RelationshipsManager {
-
- Map<String, Map<String, Relationship>> map = new HashMap<>();
-
- public void addRelationship(String relsFileName, String id, String type, String target, TargetMode targetMode) {
- String packageName = convertRelsFileNameToPackageName(relsFileName);
- Map<String, Relationship> thisPackageRels = map.get(packageName);
- if (thisPackageRels == null) {
- thisPackageRels = new HashMap<>();
- }
- thisPackageRels.put(id, new Relationship(type, target, targetMode));
- map.put(packageName, thisPackageRels);
- }
-
- public Relationship getRelationship(String packageName, String id) {
- Map<String, Relationship> thisPackageRels = map.get(packageName);
- if (thisPackageRels != null) {
- return thisPackageRels.get(id);
- }
- return null;
- }
-
- private String convertRelsFileNameToPackageName(String relsFileName) {
- if ("/_rels/.rels".equals(relsFileName)) {
- return "/";
- }
-
- String tmp = relsFileName;
- tmp = tmp.replaceFirst("\\/_rels\\/", "/");
- tmp = tmp.replaceFirst(".rels\\Z", "");
- return tmp;
- }
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLHandler.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLHandler.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLHandler.java
deleted file mode 100644
index cf919cc..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLHandler.java
+++ /dev/null
@@ -1,168 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.poi.xwpf.usermodel.XWPFRelation;
-import org.apache.tika.exception.TikaException;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.parser.ParseContext;
-import org.apache.tika.sax.XHTMLContentHandler;
-import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
-
-class Word2006MLHandler extends DefaultHandler {
-
- final static String PKG_NS = "http://schemas.microsoft.com/office/2006/xmlPackage";
-
-
- private final XHTMLContentHandler handler;
- private final Metadata metadata;
- private final ParseContext parseContext;
-
- private final Map<String, PartHandler> partHandlers = new HashMap<>();
- private final BinaryDataHandler binaryDataHandler;
- private final RelationshipsManager relationshipsManager = new RelationshipsManager();
- private PartHandler currentPartHandler = null;
-
- public Word2006MLHandler(XHTMLContentHandler handler, Metadata metadata, ParseContext context) {
- this.handler = handler;
- this.metadata = metadata;
- this.parseContext = context;
-
- addPackageHandler(new RelationshipsHandler(relationshipsManager));
-
- addPackageHandler(new BodyContentHandler(
- XWPFRelation.DOCUMENT.getContentType(),
- relationshipsManager,
- handler, metadata, context));
- addPackageHandler(new BodyContentHandler(
- XWPFRelation.FOOTNOTE.getContentType(),
- relationshipsManager,
- handler, metadata, context));
- addPackageHandler(new BodyContentHandler(
- "application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml",
- relationshipsManager,
- handler, metadata, context));
- addPackageHandler(new BodyContentHandler(
- XWPFRelation.HEADER.getContentType(),
- relationshipsManager,
- handler, metadata, context));
- addPackageHandler(new BodyContentHandler(
- XWPFRelation.FOOTER.getContentType(),
- relationshipsManager,
- handler, metadata, context));
- addPackageHandler(new BodyContentHandler(
- "application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml",
- relationshipsManager,
- handler, metadata, context));
- addPackageHandler(new BodyContentHandler(
- "application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml",
- relationshipsManager,
- handler, metadata, context));
- addPackageHandler(new BodyContentHandler(
- "application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml",
- relationshipsManager,
- handler, metadata, context));
-
- addPackageHandler(new CorePropertiesHandler(metadata));
- addPackageHandler(new ExtendedPropertiesHandler(metadata));
- binaryDataHandler = new BinaryDataHandler(handler, metadata, context);
- }
-
- private void addPackageHandler(PartHandler partHandler) {
- partHandlers.put(partHandler.getPartContentType(), partHandler);
- }
-
-
- @Override
- public void startDocument() throws SAXException {
- }
-
- @Override
- public void endDocument() throws SAXException {
- }
-
- @Override
- public void startPrefixMapping(String prefix, String uri) throws SAXException {
- }
-
- @Override
- public void endPrefixMapping(String prefix) throws SAXException {
-
- }
-
- @Override
- public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
- if (uri.equals(PKG_NS) && localName.equals("part")) {
- //start of a package
- String name = atts.getValue(PKG_NS, "name");
- String contentType = atts.getValue(PKG_NS, "contentType");
- currentPartHandler = partHandlers.get(contentType);
- //for now treat every unknown part type
- //as if it contained binary data
- if (currentPartHandler == null) {
- currentPartHandler = binaryDataHandler;
- }
- if (currentPartHandler != null) {
- currentPartHandler.setName(name);
- }
- } else if (currentPartHandler != null) {
- currentPartHandler.startElement(uri, localName, qName, atts);
- }
-
- }
-
- @Override
- public void endElement(String uri, String localName, String qName) throws SAXException {
- if (uri.equals(PKG_NS) && localName.equals("part")) {
- //do post processing
- if (currentPartHandler != null) {
- try {
- currentPartHandler.endPart();
- } catch (TikaException e) {
- throw new SAXException(e);
- }
- }
- //then reset
- currentPartHandler = null;
- } else if (currentPartHandler != null) {
- currentPartHandler.endElement(uri, localName, qName);
- }
- }
-
- @Override
- public void characters(char[] ch, int start, int length) throws SAXException {
- if (currentPartHandler != null) {
- currentPartHandler.characters(ch, start, length);
- }
- }
-
- @Override
- public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException {
- if (currentPartHandler != null) {
- currentPartHandler.characters(ch, start, length);
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/tika/blob/d19e4725/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLParser.java
----------------------------------------------------------------------
diff --git a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLParser.java b/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLParser.java
deleted file mode 100644
index 4609bf5..0000000
--- a/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/ooxml/xwpf/Word2006MLParser.java
+++ /dev/null
@@ -1,67 +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.
- */
-
-package org.apache.tika.parser.microsoft.ooxml.xwpf;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Collections;
-import java.util.Set;
-
-import org.apache.commons.io.input.CloseShieldInputStream;
-import org.apache.tika.exception.TikaException;
-import org.apache.tika.metadata.Metadata;
-import org.apache.tika.mime.MediaType;
-import org.apache.tika.parser.AbstractParser;
-import org.apache.tika.parser.ParseContext;
-import org.apache.tika.sax.EmbeddedContentHandler;
-import org.apache.tika.sax.OfflineContentHandler;
-import org.apache.tika.sax.XHTMLContentHandler;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.SAXException;
-
-
-public class Word2006MLParser extends AbstractParser {
-
- protected static final Set<MediaType> SUPPORTED_TYPES = Collections.singleton(
- MediaType.application("vnd.ms-word2006ml"));
-
- @Override
- public Set<MediaType> getSupportedTypes(ParseContext context) {
- return SUPPORTED_TYPES;
- }
-
- @Override
- public void parse(InputStream stream, ContentHandler handler,
- Metadata metadata, ParseContext context) throws IOException, SAXException, TikaException {
- final XHTMLContentHandler xhtml =
- new XHTMLContentHandler(handler, metadata);
-
- xhtml.startDocument();
-
- try {
- context.getSAXParser().parse(
- new CloseShieldInputStream(stream),
- new OfflineContentHandler(new EmbeddedContentHandler(
- new Word2006MLHandler(xhtml, metadata, context))));
- } catch (SAXException e) {
- throw new TikaException("XML parse error", e);
- } finally {
- xhtml.endDocument();
- }
- }
-}