From 69eca3955d050a10b9e922cb3dd3b77b0c4b7340 Mon Sep 17 00:00:00 2001 From: deiflaender Date: Tue, 25 Jul 2023 16:32:48 +0200 Subject: [PATCH] TEST: Added test that calls apryse.ai endoint and prints tables into documents --- .../redaction-service-server-v1/pom.xml | 12 + .../v1/server/apryse/ApryseAiResponse.java | 98 + .../redaction/v1/server/apryse/Cell.java | 213 + .../redaction/v1/server/apryse/Element.java | 236 ++ .../redaction/v1/server/apryse/Kid.java | 213 + .../redaction/v1/server/apryse/Kid__1.java | 167 + .../redaction/v1/server/apryse/Kid__2.java | 121 + .../redaction/v1/server/apryse/Kid__3.java | 213 + .../redaction/v1/server/apryse/Kid__4.java | 167 + .../redaction/v1/server/apryse/Page.java | 121 + .../v1/server/apryse/Properties.java | 190 + .../redaction/v1/server/apryse/Style.java | 211 + .../redaction/v1/server/apryse/Style__1.java | 211 + .../redaction/v1/server/ApryseAiTest.java | 261 ++ .../test/resources/files/apryseAi/Input.json | 3526 +++++++++++++++++ .../test/resources/files/apryseAi/Input.pdf | Bin 0 -> 15505 bytes 16 files changed, 5960 insertions(+) create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/ApryseAiResponse.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Cell.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Element.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__1.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__2.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__3.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__4.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Page.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Properties.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Style.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Style__1.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/ApryseAiTest.java create mode 100644 redaction-service-v1/redaction-service-server-v1/src/test/resources/files/apryseAi/Input.json create mode 100644 redaction-service-v1/redaction-service-server-v1/src/test/resources/files/apryseAi/Input.pdf diff --git a/redaction-service-v1/redaction-service-server-v1/pom.xml b/redaction-service-v1/redaction-service-server-v1/pom.xml index e063363e..4130b3bc 100644 --- a/redaction-service-v1/redaction-service-server-v1/pom.xml +++ b/redaction-service-v1/redaction-service-server-v1/pom.xml @@ -22,6 +22,18 @@ + + org.jsonschema2pojo + jsonschema2pojo-core + 1.1.1 + + + + org.apache.httpcomponents.client5 + httpclient5 + 5.1.3 + + com.knecon.fforesight tenant-commons diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/ApryseAiResponse.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/ApryseAiResponse.java new file mode 100644 index 00000000..6bf7f3ca --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/ApryseAiResponse.java @@ -0,0 +1,98 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "pages" +}) +@Generated("jsonschema2pojo") +public class ApryseAiResponse { + + @JsonProperty("pages") + private List pages = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("pages") + public List getPages() { + return pages; + } + + @JsonProperty("pages") + public void setPages(List pages) { + this.pages = pages; + } + + public ApryseAiResponse withPages(List pages) { + this.pages = pages; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public ApryseAiResponse withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(ApryseAiResponse.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("pages"); + sb.append('='); + sb.append(((this.pages == null)?"":this.pages)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.pages == null)? 0 :this.pages.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof ApryseAiResponse) == false) { + return false; + } + ApryseAiResponse rhs = ((ApryseAiResponse) other); + return (((this.pages == rhs.pages)||((this.pages!= null)&&this.pages.equals(rhs.pages)))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Cell.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Cell.java new file mode 100644 index 00000000..a0470824 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Cell.java @@ -0,0 +1,213 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "rect", + "rowStart", + "rowEnd", + "columnStart", + "columnEnd", + "kids" +}) +@Generated("jsonschema2pojo") +public class Cell { + + @JsonProperty("rect") + private List rect = new ArrayList(); + @JsonProperty("rowStart") + private Integer rowStart; + @JsonProperty("rowEnd") + private Integer rowEnd; + @JsonProperty("columnStart") + private Integer columnStart; + @JsonProperty("columnEnd") + private Integer columnEnd; + @JsonProperty("kids") + private List kids = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("rect") + public List getRect() { + return rect; + } + + @JsonProperty("rect") + public void setRect(List rect) { + this.rect = rect; + } + + public Cell withRect(List rect) { + this.rect = rect; + return this; + } + + @JsonProperty("rowStart") + public Integer getRowStart() { + return rowStart; + } + + @JsonProperty("rowStart") + public void setRowStart(Integer rowStart) { + this.rowStart = rowStart; + } + + public Cell withRowStart(Integer rowStart) { + this.rowStart = rowStart; + return this; + } + + @JsonProperty("rowEnd") + public Integer getRowEnd() { + return rowEnd; + } + + @JsonProperty("rowEnd") + public void setRowEnd(Integer rowEnd) { + this.rowEnd = rowEnd; + } + + public Cell withRowEnd(Integer rowEnd) { + this.rowEnd = rowEnd; + return this; + } + + @JsonProperty("columnStart") + public Integer getColumnStart() { + return columnStart; + } + + @JsonProperty("columnStart") + public void setColumnStart(Integer columnStart) { + this.columnStart = columnStart; + } + + public Cell withColumnStart(Integer columnStart) { + this.columnStart = columnStart; + return this; + } + + @JsonProperty("columnEnd") + public Integer getColumnEnd() { + return columnEnd; + } + + @JsonProperty("columnEnd") + public void setColumnEnd(Integer columnEnd) { + this.columnEnd = columnEnd; + } + + public Cell withColumnEnd(Integer columnEnd) { + this.columnEnd = columnEnd; + return this; + } + + @JsonProperty("kids") + public List getKids() { + return kids; + } + + @JsonProperty("kids") + public void setKids(List kids) { + this.kids = kids; + } + + public Cell withKids(List kids) { + this.kids = kids; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Cell withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Cell.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("rect"); + sb.append('='); + sb.append(((this.rect == null)?"":this.rect)); + sb.append(','); + sb.append("rowStart"); + sb.append('='); + sb.append(((this.rowStart == null)?"":this.rowStart)); + sb.append(','); + sb.append("rowEnd"); + sb.append('='); + sb.append(((this.rowEnd == null)?"":this.rowEnd)); + sb.append(','); + sb.append("columnStart"); + sb.append('='); + sb.append(((this.columnStart == null)?"":this.columnStart)); + sb.append(','); + sb.append("columnEnd"); + sb.append('='); + sb.append(((this.columnEnd == null)?"":this.columnEnd)); + sb.append(','); + sb.append("kids"); + sb.append('='); + sb.append(((this.kids == null)?"":this.kids)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.rect == null)? 0 :this.rect.hashCode())); + result = ((result* 31)+((this.columnEnd == null)? 0 :this.columnEnd.hashCode())); + result = ((result* 31)+((this.columnStart == null)? 0 :this.columnStart.hashCode())); + result = ((result* 31)+((this.rowStart == null)? 0 :this.rowStart.hashCode())); + result = ((result* 31)+((this.rowEnd == null)? 0 :this.rowEnd.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.kids == null)? 0 :this.kids.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Cell) == false) { + return false; + } + Cell rhs = ((Cell) other); + return ((((((((this.rect == rhs.rect)||((this.rect!= null)&&this.rect.equals(rhs.rect)))&&((this.columnEnd == rhs.columnEnd)||((this.columnEnd!= null)&&this.columnEnd.equals(rhs.columnEnd))))&&((this.columnStart == rhs.columnStart)||((this.columnStart!= null)&&this.columnStart.equals(rhs.columnStart))))&&((this.rowStart == rhs.rowStart)||((this.rowStart!= null)&&this.rowStart.equals(rhs.rowStart))))&&((this.rowEnd == rhs.rowEnd)||((this.rowEnd!= null)&&this.rowEnd.equals(rhs.rowEnd))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.kids == rhs.kids)||((this.kids!= null)&&this.kids.equals(rhs.kids)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Element.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Element.java new file mode 100644 index 00000000..c71595c7 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Element.java @@ -0,0 +1,236 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "type", + "kids", + "confidence", + "rect", + "rowSeparators", + "columnSeparators", + "cells" +}) +@Generated("jsonschema2pojo") +public class Element { + + @JsonProperty("type") + private String type; + @JsonProperty("kids") + private List kids = new ArrayList(); + @JsonProperty("confidence") + private Double confidence; + @JsonProperty("rect") + private List rect = new ArrayList(); + @JsonProperty("rowSeparators") + private List rowSeparators = new ArrayList(); + @JsonProperty("columnSeparators") + private List columnSeparators = new ArrayList(); + @JsonProperty("cells") + private List cells = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("type") + public String getType() { + return type; + } + + @JsonProperty("type") + public void setType(String type) { + this.type = type; + } + + public Element withType(String type) { + this.type = type; + return this; + } + + @JsonProperty("kids") + public List getKids() { + return kids; + } + + @JsonProperty("kids") + public void setKids(List kids) { + this.kids = kids; + } + + public Element withKids(List kids) { + this.kids = kids; + return this; + } + + @JsonProperty("confidence") + public Double getConfidence() { + return confidence; + } + + @JsonProperty("confidence") + public void setConfidence(Double confidence) { + this.confidence = confidence; + } + + public Element withConfidence(Double confidence) { + this.confidence = confidence; + return this; + } + + @JsonProperty("rect") + public List getRect() { + return rect; + } + + @JsonProperty("rect") + public void setRect(List rect) { + this.rect = rect; + } + + public Element withRect(List rect) { + this.rect = rect; + return this; + } + + @JsonProperty("rowSeparators") + public List getRowSeparators() { + return rowSeparators; + } + + @JsonProperty("rowSeparators") + public void setRowSeparators(List rowSeparators) { + this.rowSeparators = rowSeparators; + } + + public Element withRowSeparators(List rowSeparators) { + this.rowSeparators = rowSeparators; + return this; + } + + @JsonProperty("columnSeparators") + public List getColumnSeparators() { + return columnSeparators; + } + + @JsonProperty("columnSeparators") + public void setColumnSeparators(List columnSeparators) { + this.columnSeparators = columnSeparators; + } + + public Element withColumnSeparators(List columnSeparators) { + this.columnSeparators = columnSeparators; + return this; + } + + @JsonProperty("cells") + public List getCells() { + return cells; + } + + @JsonProperty("cells") + public void setCells(List cells) { + this.cells = cells; + } + + public Element withCells(List cells) { + this.cells = cells; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Element withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Element.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("type"); + sb.append('='); + sb.append(((this.type == null)?"":this.type)); + sb.append(','); + sb.append("kids"); + sb.append('='); + sb.append(((this.kids == null)?"":this.kids)); + sb.append(','); + sb.append("confidence"); + sb.append('='); + sb.append(((this.confidence == null)?"":this.confidence)); + sb.append(','); + sb.append("rect"); + sb.append('='); + sb.append(((this.rect == null)?"":this.rect)); + sb.append(','); + sb.append("rowSeparators"); + sb.append('='); + sb.append(((this.rowSeparators == null)?"":this.rowSeparators)); + sb.append(','); + sb.append("columnSeparators"); + sb.append('='); + sb.append(((this.columnSeparators == null)?"":this.columnSeparators)); + sb.append(','); + sb.append("cells"); + sb.append('='); + sb.append(((this.cells == null)?"":this.cells)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.rect == null)? 0 :this.rect.hashCode())); + result = ((result* 31)+((this.cells == null)? 0 :this.cells.hashCode())); + result = ((result* 31)+((this.confidence == null)? 0 :this.confidence.hashCode())); + result = ((result* 31)+((this.columnSeparators == null)? 0 :this.columnSeparators.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.type == null)? 0 :this.type.hashCode())); + result = ((result* 31)+((this.rowSeparators == null)? 0 :this.rowSeparators.hashCode())); + result = ((result* 31)+((this.kids == null)? 0 :this.kids.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Element) == false) { + return false; + } + Element rhs = ((Element) other); + return (((((((((this.rect == rhs.rect)||((this.rect!= null)&&this.rect.equals(rhs.rect)))&&((this.cells == rhs.cells)||((this.cells!= null)&&this.cells.equals(rhs.cells))))&&((this.confidence == rhs.confidence)||((this.confidence!= null)&&this.confidence.equals(rhs.confidence))))&&((this.columnSeparators == rhs.columnSeparators)||((this.columnSeparators!= null)&&this.columnSeparators.equals(rhs.columnSeparators))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.type == rhs.type)||((this.type!= null)&&this.type.equals(rhs.type))))&&((this.rowSeparators == rhs.rowSeparators)||((this.rowSeparators!= null)&&this.rowSeparators.equals(rhs.rowSeparators))))&&((this.kids == rhs.kids)||((this.kids!= null)&&this.kids.equals(rhs.kids)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid.java new file mode 100644 index 00000000..867b13f3 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid.java @@ -0,0 +1,213 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "type", + "rect", + "quad", + "text", + "style", + "kids" +}) +@Generated("jsonschema2pojo") +public class Kid { + + @JsonProperty("type") + private String type; + @JsonProperty("rect") + private List rect = new ArrayList(); + @JsonProperty("quad") + private List quad = new ArrayList(); + @JsonProperty("text") + private String text; + @JsonProperty("style") + private Style style; + @JsonProperty("kids") + private List kids = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("type") + public String getType() { + return type; + } + + @JsonProperty("type") + public void setType(String type) { + this.type = type; + } + + public Kid withType(String type) { + this.type = type; + return this; + } + + @JsonProperty("rect") + public List getRect() { + return rect; + } + + @JsonProperty("rect") + public void setRect(List rect) { + this.rect = rect; + } + + public Kid withRect(List rect) { + this.rect = rect; + return this; + } + + @JsonProperty("quad") + public List getQuad() { + return quad; + } + + @JsonProperty("quad") + public void setQuad(List quad) { + this.quad = quad; + } + + public Kid withQuad(List quad) { + this.quad = quad; + return this; + } + + @JsonProperty("text") + public String getText() { + return text; + } + + @JsonProperty("text") + public void setText(String text) { + this.text = text; + } + + public Kid withText(String text) { + this.text = text; + return this; + } + + @JsonProperty("style") + public Style getStyle() { + return style; + } + + @JsonProperty("style") + public void setStyle(Style style) { + this.style = style; + } + + public Kid withStyle(Style style) { + this.style = style; + return this; + } + + @JsonProperty("kids") + public List getKids() { + return kids; + } + + @JsonProperty("kids") + public void setKids(List kids) { + this.kids = kids; + } + + public Kid withKids(List kids) { + this.kids = kids; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Kid withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Kid.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("type"); + sb.append('='); + sb.append(((this.type == null)?"":this.type)); + sb.append(','); + sb.append("rect"); + sb.append('='); + sb.append(((this.rect == null)?"":this.rect)); + sb.append(','); + sb.append("quad"); + sb.append('='); + sb.append(((this.quad == null)?"":this.quad)); + sb.append(','); + sb.append("text"); + sb.append('='); + sb.append(((this.text == null)?"":this.text)); + sb.append(','); + sb.append("style"); + sb.append('='); + sb.append(((this.style == null)?"":this.style)); + sb.append(','); + sb.append("kids"); + sb.append('='); + sb.append(((this.kids == null)?"":this.kids)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.rect == null)? 0 :this.rect.hashCode())); + result = ((result* 31)+((this.quad == null)? 0 :this.quad.hashCode())); + result = ((result* 31)+((this.style == null)? 0 :this.style.hashCode())); + result = ((result* 31)+((this.text == null)? 0 :this.text.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.type == null)? 0 :this.type.hashCode())); + result = ((result* 31)+((this.kids == null)? 0 :this.kids.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Kid) == false) { + return false; + } + Kid rhs = ((Kid) other); + return ((((((((this.rect == rhs.rect)||((this.rect!= null)&&this.rect.equals(rhs.rect)))&&((this.quad == rhs.quad)||((this.quad!= null)&&this.quad.equals(rhs.quad))))&&((this.style == rhs.style)||((this.style!= null)&&this.style.equals(rhs.style))))&&((this.text == rhs.text)||((this.text!= null)&&this.text.equals(rhs.text))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.type == rhs.type)||((this.type!= null)&&this.type.equals(rhs.type))))&&((this.kids == rhs.kids)||((this.kids!= null)&&this.kids.equals(rhs.kids)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__1.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__1.java new file mode 100644 index 00000000..4c50f1fd --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__1.java @@ -0,0 +1,167 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "type", + "rect", + "quad", + "text" +}) +@Generated("jsonschema2pojo") +public class Kid__1 { + + @JsonProperty("type") + private String type; + @JsonProperty("rect") + private List rect = new ArrayList(); + @JsonProperty("quad") + private List quad = new ArrayList(); + @JsonProperty("text") + private String text; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("type") + public String getType() { + return type; + } + + @JsonProperty("type") + public void setType(String type) { + this.type = type; + } + + public Kid__1 withType(String type) { + this.type = type; + return this; + } + + @JsonProperty("rect") + public List getRect() { + return rect; + } + + @JsonProperty("rect") + public void setRect(List rect) { + this.rect = rect; + } + + public Kid__1 withRect(List rect) { + this.rect = rect; + return this; + } + + @JsonProperty("quad") + public List getQuad() { + return quad; + } + + @JsonProperty("quad") + public void setQuad(List quad) { + this.quad = quad; + } + + public Kid__1 withQuad(List quad) { + this.quad = quad; + return this; + } + + @JsonProperty("text") + public String getText() { + return text; + } + + @JsonProperty("text") + public void setText(String text) { + this.text = text; + } + + public Kid__1 withText(String text) { + this.text = text; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Kid__1 withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Kid__1 .class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("type"); + sb.append('='); + sb.append(((this.type == null)?"":this.type)); + sb.append(','); + sb.append("rect"); + sb.append('='); + sb.append(((this.rect == null)?"":this.rect)); + sb.append(','); + sb.append("quad"); + sb.append('='); + sb.append(((this.quad == null)?"":this.quad)); + sb.append(','); + sb.append("text"); + sb.append('='); + sb.append(((this.text == null)?"":this.text)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.rect == null)? 0 :this.rect.hashCode())); + result = ((result* 31)+((this.quad == null)? 0 :this.quad.hashCode())); + result = ((result* 31)+((this.text == null)? 0 :this.text.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.type == null)? 0 :this.type.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Kid__1) == false) { + return false; + } + Kid__1 rhs = ((Kid__1) other); + return ((((((this.rect == rhs.rect)||((this.rect!= null)&&this.rect.equals(rhs.rect)))&&((this.quad == rhs.quad)||((this.quad!= null)&&this.quad.equals(rhs.quad))))&&((this.text == rhs.text)||((this.text!= null)&&this.text.equals(rhs.text))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.type == rhs.type)||((this.type!= null)&&this.type.equals(rhs.type)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__2.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__2.java new file mode 100644 index 00000000..901d0fa0 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__2.java @@ -0,0 +1,121 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "type", + "kids" +}) +@Generated("jsonschema2pojo") +public class Kid__2 { + + @JsonProperty("type") + private String type; + @JsonProperty("kids") + private List kids = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("type") + public String getType() { + return type; + } + + @JsonProperty("type") + public void setType(String type) { + this.type = type; + } + + public Kid__2 withType(String type) { + this.type = type; + return this; + } + + @JsonProperty("kids") + public List getKids() { + return kids; + } + + @JsonProperty("kids") + public void setKids(List kids) { + this.kids = kids; + } + + public Kid__2 withKids(List kids) { + this.kids = kids; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Kid__2 withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Kid__2 .class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("type"); + sb.append('='); + sb.append(((this.type == null)?"":this.type)); + sb.append(','); + sb.append("kids"); + sb.append('='); + sb.append(((this.kids == null)?"":this.kids)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.type == null)? 0 :this.type.hashCode())); + result = ((result* 31)+((this.kids == null)? 0 :this.kids.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Kid__2) == false) { + return false; + } + Kid__2 rhs = ((Kid__2) other); + return ((((this.type == rhs.type)||((this.type!= null)&&this.type.equals(rhs.type)))&&((this.kids == rhs.kids)||((this.kids!= null)&&this.kids.equals(rhs.kids))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__3.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__3.java new file mode 100644 index 00000000..b41f6dbd --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__3.java @@ -0,0 +1,213 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "type", + "rect", + "quad", + "text", + "style", + "kids" +}) +@Generated("jsonschema2pojo") +public class Kid__3 { + + @JsonProperty("type") + private String type; + @JsonProperty("rect") + private List rect = new ArrayList(); + @JsonProperty("quad") + private List quad = new ArrayList(); + @JsonProperty("text") + private String text; + @JsonProperty("style") + private Style__1 style; + @JsonProperty("kids") + private List kids = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("type") + public String getType() { + return type; + } + + @JsonProperty("type") + public void setType(String type) { + this.type = type; + } + + public Kid__3 withType(String type) { + this.type = type; + return this; + } + + @JsonProperty("rect") + public List getRect() { + return rect; + } + + @JsonProperty("rect") + public void setRect(List rect) { + this.rect = rect; + } + + public Kid__3 withRect(List rect) { + this.rect = rect; + return this; + } + + @JsonProperty("quad") + public List getQuad() { + return quad; + } + + @JsonProperty("quad") + public void setQuad(List quad) { + this.quad = quad; + } + + public Kid__3 withQuad(List quad) { + this.quad = quad; + return this; + } + + @JsonProperty("text") + public String getText() { + return text; + } + + @JsonProperty("text") + public void setText(String text) { + this.text = text; + } + + public Kid__3 withText(String text) { + this.text = text; + return this; + } + + @JsonProperty("style") + public Style__1 getStyle() { + return style; + } + + @JsonProperty("style") + public void setStyle(Style__1 style) { + this.style = style; + } + + public Kid__3 withStyle(Style__1 style) { + this.style = style; + return this; + } + + @JsonProperty("kids") + public List getKids() { + return kids; + } + + @JsonProperty("kids") + public void setKids(List kids) { + this.kids = kids; + } + + public Kid__3 withKids(List kids) { + this.kids = kids; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Kid__3 withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Kid__3 .class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("type"); + sb.append('='); + sb.append(((this.type == null)?"":this.type)); + sb.append(','); + sb.append("rect"); + sb.append('='); + sb.append(((this.rect == null)?"":this.rect)); + sb.append(','); + sb.append("quad"); + sb.append('='); + sb.append(((this.quad == null)?"":this.quad)); + sb.append(','); + sb.append("text"); + sb.append('='); + sb.append(((this.text == null)?"":this.text)); + sb.append(','); + sb.append("style"); + sb.append('='); + sb.append(((this.style == null)?"":this.style)); + sb.append(','); + sb.append("kids"); + sb.append('='); + sb.append(((this.kids == null)?"":this.kids)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.rect == null)? 0 :this.rect.hashCode())); + result = ((result* 31)+((this.quad == null)? 0 :this.quad.hashCode())); + result = ((result* 31)+((this.style == null)? 0 :this.style.hashCode())); + result = ((result* 31)+((this.text == null)? 0 :this.text.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.type == null)? 0 :this.type.hashCode())); + result = ((result* 31)+((this.kids == null)? 0 :this.kids.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Kid__3) == false) { + return false; + } + Kid__3 rhs = ((Kid__3) other); + return ((((((((this.rect == rhs.rect)||((this.rect!= null)&&this.rect.equals(rhs.rect)))&&((this.quad == rhs.quad)||((this.quad!= null)&&this.quad.equals(rhs.quad))))&&((this.style == rhs.style)||((this.style!= null)&&this.style.equals(rhs.style))))&&((this.text == rhs.text)||((this.text!= null)&&this.text.equals(rhs.text))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.type == rhs.type)||((this.type!= null)&&this.type.equals(rhs.type))))&&((this.kids == rhs.kids)||((this.kids!= null)&&this.kids.equals(rhs.kids)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__4.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__4.java new file mode 100644 index 00000000..20650deb --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Kid__4.java @@ -0,0 +1,167 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "type", + "rect", + "quad", + "text" +}) +@Generated("jsonschema2pojo") +public class Kid__4 { + + @JsonProperty("type") + private String type; + @JsonProperty("rect") + private List rect = new ArrayList(); + @JsonProperty("quad") + private List quad = new ArrayList(); + @JsonProperty("text") + private String text; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("type") + public String getType() { + return type; + } + + @JsonProperty("type") + public void setType(String type) { + this.type = type; + } + + public Kid__4 withType(String type) { + this.type = type; + return this; + } + + @JsonProperty("rect") + public List getRect() { + return rect; + } + + @JsonProperty("rect") + public void setRect(List rect) { + this.rect = rect; + } + + public Kid__4 withRect(List rect) { + this.rect = rect; + return this; + } + + @JsonProperty("quad") + public List getQuad() { + return quad; + } + + @JsonProperty("quad") + public void setQuad(List quad) { + this.quad = quad; + } + + public Kid__4 withQuad(List quad) { + this.quad = quad; + return this; + } + + @JsonProperty("text") + public String getText() { + return text; + } + + @JsonProperty("text") + public void setText(String text) { + this.text = text; + } + + public Kid__4 withText(String text) { + this.text = text; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Kid__4 withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Kid__4 .class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("type"); + sb.append('='); + sb.append(((this.type == null)?"":this.type)); + sb.append(','); + sb.append("rect"); + sb.append('='); + sb.append(((this.rect == null)?"":this.rect)); + sb.append(','); + sb.append("quad"); + sb.append('='); + sb.append(((this.quad == null)?"":this.quad)); + sb.append(','); + sb.append("text"); + sb.append('='); + sb.append(((this.text == null)?"":this.text)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.rect == null)? 0 :this.rect.hashCode())); + result = ((result* 31)+((this.quad == null)? 0 :this.quad.hashCode())); + result = ((result* 31)+((this.text == null)? 0 :this.text.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.type == null)? 0 :this.type.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Kid__4) == false) { + return false; + } + Kid__4 rhs = ((Kid__4) other); + return ((((((this.rect == rhs.rect)||((this.rect!= null)&&this.rect.equals(rhs.rect)))&&((this.quad == rhs.quad)||((this.quad!= null)&&this.quad.equals(rhs.quad))))&&((this.text == rhs.text)||((this.text!= null)&&this.text.equals(rhs.text))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.type == rhs.type)||((this.type!= null)&&this.type.equals(rhs.type)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Page.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Page.java new file mode 100644 index 00000000..773a62af --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Page.java @@ -0,0 +1,121 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "properties", + "elements" +}) +@Generated("jsonschema2pojo") +public class Page { + + @JsonProperty("properties") + private Properties properties; + @JsonProperty("elements") + private List elements = new ArrayList(); + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("properties") + public Properties getProperties() { + return properties; + } + + @JsonProperty("properties") + public void setProperties(Properties properties) { + this.properties = properties; + } + + public Page withProperties(Properties properties) { + this.properties = properties; + return this; + } + + @JsonProperty("elements") + public List getElements() { + return elements; + } + + @JsonProperty("elements") + public void setElements(List elements) { + this.elements = elements; + } + + public Page withElements(List elements) { + this.elements = elements; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Page withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Page.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("properties"); + sb.append('='); + sb.append(((this.properties == null)?"":this.properties)); + sb.append(','); + sb.append("elements"); + sb.append('='); + sb.append(((this.elements == null)?"":this.elements)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.properties == null)? 0 :this.properties.hashCode())); + result = ((result* 31)+((this.elements == null)? 0 :this.elements.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Page) == false) { + return false; + } + Page rhs = ((Page) other); + return ((((this.properties == rhs.properties)||((this.properties!= null)&&this.properties.equals(rhs.properties)))&&((this.elements == rhs.elements)||((this.elements!= null)&&this.elements.equals(rhs.elements))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Properties.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Properties.java new file mode 100644 index 00000000..e41a2035 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Properties.java @@ -0,0 +1,190 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "pageNumber", + "cropBox", + "mediaBox", + "rotation", + "langCode" +}) +@Generated("jsonschema2pojo") +public class Properties { + + @JsonProperty("pageNumber") + private Integer pageNumber; + @JsonProperty("cropBox") + private List cropBox = new ArrayList(); + @JsonProperty("mediaBox") + private List mediaBox = new ArrayList(); + @JsonProperty("rotation") + private Integer rotation; + @JsonProperty("langCode") + private String langCode; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("pageNumber") + public Integer getPageNumber() { + return pageNumber; + } + + @JsonProperty("pageNumber") + public void setPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + } + + public Properties withPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + return this; + } + + @JsonProperty("cropBox") + public List getCropBox() { + return cropBox; + } + + @JsonProperty("cropBox") + public void setCropBox(List cropBox) { + this.cropBox = cropBox; + } + + public Properties withCropBox(List cropBox) { + this.cropBox = cropBox; + return this; + } + + @JsonProperty("mediaBox") + public List getMediaBox() { + return mediaBox; + } + + @JsonProperty("mediaBox") + public void setMediaBox(List mediaBox) { + this.mediaBox = mediaBox; + } + + public Properties withMediaBox(List mediaBox) { + this.mediaBox = mediaBox; + return this; + } + + @JsonProperty("rotation") + public Integer getRotation() { + return rotation; + } + + @JsonProperty("rotation") + public void setRotation(Integer rotation) { + this.rotation = rotation; + } + + public Properties withRotation(Integer rotation) { + this.rotation = rotation; + return this; + } + + @JsonProperty("langCode") + public String getLangCode() { + return langCode; + } + + @JsonProperty("langCode") + public void setLangCode(String langCode) { + this.langCode = langCode; + } + + public Properties withLangCode(String langCode) { + this.langCode = langCode; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Properties withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Properties.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("pageNumber"); + sb.append('='); + sb.append(((this.pageNumber == null)?"":this.pageNumber)); + sb.append(','); + sb.append("cropBox"); + sb.append('='); + sb.append(((this.cropBox == null)?"":this.cropBox)); + sb.append(','); + sb.append("mediaBox"); + sb.append('='); + sb.append(((this.mediaBox == null)?"":this.mediaBox)); + sb.append(','); + sb.append("rotation"); + sb.append('='); + sb.append(((this.rotation == null)?"":this.rotation)); + sb.append(','); + sb.append("langCode"); + sb.append('='); + sb.append(((this.langCode == null)?"":this.langCode)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.mediaBox == null)? 0 :this.mediaBox.hashCode())); + result = ((result* 31)+((this.cropBox == null)? 0 :this.cropBox.hashCode())); + result = ((result* 31)+((this.pageNumber == null)? 0 :this.pageNumber.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.rotation == null)? 0 :this.rotation.hashCode())); + result = ((result* 31)+((this.langCode == null)? 0 :this.langCode.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Properties) == false) { + return false; + } + Properties rhs = ((Properties) other); + return (((((((this.mediaBox == rhs.mediaBox)||((this.mediaBox!= null)&&this.mediaBox.equals(rhs.mediaBox)))&&((this.cropBox == rhs.cropBox)||((this.cropBox!= null)&&this.cropBox.equals(rhs.cropBox))))&&((this.pageNumber == rhs.pageNumber)||((this.pageNumber!= null)&&this.pageNumber.equals(rhs.pageNumber))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.rotation == rhs.rotation)||((this.rotation!= null)&&this.rotation.equals(rhs.rotation))))&&((this.langCode == rhs.langCode)||((this.langCode!= null)&&this.langCode.equals(rhs.langCode)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Style.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Style.java new file mode 100644 index 00000000..74fbb889 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Style.java @@ -0,0 +1,211 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "color", + "name", + "size", + "weight", + "italic", + "serif" +}) +@Generated("jsonschema2pojo") +public class Style { + + @JsonProperty("color") + private String color; + @JsonProperty("name") + private String name; + @JsonProperty("size") + private Double size; + @JsonProperty("weight") + private Double weight; + @JsonProperty("italic") + private Boolean italic; + @JsonProperty("serif") + private Boolean serif; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("color") + public String getColor() { + return color; + } + + @JsonProperty("color") + public void setColor(String color) { + this.color = color; + } + + public Style withColor(String color) { + this.color = color; + return this; + } + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + + public Style withName(String name) { + this.name = name; + return this; + } + + @JsonProperty("size") + public Double getSize() { + return size; + } + + @JsonProperty("size") + public void setSize(Double size) { + this.size = size; + } + + public Style withSize(Double size) { + this.size = size; + return this; + } + + @JsonProperty("weight") + public Double getWeight() { + return weight; + } + + @JsonProperty("weight") + public void setWeight(Double weight) { + this.weight = weight; + } + + public Style withWeight(Double weight) { + this.weight = weight; + return this; + } + + @JsonProperty("italic") + public Boolean getItalic() { + return italic; + } + + @JsonProperty("italic") + public void setItalic(Boolean italic) { + this.italic = italic; + } + + public Style withItalic(Boolean italic) { + this.italic = italic; + return this; + } + + @JsonProperty("serif") + public Boolean getSerif() { + return serif; + } + + @JsonProperty("serif") + public void setSerif(Boolean serif) { + this.serif = serif; + } + + public Style withSerif(Boolean serif) { + this.serif = serif; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Style withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Style.class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("color"); + sb.append('='); + sb.append(((this.color == null)?"":this.color)); + sb.append(','); + sb.append("name"); + sb.append('='); + sb.append(((this.name == null)?"":this.name)); + sb.append(','); + sb.append("size"); + sb.append('='); + sb.append(((this.size == null)?"":this.size)); + sb.append(','); + sb.append("weight"); + sb.append('='); + sb.append(((this.weight == null)?"":this.weight)); + sb.append(','); + sb.append("italic"); + sb.append('='); + sb.append(((this.italic == null)?"":this.italic)); + sb.append(','); + sb.append("serif"); + sb.append('='); + sb.append(((this.serif == null)?"":this.serif)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.color == null)? 0 :this.color.hashCode())); + result = ((result* 31)+((this.size == null)? 0 :this.size.hashCode())); + result = ((result* 31)+((this.name == null)? 0 :this.name.hashCode())); + result = ((result* 31)+((this.weight == null)? 0 :this.weight.hashCode())); + result = ((result* 31)+((this.serif == null)? 0 :this.serif.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.italic == null)? 0 :this.italic.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Style) == false) { + return false; + } + Style rhs = ((Style) other); + return ((((((((this.color == rhs.color)||((this.color!= null)&&this.color.equals(rhs.color)))&&((this.size == rhs.size)||((this.size!= null)&&this.size.equals(rhs.size))))&&((this.name == rhs.name)||((this.name!= null)&&this.name.equals(rhs.name))))&&((this.weight == rhs.weight)||((this.weight!= null)&&this.weight.equals(rhs.weight))))&&((this.serif == rhs.serif)||((this.serif!= null)&&this.serif.equals(rhs.serif))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.italic == rhs.italic)||((this.italic!= null)&&this.italic.equals(rhs.italic)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Style__1.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Style__1.java new file mode 100644 index 00000000..59d9887a --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/apryse/Style__1.java @@ -0,0 +1,211 @@ + +package com.iqser.red.service.redaction.v1.server.apryse; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.processing.Generated; +import com.fasterxml.jackson.annotation.JsonAnyGetter; +import com.fasterxml.jackson.annotation.JsonAnySetter; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.fasterxml.jackson.annotation.JsonPropertyOrder; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonPropertyOrder({ + "color", + "name", + "size", + "weight", + "italic", + "serif" +}) +@Generated("jsonschema2pojo") +public class Style__1 { + + @JsonProperty("color") + private String color; + @JsonProperty("name") + private String name; + @JsonProperty("size") + private Double size; + @JsonProperty("weight") + private Double weight; + @JsonProperty("italic") + private Boolean italic; + @JsonProperty("serif") + private Boolean serif; + @JsonIgnore + private Map additionalProperties = new HashMap(); + + @JsonProperty("color") + public String getColor() { + return color; + } + + @JsonProperty("color") + public void setColor(String color) { + this.color = color; + } + + public Style__1 withColor(String color) { + this.color = color; + return this; + } + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + + public Style__1 withName(String name) { + this.name = name; + return this; + } + + @JsonProperty("size") + public Double getSize() { + return size; + } + + @JsonProperty("size") + public void setSize(Double size) { + this.size = size; + } + + public Style__1 withSize(Double size) { + this.size = size; + return this; + } + + @JsonProperty("weight") + public Double getWeight() { + return weight; + } + + @JsonProperty("weight") + public void setWeight(Double weight) { + this.weight = weight; + } + + public Style__1 withWeight(Double weight) { + this.weight = weight; + return this; + } + + @JsonProperty("italic") + public Boolean getItalic() { + return italic; + } + + @JsonProperty("italic") + public void setItalic(Boolean italic) { + this.italic = italic; + } + + public Style__1 withItalic(Boolean italic) { + this.italic = italic; + return this; + } + + @JsonProperty("serif") + public Boolean getSerif() { + return serif; + } + + @JsonProperty("serif") + public void setSerif(Boolean serif) { + this.serif = serif; + } + + public Style__1 withSerif(Boolean serif) { + this.serif = serif; + return this; + } + + @JsonAnyGetter + public Map getAdditionalProperties() { + return this.additionalProperties; + } + + @JsonAnySetter + public void setAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + } + + public Style__1 withAdditionalProperty(String name, Object value) { + this.additionalProperties.put(name, value); + return this; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(Style__1 .class.getName()).append('@').append(Integer.toHexString(System.identityHashCode(this))).append('['); + sb.append("color"); + sb.append('='); + sb.append(((this.color == null)?"":this.color)); + sb.append(','); + sb.append("name"); + sb.append('='); + sb.append(((this.name == null)?"":this.name)); + sb.append(','); + sb.append("size"); + sb.append('='); + sb.append(((this.size == null)?"":this.size)); + sb.append(','); + sb.append("weight"); + sb.append('='); + sb.append(((this.weight == null)?"":this.weight)); + sb.append(','); + sb.append("italic"); + sb.append('='); + sb.append(((this.italic == null)?"":this.italic)); + sb.append(','); + sb.append("serif"); + sb.append('='); + sb.append(((this.serif == null)?"":this.serif)); + sb.append(','); + sb.append("additionalProperties"); + sb.append('='); + sb.append(((this.additionalProperties == null)?"":this.additionalProperties)); + sb.append(','); + if (sb.charAt((sb.length()- 1)) == ',') { + sb.setCharAt((sb.length()- 1), ']'); + } else { + sb.append(']'); + } + return sb.toString(); + } + + @Override + public int hashCode() { + int result = 1; + result = ((result* 31)+((this.color == null)? 0 :this.color.hashCode())); + result = ((result* 31)+((this.size == null)? 0 :this.size.hashCode())); + result = ((result* 31)+((this.name == null)? 0 :this.name.hashCode())); + result = ((result* 31)+((this.weight == null)? 0 :this.weight.hashCode())); + result = ((result* 31)+((this.serif == null)? 0 :this.serif.hashCode())); + result = ((result* 31)+((this.additionalProperties == null)? 0 :this.additionalProperties.hashCode())); + result = ((result* 31)+((this.italic == null)? 0 :this.italic.hashCode())); + return result; + } + + @Override + public boolean equals(Object other) { + if (other == this) { + return true; + } + if ((other instanceof Style__1) == false) { + return false; + } + Style__1 rhs = ((Style__1) other); + return ((((((((this.color == rhs.color)||((this.color!= null)&&this.color.equals(rhs.color)))&&((this.size == rhs.size)||((this.size!= null)&&this.size.equals(rhs.size))))&&((this.name == rhs.name)||((this.name!= null)&&this.name.equals(rhs.name))))&&((this.weight == rhs.weight)||((this.weight!= null)&&this.weight.equals(rhs.weight))))&&((this.serif == rhs.serif)||((this.serif!= null)&&this.serif.equals(rhs.serif))))&&((this.additionalProperties == rhs.additionalProperties)||((this.additionalProperties!= null)&&this.additionalProperties.equals(rhs.additionalProperties))))&&((this.italic == rhs.italic)||((this.italic!= null)&&this.italic.equals(rhs.italic)))); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/ApryseAiTest.java b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/ApryseAiTest.java new file mode 100644 index 00000000..e53f674e --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/test/java/com/iqser/red/service/redaction/v1/server/ApryseAiTest.java @@ -0,0 +1,261 @@ +package com.iqser.red.service.redaction.v1.server; + +import static org.mockito.Mockito.when; + +import java.awt.Color; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.util.List; +import java.util.UUID; + +import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; +import org.apache.commons.compress.archivers.zip.ZipFile; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; +import org.apache.hc.client5.http.ssl.NoopHostnameVerifier; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder; +import org.apache.hc.client5.http.ssl.TrustAllStrategy; +import org.apache.hc.core5.ssl.SSLContextBuilder; +import org.apache.pdfbox.io.MemoryUsageSetting; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.jsonschema2pojo.DefaultGenerationConfig; +import org.jsonschema2pojo.GenerationConfig; +import org.jsonschema2pojo.Jackson2Annotator; +import org.jsonschema2pojo.SchemaGenerator; +import org.jsonschema2pojo.SchemaMapper; +import org.jsonschema2pojo.SchemaStore; +import org.jsonschema2pojo.SourceType; +import org.jsonschema2pojo.rules.RuleFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.ClassPathResource; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.web.client.RestTemplate; + +import com.iqser.red.service.persistence.service.v1.api.shared.model.common.JSONPrimitive; +import com.iqser.red.service.persistence.service.v1.api.shared.model.dossiertemplate.type.Type; +import com.iqser.red.service.redaction.v1.server.apryse.ApryseAiResponse; +import com.iqser.red.service.redaction.v1.server.layoutparsing.classification.utils.FileUtils; +import com.iqser.red.storage.commons.StorageAutoConfiguration; +import com.iqser.red.storage.commons.service.StorageService; +import com.knecon.fforesight.tenantcommons.TenantContext; +import com.sun.codemodel.JCodeModel; + +import lombok.SneakyThrows; + +@ExtendWith(SpringExtension.class) +@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = {"application.type=DocuMine"}) +@Import(ApryseAiTest.RedactionIntegrationTestConfiguration.class) +public class ApryseAiTest extends AbstractRedactionIntegrationTest { + + private static final String RULES = loadFromClassPath("drools/documine_flora.drl"); + + private static final String APRYSE_URL = "https://ai-serve.pdftron.com/recog/predict"; + + @Autowired + private RestTemplate restTemplate; + + + @Test + @SneakyThrows + @Disabled + public void testApryseEndpoint() { + + ClassPathResource inputPdf = new ClassPathResource("files/apryseAi/Input.pdf"); + String outFile = "/tmp/Output.pdf"; + + byte[] inputAsBytes = inputPdf.getContentAsByteArray(); + + String filename = UUID.randomUUID().toString(); + HttpHeaders headers = new HttpHeaders(); + headers.add("Output-JSON", "true"); + headers.add("File-Name", filename); + headers.add("Force-OCR", "true"); + + HttpEntity httpEntity = new HttpEntity<>(inputAsBytes, headers); + + byte[] result = restTemplate.postForObject(APRYSE_URL, httpEntity, byte[].class); + + File responseFile = FileUtils.createTempFile(filename, "zip"); + try (FileOutputStream outputStream = new FileOutputStream(responseFile)) { + outputStream.write(result); + } + + ZipFile zipFile = new ZipFile(responseFile); + ZipArchiveEntry zipEntry = zipFile.getEntry(filename + ".json"); + byte[] jsonResponse = readCurrentZipEntry(zipEntry, zipFile); + zipFile.close(); + ApryseAiResponse response = objectMapper.readValue(jsonResponse, ApryseAiResponse.class); + + var pdDocument = PDDocument.load(inputPdf.getInputStream(), MemoryUsageSetting.setupMixed(67108864L)); + pdDocument.setAllSecurityToBeRemoved(true); + + response.getPages().forEach(page -> { + + try (PDPageContentStream contentStream = new PDPageContentStream(pdDocument, pdDocument.getPage(page.getProperties().getPageNumber() - 1), PDPageContentStream.AppendMode.APPEND, true)){ + contentStream.setStrokingColor(Color.BLUE); + contentStream.setLineWidth(1f); + + var tables = page.getElements().stream().filter(e -> e.getType().equals("table")).toList(); + tables.forEach(table -> { + table.getCells().forEach(cell -> { + try { + contentStream.addRect(cell.getRect().get(0).floatValue(), + cell.getRect().get(1).floatValue(), + cell.getRect().get(2).floatValue() - cell.getRect().get(0).floatValue(), + cell.getRect().get(3).floatValue() - cell.getRect().get(1).floatValue()); + contentStream.stroke(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + }); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + + pdDocument.save(new File(outFile)); + pdDocument.close(); + } + + + private byte[] readCurrentZipEntry(ZipArchiveEntry ze, ZipFile zipFile) throws IOException { + + var bos = new ByteArrayOutputStream(); + + try (var entryStream = zipFile.getInputStream(ze)) { + var buffer = new byte[2048]; + var nBytes = 0; + + while ((nBytes = entryStream.read(buffer)) > 0) { + bos.write(buffer, 0, nBytes); + } + } + + return bos.toByteArray(); + } + + + @Test + @Disabled + public void generateJavaPojos() throws IOException { + + URL url = new URL("file:///tmp/Input.json"); + File file = new File("/tmp/Output/"); + convertJsonToJavaClass(url, file, "com.knecon.ai", "ApryseAiResponse"); + } + + + public void convertJsonToJavaClass(URL inputJsonUrl, File outputJavaClassDirectory, String packageName, String javaClassName) throws IOException { + + JCodeModel jcodeModel = new JCodeModel(); + GenerationConfig config = new DefaultGenerationConfig() { + @Override + public boolean isGenerateBuilders() { + + return true; + } + + + @Override + public SourceType getSourceType() { + + return SourceType.JSON; + } + }; + + SchemaMapper mapper = new SchemaMapper(new RuleFactory(config, new Jackson2Annotator(config), new SchemaStore()), new SchemaGenerator()); + mapper.generate(jcodeModel, javaClassName, packageName, inputJsonUrl); + jcodeModel.build(outputJavaClassDirectory); + } + + + @Configuration + @EnableAutoConfiguration(exclude = {RabbitAutoConfiguration.class}) + @ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = StorageAutoConfiguration.class)}) + static class RedactionIntegrationTestConfiguration { + + @Bean + public RestTemplate restTemplate() throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + + CloseableHttpClient httpClient = HttpClients.custom() + .setConnectionManager(PoolingHttpClientConnectionManagerBuilder.create() + .setSSLSocketFactory(SSLConnectionSocketFactoryBuilder.create() + .setSslContext(SSLContextBuilder.create().loadTrustMaterial(TrustAllStrategy.INSTANCE).build()) + .setHostnameVerifier(NoopHostnameVerifier.INSTANCE) + .build()) + .build()) + .build(); + HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(); + requestFactory.setHttpClient(httpClient); + requestFactory.setConnectTimeout(30000); + requestFactory.setConnectionRequestTimeout(30000); + return new RestTemplate(requestFactory); + } + + + @Bean + @Primary + public StorageService inmemoryStorage() { + + return new FileSystemBackedStorageService(); + } + + } + + + @BeforeEach + public void stubClients() { + + TenantContext.setTenantId("redaction"); + + when(rulesClient.getVersion(TEST_DOSSIER_TEMPLATE_ID)).thenReturn(0L); + when(rulesClient.getRules(TEST_DOSSIER_TEMPLATE_ID)).thenReturn(JSONPrimitive.of(RULES)); + + loadTypeForTest(); + loadNerForTest(); + when(dictionaryClient.getVersion(TEST_DOSSIER_TEMPLATE_ID)).thenReturn(0L); + when(dictionaryClient.getAllTypesForDossierTemplate(TEST_DOSSIER_TEMPLATE_ID, false)).thenReturn(getTypeResponse()); + + when(dictionaryClient.getVersion(TEST_DOSSIER_TEMPLATE_ID)).thenReturn(0L); + when(dictionaryClient.getAllTypesForDossier(TEST_DOSSIER_ID, false)).thenReturn(List.of(Type.builder() + .id(DOSSIER_REDACTIONS_INDICATOR + ":" + TEST_DOSSIER_TEMPLATE_ID) + .type(DOSSIER_REDACTIONS_INDICATOR) + .dossierTemplateId(TEST_DOSSIER_ID) + .hexColor("#ffe187") + .isHint(hintTypeMap.get(DOSSIER_REDACTIONS_INDICATOR)) + .isCaseInsensitive(caseInSensitiveMap.get(DOSSIER_REDACTIONS_INDICATOR)) + .isRecommendation(recommendationTypeMap.get(DOSSIER_REDACTIONS_INDICATOR)) + .rank(rankTypeMap.get(DOSSIER_REDACTIONS_INDICATOR)) + .build())); + + mockDictionaryCalls(null); + + when(dictionaryClient.getColors(TEST_DOSSIER_TEMPLATE_ID)).thenReturn(colors); + } + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/apryseAi/Input.json b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/apryseAi/Input.json new file mode 100644 index 00000000..91a0a030 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/apryseAi/Input.json @@ -0,0 +1,3526 @@ +{ + "pages": [ + { + "properties": { + "pageNumber": 1, + "cropBox": [0.0, 0.0, 595.304, 841.89], + "mediaBox": [0.0, 0.0, 595.304, 841.89], + "rotation": 0, + "langCode": "eng" + }, + "elements": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [247.6, 770.3530000000001, 347.79999999999986, 785.773], + "quad": [247.6, 770.3530000000001, 347.79999999999986, 770.3530000000001, 347.79999999999986, 785.773, 247.6, 785.773], + "text": "Here is some Header", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [247.6, 770.3530000000001, 270.89199999999996, 785.773], + "quad": [247.6, 770.3530000000001, 270.89199999999996, 770.3530000000001, 270.89199999999996, 785.773, 247.6, 785.773], + "text": "Here" + }, + { + "type": "word", + "rect": [273.89199999999996, 770.3530000000001, 281.88399999999998, 785.773], + "quad": [273.89199999999996, 770.3530000000001, 281.88399999999998, 770.3530000000001, 281.88399999999998, 785.773, 273.89199999999996, 785.773], + "text": "is" + }, + { + "type": "word", + "rect": [284.88399999999998, 770.3530000000001, 310.19199999999997, 785.773], + "quad": [284.88399999999998, 770.3530000000001, 310.19199999999997, 770.3530000000001, 310.19199999999997, 785.773, 284.88399999999998, 785.773], + "text": "some" + }, + { + "type": "word", + "rect": [313.19199999999997, 770.3530000000001, 347.79999999999986, 785.773], + "quad": [313.19199999999997, 770.3530000000001, 347.79999999999986, 770.3530000000001, 347.79999999999986, 785.773, 313.19199999999997, 785.773], + "text": "Header" + }] + }] + }, + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [56.8, 728.9530000000001, 238.1920000000001, 744.373], + "quad": [56.8, 728.9530000000001, 238.1920000000001, 728.9530000000001, 238.1920000000001, 744.373, 56.8, 744.373], + "text": "This is some text describing the Table", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [56.8, 728.9530000000001, 78.11200000000001, 744.373], + "quad": [56.8, 728.9530000000001, 78.11200000000001, 728.9530000000001, 78.11200000000001, 744.373, 56.8, 744.373], + "text": "This" + }, + { + "type": "word", + "rect": [81.11200000000001, 728.9530000000001, 89.10400000000002, 744.373], + "quad": [81.11200000000001, 728.9530000000001, 89.10400000000002, 728.9530000000001, 89.10400000000002, 744.373, 81.11200000000001, 744.373], + "text": "is" + }, + { + "type": "word", + "rect": [92.10400000000002, 728.9530000000001, 117.41200000000002, 744.373], + "quad": [92.10400000000002, 728.9530000000001, 117.41200000000002, 728.9530000000001, 117.41200000000002, 744.373, 92.10400000000002, 744.373], + "text": "some" + }, + { + "type": "word", + "rect": [120.41200000000002, 728.9530000000001, 138.37600000000004, 744.373], + "quad": [120.41200000000002, 728.9530000000001, 138.37600000000004, 728.9530000000001, 138.37600000000004, 744.373, 120.41200000000002, 744.373], + "text": "text" + }, + { + "type": "word", + "rect": [141.37600000000004, 728.9530000000001, 191.32000000000009, 744.373], + "quad": [141.37600000000004, 728.9530000000001, 191.32000000000009, 728.9530000000001, 191.32000000000009, 744.373, 141.37600000000004, 744.373], + "text": "describing" + }, + { + "type": "word", + "rect": [194.32000000000009, 728.9530000000001, 208.9600000000001, 744.373], + "quad": [194.32000000000009, 728.9530000000001, 208.9600000000001, 728.9530000000001, 208.9600000000001, 744.373, 194.32000000000009, 744.373], + "text": "the" + }, + { + "type": "word", + "rect": [211.74400000000009, 728.9530000000001, 238.1920000000001, 744.373], + "quad": [211.74400000000009, 728.9530000000001, 238.1920000000001, 728.9530000000001, 238.1920000000001, 744.373, 211.74400000000009, 744.373], + "text": "Table" + }] + }, + { + "type": "line", + "rect": [56.8, 715.1530000000001, 195.83200000000009, 730.5730000000001], + "quad": [56.8, 715.1530000000001, 195.83200000000009, 715.1530000000001, 195.83200000000009, 730.5730000000001, 56.8, 730.5730000000001], + "text": "With some more information", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [56.8, 715.1530000000001, 80.28399999999999, 730.5730000000001], + "quad": [56.8, 715.1530000000001, 80.28399999999999, 715.1530000000001, 80.28399999999999, 730.5730000000001, 56.8, 730.5730000000001], + "text": "With" + }, + { + "type": "word", + "rect": [83.28399999999999, 715.1530000000001, 108.592, 730.5730000000001], + "quad": [83.28399999999999, 715.1530000000001, 108.592, 715.1530000000001, 108.592, 730.5730000000001, 83.28399999999999, 730.5730000000001], + "text": "some" + }, + { + "type": "word", + "rect": [111.592, 715.1530000000001, 136.228, 730.5730000000001], + "quad": [111.592, 715.1530000000001, 136.228, 715.1530000000001, 136.228, 730.5730000000001, 111.592, 730.5730000000001], + "text": "more" + }, + { + "type": "word", + "rect": [139.228, 715.1530000000001, 195.83200000000009, 730.5730000000001], + "quad": [139.228, 715.1530000000001, 195.83200000000009, 715.1530000000001, 195.83200000000009, 730.5730000000001, 139.228, 730.5730000000001], + "text": "information" + }] + }, + { + "type": "line", + "rect": [56.8, 701.3530000000001, 252.50800000000008, 716.773], + "quad": [56.8, 701.3530000000001, 252.50800000000008, 701.3530000000001, 252.50800000000008, 716.773, 56.8, 716.773], + "text": "Since this Table contains a bunch of data", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [56.8, 701.3530000000001, 83.428, 716.773], + "quad": [56.8, 701.3530000000001, 83.428, 701.3530000000001, 83.428, 716.773, 56.8, 716.773], + "text": "Since" + }, + { + "type": "word", + "rect": [86.428, 701.3530000000001, 103.744, 716.773], + "quad": [86.428, 701.3530000000001, 103.744, 701.3530000000001, 103.744, 716.773, 86.428, 716.773], + "text": "this" + }, + { + "type": "word", + "rect": [106.528, 701.3530000000001, 132.976, 716.773], + "quad": [106.528, 701.3530000000001, 132.976, 701.3530000000001, 132.976, 716.773, 106.528, 716.773], + "text": "Table" + }, + { + "type": "word", + "rect": [135.976, 701.3530000000001, 175.92400000000004, 716.773], + "quad": [135.976, 701.3530000000001, 175.92400000000004, 701.3530000000001, 175.92400000000004, 716.773, 135.976, 716.773], + "text": "contains" + }, + { + "type": "word", + "rect": [178.92400000000004, 701.3530000000001, 184.24000000000005, 716.773], + "quad": [178.92400000000004, 701.3530000000001, 184.24000000000005, 701.3530000000001, 184.24000000000005, 716.773, 178.92400000000004, 716.773], + "text": "a" + }, + { + "type": "word", + "rect": [187.24000000000005, 701.3530000000001, 216.55600000000005, 716.773], + "quad": [187.24000000000005, 701.3530000000001, 216.55600000000005, 701.3530000000001, 216.55600000000005, 716.773, 187.24000000000005, 716.773], + "text": "bunch" + }, + { + "type": "word", + "rect": [219.55600000000005, 701.3530000000001, 229.55209375000005, 716.773], + "quad": [219.55600000000005, 701.3530000000001, 229.55209375000005, 701.3530000000001, 229.55209375000005, 716.773, 219.55600000000005, 716.773], + "text": "of" + }, + { + "type": "word", + "rect": [232.55200000000006, 701.3530000000001, 252.50800000000008, 716.773], + "quad": [232.55200000000006, 701.3530000000001, 252.50800000000008, 701.3530000000001, 252.50800000000008, 716.773, 232.55200000000006, 716.773], + "text": "data" + }] + }] + }, + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [386.45, 646.1530000000001, 538.6459999999998, 661.5730000000001], + "quad": [386.45, 646.1530000000001, 538.6459999999998, 646.1530000000001, 538.6459999999998, 661.5730000000001, 386.45, 661.5730000000001], + "text": "Very confusing text on the right", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [386.45, 646.1530000000001, 409.09399999999996, 661.5730000000001], + "quad": [386.45, 646.1530000000001, 409.09399999999996, 646.1530000000001, 409.09399999999996, 661.5730000000001, 386.45, 661.5730000000001], + "text": "Very" + }, + { + "type": "word", + "rect": [412.09399999999996, 646.1530000000001, 459.3979999999999, 661.5730000000001], + "quad": [412.09399999999996, 646.1530000000001, 459.3979999999999, 646.1530000000001, 459.3979999999999, 661.5730000000001, 412.09399999999996, 661.5730000000001], + "text": "confusing" + }, + { + "type": "word", + "rect": [462.3979999999999, 646.1530000000001, 480.3619999999999, 661.5730000000001], + "quad": [462.3979999999999, 646.1530000000001, 480.3619999999999, 646.1530000000001, 480.3619999999999, 661.5730000000001, 462.3979999999999, 661.5730000000001], + "text": "text" + }, + { + "type": "word", + "rect": [483.3619999999999, 646.1530000000001, 495.3619999999999, 661.5730000000001], + "quad": [483.3619999999999, 646.1530000000001, 495.3619999999999, 646.1530000000001, 495.3619999999999, 661.5730000000001, 483.3619999999999, 661.5730000000001], + "text": "on" + }, + { + "type": "word", + "rect": [498.3619999999999, 646.1530000000001, 513.002, 661.5730000000001], + "quad": [498.3619999999999, 646.1530000000001, 513.002, 646.1530000000001, 513.002, 661.5730000000001, 498.3619999999999, 661.5730000000001], + "text": "the" + }, + { + "type": "word", + "rect": [516.002, 646.1530000000001, 538.6459999999998, 661.5730000000001], + "quad": [516.002, 646.1530000000001, 538.6459999999998, 646.1530000000001, 538.6459999999998, 661.5730000000001, 516.002, 661.5730000000001], + "text": "right" + }] + }] + }, + { + "type": "table", + "confidence": 0.952, + "rect": [50.0, 397.614, 546.0, 645.558], + "rowSeparators": [566.621, 547.392, 513.49, 481.611, 462.383, 443.154, 423.926], + "columnSeparators": [101.0, 149.0, 199.0, 245.0, 294.0, 343.0, 391.0, 441.0, 487.0], + "cells": [ + { + "rect": [50.0, 566.621, 101.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 0, + "columnEnd": 0, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [59.55, 568.903, 93.18599999999999, 584.323], + "quad": [59.55, 568.903, 93.18599999999999, 568.903, 93.18599999999999, 584.323, 59.55, 584.323], + "text": "Field 1", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [59.55, 568.903, 84.18599999999999, 584.323], + "quad": [59.55, 568.903, 84.18599999999999, 568.903, 84.18599999999999, 584.323, 59.55, 584.323], + "text": "Field" + }, + { + "type": "word", + "rect": [87.18599999999999, 568.903, 93.18599999999999, 584.323], + "quad": [87.18599999999999, 568.903, 93.18599999999999, 568.903, 93.18599999999999, 584.323, 87.18599999999999, 584.323], + "text": "1" + }] + }] + }] + }, + { + "rect": [101.0, 566.621, 149.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 1, + "columnEnd": 1, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [107.7, 615.803, 141.336, 631.223], + "quad": [107.7, 615.803, 141.336, 615.803, 141.336, 631.223, 107.7, 631.223], + "text": "Field 1", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 615.803, 132.336, 631.223], + "quad": [107.7, 615.803, 132.336, 615.803, 132.336, 631.223, 107.7, 631.223], + "text": "Field" + }, + { + "type": "word", + "rect": [135.336, 615.803, 141.336, 631.223], + "quad": [135.336, 615.803, 141.336, 615.803, 141.336, 631.223, 135.336, 631.223], + "text": "1" + }] + }, + { + "type": "line", + "rect": [107.7, 602.003, 131.184, 617.423], + "quad": [107.7, 602.003, 131.184, 602.003, 131.184, 617.423, 107.7, 617.423], + "text": "With", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 602.003, 131.184, 617.423], + "quad": [107.7, 602.003, 131.184, 602.003, 131.184, 617.423, 107.7, 617.423], + "text": "With" + }] + }, + { + "type": "line", + "rect": [107.7, 588.203, 130.332, 603.6229999999999], + "quad": [107.7, 588.203, 130.332, 588.203, 130.332, 603.6229999999999, 107.7, 603.6229999999999], + "text": "lines", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 588.203, 130.332, 603.6229999999999], + "quad": [107.7, 588.203, 130.332, 588.203, 130.332, 603.6229999999999, 107.7, 603.6229999999999], + "text": "lines" + }] + }] + }, + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [107.7, 568.903, 113.7, 584.323], + "quad": [107.7, 568.903, 113.7, 568.903, 113.7, 584.323, 107.7, 584.323], + "text": "g", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 568.903, 113.7, 584.323], + "quad": [107.7, 568.903, 113.7, 568.903, 113.7, 584.323, 107.7, 584.323], + "text": "g" + }] + }] + }] + }, + { + "rect": [149.0, 566.621, 199.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 2, + "columnEnd": 2, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [155.9, 602.003, 195.86000000000005, 617.423], + "quad": [155.9, 602.003, 195.86000000000005, 602.003, 195.86000000000005, 617.423, 155.9, 617.423], + "text": "Somethi", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 602.003, 195.86000000000005, 617.423], + "quad": [155.9, 602.003, 195.86000000000005, 602.003, 195.86000000000005, 617.423, 155.9, 617.423], + "text": "Somethi" + }] + }, + { + "type": "line", + "rect": [155.9, 588.203, 167.9, 603.6229999999999], + "quad": [155.9, 588.203, 167.9, 588.203, 167.9, 603.6229999999999, 155.9, 603.6229999999999], + "text": "ng", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 588.203, 167.9, 603.6229999999999], + "quad": [155.9, 588.203, 167.9, 588.203, 167.9, 603.6229999999999, 155.9, 603.6229999999999], + "text": "ng" + }] + }, + { + "type": "line", + "rect": [155.9, 568.903, 161.9, 584.323], + "quad": [155.9, 568.903, 161.9, 568.903, 161.9, 584.323, 155.9, 584.323], + "text": "g", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 568.903, 161.9, 584.323], + "quad": [155.9, 568.903, 161.9, 568.903, 161.9, 584.323, 155.9, 584.323], + "text": "g" + }] + }] + }] + }, + { + "rect": [199.0, 566.621, 245.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 3, + "columnEnd": 3, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [204.1, 615.803, 226.756, 631.223], + "quad": [204.1, 615.803, 226.756, 615.803, 226.756, 631.223, 204.1, 631.223], + "text": "Also", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 615.803, 226.756, 631.223], + "quad": [204.1, 615.803, 226.756, 615.803, 226.756, 631.223, 204.1, 631.223], + "text": "Also" + }] + }, + { + "type": "line", + "rect": [204.1, 602.003, 228.73600000000003, 617.423], + "quad": [204.1, 602.003, 228.73600000000003, 602.003, 228.73600000000003, 617.423, 204.1, 617.423], + "text": "more", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 602.003, 228.73600000000003, 617.423], + "quad": [204.1, 602.003, 228.73600000000003, 602.003, 228.73600000000003, 617.423, 204.1, 617.423], + "text": "more" + }] + }, + { + "type": "line", + "rect": [204.1, 588.203, 226.73200000000004, 603.6229999999999], + "quad": [204.1, 588.203, 226.73200000000004, 588.203, 226.73200000000004, 603.6229999999999, 204.1, 603.6229999999999], + "text": "lines", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 588.203, 226.73200000000004, 603.6229999999999], + "quad": [204.1, 588.203, 226.73200000000004, 588.203, 226.73200000000004, 603.6229999999999, 204.1, 603.6229999999999], + "text": "lines" + }] + }] + }, + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [204.1, 568.903, 210.1, 584.323], + "quad": [204.1, 568.903, 210.1, 568.903, 210.1, 584.323, 204.1, 584.323], + "text": "g", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 568.903, 210.1, 584.323], + "quad": [204.1, 568.903, 210.1, 568.903, 210.1, 584.323, 204.1, 584.323], + "text": "g" + }] + }] + }] + }, + { + "rect": [245.0, 566.621, 294.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 4, + "columnEnd": 4, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [252.3, 588.203, 276.288, 603.6229999999999], + "quad": [252.3, 588.203, 276.288, 588.203, 276.288, 603.6229999999999, 252.3, 603.6229999999999], + "text": "short", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [252.3, 588.203, 276.288, 603.6229999999999], + "quad": [252.3, 588.203, 276.288, 588.203, 276.288, 603.6229999999999, 252.3, 603.6229999999999], + "text": "short" + }] + }, + { + "type": "line", + "rect": [252.3, 568.903, 267.624, 584.323], + "quad": [252.3, 568.903, 267.624, 568.903, 267.624, 584.323, 252.3, 584.323], + "text": "mg", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [252.3, 568.903, 267.624, 584.323], + "quad": [252.3, 568.903, 267.624, 568.903, 267.624, 584.323, 252.3, 584.323], + "text": "mg" + }] + }] + }] + }, + { + "rect": [294.0, 566.621, 343.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 5, + "columnEnd": 5, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [300.5, 602.003, 323.14399999999997, 617.423], + "quad": [300.5, 602.003, 323.14399999999997, 602.003, 323.14399999999997, 617.423, 300.5, 617.423], + "text": "Very", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 602.003, 323.14399999999997, 617.423], + "quad": [300.5, 602.003, 323.14399999999997, 602.003, 323.14399999999997, 617.423, 300.5, 617.423], + "text": "Very" + }] + }, + { + "type": "line", + "rect": [300.5, 588.203, 324.488, 603.6229999999999], + "quad": [300.5, 588.203, 324.488, 588.203, 324.488, 603.6229999999999, 300.5, 603.6229999999999], + "text": "short", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 588.203, 324.488, 603.6229999999999], + "quad": [300.5, 588.203, 324.488, 588.203, 324.488, 603.6229999999999, 300.5, 603.6229999999999], + "text": "short" + }] + }] + }, + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [300.5, 568.903, 306.5, 584.323], + "quad": [300.5, 568.903, 306.5, 568.903, 306.5, 584.323, 300.5, 584.323], + "text": "g", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 568.903, 306.5, 584.323], + "quad": [300.5, 568.903, 306.5, 568.903, 306.5, 584.323, 300.5, 584.323], + "text": "g" + }] + }] + }] + }, + { + "rect": [343.0, 566.621, 391.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 6, + "columnEnd": 6, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [348.65000000000006, 602.003, 361.97, 617.423], + "quad": [348.65000000000006, 602.003, 361.97, 602.003, 361.97, 617.423, 348.65000000000006, 617.423], + "text": "Im", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 602.003, 361.97, 617.423], + "quad": [348.65000000000006, 602.003, 361.97, 602.003, 361.97, 617.423, 348.65000000000006, 617.423], + "text": "Im" + }] + }] + }, + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [348.65000000000006, 588.203, 385.97, 603.6229999999999], + "quad": [348.65000000000006, 588.203, 385.97, 588.203, 385.97, 603.6229999999999, 348.65000000000006, 603.6229999999999], + "text": "running", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 588.203, 385.97, 603.6229999999999], + "quad": [348.65000000000006, 588.203, 385.97, 588.203, 385.97, 603.6229999999999, 348.65000000000006, 603.6229999999999], + "text": "running" + }] + }, + { + "type": "line", + "rect": [348.65000000000006, 568.903, 354.65000000000006, 584.323], + "quad": [348.65000000000006, 568.903, 354.65000000000006, 568.903, 354.65000000000006, 584.323, 348.65000000000006, 584.323], + "text": "g", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 568.903, 354.65000000000006, 584.323], + "quad": [348.65000000000006, 568.903, 354.65000000000006, 568.903, 354.65000000000006, 584.323, 348.65000000000006, 584.323], + "text": "g" + }] + }] + }] + }, + { + "rect": [391.0, 566.621, 441.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 7, + "columnEnd": 7, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [396.85, 615.803, 427.83409375, 631.223], + "quad": [396.85, 615.803, 427.83409375, 615.803, 427.83409375, 631.223, 396.85, 631.223], + "text": "Out of", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 615.803, 414.838, 631.223], + "quad": [396.85, 615.803, 414.838, 615.803, 414.838, 631.223, 396.85, 631.223], + "text": "Out" + }, + { + "type": "word", + "rect": [417.838, 615.803, 427.83409375, 631.223], + "quad": [417.838, 615.803, 427.83409375, 615.803, 427.83409375, 631.223, 417.838, 631.223], + "text": "of" + }] + }] + }, + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [396.85, 602.003, 438.49000000000009, 617.423], + "quad": [396.85, 602.003, 438.49000000000009, 602.003, 438.49000000000009, 617.423, 396.85, 617.423], + "text": "things to", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 602.003, 426.16600000000008, 617.423], + "quad": [396.85, 602.003, 426.16600000000008, 602.003, 426.16600000000008, 617.423, 396.85, 617.423], + "text": "things" + }, + { + "type": "word", + "rect": [429.16600000000008, 602.003, 438.49000000000009, 617.423], + "quad": [429.16600000000008, 602.003, 438.49000000000009, 602.003, 438.49000000000009, 617.423, 429.16600000000008, 617.423], + "text": "to" + }] + }, + { + "type": "line", + "rect": [396.85, 588.203, 421.474, 603.6229999999999], + "quad": [396.85, 588.203, 421.474, 588.203, 421.474, 603.6229999999999, 396.85, 603.6229999999999], + "text": "write", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 588.203, 421.474, 603.6229999999999], + "quad": [396.85, 588.203, 421.474, 588.203, 421.474, 603.6229999999999, 396.85, 603.6229999999999], + "text": "write" + }] + }, + { + "type": "line", + "rect": [396.85, 568.903, 402.85, 584.323], + "quad": [396.85, 568.903, 402.85, 568.903, 402.85, 584.323, 396.85, 584.323], + "text": "g", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 568.903, 402.85, 584.323], + "quad": [396.85, 568.903, 402.85, 568.903, 402.85, 584.323, 396.85, 584.323], + "text": "g" + }] + }] + }] + }, + { + "rect": [441.0, 566.621, 487.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 8, + "columnEnd": 8, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [445.05, 602.003, 477.35400000000007, 617.423], + "quad": [445.05, 602.003, 477.35400000000007, 602.003, 477.35400000000007, 617.423, 445.05, 617.423], + "text": "This is", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 602.003, 466.362, 617.423], + "quad": [445.05, 602.003, 466.362, 602.003, 466.362, 617.423, 445.05, 617.423], + "text": "This" + }, + { + "type": "word", + "rect": [469.362, 602.003, 477.35400000000007, 617.423], + "quad": [469.362, 602.003, 477.35400000000007, 602.003, 477.35400000000007, 617.423, 469.362, 617.423], + "text": "is" + }] + }, + { + "type": "line", + "rect": [445.05, 588.203, 476.37, 603.6229999999999], + "quad": [445.05, 588.203, 476.37, 588.203, 476.37, 603.6229999999999, 445.05, 603.6229999999999], + "text": "boring", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 588.203, 476.37, 603.6229999999999], + "quad": [445.05, 588.203, 476.37, 588.203, 476.37, 603.6229999999999, 445.05, 603.6229999999999], + "text": "boring" + }] + }, + { + "type": "line", + "rect": [445.05, 568.903, 460.374, 584.323], + "quad": [445.05, 568.903, 460.374, 568.903, 460.374, 584.323, 445.05, 584.323], + "text": "mg", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 568.903, 460.374, 584.323], + "quad": [445.05, 568.903, 460.374, 568.903, 460.374, 584.323, 445.05, 584.323], + "text": "mg" + }] + }] + }] + }, + { + "rect": [487.0, 566.621, 546.0, 645.558], + "rowStart": 0, + "rowEnd": 0, + "columnStart": 9, + "columnEnd": 9, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [493.25, 588.203, 516.578, 603.6229999999999], + "quad": [493.25, 588.203, 516.578, 588.203, 516.578, 603.6229999999999, 493.25, 603.6229999999999], + "text": "wow", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [493.25, 588.203, 516.578, 603.6229999999999], + "quad": [493.25, 588.203, 516.578, 588.203, 516.578, 603.6229999999999, 493.25, 603.6229999999999], + "text": "wow" + }] + }, + { + "type": "line", + "rect": [493.25, 568.903, 499.25, 584.323], + "quad": [493.25, 568.903, 499.25, 568.903, 499.25, 584.323, 493.25, 584.323], + "text": "g", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [493.25, 568.903, 499.25, 584.323], + "quad": [493.25, 568.903, 499.25, 568.903, 499.25, 584.323, 493.25, 584.323], + "text": "g" + }] + }] + }] + }, + { + "rect": [50.0, 547.392, 101.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 0, + "columnEnd": 0, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [59.55, 549.6030000000001, 84.174, 565.023], + "quad": [59.55, 549.6030000000001, 84.174, 549.6030000000001, 84.174, 565.023, 59.55, 565.023], + "text": "Mice", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [59.55, 549.6030000000001, 84.174, 565.023], + "quad": [59.55, 549.6030000000001, 84.174, 549.6030000000001, 84.174, 565.023, 59.55, 565.023], + "text": "Mice" + }] + }] + }] + }, + { + "rect": [101.0, 547.392, 149.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 1, + "columnEnd": 1, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [107.7, 549.6030000000001, 113.7, 565.023], + "quad": [107.7, 549.6030000000001, 113.7, 549.6030000000001, 113.7, 565.023, 107.7, 565.023], + "text": "2", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 549.6030000000001, 113.7, 565.023], + "quad": [107.7, 549.6030000000001, 113.7, 549.6030000000001, 113.7, 565.023, 107.7, 565.023], + "text": "2" + }] + }] + }] + }, + { + "rect": [149.0, 547.392, 199.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 2, + "columnEnd": 2, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [155.9, 549.6030000000001, 173.9, 565.023], + "quad": [155.9, 549.6030000000001, 173.9, 549.6030000000001, 173.9, 565.023, 155.9, 565.023], + "text": "123", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 549.6030000000001, 173.9, 565.023], + "quad": [155.9, 549.6030000000001, 173.9, 549.6030000000001, 173.9, 565.023, 155.9, 565.023], + "text": "123" + }] + }] + }] + }, + { + "rect": [199.0, 547.392, 245.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 3, + "columnEnd": 3, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [204.1, 549.6030000000001, 222.1, 565.023], + "quad": [204.1, 549.6030000000001, 222.1, 549.6030000000001, 222.1, 565.023, 204.1, 565.023], + "text": "145", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 549.6030000000001, 222.1, 565.023], + "quad": [204.1, 549.6030000000001, 222.1, 549.6030000000001, 222.1, 565.023, 204.1, 565.023], + "text": "145" + }] + }] + }] + }, + { + "rect": [245.0, 547.392, 294.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 4, + "columnEnd": 4, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [252.3, 549.6030000000001, 264.3, 565.023], + "quad": [252.3, 549.6030000000001, 264.3, 549.6030000000001, 264.3, 565.023, 252.3, 565.023], + "text": "45", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [252.3, 549.6030000000001, 264.3, 565.023], + "quad": [252.3, 549.6030000000001, 264.3, 549.6030000000001, 264.3, 565.023, 252.3, 565.023], + "text": "45" + }] + }] + }] + }, + { + "rect": [294.0, 547.392, 343.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 5, + "columnEnd": 5, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [300.5, 549.6030000000001, 312.5, 565.023], + "quad": [300.5, 549.6030000000001, 312.5, 549.6030000000001, 312.5, 565.023, 300.5, 565.023], + "text": "55", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 549.6030000000001, 312.5, 565.023], + "quad": [300.5, 549.6030000000001, 312.5, 549.6030000000001, 312.5, 565.023, 300.5, 565.023], + "text": "55" + }] + }] + }] + }, + { + "rect": [343.0, 547.392, 391.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 6, + "columnEnd": 6, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [348.65000000000006, 549.6030000000001, 372.65000000000006, 565.023], + "quad": [348.65000000000006, 549.6030000000001, 372.65000000000006, 549.6030000000001, 372.65000000000006, 565.023, 348.65000000000006, 565.023], + "text": "4573", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 549.6030000000001, 372.65000000000006, 565.023], + "quad": [348.65000000000006, 549.6030000000001, 372.65000000000006, 549.6030000000001, 372.65000000000006, 565.023, 348.65000000000006, 565.023], + "text": "4573" + }] + }] + }] + }, + { + "rect": [391.0, 547.392, 441.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 7, + "columnEnd": 7, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [396.85, 549.6030000000001, 414.85, 565.023], + "quad": [396.85, 549.6030000000001, 414.85, 549.6030000000001, 414.85, 565.023, 396.85, 565.023], + "text": "453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 549.6030000000001, 414.85, 565.023], + "quad": [396.85, 549.6030000000001, 414.85, 549.6030000000001, 414.85, 565.023, 396.85, 565.023], + "text": "453" + }] + }] + }] + }, + { + "rect": [441.0, 547.392, 487.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 8, + "columnEnd": 8, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [445.05, 549.6030000000001, 457.05, 565.023], + "quad": [445.05, 549.6030000000001, 457.05, 549.6030000000001, 457.05, 565.023, 445.05, 565.023], + "text": "39", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 549.6030000000001, 457.05, 565.023], + "quad": [445.05, 549.6030000000001, 457.05, 549.6030000000001, 457.05, 565.023, 445.05, 565.023], + "text": "39" + }] + }] + }] + }, + { + "rect": [487.0, 547.392, 546.0, 566.621], + "rowStart": 1, + "rowEnd": 1, + "columnStart": 9, + "columnEnd": 9, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [493.25, 549.6030000000001, 529.25, 565.023], + "quad": [493.25, 549.6030000000001, 529.25, 549.6030000000001, 529.25, 565.023, 493.25, 565.023], + "text": "783453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [493.25, 549.6030000000001, 529.25, 565.023], + "quad": [493.25, 549.6030000000001, 529.25, 549.6030000000001, 529.25, 565.023, 493.25, 565.023], + "text": "783453" + }] + }] + }] + }, + { + "rect": [50.0, 513.49, 101.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 0, + "columnEnd": 0, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [59.55, 530.303, 94.182, 545.723], + "quad": [59.55, 530.303, 94.182, 530.303, 94.182, 545.723, 59.55, 545.723], + "text": "Longer", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [59.55, 530.303, 94.182, 545.723], + "quad": [59.55, 530.303, 94.182, 530.303, 94.182, 545.723, 59.55, 545.723], + "text": "Longer" + }] + }, + { + "type": "line", + "rect": [59.55, 516.503, 81.51, 531.923], + "quad": [59.55, 516.503, 81.51, 516.503, 81.51, 531.923, 59.55, 531.923], + "text": "field", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [59.55, 516.503, 81.51, 531.923], + "quad": [59.55, 516.503, 81.51, 516.503, 81.51, 531.923, 59.55, 531.923], + "text": "field" + }] + }] + }] + }, + { + "rect": [101.0, 513.49, 149.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 1, + "columnEnd": 1, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [107.7, 530.303, 113.7, 545.723], + "quad": [107.7, 530.303, 113.7, 530.303, 113.7, 545.723, 107.7, 545.723], + "text": "4", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 530.303, 113.7, 545.723], + "quad": [107.7, 530.303, 113.7, 530.303, 113.7, 545.723, 107.7, 545.723], + "text": "4" + }] + }] + }] + }, + { + "rect": [149.0, 513.49, 199.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 2, + "columnEnd": 2, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [155.9, 530.303, 185.9, 545.723], + "quad": [155.9, 530.303, 185.9, 530.303, 185.9, 545.723, 155.9, 545.723], + "text": "15415", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 530.303, 185.9, 545.723], + "quad": [155.9, 530.303, 185.9, 530.303, 185.9, 545.723, 155.9, 545.723], + "text": "15415" + }] + }] + }] + }, + { + "rect": [199.0, 513.49, 245.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 3, + "columnEnd": 3, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [204.1, 530.303, 222.1, 545.723], + "quad": [204.1, 530.303, 222.1, 530.303, 222.1, 545.723, 204.1, 545.723], + "text": "124", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 530.303, 222.1, 545.723], + "quad": [204.1, 530.303, 222.1, 530.303, 222.1, 545.723, 204.1, 545.723], + "text": "124" + }] + }] + }] + }, + { + "rect": [245.0, 513.49, 294.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 4, + "columnEnd": 4, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [252.3, 530.303, 270.3, 545.723], + "quad": [252.3, 530.303, 270.3, 530.303, 270.3, 545.723, 252.3, 545.723], + "text": "654", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [252.3, 530.303, 270.3, 545.723], + "quad": [252.3, 530.303, 270.3, 530.303, 270.3, 545.723, 252.3, 545.723], + "text": "654" + }] + }] + }] + }, + { + "rect": [294.0, 513.49, 343.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 5, + "columnEnd": 5, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [300.5, 530.303, 312.5, 545.723], + "quad": [300.5, 530.303, 312.5, 530.303, 312.5, 545.723, 300.5, 545.723], + "text": "44", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 530.303, 312.5, 545.723], + "quad": [300.5, 530.303, 312.5, 530.303, 312.5, 545.723, 300.5, 545.723], + "text": "44" + }] + }] + }] + }, + { + "rect": [343.0, 513.49, 391.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 6, + "columnEnd": 6, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [348.65000000000006, 530.303, 366.65000000000006, 545.723], + "quad": [348.65000000000006, 530.303, 366.65000000000006, 530.303, 366.65000000000006, 545.723, 348.65000000000006, 545.723], + "text": "783", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 530.303, 366.65000000000006, 545.723], + "quad": [348.65000000000006, 530.303, 366.65000000000006, 530.303, 366.65000000000006, 545.723, 348.65000000000006, 545.723], + "text": "783" + }] + }] + }] + }, + { + "rect": [391.0, 513.49, 441.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 7, + "columnEnd": 7, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [396.85, 530.303, 414.85, 545.723], + "quad": [396.85, 530.303, 414.85, 530.303, 414.85, 545.723, 396.85, 545.723], + "text": "453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 530.303, 414.85, 545.723], + "quad": [396.85, 530.303, 414.85, 530.303, 414.85, 545.723, 396.85, 545.723], + "text": "453" + }] + }] + }] + }, + { + "rect": [441.0, 513.49, 487.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 8, + "columnEnd": 8, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [445.05, 530.303, 469.05, 545.723], + "quad": [445.05, 530.303, 469.05, 530.303, 469.05, 545.723, 445.05, 545.723], + "text": "3453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 530.303, 469.05, 545.723], + "quad": [445.05, 530.303, 469.05, 530.303, 469.05, 545.723, 445.05, 545.723], + "text": "3453" + }] + }] + }] + }, + { + "rect": [487.0, 513.49, 546.0, 547.392], + "rowStart": 2, + "rowEnd": 2, + "columnStart": 9, + "columnEnd": 9, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [493.25, 530.303, 511.25, 545.723], + "quad": [493.25, 530.303, 511.25, 530.303, 511.25, 545.723, 493.25, 545.723], + "text": "453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [493.25, 530.303, 511.25, 545.723], + "quad": [493.25, 530.303, 511.25, 530.303, 511.25, 545.723, 493.25, 545.723], + "text": "453" + }] + }] + }] + }, + { + "rect": [50.0, 481.611, 101.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 0, + "columnEnd": 0, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [59.55, 483.40299999999999, 87.54599999999999, 498.823], + "quad": [59.55, 483.40299999999999, 87.54599999999999, 483.40299999999999, 87.54599999999999, 498.823, 59.55, 498.823], + "text": "qdfgq", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [59.55, 483.40299999999999, 87.54599999999999, 498.823], + "quad": [59.55, 483.40299999999999, 87.54599999999999, 483.40299999999999, 87.54599999999999, 498.823, 59.55, 498.823], + "text": "qdfgq" + }] + }] + }] + }, + { + "rect": [101.0, 481.611, 149.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 1, + "columnEnd": 1, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [107.7, 483.40299999999999, 113.7, 498.823], + "quad": [107.7, 483.40299999999999, 113.7, 483.40299999999999, 113.7, 498.823, 107.7, 498.823], + "text": "3", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 483.40299999999999, 113.7, 498.823], + "quad": [107.7, 483.40299999999999, 113.7, 483.40299999999999, 113.7, 498.823, 107.7, 498.823], + "text": "3" + }] + }] + }] + }, + { + "rect": [149.0, 481.611, 199.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 2, + "columnEnd": 2, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [155.9, 483.40299999999999, 167.9, 498.823], + "quad": [155.9, 483.40299999999999, 167.9, 483.40299999999999, 167.9, 498.823, 155.9, 498.823], + "text": "12", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 483.40299999999999, 167.9, 498.823], + "quad": [155.9, 483.40299999999999, 167.9, 483.40299999999999, 167.9, 498.823, 155.9, 498.823], + "text": "12" + }] + }] + }] + }, + { + "rect": [199.0, 481.611, 245.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 3, + "columnEnd": 3, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [204.1, 483.40299999999999, 240.1, 498.823], + "quad": [204.1, 483.40299999999999, 240.1, 483.40299999999999, 240.1, 498.823, 204.1, 498.823], + "text": "123545", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 483.40299999999999, 240.1, 498.823], + "quad": [204.1, 483.40299999999999, 240.1, 483.40299999999999, 240.1, 498.823, 204.1, 498.823], + "text": "123545" + }] + }] + }] + }, + { + "rect": [245.0, 481.611, 294.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 4, + "columnEnd": 4, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [252.3, 483.40299999999999, 264.3, 498.823], + "quad": [252.3, 483.40299999999999, 264.3, 483.40299999999999, 264.3, 498.823, 252.3, 498.823], + "text": "45", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [252.3, 483.40299999999999, 264.3, 498.823], + "quad": [252.3, 483.40299999999999, 264.3, 483.40299999999999, 264.3, 498.823, 252.3, 498.823], + "text": "45" + }] + }] + }] + }, + { + "rect": [294.0, 481.611, 343.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 5, + "columnEnd": 5, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [300.5, 483.40299999999999, 312.5, 498.823], + "quad": [300.5, 483.40299999999999, 312.5, 483.40299999999999, 312.5, 498.823, 300.5, 498.823], + "text": "44", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 483.40299999999999, 312.5, 498.823], + "quad": [300.5, 483.40299999999999, 312.5, 483.40299999999999, 312.5, 498.823, 300.5, 498.823], + "text": "44" + }] + }] + }] + }, + { + "rect": [343.0, 481.611, 391.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 6, + "columnEnd": 6, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [348.65000000000006, 483.40299999999999, 360.65000000000006, 498.823], + "quad": [348.65000000000006, 483.40299999999999, 360.65000000000006, 483.40299999999999, 360.65000000000006, 498.823, 348.65000000000006, 498.823], + "text": "78", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 483.40299999999999, 360.65000000000006, 498.823], + "quad": [348.65000000000006, 483.40299999999999, 360.65000000000006, 483.40299999999999, 360.65000000000006, 498.823, 348.65000000000006, 498.823], + "text": "78" + }] + }] + }] + }, + { + "rect": [391.0, 481.611, 441.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 7, + "columnEnd": 7, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [396.85, 483.40299999999999, 408.85, 498.823], + "quad": [396.85, 483.40299999999999, 408.85, 483.40299999999999, 408.85, 498.823, 396.85, 498.823], + "text": "48", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 483.40299999999999, 408.85, 498.823], + "quad": [396.85, 483.40299999999999, 408.85, 483.40299999999999, 408.85, 498.823, 396.85, 498.823], + "text": "48" + }] + }] + }] + }, + { + "rect": [441.0, 481.611, 487.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 8, + "columnEnd": 8, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [445.05, 483.40299999999999, 457.05, 498.823], + "quad": [445.05, 483.40299999999999, 457.05, 483.40299999999999, 457.05, 498.823, 445.05, 498.823], + "text": "45", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 483.40299999999999, 457.05, 498.823], + "quad": [445.05, 483.40299999999999, 457.05, 483.40299999999999, 457.05, 498.823, 445.05, 498.823], + "text": "45" + }] + }] + }] + }, + { + "rect": [487.0, 481.611, 546.0, 513.49], + "rowStart": 3, + "rowEnd": 3, + "columnStart": 9, + "columnEnd": 9, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [493.25, 483.40299999999999, 511.25, 498.823], + "quad": [493.25, 483.40299999999999, 511.25, 483.40299999999999, 511.25, 498.823, 493.25, 498.823], + "text": "453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [493.25, 483.40299999999999, 511.25, 498.823], + "quad": [493.25, 483.40299999999999, 511.25, 483.40299999999999, 511.25, 498.823, 493.25, 498.823], + "text": "453" + }] + }] + }] + }, + { + "rect": [50.0, 462.383, 101.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 0, + "columnEnd": 0, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [59.55, 464.10299999999998, 69.534, 479.52299999999999], + "quad": [59.55, 464.10299999999998, 69.534, 464.10299999999998, 69.534, 479.52299999999999, 59.55, 479.52299999999999], + "text": "as", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [59.55, 464.10299999999998, 69.534, 479.52299999999999], + "quad": [59.55, 464.10299999999998, 69.534, 464.10299999999998, 69.534, 479.52299999999999, 59.55, 479.52299999999999], + "text": "as" + }] + }] + }] + }, + { + "rect": [101.0, 462.383, 149.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 1, + "columnEnd": 1, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [107.7, 464.10299999999998, 113.7, 479.52299999999999], + "quad": [107.7, 464.10299999999998, 113.7, 464.10299999999998, 113.7, 479.52299999999999, 107.7, 479.52299999999999], + "text": "5", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 464.10299999999998, 113.7, 479.52299999999999], + "quad": [107.7, 464.10299999999998, 113.7, 464.10299999999998, 113.7, 479.52299999999999, 107.7, 479.52299999999999], + "text": "5" + }] + }] + }] + }, + { + "rect": [149.0, 462.383, 199.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 2, + "columnEnd": 2, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [155.9, 464.10299999999998, 173.9, 479.52299999999999], + "quad": [155.9, 464.10299999999998, 173.9, 464.10299999999998, 173.9, 479.52299999999999, 155.9, 479.52299999999999], + "text": "123", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 464.10299999999998, 173.9, 479.52299999999999], + "quad": [155.9, 464.10299999999998, 173.9, 464.10299999999998, 173.9, 479.52299999999999, 155.9, 479.52299999999999], + "text": "123" + }] + }] + }] + }, + { + "rect": [199.0, 462.383, 245.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 3, + "columnEnd": 3, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [204.1, 464.10299999999998, 216.1, 479.52299999999999], + "quad": [204.1, 464.10299999999998, 216.1, 464.10299999999998, 216.1, 479.52299999999999, 204.1, 479.52299999999999], + "text": "12", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 464.10299999999998, 216.1, 479.52299999999999], + "quad": [204.1, 464.10299999999998, 216.1, 464.10299999999998, 216.1, 479.52299999999999, 204.1, 479.52299999999999], + "text": "12" + }] + }] + }] + }, + { + "rect": [245.0, 462.383, 294.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 4, + "columnEnd": 4, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [252.3, 464.10299999999998, 264.3, 479.52299999999999], + "quad": [252.3, 464.10299999999998, 264.3, 464.10299999999998, 264.3, 479.52299999999999, 252.3, 479.52299999999999], + "text": "45", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [252.3, 464.10299999999998, 264.3, 479.52299999999999], + "quad": [252.3, 464.10299999999998, 264.3, 464.10299999999998, 264.3, 479.52299999999999, 252.3, 479.52299999999999], + "text": "45" + }] + }] + }] + }, + { + "rect": [294.0, 462.383, 343.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 5, + "columnEnd": 5, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [300.5, 464.10299999999998, 312.5, 479.52299999999999], + "quad": [300.5, 464.10299999999998, 312.5, 464.10299999999998, 312.5, 479.52299999999999, 300.5, 479.52299999999999], + "text": "44", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 464.10299999999998, 312.5, 479.52299999999999], + "quad": [300.5, 464.10299999999998, 312.5, 464.10299999999998, 312.5, 479.52299999999999, 300.5, 479.52299999999999], + "text": "44" + }] + }] + }] + }, + { + "rect": [343.0, 462.383, 391.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 6, + "columnEnd": 6, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [348.65000000000006, 464.10299999999998, 360.65000000000006, 479.52299999999999], + "quad": [348.65000000000006, 464.10299999999998, 360.65000000000006, 464.10299999999998, 360.65000000000006, 479.52299999999999, 348.65000000000006, 479.52299999999999], + "text": "73", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 464.10299999999998, 360.65000000000006, 479.52299999999999], + "quad": [348.65000000000006, 464.10299999999998, 360.65000000000006, 464.10299999999998, 360.65000000000006, 479.52299999999999, 348.65000000000006, 479.52299999999999], + "text": "73" + }] + }] + }] + }, + { + "rect": [391.0, 462.383, 441.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 7, + "columnEnd": 7, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [396.85, 464.10299999999998, 414.85, 479.52299999999999], + "quad": [396.85, 464.10299999999998, 414.85, 464.10299999999998, 414.85, 479.52299999999999, 396.85, 479.52299999999999], + "text": "345", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 464.10299999999998, 414.85, 479.52299999999999], + "quad": [396.85, 464.10299999999998, 414.85, 464.10299999999998, 414.85, 479.52299999999999, 396.85, 479.52299999999999], + "text": "345" + }] + }] + }] + }, + { + "rect": [441.0, 462.383, 487.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 8, + "columnEnd": 8, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [445.05, 464.10299999999998, 463.05, 479.52299999999999], + "quad": [445.05, 464.10299999999998, 463.05, 464.10299999999998, 463.05, 479.52299999999999, 445.05, 479.52299999999999], + "text": "453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 464.10299999999998, 463.05, 479.52299999999999], + "quad": [445.05, 464.10299999999998, 463.05, 464.10299999999998, 463.05, 479.52299999999999, 445.05, 479.52299999999999], + "text": "453" + }] + }] + }] + }, + { + "rect": [487.0, 462.383, 546.0, 481.611], + "rowStart": 4, + "rowEnd": 4, + "columnStart": 9, + "columnEnd": 9, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [493.25, 464.10299999999998, 511.25, 479.52299999999999], + "quad": [493.25, 464.10299999999998, 511.25, 464.10299999999998, 511.25, 479.52299999999999, 493.25, 479.52299999999999], + "text": "453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [493.25, 464.10299999999998, 511.25, 479.52299999999999], + "quad": [493.25, 464.10299999999998, 511.25, 464.10299999999998, 511.25, 479.52299999999999, 493.25, 479.52299999999999], + "text": "453" + }] + }] + }] + }, + { + "rect": [50.0, 443.154, 101.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 0, + "columnEnd": 0, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [59.55, 444.80299999999996, 76.86609375, 460.22299999999998], + "quad": [59.55, 444.80299999999996, 76.86609375, 444.80299999999996, 76.86609375, 460.22299999999998, 59.55, 460.22299999999998], + "text": "Edf", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [59.55, 444.80299999999996, 76.86609375, 460.22299999999998], + "quad": [59.55, 444.80299999999996, 76.86609375, 444.80299999999996, 76.86609375, 460.22299999999998, 59.55, 460.22299999999998], + "text": "Edf" + }] + }] + }] + }, + { + "rect": [101.0, 443.154, 149.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 1, + "columnEnd": 1, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [107.7, 444.80299999999996, 113.7, 460.22299999999998], + "quad": [107.7, 444.80299999999996, 113.7, 444.80299999999996, 113.7, 460.22299999999998, 107.7, 460.22299999999998], + "text": "1", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 444.80299999999996, 113.7, 460.22299999999998], + "quad": [107.7, 444.80299999999996, 113.7, 444.80299999999996, 113.7, 460.22299999999998, 107.7, 460.22299999999998], + "text": "1" + }] + }] + }] + }, + { + "rect": [149.0, 443.154, 199.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 2, + "columnEnd": 2, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [155.9, 444.80299999999996, 176.9, 460.22299999999998], + "quad": [155.9, 444.80299999999996, 176.9, 444.80299999999996, 176.9, 460.22299999999998, 155.9, 460.22299999999998], + "text": "0.77", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 444.80299999999996, 176.9, 460.22299999999998], + "quad": [155.9, 444.80299999999996, 176.9, 444.80299999999996, 176.9, 460.22299999999998, 155.9, 460.22299999999998], + "text": "0.77" + }] + }] + }] + }, + { + "rect": [199.0, 443.154, 245.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 3, + "columnEnd": 3, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [204.1, 444.80299999999996, 216.1, 460.22299999999998], + "quad": [204.1, 444.80299999999996, 216.1, 444.80299999999996, 216.1, 460.22299999999998, 204.1, 460.22299999999998], + "text": "21", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 444.80299999999996, 216.1, 460.22299999999998], + "quad": [204.1, 444.80299999999996, 216.1, 444.80299999999996, 216.1, 460.22299999999998, 204.1, 460.22299999999998], + "text": "21" + }] + }] + }] + }, + { + "rect": [245.0, 443.154, 294.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 4, + "columnEnd": 4, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [252.3, 444.80299999999996, 264.3, 460.22299999999998], + "quad": [252.3, 444.80299999999996, 264.3, 444.80299999999996, 264.3, 460.22299999999998, 252.3, 460.22299999999998], + "text": "45", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [252.3, 444.80299999999996, 264.3, 460.22299999999998], + "quad": [252.3, 444.80299999999996, 264.3, 444.80299999999996, 264.3, 460.22299999999998, 252.3, 460.22299999999998], + "text": "45" + }] + }] + }] + }, + { + "rect": [294.0, 443.154, 343.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 5, + "columnEnd": 5, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [300.5, 444.80299999999996, 306.5, 460.22299999999998], + "quad": [300.5, 444.80299999999996, 306.5, 444.80299999999996, 306.5, 460.22299999999998, 300.5, 460.22299999999998], + "text": "4", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 444.80299999999996, 306.5, 460.22299999999998], + "quad": [300.5, 444.80299999999996, 306.5, 444.80299999999996, 306.5, 460.22299999999998, 300.5, 460.22299999999998], + "text": "4" + }] + }] + }] + }, + { + "rect": [343.0, 443.154, 391.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 6, + "columnEnd": 6, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [348.65000000000006, 444.80299999999996, 366.65000000000006, 460.22299999999998], + "quad": [348.65000000000006, 444.80299999999996, 366.65000000000006, 444.80299999999996, 366.65000000000006, 460.22299999999998, 348.65000000000006, 460.22299999999998], + "text": "254", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 444.80299999999996, 366.65000000000006, 460.22299999999998], + "quad": [348.65000000000006, 444.80299999999996, 366.65000000000006, 444.80299999999996, 366.65000000000006, 460.22299999999998, 348.65000000000006, 460.22299999999998], + "text": "254" + }] + }] + }] + }, + { + "rect": [391.0, 443.154, 441.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 7, + "columnEnd": 7, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [396.85, 444.80299999999996, 408.85, 460.22299999999998], + "quad": [396.85, 444.80299999999996, 408.85, 444.80299999999996, 408.85, 460.22299999999998, 396.85, 460.22299999999998], + "text": "45", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 444.80299999999996, 408.85, 460.22299999999998], + "quad": [396.85, 444.80299999999996, 408.85, 444.80299999999996, 408.85, 460.22299999999998, 396.85, 460.22299999999998], + "text": "45" + }] + }] + }] + }, + { + "rect": [441.0, 443.154, 487.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 8, + "columnEnd": 8, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [445.05, 444.80299999999996, 463.05, 460.22299999999998], + "quad": [445.05, 444.80299999999996, 463.05, 444.80299999999996, 463.05, 460.22299999999998, 445.05, 460.22299999999998], + "text": "453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 444.80299999999996, 463.05, 460.22299999999998], + "quad": [445.05, 444.80299999999996, 463.05, 444.80299999999996, 463.05, 460.22299999999998, 445.05, 460.22299999999998], + "text": "453" + }] + }] + }] + }, + { + "rect": [487.0, 443.154, 546.0, 462.383], + "rowStart": 5, + "rowEnd": 5, + "columnStart": 9, + "columnEnd": 9, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [493.25, 444.80299999999996, 511.25, 460.22299999999998], + "quad": [493.25, 444.80299999999996, 511.25, 444.80299999999996, 511.25, 460.22299999999998, 493.25, 460.22299999999998], + "text": "453", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [493.25, 444.80299999999996, 511.25, 460.22299999999998], + "quad": [493.25, 444.80299999999996, 511.25, 444.80299999999996, 511.25, 460.22299999999998, 493.25, 460.22299999999998], + "text": "453" + }] + }] + }] + }, + { + "rect": [50.0, 423.926, 101.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 0, + "columnEnd": 0, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [59.55, 425.503, 69.54599999999999, 440.923], + "quad": [59.55, 425.503, 69.54599999999999, 425.503, 69.54599999999999, 440.923, 59.55, 440.923], + "text": "fq", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [59.55, 425.503, 69.54599999999999, 440.923], + "quad": [59.55, 425.503, 69.54599999999999, 425.503, 69.54599999999999, 440.923, 59.55, 440.923], + "text": "fq" + }] + }] + }] + }, + { + "rect": [101.0, 423.926, 149.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 1, + "columnEnd": 1, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [107.7, 425.503, 119.7, 440.923], + "quad": [107.7, 425.503, 119.7, 425.503, 119.7, 440.923, 107.7, 440.923], + "text": "22", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 425.503, 119.7, 440.923], + "quad": [107.7, 425.503, 119.7, 425.503, 119.7, 440.923, 107.7, 440.923], + "text": "22" + }] + }] + }] + }, + { + "rect": [149.0, 423.926, 199.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 2, + "columnEnd": 2, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [155.9, 425.503, 185.9, 440.923], + "quad": [155.9, 425.503, 185.9, 425.503, 185.9, 440.923, 155.9, 440.923], + "text": "12455", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 425.503, 185.9, 440.923], + "quad": [155.9, 425.503, 185.9, 425.503, 185.9, 440.923, 155.9, 440.923], + "text": "12455" + }] + }] + }] + }, + { + "rect": [199.0, 423.926, 245.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 3, + "columnEnd": 3, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [204.1, 425.503, 216.1, 440.923], + "quad": [204.1, 425.503, 216.1, 425.503, 216.1, 440.923, 204.1, 440.923], + "text": "12", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 425.503, 216.1, 440.923], + "quad": [204.1, 425.503, 216.1, 425.503, 216.1, 440.923, 204.1, 440.923], + "text": "12" + }] + }] + }] + }, + { + "rect": [245.0, 423.926, 294.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 4, + "columnEnd": 4, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [252.3, 425.503, 258.3, 440.923], + "quad": [252.3, 425.503, 258.3, 425.503, 258.3, 440.923, 252.3, 440.923], + "text": "5", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [252.3, 425.503, 258.3, 440.923], + "quad": [252.3, 425.503, 258.3, 425.503, 258.3, 440.923, 252.3, 440.923], + "text": "5" + }] + }] + }] + }, + { + "rect": [294.0, 423.926, 343.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 5, + "columnEnd": 5, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [300.5, 425.503, 318.5, 440.923], + "quad": [300.5, 425.503, 318.5, 425.503, 318.5, 440.923, 300.5, 440.923], + "text": "564", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 425.503, 318.5, 440.923], + "quad": [300.5, 425.503, 318.5, 425.503, 318.5, 440.923, 300.5, 440.923], + "text": "564" + }] + }] + }] + }, + { + "rect": [343.0, 423.926, 391.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 6, + "columnEnd": 6, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [348.65000000000006, 425.503, 372.65000000000006, 440.923], + "quad": [348.65000000000006, 425.503, 372.65000000000006, 425.503, 372.65000000000006, 440.923, 348.65000000000006, 440.923], + "text": "3445", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 425.503, 372.65000000000006, 440.923], + "quad": [348.65000000000006, 425.503, 372.65000000000006, 425.503, 372.65000000000006, 440.923, 348.65000000000006, 440.923], + "text": "3445" + }] + }] + }] + }, + { + "rect": [391.0, 423.926, 441.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 7, + "columnEnd": 7, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [396.85, 425.503, 414.85, 440.923], + "quad": [396.85, 425.503, 414.85, 425.503, 414.85, 440.923, 396.85, 440.923], + "text": "435", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 425.503, 414.85, 440.923], + "quad": [396.85, 425.503, 414.85, 425.503, 414.85, 440.923, 396.85, 440.923], + "text": "435" + }] + }] + }] + }, + { + "rect": [441.0, 423.926, 487.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 8, + "columnEnd": 8, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [445.05, 425.503, 451.05, 440.923], + "quad": [445.05, 425.503, 451.05, 425.503, 451.05, 440.923, 445.05, 440.923], + "text": "4", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 425.503, 451.05, 440.923], + "quad": [445.05, 425.503, 451.05, 425.503, 451.05, 440.923, 445.05, 440.923], + "text": "4" + }] + }] + }] + }, + { + "rect": [487.0, 423.926, 546.0, 443.154], + "rowStart": 6, + "rowEnd": 6, + "columnStart": 9, + "columnEnd": 9, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [493.25, 425.503, 499.25, 440.923], + "quad": [493.25, 425.503, 499.25, 425.503, 499.25, 440.923, 493.25, 440.923], + "text": "4", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [493.25, 425.503, 499.25, 440.923], + "quad": [493.25, 425.503, 499.25, 425.503, 499.25, 440.923, 493.25, 440.923], + "text": "4" + }] + }] + }] + }, + { + "rect": [50.0, 397.614, 101.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 0, + "columnEnd": 0, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [59.55, 406.203, 79.53, 421.623], + "quad": [59.55, 406.203, 79.53, 406.203, 79.53, 421.623, 59.55, 421.623], + "text": "qew", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [59.55, 406.203, 79.53, 421.623], + "quad": [59.55, 406.203, 79.53, 406.203, 79.53, 421.623, 59.55, 421.623], + "text": "qew" + }] + }] + }] + }, + { + "rect": [101.0, 397.614, 149.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 1, + "columnEnd": 1, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [107.7, 406.203, 113.7, 421.623], + "quad": [107.7, 406.203, 113.7, 406.203, 113.7, 421.623, 107.7, 421.623], + "text": "2", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [107.7, 406.203, 113.7, 421.623], + "quad": [107.7, 406.203, 113.7, 406.203, 113.7, 421.623, 107.7, 421.623], + "text": "2" + }] + }] + }] + }, + { + "rect": [149.0, 397.614, 199.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 2, + "columnEnd": 2, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [155.9, 406.203, 173.9, 421.623], + "quad": [155.9, 406.203, 173.9, 406.203, 173.9, 421.623, 155.9, 421.623], + "text": "122", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [155.9, 406.203, 173.9, 421.623], + "quad": [155.9, 406.203, 173.9, 406.203, 173.9, 421.623, 155.9, 421.623], + "text": "122" + }] + }] + }] + }, + { + "rect": [199.0, 397.614, 245.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 3, + "columnEnd": 3, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [204.1, 406.203, 216.1, 421.623], + "quad": [204.1, 406.203, 216.1, 406.203, 216.1, 421.623, 204.1, 421.623], + "text": "12", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [204.1, 406.203, 216.1, 421.623], + "quad": [204.1, 406.203, 216.1, 406.203, 216.1, 421.623, 204.1, 421.623], + "text": "12" + }] + }] + }] + }, + { + "rect": [245.0, 397.614, 294.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 4, + "columnEnd": 4, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [252.3, 406.203, 264.3, 421.623], + "quad": [252.3, 406.203, 264.3, 406.203, 264.3, 421.623, 252.3, 421.623], + "text": "44", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [252.3, 406.203, 264.3, 421.623], + "quad": [252.3, 406.203, 264.3, 406.203, 264.3, 421.623, 252.3, 421.623], + "text": "44" + }] + }] + }] + }, + { + "rect": [294.0, 397.614, 343.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 5, + "columnEnd": 5, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [300.5, 406.203, 306.5, 421.623], + "quad": [300.5, 406.203, 306.5, 406.203, 306.5, 421.623, 300.5, 421.623], + "text": "3", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [300.5, 406.203, 306.5, 421.623], + "quad": [300.5, 406.203, 306.5, 406.203, 306.5, 421.623, 300.5, 421.623], + "text": "3" + }] + }] + }] + }, + { + "rect": [343.0, 397.614, 391.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 6, + "columnEnd": 6, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [348.65000000000006, 406.203, 360.65000000000006, 421.623], + "quad": [348.65000000000006, 406.203, 360.65000000000006, 406.203, 360.65000000000006, 421.623, 348.65000000000006, 421.623], + "text": "34", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [348.65000000000006, 406.203, 360.65000000000006, 421.623], + "quad": [348.65000000000006, 406.203, 360.65000000000006, 406.203, 360.65000000000006, 421.623, 348.65000000000006, 421.623], + "text": "34" + }] + }] + }] + }, + { + "rect": [391.0, 397.614, 441.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 7, + "columnEnd": 7, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [396.85, 406.203, 408.85, 421.623], + "quad": [396.85, 406.203, 408.85, 406.203, 408.85, 421.623, 396.85, 421.623], + "text": "45", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [396.85, 406.203, 408.85, 421.623], + "quad": [396.85, 406.203, 408.85, 406.203, 408.85, 421.623, 396.85, 421.623], + "text": "45" + }] + }] + }] + }, + { + "rect": [441.0, 397.614, 487.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 8, + "columnEnd": 8, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [445.05, 406.203, 457.05, 421.623], + "quad": [445.05, 406.203, 457.05, 406.203, 457.05, 421.623, 445.05, 421.623], + "text": "37", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [445.05, 406.203, 457.05, 421.623], + "quad": [445.05, 406.203, 457.05, 406.203, 457.05, 421.623, 445.05, 421.623], + "text": "37" + }] + }] + }] + }, + { + "rect": [487.0, 397.614, 546.0, 423.926], + "rowStart": 7, + "rowEnd": 7, + "columnStart": 9, + "columnEnd": 9, + "kids": [ + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [493.25, 406.203, 511.25, 421.623], + "quad": [493.25, 406.203, 511.25, 406.203, 511.25, 421.623, 493.25, 421.623], + "text": "345", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [493.25, 406.203, 511.25, 421.623], + "quad": [493.25, 406.203, 511.25, 406.203, 511.25, 421.623, 493.25, 421.623], + "text": "345" + }] + }] + }] + }] + }, + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [56.8, 362.053, 337.7080000000001, 377.473], + "quad": [56.8, 362.053, 337.7080000000001, 362.053, 337.7080000000001, 377.473, 56.8, 377.473], + "text": "This is some text beneath the Table that is just not relevant", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [56.8, 362.053, 78.11200000000001, 377.473], + "quad": [56.8, 362.053, 78.11200000000001, 362.053, 78.11200000000001, 377.473, 56.8, 377.473], + "text": "This" + }, + { + "type": "word", + "rect": [81.11200000000001, 362.053, 89.10400000000002, 377.473], + "quad": [81.11200000000001, 362.053, 89.10400000000002, 362.053, 89.10400000000002, 377.473, 81.11200000000001, 377.473], + "text": "is" + }, + { + "type": "word", + "rect": [92.10400000000002, 362.053, 117.41200000000002, 377.473], + "quad": [92.10400000000002, 362.053, 117.41200000000002, 362.053, 117.41200000000002, 377.473, 92.10400000000002, 377.473], + "text": "some" + }, + { + "type": "word", + "rect": [120.41200000000002, 362.053, 138.37600000000004, 377.473], + "quad": [120.41200000000002, 362.053, 138.37600000000004, 362.053, 138.37600000000004, 377.473, 120.41200000000002, 377.473], + "text": "text" + }, + { + "type": "word", + "rect": [141.37600000000004, 362.053, 178.64800000000006, 377.473], + "quad": [141.37600000000004, 362.053, 178.64800000000006, 362.053, 178.64800000000006, 377.473, 141.37600000000004, 377.473], + "text": "beneath" + }, + { + "type": "word", + "rect": [181.64800000000006, 362.053, 196.28800000000008, 377.473], + "quad": [181.64800000000006, 362.053, 196.28800000000008, 362.053, 196.28800000000008, 377.473, 181.64800000000006, 377.473], + "text": "the" + }, + { + "type": "word", + "rect": [199.07200000000007, 362.053, 225.52000000000008, 377.473], + "quad": [199.07200000000007, 362.053, 225.52000000000008, 362.053, 225.52000000000008, 377.473, 199.07200000000007, 377.473], + "text": "Table" + }, + { + "type": "word", + "rect": [228.52000000000008, 362.053, 246.4840000000001, 377.473], + "quad": [228.52000000000008, 362.053, 246.4840000000001, 362.053, 246.4840000000001, 377.473, 228.52000000000008, 377.473], + "text": "that" + }, + { + "type": "word", + "rect": [249.4840000000001, 362.053, 257.4760000000001, 377.473], + "quad": [249.4840000000001, 362.053, 257.4760000000001, 362.053, 257.4760000000001, 377.473, 249.4840000000001, 377.473], + "text": "is" + }, + { + "type": "word", + "rect": [260.4760000000001, 362.053, 277.79200000000017, 377.473], + "quad": [260.4760000000001, 362.053, 277.79200000000017, 362.053, 277.79200000000017, 377.473, 260.4760000000001, 377.473], + "text": "just" + }, + { + "type": "word", + "rect": [280.79200000000017, 362.053, 296.11600000000018, 377.473], + "quad": [280.79200000000017, 362.053, 296.11600000000018, 362.053, 296.11600000000018, 377.473, 280.79200000000017, 377.473], + "text": "not" + }, + { + "type": "word", + "rect": [299.11600000000018, 362.053, 337.7080000000001, 377.473], + "quad": [299.11600000000018, 362.053, 337.7080000000001, 362.053, 337.7080000000001, 377.473, 299.11600000000018, 377.473], + "text": "relevant" + }] + }] + }, + { + "type": "paragraph", + "kids": [ + { + "type": "line", + "rect": [232.25, 58.452999999999999, 363.17, 73.87299999999999], + "quad": [232.25, 58.452999999999999, 363.17, 58.452999999999999, 363.17, 73.87299999999999, 232.25, 73.87299999999999], + "text": "HERE IS SOME FOOTER", + "style": { + "color": "#000000", + "name": "LiberationSerif", + "size": 12.0, + "weight": 400.0, + "italic": false, + "serif": false + }, + "kids": [ + { + "type": "word", + "rect": [232.25, 58.452999999999999, 263.546, 73.87299999999999], + "quad": [232.25, 58.452999999999999, 263.546, 58.452999999999999, 263.546, 73.87299999999999, 232.25, 73.87299999999999], + "text": "HERE" + }, + { + "type": "word", + "rect": [266.546, 58.452999999999999, 277.214, 73.87299999999999], + "quad": [266.546, 58.452999999999999, 277.214, 58.452999999999999, 277.214, 73.87299999999999, 266.546, 73.87299999999999], + "text": "IS" + }, + { + "type": "word", + "rect": [280.214, 58.452999999999999, 313.538, 73.87299999999999], + "quad": [280.214, 58.452999999999999, 313.538, 58.452999999999999, 313.538, 73.87299999999999, 280.214, 73.87299999999999], + "text": "SOME" + }, + { + "type": "word", + "rect": [316.538, 58.452999999999999, 363.17, 73.87299999999999], + "quad": [316.538, 58.452999999999999, 363.17, 58.452999999999999, 363.17, 73.87299999999999, 316.538, 73.87299999999999], + "text": "FOOTER" + }] + }] + }] + }] +} \ No newline at end of file diff --git a/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/apryseAi/Input.pdf b/redaction-service-v1/redaction-service-server-v1/src/test/resources/files/apryseAi/Input.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0fa1765e5056704175f7860748c70c672cfd3384 GIT binary patch literal 15505 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 literal 0 HcmV?d00001