diff --git a/crates/socket-patch-core/src/formats/yarn/blocks.rs b/crates/socket-patch-core/src/formats/yarn/blocks.rs index a15c1ff2f..0cabd1463 100644 --- a/crates/socket-patch-core/src/formats/yarn/blocks.rs +++ b/crates/socket-patch-core/src/formats/yarn/blocks.rs @@ -8,7 +8,7 @@ use super::patterns::{berry_npm_alias_target, split_berry_key_patterns, split_pattern}; use crate::formats::text::split_bom; -use crate::vendor::common::detect_eol; +use crate::utils::line_endings::terminator; /// One key-line block of a yarn lockfile (classic or berry). pub(crate) struct LockBlock { @@ -82,16 +82,16 @@ fn is_body_line(s: &str) -> bool { } /// The line terminator `block` is written in: its first line's (`\r\n` or -/// `\n`), else — a block that is one unterminated last line — the file's -/// dominant one ([`detect_eol`]). For a uniformly-ended lock this is the -/// file's own terminator; in a lock whose endings were mixed after the +/// `\n`), else — a block that is one unterminated last line — the +/// file's [`terminator`]. For a uniformly-ended lock this is the file's +/// own terminator; in a lock whose endings were mixed after the /// fact it keeps a restored block in the style of the block it replaces. pub(crate) fn block_eol(text: &str, block: &LockBlock) -> &'static str { let span = &text[block.start..block.end]; match span.find('\n') { Some(i) if span[..i].ends_with('\r') => "\r\n", Some(_) => "\n", - None => detect_eol(text), + None => terminator(text), } } diff --git a/crates/socket-patch-core/src/patch/redirect/npmrc.rs b/crates/socket-patch-core/src/patch/redirect/npmrc.rs index b2bf194d3..6c0f5986a 100644 --- a/crates/socket-patch-core/src/patch/redirect/npmrc.rs +++ b/crates/socket-patch-core/src/patch/redirect/npmrc.rs @@ -736,7 +736,7 @@ pub fn plan_npmrc_allow_remote_with(existing: Option<&str>, outer: &OuterAllowRe Some(rest) => (&text[..BOM.len_utf8()], rest), None => ("", text), }; - let crlf = body.contains("\r\n"); + let crlf = crate::utils::line_endings::terminator(body) == "\r\n"; let line = if crlf { format!("{NPMRC_ALLOW_REMOTE_LINE}\r") } else { @@ -903,6 +903,26 @@ mod tests { assert_eq!(text, "\u{feff}[x]\nallow-remote=all\n[sec]\ny=1\n"); } + /// The spliced line takes `line_endings::terminator`'s style: the + /// majority of a mixed file's breaks, LF on a tie. + #[test] + fn spliced_line_takes_the_majority_terminator_of_a_mixed_npmrc() { + for (existing, want) in [ + ("a=1\r\nb=2\n", "a=1\r\nb=2\nallow-remote=all\n"), + ("a=1\r\nb=2\nc=3\n", "a=1\r\nb=2\nc=3\nallow-remote=all\n"), + ( + "a=1\r\nb=2\r\nc=3\n", + "a=1\r\nb=2\r\nc=3\nallow-remote=all\r\n", + ), + ("a=1\r\nb=2\r\n", "a=1\r\nb=2\r\nallow-remote=all\r\n"), + ] { + let NpmrcPlan::Append(text) = plan_npmrc_allow_remote(Some(existing)) else { + panic!("append expected for {existing:?}"); + }; + assert_eq!(text, want, "{existing:?}"); + } + } + fn cfg_env(vars: &[(&str, &str)]) -> NpmConfigEnv { NpmConfigEnv { vars: vars diff --git a/crates/socket-patch-core/src/vendor/common.rs b/crates/socket-patch-core/src/vendor/common.rs index 79403e5e1..87a429ea7 100644 --- a/crates/socket-patch-core/src/vendor/common.rs +++ b/crates/socket-patch-core/src/vendor/common.rs @@ -153,16 +153,6 @@ pub(crate) fn detect_indent(text: &str) -> String { " ".to_string() } -/// The file's dominant line terminator (new lines we write use it; bytes -/// outside edited spans keep whatever they had). -pub(crate) fn detect_eol(text: &str) -> &'static str { - if text.contains("\r\n") { - "\r\n" - } else { - "\n" - } -} - /// Pretty-print JSON with `indent` + a trailing newline (the shape npm and /// composer themselves emit), so untouched keys stay byte-identical and a /// later `npm install` / `composer update` produces no format-only churn. diff --git a/crates/socket-patch-core/src/vendor/go_mod_edit.rs b/crates/socket-patch-core/src/vendor/go_mod_edit.rs index defa4de35..a74d15209 100644 --- a/crates/socket-patch-core/src/vendor/go_mod_edit.rs +++ b/crates/socket-patch-core/src/vendor/go_mod_edit.rs @@ -1897,7 +1897,7 @@ replace ( /// output, and joining with bare `\n` LF-normalizes EVERY line — churning /// the user's whole file and breaking the byte-identical ensure→drop /// round-trip pinned above. Same contract as `setup/pypi/edit.rs`'s - /// CRLF preservation (shared `detect_eol`). + /// CRLF preservation (shared `line_endings::terminator`). /// #815: on a mixed go.mod the appended directive takes the file's /// majority line ending, not CRLF because one line has it. #[test] diff --git a/crates/socket-patch-core/src/vendor/go_sum_edit.rs b/crates/socket-patch-core/src/vendor/go_sum_edit.rs index 86aaa9a63..6b5c774be 100644 --- a/crates/socket-patch-core/src/vendor/go_sum_edit.rs +++ b/crates/socket-patch-core/src/vendor/go_sum_edit.rs @@ -67,7 +67,7 @@ pub fn remove_module_prefix_lines(content: &str, module_prefix: &str) -> Option< if kept.is_empty() { return Some(String::new()); } - let eol = super::common::detect_eol(content); + let eol = crate::utils::line_endings::terminator(content); let mut joined = kept.join(eol); joined.push_str(eol); Some(joined) @@ -132,7 +132,7 @@ pub fn reinsert_lines(content: &str, removed: &str) -> Option { if !changed { return None; } - let eol = super::common::detect_eol(content); + let eol = crate::utils::line_endings::terminator(content); let mut joined = lines.join(eol); joined.push_str(eol); Some(joined) @@ -149,7 +149,7 @@ pub fn remove_lines(content: &str, added: &str) -> Option { if kept.is_empty() { return Some(String::new()); } - let eol = super::common::detect_eol(content); + let eol = crate::utils::line_endings::terminator(content); let mut joined = kept.join(eol); joined.push_str(eol); Some(joined) @@ -163,7 +163,7 @@ pub fn remove_lines(content: &str, added: &str) -> Option { /// The content is always exactly what applying the text transforms in the /// same order would give. Once a transform changes it, the file is held as /// its lines: every transform ends with `lines.join(eol) + eol`, whose -/// `str::lines` are those lines again and whose `detect_eol` is `eol` again — +/// `str::lines` are those lines again and whose `line_endings::terminator` is `eol` again — /// except when a line ends in a bare `\r` under an LF file (a joined `\r\n` /// would then split differently), which is kept as text instead. pub(crate) struct GoSumEditor { @@ -191,7 +191,7 @@ impl GoSumEditor { match std::mem::replace(&mut self.state, GoSumState::Text(String::new())) { GoSumState::Text(text) => { let lines = text.lines().map(str::to_string).collect(); - let eol = super::common::detect_eol(&text); + let eol = crate::utils::line_endings::terminator(&text); self.state = GoSumState::Text(text); (lines, eol) } @@ -622,17 +622,19 @@ mod tests { } /// Mixed and bare-`\r` line endings, a missing final newline and a - /// blank line: the outputs the text transforms gave before they were - /// folded into the editor. + /// blank line: the rewritten file takes `line_endings::terminator`'s + /// style, the majority of a mixed file's breaks (a tie is LF). #[test] fn odd_line_endings_give_the_recorded_outputs() { + // One LF and one CRLF break: a tie, so LF (the old any-CRLF rule + // re-spelled this whole file CRLF). let mixed = "a.com/x v1.0.0 h1:A=\nb.com/z v1.0.0 h1:B=\r\nc.com/q v1.0.0 h1:C="; assert_eq!( upsert_module_lines(mixed, "b.com/y", "v1.0.0", "h1:Z=", "h1:G=").as_deref(), Some( - "a.com/x v1.0.0 h1:A=\r\nb.com/y v1.0.0 h1:Z=\r\n\ - b.com/y v1.0.0/go.mod h1:G=\r\nb.com/z v1.0.0 h1:B=\r\n\ - c.com/q v1.0.0 h1:C=\r\n" + "a.com/x v1.0.0 h1:A=\nb.com/y v1.0.0 h1:Z=\n\ + b.com/y v1.0.0/go.mod h1:G=\nb.com/z v1.0.0 h1:B=\n\ + c.com/q v1.0.0 h1:C=\n" ) ); assert_eq!( @@ -640,13 +642,25 @@ mod tests { None ); + // A CRLF majority keeps the file CRLF. + let crlf_majority = + "a.com/x v1.0.0 h1:A=\r\nb.com/z v1.0.0 h1:B=\r\nc.com/q v1.0.0 h1:C=\n"; + assert_eq!( + upsert_module_lines(crlf_majority, "b.com/y", "v1.0.0", "h1:Z=", "h1:G=").as_deref(), + Some( + "a.com/x v1.0.0 h1:A=\r\nb.com/y v1.0.0 h1:Z=\r\n\ + b.com/y v1.0.0/go.mod h1:G=\r\nb.com/z v1.0.0 h1:B=\r\n\ + c.com/q v1.0.0 h1:C=\r\n" + ) + ); + let bare_cr = "a.com/x v1.0.0 h1:A=\r\rb.com/y v1.0.0 h1:Q=\nb.com/z v1.0.0 h1:B=\r\n"; assert_eq!( upsert_module_lines(bare_cr, "b.com/y", "v1.0.0", "h1:Z=", "h1:G=").as_deref(), Some( - "a.com/x v1.0.0 h1:A=\r\rb.com/y v1.0.0 h1:Q=\r\n\ - b.com/y v1.0.0 h1:Z=\r\nb.com/y v1.0.0/go.mod h1:G=\r\n\ - b.com/z v1.0.0 h1:B=\r\n" + "a.com/x v1.0.0 h1:A=\r\rb.com/y v1.0.0 h1:Q=\n\ + b.com/y v1.0.0 h1:Z=\nb.com/y v1.0.0/go.mod h1:G=\n\ + b.com/z v1.0.0 h1:B=\n" ) ); assert!(!GoSumEditor::new(bare_cr.to_string()).has_module_version("b.com/y", "v1.0.0")); @@ -655,12 +669,12 @@ mod tests { assert!(GoSumEditor::new(blank.to_string()).has_module_version("b.com/y", "v1.0.0")); assert_eq!( upsert_module_lines(blank, "b.com/y", "v1.0.0", "h1:Z=", "h1:G=").as_deref(), - Some("\r\nb.com/y v1.0.0 h1:Z=\r\nb.com/y v1.0.0/go.mod h1:G=\r\n") + Some("\nb.com/y v1.0.0 h1:Z=\nb.com/y v1.0.0/go.mod h1:G=\n") ); assert_eq!( remove_exact_module_version_lines(blank, "b.com/y", "v1.0.0"), Some(( - "\r\n".to_string(), + "\n".to_string(), vec![ "b.com/y v1.0.0 h1:OLD=".to_string(), "b.com/y v1.0.0/go.mod h1:OLDM=".to_string(), @@ -669,6 +683,21 @@ mod tests { ); } + /// The forward upsert and its revert agree on a mixed file: once the + /// upsert has re-spelled it in the majority style, removing the added + /// lines hands back that file minus them, in the same style. + #[test] + fn mixed_upsert_then_remove_round_trips() { + let mixed = "a.com/x v1.0.0 h1:A=\r\nb.com/z v1.0.0 h1:B=\nc.com/q v1.0.0 h1:C=\n"; + let wired = upsert_module_lines(mixed, "b.com/y", "v1.0.0", "h1:Z=", "h1:G=").unwrap(); + assert_eq!(crate::utils::line_endings::terminator(&wired), "\n"); + let added = "b.com/y v1.0.0 h1:Z=\nb.com/y v1.0.0/go.mod h1:G=\n"; + assert_eq!( + remove_lines(&wired, added).as_deref(), + Some("a.com/x v1.0.0 h1:A=\nb.com/z v1.0.0 h1:B=\nc.com/q v1.0.0 h1:C=\n") + ); + } + #[test] fn version_line_key_rule() { assert!(is_version_line("a.com/x v1.0.0 h1:A=", "a.com/x", "v1.0.0")); diff --git a/crates/socket-patch-core/src/vendor/pypi_requirements.rs b/crates/socket-patch-core/src/vendor/pypi_requirements.rs index a9504f30a..22d3862d3 100644 --- a/crates/socket-patch-core/src/vendor/pypi_requirements.rs +++ b/crates/socket-patch-core/src/vendor/pypi_requirements.rs @@ -25,12 +25,13 @@ use std::path::Path; use crate::crawlers::python_crawler::canonicalize_pypi_name; use crate::utils::fs::{atomic_write_bytes_preserving_mode, read_regular_to_string}; +use crate::utils::line_endings::terminator; use crate::utils::requirements::{ expand_env_vars, hash_options, logical_lines, requires_hashes, shlex_split, split_comment, strip_comment, vendor_tag, }; -use super::common::{detect_eol, refuse_symlinked}; +use super::common::refuse_symlinked; use super::state::{VendorEntry, WiringAction, WiringRecord}; use super::{RevertOutcome, VendorWarning}; @@ -424,7 +425,7 @@ pub(super) async fn revert_requirements( return RevertOutcome::failed(format!("cannot read {file}: {e}")); } }; - let nl = detect_eol(&content); + let nl = terminator(&content); let had_trailing_newline = content.ends_with('\n'); let mut lines: Vec = content.lines().map(str::to_string).collect(); @@ -595,7 +596,7 @@ async fn plan_requirements( if spans.is_empty() { continue; } - let nl = detect_eol(&file.content); + let nl = terminator(&file.content); let original_lines: Vec = file.content.lines().map(str::to_string).collect(); let mut lines = original_lines.clone(); let mut records = Vec::new(); @@ -653,7 +654,7 @@ async fn plan_requirements( &None, true, ); - let nl = detect_eol(&root_file.content); + let nl = terminator(&root_file.content); let mut new_content = root_file.content.clone(); if !new_content.is_empty() && !new_content.ends_with('\n') { new_content.push_str(nl); @@ -748,7 +749,7 @@ fn plan_rewire( if !file.editable { return Err(format!("{rel} is outside the project root")); } - let nl = detect_eol(&file.content); + let nl = terminator(&file.content); let mut lines: Vec = file.content.lines().map(str::to_string).collect(); let mut taken: HashSet = HashSet::new(); let mut records = Vec::new(); diff --git a/crates/socket-patch-core/src/vendor/pypi_uv.rs b/crates/socket-patch-core/src/vendor/pypi_uv.rs index f42b3833b..1bae31c55 100644 --- a/crates/socket-patch-core/src/vendor/pypi_uv.rs +++ b/crates/socket-patch-core/src/vendor/pypi_uv.rs @@ -32,6 +32,7 @@ use crate::crawlers::python_crawler::canonicalize_pypi_name; // the first opens. use crate::patch::redirect::upstream::{respell_lock_specifier, LockRequirementArray}; use crate::utils::fs::{atomic_write_bytes_preserving_mode, read_regular_to_string}; +use crate::utils::line_endings::terminator; use crate::utils::python_lock::preserve_line_endings; use super::common::{ @@ -940,7 +941,7 @@ pub(super) async fn revert_uv(entry: &VendorEntry, root: &Path, dry_run: bool) - // A created [manifest] section was inserted with a blank // separator line; a created overrides key is one line. // Both were terminated with the lock's own newline. - let nl = newline_of(&lock_text); + let nl = terminator(&lock_text); let removed = if new.starts_with("[manifest]") { remove_substring(&lock_text, &format!("{new}{nl}{nl}")) } else { @@ -1319,7 +1320,7 @@ fn revert_array_elements( if !changed { return ArrayRevert::Converged; } - let nl = newline_of(lock_text); + let nl = terminator(lock_text); let rendered = match live.len() { 0 => "[]".to_string(), 1 => format!("[{}]", live[0]), @@ -1428,18 +1429,6 @@ fn locate_lock_array( /// replace it) and re-verified against the pre-flight snapshot. const UV_PAIR: [&str; 2] = ["pyproject.toml", "uv.lock"]; -/// The lock's line terminator. uv writes LF, but git autocrlf on Windows -/// hands us a CRLF file; every fragment we splice, append or remove must be -/// built with the file's own terminator or the lock comes back with mixed -/// endings and revert's exact-text removals miss. -fn newline_of(text: &str) -> &'static str { - if text.contains("\r\n") { - "\r\n" - } else { - "\n" - } -} - /// Whether a header for this `[tool.uv…]` table would be socket-patch's own /// bytes once a key is added: the table is absent, or exists only /// implicitly (no header of its own, just `[….]` sub-tables). A dotted @@ -1559,7 +1548,7 @@ fn rewrite_target_package_unit( wheel_sha256_hex: &str, metadata_block: Option<&str>, ) -> Result<(String, String), (&'static str, String)> { - let nl = newline_of(lock_text); + let nl = terminator(lock_text); let span = find_unit_span(lock_text, |lines| unit_has_name(lines, canon)).ok_or_else(|| { ( "pypi_uv_lock_package_missing", @@ -1923,7 +1912,7 @@ fn add_manifest_override( let element = format!("{{ name = \"{canon}\", path = \"{rel_wheel}\" }}"); // Every created/spliced fragment is built with the lock's own terminator // (revert removes `{new}{nl}` / `{new}{nl}{nl}` with the same detection). - let nl = newline_of(lock_text); + let nl = terminator(lock_text); let index = line_index(lock_text); let manifest_line = index.iter().position(|(_, l)| l.trim_end() == "[manifest]"); @@ -5809,6 +5798,29 @@ wheels = [ assert!(err.1.contains("no [[package]] entries"), "{}", err.1); } + /// A created `[manifest]` section is spelled in the lock's + /// `line_endings::terminator` style: the majority of a mixed lock's + /// breaks, LF on a tie. + #[test] + fn manifest_override_section_takes_the_majority_terminator() { + for (lock, nl) in [ + ( + "version = 1\r\nrevision = 3\n\n[[package]]\nname = \"proj\"\n", + "\n", + ), + ( + "version = 1\r\nrevision = 3\n\n[[package]]\r\nname = \"proj\"\r\n", + "\r\n", + ), + ] { + let (_, text) = add_manifest_override(lock, "six", REL_WHEEL).unwrap(); + let section = format!( + "[manifest]{nl}overrides = [{{ name = \"six\", path = \"{REL_WHEEL}\" }}]{nl}{nl}" + ); + assert!(text.contains(§ion), "{lock:?} -> {text:?}"); + } + } + /// A truncated (unbalanced) existing `[manifest] overrides` array refuses /// with a parse error instead of splicing garbage. #[test] diff --git a/crates/socket-patch-core/src/vendor/yarn_classic_lock.rs b/crates/socket-patch-core/src/vendor/yarn_classic_lock.rs index fb1fb2f17..fd1f06139 100644 --- a/crates/socket-patch-core/src/vendor/yarn_classic_lock.rs +++ b/crates/socket-patch-core/src/vendor/yarn_classic_lock.rs @@ -36,9 +36,10 @@ use crate::formats::yarn::source::{classic_copy_source, CopySource}; use crate::manifest::schema::PatchRecord; use crate::patch::apply::PatchSources; use crate::utils::fs::{atomic_write_bytes_preserving_mode, read_regular_to_string}; +use crate::utils::line_endings::terminator; use crate::utils::socket_dir::remove_tree_and_prune; -use super::common::{detect_eol, refused}; +use super::common::refused; use super::npm_common::{ guard_revert_uuid_dir, vendor_npm_family, NpmCommit, NpmCoords, NpmLockBackend, NpmStagedPack, NpmVendorRequest, WireCx, @@ -145,7 +146,7 @@ impl NpmLockBackend for YarnClassicBackend { let resolved_value = format!("file:./{}#{}", staged.rel_tgz, staged.packed.sha1_hex); // ── 8. Lock rewrite: splice each candidate block, byte-preserving ─ - let eol = detect_eol(&text); + let eol = terminator(&text); let mut new_text = text; let mut wiring: Vec = Vec::new(); for key in &candidate_keys { @@ -2272,6 +2273,16 @@ left-pad@^1.3.0: let last = "x:\r\n v: 1\r\n\r\ny:"; let blocks = scan_blocks(last); assert_eq!(block_eol(last, &blocks[1]), "\r\n"); + // In a mixed lock that fallback is the majority break, the same + // `line_endings::terminator` the forward splice uses. + for (mixed, eol) in [ + ("x:\r\n v: 1\n\ny:", "\n"), + ("x:\r\n v: 1\r\n\ny:", "\r\n"), + ] { + let blocks = scan_blocks(mixed); + assert_eq!(block_eol(mixed, &blocks[1]), eol, "{mixed:?}"); + assert_eq!(terminator(mixed), eol, "{mixed:?}"); + } } /// A second canonical uuid, distinct from [`UUID`], for re-vendor tests. diff --git a/crates/socket-patch-core/tests/equivalence/golang_rewrite.golden b/crates/socket-patch-core/tests/equivalence/golang_rewrite.golden index dade210a5..538d71421 100644 --- a/crates/socket-patch-core/tests/equivalence/golang_rewrite.golden +++ b/crates/socket-patch-core/tests/equivalence/golang_rewrite.golden @@ -1,302 +1,302 @@ # One seeded go.mod / go.sum pair + overrides, or the re-run over its output. # -0-19 5dab684f28d8071e 7bb104b698e54b8d -20-39 85f9f7683a5ac3f5 1115103e5c324cd1 +0-19 8affc108e0fea83c d217609ae2b6d375 +20-39 2e8996839f016121 a6f67b7a540e2d5a 40-59 a86f60d4d868c79c d11b7a64905bc1ea 60-79 802e356468c4982c 5c7c80663f4e06d4 -80-99 e119fbb2f160de28 d8f3771b26863d66 -100-119 cb7ca5e7fc7e61df 9cccc81fca8448b0 -120-139 fa13c96c073cae08 dd5fc59277757625 +80-99 35a6b1febe605c4f a65ffa255457f57f +100-119 bd3577de6dc6538e 9ead57b9341fa876 +120-139 4f16b94967700492 6de9209ec21c5e87 140-159 e54c48f83f4f8b9f 5c580e4063e600ee 160-179 515b4fd117413b07 3bd58357b361e948 -180-199 3c086f161e773a7f d90b6bb988306cf5 +180-199 5109488d3766b78d 76221cf3974652ec 200-219 28f6319a64dc3fbb 96d40e96c9a0edf9 220-239 39618d849d8fda8c 26dffcbea2452394 -240-259 47ca04a94948041d c504bff314072199 -260-279 1223bab190d4ad17 bd88df7cc9813075 -280-299 097ceb8f4a7206e3 95710e0ad40d68b0 +240-259 bdae75a5c4e825a6 2a5f51ef3dabc45b +260-279 c745748faa22afc7 687a509c034547a4 +280-299 1011d2e2a4d5b0ec ba572c70a61b7af4 300-319 4b16f76f77f2864d 9cd531d6442ce036 -320-339 b1c4bc380d07158c e80044a76884ac55 -340-359 713e58c539022905 3d4b1688e5a881d1 -360-379 fe9855f9bb69c430 190a72101e00926b -380-399 941edfb111cb5367 5c38494949cdcc7a +320-339 39bd1e211fc7dc2d 9366ce11dd037c95 +340-359 3301fbd0c3711331 7e0577f3964bd709 +360-379 df998500fae69f60 784dedd3b5051ff1 +380-399 723fe126896b13a6 3be8d3ccfeea3492 400-419 8af5995cf2f76dea cb4c682266cf703c -420-439 9cb2e5ab58f12f52 6ec27ddf7b2f6160 +420-439 0fe2bc1416e755d6 2e7972d1e3bba646 440-459 3df2c0d14ad9d565 830bb30e194e2080 -460-479 5ab28d4319c748e8 dc6fd9966321b81f -480-499 b17ebc32790282b2 d37c1b933a02e03b +460-479 560a1006d9373f2b 7058a857b37bf6e0 +480-499 26d14b61cf702dab 67592452ce9e29db 500-519 3961ba4ed9781da7 6d91b40fe0077b73 -520-539 14ced69da5c9ca03 fa216aa853527650 -540-559 1b1b1ebb875fdbd4 f8959985229d8b02 -560-579 46ecdb84ca2d828f f3280c333a062264 -580-599 8ceed1060404c634 759f205dcdf5ac92 -600-619 fdad8c6995f5d404 536584451e3c6951 +520-539 1b38432bef93a466 077967265c1cd4fd +540-559 267215b64ecec280 196475a37c88b633 +560-579 21b9a5619b7413e4 4c37e05a7224de06 +580-599 b5545d490aac09a9 c6559305a9fc03f9 +600-619 e8dd88bc440f73f8 1a23fea251df37ae 620-639 af3b19b435cf6fac 3e8f4503cade03d0 -640-659 428d179c205d7a1c 5d18ef0820bb7698 -660-679 e26f30c0657f6e52 b94277135789cdd9 -680-699 8d63e77bd076294e 6f7c47208f18010e -700-719 2d1e689a27eb7c75 1434a55593c904ab +640-659 bae7e86659b156c3 6d894f821baaa81f +660-679 d3f04db367baa7ca 23c4fdf0614be428 +680-699 963d9788fb95ba48 1b0a8013aab9b9ff +700-719 d9f7740b1b0aaa1d 0e9d8a51c9dc660b 720-739 61b704425a73b56d 2cdefa768429a2e9 -740-759 71dec302cd3c22da 2f924745a3141a91 +740-759 a1539928074f96af 2466fa22e4dca6ee 760-779 a71deef5b9b2c42e b5a2d9405cf320cb 780-799 6dc37e510ac31cbf 28b8c3bc01b4f66a 800-819 0116b8f40912ff10 af22460213179a03 -820-839 45277c66b8482ef9 e99aa7a0aa0f39c6 -840-859 22ad5131200df40a 264ef50084e152ec -860-879 3ffec215a7e32e97 6a53242431c223cf -880-899 afda5867d93b53df 3bd1cd10c811a113 +820-839 a894c27412910ab3 bd9061bc9b125f6a +840-859 9e9eaed3d98358ee 3fe03ce528cc985c +860-879 92d169f487a02ea0 f8813ff1d0441c6e +880-899 6cda3400ac7fe005 90d60665a8fc5a8b 900-919 1deaf15626d0a873 6cc5208e0f281496 -920-939 19206f8cab68c222 1b9795ad8797f53f +920-939 1de022c7c9306a5e 4251e877baf0c488 940-959 b1abc86bef6b3063 95036d70702b674d 960-979 91a059a20d7961f4 44f9de049d21e73d 980-999 6642fbe828ba9cd2 d43c047c8e275f33 -1000-1019 1e7d803330676d28 2374c7597ff9b195 +1000-1019 0ff1157561f6e666 8471546cd9252f52 1020-1039 6170e2fe8d9c912f 88aee1438b50c94e -1040-1059 5cd6acf6790cca26 d6e58d88b8d23b8f +1040-1059 2c7a678f7bef19b5 626885bf2eb77ec2 1060-1079 d7df42b4f6319ea4 10a5fad62f7dc00a 1080-1099 38a227b69e3f6ae7 ade9923b97f6afb6 -1100-1119 cb4fcaf76908636b a8fbfe9db07d181b -1120-1139 1d5c7a423f733e7f e88efac8a1d8fe97 +1100-1119 cec7880ed7eec8b2 5cc6711e6965488a +1120-1139 fde72a21c0a18004 d27054192986e456 1140-1159 83e9cba84dde6ad3 0b15482eb870fcc3 -1160-1179 9e28ff14a9791a74 4a9903bbe7d70032 -1180-1199 509a63f5377e1151 240546a2e45c5176 +1160-1179 7f90cc68e619694e d68df1393fbdd500 +1180-1199 f06d71f7c517a0a2 d36743aa98721a08 1200-1219 1da3d2d5deb1cf4d 94f1186fbf9534e8 -1220-1239 05e09f6ba1cf52b2 e4f637be92787d0c -1240-1259 a0b4cfe41f3291ac 1f45e1b11eeed1c1 +1220-1239 0722c3f2eb664b0c ffcf13aedf1e706f +1240-1259 1c0655e6360b5de5 2453a51f68a72380 1260-1279 a1579b39d5ac7bbe f9c7eb8621d19ce8 -1280-1299 50200bfdc43ebd0a 2f502cd2730a60ba -1300-1319 63d1f540aeb16e08 5581b65992d7291f +1280-1299 cd1ee243a50b3619 7a519d7744966974 +1300-1319 206339cf9ebd5ae0 8f3e984ed962380f 1320-1339 86094c70406465d1 1a46b7ca1c33bec4 1340-1359 173a4ba8543a2e36 52c34931464f099e -1360-1379 f228e1f93e5936a4 90117983e614475a -1380-1399 9d2b49162c075fd5 67ce0e373f9eca31 +1360-1379 76e4d6fbd8d437ef 430ac3b111334b2d +1380-1399 559ca65099b73a05 122e3b6d92b9b62b 1400-1419 39dd13b5fbbbf0e6 b83f304811e7d9b1 -1420-1439 816d982dba5e30b9 be4716372c15b0c8 -1440-1459 0b118514502af233 e461b52e9bb976ca +1420-1439 d00c1c4afb54a563 67e1757624c55eba +1440-1459 4785cfd44210b032 3b769c0716a58286 1460-1479 db68a6b46a1304ea ff04ed7d28aed2f8 1480-1499 32c66b76e3c3b526 18796517b568bb60 -1500-1519 51e0c4b25e9a8741 929207ed9c42ecf6 -1520-1539 13bab29d3167814c 29ed6afbbe2e3016 +1500-1519 943c1df4bb8cb02a 66f879f9862b445b +1520-1539 a289fd547fd60656 fc7b7dc6491ad20e 1540-1559 4874a2ac9f5077ce e535b07601b6fdc8 -1560-1579 ed83efe84b8ccc50 51a61c8c42436ec4 +1560-1579 f0f5333624b0a0bc e607a6fd0cb22d10 1580-1599 ceb59f6639170e68 28e462491ec7c339 -1600-1619 d339d29cdd69d4e9 426a1ecf47ac823b +1600-1619 cb6f199400f49f4d 343a1135b50c03c8 1620-1639 071ea36a03e8574e 52422c98a51b0d5c -1640-1659 b16de0cf4fbe580e 8db1816f04b98d3c -1660-1679 6e18f4e6ba836504 76dbed6a4f2a2ae8 +1640-1659 84bdbdd5d83a725a 01fe2de48922008e +1660-1679 f51bf7929ee1247d f6b9ba1f8e9b1f21 1680-1699 4bb10b37555656a4 3880415ae0e234cb -1700-1719 79a9d04fbc6eaf6b 73f2eaafe5fb7702 +1700-1719 f3adc36c8c101d61 a7ea83bf0b9f1f0a 1720-1739 1b3bc33b47ee5644 70f6c20e3412377f 1740-1759 dc1f5483bef22de7 64c3abc0414937e3 -1760-1779 203ce1d018cef4f9 f77b13738b0c5f28 -1780-1799 c4df65f9a3f11d48 850ecbe9fe772b02 +1760-1779 51bcf5fe24b39c29 b1a990873e9914dc +1780-1799 02fe708f48a2ddc2 604127d239db44a9 1800-1819 a384e804075283ca ce017362903b025e -1820-1839 2838f7476d375f4a 5fcb41a47fcb7e3d -1840-1859 d9171f0e14264ffb d74c54b2073097f5 -1860-1879 50587a8c2915e775 cdf1a216b1b52951 -1880-1899 f5c0a570bde41998 33afa6d068f86b85 -1900-1919 bae53e5a5226615a 768408e5c947e3c4 +1820-1839 c0673d4164f0b499 c737ee00ca614249 +1840-1859 19e9bb194bab6da5 51eceaccdcc30f56 +1860-1879 957e33f771f9e3ff a05ac0862763538e +1880-1899 d87b280fd9a2982c 89cd98f44afc5e03 +1900-1919 318c8bfcb6dea857 830725405cb40902 1920-1939 25f470ea3ae09040 3ad3700a98bcd972 1940-1959 87bd939828a4bb17 a8e63b264294f723 -1960-1979 423397c8b1fa8ccc a19291063f33f7a0 -1980-1999 9ac5409fa4e8a497 fcc51022b46fd655 +1960-1979 d8986cdd634f0838 c4def3ef9119911f +1980-1999 eb596ffc2b2cc984 0d7333bed730e179 2000-2019 325f5116c5754a2d b9656e64977d389e 2020-2039 349e0ed883787441 aa7c1d12842a4c29 2040-2059 dadd4a7567aa2a18 be860bb89c763bf0 -2060-2079 0e1a904d1979e5fe b8b991071c615a07 -2080-2099 03bd9f47cb5d8446 416069cd32aeb046 -2100-2119 1ef75538af263160 dcef78ca1e1e48ab -2120-2139 f9c71d1473ab77ba 20323a40f5125968 -2140-2159 7ccdc734fc44cb52 04ca6a8258ab5f54 +2060-2079 c0e53141ba27f125 4b723ca09cc6bcbf +2080-2099 63078052a0b9d316 d1ad50fdedefc211 +2100-2119 aac3f4e372a600d3 0d7de181c4db3af7 +2120-2139 4ddd3fe935626962 316e3f753defafd2 +2140-2159 cbb1adf75e0f8653 52a9230c43af1283 2160-2179 a6ad34863cec0838 4d3de2f2cbcc8578 -2180-2199 0d02756f72dd9a52 6cec852148533d75 +2180-2199 d922850193265596 775ad6dbd09a4fcf 2200-2219 ab4d606834bf2fbf 5ccab1b1f986f286 -2220-2239 24dd517ac27b6644 cb8aab90352f1286 -2240-2259 23dad77d7e305048 47b528a85e6ff094 +2220-2239 f01c3cbe182ea5e2 302f09ba630f61db +2240-2259 8c36183efdcf7430 e44f6c0a7a57b6b0 2260-2279 8b2db3ee961a62bf 86ff90b276dfc3ee -2280-2299 b8015c2c833fd26b 58bada9f6456276a -2300-2319 8bef847fa812bd59 96e9d3b30a8b7e88 +2280-2299 0d81bf57b17a39eb b25daf2afb37300b +2300-2319 e5e930944795cc37 ba2ca3ade42b7338 2320-2339 da479c323a75e58b 64dd928266b63e3c -2340-2359 ebe2900f59751cc7 a9ec4ca0c9cc1d18 -2360-2379 7241cf78425a3743 f1dd0868a4b8b992 -2380-2399 04adfae498219764 6519a6264bbd83bc -2400-2419 97bd972c076b1c8c 2179cfc2af5bfb9b -2420-2439 8f78c24e2f36d9ac f145d544a0a4bb11 +2340-2359 a3696ebf2cfceeff c2471d5f8ab1a6dc +2360-2379 fd76d24f7a5bd6d4 96a1a26b35f7a54f +2380-2399 3649464b5f3252bc 3237b1b634a17cb3 +2400-2419 668ec474d9ac2f10 577be250a585ce0a +2420-2439 a7a961307a292779 c87ff2537feffdcb 2440-2459 6f8712b563d282ea be0cff28f497b70f -2460-2479 a2f14969b40fe3d6 7c6ded9b3bf9855b -2480-2499 1a94f85a84d62fee 4d9bf8e88c2dda18 -2500-2519 36734652c5f37836 35c1ab2f1f30f281 -2520-2539 af04bf1dfe6901bf 445e0c63461cbd2e -2540-2559 34ca0e713a92ba62 3de3864f144ff70b -2560-2579 df7c8b11820cffb0 421256d8fa63cdfe -2580-2599 9f129af92ef3ad33 9dd64e42d2fe0ba9 -2600-2619 adacd7875305da8f d752eceecc814c59 -2620-2639 6b86e7c7a0863d6b 3bad45da46466b61 -2640-2659 7865fcad24071eda 1b3cd7afd67590df -2660-2679 5410dfc3052a398b 20873d49e81a98c8 -2680-2699 b9071d8cf6e45efd b5fc836ae36ef118 -2700-2719 f6294c6b906509c0 749e9cd4aa842c2c +2460-2479 7b3164c923dbdb29 b7b2c522c09b12d2 +2480-2499 61b9bae3cbbd6142 163e5f1156cb1532 +2500-2519 f0d126572f954122 b014bbdc750615d2 +2520-2539 fd9e5e7b86fed4e5 763af30bb3d6efef +2540-2559 ee6195b09b6a225b c9ad3de0278e89ee +2560-2579 080aa26be640e3cb 3396a7a42ca98d09 +2580-2599 0c5a33a5fe1024be 0ce1df0b0ef96364 +2600-2619 6cc48c2f3d711fc6 0e77be6864e2b941 +2620-2639 c99ab863ceb2b70f 4b4eb04a9792fbb2 +2640-2659 259fbae892ffe01b d53466aeb2c4b0d4 +2660-2679 e9b861ecdaa9aaf5 0d459af4389f73d5 +2680-2699 85009c71a9067ae9 bf178f364d995c8f +2700-2719 77de60f9977e14d6 fed65df0975077a6 2720-2739 2617ec02575b373a 0289f17f84bfc7df 2740-2759 bbe6acac5ba729f0 066f2ed415820d60 -2760-2779 f08cac0f0fb4c05b d382922e207a7e97 +2760-2779 4f89f3064ce83b6e d0fe4c54b6564dc9 2780-2799 ce182a92235c7631 7aad80adb6b342fb -2800-2819 0431539a1dc27bb6 d1ce432bf9bc4ed8 +2800-2819 e509eb852f613541 bcc108625c0c58d9 2820-2839 712799bcc42c6179 e6c631afd83c28a2 -2840-2859 187acc4a9c67d193 8fc5797dcf5ae716 -2860-2879 c19b1678e4328d5c d6ead5ee591a4ef0 -2880-2899 9d7e728fa555a659 3e1cbfe8438a8901 -2900-2919 0ed843ecc4bca68f 961c96855bc46a77 -2920-2939 895ac99c6247fc59 f595c7372f52e985 -2940-2959 9e6e3e0fd66472bc f443fae8f776b6b2 +2840-2859 c474f41591dd5d3e 3525396be5d8bd2e +2860-2879 b54bdba568e1e578 f5a71fb2931c35fa +2880-2899 93aad789093cd996 cd3c18c91adf2b6a +2900-2919 30ea69cb9a9d6f6a c01afc46727f70d5 +2920-2939 9a5db4b416448ad6 9b58845393bf1503 +2940-2959 a71f706ece681ae9 8e1816337c0cf4ff 2960-2979 ccfaef92b67c8b08 a29d68a6482420e1 -2980-2999 7353b81bc6684408 f651d51eb9dbaa00 +2980-2999 35102d0285ad9ac3 526ead31b21b42ec 3000-3019 9a0ab906304ae3e9 2aa21fc8c0d0ea26 -3020-3039 bf3d5b73c5f6456b 64df250943e3e19e -3040-3059 3673d404c7fb94ab df105b288bceec02 +3020-3039 ac5801e4552dd8ce 774404578bd548ef +3040-3059 3fcebf290c7d6da0 fa0ee81d4be1f86a 3060-3079 6869220edc877255 3df8453d3348bf7f -3080-3099 318560bf265a0713 6054b868fd1aa4aa +3080-3099 47b7a9f3a80b3aaf 44bf883f47b64e58 3100-3119 ab7a9ad89a568877 d4e0cd1bf4f395e5 -3120-3139 c15f1f906f5cd9cc 402384c09e896183 -3140-3159 4dd8d3676a0f76fb 64f99ab2a50e7366 +3120-3139 756f8e0584318bc5 fbb7d1db8205f710 +3140-3159 29080f093dfc4d87 3c9f063bc21b2447 3160-3179 f0313ed29b76b2df 39f4de3896ff0436 -3180-3199 f4a2ef54019a9a11 52bdf158daeb8024 +3180-3199 c05fc95c6136d794 18246c9ff1568c5e 3200-3219 982685991c110eb9 809e2d8b177f0931 -3220-3239 7274408356878e0e 8bdee012561d7a6e -3240-3259 a95581e168af134b 1b94ad40ee95303d -3260-3279 f68c7e5a05d0945e ebff3bef140c0052 -3280-3299 9b654554e18c8577 e491dcbc31da78ab +3220-3239 2bf501211a23d7d6 33049d1a2ef31b63 +3240-3259 b24df1f4abfe4f76 779a3db14c20de58 +3260-3279 914f9f9b3cebc5f2 3ff8137e0b865b9d +3280-3299 49f1db970edd8dd9 0fa13d7b4ef86b1e 3300-3319 81f3c893279db890 8cd83afe6c778aab -3320-3339 9214bbd72bf95bc3 08e25e49d4e921a2 -3340-3359 54b7afb6998ad6b8 cc509bc229947fae -3360-3379 2ac48bb0c1436890 e41b244c1e7c953f +3320-3339 653c87469aaf67da c18c18ccfe2fffdb +3340-3359 e126c2aa29229924 312536f6ef2547f0 +3360-3379 caadf2de729c96fb e4970d2eafc0f697 3380-3399 e0ac63aa0438a819 7641defec5b2cdc4 -3400-3419 7bf53013c3b647c4 71e31d4d143be38c +3400-3419 148fa49915966b39 54362094e3e5dace 3420-3439 d21d7ab89c261e21 2284f112a98637f4 3440-3459 8986785d84078afb aba11235b40f1a10 3460-3479 a3871fff7ee3a317 00ca947b5e597565 -3480-3499 52f54b11e3386e5d fd6f5e5c577a9dde +3480-3499 a0a6ff0d603577c7 c16e83413144597b 3500-3519 896f05102f69aca2 84e0dfe27c056050 -3520-3539 a601026f02b0fdda 836dc48c57191316 -3540-3559 46a3bdc6544b19af d74b9d10156600a7 +3520-3539 78e4432a544cdfc1 966bde68876e3cac +3540-3559 053bbabaad351348 021a0e9d814010a8 3560-3579 f85bfacb7b79dd46 b5852fc26ca5f675 -3580-3599 6e211a5b82eb9f22 d1a211c185ec37c3 +3580-3599 bb0896a97cccc631 95284fec0e4a87dd 3600-3619 a934668f7f478d63 db7a39ebe741a172 -3620-3639 445425d851190334 e2a4c24df2d038ec +3620-3639 7f2d5173fd8aca03 cfc09ac69965a1bf 3640-3659 b2b08ad8d0acffbd 446d748f1a2b50fd -3660-3679 146755ee55b5ef28 20333853750491b4 -3680-3699 0c33c2322e366fb9 8229711e7b430801 -3700-3719 fcb5ac37c1843f82 04b8ce52ea7e84d3 +3660-3679 e496a59dc9e6cf78 f079d2ea733d7206 +3680-3699 906777b2aaf09979 a05f8ba5ef68d1bd +3700-3719 8021d268b1c46124 013cff2c7fa111cd 3720-3739 e1608a68de7441bf b1ab2a8ab9262785 3740-3759 187e19f3133b00e3 4628abd02b6fc93b 3760-3779 a15955249e18baa9 a0b350f405857591 -3780-3799 9871ff0b38455c5e 1f7c145e84d6a145 -3800-3819 9835bc7593be9cbf 785946aaba05529b +3780-3799 bf6cd2e656df3e7d 32a6cf79d139a1d7 +3800-3819 9835bc7593be9cbf 1a6be5a47788ba10 3820-3839 ca1fee48b41c2890 bf05d1c5efbc63c4 -3840-3859 b1777df0d7b4fb7c 70a5254c94411436 -3860-3879 d7d361062c48f6d0 fdf97c3c383dae7e +3840-3859 c174b010a0404c5e f9798cbb99a7969b +3860-3879 119fa6b73a3338c1 0494084493c420eb 3880-3899 02be9399d5302237 88210e74292e8c5c 3900-3919 c98b3f853c873bc0 753eddbd7591851e -3920-3939 47cc145383d3fdf8 c0ab2e1c88502cdb -3940-3959 713babbc4cf23d28 2ed7a47f3d11e809 -3960-3979 a551fb3a244e0f04 b10fa6ef246bb0de -3980-3999 1d07602893d4a382 c0769de641815cc7 -4000-4019 d0312acb434f137c b9a145bcdf2c5e7b -4020-4039 bf486b2c6e1e5b22 a4ade9bddf4666cf -4040-4059 70222d06e713fca9 f19a1fb9d514c107 -4060-4079 c9ee920c23f065ac 4d495252d8000dcd -4080-4099 21a59e3a9a2a73d0 bb7af1ef6ee63ee5 -4100-4119 8f4f862c80421c6b 0ba18c1409d4ada4 -4120-4139 adb32fb4e5b4519d db8dc40a9bac3073 +3920-3939 da476b6754ae3446 0baba0035bff015b +3940-3959 ab36db310aa8158a 14b3a77075691611 +3960-3979 027f1794db03104a 0a2904b00c8e71d7 +3980-3999 f759257256eff31f afc89cfd50056f55 +4000-4019 b0407445f0c0f422 4483fda0061979f1 +4020-4039 23d69df558a9bac7 e317451ab03d5445 +4040-4059 428232094dfea685 7ea5a009e0f80b14 +4060-4079 ee64aca81df7f525 96a4f5a0b89f52f2 +4080-4099 08e40210db249512 3b12f83e486fb3a6 +4100-4119 d5b69997ff78cc2f 20ec0d81524923bb +4120-4139 038b12e0eb745067 6284aa5fd4a513ab 4140-4159 6dc5e81b12b5d286 7c4d6f6b23e9b21a 4160-4179 d1107eab387957eb 22784fe4c02962bb -4180-4199 a0000086a56c2527 fa1388c24242470c -4200-4219 73984eb97f0d1493 3a89c9e946816b0f +4180-4199 68b35dda89fa2148 d702c9161546b93a +4200-4219 93b4144d34e1e1bc 330f8334c8fbef75 4220-4239 21e9315592104765 49a59fb15998115f -4240-4259 a6cd09460f4b5641 dc280c9b9e504c25 -4260-4279 2a1b522ddc623168 2016cd5cb2906b17 +4240-4259 83a3c76cb0dadb60 1ad3546e533f786e +4260-4279 afc13a46a11f9c54 643ef6ee918603c0 4280-4299 3325d6fe7efffd39 a64ab40fad5b2cda -4300-4319 170588be228aaa12 ca44c3b23d374a43 -4320-4339 226ef16c5164b50d 0494ba31869ee80d +4300-4319 2c6e7cdd6cb38dfe ef735982ac42fb18 +4320-4339 5edeea2de70f4957 6be04bc3474fb745 4340-4359 ca6904e0bfa42a63 e9a74c67397620c3 -4360-4379 1a39aeea3786ad4d ca39d28ebe22b6d8 -4380-4399 b77557bc30305080 34402c13ef42a82b -4400-4419 ea151743adf97aae 24000822643cb90c -4420-4439 bb2992e58714539e 823e08a1c15edda4 -4440-4459 e34ffcb1b2142279 53c9c7d2d5da0a15 -4460-4479 ba8c65e90bc9fc4f 34f3e4a3cb893cff +4360-4379 1735c316065edcca 89d50377253c244a +4380-4399 9fd6f6e6344df8c0 141a227e7d0fb70b +4400-4419 f277ade63fd98e74 d2e8495a5c283a94 +4420-4439 1a3c06c5b6dc9620 0bcf2139847b52dc +4440-4459 6f4f4501f5e08f53 ce747a5108d4db62 +4460-4479 bb2cc34d8b7a829f aa500f2fb0904dda 4480-4499 f915542aa3602eeb 329c453e98becea8 -4500-4519 9d814ba00e980505 6919b6dc30c06829 -4520-4539 0d00aa826ac66ea0 92aa80fb38d4c2c7 -4540-4559 eeec30e40e719879 4e29414fc55c0f87 +4500-4519 bcf8dc911c6794ee 8b89bb6c07ffbeaf +4520-4539 37ea918f8a516f7a 0092f54987960586 +4540-4559 0f3192f4bc58acf9 228e0bb70e710e22 4560-4579 a59c8c8cecd95029 1bdaa52fea5d55eb -4580-4599 3cd7dc9677c38f8f f2cfe936407c9c69 -4600-4619 de9b014a6682c970 60ffbcf5f58cebfb -4620-4639 07ca2755102fe22a 02ce4329f73e8a93 -4640-4659 97713de17f87a0cd 580709abff052e78 -4660-4679 743afc47731e2166 9f48a402ea7f32a6 -4680-4699 fa6df29ba8ad2ea4 7652fcf1a56176d7 -4700-4719 0accfc169cbb4375 a450d039be382fb3 +4580-4599 32086aaa5312e148 fa1fcfb1824ec147 +4600-4619 958c9fb5ec4058c9 68b20c3d188197d9 +4620-4639 c185ecb19834f1c9 55ab2e8adb9d4c91 +4640-4659 6e6f7f2e8c0508cd b961530b8603b119 +4660-4679 ba49e7c4631a5da3 cc2168755927c8d9 +4680-4699 25e96ebd7af9ad7c 14779d7147afb9cb +4700-4719 48e53b8e1634bfdc 24f28e8fa462500d 4720-4739 2765c4157850ac0c cd9108cc1ecfd9e0 -4740-4759 d53a1fa7602a0513 c6ccdef36502466f +4740-4759 960f3e6338bbcee7 ff971530ca995949 4760-4779 899832b024b60495 c805ddf365908901 -4780-4799 aae811e20ed8d7a9 ce38ddd7481a35a8 -4800-4819 bf80feace1e4d124 c16e4b94fa148f94 -4820-4839 3f618ea5f42bb232 50414f4b55dd1765 -4840-4859 7474697b64352947 e6238c66c4cad7f3 -4860-4879 fed731149a8fb1a2 b43d9dbff6c5c9bf +4780-4799 2083775b22c08a78 4fdbfffb0bab0979 +4800-4819 047415e908159297 2d6a5fb4556c5160 +4820-4839 850982f4053e31c2 b7946ffbbb35cde6 +4840-4859 e4ba494b9dd5eab2 e8639539828ac47a +4860-4879 0cd98484940640c6 62bc2301ab8fd4e9 4880-4899 907e91fa363dfff1 5e76475a237d1dd6 -4900-4919 acefe929ba1bf6e7 75ee2132a9797ca7 +4900-4919 e16d234fe23b3ec3 627e76ad230722a0 4920-4939 00e999b1cd8b21af 8d53ef86faaa27c5 -4940-4959 33b641fa1ded5f04 2efe20a9b79a4c99 -4960-4979 89c1adac8ab4e5e7 076a53adbea65da3 -4980-4999 d6911137a926d068 9311127193a9eb9b -5000-5019 fc9bbe367f817e1f ea6f46e349b35ae1 -5020-5039 fcce96eb5e5d5224 d1bd7294f2ecdd70 -5040-5059 0aea8aa01af2ffa3 def192df0ce68b97 -5060-5079 9d08fa6d4ae2edb4 266455f3fdc5c57c +4940-4959 eee3ad4e714b56db 5e49ce5b9597ffde +4960-4979 cb7f3086ee803ad3 b9fcaa61095deeba +4980-4999 169b233699a55212 b186f6f23bea6352 +5000-5019 033535d87f667548 4b5e0ec932c883fc +5020-5039 493b1fd8900b5c00 34090b39bf7105b9 +5040-5059 4db1e6ec7510f8e0 59da836fad647d06 +5060-5079 3a700fa57d9051a0 284c2fcdbcd5565b 5080-5099 6d2ed04b5107d197 4004ef67267d0a70 -5100-5119 70d692963844cd67 d203394c81229676 -5120-5139 b967c576293f59f4 71141219172ad393 -5140-5159 8464e0ba501e69c5 5ce38c2a4e6f2124 +5100-5119 b6f38fb1a4a4b251 1a94535975b4461d +5120-5139 e16f3933ba5b17a7 16d7328c82a5d880 +5140-5159 9e889880394621ec c35ba8c5768421c8 5160-5179 3304e6c6e83b77e4 cc886ccf687803a7 -5180-5199 787f7b8e06932ea5 54e539dd5249876d +5180-5199 ed29793cd6d2cfea 6f7ce175cc8cb8d4 5200-5219 d9c93081624bf463 d48214b6ddff9501 -5220-5239 61d31f9af716c6e3 3285548b6874fd79 +5220-5239 82e20114df8bb4da ba9d6980a3fc8028 5240-5259 3ad400fbcfb0c73c 7d0d16b5b5f81bd7 -5260-5279 89814391d378f20d 98b453a67f181de6 +5260-5279 b0124204abda917d ef3f5a3e8ae67684 5280-5299 56fe5b24df61f9ea faf339c85b1937a7 5300-5319 7fddda4649deea19 1278ddca31068fe0 -5320-5339 431f6ab4f03d023f c5d95199f71a3a20 +5320-5339 d000c13e57c12c61 5b05198571d574f9 5340-5359 4e213dfece0d3540 c85136fdb7f1035e -5360-5379 53a1b0533eaacce4 587eb86b2d2c646d -5380-5399 edd7d0ba1c4f56ed 76d131ff4014fbaf -5400-5419 517a1ab296f11e25 d09bd2fa5d74b35d -5420-5439 b6e5b0b12e2080e5 517071f030ac6d94 -5440-5459 fa585eaba8e238ac 46f979b52998c963 -5460-5479 45918601d413e013 f41fe4fd2e00b600 +5360-5379 ce888aa8130cc5c8 e45e9ef7a53b847f +5380-5399 e900edcb9c11f809 8f76b63ca894e456 +5400-5419 e59ee86f05b7b954 ac63b11fbb40df80 +5420-5439 d42a808c053e5235 737af0c863a9b829 +5440-5459 7de5e8f7c42f423d 68c9246c16a043cd +5460-5479 7207311b1a516a80 2f2c29a0f060c17c 5480-5499 f4c4a38bce615fad 0197c65d7d5e9507 -5500-5519 88618381193cd78e 69eb73156a3264fe +5500-5519 fdef567a2a681265 1abc999bfb51f8d5 5520-5539 2d71cd1f4b5e1a7e ea2c62f2c1d38c0e -5540-5559 dbc46201eb322ef3 d6c563b37eca9ebe +5540-5559 dd85b7984bcdfa3c 5e34915e14dedba2 5560-5579 02508d460551610b b31c0e14459a2a5b -5580-5599 ccb4b1f7ee278be9 477c83d279f7f043 +5580-5599 748a06d020cc8af0 f588783925ca4d00 5600-5619 3b28bdc009f4c967 96dd530592c20611 5620-5639 916cd9558dc06074 ca6bd2a7c3e459d4 5640-5659 24e14cdedd9bfd1f ff79a78f0c2c055e -5660-5679 bb57a45b19b00419 63b6ed2939b3de3d +5660-5679 2b50d91e0f2e895d 65872fcdf4cbbd47 5680-5699 3fc3b812649bd56e f489ab55e8959013 5700-5719 062ac098b8450ac3 044b6b33dddcc9cc -5720-5739 9c5885f35c9a31a8 63d53c5bfbfe00f4 +5720-5739 b1d9966911b13003 0c980114b18aa1c6 5740-5759 f57706c708958d95 1bd8934657451ed5 -5760-5779 0265e30369e3e53e 3fbaa977bb531eda -5780-5799 7e60425dade56712 9100e1767645a3ba -5800-5819 9568671b6d501c4f 245160b7450b2d2d -5820-5839 6d334730cddf414a f0f08e3b8a39691e +5760-5779 9f1d45f92b056a83 48f2d3f6a6c32d48 +5780-5799 395460c3d6bf2509 9146caa048dcb410 +5800-5819 07cf8ea8bb4e35b3 8ecf43ba7be610d3 +5820-5839 a1621eab8920e2f8 a103adbcee879fd0 5840-5859 269e9700efe874a5 1318eead1a80a43e 5860-5879 85b9ed84639cb2fe 89e3dbbbf5576f69 5880-5899 ea2abbe034b2a0a4 40937ad52fea4569 5900-5919 27bd9015ce0266c0 bba95be7aebb7f90 -5920-5939 ff4e6413e26667bf e22a156355b80a01 +5920-5939 eea6098e14c30e8d 846645842badded4 5940-5959 5343ec7763ca4275 4c416edc2525cbee -5960-5979 61d63cc1d6c0cb86 09c25894d7b9a3fb -5980-5999 e5923ea6ec9f3d14 6aca815450817d80 +5960-5979 c5fe4f4fa5da17fb 45a46bcfbfad869d +5980-5999 8af6e2a947835e9b 8ca9f6ee7704cc5d