diff --git a/.dockerignore b/.dockerignore index cf10e8046c0..c46bd93573c 100644 --- a/.dockerignore +++ b/.dockerignore @@ -95,6 +95,9 @@ blocks/**/.env .env.local .env.*.local +# Generated credentials from google-github-actions/auth +gha-creds-*.json + # macOS directory file **/.DS_Store diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c2e6b59b506..3241ab9c321 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -108,6 +108,11 @@ jobs: fail-fast: false if: needs.setup.outputs.unit-tests != '{"package":[],"include":[]}' runs-on: ubuntu-24.04 + permissions: + # Required to fetch an OIDC token, used to auth with Google Cloud Platform for @rust/chonky tests + id-token: "write" + # Maintain permission to read repo contents + contents: "read" steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -154,6 +159,15 @@ jobs: rm -rf $temp_dir echo "PDFIUM_DYNAMIC_LIB_PATH=$(pwd)/${{ matrix.directory }}/libs/" >> $GITHUB_ENV + # Sets GOOGLE_APPLICATION_CREDENTIALS in the environment, to be consumed by gcloud or client libraries + - name: Generate Google Cloud credential configuration + if: matrix.package == '@rust/chonky' + uses: google-github-actions/auth@6fc4af4b145ae7821d527454aa9bd537d1f2dc5f # v2.1.7 + with: + project_id: ${{ secrets.GOOGLE_CLOUD_HASH_PROJECT_ID }} + service_account: ${{ secrets.GOOGLE_CLOUD_VERTEX_SERVICE_ACCOUNT }} + workload_identity_provider: ${{ secrets.GOOGLE_CLOUD_IDENTITY_PROVIDER }} + - name: Install Rust toolchain if: always() && steps.tests.outputs.has-rust == 'true' uses: ./.github/actions/install-rust-toolchain @@ -184,6 +198,10 @@ jobs: continue-on-error: ${{ steps.tests.outputs.allow-failure == 'true' }} env: TEST_COVERAGE: ${{ github.event_name != 'merge_group' }} + # Variables needed for chonky tests + GOOGLE_PROJECT_ID: ${{ secrets.GOOGLE_CLOUD_HASH_PROJECT_ID }} + GOOGLE_DEFAULT_CREDENTIALS: ${{ env.GOOGLE_DEFAULT_CREDENTIALS }} # set by google-github-actions/auth + HUGGING_FACE_TOKEN: ${{ secrets.HUGGING_FACE_TOKEN }} run: | turbo run test:unit --env-mode=loose --filter "${{ matrix.package }}" echo "TRIMMED_PACKAGE_NAME=$(echo "${{ matrix.package }}" | sed 's|@||g' | sed 's|/|.|g')" >> $GITHUB_ENV @@ -232,6 +250,11 @@ jobs: fail-fast: false if: needs.setup.outputs.integration-tests != '{"package":[],"include":[]}' runs-on: ubuntu-24.04 + permissions: + # Required to fetch an OIDC token, used to auth with Google Cloud Platform for @rust/chonky tests + id-token: "write" + # Maintain permission to read repo contents + contents: "read" steps: - name: Checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 @@ -303,6 +326,15 @@ jobs: rm -rf $temp_dir echo "PDFIUM_DYNAMIC_LIB_PATH=$(pwd)/${{ matrix.directory }}/libs/" >> $GITHUB_ENV + # Sets GOOGLE_APPLICATION_CREDENTIALS in the environment, to be consumed by gcloud or client libraries + - name: Generate Google Cloud credential configuration + if: matrix.package == '@rust/chonky' + uses: google-github-actions/auth@6fc4af4b145ae7821d527454aa9bd537d1f2dc5f # v2.1.7 + with: + project_id: ${{ secrets.GOOGLE_CLOUD_HASH_PROJECT_ID }} + service_account: ${{ secrets.GOOGLE_CLOUD_VERTEX_SERVICE_ACCOUNT }} + workload_identity_provider: ${{ secrets.GOOGLE_CLOUD_IDENTITY_PROVIDER }} + - name: Install playwright if: matrix.package == '@tests/hash-playwright' uses: nick-fields/retry@7152eba30c6575329ac0576536151aca5a72780e # v3.0.0 @@ -360,6 +392,11 @@ jobs: - name: Run tests continue-on-error: ${{ steps.tests.outputs.allow-failure == 'true' }} + env: + # Variables needed for chonky tests + GOOGLE_PROJECT_ID: ${{ secrets.GOOGLE_CLOUD_HASH_PROJECT_ID }} + GOOGLE_DEFAULT_CREDENTIALS: ${{ env.GOOGLE_DEFAULT_CREDENTIALS }} # set by google-github-actions/auth + HUGGING_FACE_TOKEN: ${{ secrets.HUGGING_FACE_TOKEN }} run: | turbo run test:integration --env-mode=loose --filter "${{ matrix.package }}" echo "TRIMMED_PACKAGE_NAME=$(echo "${{ matrix.package }}" | sed 's|@||g' | sed 's|/|.|g')" >> $GITHUB_ENV diff --git a/.gitignore b/.gitignore index 8c0a51f5ad3..95f4538b03c 100644 --- a/.gitignore +++ b/.gitignore @@ -78,6 +78,9 @@ blocks/**/.env .env.local .env.*.local +# Generated credentials from google-github-actions/auth +gha-creds-*.json + # macOS directory file **/.DS_Store diff --git a/Cargo.lock b/Cargo.lock index 6b24efe1d1e..dc54a253e2f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1185,11 +1185,19 @@ dependencies = [ name = "chonky" version = "0.0.0" dependencies = [ + "base64 0.22.1", + "clap", "error-stack", + "futures", "image", "insta", + "num-traits", "pdfium-render", + "reqwest", + "serde", + "serde_json", "thiserror 2.0.11", + "tokio", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index aa18b58164c..6d12d505f57 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -93,6 +93,7 @@ ariadne = { version = "=0.5.0", default-features = false } aws-types = { version = "=1.3.3", default-features = false } axum = { version = "=0.7.5" } axum-core = { version = "=0.5.0" } +base64 = { version = "=0.22.1" } bumpalo = { version = "=3.16.0", default-features = false } bytes = { version = "=1.9.0" } clap_builder = { version = "=4.5.26", default-features = false, features = ["std"] } diff --git a/libs/chonky/Cargo.toml b/libs/chonky/Cargo.toml index 44a88789d0c..7c9ec09addc 100644 --- a/libs/chonky/Cargo.toml +++ b/libs/chonky/Cargo.toml @@ -15,8 +15,16 @@ edition.workspace = true error-stack = { workspace = true, public = true } # Public third-party dependencies +base64 = { workspace = true } +clap = { workspace = true, features = ["derive"] } +futures = { workspace = true, features = ["alloc"] } image = { workspace = true, public = true, features = ["png", "bmp"] } -pdfium-render = { workspace = true, public = true } +num-traits = { workspace = true } +pdfium-render = { workspace = true, features = ["thread_safe"], public = true } +reqwest = { workspace = true, features = ["json"] } +serde = { workspace = true, features = ["derive"] } +serde_json = { workspace = true } +tokio = { workspace = true, features = ["macros", "rt-multi-thread", "fs"] } # Private workspace dependencies diff --git a/libs/chonky/src/embedding/hugging_face_api.rs b/libs/chonky/src/embedding/hugging_face_api.rs new file mode 100644 index 00000000000..c18aecfe172 --- /dev/null +++ b/libs/chonky/src/embedding/hugging_face_api.rs @@ -0,0 +1,177 @@ +use std::path::Path; + +use error_stack::{Report, ResultExt as _}; +use reqwest::{ + Client, + header::{AUTHORIZATION, CONTENT_TYPE, HeaderMap, HeaderValue}, +}; +use serde::Deserialize; +use tokio::fs; + +use crate::ChonkyError; + +#[derive(Deserialize, Debug)] +pub struct BoundingBox { + pub xmin: f32, + pub ymin: f32, + pub xmax: f32, + pub ymax: f32, +} + +#[derive(Deserialize, Debug)] +pub struct TablePrediction { + pub score: f32, + #[serde(rename = "box")] + pub bounding_box: BoundingBox, +} + +//for now just have it as environment variable +fn get_hugging_face_token() -> Result> { + std::env::var("HUGGING_FACE_TOKEN").change_context(ChonkyError::HuggingFaceAPI) +} + +async fn get_binary_image_data( + image_path: impl AsRef + Send + Sync, +) -> Result, Report> { + fs::read(image_path) + .await + .change_context(ChonkyError::ImageError) +} + +fn extract_bounding_boxes(json_payload: &str) -> Result, Report> { + serde_json::from_str(json_payload).change_context(ChonkyError::HuggingFaceAPI) +} + +/// A function that calls `HuggingFace` Serverless Inference API to perform +/// table recognition on a given image and returns the vectors of bounding boxes of these tables +/// +/// # Errors +/// +/// [`ChonkyError::HuggingFaceAPI`] when there are HTTP request errors +pub async fn make_table_recognition_request( + image_path: impl AsRef + Send + Sync, + retry: bool, +) -> Result, Report> { + let url = "https://api-inference.huggingface.co/models/microsoft/table-transformer-detection"; + + let access_token = get_hugging_face_token()?; + let payload = get_binary_image_data(&image_path).await?; + + // Create a new reqwest async client + let client = Client::new(); + + // Prepare the headers + let mut headers = HeaderMap::new(); + headers.insert( + AUTHORIZATION, + HeaderValue::from_str(&format!("Bearer {access_token}")) + .change_context(ChonkyError::HuggingFaceAPI)?, + ); + headers.insert( + CONTENT_TYPE, + HeaderValue::from_static("application/octet-stream"), + ); + + headers.insert( + "x-wait-for-model", + HeaderValue::from_str(&format!("{retry}")).change_context(ChonkyError::HuggingFaceAPI)?, + ); + + // Send the POST request with payload and headers + let response = client + .post(url) + .headers(headers) + .body(payload) + .send() + .await + .change_context(ChonkyError::HuggingFaceAPI)?; + + // Check if the response status is success + + let cold_model_status = 503; + if response.status() == cold_model_status { + // call the model again allowing extra time to wait + // this should not recurse forever since 503 error + // only occurs for cold models which the new header will wait for + return Box::pin(make_table_recognition_request(image_path, true)).await; + } else if !response.status().is_success() { + return Err(Report::new(ChonkyError::HuggingFaceAPI)); + } + + // Read the response body as text + let response_text = response + .text() + .await + .change_context(ChonkyError::HuggingFaceAPI)?; + + // Process the response + extract_bounding_boxes(&response_text) + + // // this is where we would wish to provide add the retry mechanism + + // // error code when model is warm is a 503 error, we can then add x-wait-for-model:true for + // // it to work + // let url = "https://api-inference.huggingface.co/models/microsoft/table-transformer-detection"; + + // let access_token = get_hugging_face_token()?; + // let payload = get_binary_image_data(image_path)?; + + // let mut easy = Easy::new(); + // easy.url(url).change_context(ChonkyError::HuggingFaceAPI)?; + // easy.post(true) + // .change_context(ChonkyError::HuggingFaceAPI)?; + + // let mut headers = List::new(); + // headers + // .append(&format!("Authorization: Bearer {access_token}")) + // .change_context(ChonkyError::HuggingFaceAPI)?; + + // // we add wait for model to be true if receiving api error prev + // headers + // .append(&format!("x-wait-for-model:{retry}")) + // .change_context(ChonkyError::HuggingFaceAPI)?; + + // easy.http_headers(headers) + // .change_context(ChonkyError::HuggingFaceAPI)?; + + // easy.post_fields_copy(&payload) + // .change_context(ChonkyError::HuggingFaceAPI)?; + + // let mut response = Vec::new(); + // { + // let mut transfer = easy.transfer(); + // transfer + // .write_function(|data| { + // response.extend_from_slice(data); + // Ok(data.len()) + // }) + // .change_context(ChonkyError::HuggingFaceAPI)?; + // transfer + // .perform() + // .change_context(ChonkyError::HuggingFaceAPI)?; + // } + + // extract_bounding_boxes( + // &String::from_utf8(response).change_context(ChonkyError::HuggingFaceAPI)?, + // ) +} + +#[cfg(test)] +mod tests { + use insta::assert_snapshot; + + use super::*; + + #[tokio::test] + async fn table_recognition() -> Result<(), Report> { + let file_path = "tests/docs/table-testing.png"; + + let table_predictions = make_table_recognition_request(file_path, true).await?; + + assert_snapshot!( + "table_bounding_boxes.txt", + format!("{:?}", table_predictions) + ); + Ok(()) + } +} diff --git a/libs/chonky/src/embedding/mod.rs b/libs/chonky/src/embedding/mod.rs new file mode 100644 index 00000000000..19d02c06231 --- /dev/null +++ b/libs/chonky/src/embedding/mod.rs @@ -0,0 +1,2 @@ +pub mod hugging_face_api; +pub mod multi_modal_embedding; diff --git a/libs/chonky/src/embedding/multi_modal_embedding.rs b/libs/chonky/src/embedding/multi_modal_embedding.rs new file mode 100644 index 00000000000..f8ac1a12fe5 --- /dev/null +++ b/libs/chonky/src/embedding/multi_modal_embedding.rs @@ -0,0 +1,427 @@ +use std::path::PathBuf; + +use base64::{Engine as _, engine::general_purpose}; +use error_stack::{Report, ResultExt as _}; +use image::DynamicImage; +use reqwest::{ + Client, + header::{AUTHORIZATION, CONTENT_TYPE, HeaderMap, HeaderValue}, +}; +use serde_json::{Value as JsonValue, json}; + +use crate::{ + ChonkyError, DocumentEmbeddings, Embedding, ImageEmbedding, PageImageObjects, + PageImageObjectsEmbeddings, PageTableObjects, PageTableObjectsEmbeddings, StructuralEmbedding, + StructuralMetadata, TableEmbedding, TextEmbedding, +}; + +fn get_vertex_access_token() -> Result> { + Ok(String::from_utf8( + std::process::Command::new("gcloud") + .args(["auth", "print-access-token"]) + .output() + .change_context(ChonkyError::VertexAPI) + .attach_printable("Issues getting the Google Cloud Auth Token")? + .stdout, + ) + .change_context(ChonkyError::VertexAPI)? + .trim() + .to_owned()) +} + +fn base64_json(image_data: impl AsRef<[u8]>) -> JsonValue { + let base64_encoded_img = general_purpose::STANDARD.encode(image_data); + + json!({ + "instances": [ + { + "image": { + "bytesBase64Encoded": base64_encoded_img + } + } + ] + }) +} + +/// Googles Multimodal embedding text can only take 1024 characters so for now we will only truncate +/// the first 1000 characters, this function would be responsible for chunking the text appropriatly +fn text_json(text: &[String]) -> JsonValue { + //merge all text into one without seperator for now + let mut text = text.concat(); + text.truncate(1000); + json!({ + "instances": [ + { + "text": text + } + ] + }) +} + +/// Given the extracted images from the pdf, embeds them +/// +/// # Errors +/// +/// [`ChonkyError::VertexAPI`] when there are HTTP request errors +pub async fn embed_pdf_object_images( + pdf_image_extract: Vec, + project_id: &str, +) -> Result, Report> { + let mut embeddings = Vec::new(); + for page_images in pdf_image_extract { + let page_image_iter = page_images.clone().owned_iter(); + let image_embeddings = embed_screenshots(page_images.owned_iter(), project_id) + .await? + .into_iter(); + + embeddings.push(PageImageObjectsEmbeddings { + _embeddings: image_embeddings + .zip(page_image_iter) + .map(|(embedding, image)| ImageEmbedding { + embedding, + _image: image, + }) + .collect(), + }); + // embeddings.push(PageImageObjectsEmbeddings { + // _embeddings: ImageEmbedding { + // embedding: embed_screenshots(page_images.iter(), project_id).await?, + // _image: page.next(), + // }, + // }); + } + Ok(embeddings.into_boxed_slice()) +} + +/// Given the screenshot of each page in pdf return its embeddings +/// +/// # Errors +/// +/// [`ChonkyError::VertexAPI`] when there are HTTP request errors +pub async fn embed_screenshots( + pdf_image_extract: impl IntoIterator + Send, + project_id: &str, +) -> Result, Report> { + let mut embeddings = Vec::new(); + for image in pdf_image_extract { + let mut buffer = Vec::new(); + let encoder = image::codecs::png::PngEncoder::new(&mut buffer); + + image + .write_with_encoder(encoder) + .change_context(ChonkyError::ImageError)?; + + // at this point we are transfering ownership of images, cannot use reference without + // cloning? + embeddings.push(Embedding { + _model_used: "Google Multimodal Embeddings".into(), + embedding_vector: make_multimodal_api_request( + project_id, + Some(image.into_bytes()), + None, + ) + .await?, + }); + } + Ok(embeddings.into_boxed_slice()) +} + +/// Given the tables on each page of the pdf, embeds each pages tables seperately into a vector +/// for each page +/// +/// # Errors +/// +/// [`ChonkyError::VertexAPI`] when there are HTTP request errors +pub async fn embed_tables( + pdf_table_bounds: Vec, + project_id: &str, +) -> Result, Report> { + let mut embeddings = Vec::new(); + for page_tables in pdf_table_bounds { + let mut page_embeddings = Vec::new(); + for table in page_tables.page_table_objects { + let mut buffer = Vec::new(); + let encoder = image::codecs::png::PngEncoder::new(&mut buffer); + + table + .image + .write_with_encoder(encoder) + .change_context(ChonkyError::ImageError)?; + + page_embeddings.push(TableEmbedding { + embedding: Embedding { + _model_used: "Google Multimodal Embeddings".into(), + embedding_vector: make_multimodal_api_request(project_id, Some(buffer), None) + .await?, + }, + _table: table, + }); + + // page_embeddings + // .push(make_multimodal_api_request(project_id, Some(buffer), None).await?); + } + embeddings.push(PageTableObjectsEmbeddings { + _embeddings: page_embeddings, + }); + } + Ok(embeddings.into_boxed_slice()) +} + +/// Given the text on each page of the pdf, embeds each pages text seperately into a vector +/// +/// # Errors +/// +/// [`ChonkyError::VertexAPI`] when there are HTTP request errors +pub async fn embed_text( + pdf_text_extract: &[&[String]], + project_id: &str, +) -> Result, Report> { + let mut embeddings = Vec::new(); + for page_text in pdf_text_extract { + embeddings.push(TextEmbedding { + _embedding: Embedding { + _model_used: "Google Multimodal Embeddings".into(), + embedding_vector: make_multimodal_api_request(project_id, None, Some(page_text)) + .await?, + }, + _text: page_text.concat(), + }); + } + Ok(embeddings) +} + +/// A function that performs authentication with Google Vertex API and performs +/// a request to obtain multimodal embeddings given an image path +/// +/// # Errors +/// +/// [`ChonkyError::VertexAPI`] when there are HTTP request errors +/// [`ChonkyError::ImageError`] when there are errors converting to base64 encoding +pub async fn make_multimodal_api_request( + project_id: &str, + image_data: Option>, + text_data: Option<&[String]>, +) -> Result, Report> { + let url = format!( + "https://us-central1-aiplatform.googleapis.com/v1/projects/{project_id}/locations/us-central1/publishers/google/models/multimodalembedding@001:predict" + ); + + let access_token = get_vertex_access_token()?; // assuming this function is synchronous + + // Create the reqwest async client + let client = Client::new(); + + // Prepare headers + let mut headers = HeaderMap::new(); + headers.insert( + AUTHORIZATION, + HeaderValue::from_str(&format!("Bearer {access_token}")) + .change_context(ChonkyError::VertexAPI)?, + ); + headers.insert( + CONTENT_TYPE, + HeaderValue::from_static("application/json; charset=utf-8"), + ); + + // Prepare payload make sure its initialized + let mut payload = json!(null); + if let Some(image_payload) = image_data { + payload = base64_json(&image_payload); + } else if let Some(text_payload) = text_data { + payload = text_json(text_payload); + } + + // Make the POST request + let response = client + .post(&url) + .headers(headers) + .body(payload.to_string()) + .send() + .await + .change_context(ChonkyError::VertexAPI) + .attach_printable("Failed to build post request for Vertex API")?; + + // Check the response status + if !response.status().is_success() { + return Err( + Report::new(ChonkyError::VertexAPI).attach_printable(format!( + "Received the error code {} in the response status with error text {:?}", + response.status(), + response + .error_for_status() + .change_context(ChonkyError::VertexAPI)? + .text() + .await, + )), + ); + } + + // Read and process the response + let response_text = response + .json() + .await + .change_context(ChonkyError::VertexAPI)?; + + extract_embedding(&response_text) +} + +// Parses the response to extract the image or text embedding vector +fn extract_embedding(response: &JsonValue) -> Result, Report> { + let prediction = response + .as_object() + .and_then(|obj| obj.get("predictions")) + .and_then(JsonValue::as_array) + .and_then(|arr| arr.first()) + .ok_or_else(|| Report::new(ChonkyError::VertexAPI)) + .attach_printable("Unexpected response format")?; + + let embedding = match ( + prediction.get("imageEmbedding"), + prediction.get("textEmbedding"), + ) { + (Some(embedding), None) | (None, Some(embedding)) => embedding + .as_array() + .ok_or(ChonkyError::VertexAPI) + .attach_printable("Unexpected response format")?, + (None, None) => { + return Err(ChonkyError::VertexAPI).attach_printable("No embedding found in response"); + } + (Some(_), Some(_)) => { + return Err(ChonkyError::VertexAPI) + .attach_printable("Embedding found in both image and text fields"); + } + }; + embedding + .iter() + .map(|x| { + x.as_f64() + .ok_or_else(|| Report::new(ChonkyError::VertexAPI)) + }) + .collect() +} + +pub fn add_structural_embedding( + document_embeddings: &mut DocumentEmbeddings, + page_number: usize, + file_path: PathBuf, + embedding_vector: Vec, +) { + let structural_metadata = StructuralMetadata { + _page_number: page_number, + _image_path: file_path, + }; + + let embedding = Embedding { + _model_used: "VertexAPIMultiModalEmbeddings".into(), + embedding_vector, + }; + + let structural_embedding = StructuralEmbedding { + _metadata: structural_metadata, + _embedding: embedding, + }; + + document_embeddings + .structural_embeddings + .push(structural_embedding); +} + +#[cfg(test)] +mod tests { + use insta::{assert_binary_snapshot, assert_snapshot}; + use serde_json::to_string_pretty; + use tokio::fs; + + use super::*; + use crate::create_document_embedding; + + #[tokio::test] + async fn base64_conversion() -> Result<(), Report> { + let test_path = PathBuf::from("./tests/docs/page_1.png"); + let image_data: Vec = fs::read(test_path) + .await + .change_context(ChonkyError::ImageError)?; + // source of truth found by decoding base64 encoding to get same image + // must use string_pretty since there is autoformating done by compiler with addition of + // newline + assert_binary_snapshot!( + "page_1.json", + format!( + "{}\n", + to_string_pretty(&base64_json(image_data)) + .change_context(ChonkyError::ImageError)? + ) + .into() + ); + Ok(()) + } + + #[tokio::test] + async fn image_embedding() -> Result<(), Report> { + //since embeddings are nondeterminatic they vary slightly + //thus a good way to test is to check if cosine similarity close to 1 + + let test_image_path = PathBuf::from("./tests/docs/page_1.png"); + + let test_json_path = PathBuf::from("./src/snapshots/google_test_embedding_page_1.json"); + + let source_embedding = extract_embedding( + &serde_json::from_slice( + &fs::read(test_json_path) + .await + .change_context(ChonkyError::ImageError)?, + ) + .change_context(ChonkyError::ImageError)?, + )?; + + let image_data: Vec = fs::read(test_image_path) + .await + .change_context(ChonkyError::ImageError)?; + + //project id + + let project_id = + std::env::var("GOOGLE_PROJECT_ID").change_context(ChonkyError::VertexAPI)?; + + let test_embedding = + make_multimodal_api_request(&project_id, Some(image_data), None).await?; + + //find cosine similarity of vectors + + let mut dot_prod: f64 = 0.0; + let mut source_mag: f64 = 0.0; + let mut test_mag: f64 = 0.0; + + for index in 0..test_embedding.len() { + dot_prod += source_embedding[index] * test_embedding[index]; + source_mag += source_embedding[index] * source_embedding[index]; + test_mag += test_embedding[index] * test_embedding[index]; + } + + let similarity = dot_prod / (test_mag.sqrt() * source_mag.sqrt()); + + let expected_similarity_threshold = 0.999; + + if similarity >= expected_similarity_threshold { + Ok(()) + } else { + Err(Report::new(ChonkyError::Pdfium).attach_printable(format!( + "Cosine similarity is lower than expected: got {similarity}, expected at least \ + {expected_similarity_threshold}" + ))) + } + } + + #[test] + fn create_embedding_data() { + let mut document_embeddings = create_document_embedding(); + + add_structural_embedding( + &mut document_embeddings, + 1, + PathBuf::from("test/path"), + vec![0.1, 0.2, 0.3], + ); + assert_snapshot!(format!("{:?}", document_embeddings)); + } +} diff --git a/libs/chonky/src/embedding/snapshots/chonky__embedding__hugging_face_api__tests__table_bounding_boxes.txt.snap b/libs/chonky/src/embedding/snapshots/chonky__embedding__hugging_face_api__tests__table_bounding_boxes.txt.snap new file mode 100644 index 00000000000..f39203450bd --- /dev/null +++ b/libs/chonky/src/embedding/snapshots/chonky__embedding__hugging_face_api__tests__table_bounding_boxes.txt.snap @@ -0,0 +1,6 @@ +--- +source: libs/chonky/src/embedding/hugging_face_api.rs +expression: "format!(\"{:?}\", table_predictions)" +snapshot_kind: text +--- +[TablePrediction { score: 0.9997482, bounding_box: BoundingBox { xmin: 187.0, ymin: 138.0, xmax: 808.0, ymax: 315.0 } }] diff --git a/libs/chonky/src/embedding/snapshots/chonky__embedding__multi_modal_embedding__tests__create_embedding_data.snap b/libs/chonky/src/embedding/snapshots/chonky__embedding__multi_modal_embedding__tests__create_embedding_data.snap new file mode 100644 index 00000000000..65c9817861f --- /dev/null +++ b/libs/chonky/src/embedding/snapshots/chonky__embedding__multi_modal_embedding__tests__create_embedding_data.snap @@ -0,0 +1,6 @@ +--- +source: libs/chonky/src/embedding/multi_modal_embedding.rs +expression: "format!(\"{:?}\", document_embeddings)" +snapshot_kind: text +--- +DocumentEmbeddings { structural_embeddings: [StructuralEmbedding { _metadata: StructuralMetadata { _page_number: 1, _image_path: "test/path" }, _embedding: Embedding { _model_used: "VertexAPIMultiModalEmbeddings", embedding_vector: [0.1, 0.2, 0.3] } }], content_embeddings: [] } diff --git a/libs/chonky/src/embedding/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap b/libs/chonky/src/embedding/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap new file mode 100644 index 00000000000..af3d1af2ad4 --- /dev/null +++ b/libs/chonky/src/embedding/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap @@ -0,0 +1,6 @@ +--- +source: libs/chonky/src/embedding/multi_modal_embedding.rs +expression: base64_json(image_data).to_string().into() +extension: json +snapshot_kind: binary +--- diff --git a/libs/chonky/src/embedding/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap.json b/libs/chonky/src/embedding/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap.json new file mode 100644 index 00000000000..2647bb9e012 --- /dev/null +++ b/libs/chonky/src/embedding/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap.json @@ -0,0 +1,9 @@ +{ + "instances": [ + { + "image": { + "bytesBase64Encoded": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAUXCAYAAADKt0oSAAD4NUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8uH1HMVVddddVVV1111VVXXXXVVVdd9d+JylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXfX/Vz+DU9fwHO67C1rjf5WtHdg+xrNcugBHh/yPtbkFswXPsr8L48hV/68RXHXVVVddddVVV1111VX/b5X3/zjmv/N05r/zdOa/83Tmv/N04k3fkX+L+ZMm5k+amD9pYv6kif9K9f0+lvnvPJ357zyd+e88nfKW78r/ZPXTv5r5H9/N/I/vZv7HdxOv+vpc9f8ewVVXXXXVVVddddVVV131/1Z5m/fkuZW3fS+uuuqq/3IEV1111VVXXXXVVVddddX/S3r5Vyce9HCeW7zK68L1N/O/m7jqqv9lCK666qqrrrrqqquuuuqq/5fK274Xz48iKG/zHvyvJnHVf576EZ9J/2tPoP+1J9D/2hOIV319rvp3I7jqqquuuuqqq6666qqr/v9ZbFDe5B24nw8P8DBwv/K278X/ahJX/Sc6dQ3xoIcTD3o48aCHw+YWV/27EVx11VVXXXXVVVddddVV/+/EG70t2tzifu1nf4D8nV/kfnHLw9DLvzr/a0lcddX/MgRXXXXVVVddddVVV1111f875e3emwdqP/39tJ/5AR6ovN1787+WxFVX/S9DcNVVV1111VVXXXXVVVf9v6KbHky84mtxv7ztqfiv/oj8rZ/Hly5yv/LGbw+LDa666qr/ElSuuuqqq6666qqrrrrqqv9Xytu8J5K4X/7MDwDAONJ+8ceo7/KBAGhzi3jjtyN/6vv4r6IHPRyOn4RhwE97AqxX/JtIPI+d4+iWh0Em7O/i25/Ov4dufBDsnIBa4egA3/50GNb8h9ncRg9/LJrN8e55/JTHQSb/bl2HHvIoWGzCsMK3PhmWR1z1347KVVddddVVV1111VVXXfX/Srz1e/BA7Wd+gPu1n/l+6rt8IPcrb/te5E99H/9uN9xCfacP4H75x79F/tFvAqBHvjj1Az+ReLXXR6eu4X4eR/z3f870A99E/sKPQGu8yGzuF2/97tR3/WD0Eq+ASuF++dQn0H7gG2k/9b1weMCLQo9+ScpbvAvxRm9H3PJQHsiHB+Rv/hztF36U/L1fgXHgRdYal5VCeYf3pbzD+6HHvgwqhfv58ID83V9m+o6vwH/7Z/yrRBBv+o7Ud/kg9JKvgGZz7udM/LQn0H7+h2k/8u1w/j6ex/U3U9/5A7lfvNQr8kDlLd6ZePGX44Har/00/vu/4KoXGVo+opirrrrqqquuuuqqq6666v+FeMXXov/+3+B++dd/zPCOr84D9b/+JOKWhwJgm+H1HoHvuJV/yfxJEw+0emTlfnr5V2f2g7/N/aav/zymr/886qd8BeU9PgxF8MLkE/+O8aPfBT/1CTw/9aM+m/phn879hk96H/L3f43+G3+SeKlX5IXx3i7Du742ftLf8wJJ1I/4TMqHfhqK4F+ST3si4we9FX7GU3h+6hd9O/Xt3pv7rd/x1eHSBbpv/EniYY/mXzL96Hcwfd5HwXrFv0SPfHG6r/lh4mGP5l/io0OmL/o42o98Ow+kl3kVZj/ye/xrjJ/xwbQf+XauepERXHXVVVddddVVV1111VX/b5S3e28eqP309/Pc8md/gPtJorzNe/IfTqL7qh+kvtdHoAj+JfGol6D/iT9BL//qvCg0W9D/4G8TL/WK/Eu0c5z+W38WTl/L8yXRffNPUz/8M1AEL4p46KPof/yP0Eu/Mi8KXXcT/Q/9LvGwR/OiqO/4fvQ/+NuwucULE6/5xvQ//kfEwx7Ni0Ibm3Sf983UT/9qrvovR+Wqq6666qqrrrrqqquu+v9hY5N4o7flfh5H2i/+KM+t/fT3Uz/8M7hfvM17wtd9Lv+Ryju+PzpzHffzxfO0H/8u8nF/CVNDNz+Y8k4fQDzo4dxPG5v03/IzDO/0Gvgpj+OFqR/12ejUNQD4YJ/2g99EPvkfAIgXf3nKG70Nuu4m7qcbbqH7yu9nfM834LmVD/t0yuu8GQ/ki+dpv/Rj5F/9ESyP0HU3Ut747dHLvRqSANCxE/Rf+8Os3+Jl4NJFXpjus78enTzN/fLv/pz2U9+L77sHZjPi5V+D8tbvjhYb3C9e4uXpvuEnGN/njcHmuemxL0P3tT+C5gvu59bI3/9V8jd/Hh/soa0d4hVek3ijt0Vdx/3qe344vusZtO/8Kq76L4OWjyjmqquuuuqqq6666qqrrvo/r7zde9N90bdzv/brP8P4oW/H89P/6B8QL/1K3G94j9cn/+S3eWHmT5p4oNUjK/fTy786sx/8bZ6bbaYv+2Ta9349DGueg0S8/lvRfcl3oa1t7pd//ScM7/TqYHO/+lGfTf2wT+e5tV/6ccbP/jC4eJ7nUArdV/8g5Y3ejgdavcaD4N47eZad48z+4A40m3O/9vM/wvhZHwr7l3hueoXXpP/Gn0DHTnC/6Zu/mOkrP50Hql/07dS3e2+em+++neGj3gX/9R/zPI6doH7051Lf7UN4oPHzPor2fd/AcyiF/mf/knjEi3G/fOoTGD/orfBtT+V5nL6W7pO/jPKW78r9vFqyfqPHwt23A0AE96uf9XXUd/kg7jd8+DuSv/7TPIdMrvpXIbjqqquuuuqqq6666qqr/l8ob/tePFD76R/gBWk/8/08UHm79+Y/w/QFH0v79q+AYc3zsMlf+2nGD35rvF5xv3jpVyLe6t34l+Tf/hnjx78nXDzP82iN8aPflXz83/BA5fXeguewt8v69R/F9I1fiC+cJf/0dxk/4T1h/xLPj//sdxne4/VwJvcr7/j+UAr/Ep+7l+E93wD/9R/zfF26yPQ5H8H0w9/GA9WP+TzY3OaByjt9APGIF+N++ZTHM7zjq+Hbnsrzde5exk94L9ov/zj303xB/bBP51kyIRMyweY5OCETMiETMrnqX43gqquuuuqqq6666qqrrvo/Tzc/lHiF1+B+3tslf+vneUHaL/wIHkfuF2/0trC5xX+k9pPfS/ver+Nfkn/6O0yf91E8UH3nD+RfMn7Ce8E48AK1Rvu5H+SB4rXflOdx751MX/2ZrF/jQQwf/S7QGi+Mn/C35K//DPfTydPooY/mXzJ81LvgZzyFf8n0WR9K/sUfcD9t7VDe4p15oPL278MDTZ/94bB/iRfKZvyMD8HrFfcrb/x20PVc9V+C4Kqrrrrqqquuuuqqq676P6+87XvxQO2XfhzGgRdo9wL5u7/E/bTYoLzJO/Afafrhb+VF1X7mB/DBHveLl31VuOEWXpD8h7/ET38S/5L8tZ/hgXTmOl6gcYBz93LZfIFe7tWI13oT4rXfFL3Ca8KZ67hf++Uf54H0qJfghcmnPgH/2e/yIrGZfvhbeaB4s3fifrrpwcSLvxz3a3/4G+Sf/g4vkksXyV/7Ge6nnePEK7wGV/2XoHLVVVddddVVV1111VVX/d8mUd72PXmg9jPfz7+k/fQPUF7vLblfedv3ov34d/EfIZ/2RPzXf8yLbL2i/eKPUd/x/bhfvPjLkXfdxvOTv/ULvCh87l6ew3yDF2ixQXn79yFe+02JV3wtNJvz3PIpjyP/4NfxfXfzQNo+xgvTfup7+dfIX/lJ/Flfj7a2AYjHvgz3i9d9Cx5I191E93U/wotKD38xHkgPfyz84W9w1X86KlddddVVV1111VVXXXXV/2nxKq+Lrr+Z+zmT+o7vD+/wfrxQ/YwHipd/dXTLw/BtT+XfK//89/nXyj/+TXjH9+N+esSLwa/+FM+Pz93Li2RY8xwieH70mJei+6ofJB76KF6YePhjiYc/lucRwQuTf/Z7/KusluTf/Anl1V4fAG0fg+tugnvuQNffzAPFQx8FD30U/1Z68CO46r8Elauuuuqqq6666qqrrrrq/7Tydu/NAymC8tbvzr9Fedv3Yvrqz+Tf7WCPf7X9PR5I28d4gbLxHyXe9B3ovvS7UT/juXkc4XAf5gs0X/BvdrDHv9rBJR5I28fwPXfA9jH+I2lji6v+S1C56qqrrrrqqquuuuqqq/7v2toh3uCt+Y9S3uY9mL7ms8Dm36V2/KvVjueQyX+64yfpPucbUT/jfp4m2o9+O/lLP07+2e9CJgDM5sTLvArlXT6IeP23Ql3Hi6x2/KvVjueQjeen/frP4Nufzr9V/s2fcNV/CSpXXXXVVVddddVVV1111f9Z5c3eEc0X3M+tQZv4V6kdigBA199MvMrrkX/46/x76PS1/GvpzHU8kO+5g/9s9QM/CR07wf18sM/44e9A/uGv8zzWK/KPf4v8498i3vBt6b/+R3lR6fS1mH8dnbme+9nG99wBAPfeyQPlr/8M7Se/l6v+xyO46qqrrrrqqquuuuqqq/7PKm/7XjzQ9HkfxfrFN1m/+CbrF99k/eKbrF98k/WLb7J+8U3WL77J+sU3Wb/4JusX32T94ptMX/NZPFB5u/fm3yte601gscG/RrzZO/JAfsLf8p8tXvtNeKDpO76C/MNf51+ik6f514g3eXv+NXTzQ9BLvDz38+1Ph8MDAPKJf88D6eVenav+VyC46qqrrrrqqquuuuqqq/5P0kMeSbzMq3A/jyPtF3+Uf638uR/igeIN3gq2dvj30OYW8YZvw4tKNz2YeMXX4n4+OiT/7s/4z6YHP5IHyp/5fv5FEuU9P4J/jfLGbw/zBS+q8rbvhSTul3/6O9wv/+L3cWvcr7zlu8LJM7zITpzmX2Rz1X84gquuuuqqq6666qqrrrrq/6Tytu/FA+Xv/hLsXuBfy3fcSv7VH3E/zReUN38n/r3q+30cbG7xoqgf8/lI4n7tl34Mlkf8pxsH/rXiLd+VePhj+NfQ1jbl/T6OF4VufBDlnT+QB2o/8d08y/n7yN/7Fe6n2Zz6fh/Hi6QU+u/6ZfpffTzlvT8Kto/xfI0DD6TjJ7nq343gqquuuuqqq6666qqrrvq/J4LyVu/OA7Wf/gH+rdrP/iAPVN72vfj3ike/JP23/CzM5rww9dO/mvIW78z9PE207/pq/iv4zlt5oPIeH84LE2/+TnRf+O38W3Qf9dmUd/1gXqjT19J9z6+iU9dwv/zLP8R/8Qc80PRtX84D1Q/4eMqHfAr/kvr530o89qWJBz+C7lO/gv5Hfo/nx/feyQPFa74RV/27EVx11VVXXXXVVVddddVV/+fEq70Buu5G7ue9XfI3f45/q/aLP4anifvFS78yeuij+PeKV3xN+h/6HeJN3wFK4YH0Cq9B900/SX3PD+eB2vd8LX7S3/NfoX3fN/BA5b0+kvoJXwwbmzyQHvZo6md9Hd1XfD/qOv6t6md9HfVzvwk98sV5DosNyrt8EP2P/D5xy8O4n6eJ8TM/lOfmP/td2k99Hw/Ufczn0X3596KXfAWemx71EnTf8QvUt3svHmj6hs/n+clf/SkeqLzR21E/6rPhupvgxCn0cq/GVf9qVK666qqrrrrqqquuuuqq/3PK274XD9R++SdgHPg3u3iO/INfo7zWm3C/8rbvxfTln8q/RfuT3yZe7tVRrcSLvxz9V/8Qvu9u8sl/D9OEbnww8fDH8NzaH/4G01d+Gv9V2k98N/UjPwudugYARVA/4OMp7/WR+O/+DO9dRGeuJ1785Xig9hs/S3m9t+RF1X7vVyiv8UZIor7zB1Df+QPIx/0VvvcumC+Ix74MOnaC5zZ9+gfiJ/09z8/42R+GHvII4qVfmfuVt3xXylu+K/mUx+M7ng4S8aiXQNfdxHObvufryF/4UZ4f3/508q/+iHiZV+F+9cM+nfphn8791u/wavhv/oSrXmQEV1111VVXXXXVVVddddX/LdvHiDd4Kx6o/cz38+/VfvYHeaDyVu8OEfxb+Il/z/jR74KHNffTNddTXu0NKK/1JsTDH8Nza7//q4wf+rYwjvyXGdYMH/K2+Px9PJD6nni5V6O8zpsTL/5yPND4VZ9B+6nv419j+pyPpP3ij/FA8diXobzOm1Fe5XXRsRM8kMeR8bM+jPaT38sLtDxieP83p/3Br/Hc4uGPobz2m1Je603QdTfx3KYf/Q6mL/54Xpjx498L33MHL0h9lw/iqn8Vgquuuuqqq6666qqrrrrq/5Ty5u+M+hn3853PwH/2e/x75a//DD465H669gbi1d+QfwvtHCd/9acY3vW1yb/6I14Y715g/OJPYHzfN4WjQ/6r+a//mOHtX4X8+7/ghfG5exk+9t1p3/RF/Gt5HBg/5l0Zv+jj8e4FXpj8uz9neOfXoP3Qt/Av2ttlfJ83YfzsD8f33Mm/xPfdzfBBb8306R8ErfHC+PanMbz769F+/1dxazy3eNN3gK0drnqRoeUjirnqqquuuuqqq6666qqr/u84fS3aPsb9fLgP993Nf4gbbkGzOffzxXOwewGA+ZMmHmj1yMr99PKvzuwHf5v7tV/5CcaPeCfuF6/4WsSrvwHxcq8GJ07BOOIn/T35p79D+/kfhuURL9SxE+jYSe7n8/fB4T4vCj3mpXiW9Qo/7Ym8IHr0S1Le7J2IV3gN2DkO44if8nja7/0y+es/Cwd7XLaxia65gfv53L1wsMezXHsjOn6S+/mpj4dpAoCtHeL135J4pdchHv0SMN+A3fPk3/wp+Zs/T/7p7/BvUgrxem9JvMJrEi/xcnD6OsCwt0v+2e/Rfv1n8V/8PmTyr3bqGsrrvQWcvhYUcLhP/unv4sf9FVe9yNDyEcVcddVVV1111VVXXXXVVVf9J9LLvzqzH/xt7td+5ScZP+Idueqqq56FylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddV/Mj/5Hxg++G24n++7i6uuuuo5oOUjirnqqquuuuqqq6666qqrrrrqqqv+O1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq676rxYBpUAUKAWiQASUAgqwwQmZkAlOyITWYFhz1VX/B1G56qqrrrpf18HWDtrchq0d2NxGWzuwuYW2dmBzGza2UO0gAiIgAhRQCkhc1hpkQjbIhEzIhqcRDvfhYA8f7MP+JXywBwd7+GAPDvZgecRVV1111VVXXfW/wOYWHDuJjp1Ex0/CsZPo+Ak4dhIdOwnHT6JjJ9Cxk3D8JDp2Eo6dgH6GIvj3cGtwdACH+/hgHw738eE+HO7D4QE+3IeDPXy4D4f7cLiPD/bx+fvg3jvxvXfBOHDVVf/DoOUjirnqqqv+b5LgzHXoupvQdTeh625E196ErrsJXXs9bB+HrR20uQ1bO6jv+e/m1uBwHw728MEeHOzhgz24cA7ffTu++3Z89+347tvx3bfD/iWuuuqqq6666qr/QKWgmx6CHvwI9OBHoIc8El13Izp+Co6dRMdPws4J1HX8b+aL5/G9d+J778T33gX33onvvRPfexe+9058751w8TxXXfVfCC0fUcxVV131v1M/Qw97DHrQw9H1N6HrbkLX3YSuuxFddxOcuR7V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wVVXXXXVVVf9f+Kzd3PV80Vw1VX/Wufvo33rlzK8/iMZ3udNaL/yk3iauJ//5k9gb5errrrq/yY/4W+46j+Odk5w1VVXXXXVVf+v7F7Aw5qrngfBVVf9O+Qf/BrjR7wj69d6MONXfQa+8xm03/1lrrrqqv/Dlkf43L1c9R/k2HGuuuqqq6666v+ds/dw1fOgctVV/xHO3kP7pi+iffMXw2KDq6666v823/F0dPparvr3085xrrrqqquuuur/Gy8PEVc9F4KrrvqPZMPRIVddddX/bb796Vz1H2TnBFddddVVV131/840cdXzoHLVVVddddVV/0q+/elc9R9Dx05w1VVXXXXVVf/vTCNXPQ8qV1111VVXXfWv5NufxlX/QXZOcNVVV1111VX/70wTVz0Pgquuuuqqq676V/LtT+eq/xjqOlhscNVVV1111VX/r7SJq54HwVVXXXXVVVf9K/nu27nqP9DOCa666qqrrrrq/5U2cdXzILjqqquuuuqqfyXv73LVfxwdO8FVV1111VVX/b8ShaueB8FVV1111VVX/Wvt7WKbq/6D7Bznqquuuuqqq/5fqZWrngfBVVddddVVV/1rZcLhPlf9x9DWMa666qqrrrrq/5VSuep5EFx11VVXXXXVv8XeLlf9B6mVq6666qqrrvp/pRSueh4EV1111VVXXfVv4EsXueo/SBSuuuqqq6666v+VUrnqeVC56qqrrrrqqn8D713kqv8gJbjqqquuuuqq/1dK5arnQeWqq6666qqr/i2ODrjqP0gpXHXVVVddddX/Jzp2gqueB5Wrrrrqqquu+rdojav+g0Thqquuuuqqq/7fkODkGa56HlSuuuqqq6666t+iNa76D1IKV1111VVXXfX/xskzqBSueh5UrrrqqquuuurfIpOr/oNkctVVV1111VX/X+ia67nq+aJy1VVXXXXVVf8WIa76D9IaV1111VVXXfX/hU5fx1XPF5Wrrrrqqquu+reIwlX/QbJx1VVXXXXVVf9f6My1XPV8Ubnqqquuuuqqf4sIrvoP0pKrrrrqqquu+n/j9HVc9XxRueqqq6666qp/iwiu+g+Sjauuuuqqq676/0JnruOq54vKVVddddVVV/1bKLjqP0gmV1111VVXXfX/hU5fx1XPF5Wrrrrqqquu+reYL7jqP8jyiKuuuuqqq676/0JnruWq54vK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9X+T93YZ3unV8VOfwDOh5SOKueqqq676T6SHPZr+B34LnTzDVf+75N//BcN7vB4cHnDVVVddddVVV/3Xi9d4I8q7fyjxWm+CIrjq/5a841aGd3hVOH8fAFo+opirrrrqqv8kuvmh9D/42+jaG7jqf5d82hMZ3uW14OI5rrrqqquuuuqq/1560MMpH/iJlLd+D9R1XPV/R/7tnzG8++vCaomWjyjmqquuuuo/w3U3Mfuh30E3Poir/nfx3bezfufXhLtv56qrrrrqqquu+h/kupuo7//xlHd8PzRfcNX/De3Xfprxw98BLR9RzFVXXXXVf7TT19L/4G8TD34EV/3v4gvnGN71tfDTnshVV1111VVXXfU/1OlrqR/4iZR3+SA0m3PV/37Td34VWj6imKuuuuqq/0gnTtF//28Sj3gxrvrfxYcHDO/5+vjv/pyrrrrqqquuuup/gTPXUT/okynv/AGon3HV/2po+Yhirrrqqqv+o2zt0H/frxMv9rJc9b+LhzXj+785+ce/xVVXXXXVVVdd9b/MdTfRfcIXU97inbnqfy2Cq6666qr/KBub9N/xC8SLvSxX/e/i1hg/5t3IP/4trrrqqquuuuqq/4XuuYPx496d9Tu+OvnXf8JV/ysRXHXVVVf9R+hndN/808TLvApX/e8zffoHkb/201x11VVXXXXVVf+7+a//mOEdX43h494D33MHV/2vQnDVVVdd9e/VdXTf8OOUV34drvrfZ/zST6L9xHdz1VVXXXXVVVf935E/90Os3/AxjF/z2fjokKv+VyC46qqrrvr3iKD7yh+gvNabcNX/PtO3fint27+Cq6666qqrrrrq/6DVkvYNn8/6DR9N+6Uf56r/8dDyEcVcddVVV/1bSHRf9j2Ut3xXrvrfZ/rR72D69A/iqquuuuqqq676/yHe8G3oPuvr0JnruOp/JIKrrrrqqn+j+rnfRHnLd+Wq/33aL/0402d+CFddddVVV1111f8f+as/xfpNXpz2k9/LVf8joeUjirnqqquu+leqn/ZV1Pf6CK7636f9+s8wfsQ7QmtcddVVV1111VX/P8VrvBHd538zuv5mrvofg+Cqq6666l+pfuznU9/rI7jqf5/227/I+FHvDK1x1VVXXXXVVVf9/5W/9yus3/QlmH7oW7DNVf8joOUjirnqqquuehGVD/kUuo/5PK7636f9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yVUvmM/eQz7p7/GT/wE/6e/JJ/8DfvI/wNEhV131r4CWjyjmqquuuuqqq6666qqrrrrqBTlxGj3s0cRDHoke+mj00Eeihz4a3fQQVAr/1/nieXzPHfie2/Hdd+B77sB3347vfAZ+yuNg9wJXXfUfAC0fUcxVV1111VVXXXXVVVddddW/VtehGx4E19yArr0BXXsDuvZGdM0N6Nob4Job0LU3oH7G/0Qe1nCwh++7G99zB777DnzP7fieO+DuO/Ddt+N77oD1iquu+i+Alo8o5qqrrrrqqquuuuqqq6666j/L8ZPomhtg5zja3IbNLbS5DVs7sLmNNrdhawdtbsPmFswXqBRQQASUAgiyQSZk4myQCU5oDVZLONjHB3twsIcP9uBgDx/swcE+PtyDgz042MMHe3CwB+PIVVf9D4KWjyjmqquuuuqqq6666qqrrrrqqquu+u9E5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u/GPwJuyl5RKQjeDwAAAABJRU5ErkJggg==" + } + } + ] +} diff --git a/libs/chonky/src/lib.rs b/libs/chonky/src/lib.rs index 68c7d624a0f..721eae17920 100644 --- a/libs/chonky/src/lib.rs +++ b/libs/chonky/src/lib.rs @@ -2,12 +2,14 @@ extern crate alloc; -#[cfg(not(feature = "static"))] use alloc::borrow::Cow; +use std::path::PathBuf; #[cfg(not(feature = "static"))] use std::{env, path::Path}; use error_stack::{Report, ResultExt as _}; +use image::DynamicImage; +use pdf_segmentation::ExtractedTable; use pdfium_render::prelude::Pdfium; use thiserror::Error; @@ -18,11 +20,21 @@ pub enum ChonkyError { #[error("pdfium error")] Pdfium, #[error("write error to system")] - Write, + ImageError, #[error("Issues with CLI input")] Arguments, + #[error("Issues with Google's Vertex API call")] + VertexAPI, + #[error("Issues with HuggingFace Inference Serverless API")] + HuggingFaceAPI, + #[error("Problem Storing Embedding Information")] + Embedding, } +mod embedding; + +pub use embedding::{hugging_face_api, multi_modal_embedding}; + /// Attempts to link to the `PDFium` library. /// /// ## Loading strategy @@ -58,14 +70,123 @@ pub fn link_pdfium() -> Result> { } } +#[derive(Debug, Clone)] +pub struct DocumentEmbeddings { + // Embeddings for structural chunks (page screenshots) + pub structural_embeddings: Vec, + pub content_embeddings: Vec, +} + +#[derive(Debug, Clone)] +pub struct PageContentEmbedding { + _image: PageImageObjectsEmbeddings, + _table: PageTableObjectsEmbeddings, + _text: TextEmbedding, +} + +#[derive(Debug, Clone)] +pub struct ImageEmbedding { + pub embedding: Embedding, + _image: DynamicImage, +} + +#[derive(Debug, Clone)] +pub struct TableEmbedding { + pub embedding: Embedding, + _table: ExtractedTable, +} +#[derive(Debug, Clone)] +pub struct TextEmbedding { + _embedding: Embedding, + _text: String, +} + +#[derive(Debug, Clone)] +pub struct Embedding { + _model_used: Cow<'static, str>, //model name reveals image or text embedding model + pub embedding_vector: Vec, //the actual embedding vector +} + +#[derive(Debug, Clone)] +pub struct StructuralMetadata { + _page_number: usize, //discuss additional metadata useful here + _image_path: PathBuf, //location of pdf image for embedding +} + +#[derive(Debug, Clone)] +pub struct StructuralEmbedding { + _metadata: StructuralMetadata, + _embedding: Embedding, +} + +#[derive(Debug, Clone)] +pub struct PageImageObjects { + pub page_image_objects: Vec, +} + +impl PageImageObjects { + pub fn iter(&self) -> impl Iterator + Send { + self.page_image_objects.iter() + } + + pub fn owned_iter(self) -> impl Iterator + Send { + self.page_image_objects.into_iter() + } +} + +#[derive(Debug, Clone)] +pub struct PageImageObjectsEmbeddings { + _embeddings: Box<[ImageEmbedding]>, +} + +#[derive(Debug, Clone)] +pub struct PageTableObjects { + pub page_table_objects: Vec, +} + +#[derive(Debug, Clone)] +pub struct PageTableObjectsEmbeddings { + _embeddings: Vec, +} + +#[derive(Debug, Clone)] +pub struct PageScreenshot { + _page_image_objects: Vec, +} + +#[must_use] +pub const fn create_document_embedding() -> DocumentEmbeddings { + DocumentEmbeddings { + structural_embeddings: Vec::new(), + content_embeddings: Vec::new(), + } +} + pub mod pdf_segmentation { + + use std::path::PathBuf; + use error_stack::{Report, ResultExt as _}; + use futures::future::try_join_all; use image::{DynamicImage, GrayImage, RgbaImage}; use pdfium_render::prelude::{ - PdfBitmap, PdfBitmapFormat, PdfDocument, PdfPoints, PdfRenderConfig, Pdfium, + PdfBitmap, PdfBitmapFormat, PdfDocument, PdfPageObjectCommon as _, + PdfPageObjectsCommon as _, PdfPoints, PdfRect, PdfRenderConfig, Pdfium, + }; + + use crate::{ + ChonkyError, DocumentEmbeddings, PageContentEmbedding, PageImageObjects, PageTableObjects, + embedding::{ + hugging_face_api::make_table_recognition_request, + multi_modal_embedding::{embed_pdf_object_images, embed_tables, embed_text}, + }, }; - use crate::ChonkyError; + #[derive(Debug, Clone)] + pub struct ExtractedTable { + bounding_box: PdfRect, //model name reveals image or text embedding model + pub image: DynamicImage, //the actual embedding vector + } /// Function to read the pdf /// @@ -75,21 +196,251 @@ pub mod pdf_segmentation { /// permission to read it. pub fn load_pdf<'a>( pdfium: &'a Pdfium, - file_path: &str, + file_path: &PathBuf, ) -> Result, Report> { pdfium - .load_pdf_from_file(file_path, None) + .load_pdf_from_file(&file_path, None) .map_err(|err| Report::new(err).change_context(ChonkyError::Pdfium)) } - // /// TODO: This function returns the extracted text that is segmented in proper reading order - // and /// grouped by boundaries such as newline spacing and other layout information, - // segments can /// contain texts with different formatting (such as a sentence with a - // **bold** inside) /// - // /// #Errors - // /// - // /// TBD - //pub fn extract_text(pdf: &PdfDocument) -> () {} + #[expect( + clippy::future_not_send, + reason = "Will Implement Safe Data Sending of Pdfium Documents in future" + )] + async fn extract_tables( + pdf: &PdfDocument<'_>, + images: &[PathBuf], + config: &PdfRenderConfig, + ) -> Result, Report> { + let table_predictions_list = try_join_all( + images + .iter() + .map(|image_path| make_table_recognition_request(image_path, false)), + ) + .await?; + + let mut pdf_table_bounds = Vec::new(); + + //task::spawn_blocking(move || { + for (index, page) in pdf.pages().iter().enumerate() { + let table_predictions = &table_predictions_list[index]; + + let mut page_table_bounds: Vec = Vec::new(); + //convert the pixels back to pdf points + for table in table_predictions { + if table.score < 0.95 { + continue; + } + let bbox = &table.bounding_box; + + // Convert to i32 safely discarding decimals and rounding down + // normally bbox should already be an integer that needs to be casted + let xmin: i32 = num_traits::cast(bbox.xmin).ok_or(ChonkyError::Pdfium)?; + let ymin: i32 = num_traits::cast(bbox.ymin).ok_or(ChonkyError::Pdfium)?; + let xmax: i32 = num_traits::cast(bbox.xmax).ok_or(ChonkyError::Pdfium)?; + let ymax: i32 = num_traits::cast(bbox.ymax).ok_or(ChonkyError::Pdfium)?; + + // Calculate bottom-left and top-right + let bottom_left = page + .pixels_to_points(xmin, ymax, config) + .change_context(ChonkyError::Pdfium)?; + let top_right = page + .pixels_to_points(xmax, ymin, config) + .change_context(ChonkyError::Pdfium)?; + + // Render PDF with cropped info and save as Dynamic Image + let image_bitmap = page + .render_with_config(&create_config().clip(xmin, ymin, xmax, ymax)) + .change_context(ChonkyError::Pdfium)?; + + let width = u32::try_from(xmax - xmin).change_context(ChonkyError::Pdfium)?; + let height = u32::try_from(ymax - ymin).change_context(ChonkyError::Pdfium)?; + let xmin = u32::try_from(xmin).change_context(ChonkyError::Pdfium)?; + let ymin = u32::try_from(ymin).change_context(ChonkyError::Pdfium)?; + + // Crop image using safe dimensions + let image = image_bitmap.as_image().crop(xmin, ymin, width, height); + + //add the proper table bound for checking extracted text + let extracted_table = ExtractedTable { + bounding_box: PdfRect::new( + bottom_left.1, + bottom_left.0, + top_right.1, + top_right.0, + ), + image, + }; + page_table_bounds.push(extracted_table); + //later step to extract table textual information + } + pdf_table_bounds.push(PageTableObjects { + page_table_objects: page_table_bounds, + }); + } + Ok(pdf_table_bounds) + } + + // TODO: This function will returns the extracted text that is segmented in proper reading order + // and grouped by boundaries such as newline spacing and other layout information, + // segments can contain texts with different formatting (such as a sentence with a + // **bold** inside) + /// + /// For now, this function just solely extracts all text that is in a singular page for + /// extraction + /// + /// # Errors + /// + /// [`ChonkyError::Pdfium`] if conversion from pixels to pdf points fails + #[must_use] + pub fn extract_text( + pdf: &PdfDocument, + pdf_table_bounds: &[PageTableObjects], + ) -> Vec> { + let mut pages_text_extract: Vec> = Vec::new(); + //process page by page + for (index, page) in pdf.pages().iter().enumerate() { + //we know index of images and pdf must be the same + + //check if text bounding boxes overlap with the pdf table bounds + let page_table_bounds = &pdf_table_bounds[index].page_table_objects; + + let page_text: Vec = page + .objects() + .iter() + .filter_map(|object| { + object.as_text_object().and_then(|text_object| { + page_table_bounds + .iter() + .all(|table_box| { + //silently ignore errors if not overlapping + !table_box + .bounding_box + .does_overlap(&text_object.bounds().unwrap_or(PdfRect::zero())) + }) + .then(|| text_object.text()) + }) + }) + .collect::>(); + + //let mut page_text_object = Vec::new(); + + // // Explicitly iterate over pdf_objects without using an iterator chain + // for object in page.objects().iter() { + // if let Some(text_object) = object.as_text_object() { + // if pdf_table_bounds.iter().all(|table_box| { + // !table_box.does_overlap(&text_object.bounds().unwrap_or(PdfRect::zero())) + // }) { + // // Move the text_object directly into the vector + // page_text_object.push(text_object); + // } + // } + // } + + //let page_text = group_similar_segments(page_text_object)?; + + pages_text_extract.push(page_text); + } + pages_text_extract + } + + fn extract_images(pdf: &PdfDocument) -> Vec { + let mut pdf_image_extract = Vec::new(); + + for page in pdf.pages().iter() { + let mut page_image_extract = Vec::new(); + + page.objects().iter().for_each(|object| { + if let Some(image) = object.as_image_object() { + if let Ok(image) = image.get_raw_image() { + page_image_extract.push(image); + } + } + }); + // println!( + // "There are {} images on page {}", + // page_image_extract.len(), + // _index + // ); + pdf_image_extract.push(PageImageObjects { + page_image_objects: page_image_extract, + }); + } + pdf_image_extract + } + + /// This function takes in the pdf and the paths of the pdf pages as images and modfies the + /// document embeddings to include the embeddings of tables, images, and text inside the pdf + /// + /// # Errors + /// + /// [`ChonkyError::Pdfium`] if pdf rendering of tables fails + /// [`ChonkyError::VertexAPI`] if the Multimodal Embedding Model fails + /// [`ChonkyError::HuggingFaceAPI`] if there are issues parsing the table + #[expect( + clippy::future_not_send, + reason = "Will Implement Safe Data Sending of Pdfium Documents in future" + )] + pub async fn embed_pdf<'a>( + pdf: &PdfDocument<'_>, + images: &[PathBuf], + document_embeddings: &'a mut DocumentEmbeddings, + ) -> Result<&'a mut DocumentEmbeddings, Report> { + let project_id = + std::env::var("GOOGLE_PROJECT_ID").change_context(ChonkyError::VertexAPI)?; + + let pdf_table_bounds = extract_tables(pdf, images, &create_config()).await?; + + let pdf_text_extract = extract_text(pdf, &pdf_table_bounds); + + let pdf_image_extract = extract_images(pdf); + + let image_embeddings = embed_pdf_object_images(pdf_image_extract, &project_id).await?; + + let table_embeddings = embed_tables(pdf_table_bounds, &project_id).await?; + + let pdf_text_embeddings = embed_text( + &pdf_text_extract + .iter() + .map(|text| &**text) + .collect::>(), + &project_id, + ) + .await?; + + //TODO: implement in a way to prevent so much unnecessary cloning + + //turn image embedding vector into iterator + let mut image_embeddings = image_embeddings.into_iter(); + + let mut table_embeddings = table_embeddings.into_iter(); + + let mut text_embeddings = pdf_text_embeddings.into_iter(); + + for _ in 0..pdf.pages().len() { + //create Page content embedding now + let page_content_embedding = PageContentEmbedding { + _image: image_embeddings + .next() + .ok_or(ChonkyError::VertexAPI) + .attach_printable("Missing Page Image Object Embeddings")?, + _table: table_embeddings + .next() + .ok_or(ChonkyError::VertexAPI) + .attach_printable("Missing Page Table Object Embeddings")?, + _text: text_embeddings + .next() + .ok_or(ChonkyError::VertexAPI) + .attach_printable("Missing Text Embeddings")?, + }; + + document_embeddings + .content_embeddings + .push(page_content_embedding); + } + + Ok(document_embeddings) + } // /// TODO: Given a list of segments of a PDF this function reads the segments via the bounding // /// box order, with the naive approach of top→bottom (and if same top then left→right) and @@ -220,10 +571,143 @@ pub mod pdf_segmentation { _ => return Err(Report::new(ChonkyError::Pdfium)), }) } + + fn create_config() -> PdfRenderConfig { + //may adjust resolution depending on need + let resolution_width = 1000; + + PdfRenderConfig::new().set_target_width(resolution_width) + } + + #[cfg(test)] + mod tests { + + use insta::{assert_binary_snapshot, assert_snapshot}; + + use super::*; + use crate::{create_document_embedding, link_pdfium}; + + #[tokio::test] + async fn pdf_table_extraction() -> Result<(), Report> { + let pdfium = link_pdfium()?; + let file_path = PathBuf::from("./tests/docs/table-testing.pdf"); + + let pdf = load_pdf(&pdfium, &file_path).change_context(ChonkyError::Pdfium)?; + + let images = vec![PathBuf::from("./tests/docs/table-testing.png")]; + + let table_info = extract_tables(&pdf, &images, &create_config()).await?; + //just take first vector + + let table = table_info[0].page_table_objects[0].clone(); + + assert_snapshot!("extracted_table.txt", format!("{:#?}", table.bounding_box)); + + let mut buffer = Vec::new(); + let encoder = image::codecs::bmp::BmpEncoder::new(&mut buffer); + + table + .image + .write_with_encoder(encoder) + .expect("image should be able to be encoded into a bitmap"); + assert_binary_snapshot!("extracted_table.bmp", buffer); + + Ok(()) + } + + #[tokio::test] + async fn pdf_text_extraction() -> Result<(), Report> { + let pdfium = link_pdfium()?; + let file_path = PathBuf::from("./tests/docs/table-testing.pdf"); + + let pdf = load_pdf(&pdfium, &file_path).change_context(ChonkyError::Pdfium)?; + + let images = vec![PathBuf::from("./tests/docs/table-testing.png")]; + + let table_info = extract_tables(&pdf, &images, &create_config()).await?; + //just take first vector + + let text_info = extract_text(&pdf, &table_info); + //just take first vector + + let text = text_info[0].join(""); + + assert_snapshot!("extracted_text.txt", text); + + Ok(()) + } + + #[test] + fn pdf_image_extract() -> Result<(), Report> { + let pdfium = link_pdfium()?; + + let file_path = PathBuf::from("./tests/docs/test-doc.pdf"); + + let pdf = load_pdf(&pdfium, &file_path).change_context(ChonkyError::Pdfium)?; + + let images = extract_images(&pdf); + + let mut buffer = Vec::new(); + let encoder = image::codecs::bmp::BmpEncoder::new(&mut buffer); + + //the third page has an image to verify + images[2].page_image_objects[0] + .write_with_encoder(encoder) + .expect("image should be able to be encoded into a bitmap"); + assert_binary_snapshot!("extracted_image.bmp", buffer); + + Ok(()) + } + + #[tokio::test] + async fn content_embeddings() -> Result<(), Report> { + let pdfium = link_pdfium()?; + + let file_path = PathBuf::from("./tests/docs/table-testing.pdf"); + + let pdf = load_pdf(&pdfium, &file_path).change_context(ChonkyError::Pdfium)?; + + let images = vec![PathBuf::from("./tests/docs/table-testing.png")]; + + let mut document_embeddings = create_document_embedding(); + let document_embeddings = embed_pdf(&pdf, &images, &mut document_embeddings).await?; + + //cannot use binary snapshot since embeddings vary + //check vector length since we individually check embeddings in other tests + + if document_embeddings.content_embeddings.len() != 1 { + return Err(Report::new(ChonkyError::Pdfium).attach_printable(format!( + "Expected there to be {} pages of content embeddings but found {}", + 1, + document_embeddings.content_embeddings.len() + ))); + } + + // if !document_embeddings.content_embeddings[0]._image.is_empty() { + // return Err(Report::new(ChonkyError::Pdfium).attach_printable(format!( + // "Expected there to be {} images but found {}", + // 0, + // document_embeddings.content_embeddings.len() + // ))); + // } + + // if document_embeddings.content_embeddings[0]._table.len() != 1 { + // return Err(Report::new(ChonkyError::Pdfium).attach_printable(format!( + // "Expected there to be {} tables but found {}", + // 1, + // document_embeddings.content_embeddings.len() + // ))); + // } + + Ok(()) + } + } } #[cfg(test)] mod tests { + use std::path::PathBuf; + use error_stack::{Report, ResultExt as _}; use insta::assert_binary_snapshot; @@ -233,9 +717,9 @@ mod tests { fn pdf_load_success() -> Result<(), Report> { let pdfium = link_pdfium()?; - let test_pdf_string = "tests/docs/test-doc.pdf"; + let test_pdf_string = PathBuf::from("tests/docs/test-doc.pdf"); - let _pdf = pdf_segmentation::load_pdf(&pdfium, test_pdf_string) + let _pdf = pdf_segmentation::load_pdf(&pdfium, &test_pdf_string) .change_context(ChonkyError::Pdfium)?; Ok(()) @@ -245,10 +729,10 @@ mod tests { fn pdf_load_failure() -> Result<(), Report> { let pdfium = link_pdfium()?; - let test_pdf_string = "tests/docs/invalid.pdf"; + let test_pdf_string = PathBuf::from("tests/docs/invalid.pdf"); // Should return an error when loading an invalid PDF - let result = pdf_segmentation::load_pdf(&pdfium, test_pdf_string) + let result = pdf_segmentation::load_pdf(&pdfium, &test_pdf_string) .change_context(ChonkyError::Pdfium); if result.is_err() { @@ -264,9 +748,9 @@ mod tests { fn pdf_image_conversion() -> Result<(), Report> { let pdfium = link_pdfium()?; - let test_pdf_string = "tests/docs/test-doc.pdf"; + let test_pdf_string = PathBuf::from("tests/docs/test-doc.pdf"); - let pdf = pdf_segmentation::load_pdf(&pdfium, test_pdf_string) + let pdf = pdf_segmentation::load_pdf(&pdfium, &test_pdf_string) .change_context(ChonkyError::Pdfium)?; //number of pages of pdf diff --git a/libs/chonky/src/main.rs b/libs/chonky/src/main.rs index 36a4fc90e35..34a87cb0791 100644 --- a/libs/chonky/src/main.rs +++ b/libs/chonky/src/main.rs @@ -1,33 +1,74 @@ -use std::env; +use std::path::PathBuf; -use chonky::{ChonkyError, pdf_segmentation}; -use error_stack::{Report, ResultExt as _, ensure}; +use chonky::{ + ChonkyError, PageImageObjects, create_document_embedding, + multi_modal_embedding::{add_structural_embedding, embed_screenshots}, + pdf_segmentation::{self, embed_pdf}, +}; +use clap::Parser; +use error_stack::{Report, ResultExt as _}; -fn main() -> Result<(), Report> { - // read file path arguments - // TODO: implement with clap - let args: Vec = env::args().collect(); +#[derive(Parser)] +struct CliArgs { + /// Path to the PDF file + pdf_path: PathBuf, +} - ensure!(args.len() > 1, ChonkyError::Arguments); +#[tokio::main] +async fn main() -> Result<(), Report> { + // read file path arguments + let args = CliArgs::parse(); let pdfium = chonky::link_pdfium()?; - let pdf = pdf_segmentation::load_pdf(&pdfium, &args[1]).change_context(ChonkyError::Pdfium)?; + let pdf = + pdf_segmentation::load_pdf(&pdfium, &args.pdf_path).change_context(ChonkyError::Pdfium)?; let preprocessed_pdf = pdf_segmentation::pdf_to_images(&pdf).change_context(ChonkyError::Pdfium)?; - //for now we will print all these images to a folder - // this will be a seperate function in the future once knowledge about error-stack increases let output_folder = "./out"; + let mut document_embeddings = create_document_embedding(); + + let mut images = Vec::new(); + + let project_id = std::env::var("GOOGLE_PROJECT_ID").change_context(ChonkyError::VertexAPI)?; + for (index, image) in preprocessed_pdf.iter().enumerate() { // Generate a unique filename for each page image let file_path = format!("{}/page_{}.png", output_folder, index + 1); // Save the image as a PNG file - image.save(&file_path).change_context(ChonkyError::Write)?; + image + .save(&file_path) + .change_context(ChonkyError::ImageError)?; + + images.push(PathBuf::from(file_path)); } + let doc_screenshots = embed_screenshots( + PageImageObjects { + page_image_objects: preprocessed_pdf, + } + .owned_iter(), + &project_id, + ) + .await?; + + for (index, screenshot) in doc_screenshots.into_iter().enumerate() { + add_structural_embedding( + &mut document_embeddings, + index + 1, + PathBuf::from(format!("{}/page_{}.png", output_folder, index + 1)), + screenshot.embedding_vector, + ); + } + + embed_pdf(&pdf, &images, &mut document_embeddings) + .await + .change_context(ChonkyError::Pdfium)?; + + //dbg!("{:?}", document_embeddings); Ok(()) } diff --git a/libs/chonky/src/snapshots/chonky__embedding__multi_modal_embedding__tests__create_embedding_data.snap b/libs/chonky/src/snapshots/chonky__embedding__multi_modal_embedding__tests__create_embedding_data.snap new file mode 100644 index 00000000000..6fea1424e93 --- /dev/null +++ b/libs/chonky/src/snapshots/chonky__embedding__multi_modal_embedding__tests__create_embedding_data.snap @@ -0,0 +1,6 @@ +--- +source: libs/chonky/src/embedding.rs +expression: "format!(\"{:?}\", document_embeddings)" +snapshot_kind: text +--- +DocumentEmbeddings { structural_embeddings: [StructuralEmbedding { _metadata: StructuralMetadata { _page_number: 1, _image_path: "test/path" }, _embedding: Embedding { _model_used: "VertexAPIMultiModalEmbeddings", _embedding_vector: [0.1, 0.2, 0.3] } }], content_embeddings: [] } diff --git a/libs/chonky/src/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap b/libs/chonky/src/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap new file mode 100644 index 00000000000..d630166b429 --- /dev/null +++ b/libs/chonky/src/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap @@ -0,0 +1,6 @@ +--- +source: libs/chonky/src/embedding.rs +expression: "base64_json(\"./tests/docs/page_1.png\")?.into()" +extension: json +snapshot_kind: binary +--- diff --git a/libs/chonky/src/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap.json b/libs/chonky/src/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap.json new file mode 100644 index 00000000000..2647bb9e012 --- /dev/null +++ b/libs/chonky/src/snapshots/chonky__embedding__multi_modal_embedding__tests__page_1.snap.json @@ -0,0 +1,9 @@ +{ + "instances": [ + { + "image": { + "bytesBase64Encoded": "iVBORw0KGgoAAAANSUhEUgAAA+gAAAUXCAYAAADKt0oSAAD4NUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8uH1HMVVddddVVV1111VVXXXXVVVdd9d+JylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXfX/Vz+DU9fwHO67C1rjf5WtHdg+xrNcugBHh/yPtbkFswXPsr8L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HCd/9acY3vW1yb/6I14Y715g/OJPYHzfN4WjQ/6r+a//mOHtX4X8+7/ghfG5exk+9t1p3/RF/Gt5HBg/5l0Zv+jj8e4FXpj8uz9neOfXoP3Qt/Av2ttlfJ83YfzsD8f33Mm/xPfdzfBBb8306R8ErfHC+PanMbz769F+/1dxazy3eNN3gK0drnqRoeUjirnqqquuuuqqq6666qqr/u84fS3aPsb9fLgP993Nf4gbbkGzOffzxXOwewGA+ZMmHmj1yMr99PKvzuwHf5v7tV/5CcaPeCfuF6/4WsSrvwHxcq8GJ07BOOIn/T35p79D+/kfhuURL9SxE+jYSe7n8/fB4T4vCj3mpXiW9Qo/7Ym8IHr0S1Le7J2IV3gN2DkO44if8nja7/0y+es/Cwd7XLaxia65gfv53L1wsMezXHsjOn6S+/mpj4dpAoCtHeL135J4pdchHv0SMN+A3fPk3/wp+Zs/T/7p7/BvUgrxem9JvMJrEi/xcnD6OsCwt0v+2e/Rfv1n8V/8PmTyr3bqGsrrvQWcvhYUcLhP/unv4sf9FVe9yNDyEcVcddVVV1111VVXXXXVVVf9J9LLvzqzH/xt7td+5ScZP+Idueqqq56FylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddVVV131343KVVddddVVV1111VVXXXXVVVdd9d+NylVXXXXVVVddddVVV1111VVXXfXfjcpVV1111VVXXXXVVVddddV/Mj/5Hxg++G24n++7i6uuuuo5oOUjirnqqquuuuqqq6666qqrrrrqqqv+O1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq6666qqr/rtRueqqq6666qqrrrrqqquuuuqqq/67Ubnqqquuuuqqq6666qqrrrrqqqv+u1G56qqrrrrqqquuuuqqq676rxYBpUAUKAWiQASUAgqwwQmZkAlOyITWYFhz1VX/B1G56qqrrrpf18HWDtrchq0d2NxGWzuwuYW2dmBzGza2UO0gAiIgAhRQCkhc1hpkQjbIhEzIhqcRDvfhYA8f7MP+JXywBwd7+GAPDvZgecRVV1111VVXXfW/wOYWHDuJjp1Ex0/CsZPo+Ak4dhIdOwnHT6JjJ9Cxk3D8JDp2Eo6dgH6GIvj3cGtwdACH+/hgHw738eE+HO7D4QE+3IeDPXy4D4f7cLiPD/bx+fvg3jvxvXfBOHDVVf/DoOUjirnqqqv+b5LgzHXoupvQdTeh625E196ErrsJXXs9bB+HrR20uQ1bO6jv+e/m1uBwHw728MEeHOzhgz24cA7ffTu++3Z89+347tvx3bfD/iWuuuqqq6666qr/QKWgmx6CHvwI9OBHoIc8El13Izp+Co6dRMdPws4J1HX8b+aL5/G9d+J778T33gX33onvvRPfexe+9058751w8TxXXfVfCC0fUcxVV131v1M/Qw97DHrQw9H1N6HrbkLX3YSuuxFddxOcuR7V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wVVXXXXVVVf9f+Kzd3PV80Vw1VX/Wufvo33rlzK8/iMZ3udNaL/yk3iauJ//5k9gb5errrrq/yY/4W+46j+Odk5w1VVXXXXVVf+v7F7Aw5qrngfBVVf9O+Qf/BrjR7wj69d6MONXfQa+8xm03/1lrrrqqv/Dlkf43L1c9R/k2HGuuuqqq6666v+ds/dw1fOgctVV/xHO3kP7pi+iffMXw2KDq6666v823/F0dPparvr3085xrrrqqquuuur/Gy8PEVc9F4KrrvqPZMPRIVddddX/bb796Vz1H2TnBFddddVVV131/840cdXzoHLVVVddddVV/0q+/elc9R9Dx05w1VVXXXXVVf/vTCNXPQ8qV1111VVXXfWv5NufxlX/QXZOcNVVV1111VX/70wTVz0Pgquuuuqqq676V/LtT+eq/xjqOlhscNVVV1111VX/r7SJq54HwVVXXXXVVVf9K/nu27nqP9DOCa666qqrrrrq/5U2cdXzILjqqquuuuqqfyXv73LVfxwdO8FVV1111VVX/b8ShaueB8FVV1111VVX/Wvt7WKbq/6D7Bznqquuuuqqq/5fqZWrngfBVVddddVVV/1rZcLhPlf9x9DWMa666qqrrrrq/5VSuep5EFx11VVXXXXVv8XeLlf9B6mVq6666qqrrvp/pRSueh4EV1111VVXXfVv4EsXueo/SBSuuuqqq6666v+VUrnqeVC56qqrrrrqqn8D713kqv8gJbjqqquuuuqq/1dK5arnQeWqq6666qqr/i2ODrjqP0gpXHXVVVddddX/Jzp2gqueB5Wrrrrqqquu+rdojav+g0Thqquuuuqqq/7fkODkGa56HlSuuuqqq6666t+iNa76D1IKV1111VVXXfX/xskzqBSueh5UrrrqqquuuurfIpOr/oNkctVVV1111VX/X+ia67nq+aJy1VVXXXXVVf8WIa76D9IaV1111VVXXfX/hU5fx1XPF5Wrrrrqqquu+reIwlX/QbJx1VVXXXXVVf9f6My1XPV8Ubnqqquuuuqqf4sIrvoP0pKrrrrqqquu+n/j9HVc9XxRueqqq6666qp/iwiu+g+Sjauuuuqqq676/0JnruOq54vKVVddddVVV/1bKLjqP0gmV1111VVXXfX/hU5fx1XPF5Wrrrrqqquu+reYL7jqP8jyiKuuuuqqq676/0JnruWq54vK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9X+T93YZ3unV8VOfwDOh5SOKueqqq676T6SHPZr+B34LnTzDVf+75N//BcN7vB4cHnDVVVddddVVV/3Xi9d4I8q7fyjxWm+CIrjq/5a841aGd3hVOH8fAFo+opirrrrqqv8kuvmh9D/42+jaG7jqf5d82hMZ3uW14OI5rrrqqquuuuqq/1560MMpH/iJlLd+D9R1XPV/R/7tnzG8++vCaomWjyjmqquuuuo/w3U3Mfuh30E3Poir/nfx3bezfufXhLtv56qrrrrqqquu+h/kupuo7//xlHd8PzRfcNX/De3Xfprxw98BLR9RzFVXXXXVf7TT19L/4G8TD34EV/3v4gvnGN71tfDTnshVV1111VVXXfU/1OlrqR/4iZR3+SA0m3PV/37Td34VWj6imKuuuuqq/0gnTtF//28Sj3gxrvrfxYcHDO/5+vjv/pyrrrrqqquuuup/gTPXUT/okynv/AGon3HV/2po+Yhirrrqqqv+o2zt0H/frxMv9rJc9b+LhzXj+785+ce/xVVXXXXVVVdd9b/MdTfRfcIXU97inbnqfy2Cq6666qr/KBub9N/xC8SLvSxX/e/i1hg/5t3IP/4trrrqqquuuuqq/4XuuYPx496d9Tu+OvnXf8JV/ysRXHXVVVf9R+hndN/808TLvApX/e8zffoHkb/201x11VVXXXXVVf+7+a//mOEdX43h494D33MHV/2vQnDVVVdd9e/VdXTf8OOUV34drvrfZ/zST6L9xHdz1VVXXXXVVVf935E/90Os3/AxjF/z2fjokKv+VyC46qqrrvr3iKD7yh+gvNabcNX/PtO3fint27+Cq6666qqrrrrq/6DVkvYNn8/6DR9N+6Uf56r/8dDyEcVcddVVV/1bSHRf9j2Ut3xXrvrfZ/rR72D69A/iqquuuuqqq676/yHe8G3oPuvr0JnruOp/JIKrrrrqqn+j+rnfRHnLd+Wq/33aL/0402d+CFddddVVV1111f8f+as/xfpNXpz2k9/LVf8joeUjirnqqquu+leqn/ZV1Pf6CK7636f9+s8wfsQ7QmtcddVVV1111VX/P8VrvBHd538zuv5mrvofg+Cqq6666l+pfuznU9/rI7jqf5/227/I+FHvDK1x1VVXXXXVVVf9/5W/9yus3/QlmH7oW7DNVf8joOUjirnqqquuehGVD/kUuo/5PK7636f9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yVUvmM/eQz7p7/GT/wE/6e/JJ/8DfvI/wNEhV131r4CWjyjmqquuuuqqq6666qqrrrrqBTlxGj3s0cRDHoke+mj00Eeihz4a3fQQVAr/1/nieXzPHfie2/Hdd+B77sB3347vfAZ+yuNg9wJXXfUfAC0fUcxVV1111VVXXXXVVVddddW/VtehGx4E19yArr0BXXsDuvZGdM0N6Nob4Job0LU3oH7G/0Qe1nCwh++7G99zB777DnzP7fieO+DuO/Ddt+N77oD1iquu+i+Alo8o5qqrrrrqqquuuuqqq6666j/L8ZPomhtg5zja3IbNLbS5DVs7sLmNNrdhawdtbsPmFswXqBRQQASUAgiyQSZk4myQCU5oDVZLONjHB3twsIcP9uBgDx/swcE+PtyDgz042MMHe3CwB+PIVVf9D4KWjyjmqquuuuqqq6666qqrrrrqqquu+u9E5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u9G5aqrrrrqqquuuuqqq6666qqrrvrvRuWqq6666qqrrrrqqquuuuqqq67670blqquuuuqqq6666qqrrrrqqquu+u/GPwJuyl5RKQjeDwAAAABJRU5ErkJggg==" + } + } + ] +} diff --git a/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_image.snap b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_image.snap new file mode 100644 index 00000000000..71131a21ad5 --- /dev/null +++ b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_image.snap @@ -0,0 +1,6 @@ +--- +source: libs/chonky/src/lib.rs +expression: buffer +extension: bmp +snapshot_kind: binary +--- diff --git a/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_image.snap.bmp b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_image.snap.bmp new file mode 100644 index 00000000000..d335c2d27af Binary files /dev/null and b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_image.snap.bmp differ diff --git a/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_table.snap b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_table.snap new file mode 100644 index 00000000000..71131a21ad5 --- /dev/null +++ b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_table.snap @@ -0,0 +1,6 @@ +--- +source: libs/chonky/src/lib.rs +expression: buffer +extension: bmp +snapshot_kind: binary +--- diff --git a/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_table.snap.bmp b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_table.snap.bmp new file mode 100644 index 00000000000..f065681d327 Binary files /dev/null and b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_table.snap.bmp differ diff --git a/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_table.txt.snap b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_table.txt.snap new file mode 100644 index 00000000000..da80acd6df6 --- /dev/null +++ b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_table.txt.snap @@ -0,0 +1,19 @@ +--- +source: libs/chonky/src/lib.rs +expression: "format!(\"{:#?}\", table.bounding_box)" +snapshot_kind: text +--- +PdfRect { + bottom: PdfPoints { + value: 599.20245, + }, + left: PdfPoints { + value: 114.444, + }, + top: PdfPoints { + value: 707.5363, + }, + right: PdfPoints { + value: 494.496, + }, +} diff --git a/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_text.txt.snap b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_text.txt.snap new file mode 100644 index 00000000000..899d112e4df --- /dev/null +++ b/libs/chonky/src/snapshots/chonky__pdf_segmentation__tests__extracted_text.txt.snap @@ -0,0 +1,6 @@ +--- +source: libs/chonky/src/lib.rs +expression: text +snapshot_kind: text +--- +Published as a conference paper at ICLR 2021Table 2: Comparison with state of the art on popular image classification benchmarks. We report mean and standard deviation of the accuracies, averaged over three fine-tuning runs. VisionTransformer models pre-trained on the JFT-300M dataset outperform ResNet-based baselines on alldatasets, while taking substantially less computational resources to pre-train. ViT pre-trained on thesmaller public ImageNet-21k dataset performs well too. ∗Slightly improved 88.5% result reportedin Touvron et al. (2020).Figure 2: Breakdown of VTAB performance in Natural, Specialized, and Structured task groups.model still took substantially less compute to pre-train than prior state of the art. However, we notethat pre-training efficiency may be affected not only by the architecture choice, but also other parameters, such as training schedule, optimizer, weight decay, etc. We provide a controlled study ofperformance vs. compute for different architectures in Section 4.4. Finally, the ViT-L/16 modelpre-trained on the public ImageNet-21k dataset performs well on most datasets too, while takingfewer resources to pre-train: it could be trained using a standard cloud TPUv3 with 8 cores in approximately 30 days.Figure 2 decomposes the VTAB tasks into their respective groups, and compares to previous SOTAmethods on this benchmark: BiT, VIVI – a ResNet co-trained on ImageNet and Youtube (Tschannenet al., 2020), and S4L – supervised plus semi-supervised learning on ImageNet (Zhai et al., 2019a).ViT-H/14 outperforms BiT-R152x4, and other methods, on the Natural and Structured tasks. On theSpecialized the performance of the top two models is similar.4.3 PRE-TRAINING DATA REQUIREMENTSThe Vision Transformer performs well when pre-trained on a large JFT-300M dataset. With fewerinductive biases for vision than ResNets, how crucial is the dataset size? We perform two series ofexperiments.First, we pre-train ViT models on datasets of increasing size: ImageNet, ImageNet-21k, and JFT300M. To boost the performance on the smaller datasets, we optimize three basic regularizationparameters – weight decay, dropout, and label smoothing. Figure 3 shows the results after finetuning to ImageNet (results on other datasets are shown in Table 5)2. When pre-trained on thesmallest dataset, ImageNet, ViT-Large models underperform compared to ViT-Base models, despite(moderate) regularization. With ImageNet-21k pre-training, their performances are similar. Onlywith JFT-300M, do we see the full benefit of larger models. Figure 3 also shows the performance2Note that the ImageNet pre-trained models are also fine-tuned, but again on ImageNet. This is because theresolution increase during fine-tuning improves the performance.6 diff --git a/libs/chonky/src/snapshots/google_test_embedding_page_1.json b/libs/chonky/src/snapshots/google_test_embedding_page_1.json new file mode 100644 index 00000000000..69390f0e48f --- /dev/null +++ b/libs/chonky/src/snapshots/google_test_embedding_page_1.json @@ -0,0 +1,320 @@ +{ + "predictions": [ + { + "imageEmbedding": [ + 0.0200794507, 0.0727531835, -0.0118073784, 0.0387928113, -0.0394414, + -0.0300136041, -0.0219337083, -0.00991160143, -0.030519845, + 0.0123786097, -0.021295242, 0.0221384745, -0.0270472094, 0.0903312936, + 0.0154524082, -0.000384369749, 0.0252925958, 0.00456746621, + 0.00611424912, -0.0012179903, 0.0187779311, -0.00174762285, + -0.0181801617, 0.0262305401, -0.0571274757, 0.00924724154, 0.0137181552, + -0.0103711933, 0.00572055066, 0.0288961586, -0.0215082187, + 0.00884132553, -0.0453789383, 0.037997555, -0.0138459, 0.0132075641, + 0.0201186035, -0.0527875498, -0.00995267276, 0.0147078112, + -0.0221115947, 0.00832059421, 0.0275015477, 0.00621457072, + 0.00385735929, -0.00514552, 0.0146847777, -0.00225471938, 0.0159577653, + 0.020497337, 0.0210882984, -0.0559281409, -0.0474126, 0.0186752919, + 0.0413711779, 0.0125551531, 0.0163566768, 0.0218617842, -0.0186067801, + -0.00399777154, -0.0237672515, 0.0586896129, -0.0505793281, + 0.0269862246, -0.0394900553, -0.00704604341, -0.00641412614, + 0.0412042737, -0.0367216431, -0.0108876172, 0.0568020195, 0.0162842385, + 0.0428199247, -0.0643725172, -0.0145920916, -0.00681277411, + -0.0721000805, -0.00576667255, -0.00254351785, -0.00220164354, + -0.0315022543, 0.0184254907, -0.0248583704, -0.00186481106, + -0.0116791297, -0.0521355048, -0.0317877643, 0.0152493091, + -0.0225893296, 0.000711053, 0.052535478, -0.020968914, 0.0273086503, + -0.130931154, -0.0384063162, -0.0459572747, -0.0340217538, + -0.00853932183, 0.00115204754, -0.0370576233, -0.0040066191, + 0.0737694502, 0.00811708346, 0.0034538866, 0.0154484957, -0.0415875204, + -0.00176832976, -0.0338066854, 0.0320476592, 0.00990479, -0.0259598549, + -0.0479121432, 0.0498655736, 0.00224597054, -0.00801020581, + 0.0158196837, 0.0291785989, -0.00789069943, 0.0456606485, -0.0178818349, + -0.0255469233, -0.00855124835, -0.0190197397, -0.0160852969, + -0.0499708839, -0.0492461361, -0.033667028, 0.0127423918, 0.00614815066, + 0.0168152228, -0.00293308, 0.0116070369, -0.00815388, 0.00494600693, + -0.0230694097, 0.0106020151, 0.0130336611, -0.0237730704, 0.0265423208, + -0.0238192249, -0.012212473, -0.0344414562, -0.0206737071, 0.0158406664, + -0.0182467457, 0.0183475055, -0.0197015591, -0.0113007026, + -0.0251154322, 0.0173691679, 0.0640703663, 0.00715500675, 0.0205982272, + -0.0298886988, 0.00395428529, -0.00575352274, -0.013640644, + 0.0248482786, 0.0123412963, -0.005353841, 0.00364228967, -0.00875655189, + -0.0264218189, 0.0099193966, 0.00941459462, 0.00874940399, + -0.00510607287, -0.0110344728, 0.0333686545, 0.00498574227, + -0.025924135, -0.0164656304, -0.0309006684, 0.00477741798, 0.0232512821, + 0.0107584037, 0.00695351278, 0.00140760886, 0.00817680638, 0.0151648317, + -0.0205331054, 0.0044620824, -0.04447091, -0.0157380067, 0.0138357468, + -0.0327164344, -0.0245906841, -0.0126390522, -0.0224467516, + -0.0171758533, -0.0331096612, -0.0166997, -0.0407635756, 0.00811867882, + 0.0158348344, 0.00912262592, -0.0217924118, 0.0136932535, 0.00707948394, + 0.00422922336, 0.0257224627, -0.0258570835, -0.0245650876, 0.0451356508, + -0.0355140679, -0.043719206, -0.0363498405, 0.0185538642, 0.017455535, + 0.0299994443, 0.00553353643, -0.00326871336, 0.0315691829, 0.0273369644, + 0.00565885, -0.0324013978, -0.0209106989, -0.0310577918, -0.0171664581, + 0.0424342752, 0.0449889414, 0.00161450764, -0.0198931713, 0.00832869671, + 0.00532779377, 0.0322870873, -0.017043151, -0.0106690628, -0.0269485451, + -0.0175905079, 0.0195470955, -0.00310604, -0.0222307369, -0.0174242128, + -0.0307845175, 0.00168827921, -0.031500306, -0.0239113923, -0.0192108, + -0.0325956792, -0.0150319831, -0.0257696304, 0.00113791344, + -0.030418165, -0.0136852181, -0.015717864, 0.0193069149, -0.00971315708, + -0.0160518792, -0.0146469176, -0.0108018406, -0.0470841639, + -0.0177005846, 0.022074908, 0.0122866761, -0.0400707684, -0.0384144, + -0.0137234787, 0.00811227877, 0.00116491213, 0.0410275944, 0.0204653349, + 0.0113176471, 0.0141015202, -0.00605957303, 0.0236300658, -0.0310151596, + -0.0106318956, 0.00480514765, 0.0108092623, -0.0156595148, + -0.0247851368, 0.0105164591, -0.0349469073, 0.0190469306, 0.0353395343, + -0.0111926803, 0.0101663414, 0.0360605, 0.0972545594, 0.014762097, + 0.0114156995, -0.0358252, 0.0119302543, 0.00434173597, -0.00686672842, + -0.111650869, 0.0297358781, 0.0124527253, 0.0315340236, -0.0108470339, + -0.00753354095, 0.0262790527, 0.0107064806, 0.00686907861, + -0.0162234474, 0.00110694522, 0.00518654753, -0.0000906666828, + 0.00508946041, -0.0325438641, 0.00725959148, 0.0231076684, + -0.0252057761, -0.0318221152, 0.0461781472, -0.0342227146, + -0.0414473414, 0.0081457831, 0.0179869831, -0.0214805938, 0.00344512123, + -0.0046609235, -0.0058999653, 0.000664868334, -0.00133454986, + 0.0100209964, -0.00316612446, -0.0109791113, -0.00798935257, + 0.00603624061, -0.0176395047, -0.0480125211, -0.0101084644, 0.016962612, + -0.0506634861, 0.0319967754, -0.0224775262, 0.0568186156, -0.0311297588, + -0.0243818425, 0.00136393309, -0.0268775877, 0.0575457886, + -0.00334202754, 0.0347409807, 0.00663562864, -0.0132650752, + -0.0116647966, 0.00973663386, -0.0439043194, -0.000579640153, + -0.0283873137, -0.00699932454, -0.0269404538, 0.00126372522, + -0.00400872855, 0.00907869358, 0.0342610478, -0.0102650719, + 0.0820957348, -0.0303597, -0.0134116411, -0.034482237, -0.0149571048, + -0.00262419856, -0.0316910781, -0.029764723, 0.0118451687, 0.0190796014, + -0.00654050056, -0.0478619747, 0.016611293, -0.000785895914, + -0.00468459539, -0.0176734738, 0.042204231, 0.018262146, 0.00199765339, + 0.0167115424, 0.0115687139, -0.015229675, -0.0408321097, -0.0339653, + -0.0607094727, 0.00284047332, -0.00996038225, -0.0215976387, + -0.0418740734, -0.00398819242, 0.0308392812, 0.0199317653, 0.0292516984, + 0.0254485793, 0.0333487, -0.0625300631, -0.00138035021, 0.0130197247, + -0.0544026, 0.0235591736, 0.0124013275, -0.0512735136, 0.00969952531, + -0.0279471241, -0.0138655808, -0.0280096922, 0.0151817836, 0.015103111, + 0.0392551832, -0.0148400217, -0.0133888265, 0.00654882146, 0.0198969394, + -0.0122558288, 0.00300772558, -0.0121245747, -0.00260192, + -0.00621000398, -0.0162321422, -0.0331034549, 0.0115734022, + -0.011995743, 0.00505140657, 0.0281787869, -0.017650757, 0.0130830426, + -0.00644282857, 0.0207544174, 0.0203262512, -0.045325622, 0.0548431873, + 0.0383436903, -0.0601317696, -0.028722316, -0.0121619264, 0.00825800747, + -0.00212718709, 0.0229251813, -0.00699642068, -0.0110462159, + 0.012756004, 0.00503579946, -0.00153946411, 0.0363759026, 0.0106749842, + -0.0316457562, 0.0205926765, 0.0120015126, -0.0405500457, -0.0203145351, + 0.0113656595, 0.0277445298, 0.00869626459, 0.026911417, -0.0445918702, + -0.024621373, -0.0224110913, -0.00418887241, 0.0231625065, 0.0493302494, + -0.00569535699, 0.00979854, -0.014650939, -0.0275991037, 0.0200079642, + 0.0108461156, -0.043581713, -0.0291460082, 0.0358892046, 0.00485635828, + 0.0274123345, 0.0160650071, -0.0122359172, -0.0149006974, 0.00616822951, + -0.0417919904, 0.0121834539, 0.0175651293, 0.00778748933, 0.0336856097, + -0.00485151773, -0.00742530404, 0.0125049446, -0.00175703352, + -0.00328684459, -0.0472250693, 0.00665207626, -0.0289331973, + -0.0427108333, -0.0111280698, 0.00240747025, -0.0133775361, + -0.023427546, -0.0310953893, 0.00755348196, 0.0310655553, 0.028316088, + 0.0293623228, 0.0182108, 0.0180183928, -0.0339946859, -0.0267358422, + 0.0269593932, 0.0195297301, -0.00878691394, 0.0133624589, 0.0109142987, + 0.0166089647, -0.0119280117, 0.0583108626, -0.0103669874, -0.0104782879, + 0.0115101105, -0.00680659385, 0.0136693474, 0.00926319323, + 0.00801794603, 0.0260645393, 0.017171571, -0.0375067368, -0.0228026938, + -0.0293940138, -0.0236931127, -0.0238084495, 0.00200319546, + 0.0442974381, -0.013169311, 0.0128285708, -0.0129514886, -0.00792446826, + 0.0147309015, 0.0315737203, 0.0363607481, -0.00588304782, -0.0545949191, + -0.00206409884, 0.059211351, -0.0166553874, 0.0195842087, 0.00987605, + -0.0249910448, 0.00760935899, 0.000271902, 0.0246488731, 0.0166088976, + 0.0132115707, -0.0477463976, -0.0162763596, -0.0434952, 0.0251127947, + -0.0507098176, -0.0219555218, 0.00259535387, -0.0284369159, + -0.0450235046, -0.0710127726, 0.0145530608, 0.0227186382, 0.020867113, + 0.00730509125, -0.00655677402, 0.0128724491, 0.00504125655, + 0.0114655122, -0.0284118485, -0.016804561, -0.0256101936, 0.00504152, + -0.00687041692, -0.014085494, -0.0336099, 0.0147280674, 0.0157194976, + -0.0260903761, 0.0226975, -0.0251513254, 0.044349011, 0.0381043963, + -0.0144195817, 0.0192006826, -0.0340053774, -0.0214964915, 0.0159361586, + 0.0299740247, -0.0189940054, -0.0340108499, 0.0350475572, + -0.00914715789, -0.0176734459, -0.00708493963, 0.0122759026, + -0.0151949506, -0.00382534857, -0.00618836563, 0.0401804894, + -0.0134629216, -0.0147635052, -0.00738917757, 0.0271829963, + -0.0363052413, 0.0131927039, 0.0092771221, 0.00118602021, -0.015329076, + 0.0201174095, 0.00888214819, 0.00441296306, -0.0573665276, + 0.00310249696, -0.0218316335, -0.0347739309, 0.00115993957, + -0.0170522518, -0.00374893472, 0.0160980113, -0.0261501353, + -0.0206314344, -0.0068035177, -0.0270256139, -0.0745542943, + -0.016034374, -0.0155530497, -0.00825508125, -0.000142721925, + 0.00259413477, 0.00416106824, 0.000704567239, -0.000376670097, + -0.0309293047, -0.0575292259, -0.0354600437, -0.00709351525, + 0.0211882256, 0.00653045857, -0.00768915378, -0.0391729102, + -0.0168421064, 0.0123850126, -0.0341681391, -0.0116141131, + 0.00543836318, -0.0145025346, -0.00871191267, 0.0118249943, + 0.000419740187, -0.00384515431, -0.0205040649, 0.0224966928, + -0.0314637125, 0.00652385131, 0.0222869739, -0.00254431623, + -0.0393526591, 0.00730004907, -0.0084729027, 0.0194466114, 0.0179618187, + 0.0272312239, -0.0564603172, 0.0137194097, 0.00705754384, 0.0207322687, + 0.0164968222, -0.0154356137, 0.0152093843, 0.0108388243, -0.0133247636, + 0.0394562036, -0.021821104, -0.0151041215, -0.171952352, -0.00614952482, + -0.0340941846, 0.0536923483, 0.00969231129, 0.0108262282, + -0.00443865452, 0.0191259626, 0.00279664621, -0.00820668787, + 0.0170391258, 0.00745780533, -0.149354264, 0.00530553143, + -0.00120837928, -0.00200300175, 0.0286234878, 0.00840980373, + -0.0430695191, -0.00352477911, -0.0244644079, 0.00768952584, + -0.0326302312, -0.00710009923, 0.00182367628, 0.00812096428, + -0.0195258241, 0.0157954227, -0.00859312806, -0.0000694446207, + -0.033467494, 0.0504676551, 0.0199554935, 0.0153865237, -0.00534388237, + -0.0436336473, -0.0243477467, -0.0195666458, 0.0267537795, + -0.0155006759, 0.00818326417, -0.0246115271, -0.0671336725, + 0.0239930861, -0.0121858018, 0.0067680846, 0.00530457, 0.0149790281, + 0.0516754, -0.103635773, 0.000773494132, 0.00328713842, 0.00529097626, + -0.0426898487, 0.0130740916, -0.0503690317, -0.00970230624, + 0.000398179283, -0.0115862768, 0.00424743351, -0.0187369734, + 0.0207669809, -0.031930998, -0.00531767914, 0.00774476631, -0.0056497, + 0.00588185433, 0.00909983, -0.0780757, 0.0459470414, -0.00945746899, + -0.00806615315, -0.0252163708, -0.00608803751, -0.000875713304, + -0.0673136711, 0.0727208629, -0.000904412766, -0.0157243572, + -0.0476896651, -0.0217101611, -0.00720090186, 0.0177019984, + -0.0122179324, 0.0206996687, -0.0392113663, -0.0267971419, 0.0385536477, + -0.182963267, -0.0175348464, -0.0213053562, 0.00980788935, + -0.0177251883, 0.0190708712, 0.0246611517, -0.000561563356, + -0.00319550582, -0.00296727498, -0.0288800802, 0.00161457015, + -0.0145582119, 0.00574282929, 0.0574918352, -0.0132808425, + 0.00414043479, -0.000178870047, 0.000366607128, -0.0190121308, + 0.0364717953, 0.00417773239, 0.00618093414, 0.0137917623, 0.00261084293, + 0.0125148734, -0.0394730233, -0.0305693354, 0.0359926634, -0.0430680625, + -0.0522889867, 0.00756339869, -0.0102640381, -0.00577089889, + 0.0142202778, -0.0332152843, -0.0113711087, -0.000816995685, + 0.0197970551, 0.0124188038, -0.00106603687, 0.00703300629, 0.0389869772, + -0.00973942317, 0.0229291413, 0.00711151, -0.0147652971, -0.00428463379, + -0.0139042092, 0.00265471195, -0.00401064288, -0.00653148582, + 0.0019402022, -0.016071599, 0.0084224306, -0.0238962732, 0.0304724257, + 0.00559564, -0.0161983036, -0.0218582377, 0.0251766723, 0.0357669294, + -0.00312981335, 0.0377037525, -0.0205542725, -0.0037168772, + -0.0232195519, -0.0436959155, 0.0128921568, -0.0151355444, 0.0177663844, + 0.00788191427, 0.0476557501, -0.0267430786, 0.0890309215, 0.0121643217, + 0.0307274442, -0.0260096, -0.00612257328, -0.0317230448, -0.02372564, + -0.0210982207, -0.0061263, -0.0137099056, -0.0112341642, -0.0497641899, + -0.0200990848, -0.00596580934, 0.0423967764, 0.0267690271, + -0.0347951949, 0.0193116665, 0.0200607292, 0.0130544435, 0.010885613, + 0.0218913183, -0.00309879403, 0.0400102027, -0.0249893349, + -0.0165777802, -0.0180280041, 0.00276423269, -0.0211881232, + -0.0340437219, -0.0212098081, 0.00616344856, -0.00228470308, + 0.0106081581, 0.0107657546, 0.0292795654, -0.00721715298, + -0.00503393961, 0.0393781252, -0.0214204136, -0.00669409055, + 0.00130266522, 0.0127016548, 0.0249566492, -0.0289214849, 0.00130508328, + -0.0302580539, 0.0458944663, -0.000148194813, -0.0039588809, + -0.0184638631, 0.0277188309, -0.0030655968, 0.0245242305, -0.0242547449, + -0.0232463181, 0.0349476524, 0.00204681908, -0.00861816481, + 0.0124527477, 0.0212625768, -0.0246081632, 0.00972012337, + -0.00277936156, -0.0216701664, -0.026145665, -0.024488952, + -0.000709131302, -0.022229325, 0.0142183881, -0.00989455357, + 0.018014865, -0.0198584, 0.0164782647, 0.0173409097, 0.00976632535, + 0.0124288192, -0.0408389755, -0.0120075392, 0.00142397662, 0.0478935689, + -0.0444919802, 0.015540082, 0.0394340605, 0.0202748701, -0.000304086076, + 0.00662816036, -0.0190697648, 0.0140714515, -0.0264617298, + -0.000244835537, 0.0202282351, 0.0165772866, 0.0434172861, + -0.00351414969, -0.00927356724, 0.0465599447, 0.00514820963, + 0.0310756397, 0.0204647481, -0.00956788845, -0.00505019492, + -0.0100129386, 0.0193647351, 0.0034627507, 0.00467265304, -0.0153254075, + 0.0211381968, -0.0220802985, -0.00323239085, -0.0127215981, + 0.0465795472, 0.0166741088, -0.000689326727, 0.00955610909, + -0.0143910646, -0.00198538718, 0.0407436788, 0.0253659915, + -0.00343311741, -0.0310920887, 0.0265372545, 0.00654901937, + 0.0188235529, 0.00199738727, 0.0112797469, -0.0014535326, -0.0397842303, + 0.00509123923, -0.0105526308, 0.019441938, 0.00334139331, 0.0365989096, + 0.00230900804, -0.0531785153, 0.010751849, 0.00935982913, 0.0384312607, + 0.0096363565, -0.0220984519, 0.00152336573, -0.0321582444, 0.0292694196, + -0.0260823835, 0.0337933078, 0.00405835779, -0.0189365819, 0.0156697482, + 0.0422811, 0.00566361845, 0.0205916148, -0.0202185232, 0.0202315152, + -0.00685426686, 0.015565997, 0.00501579419, -0.0229780059, 0.0151474588, + 0.00053506461, 0.00191962544, 0.0133708566, 0.00212826976, + -0.0481293574, -0.00169397751, 0.010574148, -0.0209433287, 0.0110796, + 0.0065798522, -0.00667468179, -0.0308473092, 0.00740753859, + -0.0221598223, 0.00512656942, 0.0195889119, 0.0556428172, + -0.00257600704, 0.00370742916, 0.00411983952, 0.0658061802, + -0.00873719063, -0.043811474, -0.00329023506, 0.00454754382, + -0.000812734361, -0.0109089259, 0.000750568288, 0.0247720573, + -0.00580075663, 0.0015899404, 0.0297173653, 0.0270499606, 0.0305265728, + 0.00772903, 0.0280447453, 0.0173935164, -0.0167136174, 0.0506906323, + -0.0101519544, 0.0353015289, -0.0114279818, 0.0264521521, -0.0293146223, + -0.00393620925, -0.0591186136, 0.00581971416, 0.00844934676, + 0.023740761, -0.0238940492, -0.0214789622, -0.0180806, 0.00577302137, + 0.0272331201, -0.061273057, -0.0228527281, 0.0134820975, 0.0267619714, + 0.0205253121, -0.00703013409, -0.0101485271, 0.00390325161, + -0.0137371421, -0.0489562973, -0.0127959596, 0.0242894366, -0.008546344, + -0.0133359162, -0.0476422794, -0.0142559884, -0.02404215, 0.00224654726, + -0.0387420654, -0.0043096086, 0.0413263887, 0.00274349866, 0.016133111, + 0.00154414598, -0.00368582713, -0.0215509403, 0.00142613705, + 0.0106891431, 0.0150609631, -0.00133193098, -0.0330797434, + -0.00433516176, -0.00501346029, 0.0261584409, 0.0321044028, + -0.0240512174, -0.0229956023, 0.013655521, -0.0122943223, -0.0218713544, + -0.0333506167, -0.00955368672, -0.00437915325, -0.00088354724, + 0.0101670045, 0.000485445024, 0.00869695563, -0.0196477175, + -0.0551166572, 0.0161440037, -0.0234405119, 0.0176831577, 0.00752860308, + -0.00384146953, -0.000213336752, 0.0370079428, -0.0245727263, + -0.0504004359, -0.020394396, 0.000584760157, 0.00978445262, + -0.0102744028, -0.0442414545, -0.00635753712, 0.00860350206, + 0.00640854379, -0.00895388, -0.0232050586, 0.0102997683, -0.0327524543, + -0.0326812938, -0.00686040334, -0.0435493663, 0.00337665598, + 0.0166181475, 0.0215597413, -0.0049460181, -0.0086199, -0.00389243802, + -0.0136604272, 0.00993004814, 0.00282117934, 0.00515508605, + -0.00519424165, -0.00999070145, -0.00147068209, 0.00369803212, + 0.03990601, 0.0120543828, -0.00327076251, -0.0168122407, -0.0221371967, + 0.0255554263, 0.001270968, 0.00407504896, -0.0312685817, -0.023212146, + -0.057882797, -0.0369412, -0.00547598302, -0.0362123623, -0.0358127877, + -0.000455933099, -0.00527426368, 0.010957012, 0.0205564238, + -0.00896162074, -0.00111860048, 0.00703405542, -0.0711964145, + -0.022021845, 0.0307536609, -0.0400716141, -0.00308295665, 0.0351293832, + 0.00499952724, 0.0195838138, 0.023860069, 0.0113117332, 0.0515782908, + 0.00432363432, -0.0231705476, 0.0174186751, -0.0195914954, 0.0101942793, + 0.0167301353, -0.000199523696, -0.0101376269, 0.0182858892, + 0.0869283155, 0.0243913196, 0.0669196248, 0.0185533017, 0.0612070113, + 0.0160951559, -0.0314462, -0.0206926726, -0.00790190697, 0.0424785279, + 0.0262046363, 0.00937181525, 0.0342449658, 0.0064783697, 0.0249037649, + -0.0137123372, 0.0210513435, 0.00541570131, 0.0000486832141, + -0.0259706378, -0.0300789289, 0.00782210939, -0.0173217971, + -0.014066509, -0.0234325249, 0.0139920497, -0.00396463089, + -0.0519054495, 0.0144946137, -0.00234021782, -0.00807238277, + 0.000436707051, -0.0390327275, 0.0459594689, 0.038718313, 0.0280687064, + 0.0078713242, 0.00640660943, -0.000269388198, 0.0280300248, + -0.00306039862, -0.0437871, -0.0240810756, -0.0502388291, -0.024014743, + -0.00745526515, -0.00378584093, -0.00694045611, -0.0111657418, + 0.0311096702, -0.0250221714, -0.0223973524, -0.00616492284, + 0.00813332666, 0.0237598233, 0.0202788152, -0.0151113095, + -0.00223956537, -0.0344038941, -0.0297126081, 0.0501965, -0.00374444248, + -0.00474519609, 0.0274300929, 0.00198469171, -0.00560412, -0.0156734232, + 0.0489428192, 0.00170261681, -0.0429477394, -0.0138243567, 0.0127956429, + -0.00822142605, -0.0181886517, -0.00203846791, -0.0795444697, + -0.00548215583, 0.0227267649, -0.00599628594, 0.0141998325, 0.00994171, + 0.0386609919, -0.0162332971, 0.00768113928, 0.00947586168, 0.0384875946, + 0.0311741475, -0.0237468574, -0.026139833, -0.0375245363, 0.00990575366, + -0.013840178, 0.0436373353, -0.0241348632, -0.0223932434, 0.011154647, + 0.00320306304, 0.0073458706, -0.00155779871, -0.00879557058, + -0.00106137153, 0.0178080741, 0.01561544, 0.0171815734, 0.027200561, + -0.00627345312, 0.0630974099, -0.00833350141, 0.0210855063, + 0.0129463533, -0.00873967446, -0.0290490817, -0.00855392776, + 0.0234951116, -0.0178814046, 0.00453126756, -0.00369682023, + 0.0111865364, -0.0160761904, 0.0195884425, 0.0463038795, -0.0171864741, + -0.0374323912, 0.020723097, 0.00428105518, 0.0363555327, -0.00964644, + -0.016611604, -0.0145120844, -0.00521347532, -0.0269056894, + -0.020038154, -0.0224927366, -0.0139585258, -0.0562770776, -0.031290371, + 0.0204596929, 0.0259389598, 0.0441130511, -0.0189397074, -0.0140432119, + 0.00946220942, -0.0449446961, 0.016192643, -0.0074085691, 0.0101288641, + -0.000958178134, 0.0276184548, -0.0366303846, -0.0138140963, + -0.04580836, 0.0111556947, 0.0207933057, 0.0135189211, 0.0149673419, + -0.00344952615, -0.0230011381, -0.0390263125, -0.0166007336, + 0.0126238707, 0.00453956239, -0.0125422413, -0.098842442, + 0.000431181514, -0.00155359611, -0.00795070454, -0.00552688399, + -0.0132899862, -0.0123376995, 0.0058303047, 0.0157832783, -0.0131928995, + -0.028023487, 0.00560258701, -0.0321100354, 0.0231736638, -0.011532641, + -0.0356754363, 0.036068771, 0.00983694755, 0.00925140548, + -0.00488466304, 0.0307478346, -0.0323061, 0.00300523499, 0.00322845415, + 0.0155146504, 0.00867948495, 0.0256663766, 0.0324363075, -0.0159262363, + -0.0257178117, -0.00510563236, 0.0183420014, 0.015630031, -0.0045425212, + 0.0115154097, -0.00850601494, -0.026883712, 0.00459420681, 0.0260308515, + -0.00445165345, -0.0289291851, 0.0258517023, 0.0207562819, 0.0240250453, + 0.0386538692, -0.0128346132, 0.0108000804, -0.019390611, -0.0190595314, + -0.0410954468, -0.0061017354, 0.0271149799, -0.0362317339, + 0.000981613761, 0.0258738622, 0.0173024498, 0.00453861756, 0.0087875193, + 0.0478484035, 0.0569758713, 0.0169108119, -0.0114248702, -0.0229106583, + 0.00611786405, -0.0169372503, -0.0064141443, 0.00871222094, + -0.00948232599, -0.0101533411, 0.0245107636, 0.0117161162, + 0.00554489577, -0.0239735134, 0.000193733649, 0.00507702306, + 0.00331792422, -0.0412947647, -0.053955432, -0.0455085486, + -0.0119136237, -0.0157709774, -0.00261563505, 0.005211832 + ] + } + ] +} diff --git a/libs/chonky/tests/docs/page_1.png b/libs/chonky/tests/docs/page_1.png new file mode 100644 index 00000000000..8abaeb2d08f Binary files /dev/null and b/libs/chonky/tests/docs/page_1.png differ diff --git a/libs/chonky/tests/docs/table-testing.pdf b/libs/chonky/tests/docs/table-testing.pdf new file mode 100644 index 00000000000..f0612740195 Binary files /dev/null and b/libs/chonky/tests/docs/table-testing.pdf differ diff --git a/libs/chonky/tests/docs/table-testing.png b/libs/chonky/tests/docs/table-testing.png new file mode 100644 index 00000000000..e7134202cce Binary files /dev/null and b/libs/chonky/tests/docs/table-testing.png differ