From c94b8f7302733767e6cd3b69adaf92e0aa4dede7 Mon Sep 17 00:00:00 2001 From: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Date: Thu, 28 Sep 2023 10:57:06 -0700 Subject: [PATCH 01/49] Create sprint-81-summary.md (#2715) --- docs/Sprint-Review/sprint-81-summary.md | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 docs/Sprint-Review/sprint-81-summary.md diff --git a/docs/Sprint-Review/sprint-81-summary.md b/docs/Sprint-Review/sprint-81-summary.md new file mode 100644 index 000000000..439a9f9c7 --- /dev/null +++ b/docs/Sprint-Review/sprint-81-summary.md @@ -0,0 +1,55 @@ + +# Sprint 81 Summary + +08/30/23 - 09/12/23 + +Velocity: Dev (13) + +## Sprint Goal +* Continue parsing engine development for TANF Sections (02 and 04) and close out subsmission history and metadata workflows (1613/12/10). +* UX to continue regional staff and in-app messaging research, errors audit approach, and bridge onboarding to >90% of total users +* DevOps to investigate singular ClamAV (2429), resolve utlity images for CircleCI and evaluate CI/CD pipeline. + + +## Tickets +### Completed/Merged +* [#2626 improve parsing logging](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2626) +* [#1109 TANF (02) Parsing and Validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1109) +* [#2116 Container Registry Creation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2116) + +### Ready to Merge +* N/A + +### Submitted (QASP Review, OCIO Review) +* [#1613 As a developer, I need parsed file meta data (TANF Section 1)](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/board) + +### Closed (not merged) +* N/A + +## Moved to Next Sprint (Blocked, Raft Review, In Progress, Current Sprint Backlog) +### In Progress + +* [#2429 Singular ClamAV scanner](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2429) +* [#1111 TANF (04) Parsing and Validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1111) +* [#2664 (bug) file extension](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2664) +* [#2695 space-filled values update (TANF (01))](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2695) +* [#2411 As system admin, I awnt to view metadata on parsed datafiles](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2411) +* [#2536 [spike] Cat 4 validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2536) + + +### Blocked +* N/A + + +### Raft Review +* [#1610 As a user, I need information about the acceptance of my data and a link for the error report](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1610) +* [#1612 Detailed case level metadata](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1612) + + +### Demo +* Internal: + * 1109 - TANF Sec (02) + * 2626 - Parsing logging enhancements + + + From 8289c015dc9aa9992cfc23cb731645fbbaf8fc69 Mon Sep 17 00:00:00 2001 From: raftmsohani <97037188+raftmsohani@users.noreply.github.com> Date: Thu, 28 Sep 2023 14:46:59 -0400 Subject: [PATCH 02/49] DB-drop-and-reset-write-down (#2710) * added md file for dropping DB * added section for db_backup & merged into README * Update CloudFoundry-DB-Connection.md --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- .../CloudFoundry-DB-Connection.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/docs/Technical-Documentation/CloudFoundry-DB-Connection.md b/docs/Technical-Documentation/CloudFoundry-DB-Connection.md index 3a72e28e7..c7ca0efe8 100644 --- a/docs/Technical-Documentation/CloudFoundry-DB-Connection.md +++ b/docs/Technical-Documentation/CloudFoundry-DB-Connection.md @@ -23,3 +23,36 @@ From [this github](https://github.com/cloud-gov/cf-service-connect) which has so > `cf connect-to-service tdp-backend- tdp-db-dev` + +# How to DROP existing DB and Recreate a fresh DB + +### Connecting to DB service +First step is to connect to the instance DB (see above). + +#### Optional: DB backup +Before deleting the DB and recreating a fresh DB, you might want to create a backup from the existing data in case you decide to revert the DB changes back. + +For creating a DB backup, please see: `/tdpservice/scheduling/BACKUP_README.md` + +#### Drop and Recreate + +e.g: +>`cf connect-to-service tdp-backend-qasp tdp-db-dev` + +After connection to the DB is made (the step above will make a psql connection), then the following Postgres commands have to run: + +1. List the DBs: `\l` +2. Potgres does not _DROP_ a database when you are connected to the same DB. As such, you will have to connect to a different DB using command: +>`\c {a_database}` + + A good candiadate is: +>`\c postgres` +3. find the associated DB name with instance. E.g: `tdp_db_dev_qasp` +4. use the following command to delete the DB: +>`DROP DATABASE {DB_NAME}` +5. use the following command to create the DB: +>`CREATE DATABASE {DB_NAME}` + +After the DB is created, since the database is cinoketely empty, we will need to redeploy the app again to create tables (or alternatively we can restore a good backup), and then we should run populate stt command to add STT data to the empty DB + +>`./manage.py populatestts` From fb6cc5f847ad4c2a9e670e3a2ad361af1c9f3ef8 Mon Sep 17 00:00:00 2001 From: jtimpe <111305129+jtimpe@users.noreply.github.com> Date: Fri, 29 Sep 2023 11:56:31 -0400 Subject: [PATCH 03/49] Feature/1111 tanf section 4 (#2657) * - ADding t2 schema * - small fixes to naming - added t2.py - Updating var names to match field names * - Added new doc for T2 - Updated model fo rT2 - Added active parse function * - Added T3 schema defs * - Fixing most lint errors * - Updated T3 to multirow record * - Added unit test and data files - updated field names * - Updating var names to conform to DB max var name length * - Updating based on unit test failure * - adding datafile * - Adding unit tests for t2 and t3 * - Fixed field types - Updated test file * - Removing many migrations to consolodate into one migration * Revert "- Removing many migrations to consolodate into one migration" This reverts commit 1455ae4d334f72e250405803d61d26c0a894e886. * - Resolved test issues after merge * - Resolve lint errors * - Merged 1113.2 * - Removed unnecessary file * - Rename model fields - Combined migrations * - fixed spelling in test * - Fixed lint errors * rm commented validators * - Updated schema newlines to be consistent * - Updated field names - Updated tests - Updated migration * - consolodating migrations * - Updated readme and backup script * - Updated parse logic to batch create records * - Fixed lint errors * - Batching record serialization * - Updated parse logic * - Adding big s1 datafile * - fixing lint errors * - Removing test to see if its causing weird failure * - Updating based on comments - Removing big file since circi cant handle it * - fixing error in update method * - fixing error in update * - Removed extraneous seek * - updating ignore to ignore patch files * - Made evaluate_trailer pure/immutable * Revert "- Removing test to see if its causing weird failure" This reverts commit 64b78b737c97fb9bfa70217ff70ccffea8d85429. * - Use custom transactions while parsing - Handle transaction rollback on parse failure/error - Update tests to use transaction logic - Created new decorator to rollback database when assertion error is hit - Making elastic search log level configurable - Added test for inter parse rollback * - updated store logic to one liner - updated decorator to catch all exceptions - updated tests * - removed function - renamed test * - refactored multirecord schema to be a schema manager instead - updated parse functions to use the new layout - updated bulk create to manage batch size * - Name update for clarity * - Fix lint errors * - Changing batch size to avoid crash in circi * - Updated based on review - Updated tests to reflect line number * - Updated based on review/OH - Added extra transaction safety * - Updated view to show latest datafiles - Added admin filter to show newest or all datafile records - Updated indices to allow easier elastic queries * - Updated based on review comments * - Updated based on feedback for preparse error handling - updated tests * - Updated search indices to have parent FK * - Fix lint errors * - Updated submission tests - Moved create_datafile to util * - fix lint errors * - removing frontend filtering * - addding datafile to admin model * Revert "- addding datafile to admin model" This reverts commit 35a6f24c36c3a4c00ddcfc40f20833530b0199f4. * - Fixed issue where datafile FK wasnt populating - Regenerated migration * - Readding datafile back to admin view now that the error is resolved * - adding datafile back * Revert "- Readding datafile back to admin view now that the error is resolved" This reverts commit 2807425059fd1b5b355edfb16d30d170cf869d7b. * - Removed unnecessary fields - Updated dependencies - Updated filter * - Updated document to include required fields * - Moved datafile reference to avoid confusion * - Updating based on comments. - Added base class to keep things a little more DRY * - Refactored parsing to avoid custom transactions by leveraging the FK on the records. Rollbacks are a lot slower now, but hopefully that will happen much less versus successful parses. * - small optimization for the rollback * - Fix lint errors * - Removing commented code * - Installing build essentials * Revert "- Installing build essentials" This reverts commit 782a5f7d687e60965a9100520f027b9678dbac35. * - adding setup tools and wheel * Revert "- adding setup tools and wheel" This reverts commit f529728811fba242132b7c42f9e9e09d6037fa70. * - Updating dependencies to get around pep issue * - Pin factoryboy - fix lint error * - Updating manifest * - Added EncryptedField class - Updated schema's - Updated datafiles since all are encrypted * - Fix lint errors * - Added decryption for ssp * - Making the encrypted check stronger * - Added section two models, schemas, and an initial test * - Allowing fields to be nullable * - add missing field * - Consolodating migrations * - Consolodate migration - Add tests * - Added encrypted field * - Refactored fields and rowschema into seperate files - Updated encrypted field to take decryption function * - fix lint errors * - Fixed file spacing * - fix imports - fix lint errors * - Fix import error * - Fix failing test * - Revert erroneous change * - Updating item numbers * - Fixed item numbers * - Updating to accomodate item number as string * - Removed erroneous update that was causing error - Fixed whitespace in datafiles * - White space error * - Resolved error * - Fixing test * - fix lint errors * - Added field validators for T4/T5 * - Added cat3 validators * - Resolve lint and unit test errors * - small optimization to validator * - Added tests for cat3 validators for T5 record * - Fix lint errors * - updated fields to correct types * - update race/ethnicity * - updated tests post merge - added check in make_validator to just return false if the value is None * - Updated based on review feedback * - Fix lint error * - Updating to the correct types * - Resolve conflicts * - Moving field updates to seperate migration to see if they take place * Revert "- Moving field updates to seperate migration to see if they take place" This reverts commit a3214f23e0bd9cc4cc37ad40e63ae0c98b4ea64b. * - Revert migration 15 to original state - Generate new migration for field alterations * - Merged base branch and updated tests/factories * - Fixed test * - Fixed field names to correspond to model * - Remove duplicate function - Update ssn validator - Removed asserts with large number of parse errors * t7 model, index changes * add t7 to parser * update model mapping test * add s3-s10 * - Remove print statemtnt * - Resolved filter issue that made it seem like records werent being created - Added filter to remaining records * - fix lint errors * - correct form merge conflict * - Added specific validators to avoid duplication - Updated naming of validators * TANF Section 3 Parsing/Validation (#2649) * - Updated to support parsing section 3 data * - Added validators and tests for T6 record * - resolve lint errors * - Quick rename * - Update fields in test * - Fixed conflict * - Fix error from merge conflict * - Updated to create RPT_MONTH_YEAR from CALENDAR_QUARTER - Updated tests * - Added new validators for field change * - Remove debug code * - Genericize TransformField - Update all schemas to use TransformField - Move transforms to seperate file - Fix lint errors * - put kwargs in correct spot * - Very minor change to avoid setting field unnecessarily on all TransformFields * - Updated validator to call out name of field versus the value - Updated tests * - Fix lint * - Calling super to avoid duplicate code * - Added validators for transformed field * - Updating based on merge * - Fixed remaining merge conflicts * - Fix lint errors * - update error messages based on validator updates * - Corrected validator * - Resolved bug causing file to think it was encrytped after multiple submissions and changing the encryption header in between submissions * - UPdated migration - Updated test * - Added transform fields - UPdated migrations * - Stratified T7 to one record per month per section indicator and stratum. * - Updated tests * - Fix test * - Add T7 factory * - Fix lint error * - Remove test class until cat three validators exist * - fix lint errors * - Fixing colliding migration * - Generating schemas instead of defining * - Fix lint errors * - Updated based on review feedback * rm 17/18 * remake migration 18 * fix merge error * fix merge error * fix merge error * labels are stuck * rm * dont compute aggregates for section 3/4 * move save * Update tdrs-backend/tdpservice/parsers/test/factories.py Co-authored-by: Alex P. <63075587+ADPennington@users.noreply.github.com> * enhance t7 modeladmin * fix rpt_month_year off by 1 * lint * differentiate item 6a/6b/67 in t7 records --------- Co-authored-by: elipe17 Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Eric Lipe <125676261+elipe17@users.noreply.github.com> --- tdrs-backend/tdpservice/parsers/parse.py | 44 ++++++++++++ .../parsers/schema_defs/tanf/__init__.py | 2 + .../tdpservice/parsers/schema_defs/tanf/t7.py | 65 +++++++++++++++++ .../parsers/test/data/ADS.E2J.FTP4.TS06 | 3 + .../tdpservice/parsers/test/factories.py | 14 ++++ .../tdpservice/parsers/test/test_parse.py | 31 +++++++- tdrs-backend/tdpservice/parsers/util.py | 2 +- .../tdpservice/scheduling/parser_task.py | 6 +- .../tdpservice/search_indexes/admin/tanf.py | 11 ++- .../search_indexes/documents/tanf.py | 13 ++-- .../migrations/0018_auto_20230920_1846.py | 71 +++++++++++++++++++ .../tdpservice/search_indexes/models/tanf.py | 16 ++--- .../search_indexes/test/test_model_mapping.py | 40 +++++------ 13 files changed, 272 insertions(+), 46 deletions(-) create mode 100644 tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py create mode 100644 tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.FTP4.TS06 create mode 100644 tdrs-backend/tdpservice/search_indexes/migrations/0018_auto_20230920_1846.py diff --git a/tdrs-backend/tdpservice/parsers/parse.py b/tdrs-backend/tdpservice/parsers/parse.py index e8e4a3121..409d239b8 100644 --- a/tdrs-backend/tdpservice/parsers/parse.py +++ b/tdrs-backend/tdpservice/parsers/parse.py @@ -251,6 +251,50 @@ def manager_parse_line(line, schema_manager, generate_error, is_encrypted=False) ) ])] + +def get_schema_manager_options(program_type): + """Return the allowed schema options.""" + match program_type: + case 'TAN': + return { + 'A': { + 'T1': schema_defs.tanf.t1, + 'T2': schema_defs.tanf.t2, + 'T3': schema_defs.tanf.t3, + }, + 'C': { + 'T4': schema_defs.tanf.t4, + 'T5': schema_defs.tanf.t5, + }, + 'G': { + 'T6': schema_defs.tanf.t6, + }, + 'S': { + 'T7': schema_defs.tanf.t7, + }, + } + case 'SSP': + return { + 'A': { + 'M1': schema_defs.ssp.m1, + 'M2': schema_defs.ssp.m2, + 'M3': schema_defs.ssp.m3, + }, + 'C': { + # 'M4': schema_options.m4, + # 'M5': schema_options.m5, + }, + 'G': { + # 'M6': schema_options.m6, + }, + 'S': { + # 'M7': schema_options.m7, + }, + } + # case tribal? + return None + + def get_schema_manager(line, section, program_type): """Return the appropriate schema for the line.""" line_type = line[0:2] diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/__init__.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/__init__.py index e82db47b6..7c1997236 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/__init__.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/__init__.py @@ -4,6 +4,7 @@ from .t4 import t4 from .t5 import t5 from .t6 import t6 +from .t7 import t7 t1 = t1 t2 = t2 @@ -11,3 +12,4 @@ t4 = t4 t5 = t5 t6 = t6 +t7 = t7 diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py new file mode 100644 index 000000000..2fcb4e0fd --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py @@ -0,0 +1,65 @@ +"""Schema for TANF T7 Row.""" + +from ...util import SchemaManager +from ...fields import Field, TransformField +from ...row_schema import RowSchema +from ...transforms import calendar_quarter_to_rpt_month_year +from ... import validators +from tdpservice.search_indexes.models.tanf import TANF_T7 + +schemas = [] + +validator_index = 7 +section_ind_index = 7 +stratum_index = 8 +families_index = 10 +for i in range(1, 31): + month_index = (i - 1) % 3 + sub_item_labels = ['A', 'B', 'C'] + families_value_item_number = f"6{sub_item_labels[month_index]}" + + schemas.append( + RowSchema( + model=TANF_T7, + quiet_preparser_errors=i > 1, + preparsing_validators=[ + validators.notEmpty(0, 7), + validators.notEmpty(validator_index, validator_index + 24), + ], + postparsing_validators=[], + fields=[ + Field(item="0", name="RecordType", type='string', startIndex=0, endIndex=2, + required=True, validators=[]), + Field(item="3", name='CALENDAR_QUARTER', type='number', startIndex=2, endIndex=7, + required=True, validators=[validators.dateYearIsLargerThan(1998), + validators.quarterIsValid()]), + TransformField( + transform_func=calendar_quarter_to_rpt_month_year(month_index), + item="3A", + name='RPT_MONTH_YEAR', + type='number', + startIndex=2, + endIndex=7, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid() + ] + ), + Field(item="4", name='TDRS_SECTION_IND', type='string', startIndex=section_ind_index, + endIndex=section_ind_index + 1, required=True, validators=[validators.oneOf(['1', '2'])]), + Field(item="5", name='STRATUM', type='string', startIndex=stratum_index, + endIndex=stratum_index + 2, required=True, validators=[validators.isInStringRange(1, 99)]), + Field(item=families_value_item_number, name='FAMILIES_MONTH', type='number', startIndex=families_index, + endIndex=families_index + 7, required=True, validators=[validators.isInLimits(0, 9999999)]), + ] + ) + ) + + index_offset = 0 if i % 3 != 0 else 24 + validator_index += index_offset + section_ind_index += index_offset + stratum_index += index_offset + families_index += 7 if i % 3 != 0 else 10 + +t7 = SchemaManager(schemas=schemas) diff --git a/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.FTP4.TS06 b/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.FTP4.TS06 new file mode 100644 index 000000000..5c344cf42 --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.FTP4.TS06 @@ -0,0 +1,3 @@ +HEADER20204S06 TAN1 N +T720204101006853700680540068454103000312400037850003180104000347400036460003583106000044600004360000325299000506200036070003385202000039100002740000499 +TRAILER0000001 \ No newline at end of file diff --git a/tdrs-backend/tdpservice/parsers/test/factories.py b/tdrs-backend/tdpservice/parsers/test/factories.py index 8eb309b60..b12d3c5ad 100644 --- a/tdrs-backend/tdpservice/parsers/test/factories.py +++ b/tdrs-backend/tdpservice/parsers/test/factories.py @@ -335,3 +335,17 @@ class Meta: NUM_BIRTHS = 1 NUM_OUTWEDLOCK_BIRTHS = 1 NUM_CLOSED_CASES = 1 + +class TanfT7Factory(factory.django.DjangoModelFactory): + """Generate TANF T7 record for testing.""" + + class Meta: + """Hardcoded meta data for TANF_T7.""" + + model = "search_indexes.TANF_T7" + + CALENDAR_QUARTER = 20204 + RPT_MONTH_YEAR = 202011 + TDRS_SECTION_IND = '1' + STRATUM = '01' + FAMILIES_MONTH = 1 diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index fd794280b..9c785f79f 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -4,7 +4,7 @@ import pytest from .. import parse from ..models import ParserError, ParserErrorCategoryChoices, DataFileSummary -from tdpservice.search_indexes.models.tanf import TANF_T1, TANF_T2, TANF_T3, TANF_T4, TANF_T5, TANF_T6 +from tdpservice.search_indexes.models.tanf import TANF_T1, TANF_T2, TANF_T3, TANF_T4, TANF_T5, TANF_T6, TANF_T7 from tdpservice.search_indexes.models.ssp import SSP_M1, SSP_M2, SSP_M3 from .factories import DataFileSummaryFactory from tdpservice.data_files.models import DataFile @@ -833,3 +833,32 @@ def test_parse_tanf_section3_file(tanf_section3_file): assert first.NUM_CLOSED_CASES == 3884 assert second.NUM_CLOSED_CASES == 3881 assert third.NUM_CLOSED_CASES == 5453 + +@pytest.fixture +def tanf_section4_file(stt_user, stt): + """Fixture for ADS.E2J.FTP4.TS06.""" + return util.create_test_datafile('ADS.E2J.FTP4.TS06', stt_user, stt, "Stratum Data") + +@pytest.mark.django_db() +def test_parse_tanf_section4_file(tanf_section4_file): + """Test parsing TANF Section 4 submission.""" + parse.parse_datafile(tanf_section4_file) + + assert TANF_T7.objects.all().count() == 18 + + parser_errors = ParserError.objects.filter(file=tanf_section4_file) + assert parser_errors.count() == 0 + + t7_objs = TANF_T7.objects.all().order_by('FAMILIES_MONTH') + + first = t7_objs.first() + sixth = t7_objs[5] + + assert first.RPT_MONTH_YEAR == 202011 + assert sixth.RPT_MONTH_YEAR == 202012 + + assert first.TDRS_SECTION_IND == '2' + assert sixth.TDRS_SECTION_IND == '2' + + assert first.FAMILIES_MONTH == 274 + assert sixth.FAMILIES_MONTH == 499 diff --git a/tdrs-backend/tdpservice/parsers/util.py b/tdrs-backend/tdpservice/parsers/util.py index accc36269..073b7b8d8 100644 --- a/tdrs-backend/tdpservice/parsers/util.py +++ b/tdrs-backend/tdpservice/parsers/util.py @@ -129,7 +129,7 @@ def get_schema_options(program, section, query=None, model=None, model_name=None 'S': { 'section': DataFile.Section.STRATUM_DATA, 'models': { - # 'T7': schema_defs.tanf.t7, + 'T7': schema_defs.tanf.t7, } } }, diff --git a/tdrs-backend/tdpservice/scheduling/parser_task.py b/tdrs-backend/tdpservice/scheduling/parser_task.py index b1e5f8d5c..f9fab7f6f 100644 --- a/tdrs-backend/tdpservice/scheduling/parser_task.py +++ b/tdrs-backend/tdpservice/scheduling/parser_task.py @@ -23,6 +23,10 @@ def parse(data_file_id): dfs = DataFileSummary.objects.create(datafile=data_file, status=DataFileSummary.Status.PENDING) errors = parse_datafile(data_file) dfs.status = dfs.get_status() - dfs.case_aggregates = case_aggregates_by_month(data_file, dfs.status) + + if "Case Data" in data_file.section: + dfs.case_aggregates = case_aggregates_by_month(data_file, dfs.status) + dfs.save() + logger.info(f"Parsing finished for file -> {repr(data_file)} with status {dfs.status} and {len(errors)} errors.") diff --git a/tdrs-backend/tdpservice/search_indexes/admin/tanf.py b/tdrs-backend/tdpservice/search_indexes/admin/tanf.py index 88bce804f..af3429695 100644 --- a/tdrs-backend/tdpservice/search_indexes/admin/tanf.py +++ b/tdrs-backend/tdpservice/search_indexes/admin/tanf.py @@ -109,12 +109,17 @@ class TANF_T7Admin(admin.ModelAdmin): """ModelAdmin class for parsed T7 data files.""" list_display = [ - 'record', - 'rpt_month_year', + 'RecordType', + 'CALENDAR_QUARTER', + 'RPT_MONTH_YEAR', + 'TDRS_SECTION_IND', + 'STRATUM', + 'FAMILIES_MONTH', 'datafile', ] list_filter = [ + 'CALENDAR_QUARTER', CreationDateFilter, - 'rpt_month_year', + 'RPT_MONTH_YEAR', ] diff --git a/tdrs-backend/tdpservice/search_indexes/documents/tanf.py b/tdrs-backend/tdpservice/search_indexes/documents/tanf.py index aba080ff1..c613c50a2 100644 --- a/tdrs-backend/tdpservice/search_indexes/documents/tanf.py +++ b/tdrs-backend/tdpservice/search_indexes/documents/tanf.py @@ -343,11 +343,10 @@ class Django: model = TANF_T7 fields = [ - 'record', - 'rpt_month_year', - 'fips_code', - 'calendar_quarter', - 'tdrs_section_ind', - 'stratum', - 'families', + "RecordType", + "CALENDAR_QUARTER", + "RPT_MONTH_YEAR", + "TDRS_SECTION_IND", + "STRATUM", + "FAMILIES_MONTH", ] diff --git a/tdrs-backend/tdpservice/search_indexes/migrations/0018_auto_20230920_1846.py b/tdrs-backend/tdpservice/search_indexes/migrations/0018_auto_20230920_1846.py new file mode 100644 index 000000000..46390d523 --- /dev/null +++ b/tdrs-backend/tdpservice/search_indexes/migrations/0018_auto_20230920_1846.py @@ -0,0 +1,71 @@ +# Generated by Django 3.2.15 on 2023-09-20 18:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('search_indexes', '0017_auto_20230914_1720'), + ] + + operations = [ + migrations.RemoveField( + model_name='tanf_t7', + name='calendar_quarter', + ), + migrations.RemoveField( + model_name='tanf_t7', + name='families', + ), + migrations.RemoveField( + model_name='tanf_t7', + name='fips_code', + ), + migrations.RemoveField( + model_name='tanf_t7', + name='record', + ), + migrations.RemoveField( + model_name='tanf_t7', + name='rpt_month_year', + ), + migrations.RemoveField( + model_name='tanf_t7', + name='stratum', + ), + migrations.RemoveField( + model_name='tanf_t7', + name='tdrs_section_ind', + ), + migrations.AddField( + model_name='tanf_t7', + name='CALENDAR_QUARTER', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AddField( + model_name='tanf_t7', + name='FAMILIES_MONTH', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='tanf_t7', + name='RPT_MONTH_YEAR', + field=models.IntegerField(null=True), + ), + migrations.AddField( + model_name='tanf_t7', + name='RecordType', + field=models.CharField(max_length=156, null=True), + ), + migrations.AddField( + model_name='tanf_t7', + name='STRATUM', + field=models.CharField(max_length=2, null=True), + ), + migrations.AddField( + model_name='tanf_t7', + name='TDRS_SECTION_IND', + field=models.CharField(max_length=1, null=True), + ), + ] diff --git a/tdrs-backend/tdpservice/search_indexes/models/tanf.py b/tdrs-backend/tdpservice/search_indexes/models/tanf.py index dd61c84c9..9e31fffe2 100644 --- a/tdrs-backend/tdpservice/search_indexes/models/tanf.py +++ b/tdrs-backend/tdpservice/search_indexes/models/tanf.py @@ -342,15 +342,13 @@ class TANF_T7(models.Model): related_name='t7_parent' ) - record = models.CharField(max_length=156, null=False, blank=False) - rpt_month_year = models.IntegerField(null=False, blank=False) - fips_code = models.CharField(max_length=100, null=False, blank=False) - - calendar_quarter = models.IntegerField(null=False, blank=False) - tdrs_section_ind = models.CharField( + RecordType = models.CharField(max_length=156, null=True, blank=False) + CALENDAR_QUARTER = models.IntegerField(null=True, blank=True) + RPT_MONTH_YEAR = models.IntegerField(null=True, blank=False) + TDRS_SECTION_IND = models.CharField( max_length=1, - null=False, + null=True, blank=False ) - stratum = models.CharField(max_length=2, null=False, blank=False) - families = models.IntegerField(null=False, blank=False) + STRATUM = models.CharField(max_length=2, null=True, blank=False) + FAMILIES_MONTH = models.IntegerField(null=True, blank=False) diff --git a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py index cd762eb56..e8e9eb81f 100644 --- a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py +++ b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py @@ -2,7 +2,6 @@ import pytest from faker import Faker -from django.db.utils import IntegrityError from tdpservice.search_indexes import models from tdpservice.search_indexes import documents from tdpservice.parsers.util import create_test_datafile @@ -346,26 +345,27 @@ def test_can_create_and_index_tanf_t7_submission(test_datafile): submission = models.tanf.TANF_T7() submission.datafile = test_datafile - submission.record = record_num - submission.rpt_month_year = 1 - submission.fips_code = '2' - submission.calendar_quarter = 1 - submission.tdrs_section_ind = '1' - submission.stratum = '1' - submission.families = 1 + submission.RecordType = record_num + submission.CALENDAR_YEAR = 2020 + submission.CALENDAR_QUARTER = 1 + submission.TDRS_SECTION_IND = '1' + submission.STRATUM = '01' + submission.FAMILIES_MONTH_1 = 47655 + submission.FAMILIES_MONTH_2 = 81982 + submission.FAMILIES_MONTH_3 = 9999999 submission.save() # No checks her because t7 records can't be parsed currently. - # assert submission.id is not None + assert submission.id is not None - # search = documents.tanf.TANF_T7DataSubmissionDocument.search().query( - # 'match', - # record=record_num - # ) - # response = search.execute() + search = documents.tanf.TANF_T7DataSubmissionDocument.search().query( + 'match', + RecordType=record_num + ) + response = search.execute() - # assert response.hits.total.value == 1 + assert response.hits.total.value == 1 @pytest.mark.django_db @@ -373,17 +373,9 @@ def test_does_not_create_index_if_model_creation_fails(): """Index creation shouldn't happen if saving a model errors.""" record_num = fake.uuid4() - with pytest.raises(IntegrityError): - submission = models.tanf.TANF_T7.objects.create( - record=record_num - # leave out a bunch of required fields - ) - - assert submission.id is None - search = documents.tanf.TANF_T7DataSubmissionDocument.search().query( 'match', - record=record_num + RecordType=record_num ) response = search.execute() From 8de88cd7704e1d8262fbee2dac21fdc6beb13c3e Mon Sep 17 00:00:00 2001 From: jtimpe <111305129+jtimpe@users.noreply.github.com> Date: Wed, 4 Oct 2023 14:06:36 -0400 Subject: [PATCH 04/49] Feature/1610.2 frontend parsing status (#2622) * saving state real quick * finishing merge with latest * Missed old test script * Added new test, more cleanup * Updating unit tests in DFS, preparing for 1610 * Merging in Jan's 1610 code for parserError useful-ness * Revert "Merging in Jan's 1610 code for parserError useful-ness" This reverts commit c5796da69d0e9a6d356057550378d536e2be5f8b. * update to test to use dfs fixture * saving state before new 1610 merge * Resolving merge conflicts with 1610. * Linting changes and comparing to 1610 * Some unit test linting but inherited 1610 issues * Re-ordering job to run tests vs lint first. * Updates to linting and unit tests. * Fixing linting. * Update tdrs-backend/setup.cfg * updates per PR. * Excluding trailers for rejection * VSCode merge resolution is garbage. * Fixing precheck for not implemented types * Updating to error-handle not implemented schema types * - Updated view to show latest datafiles - Added admin filter to show newest or all datafile records - Updated indices to allow easier elastic queries * - Updated search indices to have parent FK * - Fix lint errors * - Updated submission tests - Moved create_datafile to util * - fix lint errors * - removing frontend filtering * - addding datafile to admin model * Revert "- addding datafile to admin model" This reverts commit 35a6f24c36c3a4c00ddcfc40f20833530b0199f4. * - Fixed issue where datafile FK wasnt populating - Regenerated migration * - Readding datafile back to admin view now that the error is resolved * - adding datafile back * Revert "- Readding datafile back to admin view now that the error is resolved" This reverts commit 2807425059fd1b5b355edfb16d30d170cf869d7b. * - Removed unnecessary fields - Updated dependencies - Updated filter * - Updated document to include required fields * - Fixed failing test * add adminUrl to deployment cypress overrides * Adding "beta" banners to relevant error report sections (#2522) * Update views.py * Update views.py * Update SubmissionHistory.jsx * Update SubmissionHistory.test.js * Apply suggestions from code review Co-authored-by: Miles Reiter * lint fixes --------- Co-authored-by: Miles Reiter Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: andrew-jameson * Create sprint-73-summary.md (#2565) * hotfix for large file sizes (#2542) * hotfix for large file sizes * apply timeouts/req limits to dev * filter identity pages from scan * IGNORE sql injection --------- Co-authored-by: Jan Timpe Co-authored-by: mo sohani Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> * updating validation error language * accidentally included coding challenge * rm comments * 2550 deactivation email link (#2557) * - updated nginx buildpack * - specifying different nginx version * - Updating changelog * - added script to update certain apps in cf - added workflow for each environment in circi * - fixed base config * - fixing jobs * - Updated based on feedback in OH * - Updating defaults * - Removing defaults * - Fixing indent * - Adding params to config * test * test * - updating work dir * - Adding checkout * - adding cf check * - logging into cf * - update cf check to install required binary * - removing unnecessary switch * - Forcing plugin installation * - test installing plugin from script also * - Adding url to email * - test code for sandbox * - using my email * Revert "Merge branch 'update-cf-os' into 2551-deactivation-email-link" This reverts commit e963b9df48dd1f72ca0c5b192c979bac11851d11, reversing changes made to cc9cf81e9d76c42f51ffd5e102f6027d3eb5e645. * Revert "- using my email" This reverts commit cc9cf81e9d76c42f51ffd5e102f6027d3eb5e645. * Revert "- test code for sandbox" This reverts commit 06037747197d17ed8e63b086fcfcf048ecb50dc4. --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Update README.md (#2577) Add ATO Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Create 2023, Spring - Testing CSV & Excel-based error reports.md * Update README.md * Updating deliverable links (#2584) * User viewset not returning/duplicating users (#2573) * - Fixed issue not allowing pagination to work locally with nginx - Added ordering to user field to fix duplicates issue * - fix lint error * - Removing ID check since we cannot guarantee that the uuid that is generated per test run will be lexigraphically consistent --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Update cf os (#2523) * - updated nginx buildpack * - specifying different nginx version * - Updating changelog * - added script to update certain apps in cf - added workflow for each environment in circi * - fixed base config * - fixing jobs * - Updated based on feedback in OH * - Updating defaults * - Removing defaults * - Fixing indent * - Adding params to config * test * test * - updating work dir * - Adding checkout * - adding cf check * - logging into cf * - update cf check to install required binary * - removing unnecessary switch * - Forcing plugin installation * - test installing plugin from script also * - Adding new dependencies * - adding package * - fixing broken install * - fixing libs * - using correct command * - gettign correct version of libc * - trying to upgrade libs * - testing * - Updated README and script * Revert "- Updated README and script" This reverts commit 92697b3e53d1fd87b8d3e7995abb9093aa26e307. * - Removed unnecessary circi stuff - Removed script - Updated docs to callout updating secondary apps * - Correct spelling error --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Item Number Mismatch (#2578) * - Updated schemas and models to reflect correct item numbers of fields * - Revert migration * - Updated header/trailer item numbers * - Fixed item numbers off by one errors --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * pipeline filtering (#2538) * pipeline changes that filter based on paths and branches. circle ci tracks specified branches in order to keep current functionality on HHS side. * updated syntax to be in line with build-all.yml * removed comma * WIP build flow docs * added Architecture Decision Record for the change to pipeline workflows * corrected file type of doc to .md --------- Co-authored-by: George Hudson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Hotfix Devops/2457 path filtering for documentation (#2597) * pipeline changes that filter based on paths and branches. circle ci tracks specified branches in order to keep current functionality on HHS side. * updated syntax to be in line with build-all.yml * removed comma * WIP build flow docs * added Architecture Decision Record for the change to pipeline workflows * corrected file type of doc to .md * build and test all on PRs even for documentation --------- Co-authored-by: George Hudson * Create sprint-74-summary.md (#2596) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * added URL filters (#2580) * added URL filters * allow github to trigger owasp and label deploys (#2601) Co-authored-by: George Hudson --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> Co-authored-by: George Hudson Co-authored-by: George Hudson * Create sprint-75-summary.md (#2608) * Create sprint-76-summary.md (#2609) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * - Resolved failing tests * - Corrected merge thrash * - Using randbits to generate pk to get around confilcting sequence pks * Revert "- Using randbits to generate pk to get around confilcting sequence pks" This reverts commit ac9b0659a62f64c4114c41faf0baa659a92be07c. * - Updating region in fixture instead of factory - letting django handle transaction for test * - Moved datafile reference to avoid confusion * pushing up incomplete codebase * Other unit tests now have passed w/ good error handling * Working tests, need to get setup for case aggregates populating via DB * - Updated queries - Added helper function - Need to merge in 2579 for queries to work * minor improvement to month2int * - Fixing most merge errors * - Fixing functions * - Updated queries based on generic relation * - Updated queries to count by case number instead of record number * - Added route - Updated task to create dfs * - updated tests to include dfs * Cleaning up most comments that are no longer necessary and fixed lint issues. * making minor updates, still broken tests. * updating pipfile.lock and rebuild image resolved test issues * Reorganizing tests, still failing in test_parse.py * deleted summary file, split into other test scripts. * Fixed missing self reference. * Linting fixes. * Found reference failure in deployed env. * Removing extra returns for missing record type. * lint fix * Addressed invocation of datafile for failing test * lint update for whitespace * Intermediary commit, broken test * add reverse relation * frontend summary status * new assignemnts in util * - updated rejected query to correctly count objs * - Fixing most tests * - Fixed user error. Swapped numbers by accident. * - make region None to avoid PK collision * - Fix lint errors * - Updating to avoid warning * add acceptance icon * add reverse relationship to summary model * vscode merge conflict resolution (#2623) * auto-create the external network * didn't stage commit properly * checking diffs, matching 1613.2 * doesn't work in pipeline. must be cached local * re-commenting in unit test * lint failures fixed --------- Co-authored-by: andrew-jameson * add a pending status * add acceptance status tests * update warning icon * rm old assert * update rejected icon * url change per me, want pipeline to run e2e * Upgraded to querysets, fix PR comments, PE str * missing : not caught locally * Feat/1613 merge 2 (#2650) * Create sprint-78-summary.md (#2645) * Missing/unsaved parser_error for record_type * removing redundant tests * Hopefully resolved on unit tests and lint --------- Co-authored-by: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Co-authored-by: andrew-jameson * icontains * tests * Changing dict structure per 1612. * fixed tests and lint issues, parse is too complex * schema_manager replaces schema check * Saving state prior to merge-conflict. * Adopting latest manager, removing old error style. * Commented out t6 line during Office hours * minor reference update * Acclimating to schemaManager * lint-fix isinstance * syntax mistake with isinstance * Apply suggestions from code review * reverting search_index merge artifacts. * adjusting for removing unused "get-schema()" * whitespace lint * Feedback from Jan * Ensuring tests run/work. * Ensure we have leading zero in rptmonthyear. * Minor lint fix for exception logging * fix migration * add backend partially accepted status * add frontend partially accepted status * add partially accepted test * rm accidental commit * rm unused variable * resolving merge conflict problems * fixing tests from merge conflicts. * dumb lint fix * Update tdrs-backend/tdpservice/parsers/migrations/0007_alter_datafilesummary_datafile.py * fix merge errors * fix name attr not populated for preparsing errors * include preparsing errors in row_precheck_errors status * make header precheck errors force rejected status * lint msg --------- Co-authored-by: Andrew Jameson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> Co-authored-by: andrew-jameson Co-authored-by: elipe17 Co-authored-by: Miles Reiter Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Co-authored-by: mo sohani Co-authored-by: Eric Lipe <125676261+elipe17@users.noreply.github.com> Co-authored-by: Lauren Frohlich <61251539+lfrohlich@users.noreply.github.com> Co-authored-by: Miles Reiter Co-authored-by: George Hudson Co-authored-by: George Hudson Co-authored-by: raftmsohani <97037188+raftmsohani@users.noreply.github.com> --- .../tdpservice/data_files/serializers.py | 3 + .../0002_alter_parsererror_error_type.py | 2 +- .../0008_alter_datafilesummary_datafile.py | 20 ++++++ .../0009_alter_datafilesummary_status.py | 18 ++++++ tdrs-backend/tdpservice/parsers/models.py | 9 ++- tdrs-backend/tdpservice/parsers/parse.py | 2 +- .../tdpservice/parsers/test/test_parse.py | 2 +- tdrs-backend/tdpservice/parsers/util.py | 18 +++++- .../tdpservice/scheduling/parser_task.py | 3 +- .../SubmissionHistory/SubmissionHistory.jsx | 57 ++++++++++++++++- .../SubmissionHistory.test.js | 61 ++++++++++++++++++- tdrs-frontend/src/reducers/reports.js | 2 + 12 files changed, 186 insertions(+), 11 deletions(-) create mode 100644 tdrs-backend/tdpservice/parsers/migrations/0008_alter_datafilesummary_datafile.py create mode 100644 tdrs-backend/tdpservice/parsers/migrations/0009_alter_datafilesummary_status.py diff --git a/tdrs-backend/tdpservice/data_files/serializers.py b/tdrs-backend/tdpservice/data_files/serializers.py index 3e34bd421..4977f2ebd 100644 --- a/tdrs-backend/tdpservice/data_files/serializers.py +++ b/tdrs-backend/tdpservice/data_files/serializers.py @@ -12,6 +12,7 @@ from tdpservice.security.models import ClamAVFileScan from tdpservice.stts.models import STT from tdpservice.users.models import User +from tdpservice.parsers.serializers import DataFileSummarySerializer logger = logging.getLogger(__name__) class DataFileSerializer(serializers.ModelSerializer): @@ -22,6 +23,7 @@ class DataFileSerializer(serializers.ModelSerializer): user = serializers.PrimaryKeyRelatedField(queryset=User.objects.all()) ssp = serializers.BooleanField(write_only=True) has_error = serializers.SerializerMethodField() + summary = DataFileSummarySerializer(many=False, read_only=True) class Meta: """Metadata.""" @@ -45,6 +47,7 @@ class Meta: 's3_location', 's3_versioning_id', 'has_error', + 'summary' ] read_only_fields = ("version",) diff --git a/tdrs-backend/tdpservice/parsers/migrations/0002_alter_parsererror_error_type.py b/tdrs-backend/tdpservice/parsers/migrations/0002_alter_parsererror_error_type.py index e55c856ce..5236b5c29 100644 --- a/tdrs-backend/tdpservice/parsers/migrations/0002_alter_parsererror_error_type.py +++ b/tdrs-backend/tdpservice/parsers/migrations/0002_alter_parsererror_error_type.py @@ -14,5 +14,5 @@ class Migration(migrations.Migration): model_name='parsererror', name='error_type', field=models.TextField(choices=[('1', 'File pre-check'), ('2', 'Record value invalid'), ('3', 'Record value consistency'), ('4', 'Case consistency'), ('5', 'Section consistency'), ('6', 'Historical consistency')], max_length=128), - ) + ), ] diff --git a/tdrs-backend/tdpservice/parsers/migrations/0008_alter_datafilesummary_datafile.py b/tdrs-backend/tdpservice/parsers/migrations/0008_alter_datafilesummary_datafile.py new file mode 100644 index 000000000..dc9f0b2f6 --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/migrations/0008_alter_datafilesummary_datafile.py @@ -0,0 +1,20 @@ +# Generated by Django 3.2.15 on 2023-07-20 20:50 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('data_files', '0012_datafile_s3_versioning_id'), + ('parsers', '0007_datafilesummary'), + ] + + operations = [ + migrations.AlterField( + model_name='datafilesummary', + name='datafile', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='summary', to='data_files.datafile'), + ), + ] diff --git a/tdrs-backend/tdpservice/parsers/migrations/0009_alter_datafilesummary_status.py b/tdrs-backend/tdpservice/parsers/migrations/0009_alter_datafilesummary_status.py new file mode 100644 index 000000000..dd05c0f4f --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/migrations/0009_alter_datafilesummary_status.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.15 on 2023-08-23 12:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('parsers', '0008_alter_datafilesummary_datafile'), + ] + + operations = [ + migrations.AlterField( + model_name='datafilesummary', + name='status', + field=models.CharField(choices=[('Pending', 'Pending'), ('Accepted', 'Accepted'), ('Accepted with Errors', 'Accepted With Errors'), ('Partially Accepted with Errors', 'Partially Accepted'), ('Rejected', 'Rejected')], default='Pending', max_length=50), + ), + ] diff --git a/tdrs-backend/tdpservice/parsers/models.py b/tdrs-backend/tdpservice/parsers/models.py index 0c0ccdc50..12c70a2c0 100644 --- a/tdrs-backend/tdpservice/parsers/models.py +++ b/tdrs-backend/tdpservice/parsers/models.py @@ -77,6 +77,7 @@ class Status(models.TextChoices): PENDING = "Pending" # file has been uploaded, but not validated ACCEPTED = "Accepted" ACCEPTED_WITH_ERRORS = "Accepted with Errors" + PARTIALLY_ACCEPTED = "Partially Accepted with Errors" REJECTED = "Rejected" status = models.CharField( @@ -85,7 +86,7 @@ class Status(models.TextChoices): default=Status.PENDING, ) - datafile = models.ForeignKey(DataFile, on_delete=models.CASCADE) + datafile = models.OneToOneField(DataFile, on_delete=models.CASCADE, related_name="summary") case_aggregates = models.JSONField(null=True, blank=False) @@ -100,11 +101,17 @@ def get_status(self): .exclude(error_message__icontains="trailer")\ .exclude(error_message__icontains="Unknown Record_Type was found.") + row_precheck_errors = errors.filter(error_type=ParserErrorCategoryChoices.PRE_CHECK)\ + .filter(field_name="Record_Type")\ + .exclude(error_message__icontains="trailer") + if errors is None: return DataFileSummary.Status.PENDING elif errors.count() == 0: return DataFileSummary.Status.ACCEPTED elif precheck_errors.count() > 0: return DataFileSummary.Status.REJECTED + elif row_precheck_errors.count() > 0: + return DataFileSummary.Status.PARTIALLY_ACCEPTED else: return DataFileSummary.Status.ACCEPTED_WITH_ERRORS diff --git a/tdrs-backend/tdpservice/parsers/parse.py b/tdrs-backend/tdpservice/parsers/parse.py index 409d239b8..05c3da3ca 100644 --- a/tdrs-backend/tdpservice/parsers/parse.py +++ b/tdrs-backend/tdpservice/parsers/parse.py @@ -20,7 +20,7 @@ def parse_datafile(datafile): header_line = rawfile.readline().decode().strip() header, header_is_valid, header_errors = schema_defs.header.parse_and_validate( header_line, - util.make_generate_parser_error(datafile, 1) + util.make_generate_file_precheck_parser_error(datafile, 1) ) if not header_is_valid: logger.info(f"Preparser Error: {len(header_errors)} header errors encountered.") diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index 9c785f79f..f6962b1c4 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -608,7 +608,7 @@ def test_parse_bad_tfs1_missing_required(bad_tanf_s1__row_missing_required_field parse.parse_datafile(bad_tanf_s1__row_missing_required_field) - assert dfs.get_status() == DataFileSummary.Status.ACCEPTED_WITH_ERRORS + assert dfs.get_status() == DataFileSummary.Status.PARTIALLY_ACCEPTED parser_errors = ParserError.objects.filter(file=bad_tanf_s1__row_missing_required_field) assert parser_errors.count() == 4 diff --git a/tdrs-backend/tdpservice/parsers/util.py b/tdrs-backend/tdpservice/parsers/util.py index 073b7b8d8..e3e13538c 100644 --- a/tdrs-backend/tdpservice/parsers/util.py +++ b/tdrs-backend/tdpservice/parsers/util.py @@ -35,7 +35,7 @@ def generate_parser_error(datafile, line_number, schema, error_category, error_m row_number=line_number, column_number=getattr(field, 'item', None), item_number=getattr(field, 'item', None), - field_name=getattr(field, 'name', None), + field_name=getattr(field, 'name', None) if hasattr(field, 'name') else field, rpt_month_year=getattr(record, 'RPT_MONTH_YEAR', None), case_number=getattr(record, 'CASE_NUMBER', None), error_message=error_message, @@ -64,6 +64,22 @@ def generate(schema, error_category, error_message, record=None, field=None): return generate +def make_generate_file_precheck_parser_error(datafile, line_number): + """Configure a generate_parser_error that acts as a file pre-check error.""" + def generate(schema, error_category, error_message, record=None, field=None): + return generate_parser_error( + datafile=datafile, + line_number=line_number, + schema=schema, + error_category=error_category, + error_message=error_message, + record=record, + field=None, # purposely overridden to force a "Rejected" status for certain file precheck errors + ) + + return generate + + class SchemaManager: """Manages one or more RowSchema's and runs all parsers and validators.""" diff --git a/tdrs-backend/tdpservice/scheduling/parser_task.py b/tdrs-backend/tdpservice/scheduling/parser_task.py index f9fab7f6f..be47703c5 100644 --- a/tdrs-backend/tdpservice/scheduling/parser_task.py +++ b/tdrs-backend/tdpservice/scheduling/parser_task.py @@ -19,7 +19,8 @@ def parse(data_file_id): # for undetermined amount of time. data_file = DataFile.objects.get(id=data_file_id) - logger.info(f"DataFile parsing started for file -> {repr(data_file)}") + logger.info(f"DataFile parsing started for file {data_file.filename}") + dfs = DataFileSummary.objects.create(datafile=data_file, status=DataFileSummary.Status.PENDING) errors = parse_datafile(data_file) dfs.status = dfs.get_status() diff --git a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx index 844b0c744..d7045e15d 100644 --- a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx +++ b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx @@ -3,6 +3,13 @@ import axios from 'axios' import PropTypes from 'prop-types' import { useDispatch, useSelector } from 'react-redux' import { fileUploadSections } from '../../reducers/reports' +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { + faCheckCircle, + faExclamationCircle, + faXmarkCircle, + faClock, +} from '@fortawesome/free-solid-svg-icons' import Paginator from '../Paginator' import { getAvailableFileList, download } from '../../actions/reports' import { useEffect } from 'react' @@ -11,6 +18,39 @@ import { getParseErrors } from '../../actions/createXLSReport' const formatDate = (dateStr) => new Date(dateStr).toLocaleString() +const SubmissionSummaryStatusIcon = ({ status }) => { + let icon = null + let color = null + + switch (status) { + case 'Pending': + icon = faClock + color = '#005EA2' + break + case 'Accepted': + icon = faCheckCircle + color = '#40bb45' + break + case 'Partially Accepted with Errors': + icon = faExclamationCircle + color = '#ec4e11' + break + case 'Accepted with Errors': + icon = faExclamationCircle + color = '#ec4e11' + break + case 'Rejected': + icon = faXmarkCircle + color = '#bb0000' + break + default: + break + } + return ( + + ) +} + const SubmissionHistoryRow = ({ file }) => { const dispatch = useDispatch() @@ -41,14 +81,24 @@ const SubmissionHistoryRow = ({ file }) => { {file.fileName} + + {file.summary ? ( + <> + + {file.summary && file.summary.status + ? file.summary.status + : 'Pending'} + + ) : ( + 'N/A' + )} + {file.hasError > 0 ? ( - ) : ( - 'Currently Unavailable' - )} + ) : null} ) @@ -78,6 +128,7 @@ const SectionSubmissionHistory = ({ section, label, files }) => { Submitted On Submitted By File Name + Acceptance Status Error Reports (In development) diff --git a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js index 72f3e65f8..1926cce32 100644 --- a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js +++ b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js @@ -244,8 +244,6 @@ describe('SubmissionHistory', () => { expect( screen.queryByText('Error Reports (In development)') ).toBeInTheDocument() - - expect(screen.queryByText('Currently Unavailable')).toBeInTheDocument() }) it('Shows SSP results when SSP-MOE file type selected', () => { @@ -339,4 +337,63 @@ describe('SubmissionHistory', () => { expect(screen.queryByText('test5.txt')).toBeInTheDocument() expect(screen.queryByText('test6.txt')).not.toBeInTheDocument() }) + + it.each([ + 'Pending', + 'Accepted', + 'Accepted with Errors', + 'Partially Accepted with Errors', + 'Rejected', + null, + ])('Shows the submission acceptance status', (status) => { + const state = { + reports: { + files: [ + { + id: '123', + fileName: 'test1.txt', + fileType: 'TANF', + quarter: 'Q1', + section: 'Active Case Data', + uuid: '123-4-4-321', + year: '2023', + s3_version_id: '321-0-0-123', + createdAt: '12/12/2012 12:12', + submittedBy: 'test@teamraft.com', + summary: { + datafile: '123', + status: status, + case_aggregates: { + Oct: { + total: 0, + accepted: 0, + rejected: 0, + }, + Nov: { + total: 0, + accepted: 0, + rejected: 0, + }, + Dec: { + total: 0, + accepted: 0, + rejected: 0, + }, + }, + }, + }, + ], + }, + } + + const store = appConfigureStore(state) + const dispatch = jest.fn(store.dispatch) + store.dispatch = dispatch + + setup(store) + + expect(screen.queryByText('Acceptance Status')).toBeInTheDocument() + expect(screen.queryByText('test1.txt')).toBeInTheDocument() + expect(screen.queryByText(status || 'Pending')).toBeInTheDocument() + }) }) diff --git a/tdrs-frontend/src/reducers/reports.js b/tdrs-frontend/src/reducers/reports.js index fb8698889..66c912069 100644 --- a/tdrs-frontend/src/reducers/reports.js +++ b/tdrs-frontend/src/reducers/reports.js @@ -66,6 +66,7 @@ export const serializeApiDataFile = (dataFile) => ({ createdAt: dataFile.created_at, submittedBy: dataFile.submitted_by, hasError: dataFile.has_error, + summary: dataFile.summary, }) const initialState = { @@ -131,6 +132,7 @@ const reports = (state = initialState, action) => { created_at: null, submitted_by: null, has_error: null, + summary: null, }) }), } From 954edc74a494040db5f82a33a97fb25cbdaec47b Mon Sep 17 00:00:00 2001 From: jtimpe <111305129+jtimpe@users.noreply.github.com> Date: Thu, 5 Oct 2023 10:33:32 -0400 Subject: [PATCH 05/49] 1612 case aggregates frontend (#2643) * saving state real quick * finishing merge with latest * Missed old test script * Added new test, more cleanup * Updating unit tests in DFS, preparing for 1610 * Merging in Jan's 1610 code for parserError useful-ness * Revert "Merging in Jan's 1610 code for parserError useful-ness" This reverts commit c5796da69d0e9a6d356057550378d536e2be5f8b. * update to test to use dfs fixture * saving state before new 1610 merge * Resolving merge conflicts with 1610. * Linting changes and comparing to 1610 * Some unit test linting but inherited 1610 issues * Re-ordering job to run tests vs lint first. * Updates to linting and unit tests. * Fixing linting. * Update tdrs-backend/setup.cfg * updates per PR. * Excluding trailers for rejection * VSCode merge resolution is garbage. * Fixing precheck for not implemented types * Updating to error-handle not implemented schema types * - Updated view to show latest datafiles - Added admin filter to show newest or all datafile records - Updated indices to allow easier elastic queries * - Updated search indices to have parent FK * - Fix lint errors * - Updated submission tests - Moved create_datafile to util * - fix lint errors * - removing frontend filtering * - addding datafile to admin model * Revert "- addding datafile to admin model" This reverts commit 35a6f24c36c3a4c00ddcfc40f20833530b0199f4. * - Fixed issue where datafile FK wasnt populating - Regenerated migration * - Readding datafile back to admin view now that the error is resolved * - adding datafile back * Revert "- Readding datafile back to admin view now that the error is resolved" This reverts commit 2807425059fd1b5b355edfb16d30d170cf869d7b. * - Removed unnecessary fields - Updated dependencies - Updated filter * - Updated document to include required fields * - Fixed failing test * add adminUrl to deployment cypress overrides * Adding "beta" banners to relevant error report sections (#2522) * Update views.py * Update views.py * Update SubmissionHistory.jsx * Update SubmissionHistory.test.js * Apply suggestions from code review Co-authored-by: Miles Reiter * lint fixes --------- Co-authored-by: Miles Reiter Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: andrew-jameson * Create sprint-73-summary.md (#2565) * hotfix for large file sizes (#2542) * hotfix for large file sizes * apply timeouts/req limits to dev * filter identity pages from scan * IGNORE sql injection --------- Co-authored-by: Jan Timpe Co-authored-by: mo sohani Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> * updating validation error language * accidentally included coding challenge * rm comments * 2550 deactivation email link (#2557) * - updated nginx buildpack * - specifying different nginx version * - Updating changelog * - added script to update certain apps in cf - added workflow for each environment in circi * - fixed base config * - fixing jobs * - Updated based on feedback in OH * - Updating defaults * - Removing defaults * - Fixing indent * - Adding params to config * test * test * - updating work dir * - Adding checkout * - adding cf check * - logging into cf * - update cf check to install required binary * - removing unnecessary switch * - Forcing plugin installation * - test installing plugin from script also * - Adding url to email * - test code for sandbox * - using my email * Revert "Merge branch 'update-cf-os' into 2551-deactivation-email-link" This reverts commit e963b9df48dd1f72ca0c5b192c979bac11851d11, reversing changes made to cc9cf81e9d76c42f51ffd5e102f6027d3eb5e645. * Revert "- using my email" This reverts commit cc9cf81e9d76c42f51ffd5e102f6027d3eb5e645. * Revert "- test code for sandbox" This reverts commit 06037747197d17ed8e63b086fcfcf048ecb50dc4. --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Update README.md (#2577) Add ATO Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Create 2023, Spring - Testing CSV & Excel-based error reports.md * Update README.md * Updating deliverable links (#2584) * User viewset not returning/duplicating users (#2573) * - Fixed issue not allowing pagination to work locally with nginx - Added ordering to user field to fix duplicates issue * - fix lint error * - Removing ID check since we cannot guarantee that the uuid that is generated per test run will be lexigraphically consistent --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Update cf os (#2523) * - updated nginx buildpack * - specifying different nginx version * - Updating changelog * - added script to update certain apps in cf - added workflow for each environment in circi * - fixed base config * - fixing jobs * - Updated based on feedback in OH * - Updating defaults * - Removing defaults * - Fixing indent * - Adding params to config * test * test * - updating work dir * - Adding checkout * - adding cf check * - logging into cf * - update cf check to install required binary * - removing unnecessary switch * - Forcing plugin installation * - test installing plugin from script also * - Adding new dependencies * - adding package * - fixing broken install * - fixing libs * - using correct command * - gettign correct version of libc * - trying to upgrade libs * - testing * - Updated README and script * Revert "- Updated README and script" This reverts commit 92697b3e53d1fd87b8d3e7995abb9093aa26e307. * - Removed unnecessary circi stuff - Removed script - Updated docs to callout updating secondary apps * - Correct spelling error --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Item Number Mismatch (#2578) * - Updated schemas and models to reflect correct item numbers of fields * - Revert migration * - Updated header/trailer item numbers * - Fixed item numbers off by one errors --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * pipeline filtering (#2538) * pipeline changes that filter based on paths and branches. circle ci tracks specified branches in order to keep current functionality on HHS side. * updated syntax to be in line with build-all.yml * removed comma * WIP build flow docs * added Architecture Decision Record for the change to pipeline workflows * corrected file type of doc to .md --------- Co-authored-by: George Hudson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Hotfix Devops/2457 path filtering for documentation (#2597) * pipeline changes that filter based on paths and branches. circle ci tracks specified branches in order to keep current functionality on HHS side. * updated syntax to be in line with build-all.yml * removed comma * WIP build flow docs * added Architecture Decision Record for the change to pipeline workflows * corrected file type of doc to .md * build and test all on PRs even for documentation --------- Co-authored-by: George Hudson * Create sprint-74-summary.md (#2596) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * added URL filters (#2580) * added URL filters * allow github to trigger owasp and label deploys (#2601) Co-authored-by: George Hudson --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> Co-authored-by: George Hudson Co-authored-by: George Hudson * Create sprint-75-summary.md (#2608) * Create sprint-76-summary.md (#2609) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * - Resolved failing tests * - Corrected merge thrash * - Using randbits to generate pk to get around confilcting sequence pks * Revert "- Using randbits to generate pk to get around confilcting sequence pks" This reverts commit ac9b0659a62f64c4114c41faf0baa659a92be07c. * - Updating region in fixture instead of factory - letting django handle transaction for test * - Moved datafile reference to avoid confusion * pushing up incomplete codebase * Other unit tests now have passed w/ good error handling * Working tests, need to get setup for case aggregates populating via DB * - Updated queries - Added helper function - Need to merge in 2579 for queries to work * minor improvement to month2int * - Fixing most merge errors * - Fixing functions * - Updated queries based on generic relation * - Updated queries to count by case number instead of record number * - Added route - Updated task to create dfs * - updated tests to include dfs * Cleaning up most comments that are no longer necessary and fixed lint issues. * making minor updates, still broken tests. * updating pipfile.lock and rebuild image resolved test issues * Reorganizing tests, still failing in test_parse.py * deleted summary file, split into other test scripts. * Fixed missing self reference. * Linting fixes. * Found reference failure in deployed env. * Removing extra returns for missing record type. * lint fix * Addressed invocation of datafile for failing test * lint update for whitespace * Intermediary commit, broken test * add reverse relation * frontend summary status * new assignemnts in util * - updated rejected query to correctly count objs * - Fixing most tests * - Fixed user error. Swapped numbers by accident. * - make region None to avoid PK collision * - Fix lint errors * - Updating to avoid warning * add acceptance icon * add reverse relationship to summary model * vscode merge conflict resolution (#2623) * auto-create the external network * didn't stage commit properly * checking diffs, matching 1613.2 * doesn't work in pipeline. must be cached local * re-commenting in unit test * lint failures fixed --------- Co-authored-by: andrew-jameson * add a pending status * add acceptance status tests * update warning icon * rm old assert * update rejected icon * add case aggregates to submission history * url change per me, want pipeline to run e2e * update case aggregate columns * update col names * Upgraded to querysets, fix PR comments, PE str * missing : not caught locally * Feat/1613 merge 2 (#2650) * Create sprint-78-summary.md (#2645) * Missing/unsaved parser_error for record_type * removing redundant tests * Hopefully resolved on unit tests and lint --------- Co-authored-by: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Co-authored-by: andrew-jameson * icontains * tests * Changing dict structure per 1612. * fixed tests and lint issues, parse is too complex * schema_manager replaces schema check * Saving state prior to merge-conflict. * Adopting latest manager, removing old error style. * Commented out t6 line during Office hours * minor reference update * Acclimating to schemaManager * lint-fix isinstance * syntax mistake with isinstance * Apply suggestions from code review * reverting search_index merge artifacts. * adjusting for removing unused "get-schema()" * whitespace lint * Feedback from Jan * Ensuring tests run/work. * Ensure we have leading zero in rptmonthyear. * Minor lint fix for exception logging * fix migration * add backend partially accepted status * add frontend partially accepted status * add partially accepted test * rm accidental commit * rm unused variable * conditional submission history * fix test * resolving merge conflict problems * fixing tests from merge conflicts. * - fixed migration reference * dumb lint fix * - Fixed render error * Adding section * - Resolved type mismatches causing render failures * - Adding branch coverage * - Fix lint errors * - Fix lint errors * - Consolodated tetss * reducing line length for lint * - updated maxWidth to be percentage * Moving DFS migration into it's own file to avoid conflicts. * rename migrations * left align error report text * github got stuck :( * rm comment * rm margin, add text for no error report * fix tests * fix ssp case aggregates display --------- Co-authored-by: Andrew Jameson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> Co-authored-by: andrew-jameson Co-authored-by: elipe17 Co-authored-by: Miles Reiter Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Co-authored-by: mo sohani Co-authored-by: Eric Lipe <125676261+elipe17@users.noreply.github.com> Co-authored-by: Lauren Frohlich <61251539+lfrohlich@users.noreply.github.com> Co-authored-by: Miles Reiter Co-authored-by: George Hudson Co-authored-by: George Hudson Co-authored-by: raftmsohani <97037188+raftmsohani@users.noreply.github.com> --- .../tdpservice/parsers/test/test_parse.py | 1 - tdrs-backend/tdpservice/parsers/util.py | 1 - tdrs-frontend/src/assets/Reports.scss | 1 + .../SubmissionHistory/SubmissionHistory.jsx | 199 +++++++++++++++--- .../SubmissionHistory.test.js | 37 +++- 5 files changed, 194 insertions(+), 45 deletions(-) diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index f6962b1c4..d75abafeb 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -43,7 +43,6 @@ def test_parse_small_correct_file(test_datafile, dfs): ]} assert dfs.get_status() == DataFileSummary.Status.ACCEPTED - assert TANF_T1.objects.count() == 1 # spot check diff --git a/tdrs-backend/tdpservice/parsers/util.py b/tdrs-backend/tdpservice/parsers/util.py index e3e13538c..6ed48e44e 100644 --- a/tdrs-backend/tdpservice/parsers/util.py +++ b/tdrs-backend/tdpservice/parsers/util.py @@ -276,7 +276,6 @@ def transform_to_months(quarter): case _: raise ValueError("Invalid quarter value.") - def month_to_int(month): """Return the integer value of a month.""" return datetime.strptime(month, '%b').strftime('%m') diff --git a/tdrs-frontend/src/assets/Reports.scss b/tdrs-frontend/src/assets/Reports.scss index f515530a6..58b89ce6c 100644 --- a/tdrs-frontend/src/assets/Reports.scss +++ b/tdrs-frontend/src/assets/Reports.scss @@ -35,6 +35,7 @@ border: none; text-decoration: underline; color: #264A64; + text-align: left; } .section-download:hover { diff --git a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx index d7045e15d..55df49364 100644 --- a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx +++ b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.jsx @@ -51,6 +51,63 @@ const SubmissionSummaryStatusIcon = ({ status }) => { ) } +const CaseAggregatesHeader = ({ section }) => + section === 1 || section === 2 ? ( + <> + + Month + + + Cases Without Errors + + + Cases With Errors + + + Records Unable To Process + + + ) : ( + <> + + Month + + + Total + + + Cases With Errors + + + ) + +const CaseAggregatesRow = ({ data, section }) => + section === 1 || section === 2 ? ( + data ? ( + <> + {data.month} + {data.accepted_without_errors} + {data.accepted_with_errors} + + ) : ( + <> + - + N/A + N/A + + ) + ) : data ? ( + <> + {data.month} + {data.total} + + ) : ( + <> + - + N/A + + ) + const SubmissionHistoryRow = ({ file }) => { const dispatch = useDispatch() @@ -72,35 +129,96 @@ const SubmissionHistoryRow = ({ file }) => { } } + const section_index = (element) => file.section.includes(element) + + const section = fileUploadSections.findIndex(section_index) + 1 + return ( - - {formatDate(file.createdAt)} - {file.submittedBy} - - - - - {file.summary ? ( - <> - - {file.summary && file.summary.status - ? file.summary.status - : 'Pending'} - - ) : ( - 'N/A' - )} - - - {file.hasError > 0 ? ( - - ) : null} - - + + + + + {file.summary && + file.summary.case_aggregates && + file.summary.case_aggregates.months + ? file.summary.case_aggregates.rejected + : 'N/A'} + + + + + + + {file.summary && file.summary.status + ? file.summary.status + : 'Pending'} + + + + {file.summary && + file.summary.status && + file.summary.status !== 'Pending' ? ( + file.hasError > 0 ? ( + + ) : ( + 'No Errors' + ) + ) : ( + 'Pending' + )} + + + + + + + + + + ) } @@ -118,18 +236,33 @@ const SectionSubmissionHistory = ({ section, label, files }) => { const pageEnd = Math.min(files.length, pageStart + pageSize) return ( -
+
{files && files.length > 0 ? ( <> - - - - - + + + + + + diff --git a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js index 1926cce32..abf370523 100644 --- a/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js +++ b/tdrs-frontend/src/components/SubmissionHistory/SubmissionHistory.test.js @@ -339,13 +339,25 @@ describe('SubmissionHistory', () => { }) it.each([ - 'Pending', - 'Accepted', - 'Accepted with Errors', - 'Partially Accepted with Errors', - 'Rejected', - null, - ])('Shows the submission acceptance status', (status) => { + ['Pending', 'Active Case Data'], + ['Pending', 'Closed Case Data'], + ['Pending', 'Aggregate Data'], + ['Accepted', 'Active Case Data'], + ['Accepted', 'Closed Case Data'], + ['Accepted', 'Aggregate Data'], + ['Accepted with Errors', 'Active Case Data'], + ['Accepted with Errors', 'Closed Case Data'], + ['Accepted with Errors', 'Aggregate Data'], + ['Partially Accepted with Errors', 'Active Case Data'], + ['Partially Accepted with Errors', 'Closed Case Data'], + ['Partially Accepted with Errors', 'Aggregate Data'], + ['Rejected', 'Active Case Data'], + ['Rejected', 'Closed Case Data'], + ['Rejected', 'Aggregate Data'], + [null, 'Active Case Data'], + [null, 'Closed Case Data'], + [null, 'Aggregate Data'], + ])('Shows the submission acceptance status section 3', (status, section) => { const state = { reports: { files: [ @@ -354,7 +366,7 @@ describe('SubmissionHistory', () => { fileName: 'test1.txt', fileType: 'TANF', quarter: 'Q1', - section: 'Active Case Data', + section: section, uuid: '123-4-4-321', year: '2023', s3_version_id: '321-0-0-123', @@ -392,8 +404,13 @@ describe('SubmissionHistory', () => { setup(store) - expect(screen.queryByText('Acceptance Status')).toBeInTheDocument() + expect(screen.queryByText('Status')).toBeInTheDocument() expect(screen.queryByText('test1.txt')).toBeInTheDocument() - expect(screen.queryByText(status || 'Pending')).toBeInTheDocument() + + if (status && status !== 'Pending') { + expect(screen.queryByText(status)).toBeInTheDocument() + } else { + expect(screen.queryAllByText('Pending')).toHaveLength(2) + } }) }) From a4ad481ff878a40ca9bb11fe3c4a9353c9b63321 Mon Sep 17 00:00:00 2001 From: Eric Lipe <125676261+elipe17@users.noreply.github.com> Date: Tue, 10 Oct 2023 10:40:53 -0600 Subject: [PATCH 06/49] Frontend File Validation (#2690) * - small grammar fix * - Fix lint suggestions * - updated message * - Fixed lint errors * - Added correct extension to datafiles without one * - Adding cherry picks for file extension error handling * - Updated regex * - updating to keep file in dropbox in event of error to help user correct their mistake. * - Fix icon rendering incorrectly * update test file extensions * - making timeout longer * - Resolved issue causing test failure - resetting timeout * - passing param --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Miles Reiter Co-authored-by: Jan Timpe --- .../tdpservice/data_files/validators.py | 2 +- ...ck => ADS.E2J.NDM1.TS53_fake.rollback.txt} | 0 ...{small_bad_ssp_s1 => small_bad_ssp_s1.txt} | 0 ...mall_bad_tanf_s1 => small_bad_tanf_s1.txt} | 0 ...ll_correct_file => small_correct_file.txt} | 0 .../tdpservice/parsers/test/test_parse.py | 6 ++--- .../search_indexes/test/test_model_mapping.py | 4 +-- .../cypress/e2e/integration/file_upload.js | 4 +-- tdrs-frontend/src/actions/reports.js | 7 ++++- tdrs-frontend/src/actions/reports.test.js | 2 +- tdrs-frontend/src/actions/requestAccess.js | 1 - .../src/components/FileUpload/FileUpload.jsx | 27 +++++++++++++++++-- .../components/Paginator/Paginator.test.js | 2 +- .../src/components/SiteMap/SiteMap.test.js | 1 - tdrs-frontend/src/reducers/reports.js | 6 +++++ 15 files changed, 47 insertions(+), 15 deletions(-) rename tdrs-backend/tdpservice/parsers/test/data/{ADS.E2J.NDM1.TS53_fake.rollback => ADS.E2J.NDM1.TS53_fake.rollback.txt} (100%) rename tdrs-backend/tdpservice/parsers/test/data/{small_bad_ssp_s1 => small_bad_ssp_s1.txt} (100%) rename tdrs-backend/tdpservice/parsers/test/data/{small_bad_tanf_s1 => small_bad_tanf_s1.txt} (100%) rename tdrs-backend/tdpservice/parsers/test/data/{small_correct_file => small_correct_file.txt} (100%) diff --git a/tdrs-backend/tdpservice/data_files/validators.py b/tdrs-backend/tdpservice/data_files/validators.py index 2f78231cb..a4d0f0bc8 100644 --- a/tdrs-backend/tdpservice/data_files/validators.py +++ b/tdrs-backend/tdpservice/data_files/validators.py @@ -22,7 +22,7 @@ def _get_unsupported_msg(_type, value, supported_options): """Construct a message to convey an unsupported operation.""" return ( - f'Unsupported {_type}: {value}, supported {pluralize(_type)} ' + f'Unsupported {_type}: supported {pluralize(_type)} ' f'are: {supported_options}' ) diff --git a/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM1.TS53_fake.rollback b/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM1.TS53_fake.rollback.txt similarity index 100% rename from tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM1.TS53_fake.rollback rename to tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM1.TS53_fake.rollback.txt diff --git a/tdrs-backend/tdpservice/parsers/test/data/small_bad_ssp_s1 b/tdrs-backend/tdpservice/parsers/test/data/small_bad_ssp_s1.txt similarity index 100% rename from tdrs-backend/tdpservice/parsers/test/data/small_bad_ssp_s1 rename to tdrs-backend/tdpservice/parsers/test/data/small_bad_ssp_s1.txt diff --git a/tdrs-backend/tdpservice/parsers/test/data/small_bad_tanf_s1 b/tdrs-backend/tdpservice/parsers/test/data/small_bad_tanf_s1.txt similarity index 100% rename from tdrs-backend/tdpservice/parsers/test/data/small_bad_tanf_s1 rename to tdrs-backend/tdpservice/parsers/test/data/small_bad_tanf_s1.txt diff --git a/tdrs-backend/tdpservice/parsers/test/data/small_correct_file b/tdrs-backend/tdpservice/parsers/test/data/small_correct_file.txt similarity index 100% rename from tdrs-backend/tdpservice/parsers/test/data/small_correct_file rename to tdrs-backend/tdpservice/parsers/test/data/small_correct_file.txt diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index d75abafeb..5a940a71b 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -19,7 +19,7 @@ @pytest.fixture def test_datafile(stt_user, stt): """Fixture for small_correct_file.""" - return util.create_test_datafile('small_correct_file', stt_user, stt) + return util.create_test_datafile('small_correct_file.txt', stt_user, stt) @pytest.fixture def dfs(): @@ -596,7 +596,7 @@ def test_parse_super_big_s1_file_with_rollback(super_big_s1_rollback_file): @pytest.fixture def bad_tanf_s1__row_missing_required_field(stt_user, stt): """Fixture for small_tanf_section1.""" - return util.create_test_datafile('small_bad_tanf_s1', stt_user, stt) + return util.create_test_datafile('small_bad_tanf_s1.txt', stt_user, stt) @pytest.mark.django_db @@ -643,7 +643,7 @@ def test_parse_bad_tfs1_missing_required(bad_tanf_s1__row_missing_required_field @pytest.fixture def bad_ssp_s1__row_missing_required_field(stt_user, stt): """Fixture for ssp_section1_datafile.""" - return util.create_test_datafile('small_bad_ssp_s1', stt_user, stt, 'SSP Active Case Data') + return util.create_test_datafile('small_bad_ssp_s1.txt', stt_user, stt, 'SSP Active Case Data') @pytest.mark.django_db() diff --git a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py index e8e9eb81f..4d81eaac9 100644 --- a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py +++ b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py @@ -12,8 +12,8 @@ @pytest.fixture def test_datafile(stt_user, stt): - """Fixture for small_correct_file.""" - return create_test_datafile('small_correct_file', stt_user, stt) + """Fixture for small_correct_file.txt.""" + return create_test_datafile('small_correct_file.txt', stt_user, stt) @pytest.mark.django_db diff --git a/tdrs-frontend/cypress/e2e/integration/file_upload.js b/tdrs-frontend/cypress/e2e/integration/file_upload.js index a92b26d52..35cd400ab 100644 --- a/tdrs-frontend/cypress/e2e/integration/file_upload.js +++ b/tdrs-frontend/cypress/e2e/integration/file_upload.js @@ -5,7 +5,7 @@ Then('{string} can see Data Files page', (username) => { cy.visit('/data-files') cy.contains('Data Files').should('exist') }) - + Then('{string} can see search form', (username) => { cy.contains('Fiscal Year').should('exist') cy.contains('Quarter').should('exist') @@ -19,7 +19,7 @@ Then('{string} can browse upload file form', (username) => { When('{string} uploads a file', (username) => { cy.get('button').contains('Search').should('exist').click() - cy.get('#closed-case-data').selectFile('../tdrs-backend/tdpservice/parsers/test/data/small_correct_file',{ action: 'drag-drop' }) + cy.get('#closed-case-data').selectFile('../tdrs-backend/tdpservice/parsers/test/data/small_correct_file.txt',{ action: 'drag-drop' }) cy.get('button').contains('Submit Data Files').should('exist').click() }) diff --git a/tdrs-frontend/src/actions/reports.js b/tdrs-frontend/src/actions/reports.js index fa5e4a480..8ecb8839e 100644 --- a/tdrs-frontend/src/actions/reports.js +++ b/tdrs-frontend/src/actions/reports.js @@ -11,6 +11,7 @@ export const SET_FILE = 'SET_FILE' export const CLEAR_FILE = 'CLEAR_FILE' export const CLEAR_FILE_LIST = 'CLEAR_FILE_LIST' export const SET_FILE_ERROR = 'SET_FILE_ERROR' +export const FILE_EXT_ERROR = 'FILE_EXT_ERROR' export const SET_FILE_SUBMITTED = 'SET_FILE_SUBMITTED' export const CLEAR_ERROR = 'CLEAR_ERROR' @@ -254,7 +255,11 @@ export const submit = setLocalAlertState({ active: true, type: 'error', - message: error.message, + message: ''.concat( + error.message, + ': ', + error.response?.data?.file[0] + ), }) ) } diff --git a/tdrs-frontend/src/actions/reports.test.js b/tdrs-frontend/src/actions/reports.test.js index 54bde8d6c..40593f3bb 100644 --- a/tdrs-frontend/src/actions/reports.test.js +++ b/tdrs-frontend/src/actions/reports.test.js @@ -201,7 +201,7 @@ describe('actions/reports', () => { expect(axios.post).toHaveBeenCalledTimes(1) expect(setLocalAlertState).toHaveBeenCalledWith({ active: true, - message: undefined, + message: 'undefined: undefined', type: 'error', }) }) diff --git a/tdrs-frontend/src/actions/requestAccess.js b/tdrs-frontend/src/actions/requestAccess.js index 668420c65..50c1f0ce5 100644 --- a/tdrs-frontend/src/actions/requestAccess.js +++ b/tdrs-frontend/src/actions/requestAccess.js @@ -1,6 +1,5 @@ import { SET_AUTH } from './auth' import axios from 'axios' -import axiosInstance from '../axios-instance' import { logErrorToServer } from '../utils/eventLogger' export const PATCH_REQUEST_ACCESS = 'PATCH_REQUEST_ACCESS' diff --git a/tdrs-frontend/src/components/FileUpload/FileUpload.jsx b/tdrs-frontend/src/components/FileUpload/FileUpload.jsx index 0deea1216..d8a21476b 100644 --- a/tdrs-frontend/src/components/FileUpload/FileUpload.jsx +++ b/tdrs-frontend/src/components/FileUpload/FileUpload.jsx @@ -7,6 +7,7 @@ import { clearError, clearFile, SET_FILE_ERROR, + FILE_EXT_ERROR, upload, download, } from '../../actions/reports' @@ -17,6 +18,9 @@ import { handlePreview, getTargetClassName } from './utils' const INVALID_FILE_ERROR = 'We can’t process that file format. Please provide a plain text file.' +const INVALID_EXT_ERROR = + 'Invalid extension. Accepted file types are: .txt, .ms##, .ts##, or .ts###.' + function FileUpload({ section, setLocalAlertState }) { // e.g. 'Aggregate Case Data' => 'aggregate-case-data' // The set of uploaded files in our Redux state @@ -31,6 +35,10 @@ function FileUpload({ section, setLocalAlertState }) { (file) => file.section.includes(sectionName) && file.uuid ) + const hasPreview = files?.some( + (file) => file.section.includes(sectionName) && file.name + ) + const selectedFile = files?.find((file) => file.section.includes(sectionName)) const formattedSectionName = selectedFile?.section @@ -54,8 +62,10 @@ function FileUpload({ section, setLocalAlertState }) { setTimeout(trySettingPreview, 100) } } - if (hasFile) trySettingPreview() - }, [hasFile, fileName, targetClassName]) + if (hasPreview || hasFile) { + trySettingPreview() + } + }, [hasPreview, hasFile, fileName, targetClassName]) const downloadFile = ({ target }) => { dispatch(clearError({ section: sectionName })) @@ -89,6 +99,19 @@ function FileUpload({ section, setLocalAlertState }) { filereader.onloadend = (evt) => { /* istanbul ignore next */ if (!evt.target.error) { + // Validate file extension before proceeding + const re = /(\.txt|\.ms\d{2}|\.ts\d{2,3})$/i + if (!re.exec(file.name)) { + dispatch({ + type: FILE_EXT_ERROR, + payload: { + error: { message: INVALID_EXT_ERROR }, + section, + }, + }) + return + } + // Read in the file blob "headers: and create a hex string signature const uint = new Uint8Array(evt.target.result) const bytes = [] diff --git a/tdrs-frontend/src/components/Paginator/Paginator.test.js b/tdrs-frontend/src/components/Paginator/Paginator.test.js index 5eb868856..06390986d 100644 --- a/tdrs-frontend/src/components/Paginator/Paginator.test.js +++ b/tdrs-frontend/src/components/Paginator/Paginator.test.js @@ -1,5 +1,5 @@ import React from 'react' -import { render, fireEvent, waitFor, screen } from '@testing-library/react' +import { render, fireEvent, screen } from '@testing-library/react' import Paginator from './Paginator' describe('Paginator', () => { diff --git a/tdrs-frontend/src/components/SiteMap/SiteMap.test.js b/tdrs-frontend/src/components/SiteMap/SiteMap.test.js index 2b435064d..236c653fe 100644 --- a/tdrs-frontend/src/components/SiteMap/SiteMap.test.js +++ b/tdrs-frontend/src/components/SiteMap/SiteMap.test.js @@ -1,7 +1,6 @@ import React from 'react' import { render } from '@testing-library/react' import SiteMap from './SiteMap' -import { mount } from 'enzyme' import thunk from 'redux-thunk' import { Provider } from 'react-redux' import configureStore from 'redux-mock-store' diff --git a/tdrs-frontend/src/reducers/reports.js b/tdrs-frontend/src/reducers/reports.js index 66c912069..8c085bd99 100644 --- a/tdrs-frontend/src/reducers/reports.js +++ b/tdrs-frontend/src/reducers/reports.js @@ -2,6 +2,7 @@ import { SET_FILE, CLEAR_FILE, SET_FILE_ERROR, + FILE_EXT_ERROR, CLEAR_ERROR, SET_SELECTED_YEAR, SET_SELECTED_STT, @@ -177,6 +178,11 @@ const reports = (state = initialState, action) => { const updatedFiles = getUpdatedFiles({ state, section, error }) return { ...state, submittedFiles: updatedFiles } } + case FILE_EXT_ERROR: { + const { error, section } = payload + const updatedFiles = getUpdatedFiles({ state, section, error }) + return { ...state, submittedFiles: updatedFiles } + } case CLEAR_ERROR: { const { section } = payload const file = getFile(state.submittedFiles, section) From e178c5c7a035890980068bca9a93a2896107af99 Mon Sep 17 00:00:00 2001 From: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Date: Wed, 11 Oct 2023 12:15:36 -0700 Subject: [PATCH 07/49] Create sprint-82-review.md (#2716) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- docs/Sprint-Review/sprint-82-review.md | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 docs/Sprint-Review/sprint-82-review.md diff --git a/docs/Sprint-Review/sprint-82-review.md b/docs/Sprint-Review/sprint-82-review.md new file mode 100644 index 000000000..cba846de1 --- /dev/null +++ b/docs/Sprint-Review/sprint-82-review.md @@ -0,0 +1,49 @@ + +# Sprint 82 Summary + +09/13/23 - 09/26/23 + +Velocity: Dev (13) + +## Sprint Goal +* Continue parsing engine development for TANF Section (04) and SSP (01), close out subsmission history and metadata workflows (1613/12/10). +* UX to continue regional staff and in-app messaging research, errors audit approach, and bridge onboarding to >95% of total users +* DevOps to investigate singluar ClamAV (2429), resolve utlity images for CircleCI and evaluate CI/CD pipeline. + +## Tickets +### Completed/Merged +* [#1613 As a developer, I need parsed file meta data (TANF Section 1)](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/board) +* [#2700 Deployment/migration issue](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2700) + +### Ready to Merge +* N/A + +### Submitted (QASP Review, OCIO Review) +* [#1612 Detailed case level metadata](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1612) + +### Closed (not merged) +* N/A + +## Moved to Next Sprint (Blocked, Raft Review, In Progress, Current Sprint Backlog) +### In Progress + +* [#2429 Singular ClamAV scanner](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2429) +* [#2695 space-filled values update](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2695) +* [#2411 As system admin, I need to view metadata on parsed datafiles](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2411) +* [#2536 [spike] Cat 4 validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2536) +* [#2709 SSP (Section 1) validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2709) + +### Blocked +* N/A + +### Raft Review +* [#1610 As a user, I need information about the acceptance of my data and a link for the error report](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1610) +* [#1111 TANF (04) Parsing and Validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1111) +* [#2664 (bug) file extension](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2664) + +### Demo +* Internal: + * 1613 + + + From 281cad7846b333e8e666119b1840ce5fa27d7a18 Mon Sep 17 00:00:00 2001 From: raftmsohani <97037188+raftmsohani@users.noreply.github.com> Date: Wed, 11 Oct 2023 16:09:19 -0400 Subject: [PATCH 08/49] 2411 metadata parsed datafiles (#2706) * saving state real quick * finishing merge with latest * Missed old test script * Added new test, more cleanup * Updating unit tests in DFS, preparing for 1610 * Merging in Jan's 1610 code for parserError useful-ness * Revert "Merging in Jan's 1610 code for parserError useful-ness" This reverts commit c5796da69d0e9a6d356057550378d536e2be5f8b. * update to test to use dfs fixture * saving state before new 1610 merge * Resolving merge conflicts with 1610. * Linting changes and comparing to 1610 * Some unit test linting but inherited 1610 issues * Re-ordering job to run tests vs lint first. * Updates to linting and unit tests. * Fixing linting. * Update tdrs-backend/setup.cfg * updates per PR. * Excluding trailers for rejection * VSCode merge resolution is garbage. * Fixing precheck for not implemented types * Updating to error-handle not implemented schema types * - Updated view to show latest datafiles - Added admin filter to show newest or all datafile records - Updated indices to allow easier elastic queries * - Updated search indices to have parent FK * - Fix lint errors * - Updated submission tests - Moved create_datafile to util * - fix lint errors * - removing frontend filtering * - addding datafile to admin model * Revert "- addding datafile to admin model" This reverts commit 35a6f24c36c3a4c00ddcfc40f20833530b0199f4. * - Fixed issue where datafile FK wasnt populating - Regenerated migration * - Readding datafile back to admin view now that the error is resolved * - adding datafile back * Revert "- Readding datafile back to admin view now that the error is resolved" This reverts commit 2807425059fd1b5b355edfb16d30d170cf869d7b. * - Removed unnecessary fields - Updated dependencies - Updated filter * - Updated document to include required fields * - Fixed failing test * add adminUrl to deployment cypress overrides * Adding "beta" banners to relevant error report sections (#2522) * Update views.py * Update views.py * Update SubmissionHistory.jsx * Update SubmissionHistory.test.js * Apply suggestions from code review Co-authored-by: Miles Reiter * lint fixes --------- Co-authored-by: Miles Reiter Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: andrew-jameson * Create sprint-73-summary.md (#2565) * hotfix for large file sizes (#2542) * hotfix for large file sizes * apply timeouts/req limits to dev * filter identity pages from scan * IGNORE sql injection --------- Co-authored-by: Jan Timpe Co-authored-by: mo sohani Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> * updating validation error language * accidentally included coding challenge * rm comments * 2550 deactivation email link (#2557) * - updated nginx buildpack * - specifying different nginx version * - Updating changelog * - added script to update certain apps in cf - added workflow for each environment in circi * - fixed base config * - fixing jobs * - Updated based on feedback in OH * - Updating defaults * - Removing defaults * - Fixing indent * - Adding params to config * test * test * - updating work dir * - Adding checkout * - adding cf check * - logging into cf * - update cf check to install required binary * - removing unnecessary switch * - Forcing plugin installation * - test installing plugin from script also * - Adding url to email * - test code for sandbox * - using my email * Revert "Merge branch 'update-cf-os' into 2551-deactivation-email-link" This reverts commit e963b9df48dd1f72ca0c5b192c979bac11851d11, reversing changes made to cc9cf81e9d76c42f51ffd5e102f6027d3eb5e645. * Revert "- using my email" This reverts commit cc9cf81e9d76c42f51ffd5e102f6027d3eb5e645. * Revert "- test code for sandbox" This reverts commit 06037747197d17ed8e63b086fcfcf048ecb50dc4. --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Update README.md (#2577) Add ATO Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Create 2023, Spring - Testing CSV & Excel-based error reports.md * Update README.md * Updating deliverable links (#2584) * User viewset not returning/duplicating users (#2573) * - Fixed issue not allowing pagination to work locally with nginx - Added ordering to user field to fix duplicates issue * - fix lint error * - Removing ID check since we cannot guarantee that the uuid that is generated per test run will be lexigraphically consistent --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Update cf os (#2523) * - updated nginx buildpack * - specifying different nginx version * - Updating changelog * - added script to update certain apps in cf - added workflow for each environment in circi * - fixed base config * - fixing jobs * - Updated based on feedback in OH * - Updating defaults * - Removing defaults * - Fixing indent * - Adding params to config * test * test * - updating work dir * - Adding checkout * - adding cf check * - logging into cf * - update cf check to install required binary * - removing unnecessary switch * - Forcing plugin installation * - test installing plugin from script also * - Adding new dependencies * - adding package * - fixing broken install * - fixing libs * - using correct command * - gettign correct version of libc * - trying to upgrade libs * - testing * - Updated README and script * Revert "- Updated README and script" This reverts commit 92697b3e53d1fd87b8d3e7995abb9093aa26e307. * - Removed unnecessary circi stuff - Removed script - Updated docs to callout updating secondary apps * - Correct spelling error --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Item Number Mismatch (#2578) * - Updated schemas and models to reflect correct item numbers of fields * - Revert migration * - Updated header/trailer item numbers * - Fixed item numbers off by one errors --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * pipeline filtering (#2538) * pipeline changes that filter based on paths and branches. circle ci tracks specified branches in order to keep current functionality on HHS side. * updated syntax to be in line with build-all.yml * removed comma * WIP build flow docs * added Architecture Decision Record for the change to pipeline workflows * corrected file type of doc to .md --------- Co-authored-by: George Hudson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * Hotfix Devops/2457 path filtering for documentation (#2597) * pipeline changes that filter based on paths and branches. circle ci tracks specified branches in order to keep current functionality on HHS side. * updated syntax to be in line with build-all.yml * removed comma * WIP build flow docs * added Architecture Decision Record for the change to pipeline workflows * corrected file type of doc to .md * build and test all on PRs even for documentation --------- Co-authored-by: George Hudson * Create sprint-74-summary.md (#2596) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * added URL filters (#2580) * added URL filters * allow github to trigger owasp and label deploys (#2601) Co-authored-by: George Hudson --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> Co-authored-by: George Hudson Co-authored-by: George Hudson * Create sprint-75-summary.md (#2608) * Create sprint-76-summary.md (#2609) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> * - Resolved failing tests * - Corrected merge thrash * - Using randbits to generate pk to get around confilcting sequence pks * Revert "- Using randbits to generate pk to get around confilcting sequence pks" This reverts commit ac9b0659a62f64c4114c41faf0baa659a92be07c. * - Updating region in fixture instead of factory - letting django handle transaction for test * - Moved datafile reference to avoid confusion * pushing up incomplete codebase * Other unit tests now have passed w/ good error handling * Working tests, need to get setup for case aggregates populating via DB * - Updated queries - Added helper function - Need to merge in 2579 for queries to work * minor improvement to month2int * - Fixing most merge errors * - Fixing functions * - Updated queries based on generic relation * - Updated queries to count by case number instead of record number * - Added route - Updated task to create dfs * - updated tests to include dfs * Cleaning up most comments that are no longer necessary and fixed lint issues. * making minor updates, still broken tests. * updating pipfile.lock and rebuild image resolved test issues * Reorganizing tests, still failing in test_parse.py * deleted summary file, split into other test scripts. * Fixed missing self reference. * Linting fixes. * Found reference failure in deployed env. * Removing extra returns for missing record type. * lint fix * Addressed invocation of datafile for failing test * lint update for whitespace * Intermediary commit, broken test * new assignemnts in util * - updated rejected query to correctly count objs * - Fixing most tests * - Fixed user error. Swapped numbers by accident. * - make region None to avoid PK collision * - Fix lint errors * - Updating to avoid warning * vscode merge conflict resolution (#2623) * auto-create the external network * didn't stage commit properly * checking diffs, matching 1613.2 * doesn't work in pipeline. must be cached local * re-commenting in unit test * lint failures fixed --------- Co-authored-by: andrew-jameson * url change per me, want pipeline to run e2e * Upgraded to querysets, fix PR comments, PE str * missing : not caught locally * Feat/1613 merge 2 (#2650) * Create sprint-78-summary.md (#2645) * Missing/unsaved parser_error for record_type * removing redundant tests * Hopefully resolved on unit tests and lint --------- Co-authored-by: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Co-authored-by: andrew-jameson * icontains * tests * Changing dict structure per 1612. * fixed tests and lint issues, parse is too complex * schema_manager replaces schema check * Saving state prior to merge-conflict. * Adopting latest manager, removing old error style. * Commented out t6 line during Office hours * minor reference update * Acclimating to schemaManager * lint-fix isinstance * syntax mistake with isinstance * Apply suggestions from code review * reverting search_index merge artifacts. * adjusting for removing unused "get-schema()" * whitespace lint * Feedback from Jan * Ensuring tests run/work. * Ensure we have leading zero in rptmonthyear. * Minor lint fix for exception logging * resolving merge conflict problems * added the filters for datafile progtype * added url to admin filters * added datafile summary link to admin page * filtering parser errors * linting * Test data_file admin page * corrected datafile id for test file * linting * Added deplay to cypress test * changed datafile summary filter * Changed error report link * changed filter to reflect related name --------- Co-authored-by: Andrew Jameson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> Co-authored-by: andrew-jameson Co-authored-by: elipe17 Co-authored-by: Jan Timpe Co-authored-by: Miles Reiter Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Co-authored-by: Eric Lipe <125676261+elipe17@users.noreply.github.com> Co-authored-by: Lauren Frohlich <61251539+lfrohlich@users.noreply.github.com> Co-authored-by: Miles Reiter Co-authored-by: George Hudson Co-authored-by: George Hudson --- tdrs-backend/tdpservice/data_files/admin.py | 56 +++++++++++++++++++ tdrs-backend/tdpservice/data_files/models.py | 14 +++++ .../tdpservice/data_files/test/test_admin.py | 22 ++++++++ .../cypress/e2e/accounts/accounts.js | 4 +- 4 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 tdrs-backend/tdpservice/data_files/test/test_admin.py diff --git a/tdrs-backend/tdpservice/data_files/admin.py b/tdrs-backend/tdpservice/data_files/admin.py index 1ac5b2b2c..1a049dad3 100644 --- a/tdrs-backend/tdpservice/data_files/admin.py +++ b/tdrs-backend/tdpservice/data_files/admin.py @@ -3,12 +3,64 @@ from ..core.utils import ReadOnlyAdminMixin from .models import DataFile, LegacyFileTransfer +from tdpservice.parsers.models import DataFileSummary, ParserError +from django.conf import settings +from django.utils.html import format_html +DOMAIN = settings.FRONTEND_BASE_URL + +class DataFileSummaryPrgTypeFilter(admin.SimpleListFilter): + """Admin class filter for Program Type on datafile model.""" + + title = 'Program Type' + parameter_name = 'program_type' + + def lookups(self, request, model_admin): + """Return a list of tuples.""" + return [ + ('TAN', 'TAN'), + ('SSP', 'SSP'), + ] + + def queryset(self, request, queryset): + """Return a queryset.""" + if self.value(): + query_set_ids = [df.id for df in queryset if df.prog_type == self.value()] + return queryset.filter(id__in=query_set_ids) + else: + return queryset @admin.register(DataFile) class DataFileAdmin(ReadOnlyAdminMixin, admin.ModelAdmin): """Admin class for DataFile models.""" + def status(self, obj): + """Return the status of the data file summary.""" + return DataFileSummary.objects.get(datafile=obj).status + + def case_totals(self, obj): + """Return the case totals.""" + return DataFileSummary.objects.get(datafile=obj).case_aggregates + + def error_report_link(self, obj): + """Return the link to the error report.""" + pe_len = ParserError.objects.filter(file=obj).count() + + filtered_parserror_list_url = f'{DOMAIN}/admin/parsers/parsererror/?file=' + str(obj.id) + # have to find the error id from obj + return format_html("{field}", + field="Parser Errors: " + str(pe_len), + url=filtered_parserror_list_url) + + error_report_link.allow_tags = True + + def data_file_summary(self, obj): + """Return the data file summary.""" + df = DataFileSummary.objects.get(datafile=obj) + return format_html("{field}", + field=f'{df.id}' + ":" + df.get_status(), + url=f"{DOMAIN}/admin/parsers/datafilesummary/{df.id}/change/") + list_display = [ 'id', 'stt', @@ -16,6 +68,8 @@ class DataFileAdmin(ReadOnlyAdminMixin, admin.ModelAdmin): 'quarter', 'section', 'version', + 'data_file_summary', + 'error_report_link', ] list_filter = [ @@ -25,6 +79,8 @@ class DataFileAdmin(ReadOnlyAdminMixin, admin.ModelAdmin): 'user', 'year', 'version', + 'summary__status', + DataFileSummaryPrgTypeFilter ] @admin.register(LegacyFileTransfer) diff --git a/tdrs-backend/tdpservice/data_files/models.py b/tdrs-backend/tdpservice/data_files/models.py index b4248a9cd..abfcce8ab 100644 --- a/tdrs-backend/tdpservice/data_files/models.py +++ b/tdrs-backend/tdpservice/data_files/models.py @@ -152,6 +152,20 @@ class Meta: null=True ) + @property + def prog_type(self): + """Return the program type for a given section.""" + # e.g., 'SSP Closed Case Data' + if self.section.startswith('SSP'): + return 'SSP' + elif self.section.startswith('Tribal'): + return 'TAN' # problematic, do we need to infer tribal entirely from tribe/fips code? + else: + return 'TAN' + + # TODO: if given a datafile (section), we can reverse back to the program b/c the + # section string has "tribal/ssp" in it, then process of elimination we have tanf + @property def filename(self): """Return the correct filename for this data file.""" diff --git a/tdrs-backend/tdpservice/data_files/test/test_admin.py b/tdrs-backend/tdpservice/data_files/test/test_admin.py new file mode 100644 index 000000000..02701fe82 --- /dev/null +++ b/tdrs-backend/tdpservice/data_files/test/test_admin.py @@ -0,0 +1,22 @@ +"""Test DataFileAdmin methods.""" +import pytest +from django.contrib.admin.sites import AdminSite + +from tdpservice.data_files.admin import DataFileAdmin +from tdpservice.data_files.models import DataFile +from tdpservice.data_files.test.factories import DataFileFactory +from tdpservice.parsers.test.factories import DataFileSummaryFactory +from django.conf import settings + +@pytest.mark.django_db +def test_DataFileAdmin_status(): + """Test DataFileAdmin status method.""" + data_file = DataFileFactory() + data_file_summary = DataFileSummaryFactory(datafile=data_file) + data_file_admin = DataFileAdmin(DataFile, AdminSite()) + + assert data_file_admin.status(data_file) == data_file_summary.status + assert data_file_admin.case_totals(data_file) == data_file_summary.case_aggregates + DOMAIN = settings.FRONTEND_BASE_URL + assert data_file_admin.error_report_link(data_file) == \ + f"Parser Errors: 0" diff --git a/tdrs-frontend/cypress/e2e/accounts/accounts.js b/tdrs-frontend/cypress/e2e/accounts/accounts.js index 3c6158204..a1feaedf3 100644 --- a/tdrs-frontend/cypress/e2e/accounts/accounts.js +++ b/tdrs-frontend/cypress/e2e/accounts/accounts.js @@ -8,7 +8,9 @@ Then('{string} sees a Request Access form', (username) => { Then('{string} can see the hompage', (username) => { cy.visit('/home') - cy.contains('You have been approved for access to TDP.').should('exist') + cy.wait(2000).then(() => { + cy.contains('You have been approved for access to TDP.').should('exist') + }) }) When('{string} is in begin state', (username) => { From 6fa43ad75268187a23a8b37b96edfdb231378713 Mon Sep 17 00:00:00 2001 From: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Date: Thu, 12 Oct 2023 06:01:53 -0700 Subject: [PATCH 09/49] Rename sprint-82-review.md to sprint-82-summary.md (#2726) renaming file Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- docs/Sprint-Review/{sprint-82-review.md => sprint-82-summary.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/Sprint-Review/{sprint-82-review.md => sprint-82-summary.md} (100%) diff --git a/docs/Sprint-Review/sprint-82-review.md b/docs/Sprint-Review/sprint-82-summary.md similarity index 100% rename from docs/Sprint-Review/sprint-82-review.md rename to docs/Sprint-Review/sprint-82-summary.md From 932a41ea991b83ac75ec5c93d187eb4785316d56 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Thu, 12 Oct 2023 08:18:29 -0600 Subject: [PATCH 10/49] 2429/single clamav (#2718) * removed clamav from being deployed unless in production. Pointed AV SCAN enpoint to tanf-prod clam av scanner only * added network policy to connect to prod clamAV * use prod clam av in cloudgov.py too * fixing 'f-string is missing placeholders' now that we are hardcoding prod clamav * removed quotes from add-network-policy command when interpolation not needed * removed add-network-policy from deploy-backend.sh and added documentation for how to do manually. * add nginx router and manifest * cleaned up * Update README for CLAMAV * updated README file with deployment commands * added network policy for backend to clamav router * updated boundry diagram * updated boundry diagram * Removed AV_SCAN url from cloud.gov settings file * update setting environment variable * refactored circle ci for static clam av vars since only one server now. updated docs. * needs env_var_name, not string for login-cloud-dot-gov * revert back to env_var_name type for downstream login_cloud_dot_gov command * added prod prefix back in * readd AV_SCAN_URL * changed the inline comment in common.py settings * README file rewrite * added note * readded clam av nginx router url to manifest and setting network policies in the deploy-backend.sh script * updated for using backend to set ENV for ClamAV URL. * getting rid of spaces on empty last line of manifest * Remove AV_SCAN_URL from deploy-backend * updated README for clarification for clam-av-nginx-router naming * moving setting vars for clamav server to above cf push --------- Co-authored-by: George Hudson Co-authored-by: Mo Sohani Co-authored-by: raftmsohani <97037188+raftmsohani@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- .circleci/deployment/commands.yml | 52 ++-- .circleci/deployment/jobs.yml | 9 + .circleci/deployment/workflows.yml | 7 + docs/Security-Compliance/diagram.drawio | 242 ++++++++++++++++++- docs/Security-Compliance/diagram.png | Bin 111448 -> 143550 bytes docs/Technical-Documentation/README.md | 1 + docs/Technical-Documentation/clamav.md | 48 ++++ scripts/deploy-backend.sh | 19 +- tdrs-backend/clamav-router/manifest.yml | 9 + tdrs-backend/clamav-router/nginx.conf | 20 ++ tdrs-backend/manifest.clamav.yml | 2 +- tdrs-backend/manifest.yml | 2 - tdrs-backend/tdpservice/settings/cloudgov.py | 1 - tdrs-backend/tdpservice/settings/common.py | 2 +- 14 files changed, 383 insertions(+), 31 deletions(-) create mode 100644 docs/Technical-Documentation/clamav.md create mode 100644 tdrs-backend/clamav-router/manifest.yml create mode 100644 tdrs-backend/clamav-router/nginx.conf diff --git a/.circleci/deployment/commands.yml b/.circleci/deployment/commands.yml index 54bd7d108..43adb60e3 100644 --- a/.circleci/deployment/commands.yml +++ b/.circleci/deployment/commands.yml @@ -37,16 +37,40 @@ backend-appname: <> frontend-appname: <> cf-space: <> - - deploy-clamav: - backend-appname: <> - cf-org: <> - cf-space: <> - deploy-frontend: environment: <> backend-appname: <> frontend-appname: <> cf-space: <> + clamav-cloud-dot-gov: + parameters: + backend-appname: + default: tdp-backend + type: string + cf-password: + default: CF_PASSWORD_DEV + type: env_var_name + cf-org: + default: CF_ORG + type: env_var_name + cf-space: + default: tanf-dev + type: string + cf-username: + default: CF_USERNAME_DEV + type: env_var_name + steps: + - checkout + - sudo-check + - cf-check + - login-cloud-dot-gov: + cf-password: <> + cf-org: <> + cf-space: <> + cf-username: <> + - deploy-clamav + deploy-backend: parameters: backend-appname: @@ -71,30 +95,12 @@ <> deploy-clamav: - parameters: - backend-appname: - default: tdp-backend - type: string - cf-org: - default: CF_ORG - type: env_var_name - cf-space: - default: tanf-dev - type: string steps: - run: name: Deploy ClamAV REST application command: | cf push clamav-rest -f tdrs-backend/manifest.clamav.yml \ - --var cf-space=<> \ - - run: - name: Enable internal route between backend and clamav-rest app - command: | - cf add-network-policy <> clamav-rest \ - -s <> \ - -o ${<>} \ - --protocol tcp \ - --port 9000 + --var cf-space=tanf-prod deploy-frontend: parameters: diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index 542f33136..9aa40dfa7 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -151,3 +151,12 @@ cf-password: CF_PASSWORD_PROD cf-space: tanf-prod cf-username: CF_USERNAME_PROD + prod-deploy-clamav: + executor: docker-executor + working_directory: ~/tdp-deploy + steps: + - clamav-cloud-dot-gov: + backend-appname: tdp-backend-prod + cf-password: CF_PASSWORD_PROD + cf-space: tanf-prod + cf-username: CF_USERNAME_PROD diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index 6ecaae41f..5689b83bc 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -118,6 +118,13 @@ branches: only: - master + - prod-deploy-clamav: + requires: + - deploy-infrastructure-production + filters: + branches: + only: + - master - make_erd: # from ../util folder filters: branches: diff --git a/docs/Security-Compliance/diagram.drawio b/docs/Security-Compliance/diagram.drawio index adfd23414..8ead466d8 100644 --- a/docs/Security-Compliance/diagram.drawio +++ b/docs/Security-Compliance/diagram.drawio @@ -1 +1,241 @@ -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 \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/Security-Compliance/diagram.png b/docs/Security-Compliance/diagram.png index 1bad6a52df4053d97c6510983a482a558fa5768a..306ec58459441705c0d2f1cc798872e283cb243d 100644 GIT binary patch literal 143550 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

U<7^w3Hv|IieSfE($kHo*hBk|NR5N>Rbduz%Gq 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 UDwSJ2=-?kl$4EP0>&%t^1>F1bhX4Qo literal 111448 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%0A2&cYh;^1W$a_7a^Y^Q^3aU#uL?G+D_;rCroEWqQ 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

    >Np(>}8CYGzByoWa31d+vp9_IJ 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 diff --git a/docs/Technical-Documentation/README.md b/docs/Technical-Documentation/README.md index 8d7d2b1dd..e328771cd 100644 --- a/docs/Technical-Documentation/README.md +++ b/docs/Technical-Documentation/README.md @@ -12,6 +12,7 @@ This directory contains system and architecture documentation including diagrams - [buildpack-changelog.md](./buildpack-changelog.md) : A running log of updates to our Cloud.gov buildpacks in use. - [circle-ci-audit-template.md](./circle-ci-audit-template.md) : This is a checklist document used during audits of our continuous intergration pipeline tool. - [circle-ci.md](./circle-ci.md) : Overview of our CI/CD platform jobs. +- [clamav.md](./clamav.md) : How to access ClamAV from different apps/spaces. - [cypress-integration-tests.md](./cypress-integration-tests.md) : Shows how we use Cypress to manage our end to end integration testing. - [data-file-downloads.md](./data-file-downloads.md) : Provides an architecture-level view of data file storage and downloading. - [django-admin-logging.md](./django-admin-logging.md) : Outlines sections of the Django Administrator Console and details what should be logged. diff --git a/docs/Technical-Documentation/clamav.md b/docs/Technical-Documentation/clamav.md new file mode 100644 index 000000000..894853348 --- /dev/null +++ b/docs/Technical-Documentation/clamav.md @@ -0,0 +1,48 @@ +# CLAMAV + +In order to have one CLAMAV instance, existing in prod, the Nginx router is created +for CLAMAV to forward the traffic from 'dev' and 'staging' spaces into +prod space, where the CLAMAV service exists. + +## Deploy Nginx instance +To route the clamav traffic to clamav in prod, each space needs to have one instance of _Nginx Router_ which routes traffic to clamav. + +In order to deploy the nginx router instance, change your directory to `tdrs-backend/clamav-router/` and run the following command while logged into the target space: + + +>`cf push tdp-clamav-nginx-${cf-shortened-space} -f manifest.yml --no-route` + +, where _cf-shortened-space_ can be : _dev_, _staging_, or _prod_. + +The instance name then will be set as an environment variable to redirect each instance traffic. This will deploy the nginx instance to the target environment. + +## Further communication configurations + +### Setup Individual Instances + +First, set the environment variable __AV_SCAN_URL__ as follows: +``` +Environment variable name: AV_SCAN_URL +Environment variable value: http://{nginx_instance}.apps.internal:9000/scan +``` + +### Add network policy from _{tdp-clamav-nginx}_ to clamav in prod +To enable traffic between the "__nginx instance__" and "__clamav instance in production__", we need to add the network policiy and route between the two: + +>`cf add-network-policy {nginx_instance} "clamav-rest" -s "tanf-prod" --protocol tcp --port 9000` +e.g: `{nginx_instance_name} = tdp-clamav-nginx-dev` + +### Add network policy from _{backend_instance}_ to _tdp-clamav-nginx_ + +>`cf add-network-policy {backend_instance} {nginx_instance} --protocol tcp --port 9000` + +where e.g: `backend_instance = tdp-backend-develop` + +### Add route for _tdp-clamav-nginx_ + + Note: Make sure to delete (if existing) routes that are not being used. In some rare cases, a mal-assigned network policy can interfere with outgoing traffic. As an example, a policy like + >`cf delete-route app.cloud.gov --hostname tdp-frontend-staging` + +Add route: + +>`cf map-route {nginx_instance} apps.internal --hostname {nginx_instance}` \ No newline at end of file diff --git a/scripts/deploy-backend.sh b/scripts/deploy-backend.sh index f3ed5941d..f50152891 100755 --- a/scripts/deploy-backend.sh +++ b/scripts/deploy-backend.sh @@ -40,7 +40,6 @@ set_cf_envs() "AMS_CLIENT_ID" "AMS_CLIENT_SECRET" "AMS_CONFIGURATION_ENDPOINT" - "AV_SCAN_URL" "BASE_URL" "CLAMAV_NEEDED" "CYPRESS_TOKEN" @@ -84,6 +83,15 @@ generate_jwt_cert() update_backend() { cd tdrs-backend || exit + cf unset-env "$CGAPPNAME_BACKEND" "AV_SCAN_URL" + + if ["$CF_SPACE" = "tanf-prod" ]; then + cf set-env "$CGAPPNAME_BACKEND" AV_SCAN_URL "http://tanf-prod-clamav-rest.apps.internal:9000/scan" + else + # Add environment varilables for clamav + cf set-env "$CGAPPNAME_BACKEND" AV_SCAN_URL "http://tdp-clamav-nginx-$env.apps.internal:9000/scan" + fi + if [ "$1" = "rolling" ] ; then set_cf_envs @@ -101,11 +109,18 @@ update_backend() fi set_cf_envs - + cf map-route "$CGAPPNAME_BACKEND" apps.internal --hostname "$CGAPPNAME_BACKEND" # Add network policy to allow frontend to access backend cf add-network-policy "$CGAPPNAME_FRONTEND" "$CGAPPNAME_BACKEND" --protocol tcp --port 8080 + + if ["$CF_SPACE" = "tanf-prod" ]; then + # Add network policy to allow backend to access tanf-prod services + cf add-network-policy "$CGAPPNAME_BACKEND" clamav-rest --protocol tcp --port 9000 + else + cf add-network-policy "$CGAPPNAME_BACKEND" tdp-clamav-nginx-$env --protocol tcp --port 9000 + fi cd .. } diff --git a/tdrs-backend/clamav-router/manifest.yml b/tdrs-backend/clamav-router/manifest.yml new file mode 100644 index 000000000..0df08de81 --- /dev/null +++ b/tdrs-backend/clamav-router/manifest.yml @@ -0,0 +1,9 @@ +version: 1 +applications: +- name: tdp-clamav-nginx + buildpacks: + - https://github.com/cloudfoundry/nginx-buildpack.git#v1.2.6 + memory: 32M + instances: 1 + disk_quota: 64M + timeout: 180 diff --git a/tdrs-backend/clamav-router/nginx.conf b/tdrs-backend/clamav-router/nginx.conf new file mode 100644 index 000000000..50cc6395b --- /dev/null +++ b/tdrs-backend/clamav-router/nginx.conf @@ -0,0 +1,20 @@ +events { worker_connections 1024; +} + +# This opens a route to clamav prod +http{ + server { + listen {{port}}; + location /scan { + proxy_pass http://tanf-prod-clamav-rest.apps.internal:9000/scan; + proxy_pass_request_headers on; + } + } + server { + listen 9000; + location /scan { + proxy_pass http://tanf-prod-clamav-rest.apps.internal:9000/scan; + proxy_pass_request_headers on; + } + } +} diff --git a/tdrs-backend/manifest.clamav.yml b/tdrs-backend/manifest.clamav.yml index 6883e83e5..157064ea8 100644 --- a/tdrs-backend/manifest.clamav.yml +++ b/tdrs-backend/manifest.clamav.yml @@ -9,4 +9,4 @@ applications: env: MAX_FILE_SIZE: 200M routes: - - route: ((cf-space))-clamav-rest.apps.internal + - route: tanf-prod-clamav-rest.apps.internal diff --git a/tdrs-backend/manifest.yml b/tdrs-backend/manifest.yml index dcf688000..bc059b375 100755 --- a/tdrs-backend/manifest.yml +++ b/tdrs-backend/manifest.yml @@ -6,5 +6,3 @@ applications: disk_quota: 2G docker: image: ((docker-backend)) - env: - AV_SCAN_URL: http://((cf-space))-clamav-rest.apps.internal:9000/scan diff --git a/tdrs-backend/tdpservice/settings/cloudgov.py b/tdrs-backend/tdpservice/settings/cloudgov.py index 541d98cc0..6f7c7342b 100644 --- a/tdrs-backend/tdpservice/settings/cloudgov.py +++ b/tdrs-backend/tdpservice/settings/cloudgov.py @@ -43,7 +43,6 @@ class CloudGov(Common): cloudgov_space = cloudgov_app.get('space_name', 'tanf-dev') cloudgov_space_suffix = cloudgov_space.strip('tanf-') - AV_SCAN_URL = f'http://tanf-{cloudgov_space_suffix}-clamav-rest.apps.internal:9000/scan' cloudgov_name = cloudgov_app.get('name').split("-")[-1] # converting "tdp-backend-name" to just "name" services_basename = cloudgov_name if ( cloudgov_name == "develop" and cloudgov_space_suffix == "staging" diff --git a/tdrs-backend/tdpservice/settings/common.py b/tdrs-backend/tdpservice/settings/common.py index e69a0b8c8..9abbb2c15 100644 --- a/tdrs-backend/tdpservice/settings/common.py +++ b/tdrs-backend/tdpservice/settings/common.py @@ -326,7 +326,7 @@ class Common(Configuration): logger.debug("RAW_CLAMAV: " + str(RAW_CLAMAV)) CLAMAV_NEEDED = bool(strtobool(RAW_CLAMAV)) - # The URL endpoint to send AV scan requests to (clamav-rest) + # The URL endpoint to send AV scan requests to (clamav-rest/clamav-nginx-proxy) AV_SCAN_URL = os.getenv('AV_SCAN_URL') # The factor used to determine how long to wait before retrying failed scans From 456a3906cc3554a922a9c1495a0c02d4501e7133 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 31 Oct 2023 08:03:48 -0600 Subject: [PATCH 11/49] reduced workflows from 3 deploys to 1 --- .circleci/deployment/jobs.yml | 29 +++---- .circleci/deployment/workflows.yml | 124 ++++++++++++++--------------- 2 files changed, 71 insertions(+), 82 deletions(-) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index 9aa40dfa7..f3cf6ba06 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -6,9 +6,12 @@ type: string working_directory: ~/tdp-deploy steps: - - deploy-cloud-dot-gov: - backend-appname: tdp-backend-<< parameters.target_env >> - frontend-appname: tdp-frontend-<< parameters.target_env >> + when: + condition: << pipeline.parameters.run_dev_deployment >> + steps: + - deploy-cloud-dot-gov: + backend-appname: tdp-backend-<< parameters.target_env >> + frontend-appname: tdp-frontend-<< parameters.target_env >> deploy-staging: executor: docker-executor @@ -35,12 +38,12 @@ deploy-infrastructure-dev: executor: terraform/default working_directory: ~/tdp-deploy - parameters: - target_env: - type: string steps: - - deploy-infrastructure: - cf-app: << parameters.target_env >> + when: + condition: << pipeline.parameters.run_dev_deployment >> + steps: + - deploy-infrastructure: + cf-app: << parameters.target_env >> deploy-infrastructure-staging: executor: terraform/default @@ -52,16 +55,6 @@ cf-space: tanf-staging tf-path: ./terraform/staging - deploy-infrastructure-develop: - executor: terraform/default - working_directory: ~/tdp-deploy - steps: - - deploy-infrastructure: - cf-password: CF_PASSWORD_STAGING - cf-username: CF_USERNAME_STAGING - cf-space: tanf-staging - tf-path: ./terraform/staging - deploy-infrastructure-production: executor: terraform/default working_directory: ~/tdp-deploy diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index 5689b83bc..982a7a01a 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -1,43 +1,50 @@ #workflows: - dev-deployment: + deployment: when: - << pipeline.parameters.run_dev_deployment >> + or: + - equal: [ master, << pipeline.git.branch >> ] + - equal: [ main, << pipeline.git.branch >> ] + - equal: [ develop, << pipeline.git.branch >> ] + - << pipeline.parameters.run_dev_deployment >> + unless: << pipeline.parameters.run_nightly_owasp_scan >> + jobs: + - deploy-project-updates-site: + filters: + branches: + only: + - develop + - master - deploy-infrastructure-dev: - target_env: << pipeline.parameters.target_env >> - - enable-versioning: - requires: - - deploy-infrastructure-dev filters: branches: ignore: - develop - main - master - - deploy-dev: - target_env: << pipeline.parameters.target_env >> - requires: - - deploy-infrastructure-dev - - staging-deployment: - unless: - or: - - << pipeline.parameters.run_dev_deployment >> - - << pipeline.parameters.run_nightly_owasp_scan >> - jobs: - - deploy-project-updates-site: + - deploy-infrastructure-staging: filters: branches: only: - develop - - deploy-infrastructure-develop: + - main + - deploy-infrastructure-production: filters: branches: only: + - master + - enable-versioning: + requires: + - deploy-infrastructure-dev + filters: + branches: + ignore: - develop + - main + - master - enable-versioning: requires: - - deploy-infrastructure-develop + - deploy-infrastructure-staging target_env: develop cf-password: CF_PASSWORD_STAGING cf-username: CF_USERNAME_STAGING @@ -46,41 +53,52 @@ branches: only: - develop - - deploy-develop: + - enable-versioning: requires: - - deploy-infrastructure-develop + - deploy-infrastructure-staging + target_env: staging + cf-password: CF_PASSWORD_STAGING + cf-username: CF_USERNAME_STAGING + cf-space: tanf-staging filters: branches: only: - - develop - - test-deployment-e2e: + - main + - enable-versioning: requires: - - deploy-develop + - deploy-infrastructure-production + target_env: prod + cf-password: CF_PASSWORD_PROD + cf-username: CF_USERNAME_PROD + cf-space: tanf-prod filters: branches: only: - - develop - - make_erd: # from ../util folder + - master + - prod-deploy-clamav: + requires: + - deploy-infrastructure-production filters: branches: only: - - develop - - deploy-infrastructure-staging: + - master + - deploy-dev: + target_env: << pipeline.parameters.target_env >> + requires: + - deploy-infrastructure-dev filters: branches: - only: + ignore: + - develop - main - - enable-versioning: + - master + - deploy-develop: requires: - - deploy-infrastructure-staging - target_env: staging - cf-password: CF_PASSWORD_STAGING - cf-username: CF_USERNAME_STAGING - cf-space: tanf-staging + - deploy-infrastructure-develop filters: branches: only: - - main + - develop - deploy-staging: requires: - deploy-infrastructure-staging @@ -88,29 +106,6 @@ branches: only: - main - - production-deployment: - unless: - or: - - << pipeline.parameters.run_dev_deployment >> - - << pipeline.parameters.run_nightly_owasp_scan >> - jobs: - - deploy-infrastructure-production: - filters: - branches: - only: - - master - - enable-versioning: - requires: - - deploy-infrastructure-production - target_env: prod - cf-password: CF_PASSWORD_PROD - cf-username: CF_USERNAME_PROD - cf-space: tanf-prod - filters: - branches: - only: - - master - deploy-production: requires: - deploy-infrastructure-production @@ -118,16 +113,17 @@ branches: only: - master - - prod-deploy-clamav: + - test-deployment-e2e: requires: - - deploy-infrastructure-production + - deploy-develop filters: branches: only: - - master + - develop - make_erd: # from ../util folder filters: branches: only: + - develop - master - + \ No newline at end of file From 7e0a5ab0138c67684aa5b410fcc9d609e8523d97 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 31 Oct 2023 09:00:36 -0600 Subject: [PATCH 12/49] fix spacing of nested 'steps:' --- .circleci/deployment/jobs.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index f3cf6ba06..d7de9ff14 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -8,10 +8,10 @@ steps: when: condition: << pipeline.parameters.run_dev_deployment >> - steps: - - deploy-cloud-dot-gov: - backend-appname: tdp-backend-<< parameters.target_env >> - frontend-appname: tdp-frontend-<< parameters.target_env >> + steps: + - deploy-cloud-dot-gov: + backend-appname: tdp-backend-<< parameters.target_env >> + frontend-appname: tdp-frontend-<< parameters.target_env >> deploy-staging: executor: docker-executor @@ -41,7 +41,7 @@ steps: when: condition: << pipeline.parameters.run_dev_deployment >> - steps: + steps: - deploy-infrastructure: cf-app: << parameters.target_env >> From d8999ed4f6a8ad1ba3f2149e0859bc3fc1916b3e Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 31 Oct 2023 09:37:25 -0600 Subject: [PATCH 13/49] repaired logic for workflow --- .circleci/deployment/workflows.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index 982a7a01a..533ccbaad 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -1,12 +1,13 @@ #workflows: deployment: when: - or: - - equal: [ master, << pipeline.git.branch >> ] - - equal: [ main, << pipeline.git.branch >> ] - - equal: [ develop, << pipeline.git.branch >> ] - - << pipeline.parameters.run_dev_deployment >> - unless: << pipeline.parameters.run_nightly_owasp_scan >> + and: + - or: + - equal: [ master, << pipeline.git.branch >> ] + - equal: [ main, << pipeline.git.branch >> ] + - equal: [ develop, << pipeline.git.branch >> ] + - << pipeline.parameters.run_dev_deployment >> + - not: << pipeline.parameters.run_nightly_owasp_scan >> jobs: - deploy-project-updates-site: @@ -126,4 +127,3 @@ only: - develop - master - \ No newline at end of file From dca805c9c33d47a7629f66b871ecb1674c70a625 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 31 Oct 2023 09:54:13 -0600 Subject: [PATCH 14/49] trying to get right format for conditional logic in job steps --- .circleci/deployment/jobs.yml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index d7de9ff14..f37bbe76b 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -6,12 +6,12 @@ type: string working_directory: ~/tdp-deploy steps: - when: - condition: << pipeline.parameters.run_dev_deployment >> - steps: - - deploy-cloud-dot-gov: - backend-appname: tdp-backend-<< parameters.target_env >> - frontend-appname: tdp-frontend-<< parameters.target_env >> + - when: + condition: << pipeline.parameters.run_dev_deployment >> + steps: + - deploy-cloud-dot-gov: + backend-appname: tdp-backend-<< parameters.target_env >> + frontend-appname: tdp-frontend-<< parameters.target_env >> deploy-staging: executor: docker-executor @@ -39,11 +39,11 @@ executor: terraform/default working_directory: ~/tdp-deploy steps: - when: - condition: << pipeline.parameters.run_dev_deployment >> - steps: - - deploy-infrastructure: - cf-app: << parameters.target_env >> + - when: + condition: << pipeline.parameters.run_dev_deployment >> + steps: + - deploy-infrastructure: + cf-app: << parameters.target_env >> deploy-infrastructure-staging: executor: terraform/default From e881fd788949c09edc1b624adb8f15d7bde3f028 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 31 Oct 2023 11:29:13 -0600 Subject: [PATCH 15/49] fixed incorrect variable --- .circleci/deployment/jobs.yml | 12 ++++++------ .circleci/deployment/workflows.yml | 1 - 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index f37bbe76b..00bd3b278 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -1,17 +1,14 @@ # jobs: deploy-dev: executor: docker-executor - parameters: - target_env: - type: string working_directory: ~/tdp-deploy steps: - when: condition: << pipeline.parameters.run_dev_deployment >> steps: - deploy-cloud-dot-gov: - backend-appname: tdp-backend-<< parameters.target_env >> - frontend-appname: tdp-frontend-<< parameters.target_env >> + backend-appname: tdp-backend-<< pipeline.parameters.target_env >> + frontend-appname: tdp-frontend-<< pipeline.parameters.target_env >> deploy-staging: executor: docker-executor @@ -36,6 +33,9 @@ cf-username: CF_USERNAME_STAGING deploy-infrastructure-dev: + parameters: + target_env: + type: string executor: terraform/default working_directory: ~/tdp-deploy steps: @@ -43,7 +43,7 @@ condition: << pipeline.parameters.run_dev_deployment >> steps: - deploy-infrastructure: - cf-app: << parameters.target_env >> + cf-app: << pipeline.parameters.target_env >> deploy-infrastructure-staging: executor: terraform/default diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index 533ccbaad..b4fc812a4 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -84,7 +84,6 @@ only: - master - deploy-dev: - target_env: << pipeline.parameters.target_env >> requires: - deploy-infrastructure-dev filters: From 2de405597a318f8e0fe293a30091073e81f2184a Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 31 Oct 2023 11:36:00 -0600 Subject: [PATCH 16/49] adding default target_env instead of emptry string --- .circleci/base_config.yml | 2 +- .circleci/config.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/base_config.yml b/.circleci/base_config.yml index 46ff8279f..b84f08a6b 100644 --- a/.circleci/base_config.yml +++ b/.circleci/base_config.yml @@ -47,7 +47,7 @@ parameters: default: false target_env: type: string - default: '' + default: 'nil' triggered: type: boolean default: false diff --git a/.circleci/config.yml b/.circleci/config.yml index 65715debc..4141e1a87 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -39,7 +39,7 @@ parameters: default: false target_env: type: string - default: '' + default: 'nil' triggered: type: boolean default: false From 585acc8c963b0df927f63f9078f61bfb9aa0a083 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 31 Oct 2023 12:01:22 -0600 Subject: [PATCH 17/49] reverting --- .circleci/base_config.yml | 2 +- .circleci/config.yml | 2 +- .circleci/deployment/jobs.yml | 11 +++++++---- .circleci/deployment/workflows.yml | 2 ++ 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/.circleci/base_config.yml b/.circleci/base_config.yml index b84f08a6b..46ff8279f 100644 --- a/.circleci/base_config.yml +++ b/.circleci/base_config.yml @@ -47,7 +47,7 @@ parameters: default: false target_env: type: string - default: 'nil' + default: '' triggered: type: boolean default: false diff --git a/.circleci/config.yml b/.circleci/config.yml index 4141e1a87..65715debc 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -39,7 +39,7 @@ parameters: default: false target_env: type: string - default: 'nil' + default: '' triggered: type: boolean default: false diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index 00bd3b278..c24c067f1 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -1,14 +1,17 @@ # jobs: deploy-dev: executor: docker-executor + parameters: + target_env: + type: string working_directory: ~/tdp-deploy steps: - when: condition: << pipeline.parameters.run_dev_deployment >> steps: - deploy-cloud-dot-gov: - backend-appname: tdp-backend-<< pipeline.parameters.target_env >> - frontend-appname: tdp-frontend-<< pipeline.parameters.target_env >> + backend-appname: tdp-backend-<< parameters.target_env >> + frontend-appname: tdp-frontend-<< parameters.target_env >> deploy-staging: executor: docker-executor @@ -33,7 +36,7 @@ cf-username: CF_USERNAME_STAGING deploy-infrastructure-dev: - parameters: + parameters: target_env: type: string executor: terraform/default @@ -43,7 +46,7 @@ condition: << pipeline.parameters.run_dev_deployment >> steps: - deploy-infrastructure: - cf-app: << pipeline.parameters.target_env >> + cf-app: << parameters.target_env >> deploy-infrastructure-staging: executor: terraform/default diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index b4fc812a4..21cef2b11 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -17,6 +17,7 @@ - develop - master - deploy-infrastructure-dev: + target_env: << pipeline.parameters.target_env >> filters: branches: ignore: @@ -84,6 +85,7 @@ only: - master - deploy-dev: + target_env: << pipeline.parameters.target_env >> requires: - deploy-infrastructure-dev filters: From 33b647c733325fd1c32b273428d56c041e51992b Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 31 Oct 2023 12:33:20 -0600 Subject: [PATCH 18/49] fixed spacing --- .circleci/deployment/jobs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index c24c067f1..9e5557629 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -1,9 +1,9 @@ # jobs: deploy-dev: - executor: docker-executor parameters: target_env: type: string + executor: docker-executor working_directory: ~/tdp-deploy steps: - when: @@ -36,7 +36,7 @@ cf-username: CF_USERNAME_STAGING deploy-infrastructure-dev: - parameters: + parameters: target_env: type: string executor: terraform/default From 24e49d50edbb85d5ace7bef52b9af14428314c62 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 31 Oct 2023 17:06:46 -0600 Subject: [PATCH 19/49] removed old requirement and updated for current jobs. --- .circleci/deployment/workflows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index 21cef2b11..45ca1c2bc 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -96,7 +96,7 @@ - master - deploy-develop: requires: - - deploy-infrastructure-develop + - deploy-infrastructure-staging filters: branches: only: From a886f701b2bc9af1839666a7bae37e556b4c7f8d Mon Sep 17 00:00:00 2001 From: Andrew <84722778+andrew-jameson@users.noreply.github.com> Date: Thu, 2 Nov 2023 09:44:43 -0400 Subject: [PATCH 20/49] Update cloudgov.py (#2730) * Update cloudgov.py * hijack develop workflow to test deployments. * syntax typo. * I can't believe this typo. * linting whitespace * removed extra space * Adding in staging jwt_key due to recent deployment failure. * Removing self-reference branch filter for mergability --------- Co-authored-by: andrew-jameson Co-authored-by: George Hudson --- scripts/deploy-backend.sh | 6 +++++- tdrs-backend/tdpservice/settings/cloudgov.py | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/scripts/deploy-backend.sh b/scripts/deploy-backend.sh index f50152891..7fb1fb657 100755 --- a/scripts/deploy-backend.sh +++ b/scripts/deploy-backend.sh @@ -51,6 +51,8 @@ set_cf_envs() "FRONTEND_BASE_URL" "LOGGING_LEVEL" "REDIS_URI" + "JWT_KEY" + "STAGING_JWT_KEY" ) echo "Setting environment variables for $CGAPPNAME_BACKEND" @@ -62,6 +64,8 @@ set_cf_envs() cf_cmd="cf unset-env $CGAPPNAME_BACKEND $var_name ${!var_name}" $cf_cmd continue + elif [[ ("$var_name" =~ "STAGING_*") && ("$CF_SPACE" = "tanf-staging") ]]; then + var_name=$(echo "$var_name" | sed -e 's@STAGING_@@g') fi cf_cmd="cf set-env $CGAPPNAME_BACKEND $var_name ${!var_name}" @@ -128,7 +132,7 @@ update_backend() bind_backend_to_services() { echo "Binding services to app: $CGAPPNAME_BACKEND" - if [ "$CFAPPNAME_BACKEND" = "tdp-backend-develop" ]; then + if [ "$CGAPPNAME_BACKEND" = "tdp-backend-develop" ]; then # TODO: this is technical debt, we should either make staging mimic tanf-dev # or make unique services for all apps but we have a services limit # Introducing technical debt for release 3.0.0 specifically. diff --git a/tdrs-backend/tdpservice/settings/cloudgov.py b/tdrs-backend/tdpservice/settings/cloudgov.py index 6f7c7342b..b7def9383 100644 --- a/tdrs-backend/tdpservice/settings/cloudgov.py +++ b/tdrs-backend/tdpservice/settings/cloudgov.py @@ -70,7 +70,11 @@ class CloudGov(Common): # env_based_db_name = f'tdp_db_{cloudgov_space_suffix}_{cloudgov_name}' - db_name = database_creds['db_name'] if (cloudgov_space_suffix in ["prod", "staging"]) else env_based_db_name + logger.debug("css: " + cloudgov_space_suffix) + if (cloudgov_space_suffix in ["prod", "staging"]): + db_name = database_creds['db_name'] + else: + db_name = env_based_db_name DATABASES = { 'default': { From 84f357d9ac2fb485dab632e72b5d6a6aa07034aa Mon Sep 17 00:00:00 2001 From: Smithh-Co <121890311+Smithh-Co@users.noreply.github.com> Date: Thu, 2 Nov 2023 08:01:55 -0700 Subject: [PATCH 21/49] Create sprint-83-summary.md (#2728) Sprint summary Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- docs/Sprint-Review/sprint-83-summary.md | 49 +++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 docs/Sprint-Review/sprint-83-summary.md diff --git a/docs/Sprint-Review/sprint-83-summary.md b/docs/Sprint-Review/sprint-83-summary.md new file mode 100644 index 000000000..cf47de6cf --- /dev/null +++ b/docs/Sprint-Review/sprint-83-summary.md @@ -0,0 +1,49 @@ + +# Sprint 83 Summary + +09/30/23 - 10/11/23 + +Velocity: Dev (18) + +## Sprint Goal +* Complete parsing engine development for TANF Section (04) and begin SSP (01), close out subsmission history and metadata workflows (1613/12/10). +* UX to continue regional staff and in-app messaging research, errors audit approach, and bridge onboarding to >95% of total users +* DevOps to investigate singluar ClamAV (2429), resolve utlity images for CircleCI and evaluate CI/CD pipeline. + + +## Tickets +### Completed/Merged +* [#1612 Detailed case level metadata](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1612) +* [#1610 As a user, I need information about the acceptance of my data and a link for the error report](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1610) +* [#1111 TANF (04) Parsing and Validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1111) + +### Ready to Merge +* N/A + +### Submitted (QASP Review, OCIO Review) +* N/A + +### Closed (not merged) +* N/A + +## Moved to Next Sprint (Blocked, Raft Review, In Progress, Current Sprint Backlog) +### In Progress +* [#2536 [spike] Cat 4 validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2536) +* [#2709 SSP (Section 1) validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2709) +* [#2663 Investigate OWASP NightlyScan findings](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2663) + +### Blocked +* N/A + +### Raft Review +* [#2429 Singular ClamAV scanner](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2429) +* [#2664 (bug) file extension](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2664) +* [#2695 space-filled values update](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2695) +* [#2411 As system admin, I need to view metadata on parsed datafiles](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2411) + +### Demo +* Internal: + * 1111, 1610, 1612 +* External: + * 1111, 1610, 1612 + From d6784ad521f04650b045a08ce73f3ff52164307f Mon Sep 17 00:00:00 2001 From: Miles Reiter Date: Fri, 3 Nov 2023 10:00:33 -0400 Subject: [PATCH 22/49] Sprint 84 summary (#2737) * Create sprint-84-summary.md * Update sprint-84-summary.md --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- docs/Sprint-Review/sprint-84-summary.md | 61 +++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 docs/Sprint-Review/sprint-84-summary.md diff --git a/docs/Sprint-Review/sprint-84-summary.md b/docs/Sprint-Review/sprint-84-summary.md new file mode 100644 index 000000000..a22dfd912 --- /dev/null +++ b/docs/Sprint-Review/sprint-84-summary.md @@ -0,0 +1,61 @@ +# Sprint 84 Summary +10/10/23 - 10/24/23 + +Velocity: Dev (10) + +### Sprint Goal +* Dev: + * Continue parsing engine development + * Complete SSP Sec (01) and SSP Sec (02) + * Resolve deployment blocker + * Coordinate w/ OFA and draft dev contingency plan for future gov shutdown +* DevOps: + * 2429 - Singular Clam AV + * 2722 - Singular deployment workflow +* UX: Resume regional staff research, synthesize in-app messaging research, continue supporting onboarding/utilization +* Prod: Find path forward on Sendgrid + +## Tickets +### Completed/Merged +* [#2411 As system admin, I want to view metadata on parsed datafiles](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2411) +* [#2429 Singular ClamAV Scanner](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2429) +* [#2664 (bug) file extension](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2664) + + + +### Ready to Merge +* [#2695 space-filled values update](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2695) +* [#2725 file input render issue](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2725) + + +### Submitted (QASP Review, OCIO Review) +* [#2701 FETCH_STTS Infinite Request](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2701) +* [#2709 SSP (Section 1) validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2709) + +### Closed (not merged) +* N/A + +## Moved to Next Sprint (Blocked, Raft Review, In Progress, Current Sprint Backlog) +### In Progress +* [#2536 [spike] Cat 4 validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2536) +* [#1119 SSP Aggregate (03) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1119) +* [#2592 Deploy celery as a separate cloud.gov app](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2592) +* [#2599 Readability enhancements for error reports](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2599) +* [#2683 ZAP result - CORS config issue](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2683) +* [#2722 simplify workflows and de-bloat pipeline code](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2722) + + +### Blocked +* N/A + +### Raft Review +* [#1118 SSP Closed Data (02) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1118) +* [#1120 SSP Stratum (04) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1120) +* [#2116 Container Registry creation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2116) +* [Spike - Investigate OWASP nightly scan findings](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2663) + +### Demo +* N/A + + + From 96452dcd6fb7343532fa7e86c4d3ac7f0c04179f Mon Sep 17 00:00:00 2001 From: Andrew <84722778+andrew-jameson@users.noreply.github.com> Date: Fri, 3 Nov 2023 12:44:47 -0400 Subject: [PATCH 23/49] Debug/develop deployment failures (#2743) * Update cloudgov.py * hijack develop workflow to test deployments. * syntax typo. * I can't believe this typo. * linting whitespace * removed extra space * Adding in staging jwt_key due to recent deployment failure. * Removing self-reference branch filter for mergability * Updated elif logic based on CI failures --------- Co-authored-by: andrew-jameson Co-authored-by: George Hudson --- scripts/deploy-backend.sh | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scripts/deploy-backend.sh b/scripts/deploy-backend.sh index 7fb1fb657..ec372396a 100755 --- a/scripts/deploy-backend.sh +++ b/scripts/deploy-backend.sh @@ -64,11 +64,13 @@ set_cf_envs() cf_cmd="cf unset-env $CGAPPNAME_BACKEND $var_name ${!var_name}" $cf_cmd continue - elif [[ ("$var_name" =~ "STAGING_*") && ("$CF_SPACE" = "tanf-staging") ]]; then - var_name=$(echo "$var_name" | sed -e 's@STAGING_@@g') + elif [[ ("$var_name" =~ "STAGING_") && ("$CF_SPACE" = "tanf-staging") ]]; then + sed_var_name=$(echo "$var_name" | sed -e 's@STAGING_@@g') + cf_cmd="cf set-env $CGAPPNAME_BACKEND $sed_var_name ${!var_name}" + else + cf_cmd="cf set-env $CGAPPNAME_BACKEND $var_name ${!var_name}" fi - - cf_cmd="cf set-env $CGAPPNAME_BACKEND $var_name ${!var_name}" + echo "Setting var : $var_name" $cf_cmd done From 7115532cd187955fe81766b9908f9461a655ccf4 Mon Sep 17 00:00:00 2001 From: Eric Lipe <125676261+elipe17@users.noreply.github.com> Date: Fri, 3 Nov 2023 12:24:39 -0600 Subject: [PATCH 24/49] File Input Render Issue (#2725) * - small grammar fix * - Fix lint suggestions * - updated message * - Fixed lint errors * - Added correct extension to datafiles without one * - Adding cherry picks for file extension error handling * - Updated regex * - updating to keep file in dropbox in event of error to help user correct their mistake. * - Fix icon rendering incorrectly * update test file extensions * - making timeout longer * - Resolved issue causing test failure - resetting timeout * - passing param * - updated nginx conf --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Miles Reiter Co-authored-by: Jan Timpe Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- tdrs-frontend/nginx/cloud.gov/buildpack.nginx.conf | 8 ++++---- tdrs-frontend/nginx/local/default.conf.template | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tdrs-frontend/nginx/cloud.gov/buildpack.nginx.conf b/tdrs-frontend/nginx/cloud.gov/buildpack.nginx.conf index 1ab4677bb..4ed6804f9 100644 --- a/tdrs-frontend/nginx/cloud.gov/buildpack.nginx.conf +++ b/tdrs-frontend/nginx/cloud.gov/buildpack.nginx.conf @@ -21,9 +21,9 @@ http { log_format compression '$remote_addr - $remote_user [$time_local] ' '"proxy_host and upstream_addr": $proxy_host $upstream_addr, ' ' "request": $request, ' - '"body_bytes_sent" : $body_bytes_sent, ' + '"body_bytes_sent" : $body_bytes_sent, ' '"request_body": $request_body, ' - '"http_x_forwarded_for": $http_x_forwarded_for, ' + '"http_x_forwarded_for": $http_x_forwarded_for, ' '"host": $host, ' ' "status": $status, ' '"proxy_add_x_forwarded_for": $proxy_add_x_forwarded_for, ' @@ -47,7 +47,7 @@ http { } client_max_body_size 100m; - + # Block all requests except ones listed in whitelist; disabled for local # First have to correct the source IP address using real_ip_header, otherwise # the IP address will be the internal IP address of the router @@ -63,7 +63,7 @@ http { set $CSP "default-src 'self';"; set $CSP "${CSP}script-src 'self';"; set $CSP "${CSP}script-src-elem 'self';"; - set $CSP "${CSP}script-src-attr 'self';"; + set $CSP "${CSP}script-src-attr 'self' 'unsafe-inline';"; set $CSP "${CSP}img-src 'self' data:;"; set $CSP "${CSP}font-src 'self';"; set $CSP "${CSP}connect-src 'self' ${CONNECT_SRC};"; diff --git a/tdrs-frontend/nginx/local/default.conf.template b/tdrs-frontend/nginx/local/default.conf.template index 2243c720b..c4d306340 100644 --- a/tdrs-frontend/nginx/local/default.conf.template +++ b/tdrs-frontend/nginx/local/default.conf.template @@ -82,7 +82,7 @@ http { set $CSP "${CSP}prefetch-src 'none';"; set $CSP "${CSP}form-action *;"; set $CSP "${CSP}script-src-elem 'self' http://localhost:* http://www.w3.org;"; - set $CSP "${CSP}script-src-attr 'self';"; + set $CSP "${CSP}script-src-attr 'self' 'unsafe-inline';"; set $CSP "${CSP}style-src-elem 'self' 'unsafe-inline';"; set $CSP "${CSP}style-src-attr 'self';"; set $CSP "${CSP}worker-src 'none';"; @@ -104,7 +104,7 @@ http { access_log /dev/stdout compression; #access_log stderr compression; - + # Content caching # saves cached fies in /tmp # cache zone name = tdp_cache @@ -126,7 +126,7 @@ http { set $CSP "default-src 'self';"; set $CSP "${CSP}script-src 'self';"; set $CSP "${CSP}script-src-elem 'self';"; - set $CSP "${CSP}script-src-attr 'self';"; + set $CSP "${CSP}script-src-attr 'self' 'unsafe-inline';"; set $CSP "${CSP}img-src 'self' data:;"; set $CSP "${CSP}font-src 'self';"; set $CSP "${CSP}manifest-src 'self';"; From 6785277b941460ed2415ee201a8919bff426118b Mon Sep 17 00:00:00 2001 From: Eric Lipe <125676261+elipe17@users.noreply.github.com> Date: Mon, 6 Nov 2023 07:48:54 -0700 Subject: [PATCH 25/49] 2695 field spaces (#2704) * - Added support to fields that can allow blanks as valid fields - Added new tests - Updated make validator to handle type errors * - Updating blank fields to not be required * - Fix lint errors - Add datafile * - updating fields to be required until guidance comes out on what is not reqruired * - ADding None check * - Error checking * - Updated to run field validators even if field is empty but is allowed to be - removed unnecessary validator - updated schemas - * - Switching back to numIsBlank * -Adding back numIsBlank * - adding isNone since empty string fields are also None * - Added all missing fields to test file - Updated incorrect fields and catch validator error * - Updating test * - Fix lint errors * - Re-added missing fields - Updating tests * - Updated tests * - Fixing errors from merge * - Removed extra flag - Updated logic on when to run field validators - Updated schemas * - Fixed failing tests * - Fix lint * - Removing unnused validator --------- Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- tdrs-backend/tdpservice/parsers/fields.py | 3 +- tdrs-backend/tdpservice/parsers/row_schema.py | 4 +- .../tdpservice/parsers/schema_defs/tanf/t1.py | 20 ++--- .../tdpservice/parsers/schema_defs/tanf/t2.py | 74 +++++++++---------- .../tdpservice/parsers/schema_defs/tanf/t3.py | 36 ++++----- .../test/data/tanf_section1_blanks.txt | 5 ++ .../tdpservice/parsers/test/test_parse.py | 43 +++++++++-- .../tdpservice/parsers/test/test_util.py | 2 +- tdrs-backend/tdpservice/parsers/validators.py | 21 +++++- 9 files changed, 128 insertions(+), 80 deletions(-) create mode 100644 tdrs-backend/tdpservice/parsers/test/data/tanf_section1_blanks.txt diff --git a/tdrs-backend/tdpservice/parsers/fields.py b/tdrs-backend/tdpservice/parsers/fields.py index fa4c73101..1487cf498 100644 --- a/tdrs-backend/tdpservice/parsers/fields.py +++ b/tdrs-backend/tdpservice/parsers/fields.py @@ -60,7 +60,8 @@ def parse_value(self, line): class TransformField(Field): """Represents a field that requires some transformation before serializing.""" - def __init__(self, transform_func, item, name, type, startIndex, endIndex, required=True, validators=[], **kwargs): + def __init__(self, transform_func, item, name, type, startIndex, endIndex, required=True, + validators=[], **kwargs): super().__init__(item, name, type, startIndex, endIndex, required, validators) self.transform_func = transform_func self.kwargs = kwargs diff --git a/tdrs-backend/tdpservice/parsers/row_schema.py b/tdrs-backend/tdpservice/parsers/row_schema.py index d19f9f5f1..83885042c 100644 --- a/tdrs-backend/tdpservice/parsers/row_schema.py +++ b/tdrs-backend/tdpservice/parsers/row_schema.py @@ -114,7 +114,9 @@ def run_field_validators(self, instance, generate_error): else: value = getattr(instance, field.name, None) - if field.required and not value_is_empty(value, field.endIndex-field.startIndex): + is_empty = value_is_empty(value, field.endIndex-field.startIndex) + should_validate = not field.required and not is_empty + if (field.required and not is_empty) or should_validate: for validator in field.validators: validator_is_valid, validator_error = validator(value) is_valid = False if not validator_is_valid else is_valid diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py index 546910386..f31bc892c 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py @@ -92,7 +92,7 @@ validators.isNumber(), ]), Field(item="5", name='STRATUM', type='string', startIndex=22, endIndex=24, - required=True, validators=[ + required=False, validators=[ validators.isInStringRange(0, 99), ]), Field(item="7", name='ZIP_CODE', type='string', startIndex=24, endIndex=29, @@ -128,7 +128,7 @@ validators.isInLimits(1, 2), ]), Field(item="15", name='RECEIVES_FOOD_STAMPS', type='number', startIndex=37, endIndex=38, - required=True, validators=[ + required=False, validators=[ validators.isInLimits(0, 2), ]), Field(item="16", name='AMT_FOOD_STAMP_ASSISTANCE', type='number', startIndex=38, endIndex=42, @@ -136,7 +136,7 @@ validators.isLargerThanOrEqualTo(0), ]), Field(item="17", name='RECEIVES_SUB_CC', type='number', startIndex=42, endIndex=43, - required=True, validators=[ + required=False, validators=[ validators.isInLimits(0, 3), ]), Field(item="18", name='AMT_SUB_CC', type='number', startIndex=43, endIndex=47, @@ -180,19 +180,19 @@ validators.isLargerThanOrEqualTo(0), ]), Field(item="24A", name='TRANSITION_SERVICES_AMOUNT', type='number', startIndex=78, endIndex=82, - required=True, validators=[ + required=False, validators=[ validators.isLargerThanOrEqualTo(0), ]), Field(item="24B", name='TRANSITION_NBR_MONTHS', type='number', startIndex=82, endIndex=85, - required=True, validators=[ + required=False, validators=[ validators.isLargerThanOrEqualTo(0), ]), Field(item="25A", name='OTHER_AMOUNT', type='number', startIndex=85, endIndex=89, - required=True, validators=[ + required=False, validators=[ validators.isLargerThanOrEqualTo(0), ]), Field(item="25B", name='OTHER_NBR_MONTHS', type='number', startIndex=89, endIndex=92, - required=True, validators=[ + required=False, validators=[ validators.isLargerThanOrEqualTo(0), ]), Field(item="26AI", name='SANC_REDUCTION_AMT', type='number', startIndex=92, endIndex=96, @@ -204,7 +204,7 @@ validators.oneOf([1, 2]), ]), Field(item="26AIII", name='FAMILY_SANC_ADULT', type='number', startIndex=97, endIndex=98, - required=True, validators=[ + required=False, validators=[ validators.oneOf([0, 1, 2]), ]), Field(item="26AIV", name='SANC_TEEN_PARENT', type='number', startIndex=98, endIndex=99, @@ -244,7 +244,7 @@ validators.oneOf([1, 2]), ]), Field(item="27", name='WAIVER_EVAL_CONTROL_GRPS', type='string', startIndex=113, endIndex=114, - required=True, validators=[ + required=False, validators=[ validators.or_validators(validators.matches('9'), validators.isEmpty()), validators.isAlphaNumeric(), ]), @@ -254,7 +254,7 @@ 6, 7, 8, 9]) ]), Field(item="29", name='FAMILY_NEW_CHILD', type='number', startIndex=116, endIndex=117, - required=True, validators=[ + required=False, validators=[ validators.oneOf([1, 2]), ]), Field(item="-1", name='BLANK', type='string', startIndex=117, endIndex=156, required=False, diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py index 74f0b9d52..1f2088b38 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py @@ -109,17 +109,17 @@ TransformField(transform_func=tanf_ssn_decryption_func, item="33", name='SSN', type='string', startIndex=29, endIndex=38, required=True, validators=[validators.validateSSN()], is_encrypted=False), - Field(item="34A", name='RACE_HISPANIC', type='number', startIndex=38, endIndex=39, required=True, + Field(item="34A", name='RACE_HISPANIC', type='number', startIndex=38, endIndex=39, required=False, validators=[validators.isInLimits(0, 2)]), - Field(item="34B", name='RACE_AMER_INDIAN', type='number', startIndex=39, endIndex=40, required=True, + Field(item="34B", name='RACE_AMER_INDIAN', type='number', startIndex=39, endIndex=40, required=False, validators=[validators.isInLimits(0, 2)]), - Field(item="34C", name='RACE_ASIAN', type='number', startIndex=40, endIndex=41, required=True, + Field(item="34C", name='RACE_ASIAN', type='number', startIndex=40, endIndex=41, required=False, validators=[validators.isInLimits(0, 2)]), - Field(item="34D", name='RACE_BLACK', type='number', startIndex=41, endIndex=42, required=True, + Field(item="34D", name='RACE_BLACK', type='number', startIndex=41, endIndex=42, required=False, validators=[validators.isInLimits(0, 2)]), - Field(item="34E", name='RACE_HAWAIIAN', type='number', startIndex=42, endIndex=43, required=True, + Field(item="34E", name='RACE_HAWAIIAN', type='number', startIndex=42, endIndex=43, required=False, validators=[validators.isInLimits(0, 2)]), - Field(item="34F", name='RACE_WHITE', type='number', startIndex=43, endIndex=44, required=True, + Field(item="34F", name='RACE_WHITE', type='number', startIndex=43, endIndex=44, required=False, validators=[validators.isInLimits(0, 2)]), Field(item="35", name='GENDER', type='number', startIndex=44, endIndex=45, required=True, validators=[validators.isLargerThanOrEqualTo(0),]), @@ -129,66 +129,66 @@ validators=[validators.oneOf([1, 2])]), Field(item="36C", name='DISABLED_TITLE_XIVAPDT', type='string', startIndex=47, endIndex=48, required=True, validators=[validators.or_validators(validators.oneOf(["1", "2"]), validators.isBlank())]), - Field(item="36D", name='AID_AGED_BLIND', type='number', startIndex=48, endIndex=49, required=True, + Field(item="36D", name='AID_AGED_BLIND', type='number', startIndex=48, endIndex=49, required=False, validators=[validators.isLargerThanOrEqualTo(0),]), Field(item="36E", name='RECEIVE_SSI', type='number', startIndex=49, endIndex=50, required=True, validators=[validators.oneOf([1, 2]),]), - Field(item="37", name='MARITAL_STATUS', type='number', startIndex=50, endIndex=51, required=True, + Field(item="37", name='MARITAL_STATUS', type='number', startIndex=50, endIndex=51, required=False, validators=[validators.isInLimits(0, 5),]), Field(item="38", name='RELATIONSHIP_HOH', type='string', startIndex=51, endIndex=53, required=True, validators=[validators.isInStringRange(1, 10),]), - Field(item="39", name='PARENT_WITH_MINOR_CHILD', type='number', startIndex=53, endIndex=54, required=True, + Field(item="39", name='PARENT_WITH_MINOR_CHILD', type='number', startIndex=53, endIndex=54, required=False, validators=[validators.isInLimits(0, 3),]), - Field(item="40", name='NEEDS_PREGNANT_WOMAN', type='number', startIndex=54, endIndex=55, required=True, + Field(item="40", name='NEEDS_PREGNANT_WOMAN', type='number', startIndex=54, endIndex=55, required=False, validators=[validators.isInLimits(0, 9),]), - Field(item="41", name='EDUCATION_LEVEL', type='string', startIndex=55, endIndex=57, required=True, + Field(item="41", name='EDUCATION_LEVEL', type='string', startIndex=55, endIndex=57, required=False, validators=[validators.or_validators(validators.isInStringRange(0, 16), validators.isInStringRange(98, 99) )]), - Field(item="42", name='CITIZENSHIP_STATUS', type='number', startIndex=57, endIndex=58, required=True, + Field(item="42", name='CITIZENSHIP_STATUS', type='number', startIndex=57, endIndex=58, required=False, validators=[validators.oneOf([0, 1, 2, 9])]), - Field(item="43", name='COOPERATION_CHILD_SUPPORT', type='number', startIndex=58, endIndex=59, required=True, - validators=[validators.oneOf([0, 1, 2, 9]),]), - Field(item="44", name='MONTHS_FED_TIME_LIMIT', type='string', startIndex=59, endIndex=62, required=True, + Field(item="43", name='COOPERATION_CHILD_SUPPORT', type='number', startIndex=58, endIndex=59, + required=False, validators=[validators.oneOf([0, 1, 2, 9]),]), + Field(item="44", name='MONTHS_FED_TIME_LIMIT', type='string', startIndex=59, endIndex=62, required=False, validators=[validators.isInStringRange(0, 999),]), - Field(item="45", name='MONTHS_STATE_TIME_LIMIT', type='string', startIndex=62, endIndex=64, required=True, + Field(item="45", name='MONTHS_STATE_TIME_LIMIT', type='string', startIndex=62, endIndex=64, required=False, validators=[validators.isInStringRange(0, 99),]), Field(item="46", name='CURRENT_MONTH_STATE_EXEMPT', type='number', startIndex=64, endIndex=65, - required=True, validators=[validators.isInLimits(0, 9),]), - Field(item="47", name='EMPLOYMENT_STATUS', type='number', startIndex=65, endIndex=66, required=True, + required=False, validators=[validators.isInLimits(0, 9),]), + Field(item="47", name='EMPLOYMENT_STATUS', type='number', startIndex=65, endIndex=66, required=False, validators=[validators.isInLimits(0, 3),]), Field(item="48", name='WORK_ELIGIBLE_INDICATOR', type='string', startIndex=66, endIndex=68, required=True, validators=[validators.or_validators(validators.isInStringRange(0, 9), validators.oneOf(('11', '12')) )]), - Field(item="49", name='WORK_PART_STATUS', type='string', startIndex=68, endIndex=70, required=True, + Field(item="49", name='WORK_PART_STATUS', type='string', startIndex=68, endIndex=70, required=False, validators=[validators.oneOf(['01', '02', '05', '07', '09', '15', '16', '17', '18', '19', '99'])]), - Field(item="50", name='UNSUB_EMPLOYMENT', type='string', startIndex=70, endIndex=72, required=True, + Field(item="50", name='UNSUB_EMPLOYMENT', type='string', startIndex=70, endIndex=72, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="51", name='SUB_PRIVATE_EMPLOYMENT', type='string', startIndex=72, endIndex=74, required=True, + Field(item="51", name='SUB_PRIVATE_EMPLOYMENT', type='string', startIndex=72, endIndex=74, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="52", name='SUB_PUBLIC_EMPLOYMENT', type='string', startIndex=74, endIndex=76, required=True, + Field(item="52", name='SUB_PUBLIC_EMPLOYMENT', type='string', startIndex=74, endIndex=76, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="53A", name='WORK_EXPERIENCE_HOP', type='string', startIndex=76, endIndex=78, required=True, + Field(item="53A", name='WORK_EXPERIENCE_HOP', type='string', startIndex=76, endIndex=78, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="53B", name='WORK_EXPERIENCE_EA', type='string', startIndex=78, endIndex=80, required=True, + Field(item="53B", name='WORK_EXPERIENCE_EA', type='string', startIndex=78, endIndex=80, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="53C", name='WORK_EXPERIENCE_HOL', type='string', startIndex=80, endIndex=82, required=True, + Field(item="53C", name='WORK_EXPERIENCE_HOL', type='string', startIndex=80, endIndex=82, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="54", name='OJT', type='string', startIndex=82, endIndex=84, required=True, validators=[ + Field(item="54", name='OJT', type='string', startIndex=82, endIndex=84, required=False, validators=[ validators.isInStringRange(0, 99), ]), - Field(item="55A", name='JOB_SEARCH_HOP', type='string', startIndex=84, endIndex=86, required=True, + Field(item="55A", name='JOB_SEARCH_HOP', type='string', startIndex=84, endIndex=86, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="55B", name='JOB_SEARCH_EA', type='string', startIndex=86, endIndex=88, required=True, + Field(item="55B", name='JOB_SEARCH_EA', type='string', startIndex=86, endIndex=88, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="55C", name='JOB_SEARCH_HOL', type='string', startIndex=88, endIndex=90, required=True, + Field(item="55C", name='JOB_SEARCH_HOL', type='string', startIndex=88, endIndex=90, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="56A", name='COMM_SERVICES_HOP', type='string', startIndex=90, endIndex=92, required=True, + Field(item="56A", name='COMM_SERVICES_HOP', type='string', startIndex=90, endIndex=92, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="56B", name='COMM_SERVICES_EA', type='string', startIndex=92, endIndex=94, required=True, + Field(item="56B", name='COMM_SERVICES_EA', type='string', startIndex=92, endIndex=94, required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="56C", name='COMM_SERVICES_HOL', type='string', startIndex=94, endIndex=96, required=True, + Field(item="56C", name='COMM_SERVICES_HOL', type='string', startIndex=94, endIndex=96, required=False, validators=[validators.isInStringRange(0, 99),]), Field(item="57A", name='VOCATIONAL_ED_TRAINING_HOP', type='string', startIndex=96, endIndex=98, required=False, validators=[validators.isInStringRange(0, 99),]), @@ -227,16 +227,16 @@ Field(item="64", name='DEEMED_HOURS_FOR_TWO_PARENT', type='string', startIndex=130, endIndex=132, required=False, validators=[validators.isInStringRange(0, 99),]), Field(item="65", name='EARNED_INCOME', type='string', startIndex=132, endIndex=136, - required=False, validators=[validators.isInStringRange(0, 9999),]), + required=True, validators=[validators.isInStringRange(0, 9999),]), Field(item="66A", name='UNEARNED_INCOME_TAX_CREDIT', type='string', startIndex=136, endIndex=140, required=False, validators=[validators.isInStringRange(0, 9999),]), Field(item="66B", name='UNEARNED_SOCIAL_SECURITY', type='string', startIndex=140, endIndex=144, - required=False, validators=[validators.isInStringRange(0, 9999),]), - Field(item="66C", name='UNEARNED_SSI', type='string', startIndex=144, endIndex=148, required=False, + required=True, validators=[validators.isInStringRange(0, 9999),]), + Field(item="66C", name='UNEARNED_SSI', type='string', startIndex=144, endIndex=148, required=True, validators=[validators.isInStringRange(0, 9999),]), - Field(item="66D", name='UNEARNED_WORKERS_COMP', type='string', startIndex=148, endIndex=152, required=False, + Field(item="66D", name='UNEARNED_WORKERS_COMP', type='string', startIndex=148, endIndex=152, required=True, validators=[validators.isInStringRange(0, 9999),]), - Field(item="66E", name='OTHER_UNEARNED_INCOME', type='string', startIndex=152, endIndex=156, required=False, + Field(item="66E", name='OTHER_UNEARNED_INCOME', type='string', startIndex=152, endIndex=156, required=True, validators=[validators.isInStringRange(0, 9999),]), ], )] diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py index d22d848df..66daa1e59 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py @@ -84,17 +84,17 @@ endIndex=37, required=True, validators=[validators.validateSSN()], is_encrypted=False), Field(item="70A", name='RACE_HISPANIC', type='number', startIndex=37, endIndex=38, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70B", name='RACE_AMER_INDIAN', type='number', startIndex=38, endIndex=39, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70C", name='RACE_ASIAN', type='number', startIndex=39, endIndex=40, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70D", name='RACE_BLACK', type='number', startIndex=40, endIndex=41, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70E", name='RACE_HAWAIIAN', type='number', startIndex=41, endIndex=42, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70F", name='RACE_WHITE', type='number', startIndex=42, endIndex=43, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="71", name='GENDER', type='number', startIndex=43, endIndex=44, required=True, validators=[ validators.isInLimits(0, 9) @@ -108,11 +108,11 @@ validators.oneOf([1, 2]) ]), Field(item="73", name='RELATIONSHIP_HOH', type='string', startIndex=46, endIndex=48, - required=True, validators=[ + required=False, validators=[ validators.isInStringRange(0, 10) ]), Field(item="74", name='PARENT_MINOR_CHILD', type='number', startIndex=48, endIndex=49, - required=True, validators=[ + required=False, validators=[ validators.oneOf([0, 2, 3]) ]), Field(item="75", name='EDUCATION_LEVEL', type='string', startIndex=49, endIndex=51, @@ -123,7 +123,7 @@ ) ]), Field(item="76", name='CITIZENSHIP_STATUS', type='number', startIndex=51, endIndex=52, - required=True, validators=[ + required=False, validators=[ validators.oneOf([0, 1, 2, 9]) ]), Field(item="77A", name='UNEARNED_SSI', type='string', startIndex=52, endIndex=56, @@ -213,17 +213,17 @@ endIndex=78, required=True, validators=[validators.validateSSN()], is_encrypted=False), Field(item="70A", name='RACE_HISPANIC', type='number', startIndex=78, endIndex=79, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70B", name='RACE_AMER_INDIAN', type='number', startIndex=79, endIndex=80, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70C", name='RACE_ASIAN', type='number', startIndex=80, endIndex=81, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70D", name='RACE_BLACK', type='number', startIndex=81, endIndex=82, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70E", name='RACE_HAWAIIAN', type='number', startIndex=82, endIndex=83, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="70F", name='RACE_WHITE', type='number', startIndex=83, endIndex=84, - required=True, validators=[validators.validateRace()]), + required=False, validators=[validators.validateRace()]), Field(item="71", name='GENDER', type='number', startIndex=84, endIndex=85, required=True, validators=[ validators.isInLimits(0, 9) @@ -237,11 +237,11 @@ validators.oneOf([1, 2]) ]), Field(item="73", name='RELATIONSHIP_HOH', type='string', startIndex=87, endIndex=89, - required=True, validators=[ + required=False, validators=[ validators.isInStringRange(0, 10) ]), Field(item="74", name='PARENT_MINOR_CHILD', type='number', startIndex=89, endIndex=90, - required=True, validators=[ + required=False, validators=[ validators.oneOf([0, 2, 3]) ]), Field(item="75", name='EDUCATION_LEVEL', type='string', startIndex=90, endIndex=92, @@ -252,7 +252,7 @@ ) ]), Field(item="76", name='CITIZENSHIP_STATUS', type='number', startIndex=92, endIndex=93, - required=True, validators=[ + required=False, validators=[ validators.oneOf([0, 1, 2, 9]) ]), Field(item="77A", name='UNEARNED_SSI', type='string', startIndex=93, endIndex=97, diff --git a/tdrs-backend/tdpservice/parsers/test/data/tanf_section1_blanks.txt b/tdrs-backend/tdpservice/parsers/test/data/tanf_section1_blanks.txt new file mode 100644 index 000000000..c9f313404 --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/test/data/tanf_section1_blanks.txt @@ -0,0 +1,5 @@ +HEADER20204A06 TAN1EN +T120201011111111112230 4033611102131 0000 00000000000008730010000000000000000 00002 222200000000222901 +T2202010111111111121219740114WTTTTTY@W 2221 1 01 01 0000 0000000000000291 +T320201011111111112120190127WTTTT90W0 222 98 00000000 +TRAILER0002643 diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index 5a940a71b..d5b126dcc 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -153,12 +153,13 @@ def test_parse_big_file(test_big_file, dfs): parser_errors = ParserError.objects.filter(file=test_big_file) - error_message = 'MONTHS_FED_TIME_LIMIT is required but a value was not provided.' - row_18_error = parser_errors.get(row_number=18, error_message=error_message) - assert row_18_error.error_type == ParserErrorCategoryChoices.FIELD_VALUE - assert row_18_error.error_message == error_message - assert row_18_error.content_type.model == 'tanf_t2' - assert row_18_error.object_id is not None + error_message = "14 is not in ['01', '02', '05', '07', '09', '15', '16', '17', '18', '19', '99']. " + \ + "or 14 is not blank." + row_118_error = parser_errors.get(row_number=118, error_message=error_message) + assert row_118_error.error_type == ParserErrorCategoryChoices.FIELD_VALUE + assert row_118_error.error_message == error_message + assert row_118_error.content_type.model == 'tanf_t2' + assert row_118_error.object_id is not None assert TANF_T1.objects.count() == expected_t1_record_count assert TANF_T2.objects.count() == expected_t2_record_count @@ -204,7 +205,7 @@ def test_parse_bad_file_missing_header(bad_file_missing_header, dfs): dfs.save() assert dfs.get_status() == DataFileSummary.Status.REJECTED - parser_errors = ParserError.objects.filter(file=bad_file_missing_header) + parser_errors = ParserError.objects.filter(file=bad_file_missing_header).order_by('created_at') assert parser_errors.count() == 2 @@ -216,7 +217,7 @@ def test_parse_bad_file_missing_header(bad_file_missing_header, dfs): assert err.content_type is None assert err.object_id is None assert errors == { - 'header': [parser_errors[1], parser_errors[0]] + 'header': list(parser_errors) } @@ -833,6 +834,32 @@ def test_parse_tanf_section3_file(tanf_section3_file): assert second.NUM_CLOSED_CASES == 3881 assert third.NUM_CLOSED_CASES == 5453 +@pytest.fixture +def tanf_section1_file_with_blanks(stt_user, stt): + """Fixture for ADS.E2J.FTP3.TS06.""" + return util.create_test_datafile('tanf_section1_blanks.txt', stt_user, stt) + +@pytest.mark.django_db() +def test_parse_tanf_section1_blanks_file(tanf_section1_file_with_blanks): + """Test section 1 fields that are allowed to have blanks.""" + parse.parse_datafile(tanf_section1_file_with_blanks) + + parser_errors = ParserError.objects.filter(file=tanf_section1_file_with_blanks) + + assert parser_errors.count() == 23 + + # Should only be cat3 validator errors + for error in parser_errors: + assert error.error_type == ParserErrorCategoryChoices.VALUE_CONSISTENCY + + t1 = TANF_T1.objects.first() + t2 = TANF_T2.objects.first() + t3 = TANF_T3.objects.first() + + assert t1.FAMILY_SANC_ADULT is None + assert t2.MARITAL_STATUS is None + assert t3.CITIZENSHIP_STATUS is None + @pytest.fixture def tanf_section4_file(stt_user, stt): """Fixture for ADS.E2J.FTP4.TS06.""" diff --git a/tdrs-backend/tdpservice/parsers/test/test_util.py b/tdrs-backend/tdpservice/parsers/test/test_util.py index b2817174e..03997597a 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_util.py +++ b/tdrs-backend/tdpservice/parsers/test/test_util.py @@ -267,7 +267,7 @@ def test_field_validators_blank_and_not_required_returns_valid(first): schema = RowSchema( model=dict, fields=[ - Field(item=1, name='first', type='string', startIndex=0, endIndex=3, required=False, validators=[ + Field(item=1, name='first', type='string', startIndex=0, endIndex=1, required=False, validators=[ passing_validator(), failing_validator() ]), diff --git a/tdrs-backend/tdpservice/parsers/validators.py b/tdrs-backend/tdpservice/parsers/validators.py index a8722794d..d5637f620 100644 --- a/tdrs-backend/tdpservice/parsers/validators.py +++ b/tdrs-backend/tdpservice/parsers/validators.py @@ -2,12 +2,23 @@ from .models import ParserErrorCategoryChoices from datetime import date +import logging + +logger = logging.getLogger(__name__) # higher order validator func def make_validator(validator_func, error_func): """Return a function accepting a value input and returning (bool, string) to represent validation state.""" - return lambda value: (True, None) if value is not None and validator_func(value) else (False, error_func(value)) + def validator(value): + try: + if validator_func(value): + return (True, None) + return (False, error_func(value)) + except Exception as e: + logger.debug(f"Caught exception in validator. Exception: {e}") + return (False, error_func(value)) + return validator def or_validators(*args, **kwargs): @@ -58,7 +69,8 @@ def sumIsEqual(condition_field, sum_fields=[]): def sumIsEqualFunc(value): sum = 0 for field in sum_fields: - sum += value[field] if type(value) is dict else getattr(value, field) + val = value[field] if type(value) is dict else getattr(value, field) + sum += 0 if val is None else val condition_val = value[condition_field] if type(value) is dict else getattr(value, condition_field) return (True, None) if sum == condition_val else (False, @@ -71,7 +83,8 @@ def sumIsLarger(fields, val): def sumIsLargerFunc(value): sum = 0 for field in fields: - sum += value[field] if type(value) is dict else getattr(value, field) + temp_val = value[field] if type(value) is dict else getattr(value, field) + sum += 0 if temp_val is None else temp_val return (True, None) if sum > val else (False, f"The sum of {fields} is not larger than {val}.") @@ -315,7 +328,7 @@ def validate(instance): MONTHS_FED_TIME_LIMIT = instance['MONTHS_FED_TIME_LIMIT'] if type(instance) is dict else \ getattr(instance, 'MONTHS_FED_TIME_LIMIT') if FAMILY_AFFILIATION == 1 and (RELATIONSHIP_HOH == 1 or RELATIONSHIP_HOH == 2): - if int(MONTHS_FED_TIME_LIMIT) < 1: + if MONTHS_FED_TIME_LIMIT is None or int(MONTHS_FED_TIME_LIMIT) < 1: return (False, 'If FAMILY_AFFILIATION == 2 and MONTHS_FED_TIME_LIMIT== 1 or 2, then MONTHS_FED_TIME_LIMIT > 1.' ) From be8f1964c8e85964c00632bbf23aceea9c18f6e8 Mon Sep 17 00:00:00 2001 From: Andrew <84722778+andrew-jameson@users.noreply.github.com> Date: Mon, 6 Nov 2023 11:57:11 -0500 Subject: [PATCH 26/49] Updating apt repo for postgres (#2744) --- tdrs-backend/apt.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tdrs-backend/apt.yml b/tdrs-backend/apt.yml index 07229ce48..f07aee4a3 100644 --- a/tdrs-backend/apt.yml +++ b/tdrs-backend/apt.yml @@ -2,7 +2,7 @@ cleancache: true keys: - https://www.postgresql.org/media/keys/ACCC4CF8.asc repos: - - deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main + - deb http://apt.postgresql.org/pub/repos/apt/ bookworm-pgdg main packages: - postgresql-client-12 - libjemalloc-dev From fcd2a1d53b01ac35362d58c7004d7baf078ef2d9 Mon Sep 17 00:00:00 2001 From: Eric Lipe <125676261+elipe17@users.noreply.github.com> Date: Tue, 7 Nov 2023 07:05:51 -0700 Subject: [PATCH 27/49] Infinite FETCH_STTS (#2720) * - Updated request to execute 5 times before throwing error * - Adding error modal when stt list is empty * - Not defaulting to show error modal * - Updated to use redux state instead of component state for request counting * - Simplifying if block * - Updated to use our pre-built modal instead of re-inventing the wheel --- .../components/STTComboBox/STTComboBox.jsx | 82 ++++++++++++++----- 1 file changed, 60 insertions(+), 22 deletions(-) diff --git a/tdrs-frontend/src/components/STTComboBox/STTComboBox.jsx b/tdrs-frontend/src/components/STTComboBox/STTComboBox.jsx index a4e2b0de3..4f8adf0f2 100644 --- a/tdrs-frontend/src/components/STTComboBox/STTComboBox.jsx +++ b/tdrs-frontend/src/components/STTComboBox/STTComboBox.jsx @@ -1,8 +1,10 @@ -import React, { useEffect } from 'react' +import React, { useEffect, useState, useRef } from 'react' import PropTypes from 'prop-types' import { useDispatch, useSelector } from 'react-redux' import { fetchSttList } from '../../actions/sttList' import ComboBox from '../ComboBox' +import Button from '../Button' +import Modal from '../Modal' /** * @param {function} selectStt - Function to reference and change the @@ -12,36 +14,72 @@ import ComboBox from '../ComboBox' * @param {function} handleBlur - Runs on blur of combo box element. * @param {function} error - Reference to stt errors object. */ + function STTComboBox({ selectStt, selectedStt, handleBlur, error }) { - const sttList = useSelector((state) => state?.stts?.sttList) + const sttListRequest = useSelector((state) => state?.stts) const dispatch = useDispatch() + const [numTries, setNumTries] = useState(0) + const [reachedMaxTries, setReachedMaxTries] = useState(false) useEffect(() => { - if (sttList.length === 0) { + if ( + sttListRequest.sttList.length === 0 && + numTries <= 3 && + !sttListRequest.loading + ) { dispatch(fetchSttList()) + setNumTries(numTries + 1) + } else if ( + sttListRequest.sttList.length === 0 && + numTries > 3 && + !reachedMaxTries + ) { + setReachedMaxTries(true) } - }, [dispatch, sttList]) + }, [dispatch, sttListRequest.sttList, numTries, reachedMaxTries]) + + const modalRef = useRef() + const headerRef = useRef() + const onSignOut = () => { + window.location.href = `${process.env.REACT_APP_BACKEND_URL}/logout/oidc` + } return ( - - - {sttList.map((stt) => ( - + ))} + + { + onSignOut() + }, + }, + ]} + /> + ) } From 6b5065862c4eb310ed842b7eec2a3db7a26d5d86 Mon Sep 17 00:00:00 2001 From: jtimpe <111305129+jtimpe@users.noreply.github.com> Date: Wed, 8 Nov 2023 14:10:05 -0500 Subject: [PATCH 28/49] Feature/2709 ssp section 1 validation (#2723) * cat 2 validation * ssp s1 cat 3 validators * debug ssp section errors * change string validators to number validators * add df to case agg query * update ssp s1 test * update ssp tests * fix lint * update test * rm prints * update validator * Update tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py Co-authored-by: Alex P. <63075587+ADPennington@users.noreply.github.com> * fix the validator i broke and update tests * udpate validator (again) * lint * Update tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py Co-authored-by: Alex P. <63075587+ADPennington@users.noreply.github.com> * lint * rm unneeded cat3 validator * update docstring * rm unused validator * update m2 validator * fix education level validation for m3 * add required=False to allow blanks * fix other education level m3 validator * rm schema comments * fix tests --------- Co-authored-by: Alex P. <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- .../tdpservice/parsers/schema_defs/ssp/m1.py | 223 ++++++++--- .../tdpservice/parsers/schema_defs/ssp/m2.py | 350 ++++++++++++++---- .../tdpservice/parsers/schema_defs/ssp/m3.py | 272 +++++++++++--- .../parsers/test/data/small_ssp_section1.txt | 38 +- .../tdpservice/parsers/test/test_parse.py | 71 ++-- tdrs-backend/tdpservice/parsers/util.py | 3 +- tdrs-backend/tdpservice/parsers/validators.py | 7 +- 7 files changed, 746 insertions(+), 218 deletions(-) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py index 7d907dfd4..479a243cf 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py @@ -14,92 +14,231 @@ preparsing_validators=[ validators.hasLength(150), ], - postparsing_validators=[], + postparsing_validators=[ + validators.if_then_validator( + condition_field='CASH_AMOUNT', condition_function=validators.isLargerThan(0), + result_field='NBR_MONTHS', result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field='CC_AMOUNT', condition_function=validators.isLargerThan(0), + result_field='CHILDREN_COVERED', result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field='CC_AMOUNT', condition_function=validators.isLargerThan(0), + result_field='CC_NBR_MONTHS', result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field='TRANSP_AMOUNT', condition_function=validators.isLargerThan(0), + result_field='TRANSP_NBR_MONTHS', result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), + result_field='WORK_REQ_SANCTION', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), + result_field='SANC_TEEN_PARENT', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), + result_field='NON_COOPERATION_CSE', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), + result_field='FAILURE_TO_COMPLY', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), + result_field='OTHER_SANCTION', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='OTHER_TOTAL_REDUCTIONS', condition_function=validators.isLargerThan(0), + result_field='FAMILY_CAP', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='OTHER_TOTAL_REDUCTIONS', condition_function=validators.isLargerThan(0), + result_field='REDUCTIONS_ON_RECEIPTS', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='OTHER_TOTAL_REDUCTIONS', condition_function=validators.isLargerThan(0), + result_field='OTHER_NON_SANCTION', result_function=validators.oneOf((1, 2)), + ), + validators.sumIsLarger([ + "AMT_FOOD_STAMP_ASSISTANCE", + "AMT_SUB_CC", + "CASH_AMOUNT", + "CC_AMOUNT", + "CC_NBR_MONTHS" + ], 0) + ], fields=[ Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), Field(item="3", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[]), + required=True, validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ]), Field(item="5", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[]), + required=True, validators=[ + validators.isAlphaNumeric() + ]), Field(item="2", name='COUNTY_FIPS_CODE', type='string', startIndex=19, endIndex=22, - required=True, validators=[]), + required=True, validators=[ + validators.isNumber(), + ]), Field(item="4", name='STRATUM', type='string', startIndex=22, endIndex=24, - required=True, validators=[]), + required=False, validators=[ + validators.isInStringRange(0, 99), + ]), Field(item="6", name='ZIP_CODE', type='string', startIndex=24, endIndex=29, - required=True, validators=[]), + required=True, validators=[ + validators.isNumber(), + ]), Field(item="7", name='DISPOSITION', type='number', startIndex=29, endIndex=30, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]), + ]), Field(item="8", name='NBR_FAMILY_MEMBERS', type='number', startIndex=30, endIndex=32, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(1, 99), + ]), Field(item="9", name='FAMILY_TYPE', type='number', startIndex=32, endIndex=33, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(1, 3), + ]), Field(item="10", name='TANF_ASST_IN_6MONTHS', type='number', startIndex=33, endIndex=34, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(1, 3), + ]), Field(item="11", name='RECEIVES_SUB_HOUSING', type='number', startIndex=34, endIndex=35, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(1, 2), + ]), Field(item="12", name='RECEIVES_MED_ASSISTANCE', type='number', startIndex=35, endIndex=36, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(1, 2), + ]), Field(item="13", name='RECEIVES_FOOD_STAMPS', type='number', startIndex=36, endIndex=37, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2), + ]), Field(item="14", name='AMT_FOOD_STAMP_ASSISTANCE', type='number', startIndex=37, endIndex=41, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="15", name='RECEIVES_SUB_CC', type='number', startIndex=41, endIndex=42, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2), + ]), Field(item="16", name='AMT_SUB_CC', type='number', startIndex=42, endIndex=46, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="17", name='CHILD_SUPPORT_AMT', type='number', startIndex=46, endIndex=50, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="18", name='FAMILY_CASH_RESOURCES', type='number', startIndex=50, endIndex=54, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="19A", name='CASH_AMOUNT', type='number', startIndex=54, endIndex=58, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="19B", name='NBR_MONTHS', type='number', startIndex=58, endIndex=61, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="20A", name='CC_AMOUNT', type='number', startIndex=61, endIndex=65, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="20B", name='CHILDREN_COVERED', type='number', startIndex=65, endIndex=67, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="20C", name='CC_NBR_MONTHS', type='number', startIndex=67, endIndex=70, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="21A", name='TRANSP_AMOUNT', type='number', startIndex=70, endIndex=74, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="21B", name='TRANSP_NBR_MONTHS', type='number', startIndex=74, endIndex=77, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="22A", name='TRANSITION_SERVICES_AMOUNT', type='number', startIndex=77, endIndex=81, - required=True, validators=[]), + required=False, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="22B", name='TRANSITION_NBR_MONTHS', type='number', startIndex=81, endIndex=84, - required=True, validators=[]), + required=False, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="23A", name='OTHER_AMOUNT', type='number', startIndex=84, endIndex=88, - required=True, validators=[]), + required=False, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="23B", name='OTHER_NBR_MONTHS', type='number', startIndex=88, endIndex=91, - required=True, validators=[]), + required=False, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="24AI", name='SANC_REDUCTION_AMT', type='number', startIndex=91, endIndex=95, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="24AII", name='WORK_REQ_SANCTION', type='number', startIndex=95, endIndex=96, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]), + ]), Field(item="24AIII", name='FAMILY_SANC_ADULT', type='number', startIndex=96, endIndex=97, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 9), + ]), Field(item="24AIV", name='SANC_TEEN_PARENT', type='number', startIndex=97, endIndex=98, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]), + ]), Field(item="24AV", name='NON_COOPERATION_CSE', type='number', startIndex=98, endIndex=99, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]), + ]), Field(item="24AVI", name='FAILURE_TO_COMPLY', type='number', startIndex=99, endIndex=100, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]), + ]), Field(item="24AVII", name='OTHER_SANCTION', type='number', startIndex=100, endIndex=101, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]), + ]), Field(item="24B", name='RECOUPMENT_PRIOR_OVRPMT', type='number', startIndex=101, endIndex=105, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="24CI", name='OTHER_TOTAL_REDUCTIONS', type='number', startIndex=105, endIndex=109, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0), + ]), Field(item="24CII", name='FAMILY_CAP', type='number', startIndex=109, endIndex=110, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]), + ]), Field(item="24CIII", name='REDUCTIONS_ON_RECEIPTS', type='number', startIndex=110, endIndex=111, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]), + ]), Field(item="24CIV", name='OTHER_NON_SANCTION', type='number', startIndex=111, endIndex=112, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]), + ]), Field(item="25", name='WAIVER_EVAL_CONTROL_GRPS', type='number', startIndex=112, endIndex=113, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 9), + ]), Field(item="-1", name='BLANK', type='string', startIndex=113, endIndex=150, required=False, validators=[]), ] diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py index 0b1b06379..58c99ccac 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py @@ -16,140 +16,352 @@ preparsing_validators=[ validators.hasLength(150), ], - postparsing_validators=[], + postparsing_validators=[ + validators.validate__FAM_AFF__SSN(), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='SSN', result_function=validators.validateSSN(), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='RACE_HISPANIC', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='RACE_AMER_INDIAN', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='RACE_ASIAN', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='RACE_BLACK', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='RACE_HAWAIIAN', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='RACE_WHITE', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='MARITAL_STATUS', result_function=validators.isInLimits(1, 5), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 2), + result_field='PARENT_MINOR_CHILD', result_function=validators.isInLimits(1, 3), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='EDUCATION_LEVEL', result_function=validators.or_validators( + validators.isInStringRange(1, 16), + validators.isInStringRange(98, 99) + ), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='COOPERATION_CHILD_SUPPORT', result_function=validators.oneOf((1, 2, 9)), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='EMPLOYMENT_STATUS', result_function=validators.isInLimits(1, 3), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='WORK_ELIGIBLE_INDICATOR', result_function=validators.or_validators( + validators.isInLimits(1, 9), + validators.oneOf((11, 12)) + ), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='WORK_PART_STATUS', result_function=validators.oneOf([ + 1, 2, 5, 7, 9, + 15, 16, 17, 18, 99 + ]), + ), + validators.if_then_validator( + condition_field='WORK_ELIGIBLE_INDICATOR', condition_function=validators.isInLimits(1, 5), + result_field='WORK_PART_STATUS', result_function=validators.notMatches(99), + ), + ], fields=[ Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), Field(item="3", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[]), + required=True, validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ]), Field(item="5", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[]), + required=True, validators=[ + validators.isAlphaNumeric() + ]), Field(item="26", name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2, 3, 5]) + ]), Field(item="27", name='NONCUSTODIAL_PARENT', type='number', startIndex=20, endIndex=21, - required=True, validators=[]), - Field(item="28", name='DATE_OF_BIRTH', type='string', startIndex=21, endIndex=29, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]) + ]), + Field(item="28", name='DATE_OF_BIRTH', type='number', startIndex=21, endIndex=29, + required=True, validators=[ + validators.isLargerThan(0) + ]), TransformField(transform_func=ssp_ssn_decryption_func, item="29", name='SSN', type='string', - startIndex=29, endIndex=38, required=True, validators=[], is_encrypted=False), - Field(item="30A", name='RACE_HISPANIC', type='number', startIndex=38, endIndex=39, required=True, - validators=[]), + startIndex=29, endIndex=38, required=True, validators=[validators.validateSSN()], + is_encrypted=False), + Field(item="30A", name='RACE_HISPANIC', type='number', startIndex=38, endIndex=39, required=False, + validators=[ + validators.isInLimits(0, 2) + ]), Field(item="30B", name='RACE_AMER_INDIAN', type='number', startIndex=39, endIndex=40, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="30C", name='RACE_ASIAN', type='number', startIndex=40, endIndex=41, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="30D", name='RACE_BLACK', type='number', startIndex=41, endIndex=42, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="30E", name='RACE_HAWAIIAN', type='number', startIndex=42, endIndex=43, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="30F", name='RACE_WHITE', type='number', startIndex=43, endIndex=44, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="31", name='GENDER', type='number', startIndex=44, endIndex=45, - required=True, validators=[]), + required=True, validators=[ + validators.isLargerThanOrEqualTo(0) + ]), Field(item="32A", name='FED_OASDI_PROGRAM', type='number', startIndex=45, endIndex=46, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]) + ]), Field(item="32B", name='FED_DISABILITY_STATUS', type='number', startIndex=46, endIndex=47, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]) + ]), Field(item="32C", name='DISABLED_TITLE_XIVAPDT', type='number', startIndex=47, endIndex=48, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]) + ]), Field(item="32D", name='AID_AGED_BLIND', type='number', startIndex=48, endIndex=49, - required=True, validators=[]), + required=False, validators=[ + validators.isLargerThanOrEqualTo(0) + ]), Field(item="32E", name='RECEIVE_SSI', type='number', startIndex=49, endIndex=50, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]) + ]), Field(item="33", name='MARITAL_STATUS', type='number', startIndex=50, endIndex=51, - required=True, validators=[]), - Field(item="34", name='RELATIONSHIP_HOH', type='number', startIndex=51, endIndex=53, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 5) + ]), + Field(item="34", name='RELATIONSHIP_HOH', type='string', startIndex=51, endIndex=53, + required=True, validators=[ + validators.isInStringRange(1, 10) + ]), Field(item="35", name='PARENT_MINOR_CHILD', type='number', startIndex=53, endIndex=54, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 3) + ]), Field(item="36", name='NEEDS_PREGNANT_WOMAN', type='number', startIndex=54, endIndex=55, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 9) + ]), Field(item="37", name='EDUCATION_LEVEL', type='number', startIndex=55, endIndex=57, - required=True, validators=[]), + required=False, validators=[ + validators.or_validators( + validators.isInLimits(0, 16), + validators.isInLimits(98, 99) + ) + ]), Field(item="38", name='CITIZENSHIP_STATUS', type='number', startIndex=57, endIndex=58, - required=True, validators=[]), + required=False, validators=[ + validators.oneOf([0, 1, 2, 3, 9]) + ]), Field(item="39", name='COOPERATION_CHILD_SUPPORT', type='number', startIndex=58, endIndex=59, - required=True, validators=[]), + required=False, validators=[ + validators.oneOf([0, 1, 2, 9]) + ]), Field(item="40", name='EMPLOYMENT_STATUS', type='number', startIndex=59, endIndex=60, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 3) + ]), Field(item="41", name='WORK_ELIGIBLE_INDICATOR', type='number', startIndex=60, endIndex=62, - required=True, validators=[]), + required=True, validators=[ + validators.or_validators( + validators.isInLimits(1, 4), + validators.isInLimits(6, 9), + validators.isInLimits(11, 12) + ) + ]), Field(item="42", name='WORK_PART_STATUS', type='number', startIndex=62, endIndex=64, - required=True, validators=[]), + required=False, validators=[ + validators.oneOf([1, 2, 5, 7, 9, 15, 16, 17, 18, 19, 99]) + ]), Field(item="43", name='UNSUB_EMPLOYMENT', type='number', startIndex=64, endIndex=66, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="44", name='SUB_PRIVATE_EMPLOYMENT', type='number', startIndex=66, endIndex=68, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="45", name='SUB_PUBLIC_EMPLOYMENT', type='number', startIndex=68, endIndex=70, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="46A", name='WORK_EXPERIENCE_HOP', type='number', startIndex=70, endIndex=72, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="46B", name='WORK_EXPERIENCE_EA', type='number', startIndex=72, endIndex=74, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="46C", name='WORK_EXPERIENCE_HOL', type='number', startIndex=74, endIndex=76, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="47", name='OJT', type='number', startIndex=76, endIndex=78, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="48A", name='JOB_SEARCH_HOP', type='number', startIndex=78, endIndex=80, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="48B", name='JOB_SEARCH_EA', type='number', startIndex=80, endIndex=82, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="48C", name='JOB_SEARCH_HOL', type='number', startIndex=82, endIndex=84, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="49A", name='COMM_SERVICES_HOP', type='number', startIndex=84, endIndex=86, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="49B", name='COMM_SERVICES_EA', type='number', startIndex=86, endIndex=88, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="49C", name='COMM_SERVICES_HOL', type='number', startIndex=88, endIndex=90, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="50A", name='VOCATIONAL_ED_TRAINING_HOP', type='number', startIndex=90, endIndex=92, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="50B", name='VOCATIONAL_ED_TRAINING_EA', type='number', startIndex=92, endIndex=94, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="50C", name='VOCATIONAL_ED_TRAINING_HOL', type='number', startIndex=94, endIndex=96, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="51A", name='JOB_SKILLS_TRAINING_HOP', type='number', startIndex=96, endIndex=98, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="51B", name='JOB_SKILLS_TRAINING_EA', type='number', startIndex=98, endIndex=100, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="51C", name='JOB_SKILLS_TRAINING_HOL', type='number', startIndex=100, endIndex=102, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="52A", name='ED_NO_HIGH_SCHOOL_DIPL_HOP', type='number', startIndex=102, endIndex=104, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="52B", name='ED_NO_HIGH_SCHOOL_DIPL_EA', type='number', startIndex=104, endIndex=106, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="52C", name='ED_NO_HIGH_SCHOOL_DIPL_HOL', type='number', startIndex=106, endIndex=108, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="53A", name='SCHOOL_ATTENDENCE_HOP', type='number', startIndex=108, endIndex=110, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="53B", name='SCHOOL_ATTENDENCE_EA', type='number', startIndex=110, endIndex=112, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="53C", name='SCHOOL_ATTENDENCE_HOL', type='number', startIndex=112, endIndex=114, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="54A", name='PROVIDE_CC_HOP', type='number', startIndex=114, endIndex=116, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="54B", name='PROVIDE_CC_EA', type='number', startIndex=116, endIndex=118, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="54C", name='PROVIDE_CC_HOL', type='number', startIndex=118, endIndex=120, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="55", name='OTHER_WORK_ACTIVITIES', type='number', startIndex=120, endIndex=122, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="56", name='DEEMED_HOURS_FOR_OVERALL', type='number', startIndex=122, endIndex=124, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="57", name='DEEMED_HOURS_FOR_TWO_PARENT', type='number', startIndex=124, endIndex=126, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 99) + ]), Field(item="58", name='EARNED_INCOME', type='number', startIndex=126, endIndex=130, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(0, 9999) + ]), Field(item="59A", name='UNEARNED_INCOME_TAX_CREDIT', type='number', startIndex=130, endIndex=134, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 9999) + ]), Field(item="59B", name='UNEARNED_SOCIAL_SECURITY', type='number', startIndex=134, endIndex=138, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(0, 9999) + ]), Field(item="59C", name='UNEARNED_SSI', type='number', startIndex=138, endIndex=142, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(0, 9999) + ]), Field(item="59D", name='UNEARNED_WORKERS_COMP', type='number', startIndex=142, endIndex=146, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(0, 9999) + ]), Field(item="59E", name='OTHER_UNEARNED_INCOME', type='number', startIndex=146, endIndex=150, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(0, 9999) + ]), ], ) ] diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py index 301e1b03e..38e66ee35 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py @@ -13,50 +13,144 @@ preparsing_validators=[ validators.notEmpty(start=19, end=60), ], - postparsing_validators=[], + postparsing_validators=[ + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='SSN', result_function=validators.validateSSN(), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_HISPANIC', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_AMER_INDIAN', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_ASIAN', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_BLACK', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_HAWAIIAN', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_WHITE', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RELATIONSHIP_HOH', result_function=validators.isInLimits(4, 9), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='PARENT_MINOR_CHILD', result_function=validators.oneOf((1, 2, 3)), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='EDUCATION_LEVEL', result_function=validators.notMatches(99), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(2), + result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2, 3, 9)), + ), + ], fields=[ Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), Field(item="3", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[]), + required=True, validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ]), Field(item="5", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[]), + required=True, validators=[ + validators.isAlphaNumeric() + ]), Field(item="60", name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2, 4]) + ]), Field(item="61", name='DATE_OF_BIRTH', type='string', startIndex=20, endIndex=28, - required=True, validators=[]), + required=True, validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ]), TransformField(transform_func=ssp_ssn_decryption_func, item="62", name='SSN', type='string', startIndex=28, - endIndex=37, required=True, validators=[], is_encrypted=False), + endIndex=37, required=True, is_encrypted=False, validators=[ + validators.validateSSN() + ]), Field(item="63A", name='RACE_HISPANIC', type='number', startIndex=37, endIndex=38, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63B", name='RACE_AMER_INDIAN', type='number', startIndex=38, endIndex=39, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63C", name='RACE_ASIAN', type='number', startIndex=39, endIndex=40, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63D", name='RACE_BLACK', type='number', startIndex=40, endIndex=41, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63E", name='RACE_HAWAIIAN', type='number', startIndex=41, endIndex=42, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63F", name='RACE_WHITE', type='number', startIndex=42, endIndex=43, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="64", name='GENDER', type='number', startIndex=43, endIndex=44, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(0, 9) + ]), Field(item="65A", name='RECEIVE_NONSSI_BENEFITS', type='number', startIndex=44, endIndex=45, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]) + ]), Field(item="65B", name='RECEIVE_SSI', type='number', startIndex=45, endIndex=46, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]) + ]), Field(item="66", name='RELATIONSHIP_HOH', type='number', startIndex=46, endIndex=48, - required=True, validators=[]), + required=False, validators=[ + validators.isInStringRange(0, 10) + ]), Field(item="67", name='PARENT_MINOR_CHILD', type='number', startIndex=48, endIndex=49, - required=True, validators=[]), + required=False, validators=[ + validators.oneOf([0, 2, 3]) + ]), Field(item="68", name='EDUCATION_LEVEL', type='number', startIndex=49, endIndex=51, - required=True, validators=[]), + required=True, validators=[ + validators.or_validators( + validators.isInStringRange(0, 16), + validators.isInStringRange(98, 99) + ) + ]), Field(item="69", name='CITIZENSHIP_STATUS', type='number', startIndex=51, endIndex=52, - required=True, validators=[]), + required=False, validators=[ + validators.oneOf([0, 1, 2, 3, 9]) + ]), Field(item="70A", name='UNEARNED_SSI', type='number', startIndex=52, endIndex=56, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(0, 9999) + ]), Field(item="70B", name='OTHER_UNEARNED_INCOME', type='number', startIndex=56, endIndex=60, - required=True, validators=[]) + required=True, validators=[ + validators.isInLimits(0, 9999) + ]) ] ) @@ -66,50 +160,144 @@ preparsing_validators=[ validators.notEmpty(start=60, end=101), ], - postparsing_validators=[], + postparsing_validators=[ + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='SSN', result_function=validators.validateSSN(), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_HISPANIC', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_AMER_INDIAN', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_ASIAN', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_BLACK', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_HAWAIIAN', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RACE_WHITE', result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='RELATIONSHIP_HOH', result_function=validators.isInStringRange(4, 9), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), + result_field='PARENT_MINOR_CHILD', result_function=validators.oneOf((1, 2, 3)), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='EDUCATION_LEVEL', result_function=validators.notMatches(99), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(2), + result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2, 3, 9)), + ), + ], fields=[ Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, required=True, validators=[]), Field(item="3", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[]), + required=True, validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ]), Field(item="5", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[]), + required=True, validators=[ + validators.isAlphaNumeric() + ]), Field(item="60", name='FAMILY_AFFILIATION', type='number', startIndex=60, endIndex=61, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2, 4]) + ]), Field(item="61", name='DATE_OF_BIRTH', type='string', startIndex=61, endIndex=69, - required=True, validators=[]), + required=True, validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ]), TransformField(transform_func=ssp_ssn_decryption_func, item="62", name='SSN', type='string', startIndex=69, - endIndex=78, required=True, validators=[], is_encrypted=False), + endIndex=78, required=True, is_encrypted=False, validators=[ + validators.validateSSN() + ]), Field(item="63A", name='RACE_HISPANIC', type='number', startIndex=78, endIndex=79, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63B", name='RACE_AMER_INDIAN', type='number', startIndex=79, endIndex=80, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63C", name='RACE_ASIAN', type='number', startIndex=80, endIndex=81, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63D", name='RACE_BLACK', type='number', startIndex=81, endIndex=82, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63E", name='RACE_HAWAIIAN', type='number', startIndex=82, endIndex=83, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="63F", name='RACE_WHITE', type='number', startIndex=83, endIndex=84, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 2) + ]), Field(item="64", name='GENDER', type='number', startIndex=84, endIndex=85, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(0, 9) + ]), Field(item="65A", name='RECEIVE_NONSSI_BENEFITS', type='number', startIndex=85, endIndex=86, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]) + ]), Field(item="65B", name='RECEIVE_SSI', type='number', startIndex=86, endIndex=87, - required=True, validators=[]), + required=True, validators=[ + validators.oneOf([1, 2]) + ]), Field(item="66", name='RELATIONSHIP_HOH', type='number', startIndex=87, endIndex=89, - required=True, validators=[]), + required=False, validators=[ + validators.isInLimits(0, 10) + ]), Field(item="67", name='PARENT_MINOR_CHILD', type='number', startIndex=89, endIndex=90, - required=True, validators=[]), + required=False, validators=[ + validators.oneOf([0, 2, 3]) + ]), Field(item="68", name='EDUCATION_LEVEL', type='number', startIndex=90, endIndex=92, - required=True, validators=[]), + required=True, validators=[ + validators.or_validators( + validators.isInStringRange(0, 16), + validators.isInStringRange(98, 99) + ) + ]), Field(item="69", name='CITIZENSHIP_STATUS', type='number', startIndex=92, endIndex=93, - required=True, validators=[]), + required=False, validators=[ + validators.oneOf([0, 1, 2, 3, 9]) + ]), Field(item="70A", name='UNEARNED_SSI', type='number', startIndex=93, endIndex=97, - required=True, validators=[]), + required=True, validators=[ + validators.isInLimits(0, 9999) + ]), Field(item="70B", name='OTHER_UNEARNED_INCOME', type='number', startIndex=97, endIndex=101, - required=True, validators=[]) + required=True, validators=[ + validators.isInLimits(0, 9999) + ]) ] ) diff --git a/tdrs-backend/tdpservice/parsers/test/data/small_ssp_section1.txt b/tdrs-backend/tdpservice/parsers/test/data/small_ssp_section1.txt index 3feb5b513..2b63873a7 100644 --- a/tdrs-backend/tdpservice/parsers/test/data/small_ssp_section1.txt +++ b/tdrs-backend/tdpservice/parsers/test/data/small_ssp_section1.txt @@ -1,20 +1,20 @@ -HEADER20184A24 SSP1EU -M1201810111111111272140140035102133110027300000000000000010540000000000000000000000000000000000222222000000002229 -M2201810111111111271219811103WTTT#PW@W2221222222225012211111011935000000000000000000000000000000000000000000000000000000000000225300000000000000000000 -M320181011111111127120110615WTTTP99B#22212222204301100000000 -M1201810111111111982000340017102133110221300000000000000010180000000000000000000000000000000000222222000000002229 -M2201810111111111981219840123WTTT#@@PT2222212222221012211111011728000000000000000000000000000000000000000000000000000000000000175100000000000000000000 -M320181011111111198120130122WTTT##0WP22222112204398100000000 -M1201810111111112212090340591102121110288300000000000000010060000000000000000000000000000000000222222000000002229 -M2201810111111112211219840523WTTT#TBZW1222212222221012211112011400000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -M320181011111111221120160615WTTTYY#WB12222112204398100000000 -M1201810111111113562000340427102131110015300000404000000010080000000000000000000000000000000000222222000000002229 -M2201810111111113561219820116WTTTP@#YY1222222222221012211111011936000000000000000000000000000000000000000000000000000000000000205300000000000000000000 -M320181011111111356120030726WTTT0@#ZT12222222204309100000000 -M1201810111111114312120140429105233110741300000000000000010010000000000000000000000000000000000222222000000002229 -M2201810111111114311219850523WTTT0ZB9#2222212222223011212111011955000000000000000000000000000000000000000000000000000000000000482100000000000000000000 -M2201810111111114311219870621WTTTYPYZ@2222211222221101211112011400000000000000000000000000000000000000000000000000000000000000000000000000000000000000 -M320181011111111431120180615WTTT#YW0022222122204398100000001120180615WTTT#YW002222212220439810000000 -M320181011111111431120170701WTTT0B0WB22222122204398100000000 -M320181011111111431120140515WTTTPY@YW22222112204398100000000 +HEADER20234A24 SSP1EU +M1202310111111111272140140035102133110027300000000000000010540000000000000000000000000000000000222222000000002229 +M2202310111111111271219811103WTTT#PW@W2221222222225012211111011935000000000000000000000000000000000000000000000000000000000000225300000000000000000000 +M320231011111111127120110615WTTTP99B#22212222204301100000000 +M1202310111111111982000340017102133110221300000000000000010180000000000000000000000000000000000222222000000002229 +M2202310111111111981219840123WTTT#@@PT2222212222221012211111011728000000000000000000000000000000000000000000000000000000000000175100000000000000000000 +M320231011111111198120130122WTTT##0WP22222112204398100000000 +M1202310111111112212090340591102121110288300000000000000010060000000000000000000000000000000000222222000000002229 +M2202310111111112211219840523WTTT#TBZW1222212222221012211112011400000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +M320231011111111221120160615WTTTYY#WB12222112204398100000000 +M1202310111111113562000340427102131110015300000404000000010080000000000000000000000000000000000222222000000002229 +M2202310111111113561219820116WTTTP@#YY1222222222221012211111011936000000000000000000000000000000000000000000000000000000000000205300000000000000000000 +M320231011111111356120030726WTTT0@#ZT12222222204309100000000 +M1202310111111114312120140429105233110741300000000000000010010000000000000000000000000000000000222222000000002229 +M2202310111111114311219850523WTTT0ZB9#2222212222223011212111011955000000000000000000000000000000000000000000000000000000000000482100000000000000000000 +M2202310111111114311219870621WTTTYPYZ@2222211222221101211112011400000000000000000000000000000000000000000000000000000000000000000000000000000000000000 +M320231011111111431120180615WTTT#YW0022222122204398100000001120180615WTTT#YW002222212220439810000000 +M320231011111111431120170701WTTT0B0WB22222122204398100000000 +M320231011111111431120140515WTTTPY@YW22222112204398100000000 TRAILER0033991 \ No newline at end of file diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index d5b126dcc..ce41eed48 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -411,38 +411,27 @@ def test_parse_small_ssp_section1_datafile(small_ssp_section1_datafile, dfs): expected_m2_record_count = 6 expected_m3_record_count = 8 - small_ssp_section1_datafile.year = 2019 + small_ssp_section1_datafile.year = 2024 small_ssp_section1_datafile.quarter = 'Q1' small_ssp_section1_datafile.save() dfs.datafile = small_ssp_section1_datafile dfs.save() - errors = parse.parse_datafile(small_ssp_section1_datafile) + parse.parse_datafile(small_ssp_section1_datafile) dfs.status = dfs.get_status() assert dfs.status == DataFileSummary.Status.ACCEPTED_WITH_ERRORS dfs.case_aggregates = util.case_aggregates_by_month(dfs.datafile, dfs.status) assert dfs.case_aggregates == {'rejected': 1, 'months': [ - {'accepted_without_errors': 5, 'accepted_with_errors': 0, 'month': 'Oct'}, + {'accepted_without_errors': 0, 'accepted_with_errors': 5, 'month': 'Oct'}, {'accepted_without_errors': 0, 'accepted_with_errors': 0, 'month': 'Nov'}, {'accepted_without_errors': 0, 'accepted_with_errors': 0, 'month': 'Dec'} ]} parser_errors = ParserError.objects.filter(file=small_ssp_section1_datafile) - assert parser_errors.count() == 1 - - err = parser_errors.first() - - assert err.row_number == 20 - assert err.error_type == ParserErrorCategoryChoices.PRE_CHECK - assert err.error_message == 'Trailer length is 15 but must be 23 characters.' - assert err.content_type is None - assert err.object_id is None - assert errors == { - 'trailer': [err] - } + assert parser_errors.count() == 16 assert SSP_M1.objects.count() == expected_m1_record_count assert SSP_M2.objects.count() == expected_m2_record_count assert SSP_M3.objects.count() == expected_m3_record_count @@ -464,15 +453,7 @@ def test_parse_ssp_section1_datafile(ssp_section1_datafile): parse.parse_datafile(ssp_section1_datafile) parser_errors = ParserError.objects.filter(file=ssp_section1_datafile) - assert parser_errors.count() == 10 - - err = parser_errors.first() - - assert err.row_number == 10339 - assert err.error_type == ParserErrorCategoryChoices.FIELD_VALUE - assert err.error_message == 'EARNED_INCOME is required but a value was not provided.' - assert err.content_type is not None - assert err.object_id is not None + assert parser_errors.count() == 19846 assert SSP_M1.objects.count() == expected_m1_record_count assert SSP_M2.objects.count() == expected_m2_record_count @@ -650,49 +631,51 @@ def bad_ssp_s1__row_missing_required_field(stt_user, stt): @pytest.mark.django_db() def test_parse_bad_ssp_s1_missing_required(bad_ssp_s1__row_missing_required_field): """Test parsing a bad TANF Section 1 submission where a row is missing required data.""" - errors = parse.parse_datafile(bad_ssp_s1__row_missing_required_field) + parse.parse_datafile(bad_ssp_s1__row_missing_required_field) parser_errors = ParserError.objects.filter(file=bad_ssp_s1__row_missing_required_field) - assert parser_errors.count() == 5 + assert parser_errors.count() == 9 - row_2_error = parser_errors.get(row_number=2) + row_2_error = parser_errors.get( + row_number=2, + error_message='RPT_MONTH_YEAR is required but a value was not provided.' + ) assert row_2_error.error_type == ParserErrorCategoryChoices.FIELD_VALUE - assert row_2_error.error_message == 'RPT_MONTH_YEAR is required but a value was not provided.' assert row_2_error.content_type.model == 'ssp_m1' assert row_2_error.object_id is not None - row_3_error = parser_errors.get(row_number=3) + row_3_error = parser_errors.get( + row_number=3, + error_message='RPT_MONTH_YEAR is required but a value was not provided.' + ) assert row_3_error.error_type == ParserErrorCategoryChoices.FIELD_VALUE - assert row_3_error.error_message == 'RPT_MONTH_YEAR is required but a value was not provided.' assert row_3_error.content_type.model == 'ssp_m2' assert row_3_error.object_id is not None - row_4_error = parser_errors.get(row_number=4) + row_4_error = parser_errors.get( + row_number=4, + error_message='RPT_MONTH_YEAR is required but a value was not provided.' + ) assert row_4_error.error_type == ParserErrorCategoryChoices.FIELD_VALUE - assert row_4_error.error_message == 'RPT_MONTH_YEAR is required but a value was not provided.' assert row_4_error.content_type.model == 'ssp_m3' assert row_4_error.object_id is not None - row_5_error = parser_errors.get(row_number=5) + row_5_error = parser_errors.get( + row_number=5, + error_message='Unknown Record_Type was found.' + ) assert row_5_error.error_type == ParserErrorCategoryChoices.PRE_CHECK - assert row_5_error.error_message == 'Unknown Record_Type was found.' assert row_5_error.content_type is None assert row_5_error.object_id is None - trailer_error = parser_errors.get(row_number=6) + trailer_error = parser_errors.get( + row_number=6, + error_message='Trailer length is 15 but must be 23 characters.' + ) assert trailer_error.error_type == ParserErrorCategoryChoices.PRE_CHECK - assert trailer_error.error_message == 'Trailer length is 15 but must be 23 characters.' assert trailer_error.content_type is None assert trailer_error.object_id is None - assert errors == { - "2_0": [row_2_error], - "3_0": [row_3_error], - "4_0": [row_4_error], - "5_0": [row_5_error], - 'trailer': [trailer_error], - } - @pytest.mark.django_db def test_dfs_set_case_aggregates(test_datafile, dfs): """Test that the case aggregates are set correctly.""" diff --git a/tdrs-backend/tdpservice/parsers/util.py b/tdrs-backend/tdpservice/parsers/util.py index 6ed48e44e..3417ecfb2 100644 --- a/tdrs-backend/tdpservice/parsers/util.py +++ b/tdrs-backend/tdpservice/parsers/util.py @@ -320,7 +320,8 @@ def case_aggregates_by_month(df, dfs_status): case_numbers = case_numbers.union(curr_case_numbers) total += len(case_numbers) - cases_with_errors += ParserError.objects.filter(case_number__in=case_numbers).distinct('case_number').count() + cases_with_errors += ParserError.objects.filter(file=df).filter( + case_number__in=case_numbers).distinct('case_number').count() accepted = total - cases_with_errors aggregate_data['months'].append({"month": month, diff --git a/tdrs-backend/tdpservice/parsers/validators.py b/tdrs-backend/tdpservice/parsers/validators.py index d5637f620..e516a6530 100644 --- a/tdrs-backend/tdpservice/parsers/validators.py +++ b/tdrs-backend/tdpservice/parsers/validators.py @@ -298,7 +298,12 @@ def validateRace(): # outlier validators def validate__FAM_AFF__SSN(): - """If item 30 ==2 and item 42 ==1 or 2, then item 33 != 000000000 -- 999999999.""" + """ + Validate social security number provided. + + If item FAMILY_AFFILIATION ==2 and item CITIZENSHIP_STATUS ==1 or 2, + then item SSN != 000000000 -- 999999999. + """ # value is instance def validate(instance): FAMILY_AFFILIATION = instance['FAMILY_AFFILIATION'] if type(instance) is dict else \ From 872c5b07d79a6e45ab18761c16e77f63d3635a75 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Wed, 8 Nov 2023 13:38:07 -0700 Subject: [PATCH 29/49] allow circleci tdrs-run-deploy to kick off with new functionality (#2741) Co-authored-by: George Hudson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- commands.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/commands.sh b/commands.sh index 6b6146116..0ecd0fe91 100644 --- a/commands.sh +++ b/commands.sh @@ -227,7 +227,7 @@ tdrs-run-deploy() { --url https://circleci.com/api/v2/project/github/raft-tech/TANF-app/pipeline \ --header 'Circle-Token: '$CIRCLE_CI_TOKEN \ --header 'content-type: application/json' \ - --data '{"parameters":{"run_dev_deployment": true, "target_env":"'$TARGET_ENV'"}, "branch":"'$BRANCH'"}' + --data '{"parameters":{"triggered": true, "run_dev_deployment": true, "target_env":"'$TARGET_ENV'"}, "branch":"'$BRANCH'"}' } # List all aliases and functions associated with tdrs From a0b0eca849a52c4d4ed87a172b46607dd807a60d Mon Sep 17 00:00:00 2001 From: George Hudson Date: Sun, 12 Nov 2023 20:22:28 -0700 Subject: [PATCH 30/49] use this branch to check develop deploys --- .circleci/config.yml | 1 + .circleci/deployment/workflows.yml | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 65715debc..eb3be8d73 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -83,4 +83,5 @@ workflows: - main - master - /^release.*/ + - /^2722*/ #DELETE BEFORE MERGE diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index 45ca1c2bc..eb2cfb0a9 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -6,6 +6,7 @@ - equal: [ master, << pipeline.git.branch >> ] - equal: [ main, << pipeline.git.branch >> ] - equal: [ develop, << pipeline.git.branch >> ] + - equal: [ '2722/circleci', << pipeline.git.branch >> ] #DELETE BEFORE MERGE - << pipeline.parameters.run_dev_deployment >> - not: << pipeline.parameters.run_nightly_owasp_scan >> @@ -28,6 +29,7 @@ filters: branches: only: + - '2722/circleci' #DELETE BEFORE MERGE - develop - main - deploy-infrastructure-production: @@ -54,6 +56,7 @@ filters: branches: only: + - '2722/circleci' #DELETE BEFORE MERGE - develop - enable-versioning: requires: @@ -100,6 +103,7 @@ filters: branches: only: + - '2722/circleci' #DELETE BEFORE MERGE - develop - deploy-staging: requires: @@ -121,6 +125,7 @@ filters: branches: only: + - '2722/circleci' #DELETE BEFORE MERGE - develop - make_erd: # from ../util folder filters: From 12487d2c6964e50a0351347fdc8c173a4f6a2e7d Mon Sep 17 00:00:00 2001 From: George Hudson Date: Sun, 12 Nov 2023 20:43:37 -0700 Subject: [PATCH 31/49] use this branch to check develop deploys --- .circleci/deployment/workflows.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index eb2cfb0a9..0cf80e2c7 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -22,6 +22,7 @@ filters: branches: ignore: + - '2722/circleci' #DELETE BEFORE MERGE - develop - main - master @@ -94,6 +95,7 @@ filters: branches: ignore: + - '2722/circleci' #DELETE BEFORE MERGE - develop - main - master From c30f270d9f132b6809a70e6db72bfd63ccb29ae5 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Sun, 12 Nov 2023 20:45:13 -0700 Subject: [PATCH 32/49] use this branch to check develop deploys --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index eb3be8d73..f0805d469 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -83,5 +83,5 @@ workflows: - main - master - /^release.*/ - - /^2722*/ #DELETE BEFORE MERGE + - '2722/circleci' #DELETE BEFORE MERGE From 74a65578b6f27b457a854bbe0a9d31a978c8cb4c Mon Sep 17 00:00:00 2001 From: George Hudson Date: Sun, 12 Nov 2023 20:56:48 -0700 Subject: [PATCH 33/49] use this branch to check develop deploys --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index f0805d469..845b19fbe 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -73,6 +73,7 @@ workflows: - main - master - /^release.*/ + - '2722/circleci' #DELETE BEFORE MERGE circle-ci-setup: jobs: - setup: From e8a56333a00f638192250b090458d784cbef4d31 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Sun, 12 Nov 2023 21:52:31 -0700 Subject: [PATCH 34/49] use this branch to check develop deploys --- .circleci/deployment/jobs.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index 9e5557629..3aa796b45 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -6,12 +6,21 @@ executor: docker-executor working_directory: ~/tdp-deploy steps: + - run: + name: Set Initial CHECK RUN ENV + command: CHECK_RUN="false" - when: condition: << pipeline.parameters.run_dev_deployment >> steps: - deploy-cloud-dot-gov: backend-appname: tdp-backend-<< parameters.target_env >> frontend-appname: tdp-frontend-<< parameters.target_env >> + - run: + name: Update CHECK RUN + command: CHECK_RUN="true" + - run: + name: Echo Check Run + command: echo "dev-deploy run = $CHECK_RUN" deploy-staging: executor: docker-executor @@ -42,11 +51,20 @@ executor: terraform/default working_directory: ~/tdp-deploy steps: + - run: + name: Set Initial CHECK RUN ENV + command: CHECK_RUN="false" - when: condition: << pipeline.parameters.run_dev_deployment >> steps: - deploy-infrastructure: cf-app: << parameters.target_env >> + - run: + name: Update CHECK RUN + command: CHECK_RUN="true" + - run: + name: Echo Check Run + command: echo "dev-deploy run = $CHECK_RUN" deploy-infrastructure-staging: executor: terraform/default From 2a9805f732d059968258aee22453de91e9d223c3 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Sun, 12 Nov 2023 22:01:16 -0700 Subject: [PATCH 35/49] use this branch to check develop deploys --- .circleci/deployment/jobs.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index 3aa796b45..3ea1ad6bb 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -57,11 +57,11 @@ - when: condition: << pipeline.parameters.run_dev_deployment >> steps: - - deploy-infrastructure: - cf-app: << parameters.target_env >> - - run: - name: Update CHECK RUN - command: CHECK_RUN="true" + - deploy-infrastructure: + cf-app: << parameters.target_env >> + - run: + name: Update CHECK RUN + command: CHECK_RUN="true" - run: name: Echo Check Run command: echo "dev-deploy run = $CHECK_RUN" From 3dc3379180f3d1b2b737ba681e878cd15e24d2cd Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 14 Nov 2023 10:05:07 -0700 Subject: [PATCH 36/49] revert --- .circleci/deployment/jobs.yml | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index 3ea1ad6bb..9e5557629 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -6,21 +6,12 @@ executor: docker-executor working_directory: ~/tdp-deploy steps: - - run: - name: Set Initial CHECK RUN ENV - command: CHECK_RUN="false" - when: condition: << pipeline.parameters.run_dev_deployment >> steps: - deploy-cloud-dot-gov: backend-appname: tdp-backend-<< parameters.target_env >> frontend-appname: tdp-frontend-<< parameters.target_env >> - - run: - name: Update CHECK RUN - command: CHECK_RUN="true" - - run: - name: Echo Check Run - command: echo "dev-deploy run = $CHECK_RUN" deploy-staging: executor: docker-executor @@ -51,20 +42,11 @@ executor: terraform/default working_directory: ~/tdp-deploy steps: - - run: - name: Set Initial CHECK RUN ENV - command: CHECK_RUN="false" - when: condition: << pipeline.parameters.run_dev_deployment >> steps: - - deploy-infrastructure: - cf-app: << parameters.target_env >> - - run: - name: Update CHECK RUN - command: CHECK_RUN="true" - - run: - name: Echo Check Run - command: echo "dev-deploy run = $CHECK_RUN" + - deploy-infrastructure: + cf-app: << parameters.target_env >> deploy-infrastructure-staging: executor: terraform/default From 5569cf75e94bba41f19672867f86b418a7798414 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 14 Nov 2023 10:16:52 -0700 Subject: [PATCH 37/49] revert --- .circleci/deployment/jobs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index 9e5557629..f146e251d 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -12,6 +12,7 @@ - deploy-cloud-dot-gov: backend-appname: tdp-backend-<< parameters.target_env >> frontend-appname: tdp-frontend-<< parameters.target_env >> + deploy-staging: executor: docker-executor From eddc82f0b6cfcfe270486cb14dfcd6d7b2ae34dd Mon Sep 17 00:00:00 2001 From: George Hudson Date: Wed, 15 Nov 2023 09:41:10 -0700 Subject: [PATCH 38/49] revert --- .circleci/config.yml | 4 ++-- .circleci/deployment/jobs.yml | 1 - .circleci/deployment/workflows.yml | 12 ++++++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 845b19fbe..fca5b843c 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -73,7 +73,7 @@ workflows: - main - master - /^release.*/ - - '2722/circleci' #DELETE BEFORE MERGE + # - '2722/circleci' #DELETE BEFORE MERGE circle-ci-setup: jobs: - setup: @@ -84,5 +84,5 @@ workflows: - main - master - /^release.*/ - - '2722/circleci' #DELETE BEFORE MERGE + # - '2722/circleci' #DELETE BEFORE MERGE diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index f146e251d..9e5557629 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -12,7 +12,6 @@ - deploy-cloud-dot-gov: backend-appname: tdp-backend-<< parameters.target_env >> frontend-appname: tdp-frontend-<< parameters.target_env >> - deploy-staging: executor: docker-executor diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index 0cf80e2c7..66d68b882 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -6,7 +6,7 @@ - equal: [ master, << pipeline.git.branch >> ] - equal: [ main, << pipeline.git.branch >> ] - equal: [ develop, << pipeline.git.branch >> ] - - equal: [ '2722/circleci', << pipeline.git.branch >> ] #DELETE BEFORE MERGE + # - equal: [ '2722/circleci', << pipeline.git.branch >> ] #DELETE BEFORE MERGE - << pipeline.parameters.run_dev_deployment >> - not: << pipeline.parameters.run_nightly_owasp_scan >> @@ -22,7 +22,7 @@ filters: branches: ignore: - - '2722/circleci' #DELETE BEFORE MERGE + # - '2722/circleci' #DELETE BEFORE MERGE - develop - main - master @@ -30,7 +30,7 @@ filters: branches: only: - - '2722/circleci' #DELETE BEFORE MERGE + # - '2722/circleci' #DELETE BEFORE MERGE - develop - main - deploy-infrastructure-production: @@ -57,7 +57,7 @@ filters: branches: only: - - '2722/circleci' #DELETE BEFORE MERGE + # - '2722/circleci' #DELETE BEFORE MERGE - develop - enable-versioning: requires: @@ -95,7 +95,7 @@ filters: branches: ignore: - - '2722/circleci' #DELETE BEFORE MERGE + # - '2722/circleci' #DELETE BEFORE MERGE - develop - main - master @@ -105,7 +105,7 @@ filters: branches: only: - - '2722/circleci' #DELETE BEFORE MERGE + # - '2722/circleci' #DELETE BEFORE MERGE - develop - deploy-staging: requires: From 2de5500068482c1e124430234db68ff818700ed8 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Thu, 16 Nov 2023 12:45:52 -0700 Subject: [PATCH 39/49] removed check in jobs --- .circleci/deployment/jobs.yml | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/.circleci/deployment/jobs.yml b/.circleci/deployment/jobs.yml index 9e5557629..e47f5ae3b 100644 --- a/.circleci/deployment/jobs.yml +++ b/.circleci/deployment/jobs.yml @@ -6,10 +6,7 @@ executor: docker-executor working_directory: ~/tdp-deploy steps: - - when: - condition: << pipeline.parameters.run_dev_deployment >> - steps: - - deploy-cloud-dot-gov: + - deploy-cloud-dot-gov: backend-appname: tdp-backend-<< parameters.target_env >> frontend-appname: tdp-frontend-<< parameters.target_env >> @@ -42,10 +39,7 @@ executor: terraform/default working_directory: ~/tdp-deploy steps: - - when: - condition: << pipeline.parameters.run_dev_deployment >> - steps: - - deploy-infrastructure: + - deploy-infrastructure: cf-app: << parameters.target_env >> deploy-infrastructure-staging: From de37baf921e31b8c1ba033358564377e01304e3f Mon Sep 17 00:00:00 2001 From: George Hudson Date: Fri, 17 Nov 2023 09:01:27 -0700 Subject: [PATCH 40/49] updates site only for develop branch --- .circleci/deployment/workflows.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/deployment/workflows.yml b/.circleci/deployment/workflows.yml index 66d68b882..bfb7fe7a2 100644 --- a/.circleci/deployment/workflows.yml +++ b/.circleci/deployment/workflows.yml @@ -16,7 +16,6 @@ branches: only: - develop - - master - deploy-infrastructure-dev: target_env: << pipeline.parameters.target_env >> filters: From 3887e4a5582bea6fb7afa23a040117454f342655 Mon Sep 17 00:00:00 2001 From: Miles Reiter Date: Fri, 17 Nov 2023 13:49:45 -0500 Subject: [PATCH 41/49] Create sprint-85-summary.md --- docs/Sprint-Review/sprint-85-summary.md | 68 +++++++++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 docs/Sprint-Review/sprint-85-summary.md diff --git a/docs/Sprint-Review/sprint-85-summary.md b/docs/Sprint-Review/sprint-85-summary.md new file mode 100644 index 000000000..0ec36c9e4 --- /dev/null +++ b/docs/Sprint-Review/sprint-85-summary.md @@ -0,0 +1,68 @@ +# Sprint 85 Summary +10/24/23 - 11/07/23 +Velocity (Dev): 4 + +## Sprint Goal + +* Dev: + * Continue parsing engine development + * Review all SSP Sec (01-04) + * #2701 - Infinite FETCH_STT bugfix + * #2730 Resolve deployment blocker + * #2683 - ZAP CORS Misconfiguration + * Coordinate w/ OFA and draft dev contingency plan for future gov shutdown + - Document any further planning (if any beyond Andrew's use of ACF laptop) +* DevOps: + * 2429 - Singular Clam AV + * 2722 - Singular deployment workflow + * Scoped out of 2419 + * #2729 - Migrations via CircleCI + +--- + +## Tickets +### Completed/Merged +* [#2695 As tech lead, I need some space-filled values to be allowed in TANF Section 1 data files](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2695) +* [#2725 file input render issue](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2725) +* [#2701 - Infinite FETCH_STT bugfix](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2701) + + + +### Ready to Merge +* [#2709 SSP (Section 1) validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2709) + + + +### Submitted (QASP Review, OCIO Review) +* N/A + +### Closed (not merged) +* N/A + +--- + +## Moved to Next Sprint (Blocked, Raft Review, In Progress, Current Sprint Backlog) +### In Progress +* [#2536 [spike] Cat 4 validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2536) +* [#2599 Readability enhancements for error reports](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2599) +* [#2722 simplify workflows and de-bloat pipeline code](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2722) + + +### Blocked +* N/A + +### Raft Review + +* [#2683 ZAP result - CORS config issue](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2683) +* [#1118 SSP Closed Data (02) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1118) +* [#1119 SSP Aggregate (03) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1119) +* [#1120 SSP Stratum (04) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1120) +* [#2116 Container Registry creation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2116) +* [Spike - Investigate OWASP nightly scan findings](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2663) +* [Tribal TANF Active Data (01) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1114) + +### Current Sprint Backlog +* [#2592 Deploy celery as a separate cloud.gov app](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2592) + +### Demo +* N/A From 619687b7f2f7cb268bc235b5b4990c0b5dfa1c81 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Fri, 17 Nov 2023 11:56:28 -0700 Subject: [PATCH 42/49] added documentation for our Nexus repository (#2682) * added documentation for our Nexus repository * updated documentation to include VM configuration, nexus container setup, and new proxy and group repo usage. * updated reamde with qol and grammatical fixes --------- Co-authored-by: George Hudson Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- docs/Technical-Documentation/README.md | 1 + docs/Technical-Documentation/nexus-repo.md | 68 ++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 docs/Technical-Documentation/nexus-repo.md diff --git a/docs/Technical-Documentation/README.md b/docs/Technical-Documentation/README.md index e328771cd..31d6a3214 100644 --- a/docs/Technical-Documentation/README.md +++ b/docs/Technical-Documentation/README.md @@ -17,6 +17,7 @@ This directory contains system and architecture documentation including diagrams - [data-file-downloads.md](./data-file-downloads.md) : Provides an architecture-level view of data file storage and downloading. - [django-admin-logging.md](./django-admin-logging.md) : Outlines sections of the Django Administrator Console and details what should be logged. - [jwt-key-rotation.md](./jwt-key-rotation.md) : Describes the process for rotating JWT keys in Login.gov. +- [nexus-repo.md](./nexus-repo.md) : Setup, connection information, and how to use our Nexus Artifact Repository - [openid-connect.md](./openid-connect.md) : Provides an architecture-level view of the OpenID Connect prototocol. - [rafts-accessibility-dos-and-donts.md](./rafts-accessibility-dos-and-donts.md) : A succint list of UX guidelines for frontend accessibility. - [remote-development.md](./remote-development.md) : A guide on doing live remote development in Cloud.gov. diff --git a/docs/Technical-Documentation/nexus-repo.md b/docs/Technical-Documentation/nexus-repo.md new file mode 100644 index 000000000..6f4a15bf5 --- /dev/null +++ b/docs/Technical-Documentation/nexus-repo.md @@ -0,0 +1,68 @@ +# Nexus Artifact Repository + +We are using Nexus as an artifact store in order to retain docker images and other artifacts needed for our apps and pipelines. + +Nexus UI can be accessed at [https://tdp-nexus.dev.raftlabs.tech/](https://tdp-nexus.dev.raftlabs.tech/) + +## Nexus Image Management + +### Host Information + +The VM that runs the [Sonatype Nexus Image](https://help.sonatype.com/repomanager3/product-information/download) currently resides at 172.10.4.102 on Raft's internal network. You must first be connected to the labs.goraft.tech Raft Labs VPN before SSHing to the container. Current points of contact for getting setup with the VPN are Connor Meehan and Barak Stout. + +### Nexus Container Setup + +From our virtual machine, here is how to get Nexus up and running. +Pull and run nexus image: +``` +docker pull sonatype/nexus3 +docker volume create --name nexus-data +docker run -d -p 8081:8081 -p 8082:8082 -p 8083:8083 --name nexus -v nexus-data:/nexus-data sonatype/nexus3 +``` + +wait for nexus to be running +``` +docker logs -f nexus +``` + +The first time you need to log in as root, you will need the auto-generated admin password that is created upon initialization of the container. +exec into the container and get docker admin.password: +``` +docker exec -it nexus /bin/bash +cat /nexus-data/admin.password +``` + +After logging in as root for the first time, you will be taken to a page to set a new password. + +## Hosted Docker Repository + +### Setup + +In order to use Nexus as a Docker repository, the DNS for the repo needs to be able to terminate https. We are currently using cloudflare to do this. + +When creating the repository (must be signed in with admin privileges), since the nexus server isn't actually terminating the https, select the HTTP repository connector. The port can be anything you assign, as long as the tool used to terminate the https connection forwards the traffic to that port. + +In order to allow [Docker client login and connections](https://help.sonatype.com/repomanager3/nexus-repository-administration/formats/docker-registry/docker-authentication) you must set up the Docker Bearer Token Realm in Settings -> Security -> Realms -> and move the Docker Bearer Token Realm over to Active. +Also, any users will need nx-repository-view-docker-#{RepoName}-(browse && read) at a minimum and (add and edit) in order to push images. + +We have a separate endpoint to connect specifically to the docker repository. +[https://tdp-docker.dev.raftlabs.tech](tdp-docker.dev.raftlabs.tech) + +e.g. `docker login https://tdp-docker.dev.raftlabs.tech` + +### Pushing Images + +Before an image can be pushed to the nexus repository, it must be tagged for that repo: + +`docker image tag ${ImageId} tdp-docker.dev.raftlabs.tech/${ImageName}:${Version}` + +then you can push: + +`docker push tdp-docker.dev.raftlabs.tech/${ImageName}:${Version}` + +### Pulling Images + +We have set up a proxy mirror to dockerhub that can pull and cache DockerHub images. +Then we have created a group docker repository that can be pulled from. If the container is in our hosted repo, the group will return that container. If not, it will see if we have a cached version of that container in our proxy repo and, if not, pull that from dockerhub, cache it and allow the docker pull to happen. + +`docker pull https://tdp-docker-store.dev.raftlabs.tech/${ImageName}:${Version}` \ No newline at end of file From 9b1c2d1ab8726a922dfdbb1492a3f338da92c1b8 Mon Sep 17 00:00:00 2001 From: jtimpe <111305129+jtimpe@users.noreply.github.com> Date: Tue, 21 Nov 2023 09:59:45 -0500 Subject: [PATCH 43/49] Feature/1119 ssp section 3 (#2733) * ssp m6 boilerplate * update ssp m6 field names * update tests * rm logging * rm logging * fix tests --------- Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- .../parsers/schema_defs/ssp/__init__.py | 2 + .../tdpservice/parsers/schema_defs/ssp/m6.py | 147 ++++++++++++++++++ .../parsers/test/data/ADS.E2J.NDM3.MS24 | 3 + .../tdpservice/parsers/test/test_parse.py | 125 +++++++++++---- tdrs-backend/tdpservice/parsers/util.py | 2 +- .../search_indexes/admin/__init__.py | 1 + .../tdpservice/search_indexes/admin/ssp.py | 18 +++ .../search_indexes/documents/ssp.py | 37 ++++- .../search_indexes/migrations/0019_ssp_m6.py | 36 +++++ .../tdpservice/search_indexes/models/ssp.py | 33 ++++ .../search_indexes/test/test_model_mapping.py | 39 +++++ .../tdpservice/users/test/test_permissions.py | 3 + 12 files changed, 417 insertions(+), 29 deletions(-) create mode 100644 tdrs-backend/tdpservice/parsers/schema_defs/ssp/m6.py create mode 100644 tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM3.MS24 create mode 100644 tdrs-backend/tdpservice/search_indexes/migrations/0019_ssp_m6.py diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py index f4d66c258..b3542bf07 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py @@ -1,7 +1,9 @@ from .m1 import m1 from .m2 import m2 from .m3 import m3 +from .m6 import m6 m1 = m1 m2 = m2 m3 = m3 +m6 = m6 diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m6.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m6.py new file mode 100644 index 000000000..6bea60b11 --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m6.py @@ -0,0 +1,147 @@ +"""Schema for HEADER row of all submission types.""" + + +from ...util import SchemaManager +from ...transforms import calendar_quarter_to_rpt_month_year +from ...fields import Field, TransformField +from ...row_schema import RowSchema +from ... import validators +from tdpservice.search_indexes.models.ssp import SSP_M6 + +s1 = RowSchema( + model=SSP_M6, + preparsing_validators=[ + validators.hasLength(259), + ], + postparsing_validators=[ + validators.sumIsEqual( + "SSPMOE_FAMILIES", ["NUM_2_PARENTS", "NUM_1_PARENTS", "NUM_NO_PARENTS"]), + validators.sumIsEqual( + "NUM_RECIPIENTS", ["ADULT_RECIPIENTS", "CHILD_RECIPIENTS"]), + ], + fields=[ + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, + required=True, validators=[]), + Field(item="2", name='CALENDAR_QUARTER', type='number', startIndex=2, endIndex=7, + required=True, validators=[validators.dateYearIsLargerThan(1998), + validators.quarterIsValid()]), + TransformField(calendar_quarter_to_rpt_month_year(0), item="2B", name='RPT_MONTH_YEAR', type='number', + startIndex=2, endIndex=7, required=True, validators=[validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid()]), + Field(item="3A", name='SSPMOE_FAMILIES', type='number', startIndex=7, endIndex=15, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="4A", name='NUM_2_PARENTS', type='number', startIndex=31, endIndex=39, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="5A", name='NUM_1_PARENTS', type='number', startIndex=55, endIndex=63, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="6A", name='NUM_NO_PARENTS', type='number', startIndex=79, endIndex=87, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="7A", name='NUM_RECIPIENTS', type='number', startIndex=103, endIndex=111, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="8A", name='ADULT_RECIPIENTS', type='number', startIndex=127, endIndex=135, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="9A", name='CHILD_RECIPIENTS', type='number', startIndex=151, endIndex=159, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="10A", name='NONCUSTODIALS', type='number', startIndex=175, endIndex=183, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="11A", name='AMT_ASSISTANCE', type='number', startIndex=199, endIndex=211, + required=True, validators=[validators.isInLimits(0, 999999999999)]), + Field(item="12A", name='CLOSED_CASES', type='number', startIndex=235, endIndex=243, + required=True, validators=[validators.isInLimits(0, 99999999)]), + ], +) + +s2 = RowSchema( + model=SSP_M6, + preparsing_validators=[ + validators.hasLength(259), + ], + postparsing_validators=[ + validators.sumIsEqual( + "SSPMOE_FAMILIES", ["NUM_2_PARENTS", "NUM_1_PARENTS", "NUM_NO_PARENTS"]), + validators.sumIsEqual( + "NUM_RECIPIENTS", ["ADULT_RECIPIENTS", "CHILD_RECIPIENTS"]), + ], + fields=[ + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, + required=True, validators=[]), + Field(item="2", name='CALENDAR_QUARTER', type='number', startIndex=2, endIndex=7, + required=True, validators=[validators.dateYearIsLargerThan(1998), + validators.quarterIsValid()]), + TransformField(calendar_quarter_to_rpt_month_year(1), item="2B", name='RPT_MONTH_YEAR', type='number', + startIndex=2, endIndex=7, required=True, validators=[validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid()]), + Field(item="3B", name='SSPMOE_FAMILIES', type='number', startIndex=15, endIndex=23, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="4B", name='NUM_2_PARENTS', type='number', startIndex=39, endIndex=47, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="5B", name='NUM_1_PARENTS', type='number', startIndex=63, endIndex=71, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="6B", name='NUM_NO_PARENTS', type='number', startIndex=87, endIndex=95, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="7B", name='NUM_RECIPIENTS', type='number', startIndex=111, endIndex=119, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="8B", name='ADULT_RECIPIENTS', type='number', startIndex=135, endIndex=143, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="9B", name='CHILD_RECIPIENTS', type='number', startIndex=159, endIndex=167, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="10B", name='NONCUSTODIALS', type='number', startIndex=183, endIndex=191, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="11B", name='AMT_ASSISTANCE', type='number', startIndex=211, endIndex=223, + required=True, validators=[validators.isInLimits(0, 999999999999)]), + Field(item="12B", name='CLOSED_CASES', type='number', startIndex=243, endIndex=251, + required=True, validators=[validators.isInLimits(0, 99999999)]), + ], +) + +s3 = RowSchema( + model=SSP_M6, + preparsing_validators=[ + validators.hasLength(259), + ], + postparsing_validators=[ + validators.sumIsEqual( + "SSPMOE_FAMILIES", ["NUM_2_PARENTS", "NUM_1_PARENTS", "NUM_NO_PARENTS"]), + validators.sumIsEqual( + "NUM_RECIPIENTS", ["ADULT_RECIPIENTS", "CHILD_RECIPIENTS"]), + ], + fields=[ + Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, + required=True, validators=[]), + Field(item="2", name='CALENDAR_QUARTER', type='number', startIndex=2, endIndex=7, + required=True, validators=[validators.dateYearIsLargerThan(1998), + validators.quarterIsValid()]), + TransformField(calendar_quarter_to_rpt_month_year(2), item="2B", name='RPT_MONTH_YEAR', type='number', + startIndex=2, endIndex=7, required=True, validators=[validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid()]), + Field(item="3C", name='SSPMOE_FAMILIES', type='number', startIndex=23, endIndex=31, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="4C", name='NUM_2_PARENTS', type='number', startIndex=47, endIndex=55, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="5C", name='NUM_1_PARENTS', type='number', startIndex=71, endIndex=79, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="6C", name='NUM_NO_PARENTS', type='number', startIndex=95, endIndex=103, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="7C", name='NUM_RECIPIENTS', type='number', startIndex=119, endIndex=127, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="8C", name='ADULT_RECIPIENTS', type='number', startIndex=143, endIndex=151, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="9C", name='CHILD_RECIPIENTS', type='number', startIndex=167, endIndex=175, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="10C", name='NONCUSTODIALS', type='number', startIndex=191, endIndex=199, + required=True, validators=[validators.isInLimits(0, 99999999)]), + Field(item="11C", name='AMT_ASSISTANCE', type='number', startIndex=223, endIndex=235, + required=True, validators=[validators.isInLimits(0, 999999999999)]), + Field(item="12C", name='CLOSED_CASES', type='number', startIndex=251, endIndex=259, + required=True, validators=[validators.isInLimits(0, 99999999)]), + ], +) + + +m6 = SchemaManager( + schemas=[ + s1, + s2, + s3 + ] +) diff --git a/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM3.MS24 b/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM3.MS24 new file mode 100644 index 000000000..bbe8ee4f0 --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM3.MS24 @@ -0,0 +1,3 @@ +HEADER20184G24 SSP1 N +M620184000158690001600800015956000008610000085100000845000149050001505500015013000001030000010200000098000513550005169600051348000157070001581400015766000356480003588200035582000000000000000000000000000000000000000000000000000000000000000012020000118900001229 +TRAILER0000001 diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index ce41eed48..764de2990 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -5,7 +5,7 @@ from .. import parse from ..models import ParserError, ParserErrorCategoryChoices, DataFileSummary from tdpservice.search_indexes.models.tanf import TANF_T1, TANF_T2, TANF_T3, TANF_T4, TANF_T5, TANF_T6, TANF_T7 -from tdpservice.search_indexes.models.ssp import SSP_M1, SSP_M2, SSP_M3 +from tdpservice.search_indexes.models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M6 from .factories import DataFileSummaryFactory from tdpservice.data_files.models import DataFile from .. import schema_defs, util @@ -21,11 +21,13 @@ def test_datafile(stt_user, stt): """Fixture for small_correct_file.""" return util.create_test_datafile('small_correct_file.txt', stt_user, stt) + @pytest.fixture def dfs(): """Fixture for DataFileSummary.""" return DataFileSummaryFactory.create() + @pytest.mark.django_db def test_parse_small_correct_file(test_datafile, dfs): """Test parsing of small_correct_file.""" @@ -34,13 +36,17 @@ def test_parse_small_correct_file(test_datafile, dfs): parse.parse_datafile(test_datafile) dfs.status = dfs.get_status() - dfs.case_aggregates = util.case_aggregates_by_month(dfs.datafile, dfs.status) + dfs.case_aggregates = util.case_aggregates_by_month( + dfs.datafile, dfs.status) assert dfs.case_aggregates == {'rejected': 0, 'months': [ - {'accepted_without_errors': 1, 'accepted_with_errors': 0, 'month': 'Oct'}, - {'accepted_without_errors': 0, 'accepted_with_errors': 0, 'month': 'Nov'}, - {'accepted_without_errors': 0, 'accepted_with_errors': 0, 'month': 'Dec'} - ]} + {'accepted_without_errors': 1, + 'accepted_with_errors': 0, 'month': 'Oct'}, + {'accepted_without_errors': 0, + 'accepted_with_errors': 0, 'month': 'Nov'}, + {'accepted_without_errors': 0, + 'accepted_with_errors': 0, 'month': 'Dec'} + ]} assert dfs.get_status() == DataFileSummary.Status.ACCEPTED assert TANF_T1.objects.count() == 1 @@ -58,6 +64,7 @@ def test_parse_small_correct_file(test_datafile, dfs): assert t1.SANC_REDUCTION_AMT == 0 assert t1.FAMILY_NEW_CHILD == 2 + @pytest.mark.django_db def test_parse_section_mismatch(test_datafile, dfs): """Test parsing of small_correct_file where the DataFile section doesn't match the rawfile section.""" @@ -71,7 +78,8 @@ def test_parse_section_mismatch(test_datafile, dfs): dfs.status = dfs.get_status() assert dfs.status == DataFileSummary.Status.REJECTED parser_errors = ParserError.objects.filter(file=test_datafile) - dfs.case_aggregates = util.case_aggregates_by_month(dfs.datafile, dfs.status) + dfs.case_aggregates = util.case_aggregates_by_month( + dfs.datafile, dfs.status) assert dfs.case_aggregates == {'rejected': 1, 'months': [ {'accepted_without_errors': 'N/A', @@ -83,7 +91,7 @@ def test_parse_section_mismatch(test_datafile, dfs): {'accepted_without_errors': 'N/A', 'accepted_with_errors': 'N/A', 'month': 'Dec'} - ]} + ]} assert parser_errors.count() == 1 err = parser_errors.first() @@ -129,6 +137,7 @@ def test_big_file(stt_user, stt): """Fixture for ADS.E2J.FTP1.TS06.""" return util.create_test_datafile('ADS.E2J.FTP1.TS06', stt_user, stt) + @pytest.mark.django_db @pytest.mark.skip(reason="long runtime") # big_files def test_parse_big_file(test_big_file, dfs): @@ -143,13 +152,17 @@ def test_parse_big_file(test_big_file, dfs): parse.parse_datafile(test_big_file) dfs.status = dfs.get_status() assert dfs.status == DataFileSummary.Status.ACCEPTED_WITH_ERRORS - dfs.case_aggregates = util.case_aggregates_by_month(dfs.datafile, dfs.status) + dfs.case_aggregates = util.case_aggregates_by_month( + dfs.datafile, dfs.status) assert dfs.case_aggregates == {'rejected': 0, 'months': [ - {'accepted_without_errors': 171, 'accepted_with_errors': 99, 'month': 'Oct'}, - {'accepted_without_errors': 169, 'accepted_with_errors': 104, 'month': 'Nov'}, - {'accepted_without_errors': 166, 'accepted_with_errors': 106, 'month': 'Dec'} - ]} + {'accepted_without_errors': 171, + 'accepted_with_errors': 99, 'month': 'Oct'}, + {'accepted_without_errors': 169, + 'accepted_with_errors': 104, 'month': 'Nov'}, + {'accepted_without_errors': 166, + 'accepted_with_errors': 106, 'month': 'Dec'} + ]} parser_errors = ParserError.objects.filter(file=test_big_file) @@ -197,6 +210,7 @@ def bad_file_missing_header(stt_user, stt): """Fixture for bad_missing_header.""" return util.create_test_datafile('bad_missing_header.txt', stt_user, stt) + @pytest.mark.django_db def test_parse_bad_file_missing_header(bad_file_missing_header, dfs): """Test parsing of bad_missing_header.""" @@ -276,6 +290,7 @@ def bad_trailer_file(stt_user, stt): """Fixture for bad_trailer_1.""" return util.create_test_datafile('bad_trailer_1.txt', stt_user, stt) + @pytest.mark.django_db def test_parse_bad_trailer_file(bad_trailer_file, dfs): """Test parsing bad_trailer_1.""" @@ -380,7 +395,7 @@ def test_parse_empty_file(empty_file, dfs): {'accepted_without_errors': 'N/A', 'accepted_with_errors': 'N/A', 'month': 'Dec'} - ]} + ]} parser_errors = ParserError.objects.filter(file=empty_file).order_by('id') @@ -422,7 +437,8 @@ def test_parse_small_ssp_section1_datafile(small_ssp_section1_datafile, dfs): dfs.status = dfs.get_status() assert dfs.status == DataFileSummary.Status.ACCEPTED_WITH_ERRORS - dfs.case_aggregates = util.case_aggregates_by_month(dfs.datafile, dfs.status) + dfs.case_aggregates = util.case_aggregates_by_month( + dfs.datafile, dfs.status) assert dfs.case_aggregates == {'rejected': 1, 'months': [ {'accepted_without_errors': 0, 'accepted_with_errors': 5, 'month': 'Oct'}, @@ -459,11 +475,13 @@ def test_parse_ssp_section1_datafile(ssp_section1_datafile): assert SSP_M2.objects.count() == expected_m2_record_count assert SSP_M3.objects.count() == expected_m3_record_count + @pytest.fixture def small_tanf_section1_datafile(stt_user, stt): """Fixture for small_tanf_section1.""" return util.create_test_datafile('small_tanf_section1.txt', stt_user, stt) + @pytest.mark.django_db def test_parse_tanf_section1_datafile(small_tanf_section1_datafile, dfs): """Test parsing of small_tanf_section1_datafile and validate T2 model data.""" @@ -474,13 +492,17 @@ def test_parse_tanf_section1_datafile(small_tanf_section1_datafile, dfs): dfs.status = dfs.get_status() assert dfs.status == DataFileSummary.Status.ACCEPTED - dfs.case_aggregates = util.case_aggregates_by_month(dfs.datafile, dfs.status) + dfs.case_aggregates = util.case_aggregates_by_month( + dfs.datafile, dfs.status) assert dfs.case_aggregates == {'rejected': 0, 'months': [ - {'accepted_without_errors': 5, 'accepted_with_errors': 0, 'month': 'Oct'}, - {'accepted_without_errors': 0, 'accepted_with_errors': 0, 'month': 'Nov'}, - {'accepted_without_errors': 0, 'accepted_with_errors': 0, 'month': 'Dec'} - ]} + {'accepted_without_errors': 5, + 'accepted_with_errors': 0, 'month': 'Oct'}, + {'accepted_without_errors': 0, + 'accepted_with_errors': 0, 'month': 'Nov'}, + {'accepted_without_errors': 0, + 'accepted_with_errors': 0, 'month': 'Dec'} + ]} assert TANF_T2.objects.count() == 5 @@ -508,6 +530,7 @@ def test_parse_tanf_section1_datafile_obj_counts(small_tanf_section1_datafile): assert TANF_T2.objects.count() == 5 assert TANF_T3.objects.count() == 6 + @pytest.mark.django_db() def test_parse_tanf_section1_datafile_t3s(small_tanf_section1_datafile): """Test parsing of small_tanf_section1_datafile and validate T3 model data.""" @@ -530,6 +553,7 @@ def test_parse_tanf_section1_datafile_t3s(small_tanf_section1_datafile): assert t3_6.GENDER == 2 assert t3_6.EDUCATION_LEVEL == '98' + @pytest.fixture def super_big_s1_file(stt_user, stt): """Fixture for ADS.E2J.NDM1.TS53_fake.""" @@ -545,11 +569,13 @@ def test_parse_super_big_s1_file(super_big_s1_file): assert TANF_T2.objects.count() == 112794 assert TANF_T3.objects.count() == 172595 + @pytest.fixture def super_big_s1_rollback_file(stt_user, stt): """Fixture for ADS.E2J.NDM1.TS53_fake.rollback.""" return util.create_test_datafile('ADS.E2J.NDM1.TS53_fake.rollback', stt_user, stt) + @pytest.mark.django_db() @pytest.mark.skip(reason="cuz") # big_files def test_parse_super_big_s1_file_with_rollback(super_big_s1_rollback_file): @@ -591,7 +617,8 @@ def test_parse_bad_tfs1_missing_required(bad_tanf_s1__row_missing_required_field assert dfs.get_status() == DataFileSummary.Status.PARTIALLY_ACCEPTED - parser_errors = ParserError.objects.filter(file=bad_tanf_s1__row_missing_required_field) + parser_errors = ParserError.objects.filter( + file=bad_tanf_s1__row_missing_required_field) assert parser_errors.count() == 4 [print(parser_error) for parser_error in parser_errors] @@ -681,11 +708,13 @@ def test_dfs_set_case_aggregates(test_datafile, dfs): """Test that the case aggregates are set correctly.""" test_datafile.section = 'Active Case Data' test_datafile.save() - parse.parse_datafile(test_datafile) # this still needs to execute to create db objects to be queried + # this still needs to execute to create db objects to be queried + parse.parse_datafile(test_datafile) dfs.file = test_datafile dfs.save() dfs.status = dfs.get_status() - dfs.case_aggregates = util.case_aggregates_by_month(test_datafile, dfs.status) + dfs.case_aggregates = util.case_aggregates_by_month( + test_datafile, dfs.status) dfs.save() for month in dfs.case_aggregates['months']: @@ -693,6 +722,7 @@ def test_dfs_set_case_aggregates(test_datafile, dfs): assert month['accepted_without_errors'] == 1 assert month['accepted_with_errors'] == 0 + @pytest.mark.django_db def test_get_schema_options(dfs): """Test use-cases for translating strings to named object references.""" @@ -717,10 +747,10 @@ def test_get_schema_options(dfs): # get model models = util.get_program_models('TAN', 'A') assert models == { - 'T1': schema_defs.tanf.t1, - 'T2': schema_defs.tanf.t2, - 'T3': schema_defs.tanf.t3, - } + 'T1': schema_defs.tanf.t1, + 'T2': schema_defs.tanf.t2, + 'T3': schema_defs.tanf.t3, + } model = util.get_program_model('TAN', 'A', 'T1') assert model == schema_defs.tanf.t1 @@ -737,11 +767,13 @@ def test_get_schema_options(dfs): # get section str # get ref section + @pytest.fixture def small_tanf_section2_file(stt_user, stt): """Fixture for tanf section2 datafile.""" return util.create_test_datafile('small_tanf_section2.txt', stt_user, stt, 'Closed Case Data') + @pytest.mark.django_db() def test_parse_small_tanf_section2_file(small_tanf_section2_file): """Test parsing a small TANF Section 2 submission.""" @@ -763,11 +795,13 @@ def test_parse_small_tanf_section2_file(small_tanf_section2_file): assert t5.GENDER == 2 assert t5.AMOUNT_UNEARNED_INCOME == '0000' + @pytest.fixture def tanf_section2_file(stt_user, stt): """Fixture for ADS.E2J.FTP2.TS06.""" return util.create_test_datafile('ADS.E2J.FTP2.TS06', stt_user, stt, 'Closed Case Data') + @pytest.mark.django_db() def test_parse_tanf_section2_file(tanf_section2_file): """Test parsing TANF Section 2 submission.""" @@ -784,11 +818,13 @@ def test_parse_tanf_section2_file(tanf_section2_file): assert err.content_type.model == "tanf_t5" assert err.object_id is not None + @pytest.fixture def tanf_section3_file(stt_user, stt): """Fixture for ADS.E2J.FTP3.TS06.""" return util.create_test_datafile('ADS.E2J.FTP3.TS06', stt_user, stt, "Aggregate Data") + @pytest.mark.django_db() def test_parse_tanf_section3_file(tanf_section3_file): """Test parsing TANF Section 3 submission.""" @@ -848,6 +884,7 @@ def tanf_section4_file(stt_user, stt): """Fixture for ADS.E2J.FTP4.TS06.""" return util.create_test_datafile('ADS.E2J.FTP4.TS06', stt_user, stt, "Stratum Data") + @pytest.mark.django_db() def test_parse_tanf_section4_file(tanf_section4_file): """Test parsing TANF Section 4 submission.""" @@ -871,3 +908,37 @@ def test_parse_tanf_section4_file(tanf_section4_file): assert first.FAMILIES_MONTH == 274 assert sixth.FAMILIES_MONTH == 499 + + +@pytest.fixture +def ssp_section3_file(stt_user, stt): + """Fixture for ADS.E2J.FTP3.TS06.""" + return util.create_test_datafile('ADS.E2J.NDM3.MS24', stt_user, stt, "SSP Aggregate Data") + + +@pytest.mark.django_db() +def test_parse_ssp_section3_file(ssp_section3_file): + """Test parsing TANF Section 3 submission.""" + parse.parse_datafile(ssp_section3_file) + + m6_objs = SSP_M6.objects.all().order_by('RPT_MONTH_YEAR') + assert m6_objs.count() == 3 + + parser_errors = ParserError.objects.filter(file=ssp_section3_file) + assert parser_errors.count() == 0 + + first = m6_objs.first() + second = m6_objs[1] + third = m6_objs[2] + + assert first.RPT_MONTH_YEAR == 201810 + assert second.RPT_MONTH_YEAR == 201811 + assert third.RPT_MONTH_YEAR == 201812 + + assert first.SSPMOE_FAMILIES == 15869 + assert second.SSPMOE_FAMILIES == 16008 + assert third.SSPMOE_FAMILIES == 15956 + + assert first.NUM_RECIPIENTS == 51355 + assert second.NUM_RECIPIENTS == 51696 + assert third.NUM_RECIPIENTS == 51348 diff --git a/tdrs-backend/tdpservice/parsers/util.py b/tdrs-backend/tdpservice/parsers/util.py index 3417ecfb2..6c7e4020a 100644 --- a/tdrs-backend/tdpservice/parsers/util.py +++ b/tdrs-backend/tdpservice/parsers/util.py @@ -168,7 +168,7 @@ def get_schema_options(program, section, query=None, model=None, model_name=None 'G': { 'section': DataFile.Section.SSP_AGGREGATE_DATA, 'models': { - # 'S6': schema_defs.ssp.m6, + 'M6': schema_defs.ssp.m6, } }, 'S': { diff --git a/tdrs-backend/tdpservice/search_indexes/admin/__init__.py b/tdrs-backend/tdpservice/search_indexes/admin/__init__.py index 92131fd35..19ad02979 100644 --- a/tdrs-backend/tdpservice/search_indexes/admin/__init__.py +++ b/tdrs-backend/tdpservice/search_indexes/admin/__init__.py @@ -13,3 +13,4 @@ admin.site.register(models.ssp.SSP_M1, ssp.SSP_M1Admin) admin.site.register(models.ssp.SSP_M2, ssp.SSP_M2Admin) admin.site.register(models.ssp.SSP_M3, ssp.SSP_M3Admin) +admin.site.register(models.ssp.SSP_M6, ssp.SSP_M6Admin) diff --git a/tdrs-backend/tdpservice/search_indexes/admin/ssp.py b/tdrs-backend/tdpservice/search_indexes/admin/ssp.py index 17ee5a4c8..d8e2088af 100644 --- a/tdrs-backend/tdpservice/search_indexes/admin/ssp.py +++ b/tdrs-backend/tdpservice/search_indexes/admin/ssp.py @@ -2,6 +2,7 @@ from django.contrib import admin from .filter import CreationDateFilter + class SSP_M1Admin(admin.ModelAdmin): """ModelAdmin class for parsed M1 data files.""" @@ -53,3 +54,20 @@ class SSP_M3Admin(admin.ModelAdmin): CreationDateFilter, 'RPT_MONTH_YEAR', ] + + +class SSP_M6Admin(admin.ModelAdmin): + """ModelAdmin class for parsed M6 data files.""" + + list_display = [ + 'RecordType', + 'CALENDAR_QUARTER', + 'RPT_MONTH_YEAR', + 'datafile', + ] + + list_filter = [ + 'CALENDAR_QUARTER', + CreationDateFilter, + 'RPT_MONTH_YEAR' + ] diff --git a/tdrs-backend/tdpservice/search_indexes/documents/ssp.py b/tdrs-backend/tdpservice/search_indexes/documents/ssp.py index c3c431529..d047acd0d 100644 --- a/tdrs-backend/tdpservice/search_indexes/documents/ssp.py +++ b/tdrs-backend/tdpservice/search_indexes/documents/ssp.py @@ -2,9 +2,10 @@ from django_elasticsearch_dsl import Document from django_elasticsearch_dsl.registries import registry -from ..models.ssp import SSP_M1, SSP_M2, SSP_M3 +from ..models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M6 from .document_base import DocumentBase + @registry.register_document class SSP_M1DataSubmissionDocument(DocumentBase, Document): """Elastic search model mapping for a parsed SSP M1 data file.""" @@ -198,3 +199,37 @@ class Django: 'UNEARNED_SSI', 'OTHER_UNEARNED_INCOME', ] + + +@registry.register_document +class SSP_M6DataSubmissionDocument(DocumentBase, Document): + """Elastic search model mapping for a parsed SSP M6 data file.""" + + class Index: + """ElasticSearch index generation settings.""" + + name = 'ssp_m6_submissions' + settings = { + 'number_of_shards': 1, + 'number_of_replicas': 0, + } + + class Django: + """Django model reference and field mapping.""" + + model = SSP_M6 + fields = [ + 'RecordType', + 'CALENDAR_QUARTER', + 'RPT_MONTH_YEAR', + 'SSPMOE_FAMILIES', + 'NUM_2_PARENTS', + 'NUM_1_PARENTS', + 'NUM_NO_PARENTS', + 'NUM_RECIPIENTS', + 'ADULT_RECIPIENTS', + 'CHILD_RECIPIENTS', + 'NONCUSTODIALS', + 'AMT_ASSISTANCE', + 'CLOSED_CASES', + ] diff --git a/tdrs-backend/tdpservice/search_indexes/migrations/0019_ssp_m6.py b/tdrs-backend/tdpservice/search_indexes/migrations/0019_ssp_m6.py new file mode 100644 index 000000000..e41a275b3 --- /dev/null +++ b/tdrs-backend/tdpservice/search_indexes/migrations/0019_ssp_m6.py @@ -0,0 +1,36 @@ +# Generated by Django 3.2.15 on 2023-10-18 16:19 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('data_files', '0012_datafile_s3_versioning_id'), + ('search_indexes', '0018_auto_20230920_1846'), + ] + + operations = [ + migrations.CreateModel( + name='SSP_M6', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('RecordType', models.CharField(max_length=156, null=True)), + ('CALENDAR_QUARTER', models.IntegerField(blank=True, null=True)), + ('RPT_MONTH_YEAR', models.IntegerField(null=True)), + ('SSPMOE_FAMILIES', models.IntegerField(blank=True, null=True)), + ('NUM_2_PARENTS', models.IntegerField(blank=True, null=True)), + ('NUM_1_PARENTS', models.IntegerField(blank=True, null=True)), + ('NUM_NO_PARENTS', models.IntegerField(blank=True, null=True)), + ('NUM_RECIPIENTS', models.IntegerField(blank=True, null=True)), + ('ADULT_RECIPIENTS', models.IntegerField(blank=True, null=True)), + ('CHILD_RECIPIENTS', models.IntegerField(blank=True, null=True)), + ('NONCUSTODIALS', models.IntegerField(blank=True, null=True)), + ('AMT_ASSISTANCE', models.IntegerField(blank=True, null=True)), + ('CLOSED_CASES', models.IntegerField(blank=True, null=True)), + ('datafile', models.ForeignKey(blank=True, help_text='The parent file from which this record was created.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='m6_parent', to='data_files.datafile')), + ], + ), + ] diff --git a/tdrs-backend/tdpservice/search_indexes/models/ssp.py b/tdrs-backend/tdpservice/search_indexes/models/ssp.py index f2a325eb3..05c599c39 100644 --- a/tdrs-backend/tdpservice/search_indexes/models/ssp.py +++ b/tdrs-backend/tdpservice/search_indexes/models/ssp.py @@ -210,3 +210,36 @@ class SSP_M3(models.Model): CITIZENSHIP_STATUS = models.IntegerField(null=True, blank=False) UNEARNED_SSI = models.IntegerField(null=True, blank=False) OTHER_UNEARNED_INCOME = models.IntegerField(null=True, blank=False) + + +class SSP_M6(models.Model): + """ + Parsed record representing an M6 data submission. + + Mapped to an elastic search index. + """ + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + datafile = models.ForeignKey( + DataFile, + blank=True, + help_text='The parent file from which this record was created.', + null=True, + on_delete=models.CASCADE, + related_name='m6_parent' + ) + + RecordType = models.CharField(max_length=156, null=True, blank=False) + CALENDAR_QUARTER = models.IntegerField(null=True, blank=True) + RPT_MONTH_YEAR = models.IntegerField(null=True, blank=False) + + SSPMOE_FAMILIES = models.IntegerField(null=True, blank=True) + NUM_2_PARENTS = models.IntegerField(null=True, blank=True) + NUM_1_PARENTS = models.IntegerField(null=True, blank=True) + NUM_NO_PARENTS = models.IntegerField(null=True, blank=True) + NUM_RECIPIENTS = models.IntegerField(null=True, blank=True) + ADULT_RECIPIENTS = models.IntegerField(null=True, blank=True) + CHILD_RECIPIENTS = models.IntegerField(null=True, blank=True) + NONCUSTODIALS = models.IntegerField(null=True, blank=True) + AMT_ASSISTANCE = models.IntegerField(null=True, blank=True) + CLOSED_CASES = models.IntegerField(null=True, blank=True) diff --git a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py index 4d81eaac9..15581d304 100644 --- a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py +++ b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py @@ -578,3 +578,42 @@ def test_can_create_and_index_ssp_m3_submission(): response = search.execute() assert response.hits.total.value == 1 + + +@pytest.mark.django_db +def test_can_create_and_index_ssp_m6_submission(test_datafile): + """SSP M6 submissions can be created and mapped.""" + record_num = fake.uuid4() + + submission = models.ssp.SSP_M6() + submission.datafile = test_datafile + submission.RecordType = record_num + submission.CALENDAR_QUARTER = 1 + submission.RPT_MONTH_YEAR = 1 + submission.NUM_APPLICATIONS = 1 + submission.NUM_APPROVED = 1 + submission.NUM_DENIED = 1 + submission.ASSISTANCE = 1 + submission.NUM_FAMILIES = 1 + submission.NUM_2_PARENTS = 1 + submission.NUM_1_PARENTS = 1 + submission.NUM_NO_PARENTS = 1 + submission.NUM_RECIPIENTS = 1 + submission.NUM_ADULT_RECIPIENTS = 1 + submission.NUM_CHILD_RECIPIENTS = 1 + submission.NUM_NONCUSTODIALS = 1 + submission.NUM_BIRTHS = 1 + submission.NUM_OUTWEDLOCK_BIRTHS = 1 + submission.NUM_CLOSED_CASES = 1 + + submission.save() + + assert submission.id is not None + + search = documents.ssp.SSP_M6DataSubmissionDocument.search().query( + 'match', + RecordType=record_num + ) + response = search.execute() + + assert response.hits.total.value == 1 diff --git a/tdrs-backend/tdpservice/users/test/test_permissions.py b/tdrs-backend/tdpservice/users/test/test_permissions.py index 2f25347aa..d942fd0c8 100644 --- a/tdrs-backend/tdpservice/users/test/test_permissions.py +++ b/tdrs-backend/tdpservice/users/test/test_permissions.py @@ -123,6 +123,9 @@ def test_ofa_system_admin_permissions(ofa_system_admin): 'search_indexes.add_ssp_m3', 'search_indexes.view_ssp_m3', 'search_indexes.change_ssp_m3', + 'search_indexes.add_ssp_m6', + 'search_indexes.view_ssp_m6', + 'search_indexes.change_ssp_m6', } group_permissions = ofa_system_admin.get_group_permissions() assert group_permissions == expected_permissions From f1f15c1b524fe28eda1cf4e963b4e26f8685359b Mon Sep 17 00:00:00 2001 From: Eric Lipe <125676261+elipe17@users.noreply.github.com> Date: Wed, 22 Nov 2023 10:43:37 -0700 Subject: [PATCH 44/49] SSP Section 4 Parsing & Validation (#2731) * - Added support for parsing and validating ssp section 4 * - fix lint errors * - Updated permissions test * - Fixed item number mismatch * - Remove generic relation - Add missing test - Re-made migration * - Fix lint errors * - Pre-calculating item numbers * - Formatting with Black * - Adding missing postparsing validator * - Deconflicting migrations * - Deconflicting migrations * - Fixing test --------- Co-authored-by: Jan Timpe Co-authored-by: Alex P <63075587+ADPennington@users.noreply.github.com> --- tdrs-backend/tdpservice/parsers/parse.py | 44 - .../tdpservice/parsers/schema_defs/header.py | 188 ++- .../parsers/schema_defs/ssp/__init__.py | 2 + .../tdpservice/parsers/schema_defs/ssp/m1.py | 6 +- .../tdpservice/parsers/schema_defs/ssp/m2.py | 6 +- .../tdpservice/parsers/schema_defs/ssp/m3.py | 7 +- .../tdpservice/parsers/schema_defs/ssp/m7.py | 103 ++ .../tdpservice/parsers/schema_defs/tanf/t1.py | 857 +++++++++---- .../tdpservice/parsers/schema_defs/tanf/t2.py | 1057 +++++++++++++---- .../tdpservice/parsers/schema_defs/tanf/t3.py | 738 ++++++++---- .../tdpservice/parsers/schema_defs/tanf/t4.py | 171 ++- .../tdpservice/parsers/schema_defs/tanf/t5.py | 497 ++++++-- .../tdpservice/parsers/schema_defs/tanf/t6.py | 637 ++++++++-- .../tdpservice/parsers/schema_defs/tanf/t7.py | 110 +- .../tdpservice/parsers/schema_defs/trailer.py | 40 +- .../parsers/test/data/ADS.E2J.NDM4.MS24 | 3 + .../tdpservice/parsers/test/test_parse.py | 19 +- tdrs-backend/tdpservice/parsers/util.py | 6 +- .../search_indexes/admin/__init__.py | 1 + .../tdpservice/search_indexes/admin/ssp.py | 20 +- .../search_indexes/documents/ssp.py | 29 +- .../search_indexes/migrations/0021_ssp_m7.py | 29 + .../tdpservice/search_indexes/models/ssp.py | 41 +- .../tdpservice/search_indexes/models/tanf.py | 3 - .../search_indexes/test/test_model_mapping.py | 32 +- .../tdpservice/users/test/test_permissions.py | 3 + 26 files changed, 3523 insertions(+), 1126 deletions(-) create mode 100644 tdrs-backend/tdpservice/parsers/schema_defs/ssp/m7.py create mode 100644 tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM4.MS24 create mode 100644 tdrs-backend/tdpservice/search_indexes/migrations/0021_ssp_m7.py diff --git a/tdrs-backend/tdpservice/parsers/parse.py b/tdrs-backend/tdpservice/parsers/parse.py index 05c3da3ca..ac65dce5e 100644 --- a/tdrs-backend/tdpservice/parsers/parse.py +++ b/tdrs-backend/tdpservice/parsers/parse.py @@ -251,50 +251,6 @@ def manager_parse_line(line, schema_manager, generate_error, is_encrypted=False) ) ])] - -def get_schema_manager_options(program_type): - """Return the allowed schema options.""" - match program_type: - case 'TAN': - return { - 'A': { - 'T1': schema_defs.tanf.t1, - 'T2': schema_defs.tanf.t2, - 'T3': schema_defs.tanf.t3, - }, - 'C': { - 'T4': schema_defs.tanf.t4, - 'T5': schema_defs.tanf.t5, - }, - 'G': { - 'T6': schema_defs.tanf.t6, - }, - 'S': { - 'T7': schema_defs.tanf.t7, - }, - } - case 'SSP': - return { - 'A': { - 'M1': schema_defs.ssp.m1, - 'M2': schema_defs.ssp.m2, - 'M3': schema_defs.ssp.m3, - }, - 'C': { - # 'M4': schema_options.m4, - # 'M5': schema_options.m5, - }, - 'G': { - # 'M6': schema_options.m6, - }, - 'S': { - # 'M7': schema_options.m7, - }, - } - # case tribal? - return None - - def get_schema_manager(line, section, program_type): """Return the appropriate schema for the line.""" line_type = line[0:2] diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/header.py b/tdrs-backend/tdpservice/parsers/schema_defs/header.py index 96ede4754..deed0f416 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/header.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/header.py @@ -11,44 +11,162 @@ preparsing_validators=[ validators.hasLength( 23, - lambda value, length: f'Header length is {len(value)} but must be {length} characters.' + lambda value, length: f"Header length is {len(value)} but must be {length} characters.", ), - validators.startsWith('HEADER'), + validators.startsWith("HEADER"), ], postparsing_validators=[], fields=[ - Field(item="2", name='title', type='string', startIndex=0, endIndex=6, required=True, validators=[ - validators.matches('HEADER'), - ]), - Field(item="4", name='year', type='number', startIndex=6, endIndex=10, required=True, validators=[ - validators.isInLimits(2000, 2099) - ]), - Field(item="5", name='quarter', type='string', startIndex=10, endIndex=11, required=True, validators=[ - validators.oneOf(['1', '2', '3', '4']) - ]), - Field(item="6", name='type', type='string', startIndex=11, endIndex=12, required=True, validators=[ - validators.oneOf(['A', 'C', 'G', 'S']) - ]), - Field(item="1", name='state_fips', type='string', startIndex=12, endIndex=14, required=True, validators=[ - validators.oneOf(("01", "02", "04", "05", "06", "08", "09", "10", "11", "12", "13", "15", "16", "17", "18", - "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", "32", "33", - "34", "35", "36", "37", "38", "39", "40", "41", "42", "44", "45", "46", "47", "48", "49", - "50", "51", "53", "54", "55", "56", "66", "72", "78")) - ]), - Field(item="3", name='tribe_code', type='string', startIndex=14, endIndex=17, required=False, validators=[ - validators.isInStringRange(0, 999) - ]), - Field(item="7", name='program_type', type='string', startIndex=17, endIndex=20, required=True, validators=[ - validators.oneOf(['TAN', 'SSP']) - ]), - Field(item="8", name='edit', type='string', startIndex=20, endIndex=21, required=True, validators=[ - validators.oneOf(['1', '2']) - ]), - Field(item="9", name='encryption', type='string', startIndex=21, endIndex=22, required=False, validators=[ - validators.oneOf([' ', 'E']) - ]), - Field(item="10", name='update', type='string', startIndex=22, endIndex=23, required=True, validators=[ - validators.oneOf(['N', 'D', 'U']) - ]), + Field( + item="2", + name="title", + type="string", + startIndex=0, + endIndex=6, + required=True, + validators=[ + validators.matches("HEADER"), + ], + ), + Field( + item="4", + name="year", + type="number", + startIndex=6, + endIndex=10, + required=True, + validators=[validators.isInLimits(2000, 2099)], + ), + Field( + item="5", + name="quarter", + type="string", + startIndex=10, + endIndex=11, + required=True, + validators=[validators.oneOf(["1", "2", "3", "4"])], + ), + Field( + item="6", + name="type", + type="string", + startIndex=11, + endIndex=12, + required=True, + validators=[validators.oneOf(["A", "C", "G", "S"])], + ), + Field( + item="1", + name="state_fips", + type="string", + startIndex=12, + endIndex=14, + required=True, + validators=[ + validators.oneOf( + ( + "01", + "02", + "04", + "05", + "06", + "08", + "09", + "10", + "11", + "12", + "13", + "15", + "16", + "17", + "18", + "19", + "20", + "21", + "22", + "23", + "24", + "25", + "26", + "27", + "28", + "29", + "30", + "31", + "32", + "33", + "34", + "35", + "36", + "37", + "38", + "39", + "40", + "41", + "42", + "44", + "45", + "46", + "47", + "48", + "49", + "50", + "51", + "53", + "54", + "55", + "56", + "66", + "72", + "78", + ) + ) + ], + ), + Field( + item="3", + name="tribe_code", + type="string", + startIndex=14, + endIndex=17, + required=False, + validators=[validators.isInStringRange(0, 999)], + ), + Field( + item="7", + name="program_type", + type="string", + startIndex=17, + endIndex=20, + required=True, + validators=[validators.oneOf(["TAN", "SSP"])], + ), + Field( + item="8", + name="edit", + type="string", + startIndex=20, + endIndex=21, + required=True, + validators=[validators.oneOf(["1", "2"])], + ), + Field( + item="9", + name="encryption", + type="string", + startIndex=21, + endIndex=22, + required=False, + validators=[validators.oneOf([" ", "E"])], + ), + Field( + item="10", + name="update", + type="string", + startIndex=22, + endIndex=23, + required=True, + validators=[validators.oneOf(["N", "D", "U"])], + ), ], ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py index b3542bf07..31a2f6d6d 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py @@ -2,8 +2,10 @@ from .m2 import m2 from .m3 import m3 from .m6 import m6 +from .m7 import m7 m1 = m1 m2 = m2 m3 = m3 m6 = m6 +m7 = m7 diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py index 479a243cf..8f9d94697 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py @@ -8,7 +8,7 @@ from tdpservice.search_indexes.models.ssp import SSP_M1 m1 = SchemaManager( - schemas=[ + schemas=[ RowSchema( model=SSP_M1, preparsing_validators=[ @@ -243,5 +243,5 @@ required=False, validators=[]), ] ) - ] - ) + ] +) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py index 58c99ccac..b45ccdf2c 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py @@ -10,7 +10,7 @@ m2 = SchemaManager( - schemas=[ + schemas=[ RowSchema( model=SSP_M2, preparsing_validators=[ @@ -364,5 +364,5 @@ ]), ], ) - ] - ) + ] +) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py index 38e66ee35..beb975e58 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py @@ -301,9 +301,4 @@ ] ) -m3 = SchemaManager( - schemas=[ - first_part_schema, - second_part_schema - ] -) +m3 = SchemaManager(schemas=[first_part_schema, second_part_schema]) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m7.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m7.py new file mode 100644 index 000000000..1fb1aa8fa --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m7.py @@ -0,0 +1,103 @@ +"""Schema for TANF T7 Row.""" + +from ...util import SchemaManager +from ...fields import Field, TransformField +from ...row_schema import RowSchema +from ...transforms import calendar_quarter_to_rpt_month_year +from ... import validators +from tdpservice.search_indexes.models.ssp import SSP_M7 + +schemas = [] + +validator_index = 7 +section_ind_index = 7 +stratum_index = 8 +families_index = 10 + +sub_item_labels = ["5A", "5B", "5C"] +families_item_numbers = [sub_item_labels[i % 3] for i in range(30)] + +for i in range(1, 31): + schemas.append( + RowSchema( + model=SSP_M7, + quiet_preparser_errors=i > 1, + preparsing_validators=[ + validators.hasLength(247), + validators.notEmpty(0, 7), + validators.notEmpty(validator_index, validator_index + 24), + ], + postparsing_validators=[], + fields=[ + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="2", + name="CALENDAR_QUARTER", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.quarterIsValid(), + ], + ), + TransformField( + transform_func=calendar_quarter_to_rpt_month_year((i - 1) % 3), + item="2A", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + Field( + item="3", + name="TDRS_SECTION_IND", + type="string", + startIndex=section_ind_index, + endIndex=section_ind_index + 1, + required=True, + validators=[validators.oneOf(["1", "2"])], + ), + Field( + item="4", + name="STRATUM", + type="string", + startIndex=stratum_index, + endIndex=stratum_index + 2, + required=True, + validators=[validators.isInStringRange(0, 99)], + ), + Field( + item=families_item_numbers[i - 1], + name="FAMILIES_MONTH", + type="number", + startIndex=families_index, + endIndex=families_index + 7, + required=True, + validators=[validators.isInLimits(0, 9999999)], + ), + ], + ) + ) + + index_offset = 0 if i % 3 != 0 else 24 + validator_index += index_offset + section_ind_index += index_offset + stratum_index += index_offset + families_index += 7 if i % 3 != 0 else 10 + +m7 = SchemaManager(schemas=schemas) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py index f31bc892c..4718db68e 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py @@ -7,258 +7,621 @@ from tdpservice.search_indexes.models.tanf import TANF_T1 -t1 = SchemaManager(schemas=[ - RowSchema( +t1 = SchemaManager( + schemas=[ + RowSchema( model=TANF_T1, preparsing_validators=[ - validators.hasLength(156), + validators.hasLength(156), ], postparsing_validators=[ - validators.if_then_validator( - condition_field='CASH_AMOUNT', condition_function=validators.isLargerThan(0), - result_field='NBR_MONTHS', result_function=validators.isLargerThan(0), - ), - validators.if_then_validator( - condition_field='CC_AMOUNT', condition_function=validators.isLargerThan(0), - result_field='CHILDREN_COVERED', result_function=validators.isLargerThan(0), - ), - validators.if_then_validator( - condition_field='CC_AMOUNT', condition_function=validators.isLargerThan(0), - result_field='CC_NBR_MONTHS', result_function=validators.isLargerThan(0), - ), - validators.if_then_validator( - condition_field='TRANSP_AMOUNT', condition_function=validators.isLargerThan(0), - result_field='TRANSP_NBR_MONTHS', result_function=validators.isLargerThan(0), - ), - validators.if_then_validator( - condition_field='TRANSITION_SERVICES_AMOUNT', condition_function=validators.isLargerThan(0), - result_field='TRANSITION_NBR_MONTHS', result_function=validators.isLargerThan(0), - ), - validators.if_then_validator( - condition_field='OTHER_AMOUNT', condition_function=validators.isLargerThan(0), - result_field='OTHER_NBR_MONTHS', result_function=validators.isLargerThan(0), - ), - validators.if_then_validator( - condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), - result_field='WORK_REQ_SANCTION', result_function=validators.oneOf((1, 2)), - ), - validators.if_then_validator( - condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), - result_field='FAMILY_SANC_ADULT', result_function=validators.oneOf((1, 2)), - ), - validators.if_then_validator( - condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), - result_field='SANC_TEEN_PARENT', result_function=validators.oneOf((1, 2)), - ), - validators.if_then_validator( - condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), - result_field='NON_COOPERATION_CSE', result_function=validators.oneOf((1, 2)), - ), - validators.if_then_validator( - condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), - result_field='FAILURE_TO_COMPLY', result_function=validators.oneOf((1, 2)), - ), - validators.if_then_validator( - condition_field='SANC_REDUCTION_AMT', condition_function=validators.isLargerThan(0), - result_field='OTHER_SANCTION', result_function=validators.oneOf((1, 2)), - ), - validators.if_then_validator( - condition_field='OTHER_TOTAL_REDUCTIONS', condition_function=validators.isLargerThan(0), - result_field='FAMILY_CAP', result_function=validators.oneOf((1, 2)), - ), - validators.if_then_validator( - condition_field='OTHER_TOTAL_REDUCTIONS', condition_function=validators.isLargerThan(0), - result_field='REDUCTIONS_ON_RECEIPTS', result_function=validators.oneOf((1, 2)), - ), - validators.if_then_validator( - condition_field='OTHER_TOTAL_REDUCTIONS', condition_function=validators.isLargerThan(0), - result_field='OTHER_NON_SANCTION', result_function=validators.oneOf((1, 2)), - ), - validators.sumIsLarger(("AMT_FOOD_STAMP_ASSISTANCE", "AMT_SUB_CC", "CASH_AMOUNT", "CC_AMOUNT", - "TRANSP_AMOUNT", "TRANSITION_SERVICES_AMOUNT", "OTHER_AMOUNT"), 0) + validators.if_then_validator( + condition_field="CASH_AMOUNT", + condition_function=validators.isLargerThan(0), + result_field="NBR_MONTHS", + result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field="CC_AMOUNT", + condition_function=validators.isLargerThan(0), + result_field="CHILDREN_COVERED", + result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field="CC_AMOUNT", + condition_function=validators.isLargerThan(0), + result_field="CC_NBR_MONTHS", + result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field="TRANSP_AMOUNT", + condition_function=validators.isLargerThan(0), + result_field="TRANSP_NBR_MONTHS", + result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field="TRANSITION_SERVICES_AMOUNT", + condition_function=validators.isLargerThan(0), + result_field="TRANSITION_NBR_MONTHS", + result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field="OTHER_AMOUNT", + condition_function=validators.isLargerThan(0), + result_field="OTHER_NBR_MONTHS", + result_function=validators.isLargerThan(0), + ), + validators.if_then_validator( + condition_field="SANC_REDUCTION_AMT", + condition_function=validators.isLargerThan(0), + result_field="WORK_REQ_SANCTION", + result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field="SANC_REDUCTION_AMT", + condition_function=validators.isLargerThan(0), + result_field="FAMILY_SANC_ADULT", + result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field="SANC_REDUCTION_AMT", + condition_function=validators.isLargerThan(0), + result_field="SANC_TEEN_PARENT", + result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field="SANC_REDUCTION_AMT", + condition_function=validators.isLargerThan(0), + result_field="NON_COOPERATION_CSE", + result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field="SANC_REDUCTION_AMT", + condition_function=validators.isLargerThan(0), + result_field="FAILURE_TO_COMPLY", + result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field="SANC_REDUCTION_AMT", + condition_function=validators.isLargerThan(0), + result_field="OTHER_SANCTION", + result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field="OTHER_TOTAL_REDUCTIONS", + condition_function=validators.isLargerThan(0), + result_field="FAMILY_CAP", + result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field="OTHER_TOTAL_REDUCTIONS", + condition_function=validators.isLargerThan(0), + result_field="REDUCTIONS_ON_RECEIPTS", + result_function=validators.oneOf((1, 2)), + ), + validators.if_then_validator( + condition_field="OTHER_TOTAL_REDUCTIONS", + condition_function=validators.isLargerThan(0), + result_field="OTHER_NON_SANCTION", + result_function=validators.oneOf((1, 2)), + ), + validators.sumIsLarger( + ( + "AMT_FOOD_STAMP_ASSISTANCE", + "AMT_SUB_CC", + "CASH_AMOUNT", + "CC_AMOUNT", + "TRANSP_AMOUNT", + "TRANSITION_SERVICES_AMOUNT", + "OTHER_AMOUNT", + ), + 0, + ), ], fields=[ - Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[ - validators.dateYearIsLargerThan(1998), - validators.dateMonthIsValid(), - ]), - Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[validators.isAlphaNumeric()]), - Field(item="2", name='COUNTY_FIPS_CODE', type='string', startIndex=19, endIndex=22, - required=True, validators=[ - validators.isNumber(), - ]), - Field(item="5", name='STRATUM', type='string', startIndex=22, endIndex=24, - required=False, validators=[ - validators.isInStringRange(0, 99), - ]), - Field(item="7", name='ZIP_CODE', type='string', startIndex=24, endIndex=29, - required=True, validators=[ - validators.isNumber(), - ]), - Field(item="8", name='FUNDING_STREAM', type='number', startIndex=29, endIndex=30, - required=True, validators=[ - validators.isInLimits(1, 3), - ]), - Field(item="9", name='DISPOSITION', type='number', startIndex=30, endIndex=31, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="10", name='NEW_APPLICANT', type='number', startIndex=31, endIndex=32, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="11", name='NBR_FAMILY_MEMBERS', type='number', startIndex=32, endIndex=34, - required=True, validators=[ - validators.isLargerThan(0), - ]), - Field(item="12", name='FAMILY_TYPE', type='number', startIndex=34, endIndex=35, - required=True, validators=[ - validators.isInLimits(1, 3), - ]), - Field(item="13", name='RECEIVES_SUB_HOUSING', type='number', startIndex=35, endIndex=36, - required=True, validators=[ - validators.isInLimits(1, 3), - ]), - Field(item="14", name='RECEIVES_MED_ASSISTANCE', type='number', startIndex=36, endIndex=37, - required=True, validators=[ - validators.isInLimits(1, 2), - ]), - Field(item="15", name='RECEIVES_FOOD_STAMPS', type='number', startIndex=37, endIndex=38, - required=False, validators=[ - validators.isInLimits(0, 2), - ]), - Field(item="16", name='AMT_FOOD_STAMP_ASSISTANCE', type='number', startIndex=38, endIndex=42, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="17", name='RECEIVES_SUB_CC', type='number', startIndex=42, endIndex=43, - required=False, validators=[ - validators.isInLimits(0, 3), - ]), - Field(item="18", name='AMT_SUB_CC', type='number', startIndex=43, endIndex=47, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="19", name='CHILD_SUPPORT_AMT', type='number', startIndex=47, endIndex=51, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="20", name='FAMILY_CASH_RESOURCES', type='number', startIndex=51, endIndex=55, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="21A", name='CASH_AMOUNT', type='number', startIndex=55, endIndex=59, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="21B", name='NBR_MONTHS', type='number', startIndex=59, endIndex=62, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="22A", name='CC_AMOUNT', type='number', startIndex=62, endIndex=66, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="22B", name='CHILDREN_COVERED', type='number', startIndex=66, endIndex=68, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="22C", name='CC_NBR_MONTHS', type='number', startIndex=68, endIndex=71, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="23A", name='TRANSP_AMOUNT', type='number', startIndex=71, endIndex=75, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="23B", name='TRANSP_NBR_MONTHS', type='number', startIndex=75, endIndex=78, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="24A", name='TRANSITION_SERVICES_AMOUNT', type='number', startIndex=78, endIndex=82, - required=False, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="24B", name='TRANSITION_NBR_MONTHS', type='number', startIndex=82, endIndex=85, - required=False, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="25A", name='OTHER_AMOUNT', type='number', startIndex=85, endIndex=89, - required=False, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="25B", name='OTHER_NBR_MONTHS', type='number', startIndex=89, endIndex=92, - required=False, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="26AI", name='SANC_REDUCTION_AMT', type='number', startIndex=92, endIndex=96, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="26AII", name='WORK_REQ_SANCTION', type='number', startIndex=96, endIndex=97, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="26AIII", name='FAMILY_SANC_ADULT', type='number', startIndex=97, endIndex=98, - required=False, validators=[ - validators.oneOf([0, 1, 2]), - ]), - Field(item="26AIV", name='SANC_TEEN_PARENT', type='number', startIndex=98, endIndex=99, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="26AV", name='NON_COOPERATION_CSE', type='number', startIndex=99, endIndex=100, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="26AVI", name='FAILURE_TO_COMPLY', type='number', startIndex=100, endIndex=101, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="26AVII", name='OTHER_SANCTION', type='number', startIndex=101, endIndex=102, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="26B", name='RECOUPMENT_PRIOR_OVRPMT', type='number', startIndex=102, endIndex=106, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="26CI", name='OTHER_TOTAL_REDUCTIONS', type='number', startIndex=106, endIndex=110, - required=True, validators=[ - validators.isLargerThanOrEqualTo(0), - ]), - Field(item="26CII", name='FAMILY_CAP', type='number', startIndex=110, endIndex=111, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="26CIII", name='REDUCTIONS_ON_RECEIPTS', type='number', startIndex=111, endIndex=112, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="26CIV", name='OTHER_NON_SANCTION', type='number', startIndex=112, endIndex=113, - required=True, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="27", name='WAIVER_EVAL_CONTROL_GRPS', type='string', startIndex=113, endIndex=114, - required=False, validators=[ - validators.or_validators(validators.matches('9'), validators.isEmpty()), - validators.isAlphaNumeric(), - ]), - Field(item="28", name='FAMILY_EXEMPT_TIME_LIMITS', type='number', startIndex=114, endIndex=116, - required=True, validators=[ - validators.oneOf([1, 2, 3, 4, - 6, 7, 8, 9]) - ]), - Field(item="29", name='FAMILY_NEW_CHILD', type='number', startIndex=116, endIndex=117, - required=False, validators=[ - validators.oneOf([1, 2]), - ]), - Field(item="-1", name='BLANK', type='string', startIndex=117, endIndex=156, required=False, - validators=[]), + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="4", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=8, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + Field( + item="6", + name="CASE_NUMBER", + type="string", + startIndex=8, + endIndex=19, + required=True, + validators=[validators.isAlphaNumeric()], + ), + Field( + item="2", + name="COUNTY_FIPS_CODE", + type="string", + startIndex=19, + endIndex=22, + required=True, + validators=[ + validators.isNumber(), + ], + ), + Field( + item="5", + name="STRATUM", + type="string", + startIndex=22, + endIndex=24, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="7", + name="ZIP_CODE", + type="string", + startIndex=24, + endIndex=29, + required=True, + validators=[ + validators.isNumber(), + ], + ), + Field( + item="8", + name="FUNDING_STREAM", + type="number", + startIndex=29, + endIndex=30, + required=True, + validators=[ + validators.isInLimits(1, 3), + ], + ), + Field( + item="9", + name="DISPOSITION", + type="number", + startIndex=30, + endIndex=31, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="10", + name="NEW_APPLICANT", + type="number", + startIndex=31, + endIndex=32, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="11", + name="NBR_FAMILY_MEMBERS", + type="number", + startIndex=32, + endIndex=34, + required=True, + validators=[ + validators.isLargerThan(0), + ], + ), + Field( + item="12", + name="FAMILY_TYPE", + type="number", + startIndex=34, + endIndex=35, + required=True, + validators=[ + validators.isInLimits(1, 3), + ], + ), + Field( + item="13", + name="RECEIVES_SUB_HOUSING", + type="number", + startIndex=35, + endIndex=36, + required=True, + validators=[ + validators.isInLimits(1, 3), + ], + ), + Field( + item="14", + name="RECEIVES_MED_ASSISTANCE", + type="number", + startIndex=36, + endIndex=37, + required=True, + validators=[ + validators.isInLimits(1, 2), + ], + ), + Field( + item="15", + name="RECEIVES_FOOD_STAMPS", + type="number", + startIndex=37, + endIndex=38, + required=False, + validators=[ + validators.isInLimits(0, 2), + ], + ), + Field( + item="16", + name="AMT_FOOD_STAMP_ASSISTANCE", + type="number", + startIndex=38, + endIndex=42, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="17", + name="RECEIVES_SUB_CC", + type="number", + startIndex=42, + endIndex=43, + required=False, + validators=[ + validators.isInLimits(0, 3), + ], + ), + Field( + item="18", + name="AMT_SUB_CC", + type="number", + startIndex=43, + endIndex=47, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="19", + name="CHILD_SUPPORT_AMT", + type="number", + startIndex=47, + endIndex=51, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="20", + name="FAMILY_CASH_RESOURCES", + type="number", + startIndex=51, + endIndex=55, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="21A", + name="CASH_AMOUNT", + type="number", + startIndex=55, + endIndex=59, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="21B", + name="NBR_MONTHS", + type="number", + startIndex=59, + endIndex=62, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="22A", + name="CC_AMOUNT", + type="number", + startIndex=62, + endIndex=66, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="22B", + name="CHILDREN_COVERED", + type="number", + startIndex=66, + endIndex=68, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="22C", + name="CC_NBR_MONTHS", + type="number", + startIndex=68, + endIndex=71, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="23A", + name="TRANSP_AMOUNT", + type="number", + startIndex=71, + endIndex=75, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="23B", + name="TRANSP_NBR_MONTHS", + type="number", + startIndex=75, + endIndex=78, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="24A", + name="TRANSITION_SERVICES_AMOUNT", + type="number", + startIndex=78, + endIndex=82, + required=False, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="24B", + name="TRANSITION_NBR_MONTHS", + type="number", + startIndex=82, + endIndex=85, + required=False, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="25A", + name="OTHER_AMOUNT", + type="number", + startIndex=85, + endIndex=89, + required=False, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="25B", + name="OTHER_NBR_MONTHS", + type="number", + startIndex=89, + endIndex=92, + required=False, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="26AI", + name="SANC_REDUCTION_AMT", + type="number", + startIndex=92, + endIndex=96, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="26AII", + name="WORK_REQ_SANCTION", + type="number", + startIndex=96, + endIndex=97, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="26AIII", + name="FAMILY_SANC_ADULT", + type="number", + startIndex=97, + endIndex=98, + required=False, + validators=[ + validators.oneOf([0, 1, 2]), + ], + ), + Field( + item="26AIV", + name="SANC_TEEN_PARENT", + type="number", + startIndex=98, + endIndex=99, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="26AV", + name="NON_COOPERATION_CSE", + type="number", + startIndex=99, + endIndex=100, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="26AVI", + name="FAILURE_TO_COMPLY", + type="number", + startIndex=100, + endIndex=101, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="26AVII", + name="OTHER_SANCTION", + type="number", + startIndex=101, + endIndex=102, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="26B", + name="RECOUPMENT_PRIOR_OVRPMT", + type="number", + startIndex=102, + endIndex=106, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="26CI", + name="OTHER_TOTAL_REDUCTIONS", + type="number", + startIndex=106, + endIndex=110, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="26CII", + name="FAMILY_CAP", + type="number", + startIndex=110, + endIndex=111, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="26CIII", + name="REDUCTIONS_ON_RECEIPTS", + type="number", + startIndex=111, + endIndex=112, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="26CIV", + name="OTHER_NON_SANCTION", + type="number", + startIndex=112, + endIndex=113, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="27", + name="WAIVER_EVAL_CONTROL_GRPS", + type="string", + startIndex=113, + endIndex=114, + required=False, + validators=[ + validators.or_validators( + validators.matches("9"), validators.isEmpty() + ), + validators.isAlphaNumeric(), + ], + ), + Field( + item="28", + name="FAMILY_EXEMPT_TIME_LIMITS", + type="number", + startIndex=114, + endIndex=116, + required=True, + validators=[validators.oneOf([1, 2, 3, 4, 6, 7, 8, 9])], + ), + Field( + item="29", + name="FAMILY_NEW_CHILD", + type="number", + startIndex=116, + endIndex=117, + required=False, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="-1", + name="BLANK", + type="string", + startIndex=117, + endIndex=156, + required=False, + validators=[], + ), ], - )] + ) + ] ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py index 1f2088b38..89cc794d8 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py @@ -9,235 +9,878 @@ from tdpservice.search_indexes.models.tanf import TANF_T2 -t2 = SchemaManager(schemas=[ - RowSchema( - model=TANF_T2, - preparsing_validators=[ - validators.hasLength(156), - ], - postparsing_validators=[ +t2 = SchemaManager( + schemas=[ + RowSchema( + model=TANF_T2, + preparsing_validators=[ + validators.hasLength(156), + ], + postparsing_validators=[ validators.validate__FAM_AFF__SSN(), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='SSN', result_function=validators.validateSSN(), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="SSN", + result_function=validators.validateSSN(), ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_HISPANIC', result_function=validators.isInLimits(1, 2), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_HISPANIC", + result_function=validators.isInLimits(1, 2), ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_AMER_INDIAN', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_AMER_INDIAN", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_ASIAN', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_ASIAN", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_BLACK', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_BLACK", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_HAWAIIAN', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_HAWAIIAN", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_WHITE', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_WHITE", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='MARITAL_STATUS', result_function=validators.isInLimits(1, 5), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="MARITAL_STATUS", + result_function=validators.isInLimits(1, 5), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 2), - result_field='PARENT_WITH_MINOR_CHILD', result_function=validators.isInLimits(1, 3), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 2), + result_field="PARENT_WITH_MINOR_CHILD", + result_function=validators.isInLimits(1, 3), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='EDUCATION_LEVEL', result_function=validators.or_validators( - validators.isInStringRange(0, 16), - validators.isInStringRange(98, 99) - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="EDUCATION_LEVEL", + result_function=validators.or_validators( + validators.isInStringRange(0, 16), + validators.isInStringRange(98, 99), ), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2)), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="CITIZENSHIP_STATUS", + result_function=validators.oneOf((1, 2)), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='COOPERATION_CHILD_SUPPORT', result_function=validators.oneOf((1, 2, 9)), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="COOPERATION_CHILD_SUPPORT", + result_function=validators.oneOf((1, 2, 9)), + ), validators.validate__FAM_AFF__HOH__Fed_Time(), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='EMPLOYMENT_STATUS', result_function=validators.isInLimits(1, 3), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="EMPLOYMENT_STATUS", + result_function=validators.isInLimits(1, 3), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='WORK_ELIGIBLE_INDICATOR', result_function=validators.or_validators( - validators.isInStringRange(1, 9), - validators.oneOf(('11', '12')) - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="WORK_ELIGIBLE_INDICATOR", + result_function=validators.or_validators( + validators.isInStringRange(1, 9), validators.oneOf(("11", "12")) ), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='WORK_PART_STATUS', result_function=validators.oneOf(['01', '02', '05', '07', '09', - '15', '17', '18', '19', '99'] - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="WORK_PART_STATUS", + result_function=validators.oneOf( + ["01", "02", "05", "07", "09", "15", "17", "18", "19", "99"] ), + ), validators.if_then_validator( - condition_field='WORK_ELIGIBLE_INDICATOR', condition_function=validators.isInStringRange(1, 5), - result_field='WORK_PART_STATUS', result_function=validators.notMatches('99'), - ), + condition_field="WORK_ELIGIBLE_INDICATOR", + condition_function=validators.isInStringRange(1, 5), + result_field="WORK_PART_STATUS", + result_function=validators.notMatches("99"), + ), + ], + fields=[ + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="4", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=8, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + Field( + item="6", + name="CASE_NUMBER", + type="string", + startIndex=8, + endIndex=19, + required=True, + validators=[validators.isAlphaNumeric()], + ), + Field( + item="30", + name="FAMILY_AFFILIATION", + type="number", + startIndex=19, + endIndex=20, + required=True, + validators=[validators.oneOf([1, 2, 3, 5])], + ), + Field( + item="31", + name="NONCUSTODIAL_PARENT", + type="number", + startIndex=20, + endIndex=21, + required=True, + validators=[validators.oneOf([1, 2])], + ), + Field( + item="32", + name="DATE_OF_BIRTH", + type="number", + startIndex=21, + endIndex=29, + required=True, + validators=[ + validators.isLargerThan(0), + ], + ), + TransformField( + transform_func=tanf_ssn_decryption_func, + item="33", + name="SSN", + type="string", + startIndex=29, + endIndex=38, + required=True, + validators=[validators.validateSSN()], + is_encrypted=False, + ), + Field( + item="34A", + name="RACE_HISPANIC", + type="number", + startIndex=38, + endIndex=39, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="34B", + name="RACE_AMER_INDIAN", + type="number", + startIndex=39, + endIndex=40, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="34C", + name="RACE_ASIAN", + type="number", + startIndex=40, + endIndex=41, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="34D", + name="RACE_BLACK", + type="number", + startIndex=41, + endIndex=42, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="34E", + name="RACE_HAWAIIAN", + type="number", + startIndex=42, + endIndex=43, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="34F", + name="RACE_WHITE", + type="number", + startIndex=43, + endIndex=44, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="35", + name="GENDER", + type="number", + startIndex=44, + endIndex=45, + required=True, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="36A", + name="FED_OASDI_PROGRAM", + type="number", + startIndex=45, + endIndex=46, + required=True, + validators=[validators.oneOf([1, 2])], + ), + Field( + item="36B", + name="FED_DISABILITY_STATUS", + type="number", + startIndex=46, + endIndex=47, + required=True, + validators=[validators.oneOf([1, 2])], + ), + Field( + item="36C", + name="DISABLED_TITLE_XIVAPDT", + type="string", + startIndex=47, + endIndex=48, + required=True, + validators=[ + validators.or_validators( + validators.oneOf(["1", "2"]), validators.isBlank() + ) + ], + ), + Field( + item="36D", + name="AID_AGED_BLIND", + type="number", + startIndex=48, + endIndex=49, + required=False, + validators=[ + validators.isLargerThanOrEqualTo(0), + ], + ), + Field( + item="36E", + name="RECEIVE_SSI", + type="number", + startIndex=49, + endIndex=50, + required=True, + validators=[ + validators.oneOf([1, 2]), + ], + ), + Field( + item="37", + name="MARITAL_STATUS", + type="number", + startIndex=50, + endIndex=51, + required=False, + validators=[ + validators.isInLimits(0, 5), + ], + ), + Field( + item="38", + name="RELATIONSHIP_HOH", + type="string", + startIndex=51, + endIndex=53, + required=True, + validators=[ + validators.isInStringRange(1, 10), + ], + ), + Field( + item="39", + name="PARENT_WITH_MINOR_CHILD", + type="number", + startIndex=53, + endIndex=54, + required=False, + validators=[ + validators.isInLimits(0, 3), + ], + ), + Field( + item="40", + name="NEEDS_PREGNANT_WOMAN", + type="number", + startIndex=54, + endIndex=55, + required=False, + validators=[ + validators.isInLimits(0, 9), + ], + ), + Field( + item="41", + name="EDUCATION_LEVEL", + type="string", + startIndex=55, + endIndex=57, + required=False, + validators=[ + validators.or_validators( + validators.isInStringRange(0, 16), + validators.isInStringRange(98, 99), + ) + ], + ), + Field( + item="42", + name="CITIZENSHIP_STATUS", + type="number", + startIndex=57, + endIndex=58, + required=False, + validators=[validators.oneOf([0, 1, 2, 9])], + ), + Field( + item="43", + name="COOPERATION_CHILD_SUPPORT", + type="number", + startIndex=58, + endIndex=59, + required=False, + validators=[ + validators.oneOf([0, 1, 2, 9]), + ], + ), + Field( + item="44", + name="MONTHS_FED_TIME_LIMIT", + type="string", + startIndex=59, + endIndex=62, + required=False, + validators=[ + validators.isInStringRange(0, 999), + ], + ), + Field( + item="45", + name="MONTHS_STATE_TIME_LIMIT", + type="string", + startIndex=62, + endIndex=64, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="46", + name="CURRENT_MONTH_STATE_EXEMPT", + type="number", + startIndex=64, + endIndex=65, + required=False, + validators=[ + validators.isInLimits(0, 9), + ], + ), + Field( + item="47", + name="EMPLOYMENT_STATUS", + type="number", + startIndex=65, + endIndex=66, + required=False, + validators=[ + validators.isInLimits(0, 3), + ], + ), + Field( + item="48", + name="WORK_ELIGIBLE_INDICATOR", + type="string", + startIndex=66, + endIndex=68, + required=True, + validators=[ + validators.or_validators( + validators.isInStringRange(0, 9), + validators.oneOf(("11", "12")), + ) + ], + ), + Field( + item="49", + name="WORK_PART_STATUS", + type="string", + startIndex=68, + endIndex=70, + required=False, + validators=[ + validators.oneOf( + [ + "01", + "02", + "05", + "07", + "09", + "15", + "16", + "17", + "18", + "19", + "99", + ] + ) + ], + ), + Field( + item="50", + name="UNSUB_EMPLOYMENT", + type="string", + startIndex=70, + endIndex=72, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="51", + name="SUB_PRIVATE_EMPLOYMENT", + type="string", + startIndex=72, + endIndex=74, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="52", + name="SUB_PUBLIC_EMPLOYMENT", + type="string", + startIndex=74, + endIndex=76, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="53A", + name="WORK_EXPERIENCE_HOP", + type="string", + startIndex=76, + endIndex=78, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="53B", + name="WORK_EXPERIENCE_EA", + type="string", + startIndex=78, + endIndex=80, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="53C", + name="WORK_EXPERIENCE_HOL", + type="string", + startIndex=80, + endIndex=82, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="54", + name="OJT", + type="string", + startIndex=82, + endIndex=84, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="55A", + name="JOB_SEARCH_HOP", + type="string", + startIndex=84, + endIndex=86, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="55B", + name="JOB_SEARCH_EA", + type="string", + startIndex=86, + endIndex=88, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="55C", + name="JOB_SEARCH_HOL", + type="string", + startIndex=88, + endIndex=90, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="56A", + name="COMM_SERVICES_HOP", + type="string", + startIndex=90, + endIndex=92, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="56B", + name="COMM_SERVICES_EA", + type="string", + startIndex=92, + endIndex=94, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="56C", + name="COMM_SERVICES_HOL", + type="string", + startIndex=94, + endIndex=96, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="57A", + name="VOCATIONAL_ED_TRAINING_HOP", + type="string", + startIndex=96, + endIndex=98, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="57B", + name="VOCATIONAL_ED_TRAINING_EA", + type="string", + startIndex=98, + endIndex=100, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="57C", + name="VOCATIONAL_ED_TRAINING_HOL", + type="string", + startIndex=100, + endIndex=102, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="58A", + name="JOB_SKILLS_TRAINING_HOP", + type="string", + startIndex=102, + endIndex=104, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="58B", + name="JOB_SKILLS_TRAINING_EA", + type="string", + startIndex=104, + endIndex=106, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="58C", + name="JOB_SKILLS_TRAINING_HOL", + type="string", + startIndex=106, + endIndex=108, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="59A", + name="ED_NO_HIGH_SCHOOL_DIPL_HOP", + type="string", + startIndex=108, + endIndex=110, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="59B", + name="ED_NO_HIGH_SCHOOL_DIPL_EA", + type="string", + startIndex=110, + endIndex=112, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="59C", + name="ED_NO_HIGH_SCHOOL_DIPL_HOL", + type="string", + startIndex=112, + endIndex=114, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="60A", + name="SCHOOL_ATTENDENCE_HOP", + type="string", + startIndex=114, + endIndex=116, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="60B", + name="SCHOOL_ATTENDENCE_EA", + type="string", + startIndex=116, + endIndex=118, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="60C", + name="SCHOOL_ATTENDENCE_HOL", + type="string", + startIndex=118, + endIndex=120, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="61A", + name="PROVIDE_CC_HOP", + type="string", + startIndex=120, + endIndex=122, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="61B", + name="PROVIDE_CC_EA", + type="string", + startIndex=122, + endIndex=124, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="61C", + name="PROVIDE_CC_HOL", + type="string", + startIndex=124, + endIndex=126, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="62", + name="OTHER_WORK_ACTIVITIES", + type="string", + startIndex=126, + endIndex=128, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="63", + name="DEEMED_HOURS_FOR_OVERALL", + type="string", + startIndex=128, + endIndex=130, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="64", + name="DEEMED_HOURS_FOR_TWO_PARENT", + type="string", + startIndex=130, + endIndex=132, + required=False, + validators=[ + validators.isInStringRange(0, 99), + ], + ), + Field( + item="65", + name="EARNED_INCOME", + type="string", + startIndex=132, + endIndex=136, + required=True, + validators=[ + validators.isInStringRange(0, 9999), + ], + ), + Field( + item="66A", + name="UNEARNED_INCOME_TAX_CREDIT", + type="string", + startIndex=136, + endIndex=140, + required=False, + validators=[ + validators.isInStringRange(0, 9999), + ], + ), + Field( + item="66B", + name="UNEARNED_SOCIAL_SECURITY", + type="string", + startIndex=140, + endIndex=144, + required=True, + validators=[ + validators.isInStringRange(0, 9999), + ], + ), + Field( + item="66C", + name="UNEARNED_SSI", + type="string", + startIndex=144, + endIndex=148, + required=True, + validators=[ + validators.isInStringRange(0, 9999), + ], + ), + Field( + item="66D", + name="UNEARNED_WORKERS_COMP", + type="string", + startIndex=148, + endIndex=152, + required=True, + validators=[ + validators.isInStringRange(0, 9999), + ], + ), + Field( + item="66E", + name="OTHER_UNEARNED_INCOME", + type="string", + startIndex=152, + endIndex=156, + required=True, + validators=[ + validators.isInStringRange(0, 9999), + ], + ), ], - fields=[ - Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[validators.dateYearIsLargerThan(1998), - validators.dateMonthIsValid(), - ]), - Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[validators.isAlphaNumeric()]), - Field(item="30", name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, - required=True, validators=[validators.oneOf([1, 2, 3, 5])]), - Field(item="31", name='NONCUSTODIAL_PARENT', type='number', startIndex=20, endIndex=21, required=True, - validators=[validators.oneOf([1, 2])]), - Field(item="32", name='DATE_OF_BIRTH', type='number', startIndex=21, endIndex=29, required=True, - validators=[validators.isLargerThan(0),]), - TransformField(transform_func=tanf_ssn_decryption_func, item="33", name='SSN', type='string', startIndex=29, - endIndex=38, required=True, - validators=[validators.validateSSN()], is_encrypted=False), - Field(item="34A", name='RACE_HISPANIC', type='number', startIndex=38, endIndex=39, required=False, - validators=[validators.isInLimits(0, 2)]), - Field(item="34B", name='RACE_AMER_INDIAN', type='number', startIndex=39, endIndex=40, required=False, - validators=[validators.isInLimits(0, 2)]), - Field(item="34C", name='RACE_ASIAN', type='number', startIndex=40, endIndex=41, required=False, - validators=[validators.isInLimits(0, 2)]), - Field(item="34D", name='RACE_BLACK', type='number', startIndex=41, endIndex=42, required=False, - validators=[validators.isInLimits(0, 2)]), - Field(item="34E", name='RACE_HAWAIIAN', type='number', startIndex=42, endIndex=43, required=False, - validators=[validators.isInLimits(0, 2)]), - Field(item="34F", name='RACE_WHITE', type='number', startIndex=43, endIndex=44, required=False, - validators=[validators.isInLimits(0, 2)]), - Field(item="35", name='GENDER', type='number', startIndex=44, endIndex=45, required=True, - validators=[validators.isLargerThanOrEqualTo(0),]), - Field(item="36A", name='FED_OASDI_PROGRAM', type='number', startIndex=45, endIndex=46, required=True, - validators=[validators.oneOf([1, 2])]), - Field(item="36B", name='FED_DISABILITY_STATUS', type='number', startIndex=46, endIndex=47, required=True, - validators=[validators.oneOf([1, 2])]), - Field(item="36C", name='DISABLED_TITLE_XIVAPDT', type='string', startIndex=47, endIndex=48, required=True, - validators=[validators.or_validators(validators.oneOf(["1", "2"]), validators.isBlank())]), - Field(item="36D", name='AID_AGED_BLIND', type='number', startIndex=48, endIndex=49, required=False, - validators=[validators.isLargerThanOrEqualTo(0),]), - Field(item="36E", name='RECEIVE_SSI', type='number', startIndex=49, endIndex=50, required=True, - validators=[validators.oneOf([1, 2]),]), - Field(item="37", name='MARITAL_STATUS', type='number', startIndex=50, endIndex=51, required=False, - validators=[validators.isInLimits(0, 5),]), - Field(item="38", name='RELATIONSHIP_HOH', type='string', startIndex=51, endIndex=53, required=True, - validators=[validators.isInStringRange(1, 10),]), - Field(item="39", name='PARENT_WITH_MINOR_CHILD', type='number', startIndex=53, endIndex=54, required=False, - validators=[validators.isInLimits(0, 3),]), - Field(item="40", name='NEEDS_PREGNANT_WOMAN', type='number', startIndex=54, endIndex=55, required=False, - validators=[validators.isInLimits(0, 9),]), - Field(item="41", name='EDUCATION_LEVEL', type='string', startIndex=55, endIndex=57, required=False, - validators=[validators.or_validators(validators.isInStringRange(0, 16), - validators.isInStringRange(98, 99) - )]), - Field(item="42", name='CITIZENSHIP_STATUS', type='number', startIndex=57, endIndex=58, required=False, - validators=[validators.oneOf([0, 1, 2, 9])]), - Field(item="43", name='COOPERATION_CHILD_SUPPORT', type='number', startIndex=58, endIndex=59, - required=False, validators=[validators.oneOf([0, 1, 2, 9]),]), - Field(item="44", name='MONTHS_FED_TIME_LIMIT', type='string', startIndex=59, endIndex=62, required=False, - validators=[validators.isInStringRange(0, 999),]), - Field(item="45", name='MONTHS_STATE_TIME_LIMIT', type='string', startIndex=62, endIndex=64, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="46", name='CURRENT_MONTH_STATE_EXEMPT', type='number', startIndex=64, endIndex=65, - required=False, validators=[validators.isInLimits(0, 9),]), - Field(item="47", name='EMPLOYMENT_STATUS', type='number', startIndex=65, endIndex=66, required=False, - validators=[validators.isInLimits(0, 3),]), - Field(item="48", name='WORK_ELIGIBLE_INDICATOR', type='string', startIndex=66, endIndex=68, required=True, - validators=[validators.or_validators(validators.isInStringRange(0, 9), - validators.oneOf(('11', '12')) - )]), - Field(item="49", name='WORK_PART_STATUS', type='string', startIndex=68, endIndex=70, required=False, - validators=[validators.oneOf(['01', '02', '05', '07', '09', '15', '16', '17', '18', '19', '99'])]), - Field(item="50", name='UNSUB_EMPLOYMENT', type='string', startIndex=70, endIndex=72, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="51", name='SUB_PRIVATE_EMPLOYMENT', type='string', startIndex=72, endIndex=74, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="52", name='SUB_PUBLIC_EMPLOYMENT', type='string', startIndex=74, endIndex=76, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="53A", name='WORK_EXPERIENCE_HOP', type='string', startIndex=76, endIndex=78, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="53B", name='WORK_EXPERIENCE_EA', type='string', startIndex=78, endIndex=80, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="53C", name='WORK_EXPERIENCE_HOL', type='string', startIndex=80, endIndex=82, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="54", name='OJT', type='string', startIndex=82, endIndex=84, required=False, validators=[ - validators.isInStringRange(0, 99), - ]), - Field(item="55A", name='JOB_SEARCH_HOP', type='string', startIndex=84, endIndex=86, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="55B", name='JOB_SEARCH_EA', type='string', startIndex=86, endIndex=88, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="55C", name='JOB_SEARCH_HOL', type='string', startIndex=88, endIndex=90, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="56A", name='COMM_SERVICES_HOP', type='string', startIndex=90, endIndex=92, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="56B", name='COMM_SERVICES_EA', type='string', startIndex=92, endIndex=94, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="56C", name='COMM_SERVICES_HOL', type='string', startIndex=94, endIndex=96, required=False, - validators=[validators.isInStringRange(0, 99),]), - Field(item="57A", name='VOCATIONAL_ED_TRAINING_HOP', type='string', startIndex=96, endIndex=98, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="57B", name='VOCATIONAL_ED_TRAINING_EA', type='string', startIndex=98, endIndex=100, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="57C", name='VOCATIONAL_ED_TRAINING_HOL', type='string', startIndex=100, endIndex=102, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="58A", name='JOB_SKILLS_TRAINING_HOP', type='string', startIndex=102, endIndex=104, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="58B", name='JOB_SKILLS_TRAINING_EA', type='string', startIndex=104, endIndex=106, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="58C", name='JOB_SKILLS_TRAINING_HOL', type='string', startIndex=106, endIndex=108, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="59A", name='ED_NO_HIGH_SCHOOL_DIPL_HOP', type='string', startIndex=108, endIndex=110, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="59B", name='ED_NO_HIGH_SCHOOL_DIPL_EA', type='string', startIndex=110, endIndex=112, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="59C", name='ED_NO_HIGH_SCHOOL_DIPL_HOL', type='string', startIndex=112, endIndex=114, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="60A", name='SCHOOL_ATTENDENCE_HOP', type='string', startIndex=114, endIndex=116, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="60B", name='SCHOOL_ATTENDENCE_EA', type='string', startIndex=116, endIndex=118, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="60C", name='SCHOOL_ATTENDENCE_HOL', type='string', startIndex=118, endIndex=120, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="61A", name='PROVIDE_CC_HOP', type='string', startIndex=120, endIndex=122, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="61B", name='PROVIDE_CC_EA', type='string', startIndex=122, endIndex=124, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="61C", name='PROVIDE_CC_HOL', type='string', startIndex=124, endIndex=126, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="62", name='OTHER_WORK_ACTIVITIES', type='string', startIndex=126, endIndex=128, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="63", name='DEEMED_HOURS_FOR_OVERALL', type='string', startIndex=128, endIndex=130, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="64", name='DEEMED_HOURS_FOR_TWO_PARENT', type='string', startIndex=130, endIndex=132, - required=False, validators=[validators.isInStringRange(0, 99),]), - Field(item="65", name='EARNED_INCOME', type='string', startIndex=132, endIndex=136, - required=True, validators=[validators.isInStringRange(0, 9999),]), - Field(item="66A", name='UNEARNED_INCOME_TAX_CREDIT', type='string', startIndex=136, endIndex=140, - required=False, validators=[validators.isInStringRange(0, 9999),]), - Field(item="66B", name='UNEARNED_SOCIAL_SECURITY', type='string', startIndex=140, endIndex=144, - required=True, validators=[validators.isInStringRange(0, 9999),]), - Field(item="66C", name='UNEARNED_SSI', type='string', startIndex=144, endIndex=148, required=True, - validators=[validators.isInStringRange(0, 9999),]), - Field(item="66D", name='UNEARNED_WORKERS_COMP', type='string', startIndex=148, endIndex=152, required=True, - validators=[validators.isInStringRange(0, 9999),]), - Field(item="66E", name='OTHER_UNEARNED_INCOME', type='string', startIndex=152, endIndex=156, required=True, - validators=[validators.isInStringRange(0, 9999),]), - ], - )] + ) + ] ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py index 66daa1e59..787828473 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py @@ -16,124 +16,278 @@ ], postparsing_validators=[ validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='SSN', result_function=validators.validateSSN(), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="SSN", + result_function=validators.validateSSN(), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_HISPANIC', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_HISPANIC", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_AMER_INDIAN', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_AMER_INDIAN", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_ASIAN', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_ASIAN", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_BLACK', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_BLACK", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_HAWAIIAN', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_HAWAIIAN", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_WHITE', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_WHITE", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RELATIONSHIP_HOH', result_function=validators.isInStringRange(4, 9), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RELATIONSHIP_HOH", + result_function=validators.isInStringRange(4, 9), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='PARENT_MINOR_CHILD', result_function=validators.oneOf((2, 3)), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="PARENT_MINOR_CHILD", + result_function=validators.oneOf((2, 3)), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='EDUCATION_LEVEL', result_function=validators.notMatches('99'), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="EDUCATION_LEVEL", + result_function=validators.notMatches("99"), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2)), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="CITIZENSHIP_STATUS", + result_function=validators.oneOf((1, 2)), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(2), - result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2, 9)), - ), - ], + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(2), + result_field="CITIZENSHIP_STATUS", + result_function=validators.oneOf((1, 2, 9)), + ), + ], fields=[ - Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[]), - Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[validators.isAlphaNumeric()]), - Field(item="67", name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, - required=True, validators=[ - validators.oneOf([1, 2, 4]) - ]), - Field(item="68", name='DATE_OF_BIRTH', type='number', startIndex=20, endIndex=28, - required=True, validators=[ - validators.dateYearIsLargerThan(1998), - validators.dateMonthIsValid(), - ]), - TransformField(transform_func=tanf_ssn_decryption_func, item="69", name='SSN', type='string', startIndex=28, - endIndex=37, required=True, validators=[validators.validateSSN()], - is_encrypted=False), - Field(item="70A", name='RACE_HISPANIC', type='number', startIndex=37, endIndex=38, - required=False, validators=[validators.validateRace()]), - Field(item="70B", name='RACE_AMER_INDIAN', type='number', startIndex=38, endIndex=39, - required=False, validators=[validators.validateRace()]), - Field(item="70C", name='RACE_ASIAN', type='number', startIndex=39, endIndex=40, - required=False, validators=[validators.validateRace()]), - Field(item="70D", name='RACE_BLACK', type='number', startIndex=40, endIndex=41, - required=False, validators=[validators.validateRace()]), - Field(item="70E", name='RACE_HAWAIIAN', type='number', startIndex=41, endIndex=42, - required=False, validators=[validators.validateRace()]), - Field(item="70F", name='RACE_WHITE', type='number', startIndex=42, endIndex=43, - required=False, validators=[validators.validateRace()]), - Field(item="71", name='GENDER', type='number', startIndex=43, endIndex=44, - required=True, validators=[ - validators.isInLimits(0, 9) - ]), - Field(item="72A", name='RECEIVE_NONSSA_BENEFITS', type='number', startIndex=44, endIndex=45, - required=True, validators=[ - validators.oneOf([1, 2]) - ]), - Field(item="72B", name='RECEIVE_SSI', type='number', startIndex=45, endIndex=46, - required=True, validators=[ - validators.oneOf([1, 2]) - ]), - Field(item="73", name='RELATIONSHIP_HOH', type='string', startIndex=46, endIndex=48, - required=False, validators=[ - validators.isInStringRange(0, 10) - ]), - Field(item="74", name='PARENT_MINOR_CHILD', type='number', startIndex=48, endIndex=49, - required=False, validators=[ - validators.oneOf([0, 2, 3]) - ]), - Field(item="75", name='EDUCATION_LEVEL', type='string', startIndex=49, endIndex=51, - required=True, validators=[ - validators.or_validators( - validators.isInStringRange(0, 16), - validators.isInStringRange(98, 99) - ) - ]), - Field(item="76", name='CITIZENSHIP_STATUS', type='number', startIndex=51, endIndex=52, - required=False, validators=[ - validators.oneOf([0, 1, 2, 9]) - ]), - Field(item="77A", name='UNEARNED_SSI', type='string', startIndex=52, endIndex=56, - required=False, validators=[ - validators.isInStringRange(0, 9999) - ]), - Field(item="77B", name='OTHER_UNEARNED_INCOME', type='string', startIndex=56, endIndex=60, - required=False, validators=[ - validators.isInStringRange(0, 9999) - ]), + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="4", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=8, + required=True, + validators=[], + ), + Field( + item="6", + name="CASE_NUMBER", + type="string", + startIndex=8, + endIndex=19, + required=True, + validators=[validators.isAlphaNumeric()], + ), + Field( + item="67", + name="FAMILY_AFFILIATION", + type="number", + startIndex=19, + endIndex=20, + required=True, + validators=[validators.oneOf([1, 2, 4])], + ), + Field( + item="68", + name="DATE_OF_BIRTH", + type="number", + startIndex=20, + endIndex=28, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + TransformField( + transform_func=tanf_ssn_decryption_func, + item="69", + name="SSN", + type="string", + startIndex=28, + endIndex=37, + required=True, + validators=[validators.validateSSN()], + is_encrypted=False, + ), + Field( + item="70A", + name="RACE_HISPANIC", + type="number", + startIndex=37, + endIndex=38, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70B", + name="RACE_AMER_INDIAN", + type="number", + startIndex=38, + endIndex=39, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70C", + name="RACE_ASIAN", + type="number", + startIndex=39, + endIndex=40, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70D", + name="RACE_BLACK", + type="number", + startIndex=40, + endIndex=41, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70E", + name="RACE_HAWAIIAN", + type="number", + startIndex=41, + endIndex=42, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70F", + name="RACE_WHITE", + type="number", + startIndex=42, + endIndex=43, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="71", + name="GENDER", + type="number", + startIndex=43, + endIndex=44, + required=True, + validators=[validators.isInLimits(0, 9)], + ), + Field( + item="72A", + name="RECEIVE_NONSSA_BENEFITS", + type="number", + startIndex=44, + endIndex=45, + required=True, + validators=[validators.oneOf([1, 2])], + ), + Field( + item="72B", + name="RECEIVE_SSI", + type="number", + startIndex=45, + endIndex=46, + required=True, + validators=[validators.oneOf([1, 2])], + ), + Field( + item="73", + name="RELATIONSHIP_HOH", + type="string", + startIndex=46, + endIndex=48, + required=False, + validators=[validators.isInStringRange(0, 10)], + ), + Field( + item="74", + name="PARENT_MINOR_CHILD", + type="number", + startIndex=48, + endIndex=49, + required=False, + validators=[validators.oneOf([0, 2, 3])], + ), + Field( + item="75", + name="EDUCATION_LEVEL", + type="string", + startIndex=49, + endIndex=51, + required=True, + validators=[ + validators.or_validators( + validators.isInStringRange(0, 16), + validators.isInStringRange(98, 99), + ) + ], + ), + Field( + item="76", + name="CITIZENSHIP_STATUS", + type="number", + startIndex=51, + endIndex=52, + required=False, + validators=[validators.oneOf([0, 1, 2, 9])], + ), + Field( + item="77A", + name="UNEARNED_SSI", + type="string", + startIndex=52, + endIndex=56, + required=False, + validators=[validators.isInStringRange(0, 9999)], + ), + Field( + item="77B", + name="OTHER_UNEARNED_INCOME", + type="string", + startIndex=56, + endIndex=60, + required=False, + validators=[validators.isInStringRange(0, 9999)], + ), ], ) @@ -145,130 +299,278 @@ ], postparsing_validators=[ validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='SSN', result_function=validators.validateSSN(), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="SSN", + result_function=validators.validateSSN(), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_HISPANIC', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_HISPANIC", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_AMER_INDIAN', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_AMER_INDIAN", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_ASIAN', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_ASIAN", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_BLACK', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_BLACK", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_HAWAIIAN', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_HAWAIIAN", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RACE_WHITE', result_function=validators.isInLimits(1, 2), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RACE_WHITE", + result_function=validators.isInLimits(1, 2), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='RELATIONSHIP_HOH', result_function=validators.isInStringRange(4, 9), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="RELATIONSHIP_HOH", + result_function=validators.isInStringRange(4, 9), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.oneOf((1, 2)), - result_field='PARENT_MINOR_CHILD', result_function=validators.oneOf((2, 3)), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.oneOf((1, 2)), + result_field="PARENT_MINOR_CHILD", + result_function=validators.oneOf((2, 3)), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='EDUCATION_LEVEL', result_function=validators.notMatches('99'), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="EDUCATION_LEVEL", + result_function=validators.notMatches("99"), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2)), - ), + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="CITIZENSHIP_STATUS", + result_function=validators.oneOf((1, 2)), + ), validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(2), - result_field='CITIZENSHIP_STATUS', result_function=validators.oneOf((1, 2, 9)), - ), - ], + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(2), + result_field="CITIZENSHIP_STATUS", + result_function=validators.oneOf((1, 2, 9)), + ), + ], fields=[ - Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[]), - Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[validators.isAlphaNumeric()]), - Field(item="67", name='FAMILY_AFFILIATION', type='number', startIndex=60, endIndex=61, - required=True, validators=[ - validators.oneOf([1, 2, 4]) - ]), - Field(item="68", name='DATE_OF_BIRTH', type='number', startIndex=61, endIndex=69, - required=True, validators=[ - validators.dateYearIsLargerThan(1998), - validators.dateMonthIsValid(), - ]), - TransformField(transform_func=tanf_ssn_decryption_func, item="69", name='SSN', type='string', startIndex=69, - endIndex=78, required=True, validators=[validators.validateSSN()], - is_encrypted=False), - Field(item="70A", name='RACE_HISPANIC', type='number', startIndex=78, endIndex=79, - required=False, validators=[validators.validateRace()]), - Field(item="70B", name='RACE_AMER_INDIAN', type='number', startIndex=79, endIndex=80, - required=False, validators=[validators.validateRace()]), - Field(item="70C", name='RACE_ASIAN', type='number', startIndex=80, endIndex=81, - required=False, validators=[validators.validateRace()]), - Field(item="70D", name='RACE_BLACK', type='number', startIndex=81, endIndex=82, - required=False, validators=[validators.validateRace()]), - Field(item="70E", name='RACE_HAWAIIAN', type='number', startIndex=82, endIndex=83, - required=False, validators=[validators.validateRace()]), - Field(item="70F", name='RACE_WHITE', type='number', startIndex=83, endIndex=84, - required=False, validators=[validators.validateRace()]), - Field(item="71", name='GENDER', type='number', startIndex=84, endIndex=85, - required=True, validators=[ - validators.isInLimits(0, 9) - ]), - Field(item="72A", name='RECEIVE_NONSSA_BENEFITS', type='number', startIndex=85, endIndex=86, - required=True, validators=[ - validators.oneOf([1, 2]) - ]), - Field(item="72B", name='RECEIVE_SSI', type='number', startIndex=86, endIndex=87, - required=True, validators=[ - validators.oneOf([1, 2]) - ]), - Field(item="73", name='RELATIONSHIP_HOH', type='string', startIndex=87, endIndex=89, - required=False, validators=[ - validators.isInStringRange(0, 10) - ]), - Field(item="74", name='PARENT_MINOR_CHILD', type='number', startIndex=89, endIndex=90, - required=False, validators=[ - validators.oneOf([0, 2, 3]) - ]), - Field(item="75", name='EDUCATION_LEVEL', type='string', startIndex=90, endIndex=92, - required=True, validators=[ - validators.or_validators( - validators.isInStringRange(0, 16), - validators.oneOf(['98', '99']) - ) - ]), - Field(item="76", name='CITIZENSHIP_STATUS', type='number', startIndex=92, endIndex=93, - required=False, validators=[ - validators.oneOf([0, 1, 2, 9]) - ]), - Field(item="77A", name='UNEARNED_SSI', type='string', startIndex=93, endIndex=97, - required=False, validators=[ - validators.isInStringRange(0, 9999) - ]), - Field(item="77B", name='OTHER_UNEARNED_INCOME', type='string', startIndex=97, endIndex=101, - required=False, validators=[ - validators.isInStringRange(0, 9999) - ]), + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="4", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=8, + required=True, + validators=[], + ), + Field( + item="6", + name="CASE_NUMBER", + type="string", + startIndex=8, + endIndex=19, + required=True, + validators=[validators.isAlphaNumeric()], + ), + Field( + item="67", + name="FAMILY_AFFILIATION", + type="number", + startIndex=60, + endIndex=61, + required=True, + validators=[validators.oneOf([1, 2, 4])], + ), + Field( + item="68", + name="DATE_OF_BIRTH", + type="number", + startIndex=61, + endIndex=69, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + TransformField( + transform_func=tanf_ssn_decryption_func, + item="69", + name="SSN", + type="string", + startIndex=69, + endIndex=78, + required=True, + validators=[validators.validateSSN()], + is_encrypted=False, + ), + Field( + item="70A", + name="RACE_HISPANIC", + type="number", + startIndex=78, + endIndex=79, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70B", + name="RACE_AMER_INDIAN", + type="number", + startIndex=79, + endIndex=80, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70C", + name="RACE_ASIAN", + type="number", + startIndex=80, + endIndex=81, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70D", + name="RACE_BLACK", + type="number", + startIndex=81, + endIndex=82, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70E", + name="RACE_HAWAIIAN", + type="number", + startIndex=82, + endIndex=83, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="70F", + name="RACE_WHITE", + type="number", + startIndex=83, + endIndex=84, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="71", + name="GENDER", + type="number", + startIndex=84, + endIndex=85, + required=True, + validators=[validators.isInLimits(0, 9)], + ), + Field( + item="72A", + name="RECEIVE_NONSSA_BENEFITS", + type="number", + startIndex=85, + endIndex=86, + required=True, + validators=[validators.oneOf([1, 2])], + ), + Field( + item="72B", + name="RECEIVE_SSI", + type="number", + startIndex=86, + endIndex=87, + required=True, + validators=[validators.oneOf([1, 2])], + ), + Field( + item="73", + name="RELATIONSHIP_HOH", + type="string", + startIndex=87, + endIndex=89, + required=False, + validators=[validators.isInStringRange(0, 10)], + ), + Field( + item="74", + name="PARENT_MINOR_CHILD", + type="number", + startIndex=89, + endIndex=90, + required=False, + validators=[validators.oneOf([0, 2, 3])], + ), + Field( + item="75", + name="EDUCATION_LEVEL", + type="string", + startIndex=90, + endIndex=92, + required=True, + validators=[ + validators.or_validators( + validators.isInStringRange(0, 16), validators.oneOf(["98", "99"]) + ) + ], + ), + Field( + item="76", + name="CITIZENSHIP_STATUS", + type="number", + startIndex=92, + endIndex=93, + required=False, + validators=[validators.oneOf([0, 1, 2, 9])], + ), + Field( + item="77A", + name="UNEARNED_SSI", + type="string", + startIndex=93, + endIndex=97, + required=False, + validators=[validators.isInStringRange(0, 9999)], + ), + Field( + item="77B", + name="OTHER_UNEARNED_INCOME", + type="string", + startIndex=97, + endIndex=101, + required=False, + validators=[validators.isInStringRange(0, 9999)], + ), ], ) -t3 = SchemaManager( - schemas=[ - child_one, - child_two - ] -) +t3 = SchemaManager(schemas=[child_one, child_two]) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t4.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t4.py index d09aaa0cd..8ba5f7d39 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t4.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t4.py @@ -9,42 +9,139 @@ t4 = SchemaManager( - schemas=[ + schemas=[ RowSchema( - model=TANF_T4, - preparsing_validators=[ - validators.hasLength(71), - ], - postparsing_validators=[], - fields=[ - Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[validators.dateYearIsLargerThan(1998), - validators.dateMonthIsValid()]), - Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[validators.isAlphaNumeric()]), - Field(item="2", name='COUNTY_FIPS_CODE', type='string', startIndex=19, endIndex=22, - required=True, validators=[validators.isInStringRange(1, 999)]), - Field(item="5", name='STRATUM', type='string', startIndex=22, endIndex=24, - required=True, validators=[validators.isInStringRange(0, 99)]), - Field(item="7", name='ZIP_CODE', type='string', startIndex=24, endIndex=29, - required=True, validators=[]), - Field(item="8", name='DISPOSITION', type='number', startIndex=29, endIndex=30, - required=True, validators=[validators.oneOf([1, 2])]), - Field(item="9", name='CLOSURE_REASON', type='string', startIndex=30, endIndex=32, - required=True, validators=[validators.or_validators(validators.isInStringRange(1, 19), - validators.matches("99"))]), - Field(item="10", name='REC_SUB_HOUSING', type='number', startIndex=32, endIndex=33, - required=True, validators=[validators.isInLimits(1, 3)]), - Field(item="11", name='REC_MED_ASSIST', type='number', startIndex=33, endIndex=34, - required=True, validators=[validators.isInLimits(1, 2)]), - Field(item="12", name='REC_FOOD_STAMPS', type='number', startIndex=34, endIndex=35, - required=True, validators=[validators.isInLimits(1, 2)]), - Field(item="13", name='REC_SUB_CC', type='number', startIndex=35, endIndex=36, - required=True, validators=[validators.isInLimits(1, 3)]), - Field(item="14", name='BLANK', type='string', startIndex=36, endIndex=71, required=False, validators=[]), - ], + model=TANF_T4, + preparsing_validators=[ + validators.hasLength(71), + ], + postparsing_validators=[], + fields=[ + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="4", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=8, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + Field( + item="6", + name="CASE_NUMBER", + type="string", + startIndex=8, + endIndex=19, + required=True, + validators=[validators.isAlphaNumeric()], + ), + Field( + item="2", + name="COUNTY_FIPS_CODE", + type="string", + startIndex=19, + endIndex=22, + required=True, + validators=[validators.isInStringRange(1, 999)], + ), + Field( + item="5", + name="STRATUM", + type="string", + startIndex=22, + endIndex=24, + required=True, + validators=[validators.isInStringRange(0, 99)], + ), + Field( + item="7", + name="ZIP_CODE", + type="string", + startIndex=24, + endIndex=29, + required=True, + validators=[], + ), + Field( + item="8", + name="DISPOSITION", + type="number", + startIndex=29, + endIndex=30, + required=True, + validators=[validators.oneOf([1, 2])], + ), + Field( + item="9", + name="CLOSURE_REASON", + type="string", + startIndex=30, + endIndex=32, + required=True, + validators=[ + validators.or_validators( + validators.isInStringRange(1, 19), validators.matches("99") + ) + ], + ), + Field( + item="10", + name="REC_SUB_HOUSING", + type="number", + startIndex=32, + endIndex=33, + required=True, + validators=[validators.isInLimits(1, 3)], + ), + Field( + item="11", + name="REC_MED_ASSIST", + type="number", + startIndex=33, + endIndex=34, + required=True, + validators=[validators.isInLimits(1, 2)], + ), + Field( + item="12", + name="REC_FOOD_STAMPS", + type="number", + startIndex=34, + endIndex=35, + required=True, + validators=[validators.isInLimits(1, 2)], + ), + Field( + item="13", + name="REC_SUB_CC", + type="number", + startIndex=35, + endIndex=36, + required=True, + validators=[validators.isInLimits(1, 3)], + ), + Field( + item="14", + name="BLANK", + type="string", + startIndex=36, + endIndex=71, + required=False, + validators=[], + ), + ], ) - ] - ) + ] +) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py index 43c97225f..90047ec9a 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py @@ -10,135 +10,374 @@ t5 = SchemaManager( - schemas=[ + schemas=[ RowSchema( - model=TANF_T5, - preparsing_validators=[ - validators.hasLength(71), - ], - postparsing_validators=[ - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='SSN', result_function=validators.validateSSN() - ), - validators.validate__FAM_AFF__SSN(), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_HISPANIC', result_function=validators.isInLimits(1, 2) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_AMER_INDIAN', result_function=validators.isInLimits(1, 2) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_ASIAN', result_function=validators.isInLimits(1, 2) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_BLACK', result_function=validators.isInLimits(1, 2) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_HAWAIIAN', result_function=validators.isInLimits(1, 2) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='RACE_WHITE', result_function=validators.isInLimits(1, 2) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='MARITAL_STATUS', result_function=validators.isInLimits(1, 5) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 2), - result_field='PARENT_MINOR_CHILD', result_function=validators.isInLimits(1, 3) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), - result_field='EDUCATION_LEVEL', result_function=validators.or_validators( - validators.isInStringRange(1, 16), - validators.isInStringRange(98, 99) - ) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='CITIZENSHIP_STATUS', result_function=validators.isInLimits(1, 2) - ), - validators.validate__FAM_AFF__HOH__Count_Fed_Time(), - validators.if_then_validator( - condition_field='DATE_OF_BIRTH', condition_function=validators.olderThan(18), - result_field='REC_OASDI_INSURANCE', result_function=validators.isInLimits(1, 2) - ), - validators.if_then_validator( - condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), - result_field='REC_FEDERAL_DISABILITY', result_function=validators.isInLimits(1, 2) - ), - ], - fields=[ - Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="4", name='RPT_MONTH_YEAR', type='number', startIndex=2, endIndex=8, - required=True, validators=[validators.dateYearIsLargerThan(1998), - validators.dateMonthIsValid()]), - Field(item="6", name='CASE_NUMBER', type='string', startIndex=8, endIndex=19, - required=True, validators=[validators.isAlphaNumeric()]), - Field(item="14", name='FAMILY_AFFILIATION', type='number', startIndex=19, endIndex=20, - required=True, validators=[validators.isInLimits(1, 5)]), - Field(item="15", name='DATE_OF_BIRTH', type='number', startIndex=20, endIndex=28, - required=True, validators=[validators.isLargerThan(0)]), - TransformField(transform_func=tanf_ssn_decryption_func, item="16", name='SSN', type='string', - startIndex=28, endIndex=37, required=True, validators=[validators.isNumber()], - is_encrypted=False), - Field(item="17A", name='RACE_HISPANIC', type='number', startIndex=37, endIndex=38, - required=True, validators=[validators.validateRace()]), - Field(item="17B", name='RACE_AMER_INDIAN', type='number', startIndex=38, endIndex=39, - required=True, validators=[validators.validateRace()]), - Field(item="17C", name='RACE_ASIAN', type='number', startIndex=39, endIndex=40, - required=True, validators=[validators.validateRace()]), - Field(item="17D", name='RACE_BLACK', type='number', startIndex=40, endIndex=41, - required=True, validators=[validators.validateRace()]), - Field(item="17E", name='RACE_HAWAIIAN', type='number', startIndex=41, endIndex=42, - required=True, validators=[validators.validateRace()]), - Field(item="17F", name='RACE_WHITE', type='number', startIndex=42, endIndex=43, - required=True, validators=[validators.validateRace()]), - Field(item="18", name='GENDER', type='number', startIndex=43, endIndex=44, - required=True, validators=[validators.isInLimits(0, 9)]), - Field(item="19A", name='REC_OASDI_INSURANCE', type='number', startIndex=44, endIndex=45, - required=True, validators=[validators.isInLimits(0, 2)]), - Field(item="19B", name='REC_FEDERAL_DISABILITY', type='number', startIndex=45, endIndex=46, - required=True, validators=[validators.isInLimits(1, 2)]), - Field(item="19C", name='REC_AID_TOTALLY_DISABLED', type='number', startIndex=46, endIndex=47, - required=True, validators=[validators.isInLimits(0, 2)]), - Field(item="19D", name='REC_AID_AGED_BLIND', type='number', startIndex=47, endIndex=48, - required=True, validators=[validators.isInLimits(0, 2)]), - Field(item="19E", name='REC_SSI', type='number', startIndex=48, endIndex=49, - required=True, validators=[validators.isInLimits(1, 2)]), - Field(item="20", name='MARITAL_STATUS', type='number', startIndex=49, endIndex=50, - required=True, validators=[validators.isInLimits(0, 5)]), - Field(item="21", name='RELATIONSHIP_HOH', type='string', startIndex=50, endIndex=52, - required=True, validators=[validators.isInStringRange(1, 10)]), - Field(item="22", name='PARENT_MINOR_CHILD', type='number', startIndex=52, endIndex=53, - required=True, validators=[validators.isInLimits(0, 2)]), - Field(item="23", name='NEEDS_OF_PREGNANT_WOMAN', type='number', startIndex=53, endIndex=54, - required=True, validators=[validators.isInLimits(0, 9)]), - Field(item="24", name='EDUCATION_LEVEL', type='string', startIndex=54, endIndex=56, - required=True, validators=[validators.or_validators(validators.isInStringRange(0, 16), - validators.isInStringRange(98, 99))]), - Field(item="25", name='CITIZENSHIP_STATUS', type='number', startIndex=56, endIndex=57, - required=True, validators=[validators.or_validators(validators.isInLimits(0, 2), - validators.matches(9))]), - Field(item="26", name='COUNTABLE_MONTH_FED_TIME', type='string', startIndex=57, endIndex=60, - required=True, validators=[validators.isInStringRange(0, 999)]), - Field(item="27", name='COUNTABLE_MONTHS_STATE_TRIBE', type='string', startIndex=60, endIndex=62, - required=True, validators=[validators.isInStringRange(0, 99)]), - Field(item="28", name='EMPLOYMENT_STATUS', type='number', startIndex=62, endIndex=63, - required=True, validators=[validators.isInLimits(0, 3)]), - Field(item="29", name='AMOUNT_EARNED_INCOME', type='string', startIndex=63, endIndex=67, - required=True, validators=[validators.isInStringRange(0, 9999)]), - Field(item="30", name='AMOUNT_UNEARNED_INCOME', type='string', startIndex=67, endIndex=71, - required=True, validators=[validators.isInStringRange(0, 9999)]), - ], + model=TANF_T5, + preparsing_validators=[ + validators.hasLength(71), + ], + postparsing_validators=[ + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="SSN", + result_function=validators.validateSSN(), + ), + validators.validate__FAM_AFF__SSN(), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_HISPANIC", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_AMER_INDIAN", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_ASIAN", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_BLACK", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_HAWAIIAN", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_WHITE", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="MARITAL_STATUS", + result_function=validators.isInLimits(1, 5), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 2), + result_field="PARENT_MINOR_CHILD", + result_function=validators.isInLimits(1, 3), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="EDUCATION_LEVEL", + result_function=validators.or_validators( + validators.isInStringRange(1, 16), + validators.isInStringRange(98, 99), + ), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="CITIZENSHIP_STATUS", + result_function=validators.isInLimits(1, 2), + ), + validators.validate__FAM_AFF__HOH__Count_Fed_Time(), + validators.if_then_validator( + condition_field="DATE_OF_BIRTH", + condition_function=validators.olderThan(18), + result_field="REC_OASDI_INSURANCE", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="REC_FEDERAL_DISABILITY", + result_function=validators.isInLimits(1, 2), + ), + ], + fields=[ + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="4", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=8, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + Field( + item="6", + name="CASE_NUMBER", + type="string", + startIndex=8, + endIndex=19, + required=True, + validators=[validators.isAlphaNumeric()], + ), + Field( + item="14", + name="FAMILY_AFFILIATION", + type="number", + startIndex=19, + endIndex=20, + required=True, + validators=[validators.isInLimits(1, 5)], + ), + Field( + item="15", + name="DATE_OF_BIRTH", + type="number", + startIndex=20, + endIndex=28, + required=True, + validators=[validators.isLargerThan(0)], + ), + TransformField( + transform_func=tanf_ssn_decryption_func, + item="16", + name="SSN", + type="string", + startIndex=28, + endIndex=37, + required=True, + validators=[validators.isNumber()], + is_encrypted=False, + ), + Field( + item="17A", + name="RACE_HISPANIC", + type="number", + startIndex=37, + endIndex=38, + required=True, + validators=[validators.validateRace()], + ), + Field( + item="17B", + name="RACE_AMER_INDIAN", + type="number", + startIndex=38, + endIndex=39, + required=True, + validators=[validators.validateRace()], + ), + Field( + item="17C", + name="RACE_ASIAN", + type="number", + startIndex=39, + endIndex=40, + required=True, + validators=[validators.validateRace()], + ), + Field( + item="17D", + name="RACE_BLACK", + type="number", + startIndex=40, + endIndex=41, + required=True, + validators=[validators.validateRace()], + ), + Field( + item="17E", + name="RACE_HAWAIIAN", + type="number", + startIndex=41, + endIndex=42, + required=True, + validators=[validators.validateRace()], + ), + Field( + item="17F", + name="RACE_WHITE", + type="number", + startIndex=42, + endIndex=43, + required=True, + validators=[validators.validateRace()], + ), + Field( + item="18", + name="GENDER", + type="number", + startIndex=43, + endIndex=44, + required=True, + validators=[validators.isInLimits(0, 9)], + ), + Field( + item="19A", + name="REC_OASDI_INSURANCE", + type="number", + startIndex=44, + endIndex=45, + required=True, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="19B", + name="REC_FEDERAL_DISABILITY", + type="number", + startIndex=45, + endIndex=46, + required=True, + validators=[validators.isInLimits(1, 2)], + ), + Field( + item="19C", + name="REC_AID_TOTALLY_DISABLED", + type="number", + startIndex=46, + endIndex=47, + required=True, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="19D", + name="REC_AID_AGED_BLIND", + type="number", + startIndex=47, + endIndex=48, + required=True, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="19E", + name="REC_SSI", + type="number", + startIndex=48, + endIndex=49, + required=True, + validators=[validators.isInLimits(1, 2)], + ), + Field( + item="20", + name="MARITAL_STATUS", + type="number", + startIndex=49, + endIndex=50, + required=True, + validators=[validators.isInLimits(0, 5)], + ), + Field( + item="21", + name="RELATIONSHIP_HOH", + type="string", + startIndex=50, + endIndex=52, + required=True, + validators=[validators.isInStringRange(1, 10)], + ), + Field( + item="22", + name="PARENT_MINOR_CHILD", + type="number", + startIndex=52, + endIndex=53, + required=True, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="23", + name="NEEDS_OF_PREGNANT_WOMAN", + type="number", + startIndex=53, + endIndex=54, + required=True, + validators=[validators.isInLimits(0, 9)], + ), + Field( + item="24", + name="EDUCATION_LEVEL", + type="string", + startIndex=54, + endIndex=56, + required=True, + validators=[ + validators.or_validators( + validators.isInStringRange(0, 16), + validators.isInStringRange(98, 99), + ) + ], + ), + Field( + item="25", + name="CITIZENSHIP_STATUS", + type="number", + startIndex=56, + endIndex=57, + required=True, + validators=[ + validators.or_validators( + validators.isInLimits(0, 2), validators.matches(9) + ) + ], + ), + Field( + item="26", + name="COUNTABLE_MONTH_FED_TIME", + type="string", + startIndex=57, + endIndex=60, + required=True, + validators=[validators.isInStringRange(0, 999)], + ), + Field( + item="27", + name="COUNTABLE_MONTHS_STATE_TRIBE", + type="string", + startIndex=60, + endIndex=62, + required=True, + validators=[validators.isInStringRange(0, 99)], + ), + Field( + item="28", + name="EMPLOYMENT_STATUS", + type="number", + startIndex=62, + endIndex=63, + required=True, + validators=[validators.isInLimits(0, 3)], + ), + Field( + item="29", + name="AMOUNT_EARNED_INCOME", + type="string", + startIndex=63, + endIndex=67, + required=True, + validators=[validators.isInStringRange(0, 9999)], + ), + Field( + item="30", + name="AMOUNT_UNEARNED_INCOME", + type="string", + startIndex=67, + endIndex=71, + required=True, + validators=[validators.isInStringRange(0, 9999)], + ), + ], ) - ] + ] ) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t6.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t6.py index 8140322c2..c99db03e0 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t6.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t6.py @@ -16,48 +16,183 @@ ], postparsing_validators=[ validators.sumIsEqual("NUM_APPLICATIONS", ["NUM_APPROVED", "NUM_DENIED"]), - validators.sumIsEqual("NUM_FAMILIES", ["NUM_2_PARENTS", "NUM_1_PARENTS", "NUM_NO_PARENTS"]), - validators.sumIsEqual("NUM_RECIPIENTS", ["NUM_ADULT_RECIPIENTS", "NUM_CHILD_RECIPIENTS"]), + validators.sumIsEqual( + "NUM_FAMILIES", ["NUM_2_PARENTS", "NUM_1_PARENTS", "NUM_NO_PARENTS"] + ), + validators.sumIsEqual( + "NUM_RECIPIENTS", ["NUM_ADULT_RECIPIENTS", "NUM_CHILD_RECIPIENTS"] + ), ], fields=[ - Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="3", name='CALENDAR_QUARTER', type='number', startIndex=2, endIndex=7, - required=True, validators=[validators.dateYearIsLargerThan(1998), - validators.quarterIsValid()]), - TransformField(calendar_quarter_to_rpt_month_year(0), item="4", name='RPT_MONTH_YEAR', type='number', - startIndex=2, endIndex=7, required=True, validators=[validators.dateYearIsLargerThan(1998), - validators.dateMonthIsValid()]), - Field(item="4A", name='NUM_APPLICATIONS', type='number', startIndex=7, endIndex=15, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="5A", name='NUM_APPROVED', type='number', startIndex=31, endIndex=39, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="6A", name='NUM_DENIED', type='number', startIndex=55, endIndex=63, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="7A", name='ASSISTANCE', type='number', startIndex=79, endIndex=91, - required=True, validators=[validators.isInLimits(0, 999999999999)]), - Field(item="8A", name='NUM_FAMILIES', type='number', startIndex=115, endIndex=123, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="9A", name='NUM_2_PARENTS', type='number', startIndex=139, endIndex=147, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="10A", name='NUM_1_PARENTS', type='number', startIndex=163, endIndex=171, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="11A", name='NUM_NO_PARENTS', type='number', startIndex=187, endIndex=195, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="12A", name='NUM_RECIPIENTS', type='number', startIndex=211, endIndex=219, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="13A", name='NUM_ADULT_RECIPIENTS', type='number', startIndex=235, endIndex=243, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="14A", name='NUM_CHILD_RECIPIENTS', type='number', startIndex=259, endIndex=267, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="15A", name='NUM_NONCUSTODIALS', type='number', startIndex=283, endIndex=291, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="16A", name='NUM_BIRTHS', type='number', startIndex=307, endIndex=315, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="17A", name='NUM_OUTWEDLOCK_BIRTHS', type='number', startIndex=331, endIndex=339, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="18A", name='NUM_CLOSED_CASES', type='number', startIndex=355, endIndex=363, - required=True, validators=[validators.isInLimits(0, 99999999)]), + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="3", + name="CALENDAR_QUARTER", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.quarterIsValid(), + ], + ), + TransformField( + calendar_quarter_to_rpt_month_year(0), + item="4", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + Field( + item="4A", + name="NUM_APPLICATIONS", + type="number", + startIndex=7, + endIndex=15, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="5A", + name="NUM_APPROVED", + type="number", + startIndex=31, + endIndex=39, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="6A", + name="NUM_DENIED", + type="number", + startIndex=55, + endIndex=63, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="7A", + name="ASSISTANCE", + type="number", + startIndex=79, + endIndex=91, + required=True, + validators=[validators.isInLimits(0, 999999999999)], + ), + Field( + item="8A", + name="NUM_FAMILIES", + type="number", + startIndex=115, + endIndex=123, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="9A", + name="NUM_2_PARENTS", + type="number", + startIndex=139, + endIndex=147, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="10A", + name="NUM_1_PARENTS", + type="number", + startIndex=163, + endIndex=171, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="11A", + name="NUM_NO_PARENTS", + type="number", + startIndex=187, + endIndex=195, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="12A", + name="NUM_RECIPIENTS", + type="number", + startIndex=211, + endIndex=219, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="13A", + name="NUM_ADULT_RECIPIENTS", + type="number", + startIndex=235, + endIndex=243, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="14A", + name="NUM_CHILD_RECIPIENTS", + type="number", + startIndex=259, + endIndex=267, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="15A", + name="NUM_NONCUSTODIALS", + type="number", + startIndex=283, + endIndex=291, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="16A", + name="NUM_BIRTHS", + type="number", + startIndex=307, + endIndex=315, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="17A", + name="NUM_OUTWEDLOCK_BIRTHS", + type="number", + startIndex=331, + endIndex=339, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="18A", + name="NUM_CLOSED_CASES", + type="number", + startIndex=355, + endIndex=363, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), ], ) @@ -68,46 +203,177 @@ ], postparsing_validators=[ validators.sumIsEqual("NUM_APPLICATIONS", ["NUM_APPROVED", "NUM_DENIED"]), - validators.sumIsEqual("NUM_FAMILIES", ["NUM_2_PARENTS", "NUM_1_PARENTS", "NUM_NO_PARENTS"]), - validators.sumIsEqual("NUM_RECIPIENTS", ["NUM_ADULT_RECIPIENTS", "NUM_CHILD_RECIPIENTS"]), + validators.sumIsEqual( + "NUM_FAMILIES", ["NUM_2_PARENTS", "NUM_1_PARENTS", "NUM_NO_PARENTS"] + ), + validators.sumIsEqual( + "NUM_RECIPIENTS", ["NUM_ADULT_RECIPIENTS", "NUM_CHILD_RECIPIENTS"] + ), ], fields=[ - Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="3", name='CALENDAR_QUARTER', type='number', startIndex=2, endIndex=7, - required=True, validators=[]), - TransformField(calendar_quarter_to_rpt_month_year(1), item="4", name='RPT_MONTH_YEAR', type='number', - startIndex=2, endIndex=7, required=True, validators=[]), - Field(item="4B", name='NUM_APPLICATIONS', type='number', startIndex=15, endIndex=23, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="5B", name='NUM_APPROVED', type='number', startIndex=39, endIndex=47, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="6B", name='NUM_DENIED', type='number', startIndex=63, endIndex=71, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="7B", name='ASSISTANCE', type='number', startIndex=91, endIndex=103, - required=True, validators=[validators.isInLimits(0, 999999999999)]), - Field(item="8B", name='NUM_FAMILIES', type='number', startIndex=123, endIndex=131, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="9B", name='NUM_2_PARENTS', type='number', startIndex=147, endIndex=155, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="10B", name='NUM_1_PARENTS', type='number', startIndex=171, endIndex=179, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="11B", name='NUM_NO_PARENTS', type='number', startIndex=195, endIndex=203, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="12B", name='NUM_RECIPIENTS', type='number', startIndex=219, endIndex=227, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="13B", name='NUM_ADULT_RECIPIENTS', type='number', startIndex=243, endIndex=251, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="14B", name='NUM_CHILD_RECIPIENTS', type='number', startIndex=267, endIndex=275, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="15B", name='NUM_NONCUSTODIALS', type='number', startIndex=291, endIndex=299, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="16B", name='NUM_BIRTHS', type='number', startIndex=315, endIndex=323, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="17B", name='NUM_OUTWEDLOCK_BIRTHS', type='number', startIndex=339, endIndex=347, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="18B", name='NUM_CLOSED_CASES', type='number', startIndex=363, endIndex=371, - required=True, validators=[validators.isInLimits(0, 99999999)]), + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="3", + name="CALENDAR_QUARTER", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[], + ), + TransformField( + calendar_quarter_to_rpt_month_year(1), + item="4", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[], + ), + Field( + item="4B", + name="NUM_APPLICATIONS", + type="number", + startIndex=15, + endIndex=23, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="5B", + name="NUM_APPROVED", + type="number", + startIndex=39, + endIndex=47, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="6B", + name="NUM_DENIED", + type="number", + startIndex=63, + endIndex=71, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="7B", + name="ASSISTANCE", + type="number", + startIndex=91, + endIndex=103, + required=True, + validators=[validators.isInLimits(0, 999999999999)], + ), + Field( + item="8B", + name="NUM_FAMILIES", + type="number", + startIndex=123, + endIndex=131, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="9B", + name="NUM_2_PARENTS", + type="number", + startIndex=147, + endIndex=155, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="10B", + name="NUM_1_PARENTS", + type="number", + startIndex=171, + endIndex=179, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="11B", + name="NUM_NO_PARENTS", + type="number", + startIndex=195, + endIndex=203, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="12B", + name="NUM_RECIPIENTS", + type="number", + startIndex=219, + endIndex=227, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="13B", + name="NUM_ADULT_RECIPIENTS", + type="number", + startIndex=243, + endIndex=251, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="14B", + name="NUM_CHILD_RECIPIENTS", + type="number", + startIndex=267, + endIndex=275, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="15B", + name="NUM_NONCUSTODIALS", + type="number", + startIndex=291, + endIndex=299, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="16B", + name="NUM_BIRTHS", + type="number", + startIndex=315, + endIndex=323, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="17B", + name="NUM_OUTWEDLOCK_BIRTHS", + type="number", + startIndex=339, + endIndex=347, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="18B", + name="NUM_CLOSED_CASES", + type="number", + startIndex=363, + endIndex=371, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), ], ) @@ -118,54 +384,179 @@ ], postparsing_validators=[ validators.sumIsEqual("NUM_APPLICATIONS", ["NUM_APPROVED", "NUM_DENIED"]), - validators.sumIsEqual("NUM_FAMILIES", ["NUM_2_PARENTS", "NUM_1_PARENTS", "NUM_NO_PARENTS"]), - validators.sumIsEqual("NUM_RECIPIENTS", ["NUM_ADULT_RECIPIENTS", "NUM_CHILD_RECIPIENTS"]), + validators.sumIsEqual( + "NUM_FAMILIES", ["NUM_2_PARENTS", "NUM_1_PARENTS", "NUM_NO_PARENTS"] + ), + validators.sumIsEqual( + "NUM_RECIPIENTS", ["NUM_ADULT_RECIPIENTS", "NUM_CHILD_RECIPIENTS"] + ), ], fields=[ - Field(item="0", name='RecordType', type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="3", name='CALENDAR_QUARTER', type='number', startIndex=2, endIndex=7, - required=True, validators=[]), - TransformField(calendar_quarter_to_rpt_month_year(2), item="4", name='RPT_MONTH_YEAR', type='number', - startIndex=2, endIndex=7, required=True, validators=[]), - Field(item="4C", name='NUM_APPLICATIONS', type='number', startIndex=23, endIndex=31, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="5C", name='NUM_APPROVED', type='number', startIndex=47, endIndex=55, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="6C", name='NUM_DENIED', type='number', startIndex=71, endIndex=79, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="7C", name='ASSISTANCE', type='number', startIndex=103, endIndex=115, - required=True, validators=[validators.isInLimits(0, 999999999999)]), - Field(item="8C", name='NUM_FAMILIES', type='number', startIndex=131, endIndex=139, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="9C", name='NUM_2_PARENTS', type='number', startIndex=155, endIndex=163, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="10C", name='NUM_1_PARENTS', type='number', startIndex=179, endIndex=187, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="11C", name='NUM_NO_PARENTS', type='number', startIndex=203, endIndex=211, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="12C", name='NUM_RECIPIENTS', type='number', startIndex=227, endIndex=235, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="13C", name='NUM_ADULT_RECIPIENTS', type='number', startIndex=251, endIndex=259, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="14C", name='NUM_CHILD_RECIPIENTS', type='number', startIndex=275, endIndex=283, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="15C", name='NUM_NONCUSTODIALS', type='number', startIndex=299, endIndex=307, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="16C", name='NUM_BIRTHS', type='number', startIndex=323, endIndex=331, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="17C", name='NUM_OUTWEDLOCK_BIRTHS', type='number', startIndex=347, endIndex=355, - required=True, validators=[validators.isInLimits(0, 99999999)]), - Field(item="18C", name='NUM_CLOSED_CASES', type='number', startIndex=371, endIndex=379, - required=True, validators=[validators.isInLimits(0, 99999999)]), + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="3", + name="CALENDAR_QUARTER", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[], + ), + TransformField( + calendar_quarter_to_rpt_month_year(2), + item="4", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[], + ), + Field( + item="4C", + name="NUM_APPLICATIONS", + type="number", + startIndex=23, + endIndex=31, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="5C", + name="NUM_APPROVED", + type="number", + startIndex=47, + endIndex=55, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="6C", + name="NUM_DENIED", + type="number", + startIndex=71, + endIndex=79, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="7C", + name="ASSISTANCE", + type="number", + startIndex=103, + endIndex=115, + required=True, + validators=[validators.isInLimits(0, 999999999999)], + ), + Field( + item="8C", + name="NUM_FAMILIES", + type="number", + startIndex=131, + endIndex=139, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="9C", + name="NUM_2_PARENTS", + type="number", + startIndex=155, + endIndex=163, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="10C", + name="NUM_1_PARENTS", + type="number", + startIndex=179, + endIndex=187, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="11C", + name="NUM_NO_PARENTS", + type="number", + startIndex=203, + endIndex=211, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="12C", + name="NUM_RECIPIENTS", + type="number", + startIndex=227, + endIndex=235, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="13C", + name="NUM_ADULT_RECIPIENTS", + type="number", + startIndex=251, + endIndex=259, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="14C", + name="NUM_CHILD_RECIPIENTS", + type="number", + startIndex=275, + endIndex=283, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="15C", + name="NUM_NONCUSTODIALS", + type="number", + startIndex=299, + endIndex=307, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="16C", + name="NUM_BIRTHS", + type="number", + startIndex=323, + endIndex=331, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="17C", + name="NUM_OUTWEDLOCK_BIRTHS", + type="number", + startIndex=347, + endIndex=355, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), + Field( + item="18C", + name="NUM_CLOSED_CASES", + type="number", + startIndex=371, + endIndex=379, + required=True, + validators=[validators.isInLimits(0, 99999999)], + ), ], ) -t6 = SchemaManager( - schemas=[ - s1, - s2, - s3 - ] - ) +t6 = SchemaManager(schemas=[s1, s2, s3]) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py index 2fcb4e0fd..199f4e525 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py @@ -15,45 +15,83 @@ families_index = 10 for i in range(1, 31): month_index = (i - 1) % 3 - sub_item_labels = ['A', 'B', 'C'] + sub_item_labels = ["A", "B", "C"] families_value_item_number = f"6{sub_item_labels[month_index]}" schemas.append( - RowSchema( - model=TANF_T7, - quiet_preparser_errors=i > 1, - preparsing_validators=[ - validators.notEmpty(0, 7), - validators.notEmpty(validator_index, validator_index + 24), - ], - postparsing_validators=[], - fields=[ - Field(item="0", name="RecordType", type='string', startIndex=0, endIndex=2, - required=True, validators=[]), - Field(item="3", name='CALENDAR_QUARTER', type='number', startIndex=2, endIndex=7, - required=True, validators=[validators.dateYearIsLargerThan(1998), - validators.quarterIsValid()]), - TransformField( - transform_func=calendar_quarter_to_rpt_month_year(month_index), - item="3A", - name='RPT_MONTH_YEAR', - type='number', - startIndex=2, - endIndex=7, - required=True, - validators=[ - validators.dateYearIsLargerThan(1998), - validators.dateMonthIsValid() - ] - ), - Field(item="4", name='TDRS_SECTION_IND', type='string', startIndex=section_ind_index, - endIndex=section_ind_index + 1, required=True, validators=[validators.oneOf(['1', '2'])]), - Field(item="5", name='STRATUM', type='string', startIndex=stratum_index, - endIndex=stratum_index + 2, required=True, validators=[validators.isInStringRange(1, 99)]), - Field(item=families_value_item_number, name='FAMILIES_MONTH', type='number', startIndex=families_index, - endIndex=families_index + 7, required=True, validators=[validators.isInLimits(0, 9999999)]), - ] - ) + RowSchema( + model=TANF_T7, + quiet_preparser_errors=i > 1, + preparsing_validators=[ + validators.hasLength(247), + validators.notEmpty(0, 7), + validators.notEmpty(validator_index, validator_index + 24), + ], + postparsing_validators=[], + fields=[ + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="3", + name="CALENDAR_QUARTER", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.quarterIsValid(), + ], + ), + TransformField( + transform_func=calendar_quarter_to_rpt_month_year(month_index), + item="3A", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=7, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + Field( + item="4", + name="TDRS_SECTION_IND", + type="string", + startIndex=section_ind_index, + endIndex=section_ind_index + 1, + required=True, + validators=[validators.oneOf(["1", "2"])], + ), + Field( + item="5", + name="STRATUM", + type="string", + startIndex=stratum_index, + endIndex=stratum_index + 2, + required=True, + validators=[validators.isInStringRange(1, 99)], + ), + Field( + item=families_value_item_number, + name="FAMILIES_MONTH", + type="number", + startIndex=families_index, + endIndex=families_index + 7, + required=True, + validators=[validators.isInLimits(0, 9999999)], + ), + ], + ) ) index_offset = 0 if i % 3 != 0 else 24 diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/trailer.py b/tdrs-backend/tdpservice/parsers/schema_defs/trailer.py index 46a440508..d1ad29da7 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/trailer.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/trailer.py @@ -11,20 +11,38 @@ preparsing_validators=[ validators.hasLength( 23, - lambda value, length: f'Trailer length is {len(value)} but must be {length} characters.' + lambda value, length: f"Trailer length is {len(value)} but must be {length} characters.", ), - validators.startsWith('TRAILER') + validators.startsWith("TRAILER"), ], postparsing_validators=[], fields=[ - Field(item="1", name='title', type='string', startIndex=0, endIndex=7, required=True, validators=[ - validators.matches('TRAILER') - ]), - Field(item="2", name='record_count', type='number', startIndex=7, endIndex=14, required=True, validators=[ - validators.between(0, 9999999) - ]), - Field(item="-1", name='blank', type='string', startIndex=14, endIndex=23, required=False, validators=[ - validators.matches(' ') - ]), + Field( + item="1", + name="title", + type="string", + startIndex=0, + endIndex=7, + required=True, + validators=[validators.matches("TRAILER")], + ), + Field( + item="2", + name="record_count", + type="number", + startIndex=7, + endIndex=14, + required=True, + validators=[validators.between(0, 9999999)], + ), + Field( + item="-1", + name="blank", + type="string", + startIndex=14, + endIndex=23, + required=False, + validators=[validators.matches(" ")], + ), ], ) diff --git a/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM4.MS24 b/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM4.MS24 new file mode 100644 index 000000000..1393729b8 --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM4.MS24 @@ -0,0 +1,3 @@ +HEADER20184S24 SSP1 N +M720184101000176900013100001111102000074800007670000768103001335200139310014077200000120200011890001229 +TRAILER0000001 diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index 764de2990..305a0a721 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -5,7 +5,7 @@ from .. import parse from ..models import ParserError, ParserErrorCategoryChoices, DataFileSummary from tdpservice.search_indexes.models.tanf import TANF_T1, TANF_T2, TANF_T3, TANF_T4, TANF_T5, TANF_T6, TANF_T7 -from tdpservice.search_indexes.models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M6 +from tdpservice.search_indexes.models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M6, SSP_M7 from .factories import DataFileSummaryFactory from tdpservice.data_files.models import DataFile from .. import schema_defs, util @@ -909,6 +909,23 @@ def test_parse_tanf_section4_file(tanf_section4_file): assert first.FAMILIES_MONTH == 274 assert sixth.FAMILIES_MONTH == 499 +@pytest.fixture +def ssp_section4_file(stt_user, stt): + """Fixture for ADS.E2J.NDM4.MS24.""" + return util.create_test_datafile('ADS.E2J.NDM4.MS24', stt_user, stt, "SSP Stratum Data") + +@pytest.mark.django_db() +def test_parse_ssp_section4_file(ssp_section4_file): + """Test parsing SSP Section 4 submission.""" + parse.parse_datafile(ssp_section4_file) + + m7_objs = SSP_M7.objects.all().order_by('FAMILIES_MONTH') + + assert m7_objs.count() == 12 + + first = m7_objs.first() + assert first.RPT_MONTH_YEAR == 201810 + assert first.FAMILIES_MONTH == 748 @pytest.fixture def ssp_section3_file(stt_user, stt): diff --git a/tdrs-backend/tdpservice/parsers/util.py b/tdrs-backend/tdpservice/parsers/util.py index 6c7e4020a..3ee209607 100644 --- a/tdrs-backend/tdpservice/parsers/util.py +++ b/tdrs-backend/tdpservice/parsers/util.py @@ -161,8 +161,8 @@ def get_schema_options(program, section, query=None, model=None, model_name=None 'C': { 'section': DataFile.Section.SSP_CLOSED_CASE_DATA, 'models': { - # 'S4': schema_defs.ssp.m4, - # 'S5': schema_defs.ssp.m5, + # 'M4': schema_defs.ssp.m4, + # 'M5': schema_defs.ssp.m5, } }, 'G': { @@ -174,7 +174,7 @@ def get_schema_options(program, section, query=None, model=None, model_name=None 'S': { 'section': DataFile.Section.SSP_STRATUM_DATA, 'models': { - # 'S7': schema_defs.ssp.m7, + 'M7': schema_defs.ssp.m7, } } }, diff --git a/tdrs-backend/tdpservice/search_indexes/admin/__init__.py b/tdrs-backend/tdpservice/search_indexes/admin/__init__.py index 19ad02979..f9b99f7d9 100644 --- a/tdrs-backend/tdpservice/search_indexes/admin/__init__.py +++ b/tdrs-backend/tdpservice/search_indexes/admin/__init__.py @@ -14,3 +14,4 @@ admin.site.register(models.ssp.SSP_M2, ssp.SSP_M2Admin) admin.site.register(models.ssp.SSP_M3, ssp.SSP_M3Admin) admin.site.register(models.ssp.SSP_M6, ssp.SSP_M6Admin) +admin.site.register(models.ssp.SSP_M7, ssp.SSP_M7Admin) diff --git a/tdrs-backend/tdpservice/search_indexes/admin/ssp.py b/tdrs-backend/tdpservice/search_indexes/admin/ssp.py index d8e2088af..97112628d 100644 --- a/tdrs-backend/tdpservice/search_indexes/admin/ssp.py +++ b/tdrs-backend/tdpservice/search_indexes/admin/ssp.py @@ -55,7 +55,6 @@ class SSP_M3Admin(admin.ModelAdmin): 'RPT_MONTH_YEAR', ] - class SSP_M6Admin(admin.ModelAdmin): """ModelAdmin class for parsed M6 data files.""" @@ -71,3 +70,22 @@ class SSP_M6Admin(admin.ModelAdmin): CreationDateFilter, 'RPT_MONTH_YEAR' ] + +class SSP_M7Admin(admin.ModelAdmin): + """ModelAdmin class for parsed M7 data files.""" + + list_display = [ + 'RecordType', + 'CALENDAR_QUARTER', + 'RPT_MONTH_YEAR', + 'TDRS_SECTION_IND', + 'STRATUM', + 'FAMILIES_MONTH', + 'datafile', + ] + + list_filter = [ + 'CALENDAR_QUARTER', + CreationDateFilter, + 'RPT_MONTH_YEAR', + ] diff --git a/tdrs-backend/tdpservice/search_indexes/documents/ssp.py b/tdrs-backend/tdpservice/search_indexes/documents/ssp.py index d047acd0d..1f571101f 100644 --- a/tdrs-backend/tdpservice/search_indexes/documents/ssp.py +++ b/tdrs-backend/tdpservice/search_indexes/documents/ssp.py @@ -2,7 +2,7 @@ from django_elasticsearch_dsl import Document from django_elasticsearch_dsl.registries import registry -from ..models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M6 +from ..models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M6, SSP_M7 from .document_base import DocumentBase @@ -200,7 +200,6 @@ class Django: 'OTHER_UNEARNED_INCOME', ] - @registry.register_document class SSP_M6DataSubmissionDocument(DocumentBase, Document): """Elastic search model mapping for a parsed SSP M6 data file.""" @@ -233,3 +232,29 @@ class Django: 'AMT_ASSISTANCE', 'CLOSED_CASES', ] + +@registry.register_document +class SSP_M7DataSubmissionDocument(DocumentBase, Document): + """Elastic search model mapping for a parsed SSP M7 data file.""" + + class Index: + """ElasticSearch index generation settings.""" + + name = 'ssp_m7_submissions' + settings = { + 'number_of_shards': 1, + 'number_of_replicas': 0, + } + + class Django: + """Django model reference and field mapping.""" + + model = SSP_M7 + fields = [ + "RecordType", + "CALENDAR_QUARTER", + "RPT_MONTH_YEAR", + "TDRS_SECTION_IND", + "STRATUM", + "FAMILIES_MONTH", + ] diff --git a/tdrs-backend/tdpservice/search_indexes/migrations/0021_ssp_m7.py b/tdrs-backend/tdpservice/search_indexes/migrations/0021_ssp_m7.py new file mode 100644 index 000000000..acfaf91ad --- /dev/null +++ b/tdrs-backend/tdpservice/search_indexes/migrations/0021_ssp_m7.py @@ -0,0 +1,29 @@ +# Generated by Django 3.2.15 on 2023-10-19 14:24 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('data_files', '0012_datafile_s3_versioning_id'), + ('search_indexes', '0019_ssp_m6'), + ] + + operations = [ + migrations.CreateModel( + name='SSP_M7', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('RecordType', models.CharField(max_length=156, null=True)), + ('CALENDAR_QUARTER', models.IntegerField(blank=True, null=True)), + ('RPT_MONTH_YEAR', models.IntegerField(null=True)), + ('TDRS_SECTION_IND', models.CharField(max_length=1, null=True)), + ('STRATUM', models.CharField(max_length=2, null=True)), + ('FAMILIES_MONTH', models.IntegerField(null=True)), + ('datafile', models.ForeignKey(blank=True, help_text='The parent file from which this record was created.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='m7_parent', to='data_files.datafile')), + ], + ), + ] diff --git a/tdrs-backend/tdpservice/search_indexes/models/ssp.py b/tdrs-backend/tdpservice/search_indexes/models/ssp.py index 05c599c39..f362fb374 100644 --- a/tdrs-backend/tdpservice/search_indexes/models/ssp.py +++ b/tdrs-backend/tdpservice/search_indexes/models/ssp.py @@ -2,9 +2,7 @@ import uuid from django.db import models -from django.contrib.contenttypes.fields import GenericRelation from tdpservice.data_files.models import DataFile -from tdpservice.parsers.models import ParserError class SSP_M1(models.Model): @@ -24,7 +22,6 @@ class SSP_M1(models.Model): related_name='m1_parent' ) - error = GenericRelation(ParserError) RecordType = models.CharField(max_length=156, null=True, blank=False) RPT_MONTH_YEAR = models.IntegerField(null=True, blank=False) CASE_NUMBER = models.CharField(max_length=11, null=True, blank=False) @@ -36,9 +33,7 @@ class SSP_M1(models.Model): ) STRATUM = models.CharField(max_length=2, null=True, blank=False) ZIP_CODE = models.CharField(max_length=5, null=True, blank=False) - # FUNDING_STREAM = models.IntegerField(null=True, blank=False) DISPOSITION = models.IntegerField(null=True, blank=False) - # NEW_APPLICANT = models.IntegerField(null=True, blank=False) NBR_FAMILY_MEMBERS = models.IntegerField(null=True, blank=False) FAMILY_TYPE = models.IntegerField(null=True, blank=False) TANF_ASST_IN_6MONTHS = models.IntegerField(null=True, blank=False) @@ -74,8 +69,6 @@ class SSP_M1(models.Model): REDUCTIONS_ON_RECEIPTS = models.IntegerField(null=True, blank=False) OTHER_NON_SANCTION = models.IntegerField(null=True, blank=False) WAIVER_EVAL_CONTROL_GRPS = models.IntegerField(null=True, blank=False) - # FAMILY_EXEMPT_TIME_LIMITS = models.IntegerField(null=True, blank=False) - # FAMILY_NEW_CHILD = models.IntegerField(null=True, blank=False) class SSP_M2(models.Model): @@ -95,7 +88,6 @@ class SSP_M2(models.Model): related_name='m2_parent' ) - error = GenericRelation(ParserError) RecordType = models.CharField(max_length=156, null=True, blank=False) RPT_MONTH_YEAR = models.IntegerField(null=True, blank=False) CASE_NUMBER = models.CharField(max_length=11, null=True, blank=False) @@ -124,9 +116,6 @@ class SSP_M2(models.Model): EDUCATION_LEVEL = models.IntegerField(null=True, blank=False) CITIZENSHIP_STATUS = models.IntegerField(null=True, blank=False) COOPERATION_CHILD_SUPPORT = models.IntegerField(null=True, blank=False) - # months_fed_time_limit = models.FloatField(null=True, blank=False) - # months_state_time_limit = models.FloatField(null=True, blank=False) - # current_month_state_exempt = models.IntegerField(null=True, blank=False) EMPLOYMENT_STATUS = models.IntegerField(null=True, blank=False) WORK_ELIGIBLE_INDICATOR = models.IntegerField(null=True, blank=False) WORK_PART_STATUS = models.IntegerField(null=True, blank=False) @@ -186,7 +175,6 @@ class SSP_M3(models.Model): related_name='m3_parent' ) - error = GenericRelation(ParserError) RecordType = models.CharField(max_length=156, null=True, blank=False) RPT_MONTH_YEAR = models.IntegerField(null=True, blank=False) CASE_NUMBER = models.CharField(max_length=11, null=True, blank=False) @@ -211,7 +199,6 @@ class SSP_M3(models.Model): UNEARNED_SSI = models.IntegerField(null=True, blank=False) OTHER_UNEARNED_INCOME = models.IntegerField(null=True, blank=False) - class SSP_M6(models.Model): """ Parsed record representing an M6 data submission. @@ -243,3 +230,31 @@ class SSP_M6(models.Model): NONCUSTODIALS = models.IntegerField(null=True, blank=True) AMT_ASSISTANCE = models.IntegerField(null=True, blank=True) CLOSED_CASES = models.IntegerField(null=True, blank=True) + +class SSP_M7(models.Model): + """ + Parsed record representing an SSP M3 data submission. + + Mapped to an elastic search index. + """ + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + datafile = models.ForeignKey( + DataFile, + blank=True, + help_text='The parent file from which this record was created.', + null=True, + on_delete=models.CASCADE, + related_name='m7_parent' + ) + + RecordType = models.CharField(max_length=156, null=True, blank=False) + CALENDAR_QUARTER = models.IntegerField(null=True, blank=True) + RPT_MONTH_YEAR = models.IntegerField(null=True, blank=False) + TDRS_SECTION_IND = models.CharField( + max_length=1, + null=True, + blank=False + ) + STRATUM = models.CharField(max_length=2, null=True, blank=False) + FAMILIES_MONTH = models.IntegerField(null=True, blank=False) diff --git a/tdrs-backend/tdpservice/search_indexes/models/tanf.py b/tdrs-backend/tdpservice/search_indexes/models/tanf.py index 9e31fffe2..f6ba10f29 100644 --- a/tdrs-backend/tdpservice/search_indexes/models/tanf.py +++ b/tdrs-backend/tdpservice/search_indexes/models/tanf.py @@ -2,9 +2,7 @@ import uuid from django.db import models -from django.contrib.contenttypes.fields import GenericRelation from tdpservice.data_files.models import DataFile -from tdpservice.parsers.models import ParserError class TANF_T1(models.Model): @@ -24,7 +22,6 @@ class TANF_T1(models.Model): related_name='t1_parent' ) - error = GenericRelation(ParserError) RecordType = models.CharField(max_length=156, null=True, blank=False) RPT_MONTH_YEAR = models.IntegerField(null=True, blank=False) CASE_NUMBER = models.CharField(max_length=11, null=True, blank=False) diff --git a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py index 15581d304..8386c5d48 100644 --- a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py +++ b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py @@ -350,9 +350,7 @@ def test_can_create_and_index_tanf_t7_submission(test_datafile): submission.CALENDAR_QUARTER = 1 submission.TDRS_SECTION_IND = '1' submission.STRATUM = '01' - submission.FAMILIES_MONTH_1 = 47655 - submission.FAMILIES_MONTH_2 = 81982 - submission.FAMILIES_MONTH_3 = 9999999 + submission.FAMILIES_MONTH = 47655 submission.save() @@ -579,7 +577,6 @@ def test_can_create_and_index_ssp_m3_submission(): assert response.hits.total.value == 1 - @pytest.mark.django_db def test_can_create_and_index_ssp_m6_submission(test_datafile): """SSP M6 submissions can be created and mapped.""" @@ -617,3 +614,30 @@ def test_can_create_and_index_ssp_m6_submission(test_datafile): response = search.execute() assert response.hits.total.value == 1 + +@pytest.mark.django_db +def test_can_create_and_index_ssp_m7_submission(test_datafile): + """SSP M7 submissions can be created and mapped.""" + record_num = fake.uuid4() + + submission = models.ssp.SSP_M7() + submission.datafile = test_datafile + submission.RecordType = record_num + submission.CALENDAR_YEAR = 2020 + submission.CALENDAR_QUARTER = 1 + submission.TDRS_SECTION_IND = '1' + submission.STRATUM = '01' + submission.FAMILIES_MONTH = 47655 + + submission.save() + + # No checks her because m7 records can't be parsed currently. + assert submission.id is not None + + search = documents.ssp.SSP_M7DataSubmissionDocument.search().query( + 'match', + RecordType=record_num + ) + response = search.execute() + + assert response.hits.total.value == 1 diff --git a/tdrs-backend/tdpservice/users/test/test_permissions.py b/tdrs-backend/tdpservice/users/test/test_permissions.py index d942fd0c8..404fdd9ae 100644 --- a/tdrs-backend/tdpservice/users/test/test_permissions.py +++ b/tdrs-backend/tdpservice/users/test/test_permissions.py @@ -126,6 +126,9 @@ def test_ofa_system_admin_permissions(ofa_system_admin): 'search_indexes.add_ssp_m6', 'search_indexes.view_ssp_m6', 'search_indexes.change_ssp_m6', + 'search_indexes.add_ssp_m7', + 'search_indexes.view_ssp_m7', + 'search_indexes.change_ssp_m7', } group_permissions = ofa_system_admin.get_group_permissions() assert group_permissions == expected_permissions From bd31881802f6483cf4173e1a74e1f0eba6dc54c7 Mon Sep 17 00:00:00 2001 From: Eric Lipe <125676261+elipe17@users.noreply.github.com> Date: Wed, 22 Nov 2023 12:50:38 -0700 Subject: [PATCH 45/49] SSP Section 2 Parsing & Validation (#2724) * - Added m4 and m5 - Added cat 2 validators * - Quick correction to preparse validator * - Updated item numbers - Added cat3 validators * - Adding datafile * - updated datafile to allow correct parsing of m4 records - added tests * - Fix lint errors * - Update permissions test * - Fixed failing unit test * - Adding order_by to keep consistent results * - Fixed obj ordering issue - Skipping super big file * - Added missing validator * - Updated import paths * - Updated DOB fields to make a little more sense * - Pre-emptively marking required false to prepare for merge * - Fix lint * - Formatting with Black * update m4/m5 validators * isInLimits -> matches (duh) * - Deconflicting migrations * - Fixing test * - Adding missing fixture * - Resolving migration name conflicts * - Fixing dependency * - Keeping consistent dependencies * - Linearizing deps --------- Co-authored-by: Jan Timpe Co-authored-by: jtimpe <111305129+jtimpe@users.noreply.github.com> --- tdrs-backend/tdpservice/parsers/parse.py | 2 +- .../parsers/schema_defs/ssp/__init__.py | 4 + .../tdpservice/parsers/schema_defs/ssp/m1.py | 8 +- .../tdpservice/parsers/schema_defs/ssp/m2.py | 10 +- .../tdpservice/parsers/schema_defs/ssp/m3.py | 10 +- .../tdpservice/parsers/schema_defs/ssp/m4.py | 146 + .../tdpservice/parsers/schema_defs/ssp/m5.py | 367 + .../tdpservice/parsers/schema_defs/tanf/t1.py | 8 +- .../tdpservice/parsers/schema_defs/tanf/t2.py | 13 +- .../tdpservice/parsers/schema_defs/tanf/t3.py | 14 +- .../tdpservice/parsers/schema_defs/tanf/t4.py | 8 +- .../tdpservice/parsers/schema_defs/tanf/t5.py | 15 +- .../tdpservice/parsers/schema_defs/tanf/t6.py | 10 +- .../tdpservice/parsers/schema_defs/tanf/t7.py | 10 +- .../parsers/test/data/ADS.E2J.NDM2.MS24 | 8943 +++++++++++++++++ .../tdpservice/parsers/test/factories.py | 36 + .../tdpservice/parsers/test/test_parse.py | 29 +- .../parsers/test/test_validators.py | 134 + tdrs-backend/tdpservice/parsers/util.py | 4 +- .../search_indexes/admin/__init__.py | 2 + .../tdpservice/search_indexes/admin/ssp.py | 30 + .../search_indexes/documents/ssp.py | 81 +- .../migrations/0020_ssp_m4_ssp_m5.py | 69 + .../search_indexes/migrations/0021_ssp_m7.py | 2 +- .../tdpservice/search_indexes/models/ssp.py | 80 + .../search_indexes/test/test_model_mapping.py | 80 + .../tdpservice/users/test/test_permissions.py | 6 + 27 files changed, 10063 insertions(+), 58 deletions(-) create mode 100644 tdrs-backend/tdpservice/parsers/schema_defs/ssp/m4.py create mode 100644 tdrs-backend/tdpservice/parsers/schema_defs/ssp/m5.py create mode 100644 tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM2.MS24 create mode 100644 tdrs-backend/tdpservice/search_indexes/migrations/0020_ssp_m4_ssp_m5.py diff --git a/tdrs-backend/tdpservice/parsers/parse.py b/tdrs-backend/tdpservice/parsers/parse.py index ac65dce5e..7b5177e74 100644 --- a/tdrs-backend/tdpservice/parsers/parse.py +++ b/tdrs-backend/tdpservice/parsers/parse.py @@ -240,7 +240,7 @@ def manager_parse_line(line, schema_manager, generate_error, is_encrypted=False) records = schema_manager.parse_and_validate(line, generate_error) return records except AttributeError as e: - logging.error(e) + logger.error(e) return [(None, False, [ generate_error( schema=None, diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py index 31a2f6d6d..ad448eef7 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/__init__.py @@ -1,11 +1,15 @@ from .m1 import m1 from .m2 import m2 from .m3 import m3 +from .m4 import m4 +from .m5 import m5 from .m6 import m6 from .m7 import m7 m1 = m1 m2 = m2 m3 = m3 +m4 = m4 +m5 = m5 m6 = m6 m7 = m7 diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py index 8f9d94697..5a3506194 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m1.py @@ -1,10 +1,10 @@ """Schema for SSP M1 record type.""" -from ...util import SchemaManager -from ...fields import Field -from ...row_schema import RowSchema -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.fields import Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators from tdpservice.search_indexes.models.ssp import SSP_M1 m1 = SchemaManager( diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py index b45ccdf2c..7636e45a5 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m2.py @@ -1,11 +1,11 @@ """Schema for SSP M1 record type.""" -from ...util import SchemaManager -from ...transforms import ssp_ssn_decryption_func -from ...fields import TransformField, Field -from ...row_schema import RowSchema -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.transforms import ssp_ssn_decryption_func +from tdpservice.parsers.fields import TransformField, Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators from tdpservice.search_indexes.models.ssp import SSP_M2 diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py index beb975e58..8ac92f061 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m3.py @@ -1,11 +1,11 @@ """Schema for SSP M1 record type.""" -from ...util import SchemaManager -from ...transforms import ssp_ssn_decryption_func -from ...fields import TransformField, Field -from ...row_schema import RowSchema -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.transforms import ssp_ssn_decryption_func +from tdpservice.parsers.fields import TransformField, Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators from tdpservice.search_indexes.models.ssp import SSP_M3 first_part_schema = RowSchema( diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m4.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m4.py new file mode 100644 index 000000000..e23a279aa --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m4.py @@ -0,0 +1,146 @@ +"""Schema for SSP M1 record type.""" + + +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.fields import Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators +from tdpservice.search_indexes.models.ssp import SSP_M4 + +m4 = SchemaManager( + schemas=[ + RowSchema( + model=SSP_M4, + preparsing_validators=[ + validators.hasLength(66), + ], + postparsing_validators=[], + fields=[ + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="3", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=8, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + Field( + item="5", + name="CASE_NUMBER", + type="string", + startIndex=8, + endIndex=19, + required=True, + validators=[validators.isAlphaNumeric()], + ), + Field( + item="2", + name="COUNTY_FIPS_CODE", + type="string", + startIndex=19, + endIndex=22, + required=True, + validators=[validators.isInStringRange(0, 999)], + ), + Field( + item="4", + name="STRATUM", + type="string", + startIndex=22, + endIndex=24, + required=False, + validators=[validators.isInStringRange(0, 99)], + ), + Field( + item="6", + name="ZIP_CODE", + type="string", + startIndex=24, + endIndex=29, + required=True, + validators=[validators.isInStringRange(0, 99999)], + ), + Field( + item="7", + name="DISPOSITION", + type="number", + startIndex=29, + endIndex=30, + required=True, + validators=[validators.matches(1)], + ), + Field( + item="8", + name="CLOSURE_REASON", + type="string", + startIndex=30, + endIndex=32, + required=True, + validators=[ + validators.or_validators( + validators.isInStringRange(1, 19), validators.matches("99") + ) + ], + ), + Field( + item="9", + name="REC_SUB_HOUSING", + type="number", + startIndex=32, + endIndex=33, + required=True, + validators=[validators.isInLimits(1, 2)], + ), + Field( + item="10`", + name="REC_MED_ASSIST", + type="number", + startIndex=33, + endIndex=34, + required=True, + validators=[validators.isInLimits(1, 2)], + ), + Field( + item="11", + name="REC_FOOD_STAMPS", + type="number", + startIndex=34, + endIndex=35, + required=True, + validators=[validators.isInLimits(1, 2)], + ), + Field( + item="12", + name="REC_SUB_CC", + type="number", + startIndex=35, + endIndex=36, + required=True, + validators=[validators.isInLimits(1, 2)], + ), + Field( + item="-1", + name="BLANK", + type="string", + startIndex=36, + endIndex=66, + required=False, + validators=[], + ), + ], + ) + ] +) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m5.py b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m5.py new file mode 100644 index 000000000..98c2b6f83 --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/schema_defs/ssp/m5.py @@ -0,0 +1,367 @@ +"""Schema for SSP M1 record type.""" + + +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.transforms import ssp_ssn_decryption_func +from tdpservice.parsers.fields import TransformField, Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators +from tdpservice.search_indexes.models.ssp import SSP_M5 + + +m5 = SchemaManager( + schemas=[ + RowSchema( + model=SSP_M5, + preparsing_validators=[ + validators.hasLength(66), + ], + postparsing_validators=[ + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="SSN", + result_function=validators.validateSSN(), + ), + validators.validate__FAM_AFF__SSN(), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_HISPANIC", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_AMER_INDIAN", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_ASIAN", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_BLACK", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_HAWAIIAN", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="RACE_WHITE", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="MARITAL_STATUS", + result_function=validators.isInLimits(1, 5), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 2), + result_field="PARENT_MINOR_CHILD", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.isInLimits(1, 3), + result_field="EDUCATION_LEVEL", + result_function=validators.or_validators( + validators.isInStringRange(1, 16), + validators.isInStringRange(98, 99), + ), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="CITIZENSHIP_STATUS", + result_function=validators.isInLimits(1, 3), + ), + validators.if_then_validator( + condition_field="DATE_OF_BIRTH", + condition_function=validators.olderThan(18), + result_field="REC_OASDI_INSURANCE", + result_function=validators.isInLimits(1, 2), + ), + validators.if_then_validator( + condition_field="FAMILY_AFFILIATION", + condition_function=validators.matches(1), + result_field="REC_FEDERAL_DISABILITY", + result_function=validators.isInLimits(1, 2), + ), + ], + fields=[ + Field( + item="0", + name="RecordType", + type="string", + startIndex=0, + endIndex=2, + required=True, + validators=[], + ), + Field( + item="3", + name="RPT_MONTH_YEAR", + type="number", + startIndex=2, + endIndex=8, + required=True, + validators=[ + validators.dateYearIsLargerThan(1998), + validators.dateMonthIsValid(), + ], + ), + Field( + item="5", + name="CASE_NUMBER", + type="string", + startIndex=8, + endIndex=19, + required=True, + validators=[validators.isAlphaNumeric()], + ), + Field( + item="13", + name="FAMILY_AFFILIATION", + type="number", + startIndex=19, + endIndex=20, + required=True, + validators=[validators.isInLimits(1, 5)], + ), + Field( + item="14", + name="DATE_OF_BIRTH", + type="string", + startIndex=20, + endIndex=28, + required=True, + validators=[ + validators.dateYearIsLargerThan(1900), + validators.dateMonthIsValid(), + ], + ), + TransformField( + transform_func=ssp_ssn_decryption_func, + item="15", + name="SSN", + type="string", + startIndex=28, + endIndex=37, + required=True, + validators=[validators.validateSSN()], + is_encrypted=False, + ), + Field( + item="16A", + name="RACE_HISPANIC", + type="number", + startIndex=37, + endIndex=38, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="16B", + name="RACE_AMER_INDIAN", + type="number", + startIndex=38, + endIndex=39, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="16C", + name="RACE_ASIAN", + type="number", + startIndex=39, + endIndex=40, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="16D", + name="RACE_BLACK", + type="number", + startIndex=40, + endIndex=41, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="16E", + name="RACE_HAWAIIAN", + type="number", + startIndex=41, + endIndex=42, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="16F", + name="RACE_WHITE", + type="number", + startIndex=42, + endIndex=43, + required=False, + validators=[validators.validateRace()], + ), + Field( + item="17", + name="GENDER", + type="number", + startIndex=43, + endIndex=44, + required=True, + validators=[validators.isInLimits(0, 9)], + ), + Field( + item="18A", + name="REC_OASDI_INSURANCE", + type="number", + startIndex=44, + endIndex=45, + required=True, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="18B", + name="REC_FEDERAL_DISABILITY", + type="number", + startIndex=45, + endIndex=46, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="18C", + name="REC_AID_TOTALLY_DISABLED", + type="number", + startIndex=46, + endIndex=47, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="18D", + name="REC_AID_AGED_BLIND", + type="number", + startIndex=47, + endIndex=48, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="18E", + name="REC_SSI", + type="number", + startIndex=48, + endIndex=49, + required=True, + validators=[validators.isInLimits(1, 2)], + ), + Field( + item="19", + name="MARITAL_STATUS", + type="number", + startIndex=49, + endIndex=50, + required=False, + validators=[validators.isInLimits(0, 5)], + ), + Field( + item="20", + name="RELATIONSHIP_HOH", + type="string", + startIndex=50, + endIndex=52, + required=True, + validators=[validators.isInStringRange(1, 10)], + ), + Field( + item="21", + name="PARENT_MINOR_CHILD", + type="number", + startIndex=52, + endIndex=53, + required=False, + validators=[validators.isInLimits(0, 2)], + ), + Field( + item="22", + name="NEEDS_OF_PREGNANT_WOMAN", + type="number", + startIndex=53, + endIndex=54, + required=False, + validators=[validators.isInLimits(0, 9)], + ), + Field( + item="23", + name="EDUCATION_LEVEL", + type="string", + startIndex=54, + endIndex=56, + required=False, + validators=[ + validators.or_validators( + validators.isInStringRange(0, 16), + validators.isInStringRange(98, 99), + ) + ], + ), + Field( + item="24", + name="CITIZENSHIP_STATUS", + type="number", + startIndex=56, + endIndex=57, + required=False, + validators=[ + validators.or_validators( + validators.isInLimits(0, 3), validators.matches(9) + ) + ], + ), + Field( + item="25", + name="EMPLOYMENT_STATUS", + type="number", + startIndex=57, + endIndex=58, + required=False, + validators=[validators.isInLimits(0, 3)], + ), + Field( + item="26", + name="AMOUNT_EARNED_INCOME", + type="string", + startIndex=58, + endIndex=62, + required=False, + validators=[validators.isInStringRange(0, 9999)], + ), + Field( + item="27", + name="AMOUNT_UNEARNED_INCOME", + type="string", + startIndex=62, + endIndex=66, + required=False, + validators=[validators.isInStringRange(0, 9999)], + ), + ], + ) + ] +) diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py index 4718db68e..fa7e4cef9 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t1.py @@ -1,9 +1,9 @@ """Schema for t1 record types.""" -from ...util import SchemaManager -from ...fields import Field -from ...row_schema import RowSchema -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.fields import Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators from tdpservice.search_indexes.models.tanf import TANF_T1 diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py index 89cc794d8..82d42be72 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t2.py @@ -1,11 +1,11 @@ """Schema for HEADER row of all submission types.""" -from ...util import SchemaManager -from ...transforms import tanf_ssn_decryption_func -from ...fields import TransformField, Field -from ...row_schema import RowSchema -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.transforms import tanf_ssn_decryption_func +from tdpservice.parsers.fields import TransformField, Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators from tdpservice.search_indexes.models.tanf import TANF_T2 @@ -180,7 +180,8 @@ endIndex=29, required=True, validators=[ - validators.isLargerThan(0), + validators.dateYearIsLargerThan(1900), + validators.dateMonthIsValid(), ], ), TransformField( diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py index 787828473..1ffe8b90c 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t3.py @@ -1,11 +1,11 @@ """Schema for HEADER row of all submission types.""" -from ...util import SchemaManager -from ...transforms import tanf_ssn_decryption_func -from ...fields import TransformField, Field -from ...row_schema import RowSchema -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.transforms import tanf_ssn_decryption_func +from tdpservice.parsers.fields import TransformField, Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators from tdpservice.search_indexes.models.tanf import TANF_T3 @@ -133,7 +133,7 @@ endIndex=28, required=True, validators=[ - validators.dateYearIsLargerThan(1998), + validators.dateYearIsLargerThan(1950), validators.dateMonthIsValid(), ], ), @@ -416,7 +416,7 @@ endIndex=69, required=True, validators=[ - validators.dateYearIsLargerThan(1998), + validators.dateYearIsLargerThan(1950), validators.dateMonthIsValid(), ], ), diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t4.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t4.py index 8ba5f7d39..8b7fec0bd 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t4.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t4.py @@ -1,10 +1,10 @@ """Schema for HEADER row of all submission types.""" -from ...util import SchemaManager -from ...fields import Field -from ...row_schema import RowSchema -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.fields import Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators from tdpservice.search_indexes.models.tanf import TANF_T4 diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py index 90047ec9a..75eaea400 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t5.py @@ -1,11 +1,11 @@ """Schema for HEADER row of all submission types.""" -from ...util import SchemaManager -from ...transforms import tanf_ssn_decryption_func -from ...fields import TransformField, Field -from ...row_schema import RowSchema -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.transforms import tanf_ssn_decryption_func +from tdpservice.parsers.fields import TransformField, Field +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators from tdpservice.search_indexes.models.tanf import TANF_T5 @@ -148,7 +148,10 @@ startIndex=20, endIndex=28, required=True, - validators=[validators.isLargerThan(0)], + validators=[ + validators.dateYearIsLargerThan(1900), + validators.dateMonthIsValid(), + ], ), TransformField( transform_func=tanf_ssn_decryption_func, diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t6.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t6.py index c99db03e0..46b0f0a95 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t6.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t6.py @@ -1,11 +1,11 @@ """Schema for HEADER row of all submission types.""" -from ...util import SchemaManager -from ...transforms import calendar_quarter_to_rpt_month_year -from ...fields import Field, TransformField -from ...row_schema import RowSchema -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.transforms import calendar_quarter_to_rpt_month_year +from tdpservice.parsers.fields import Field, TransformField +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers import validators from tdpservice.search_indexes.models.tanf import TANF_T6 diff --git a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py index 199f4e525..ec09891b5 100644 --- a/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py +++ b/tdrs-backend/tdpservice/parsers/schema_defs/tanf/t7.py @@ -1,10 +1,10 @@ """Schema for TANF T7 Row.""" -from ...util import SchemaManager -from ...fields import Field, TransformField -from ...row_schema import RowSchema -from ...transforms import calendar_quarter_to_rpt_month_year -from ... import validators +from tdpservice.parsers.util import SchemaManager +from tdpservice.parsers.fields import Field, TransformField +from tdpservice.parsers.row_schema import RowSchema +from tdpservice.parsers.transforms import calendar_quarter_to_rpt_month_year +from tdpservice.parsers import validators from tdpservice.search_indexes.models.tanf import TANF_T7 schemas = [] diff --git a/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM2.MS24 b/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM2.MS24 new file mode 100644 index 000000000..54051bd5d --- /dev/null +++ b/tdrs-backend/tdpservice/parsers/test/data/ADS.E2J.NDM2.MS24 @@ -0,0 +1,8943 @@ +HEADER20184C24 SSP1EU +M42018101111111116120000406911161113 +M520181011111111161119791106WTTTY0ZB922212222222210112111112970000 +M520181011111111161120150623WTTTYT#0W222122222222 0422981 0000 +M520181011111111161120090507WTTTP0#WP222122122222 0422021 0000 +M42018101111111116720600401981991113 +M520181011111111167119830512WTTT00BTB12222112222210212121112430000 +M520181011111111167119810726WTTT#0#9Y12222222222220112111127770000 +M520181011111111167120130123WTTT0#0B@222222122222 0422981 0000 +M520181011111111167120090106WTTTP0#WB122221122222 0422031 0000 +M520181011111111167120020126WTTTP9@PT122222222222 0422101 0000 +M42018101111111117121100401551162113 +M520181011111111171119940626WTTTY9##012222122222210112121100000000 +M520181011111111171120170623WTTT#9PTP122222222222 0422981 0000 +M520181011111111171120120121WTTTY9YBT122221222222 0422981 0000 +M42018101111111117722400400881163113 +M520181011111111177119810119WTTT###WZ22222122222220212111200000000 +M520181011111111177119680701WTTTP0PYZ222221122222201121112####0000 +M520181011111111177120170802WTTTP#@9P222222122222 0422981 0000 +M520181011111111177120100701WTTTP#@WW222221222222 0422021 0000 +M520181011111111177120051119WTTTPZYZ@222221222222 0422061 0000 +M520181011111111177120040616WTTTYBP0P222221222222 0422081 0000 +M42018101111111123320000405551162113 +M520181011111111233120000101WTTTYZWBB22222122222210112131119910000 +M520181011111111233120040126WTTTPP#0@222122222222 0422081 0000 +M42018101111111123921100401181163113 +M520181011111111239119820619WTTTYTTYZ12222222222220112161104680000 +M520181011111111239120150115WTTT#WTBB122221122222 0422981 0000 +M520181011111111239120110603WTTTPYZPB122222222222 0422011 0000 +M42018101111111146020600405471163113 +M520181011111111460119940801WTTTP0BW#22212222222210112081118080000 +M520181011111111460120140626WTTTYPB90222122222222 0422981 0000 +M42018101111111154920600400871162113 +M520181011111111549119830619WTTTPYW@012222222222250112121116060000 +M520181011111111549120050503WTTT#WPZ#122222122222 0422071 0000 +M520181011111111549120030115WTTTYP9WB122222122222 0422091 0130 +M42018101111111157421100406001162113 +M520181011111111574119900802WTTTYPYB#12222222222210112121125500000 +M520181011111111574120150106WTTTYP0#9122222122222 0422981 0000 +M520181011111111574120070114WTTTYYP09122222122222 0422041 0000 +M42018101111111233620500402421162113 +M520181011111112336119721101WTTTBT99Y22222122222210112121113400000 +M520181011111112336120140808WTTT#YWW#222221222222 0422981 0000 +M42018101111111254020600405171163113 +M520181011111112540119850102WTTT0P#YP12222222222210112131123870000 +M520181011111112540120121106WTTTPP@#0122222122222 0422981 0000 +M520181011111112540120080526WTTTY@BYB122221222222 0422041 0000 +M42018101111111261521100406391163113 +M520181011111112615119810114WTTTP#WW012222222222210112112120240000 +M520181011111112615120100602WTTTPWYB9122222222222 0422022 0000 +M42018101111111263821700402341163113 +M520181011111112638119820601WTTT0YWB912222222222250112111115600000 +M520181011111112638120080506WTTT#@BB#222222222221 0422031 0780 +M520181011111112638120041126WTTTYP@@Y122222222221 0422071 0780 +M42018101111111337120600401421163113 +M520181011111113371119980712WTTTPW00022222122222210412121111730000 +M520181011111113371120150115WTTTPT9YP222122122222 0622981 0000 +M42018101111111338722700400681992113 +M520181011111113387119990126WTTT#WBZT12222222222210112121117520000 +M520181011111113387120170102WTTT#T@YY122221222222 0422981 0000 +M42018101111111371320000402891163113 +M520181011111113713119770112WTTT0WT0#22222122222210112121114300000 +M520181011111113713120100815WTTT0WBZ9222221122222 0422021 0000 +M42018101111111374820000404041161113 +M520181011111113748119860626WTTT#WZYW22222122222210112081117550000 +M520181011111113748120120501WTTT00PYW222221222222 0422981 0000 +M520181011111113748120110102WTTT#@#PB222221122222 0422011 0000 +M520181011111113748120080615WTTTP##PY222222122222 0422041 0000 +M42018101111111378722400402111163113 +M520181011111113787219830601WTTT#9@PT22222122222220212113200000000 +M520181011111113787119750518WTTT#W0YP22222112222220112111114300000 +M520181011111113787120150706WTTT00B@Z222222222222 0422981 0000 +M520181011111113787120130702WTTTPPT@0222221122222 0422981 0000 +M42018101111111386021100406541161113 +M520181011111113860119930115WTTT#ZTWP22212122222210112121118270000 +M520181011111113860120111115WTTTPZ#TZ212121222222 0422981 0000 +M42018101111111434320000401371163113 +M520181011111114343119850121WTTT#9YW#22222122222230112121119010000 +M520181011111114343120130808WTTTP@TB0222221122222 0422981 0000 +M520181011111114343120100802WTTT#W#B@222221122222 0422021 0000 +M520181011111114343120031119WTTT#9BT9222221122222 0422081 0000 +M42018101111111434621400403481163113 +M520181011111114346119840523WTTTP@W0Z22222122222210112121120380000 +M520181011111114346120160722WTTT#Y00T222221122222 0422981 0000 +M520181011111114346120051119WTTTY9BTP222221222222 0422061 0000 +M520181011111114346120020702WTTTYTWYW222221222222 0422101 0000 +M42018101111111468521400400351163113 +M520181011111114685119960606WTTTYW0Y022212222222210112111110400000 +M520181011111114685120150502WTTT#PTB@222122222222 0422981 0000 +M42018101111111475321700405821163113 +M520181011111114753119900101WTTTPW@9W12222222222210112111130140000 +M520181011111114753120121106WTTT#@WYP122221222222 0422981 0000 +M520181011111114753120090601WTTTPT9ZP122222122222 0422031 0000 +M520181011111114753120060108WTTTPT0TP122222222222 0422061 0000 +M42018101111111489522700403941161113 +M520181011111114895119930507WTTT0B0W022222122222210112081126000000 +M520181011111114895120130119WTTTY0ZY9122221122222 0422981 0000 +M42018101111111493320900406421162113 +M520181011111114933119810101WTTTYBT0T12212222222210112112117080000 +M520181011111114933120170101WTTTY#Y9#122222122222 0422981 0000 +M520181011111114933120120606WTTTP0WTT122122222222 0422981 0000 +M42018101111111497621100405971013113 +M520181011111114976119780621WTTT#Y9@T12222222222230112111136870000 +M520181011111114976120160602WTTT#YY##122221122222 0422981 0000 +M520181011111114976120070603WTTT#990Z122222122222 0422051 0000 +M520181011111114976120030115WTTTY#W#W122222222222 0422091 0000 +M42018101111111510021100406001163113 +M520181011111115100119920106WTTT#Z0@W12222222222220112111100000000 +M520181011111115100120110802WTTT0#@P#122222222222 0422011 0000 +M42018101111111527422400400121163113 +M520181011111115274119861101WTTT0TWYW22212212222210112121115990000 +M520181011111115274120110115WTTTYYTZW222222122222 0422011 0000 +M520181011111115274120060102WTTT09PYB222222122222 0422051 0000 +M42018101111111533320900402921163113 +M520181011111115333119770612WTTT0W0Z912222222222250112111121670000 +M520181011111115333120140119WTTTYP@@0122222222222 0422981 0000 +M520181011111115333120120519WTTT0TBP@222222122222 0422981 0000 +M520181011111115333120110119WTTTP@@ZT222222122222 0422011 0000 +M520181011111115333120020115WTTT#ZBY0222222122222 0422091 0000 +M42018101111111533922700402221013113 +M520181011111115339119860601WTTT#ZP@B22222122222220112111123910000 +M520181011111115339120101106WTTTPY9P#222221122222 0422011 0200 +M520181011111115339120070718WTTTPWB#Y222221122222 0422051 0200 +M42018101111111543120600401421013113 +M520181011111115431119910515WTTT#@@0012222222222210112121124560000 +M520181011111115431120131101WTTTP9BZP222222122222 0422981 0000 +M42018101111111568920000406951161113 +M520181011111115689119801114WTTT#W0W922212222222210112121127730000 +M520181011111115689120040122WTTTYW9WZ222122222222 0422071 0000 +M520181011111115689120040122WTTT0B9WT222122122222 0422071 0000 +M42018101111111602622700400671161113 +M520181011111116026119820101WTTT0WWW#22222222222210112121117500000 +M520181011111116026120080526WTTT#@WT0222221122222 0422041 0000 +M520181011111116026120020119WTTT0Z#W0222222122222 0422091 0000 +M42018101111111602822700403941163113 +M520181011111116028119910126WTTT0WYP#22222122222210112121114450000 +M520181011111116028120170809WTTTP#99@222222222222 0422981 0000 +M520181011111116028120130116WTTTPWYBW222221222222 0422981 0300 +M42018101111111611521700404101163113 +M520181011111116115119890121WTTT00@W012222222222210112121110200000 +M520181011111116115120140708WTTT#Z0PY222222122222 0422981 0000 +M42018101111111622620900400391163113 +M520181011111116226119830123WTTT##WTZ12222222222210112082111620000 +M520181011111116226120130712WTTTPYYBY122222122222 0422981 0000 +M520181011111116226120110121WTTT0B@TT122222122222 0422981 0000 +M42018101111111632220600401151991113 +M520181011111116322119760607WTTTYTZZT12222122222210112121114980000 +M520181011111116322120060518WTTTYZ#0Z122222122222 0422061 0000 +M520181011111116322120010106WTTT0BT@9122222122222 0422101 0000 +M42018101111111633420500402421163113 +M520181011111116334119860818WTTTPBZ0W12222212222210112981126110000 +M520181011111116334120120819WTTTYYT@Y222221122222 0422981 0000 +M520181011111116334120050718WTTT0B#ZB122222122222 0422071 0000 +M42018101111111657720900400501161113 +M520181011111116577119700718WTTTYWTZY22122222222210112111113850000 +M520181011111116577120120506WTTTYWW@@221222122222 0422981 0000 +M42018101111111684021700401121163113 +M520181011111116840119880119WTTT0PBP922212222222220112111124040000 +M520181011111116840120150815WTTTP#PZP222222122222 0422981 0000 +M520181011111116840120130715WTTTPW00B222222122222 0422981 0000 +M42018101111111708221100401181163113 +M520181011111117082119900103WTTTYYPWZ22222122222210112111113360000 +M520181011111117082120130116WTTT#PBYZ222221222222 0422981 0000 +M520181011111117082120090615WTTT0BZBZ222221222222 0422031 0000 +M42018101111111756321100401181161113 +M520181011111117563119880109WTTTY0Z9#22212222222210112131114890000 +M520181011111117563120130801WTTT0PBB0222122122222 0422981 0000 +M520181011111117563120100726WTTT00BB@222222122222 0422021 0000 +M42018101111111784322700400671163113 +M520181011111117843119760822WTTTYY@@P22212222222210112111123710000 +M520181011111117843120110606WTTT#9Z9Y222122222222 0422011 0000 +M520181011111117843120051115WTTT0BWBZ222122122222 0422061 0000 +M42018101111111788620000403011163113 +M520181011111117886119830701WTTT#@YY#22222222222220212111105200000 +M520181011111117886119760518WTTT0BTYZ22222212222220112111121840000 +M520181011111117886120061107WTTT099TT222222222222 0422051 0000 +M520181011111117886120061107WTTT#BBBZ222222122222 0422051 0000 +M42018101111111798020000403951163113 +M520181011111117980119760719WTTT0TP9P12222222222210112981128050000 +M520181011111117980120031126WTTTYW09#122222122221 0422081 0361 +M42018101111111805921400402181163113 +M520181011111118059119900806WTTT#BPB#22222122222230112111111260000 +M520181011111118059120150619WTTT#Z#PY222221222222 0422981 0250 +M520181011111118059120120623WTTT0YPWT222221222222 0422981 0250 +M42018101111111824721700405291993113 +M520181011111118247119820507WTTT00#9Y22222122222230112131123240000 +M520181011111118247120110701WTTT0BPPT222221122222 0422011 0000 +M520181011111118247120090714WTTTYPBBT222221222221 0422031 0375 +M520181011111118247120031106WTTT0PWWT222221122222 0422081 0000 +M520181011111118247120020523WTTT#B9Z9222221222222 0422101 0000 +M42018101111111841020900406421991113 +M520181011111118410119930121WTTTP#@0022222222222210112111115820000 +M520181011111118410120170601WTTTYTPWB122222122222 0422981 0000 +M520181011111118410120160607WTTTPP0ZB222122222222 0422981 0000 +M42018101111111843222700406761013113 +M520181011111118432119940509WTTTYB#9Z22222122222210112111116200000 +M520181011111118432120160115WTTT#@#BT222221122222 0422981 0000 +M42018101111111847720600401151993113 +M520181011111118477119930816WTTTYBTT912222222222210112121118300000 +M520181011111118477120160716WTTTYW9#T122222122222 0422981 0000 +M520181011111118477120150506WTTTY0#BY122222122222 0422981 0000 +M42018101111111887520600405341991113 +M520181011111118875119930501WTTT#Y9@912222222222250112121113230000 +M520181011111118875120150715WTTT0PBBT122221222222 0422981 0000 +M42018101111111915120600402031993113 +M520181011111119151119940123WTTT#9PZY22222122222210112111112800000 +M520181011111119151120140123WTTTPT@W#222221122222 0422981 0000 +M42018101111111971321100406001163113 +M520181011111119713119731123WTTTY#0TZ12222222222210112121118160000 +M520181011111119713120010508WTTTYTTWZ122222122222 0422101 0000 +M42018101111111981822700403941163113 +M520181011111119818119900601WTTTPP@@T22222122222210112121116170000 +M520181011111119818120150119WTTT0P0#Z222221222222 0422981 0000 +M520181011111119818120140114WTTT0T@9#222121122222 0422981 0000 +M42018101111111982322700403611161113 +M520181011111119823119860721WTTT0#9TZ12222222222210112111100000000 +M520181011111119823120170126WTTTYYT#Z122222222222 0422981 0000 +M520181011111119823120111113WTTT#TB#0122222222222 0422981 0000 +M520181011111119823120080515WTTTP@Z@B122222122222 0422031 0000 +M42018101111111995222400406441163113 +M520181011111119952119840107WTTTY9@T022212222222210112121131260000 +M520181011111119952120150119WTTT#WZ9P222122122222 0422981 0000 +M520181011111119952120100515WTTT0Z9PP222122222222 0422021 0000 +M520181011111119952120040706WTTT0P#TZ222222222222 0422081 0000 +M42018101111112006721400402181163113 +M520181011111120067119950519WTTTPBY9Y22222122222210122121114640000 +M520181011111120067120140816WTTT0YWT#222221222222 0722981 0000 +M42018101111112024720600400871161113 +M520181011111120247119940115WTTTYZBZ#12222222222210112081110100000 +M520181011111120247120170516WTTT0W9TW122222122222 0422981 0000 +M42018101111112030220600404951163113 +M520181011111120302119900715WTTT#0P0W12222222222210112131127280000 +M520181011111120302120150516WTTT#ZPYB222222222222 0422981 0000 +M520181011111120302120130812WTTT0YY@B122222222222 0422981 0000 +M42018101111112047820900403031123113 +M520181011111120478119950513WTTT#WBW#22212222222210112111126930000 +M520181011111120478120140822WTTT#W0YT222122222222 0422981 0000 +M42018101111112053821700405541163113 +M520181011111120538119700602WTTTYY9PT22222122222250112111121330000 +M520181011111120538120050702WTTT#P#9#222222222222 0422071 0000 +M520181011111120538120030802WTTTP#TW0222222122222 0422091 0000 +M42018101111112054220600402981011113 +M520181011111120542119810709WTTT0YB@Y22212222222210112111124870000 +M520181011111120542120130123WTTT099#9222222122222 0422981 0000 +M520181011111120542120120116WTTT00Y#B222222222222 0422981 0000 +M42018101111112062620600400871162113 +M520181011111120626119900516WTTTYT00912222122222210112121129880000 +M520181011111120626120170616WTTT0TTZZ222222122222 0422981 0000 +M520181011111120626120100709WTTTYYWZB122221222222 0422021 0000 +M42018101111112070420000406011163113 +M520181011111120704119800115WTTT#P9YT22222111222210112121111080599 +M520181011111120704120141112WTTT0BTP9222221222222 0422981 0000 +M42018101111112088120000406721162113 +M520181011111120881119970701WTTT#ZZ@012221222222210112111127500000 +M520181011111120881120170618WTTTYP9W@122222122222 0422981 0000 +M42018101111112122621100404791992113 +M520181011111121226119900126WTTT0WT#Z22212222222210112121124260000 +M520181011111121226120170615WTTTY0Y9#222222222222 0422981 0000 +M520181011111121226120111119WTTTP9PBY222121222222 0422981 0000 +M42018101111112124221100401461012113 +M520181011111121242119930521WTTTY9PZW12222222222210112081127220000 +M520181011111121242120150718WTTTY0#@9122222222222 0422981 0000 +M520181011111121242120131101WTTTYYTT#122222222222 0422981 0000 +M42018101111112148721700404101993113 +M520181011111121487119780703WTTTY09P@12222222222220112111200000000 +M520181011111121487119710122WTTT0YPB012222212222210212121238590000 +M520181011111121487120110101WTTT#0#Y#122222122222 0422011 0000 +M520181011111121487120030103WTTT00W@Y122222222222 0422081 0000 +M520181011111121487120000515WTTT#TT0W122222222222 0422111 0000 +M42018101111112149720900403031191113 +M520181011111121497119870102WTTTYZYYW22222222222210112111124330000 +M520181011111121497120091115WTTTPWBW9222221222222 0422021 0100 +M520181011111121497120071101WTTT#P0@W222122122222 0422041 0100 +M42018101111112153722700400441161113 +M520181011111121537119940501WTTTYW9@Z12222122222210112121100000000 +M520181011111121537120130626WTTTP90BT122221122222 0422981 0000 +M520181011111121537120100101WTTT#ZPW0122221122222 0422011 0000 +M42018101111112158920900401031161113 +M520181011111121589119800102WTTTPY0TP22212222222210112121117890000 +M520181011111121589120070112WTTT0BT@Y222122222222 0422041 0000 +M520181011111121589120010506WTTT#@BYT222122122222 0422101 0000 +M42018101111112186120900406421161113 +M520181011111121861119750608WTTT0TZ9Z12222222222250112141131150000 +M520181011111121861120061126WTTT0@B00122222222222 0422051 0000 +M42018101111112193621700405121161113 +M520181011111121936119780801WTTT0PPW#22212222222210112111118200000 +M520181011111121936120090626WTTT#BBYP222122122222 0422031 0000 +M520181011111121936120060613WTTT#WPYT222122222222 0422061 0000 +M520181011111121936120040508WTTTYPP9#222122122222 0422071 0000 +M42018101111112212721700406571163113 +M520181011111122127119870715WTTTP#T9Z22222122222230112111114540000 +M520181011111122127120170606WTTT#Z#BB222221222222 0422981 0250 +M520181011111122127120170606WTTTPT0B0222221122222 0422981 0250 +M42018101111112236321100402161162113 +M520181011111122363119870721WTTTPTBP#22222212222230112111123110000 +M520181011111122363120110619WTTT##WYZ222222222222 0422011 0000 +M520181011111122363120080616WTTTP9TW0222222122222 0422041 0000 +M42018101111112242321400400351162113 +M520181011111122423119850601WTTTP@W9B22222222222220112112115340000 +M520181011111122423120140806WTTT#@#T0122222222222 0422981 0051 +M520181011111122423120070121WTTTBTT#W222222222222 0422052 0051 +M520181011111122423120051123WTTT#TY#Z222122122222 0422062 0051 +M42018101111112257221700406891162113 +M520181011111122572119750723WTTTPTZYY12222222222210112111118650000 +M520181011111122572120090521WTTT0@P9Z122222122222 0422021 0000 +M520181011111122572120060115WTTTYP9WZ222222222222 0422061 0000 +M42018101111112275722700402801163113 +M520181011111122757119790121WTTTBTZ0W12222222222250112121122090000 +M520181011111122757120080806WTTTP9Z#@122222222221 0422041 0677 +M42018111111111155222400400551161113 +M520181111111111552119820118WTTT0B9B#22212222222210112121125650000 +M520181111111111552120170621WTTT#9WB#222122122221 0422981 0864 +M520181111111111552120070719WTTT#0@WY222122222222 0422051 0000 +M42018111111111168820900404431163113 +M520181111111111688119700803WTTT#BY@922222122222230112131127200000 +M520181111111111688120050618WTTT#YTYY222222122222 0422071 0000 +M42018111111111186921400400351163113 +M520181111111111869119870707WTTTY99@922222222222220112082118410000 +M520181111111111869120180102WTTTY900Y222222122222 0422981 0000 +M520181111111111869120160801WTTT0P#B#222122122222 0422981 0000 +M520181111111111869120110507WTTT#PZWY222222122222 0422011 0130 +M520181111111111869120100101WTTT0Y0B#222222122222 0422021 0130 +M42018111111111202620600401421163113 +M520181111111112026119801109WTTT#@@ZB22222122222250112121122770000 +M520181111111112026120040521WTTT#ZTT9222221222222 0422081 0141 +M520181111111112026120010709WTTT#Y0T9222222222222 0422111 0297 +M42018111111111209020600400291163113 +M520181111111112090119810118WTTT0YW0T22222222222220112082120110000 +M520181111111112090120121126WTTTY@Y#P222222122222 0422982 0000 +M520181111111112090120020101WTTT0YP09222222122222 0422102 0000 +M42018111111111210821700405321161113 +M520181111111112108119840521WTTT0T0YP12222222222230112111119680000 +M520181111111112108120140102WTTTY@B9P122222222222 0422981 0000 +M520181111111112108120110619WTTT##TTW122222222222 0422011 0000 +M520181111111112108120080622WTTT0PB@Y122222122222 0422041 0000 +M520181111111112108120030106WTTTPY##T122222122222 0422081 0000 +M42018111111111216221700402341163113 +M520181111111112162119910602WTTT#B@#Y12222222222210112121113910000 +M520181111111112162120120514WTTT00B9@122222222222 0422981 0000 +M520181111111112162120100102WTTTP0#WZ122222122222 0422011 0000 +M42018111111111227021400406791163113 +M520181111111112270119781101WTTT0@ZB#22222122222210112111122970000 +M520181111111112270120010521WTTTPBP9Z222221222222 0422111 0000 +M42018111111111261022700400681991113 +M520181111111112610119750101WTTT#BB@Z12222122222230112111116320000 +M520181111111112610120140706WTTTPW0Z0122221222222 0422981 0000 +M520181111111112610120070721WTTT00BYT122221122222 0422051 0000 +M42018111111111265621100406001163113 +M520181111111112656119830108WTTTPTYTP12222222222210212081117120000 +M520181111111112656119530718WTTT#ZWT012222211222220112121200000358 +M520181111111112656120091101WTTTYW#09122222122222 0422021 0000 +M520181111111112656120060115WTTT0#00P122222222222 0422061 0000 +M520181111111112656120040126WTTT0W9#B222222222222 0422081 0000 +M42018111111111288720900401881161113 +M520181111111112887119770619WTTT0BTBY22212222222210112121112530000 +M520181111111112887120120101WTTTYWBBY222122222222 0422981 0000 +M42018111111111328320900406421161113 +M520181111111113283119860615WTTT00@T@12222222222210112121117160000 +M520181111111113283120130619WTTTYTWBB122222122222 0422981 0000 +M520181111111113283120100713WTTTPT999122222122222 0422021 0000 +M42018111111111333521100406001163113 +M520181111111113335119840626WTTT#0@@P12222222222210112112118070000 +M520181111111113335120060513WTTTPBPTY122222222222 0422061 0000 +M520181111111113335120040121WTTTPYTWW122222122222 0422071 0000 +M42018111111111334522700401931163113 +M520181111111113345119910703WTTTYY@0@22212122222210112111122100000 +M520181111111113345120170123WTTT#0ZBZ222121222222 0422981 0000 +M42018111111111348022700402401163113 +M520181111111113480119930121WTTTP@09Z22222122222210112111120390000 +M520181111111113480120120116WTTTPP00T222221122222 0422981 0075 +M42018111111111359522700405651163113 +M520181111111113595119910606WTTTYYBB922222122222210112121118530000 +M520181111111113595120140121WTTTPZWY@222221222221 0422981 0864 +M42018111111111372621400405841163113 +M520181111111113726119850713WTTT#PWZ@22222122222210112131115120000 +M520181111111113726120070615WTTT0T@YZ222221122222 0422051 0000 +M42018111111111383020000401401162113 +M520181111111113830119870126WTTT0YP#922212222222210112121122460000 +M520181111111113830120170116WTTTP#T0#222122222222 0422981 0000 +M520181111111113830120080126WTTTY9BBT222122122222 0422031 0000 +M42018111111111405821700402381161113 +M520181111111114058119820706WTTTPT0BY22222122222220112111129140000 +M520181111111114058120060522WTTTP@B9#222221222222 0422061 0000 +M520181111111114058120040119WTTTYP@Y9222221122222 0422071 0000 +M520181111111114058120020621WTTTPWY0W222221122222 0422101 0000 +M42018111111111418120900403071163113 +M520181111111114181119790812WTTTPBW0012222122222250112112121520000 +M520181111111114181120070526WTTTPZ0BP122222122222 0422051 0000 +M520181111111114181120030606WTTTY@@99122222222222 0422091 0000 +M42018111111111426420000403951161113 +M520181111111114264119880707WTTT0Y@WT12222222222210112112114950000 +M520181111111114264120150706WTTTPWBYY222222122222 0422981 0000 +M520181111111114264120080715WTTTPPPTZ122222222222 0422041 0000 +M42018111111111453921100401551163113 +M520181111111114539119771118WTTT0B#PZ12222222222230112161117200000 +M520181111111114539120140101WTTTYTZY9122222122222 0422981 0000 +M520181111111114539120100119WTTT#PTY#122222222222 0422011 0000 +M42018111111111459821400400351993113 +M520181111111114598220050103WTTTYB0BW12222212222110412081200000277 +M520181111111114598119850118WTTTYTZ#T12222222222210112121129460000 +M520181111111114598120161106WTTT0#0T@222221222222 0422981 0000 +M42018111111111466022700403941162113 +M520181111111114660119880603WTTT#0YY022212222222210112111118780000 +M520181111111114660120120102WTTT0BWTZ122212222222 0422981 0000 +M520181111111114660120080101WTTTP9#@9222222222222 0422041 0000 +M42018111111111494720600400291161113 +M520181111111114947119830701WTTTYY09W22222122222210112111123440000 +M520181111111114947120171109WTTTPZZ9W122221122222 0422981 0000 +M520181111111114947120130121WTTTYW@@P222222222222 0422981 0000 +M520181111111114947120070623WTTTPPT0T122221122222 0422051 0000 +M42018111111111502121100401461163113 +M520181111111115021119850123WTTTY#YWY22222122222210112111121150000 +M520181111111115021120120608WTTTPBT@W222222122222 0422981 0000 +M520181111111115021120010118WTTT##YB0122222122222 0422101 0000 +M42018111111111503620900402921162113 +M520181111111115036119760119WTTT0TPYB22212222222220112121126040000 +M520181111111115036120080601WTTT##9T@222122122222 0422041 0000 +M520181111111115036120050518WTTT#T##Z222122122222 0422071 0000 +M520181111111115036120040801WTTT0Y#BT222122222222 0422081 0000 +M42018111111111504820600401981161113 +M520181111111115048119950723WTTTPB0PP12222222222210112121113030000 +M520181111111115048120160102WTTT0PW0Y222222122222 0422981 0000 +M42018111111111508220600402661163113 +M520181111111115082119870726WTTT#@0BT22222122222210112111113930000 +M520181111111115082120140512WTTTY9TZW222221222222 0422981 0000 +M42018111111111512021700402861163113 +M520181111111115120119830716WTTTP@99Z22222212222210112111124370000 +M520181111111115120120160101WTTT0BBZB222221122222 0422981 0000 +M520181111111115120120130618WTTTYPWBP222221122222 0422981 0000 +M520181111111115120120080723WTTT#B0WY222222122222 0422041 0000 +M42018111111111513820900403031163113 +M520181111111115138119900508WTTT#TB9922212222222220112121122380000 +M520181111111115138120141106WTTTPPYB9222122122222 0422981 0000 +M520181111111115138120080115WTTT0#90#222122122222 0422042 0000 +M42018111111111543821700405121163113 +M520181111111115438119890107WTTT0P@BT22222122222210112081116730000 +M520181111111115438120120723WTTTY@BZ#122222122222 0422981 0000 +M520181111111115438120070101WTTTP09P@122222222222 0422041 0000 +M42018111111111593220600406381162113 +M520181111111115932119891102WTTT0WP9@22222122222210112121113090000 +M520181111111115932120120119WTTTP0BTW122222122222 0422981 0000 +M520181111111115932120080802WTTT#PYBB222222122222 0422041 0000 +M42018111111111641821100403821162113 +M520181111111116418119881101WTTTPW#YW12222222222210112131132060000 +M520181111111116418120110507WTTTPPYPP122222122222 0422011 0000 +M520181111111116418120100509WTTTYYB##222222222222 0422021 0000 +M520181111111116418120060115WTTT0YT00122222122222 0422061 0000 +M42018111111111649420000404171163113 +M520181111111116494119860606WTTTP099#22212222222210112131119820000 +M520181111111116494120130101WTTTY@YPZ222122122222 0422981 0000 +M520181111111116494120090523WTTTPP#PB222122222222 0422031 0150 +M42018111111111652121100403821163113 +M520181111111116521119890113WTTTPYYZY22212222222210112121120890000 +M520181111111116521120150615WTTT0#WWP221122122222 0422981 0000 +M42018111111111697321700404341163113 +M520181111111116973119960101WTTTPZ9##22222122222210112111110800000 +M520181111111116973120170122WTTTY@B9B222221122222 0422981 0000 +M42018111111111698222700403941011113 +M520181111111116982119940719WTTTP9WW@22212122222210112081114630000 +M520181111111116982120150522WTTTP#@ZT222222222222 0422981 0000 +M42018111111111738921100401181163113 +M520181111111117389119870701WTTT00#B@12222222222210112111113050000 +M520181111111117389120140501WTTTYWZ0@222221122222 0422981 0000 +M520181111111117389120120119WTTT0BPBB222222222222 0422981 0000 +M42018111111111739122400401011163113 +M520181111111117391119820118WTTT#Y#@W22222122222230112111119720000 +M520181111111117391120100702WTTT#ZWW@222221122222 0422021 0000 +M42018111111111745020600403391163113 +M520181111111117450119860115WTTTYY#PP12222222222210112121127170000 +M520181111111117450120090106WTTTP99#0222222222222 0422031 0000 +M520181111111117450120050626WTTTY9TZP122222222222 0422071 0000 +M520181111111117450120010721WTTT0@YZZ122222122222 0422111 0000 +M42018111111111754120900402921993113 +M520181111111117541119600109WTTTYPP9P22212222222230212111124960000 +M520181111111117541119540113WTTT#0TY@22212211222220112111200001349 +M520181111111117541120020101WTTTYYZ@Y222122222222 0422101 0000 +M42018111111111790320900400501163113 +M520181111111117903119600121WTTTP0Y@#22212212222210112121121950000 +M520181111111117903120040703WTTTPY##Z222122122222 0422081 0000 +M42018111111111795022400401011162113 +M520181111111117950119680603WTTTY##WP22222122222220112132117610000 +M520181111111117950219530801WTTT0T9@#22222112222120212112200000687 +M520181111111117950120010715WTTT00#Z@222221222222 0422111 0000 +M42018111111111798820600405471162113 +M520181111111117988119900801WTTTPT0T912222122222230112141118320000 +M520181111111117988120140115WTTTYY#9#122222122221 0422981 0780 +M520181111111117988120140106WTTTPBYTZ122222122221 0422981 0780 +M520181111111117988120080521WTTTY9@YW122222222222 0422041 0000 +M42018111111111825621100401551162113 +M520181111111118256119770501WTTTY0@#012222222222210112112124430000 +M520181111111118256120140126WTTT0T@TB122222222222 0422981 0000 +M520181111111118256120060615WTTTYY9ZP122222122222 0422062 0000 +M42018111111111831320000403551163113 +M520181111111118313119890703WTTT0PWYZ22212122222210112111113560000 +M520181111111118313120160701WTTTYTYBB222221122222 0422981 0000 +M520181111111118313120160701WTTT#9ZWY222221122222 0422981 0000 +M520181111111118313120150819WTTT09##Z222121222222 0422981 0000 +M42018111111111840622700400681163113 +M520181111111118406119830109WTTTPY09W22222122222210112121121790000 +M520181111111118406120110126WTTT#ZYWB222222122222 0422011 0000 +M520181111111118406120060501WTTT0TTB#222221222222 0422061 0000 +M42018111111111863820000402281013113 +M520181111111118638119880506WTTTP#BBP22212222222210112111133990000 +M520181111111118638120180113WTTTP@TT9222222122222 0422981 0000 +M520181111111118638120070719WTTT#T#P@122122222222 0422051 0000 +M42018111111111884821400400351163113 +M520181111111118848119890706WTTT0YZ0Y22212222222210112111116920000 +M520181111111118848120150723WTTT#9WPP222122222222 0422981 0000 +M42018111111111900420000401061163113 +M520181111111119004119870101WTTTYWPT922212222222210112111124160000 +M520181111111119004120170618WTTTYBWB#222222222222 0422981 0000 +M520181111111119004120150521WTTT#YY@@222122222222 0422981 0000 +M42018111111111907621700401091163113 +M520181111111119076119830626WTTT0P0@W22222122222250112121119750000 +M520181111111119076120140709WTTT0@@##222221122222 0422981 0000 +M520181111111119076120060701WTTT0@YP9222221222222 0422061 0000 +M520181111111119076120050115WTTTYTZ0@222221222222 0422071 0000 +M42018111111111916520500402971163113 +M520181111111119165119770121WTTTY#@WB22222122222220212111227640000 +M520181111111119165119750509WTTT#ZW0W22222112222220112111200000000 +M520181111111119165120130515WTTTP#@ZW222221122222 0422981 0000 +M520181111111119165120061113WTTT#9PT9222221122222 0422051 0000 +M42018111111111924022200401591163113 +M520181111111119240119910812WTTT#WWZB22222112222211012121192300000 +M520181111111119240119880723WTTT#9P9Z22222122222210112131118050000 +M520181111111119240120160101WTTT0W@TB222221122222 0422981 0000 +M520181111111119240120120501WTTT00YWY222221222222 0422981 0000 +M42018111111111931320600405471992113 +M520181111111119313119860119WTTTPB0@#12222222222210112121116480000 +M520181111111119313120110509WTTTYY9Y#122222222222 0422011 0000 +M520181111111119313120040119WTTT#9TWB122222222222 0422081 0000 +M42018111111111956322700403241161113 +M520181111111119563119931103WTTTPT00Z12222222222210112121116120000 +M520181111111119563120130502WTTTPPPW9122222222222 0422981 0000 +M520181111111119563120090808WTTTPP#WY122222222222 0422031 0000 +M520181111111119563120090808WTTTP9Y9Z122222122222 0422031 0000 +M42018111111111961720900400391161113 +M520181111111119617119820602WTTT##BBW12222222222210112111100000359 +M520181111111119617120160523WTTT#9@PZ222222222222 0422981 0000 +M520181111111119617120080508WTTTPT@@P122212222222 0422041 0000 +M520181111111119617120020116WTTT#09W@222122222221 0422101 0764 +M42018111111111972420000406821163113 +M520181111111119724119890501WTTTYW@BZ22212222222210112131146880000 +M520181111111119724120061126WTTTYY9W0222122122222 0422051 0000 +M42018111111112007020900401881993113 +M520181111111120070119960123WTTT#0P@Y22212222222210112081113480126 +M520181111111120070120170102WTTTYZ@Z@222122122222 0422981 0000 +M42018111111112007321100401181163113 +M520181111111120073119710102WTTTP0#W#12222212222230112112126000000 +M520181111111120073120050806WTTT#ZYZB122222222222 0422072 0000 +M520181111111120073120010716WTTTPPBBB122222122222 0422112 0000 +M42018111111112017420500402421161113 +M520181111111120174119900115WTTT0BY9W22212222222210112131119810000 +M520181111111120174120130519WTTTY#P90222122222222 0422981 0000 +M42018111111112041220600401421163113 +M520181111111120412119740119WTTTY9B9922221222222220112111119730000 +M520181111111120412120110126WTTT0BZ90222222222222 0422011 0000 +M520181111111120412120060802WTTTPZWYZ222122222222 0422061 0000 +M42018111111112046320900401031162113 +M520181111111120463119830701WTTT#T##Y12222222222210112131122670000 +M520181111111120463120110501WTTT#P09B222122122222 0422011 0000 +M520181111111120463120070106WTTTYY@9Y222222222222 0422051 0000 +M42018111111112068720900406131163113 +M520181111111120687119890715WTTT#@Y#Y12222222222210112121126910000 +M520181111111120687120070516WTTTYPP0Y222221122222 0422051 0000 +M42018111111112070521700402341163113 +M520181111111120705119830126WTTTYZ@0P22212222222220112122116630000 +M520181111111120705120050618WTTTY@WWP222122122222 0422072 0000 +M42018111111112072821700402861163113 +M520181111111120728119810502WTTT#PZTT22222122222250112111117600000 +M520181111111120728120050119WTTTPW#PY222222122222 0422071 0000 +M42018111111112077922700400671163113 +M520181111111120779119760701WTTT0PWBP22222212222210112121124100000 +M520181111111120779120011106WTTT#W#@@222221222222 0422101 0000 +M42018111111112088622700400441163113 +M520181111111120886119880719WTTTY#B9022222122222210112111113140000 +M520181111111120886120131102WTTT0Z9@Y222221222222 0422981 0000 +M42018111111112112121200404821163113 +M520181111111121121119920601WTTT0PPZB22222122222220112081117290000 +M520181111111121121120160121WTTTPPWZ#222221122222 0422981 0200 +M520181111111121121120120512WTTT#9Z#Z222221122222 0422981 0200 +M42018111111112129120900406131161113 +M520181111111121291119820619WTTTP###P12222222222250112112126000000 +M520181111111121291120160506WTTTY@BTZ122222122222 0422981 0000 +M520181111111121291120140119WTTT0#Y9Z122222222222 0422981 0000 +M520181111111121291120080612WTTT0W@#B222222222222 0422041 0000 +M520181111111121291120030126WTTT#BPWY122221122222 0422081 0000 +M42018111111112139421100401871163113 +M520181111111121394119771116WTTT#PBT022222122222230112111143800000 +M520181111111121394120160123WTTT0BPWW222221122222 0422981 0000 +M520181111111121394120100123WTTTP#YWB222221222222 0422011 0000 +M520181111111121394120090107WTTTY9PB9222221222222 0422031 0000 +M520181111111121394120070518WTTTY0PP#222221222222 0422051 0000 +M520181111111121394120050106WTTT#YBZ#222221222222 0422061 0000 +M42018111111112159321100403821163113 +M520181111111121593119850723WTTTPW9ZZ12222222222210112131121331050 +M520181111111121593120120126WTTT#TZWW122222122222 0422981 0000 +M520181111111121593120091121WTTT#0#YT122222222222 0422021 0000 +M520181111111121593120030114WTTTP#@ZP122222222222 0422081 0000 +M42018111111112170522700402801163113 +M520181111111121705119870801WTTTPT#ZW22222122222210112121113050000 +M520181111111121705120171113WTTTYWZZY222221222222 0422981 0000 +M520181111111121705120160718WTTT#BZTP222222122222 0422981 0000 +M520181111111121705120140601WTTTPW@B@222222222222 0422981 0000 +M520181111111121705120110115WTTTP0TBZ222221222222 0422011 0000 +M42018111111112171721100403821161113 +M520181111111121717119920501WTTT#W@W@12222222222210112121128640000 +M520181111111121717120150823WTTTYB#00122221222222 0422981 0000 +M520181111111121717120130818WTTT099PP122222122222 0422981 0000 +M42018111111112198921700403151163113 +M520181111111121989119911123WTTTYP@@B22222122222210112111125650000 +M520181111111121989120120815WTTTYY@#@222221122222 0422981 0000 +M42018111111112264520600405471162113 +M520181111111122645119870107WTTTY0@9#12222222222210112121120860000 +M520181111111122645120140119WTTTPYBT@222222222222 0422981 0000 +M520181111111122645120090721WTTT0PZP#122222122222 0422031 0268 +M42018111111112276221700404181163113 +M520181111111122762119910503WTTTYB0BB22222112222210112121117750000 +M520181111111122762120130719WTTT0@BZ#222222222222 0422981 0000 +M42018111111112279821200404541163113 +M520181111111122798119741115WTTTPYY@022222122222250112111131750000 +M520181111111122798120040122WTTT0Y0@W222221122222 0422071 0025 +M520181111111122798120020626WTTTPBW#B222221122222 0422101 0025 +M42018121111111111220900403071163113 +M520181211111111112119840601WTTTP9TZW22212222222250112112114140000 +M520181211111111112120140703WTTTYYWYY222122222222 0422981 0000 +M520181211111111112120120118WTTT0Z0@B222122122222 0422983 0000 +M520181211111111112120080115WTTT0T9TP222122122222 0422033 0000 +M42018121111111111620900400391161113 +M520181211111111116119900723WTTTPY@0P12222122222210112131116670000 +M520181211111111116120160615WTTTY@WW@122122222222 0422981 0000 +M520181211111111116120140718WTTT0TWZY122122222222 0422981 0000 +M520181211111111116120100615WTTTP#B@W122221222222 0422022 0000 +M42018121111111147820900402921163113 +M520181211111111478119940819WTTTYY9T922222222222210112121120070000 +M520181211111111478120170508WTTT0WTW@222122122222 0422981 0000 +M42018121111111180920900403031163113 +M520181211111111809219830122WTTT0WBYB22122222222220212113200000000 +M520181211111111809119830501WTTT#ZYBY22212212222210112111125700000 +M520181211111111809120180623WTTT090ZZ222222222222 0422981 0000 +M42018121111111198120000401751013113 +M520181211111111981119830101WTTT0B09P22222122222220112111133900000 +M520181211111111981120100619WTTTY9W0@222122222222 0422021 0000 +M520181211111111981120050723WTTTYWWB9222122222222 0422071 0000 +M42018121111111198520600402661162113 +M520181211111111985119870102WTTT00@#Y22222122222210112131125510000 +M520181211111111985120080607WTTT0T0TT222221122222 0422041 0000 +M42018121111111264822400400881163113 +M520181211111112648119860101WTTTY0#Z922222122222210112131123730000 +M520181211111112648120070507WTTT0@YP@222222122222 0422051 0000 +M42018121111111295222400401011161113 +M520181211111112952119930508WTTT0T@TW22212222222210112131125280000 +M520181211111112952120130118WTTT#9BZB222122122222 0422981 0000 +M42018121111111312621400400351163113 +M520181211111113126119900112WTTT09#Z922212222222210112112120800000 +M520181211111113126120150601WTTT0YW9T222222222222 0422981 0000 +M520181211111113126120130503WTTTPT9Z9222122222222 0422981 0000 +M42018121111111314521400403171162113 +M520181211111113145119790701WTTT0TW#Z22222122222250112111112820000 +M520181211111113145120150121WTTT0PYZT222221222222 0422981 0000 +M520181211111113145120130815WTTT#W0W@222221122222 0422981 0000 +M42018121111111323120600401981163113 +M520181211111113231119890515WTTTYYB@B12222222222210112121129080000 +M520181211111113231120150114WTTTY@0W9122122122222 0422981 0000 +M520181211111113231120090619WTTT#0TYP122221222222 0422031 0000 +M42018121111111333220500402421163113 +M520181211111113332219880506WTTT##YW012222122222220112113200000000 +M520181211111113332119810615WTTTYWW9W12222112222250212111128000000 +M520181211111113332120121123WTTT##T@Y222221122222 0422981 0000 +M520181211111113332120090621WTTTP9P@9122221222222 0422031 0000 +M42018121111111374021700406831013113 +M520181211111113740119940122WTTTPP9W#12222222222210112081113440000 +M520181211111113740120131101WTTTP#P@#222222122222 0422981 0000 +M42018121111111375321100401541993113 +M520181211111113753119870702WTTT#W0BP22222122222210212111110780000 +M520181211111113753119851106WTTTY###Y22222112222210112111130080000 +M520181211111113753120180601WTTTPPTTZ222221122222 0422981 0000 +M520181211111113753120130519WTTTYZ9B9222221122222 0422981 0000 +M42018121111111388421100406001161113 +M520181211111113884119850118WTTT#0T#B12222222222210112111131710000 +M520181211111113884120141107WTTT0Z9B#222222222222 0422981 0000 +M520181211111113884120100613WTTTYY###122222122222 0422021 0000 +M520181211111113884120070821WTTTPY@9P222222122222 0422051 0112 +M42018121111111406521100404791163113 +M520181211111114065119920123WTTTYB@BY22212122222210112111110860000 +M520181211111114065120130101WTTTP0#P9222121222222 0422981 0000 +M42018121111111411922700402581163113 +M520181211111114119119851115WTTTY#B0Y22212222222210112131120780000 +M520181211111114119120040115WTTTYW@YZ222122222222 0422081 0000 +M520181211111114119120010109WTTTP#9WP222122122222 0422101 0000 +M42018121111111417822700400681191113 +M520181211111114178119870606WTTTPTTW@22212222222250112111119000000 +M520181211111114178120160519WTTTY00WP222222222222 0422981 0000 +M520181211111114178120140713WTTTPYB@Y222222122222 0422981 0000 +M520181211111114178120081106WTTTP99YW222222222222 0422031 0348 +M42018121111111453022700400441163113 +M520181211111114530119840112WTTTP#B9@22222122222210112111122100000 +M520181211111114530120150806WTTT#99B0222121122222 0422981 0000 +M520181211111114530120050815WTTTP##9T222221222222 0422071 0000 +M42018121111111467820000402891163113 +M520181211111114678119720102WTTTY9@YY22222112222220112121121670000 +M520181211111114678120121114WTTTYW#BY222221222222 0422981 0000 +M520181211111114678120100708WTTT0ZYZ9222221222222 0422021 0000 +M520181211111114678120070719WTTTY#0WY222221222222 0422051 0000 +M520181211111114678120060107WTTTP9WT#222221122222 0422061 0000 +M42018121111111534420000402101163113 +M520181211111115344119951119WTTTPB9@911222122222210112111120010000 +M520181211111115344120170814WTTTYB99Y121222222222 0422981 0000 +M520181211111115344120170814WTTTPT@@T121222222222 0422981 0000 +M520181211111115344120130615WTTT0ZWBY222222122222 0422981 0000 +M42018121111111544221700404201163113 +M520181211111115442119850522WTTT#@@ZP22222122222210112141125500000 +M520181211111115442120160512WTTT0P9@T222221222222 0422981 0000 +M520181211111115442120141118WTTT0P9@P222222222222 0422981 0000 +M520181211111115442120100113WTTTP@#WB222221222222 0422021 0000 +M42018121111111555322700400991163113 +M520181211111115553119621106WTTTY0T@9222221222222501121111####0000 +M520181211111115553120010801WTTTYYT#0222221222222 0422111 0000 +M42018121111111571120000404271162113 +M520181211111115711119870126WTTTP@#B022122222222210112111125360000 +M520181211111115711120131123WTTT0@WP#221222122222 0422981 0000 +M520181211111115711120060608WTTTP0#TY221222122222 0422061 0000 +M42018121111111574420900403071163113 +M520181211111115744119790106WTTTBT@WT12222222222210112131113250000 +M520181211111115744120150601WTTT0WTTT122122122222 0422981 0000 +M42018121111111587420600402981163113 +M520181211111115874119870121WTTTP9WPT22222122222210112111124510000 +M520181211111115874120090701WTTT0#9WP222222122222 0422031 0000 +M42018121111111589320600401421163113 +M520181211111115893119910126WTTT#000912222222222210112121113110000 +M520181211111115893120121108WTTTYWPBP222221222222 0422981 0000 +M42018121111111611521700404101163113 +M520181211111116115119890121WTTT00@W012222222222210112121119990000 +M520181211111116115120140708WTTT#Z0PY222222122222 0422981 0000 +M42018121111111615621400402181163113 +M520181211111116156119950602WTTT0@Y0W22212222222210112111111290000 +M520181211111116156120160513WTTTYZ#B9222222122222 0422981 0096 +M520181211111116156120110121WTTTPYB0T222221222222 0422981 0123 +M42018121111111616121400400351163113 +M520181211111116161119880515WTTT0@0T@22212212222211012122115660000 +M520181211111116161219830803WTTTPYB#@22212222222210112113200000000 +M520181211111116161120151123WTTT0YB0P222222122222 0422981 0000 +M42018121111111637220900404651161113 +M520181211111116372119890701WTTT#00Z#12222222222210112111112810000 +M520181211111116372120161103WTTT#T#TT122222122222 0422981 0000 +M520181211111116372120040121WTTT0T#BW122222122222 0422071 0000 +M42018121111111669021700404341163113 +M520181211111116690119820723WTTT#@T#@22222121222220112111200000384 +M520181211111116690119790519WTTTYPWZZ22222112222220212111124290000 +M520181211111116690120140501WTTTPPTYW222221222222 0422981 0000 +M520181211111116690120120615WTTTPZBZB222221122221 0422981 0372 +M42018121111111693021700406571163113 +M520181211111116930119980512WTTT##ZB022222222222210412081111810000 +M520181211111116930120170121WTTT#WPZW222222222222 0622981 0000 +M42018121111111693622700405651993113 +M520181211111116936119810114WTTTY#9@#22222122222250112111118490600 +M520181211111116936120130519WTTTP9W09222221122222 0422981 0000 +M520181211111116936120040518WTTTPW@9B222221222222 0422081 0000 +M520181211111116936120030103WTTTPBTY#222221222222 0422091 0000 +M520181211111116936120020801WTTT0P###222221222222 0422101 0000 +M42018121111111693820600402031163113 +M520181211111116938119810119WTTT#PZZZ22222122222210112111119750000 +M520181211111116938120170115WTTTYYY@@212121222222 0422981 0000 +M520181211111116938120020716WTTTPTWYP222221122222 0422101 0275 +M42018121111111694822700402801993113 +M520181211111116948119960119WTTT#PZ#922212222222210112122125530000 +M520181211111116948120160701WTTTY9YYB222122122222 0422981 0000 +M520181211111116948120160701WTTT0PZPW222122222222 0422981 0000 +M42018121111111697520600404951011113 +M520181211111116975119840815WTTT#TBY922212222222230112131118550000 +M520181211111116975120150121WTTTP@0B#222122222222 0422981 0000 +M42018121111111719121100405971163113 +M520181211111117191119791102WTTTPZB#B12222221222220112082120340205 +M520181211111117191120131123WTTT0ZYZB122222222222 0422981 0205 +M520181211111117191120090119WTTTP900P122222122222 0422031 0205 +M42018121111111723520600403391163113 +M520181211111117235119880502WTTT#PYT012222222122210112121129830269 +M520181211111117235120111101WTTT#BTY@122222122222 0422981 0000 +M520181211111117235120100103WTTT0T9#P122222222222 0422021 0000 +M42018121111111726620900406601163113 +M520181211111117266119650115WTTT0TZB022222122222250112111124400000 +M520181211111117266120001126WTTT#P@TP222221122222 0422111 0400 +M42018121111111735120900403031163113 +M520181211111117351119640516WTTT##ZT022212222222250112122120840000 +M520181211111117351120041121WTTT0BYBW222122122222 0422071 0000 +M42018121111111737720600401981163113 +M520181211111117377119820106WTTT00#BY12222222222210112131117100000 +M520181211111117377120050614WTTT#0B@B122222222222 0422071 0000 +M42018121111111742121700406341162113 +M520181211111117421119850626WTTTYPZYB12222222222220112081126890000 +M520181211111117421219831109WTTT#TZZZ22212212222210212111200000000 +M520181211111117421120160115WTTTPWWYP222221222222 0422981 0000 +M520181211111117421120150723WTTTPWY9B222222122222 0422981 0000 +M520181211111117421120130615WTTTY999@122222222222 0422981 0000 +M520181211111117421120110819WTTT0@Z9#222122122222 0422011 0000 +M520181211111117421120070116WTTT#Y##T122222222222 0422041 0000 +M520181211111117421120040109WTTT0YTBP122222222222 0422081 0000 +M520181211111117421120020107WTTTYZP0W122222122222 0422101 0000 +M520181211111117421120010801WTTTYZ##0122222222222 0422111 0000 +M42018121111111745521100406541163113 +M520181211111117455119920112WTTT#BZPT12222222222210112121123620000 +M520181211111117455120140508WTTT0#W0Y122222122222 0422981 0000 +M520181211111117455120130526WTTT09@Z#122222122222 0422981 0000 +M42018121111111766322700400671163113 +M520181211111117663119890621WTTTPB0BY22222122222210112111119250121 +M520181211111117663120130519WTTT0PW#W222222122222 0422981 0000 +M42018121111111771221400400351163113 +M520181211111117712119870712WTTTPYPYB12222222222210112111121810000 +M520181211111117712120091114WTTTPTW0Z222222122222 0422021 0000 +M520181211111117712120061101WTTTYYY9W122221222222 0422051 0000 +M42018121111111791221100401461013113 +M520181211111117912119800122WTTTP@WPY12222222222210112111140730000 +M520181211111117912120110106WTTT#BPZW222222222222 0422011 0000 +M520181211111117912120110106WTTTYYPYZ222222122222 0422011 0000 +M520181211111117912120110106WTTT0TTBW222222222222 0422011 0000 +M42018121111111808920000402101163113 +M520181211111118089119920115WTTTYP0PB12222222222210112111125840000 +M520181211111118089120130122WTTTPTZ@W122222122222 0422981 0000 +M42018121111111824821100401691992113 +M520181211111118248119910702WTTT0B@W012222222222210112121107810000 +M520181211111118248119860106WTTT#Z@BP12222212222211012111120210000 +M520181211111118248120160513WTTT0#@#T122222122222 0422981 0000 +M520181211111118248120150502WTTT#TTW0122222122222 0422981 0000 +M42018121111111833321100402211163113 +M520181211111118333119780723WTTTPBYW#22222122222220112121117900000 +M520181211111118333120050116WTTT099BY222221222222 0422071 0000 +M42018121111111845321700406891163113 +M520181211111118453119930819WTTTYTW#Y22222122222230112131112530000 +M520181211111118453120131119WTTTY9W#9222221222222 0422981 0000 +M42018121111111874721100402161163113 +M520181211111118747119880119WTTT#WT9W12222222222210112121131160000 +M520181211111118747120170715WTTT0YWW0122222122222 0422981 0000 +M520181211111118747120130121WTTT00B0P122222122222 0422981 0000 +M520181211111118747120120115WTTT0YTPT122222122222 0422981 0000 +M42018121111111936120900406131192113 +M520181211111119361119870108WTTT#BBY012222122222220112112116420000 +M520181211111119361119700526WTTT0WW9#22222112222220212111121420000 +M520181211111119361120090606WTTTYP9@W222221222222 0422031 0000 +M520181211111119361120050514WTTT#P@YW222221122222 0422071 0000 +M42018121111111936920000406281012113 +M520181211111119369119830123WTTTYTZ#W22222122222220112161133330000 +M520181211111119369119760702WTTT00Z@W22212212222220212082113410000 +M520181211111119369120160515WTTT#@@PY222222222222 0422981 0000 +M520181211111119369120130501WTTTPW#T#222222222222 0422981 0000 +M520181211111119369120130501WTTTPW9Z9222222122222 0422981 0000 +M42018121111111939220900401031161113 +M520181211111119392119700118WTTTYP#@922122222222220112111124430000 +M520181211111119392119641119WTTT#BWYY22122212222220212111108000000 +M520181211111119392120050826WTTTP0BZY221222122222 0422071 0000 +M520181211111119392120030121WTTTPPWWY221222222222 0422091 0000 +M42018121111111943220000401751012113 +M520181211111119432119840126WTTTPYBBP22212222222210112142137430000 +M520181211111119432120130701WTTTPP0@@222122222222 0422981 0000 +M520181211111119432120040119WTTT0B9#@222122222222 0422081 0000 +M42018121111111966220500402421161113 +M520181211111119662119870115WTTTYB0Y912222222222210112121100000000 +M520181211111119662120171118WTTTBTTZ0122222222222 0422981 0000 +M520181211111119662120140126WTTTY0Y#9122222122222 0422981 0000 +M42018121111111980921100406391991113 +M520181211111119809119761123WTTTPY#PP12222222222230112131123220000 +M520181211111119809120080113WTTTP@YY@122222222222 0422041 0000 +M520181211111119809120050106WTTT#B@YB122222222222 0422071 0000 +M42018121111112028421100404791161113 +M520181211111120284119780106WTTTY@0@W21222122222210112111117320017 +M520181211111120284120081112WTTT0Y#TW222221122222 0422031 0000 +M520181211111120284120061108WTTT0B0BW222221222222 0422051 0000 +M520181211111120284120020122WTTTP9#Y9122222122222 0422091 0000 +M42018121111112032522700403941163113 +M520181211111120325119740102WTTTY0WTP22222122222250112131121610000 +M520181211111120325120130619WTTT0YYB#222222122222 0422981 0000 +M520181211111120325120071107WTTTP9WTY222221222222 0422041 0000 +M42018121111112043221100406001162113 +M520181211111120432119900101WTTTYYZY@12222222222210112131114790000 +M520181211111120432120101119WTTT#W0T0122222222222 0422011 0000 +M42018121111112057122200400911163113 +M520181211111120571119880515WTTTP#TPY22212212222210112121117210000 +M520181211111120571120170615WTTTY0Y0#222222122222 0422981 0000 +M520181211111120571120150619WTTT0PWBT222222222222 0422981 0000 +M42018121111112073821400401841163113 +M520181211111120738119840815WTTTY0#YP22212222222210112111128430000 +M520181211111120738120120523WTTT0W9@0222122122221 0422981 0484 +M520181211111120738120091119WTTTYYTZY222122122222 0422021 0000 +M42018121111112097020600401421163113 +M520181211111120970119870101WTTTPYB#T22122222222210112111122240000 +M520181211111120970120050101WTTTY#9BW122222222222 0422061 0000 +M520181211111120970120030506WTTTP#YB9222222122222 0422091 0000 +M42018121111112136220600405341123113 +M520181211111121362119980123WTTTY#9BP12222122222210112081119460000 +M520181211111121362120150819WTTTYWT9P122221222222 0422981 0000 +M42018121111112150920600400871163113 +M520181211111121509119780119WTTT09PW@12222212222230112111119750000 +M520181211111121509120070721WTTTYB@PY122222222222 0422051 0000 +M520181211111121509120040603WTTTYP9YY122222122222 0422081 0000 +M42018121111112169521700406571163113 +M520181211111121695119910101WTTTYZ@BB22222222222210112121100000000 +M520181211111121695120150601WTTTYPWW@222222222222 0422981 0000 +M42018121111112175621700406891163113 +M520181211111121756219831115WTTTY9Z9P22222121222110112111200000800 +M520181211111121756119820101WTTT#PWBB12222212222211012111120430000 +M520181211111121756120070119WTTTY#ZZ0222221122222 0422041 0000 +M42018121111112176821700403151161113 +M520181211111121768119820503WTTTP#ZZT22212222222210112082120190000 +M520181211111121768120160519WTTT0YZ#T222122122222 0422981 0000 +M520181211111121768120140121WTTT#9W0Y222122222222 0422981 0000 +M520181211111121768120110101WTTTYPP9Y222122122222 0422981 0000 +M520181211111121768120020714WTTTY00WW222122222222 0422102 0000 +M42018121111112200121400401841163113 +M520181211111122001119740102WTTTY#WTY22222122222220112161127210000 +M520181211111122001120100608WTTTPZ#TY222221222222 0422021 0000 +M520181211111122001120090119WTTT0TT0T222221222222 0422031 0000 +M520181211111122001120090119WTTTYY@WY222221122222 0422031 0000 +M520181211111122001120070719WTTTYT0YW222221222222 0422051 0000 +M520181211111122001120020103WTTT#YT0B222221222222 0422101 0000 +M520181211111122001120020103WTTTYT9PZ222221222222 0422101 0000 +M42018121111112211821100403821162113 +M520181211111122118119820506WTTT#P9Y012222222222210112082128590000 +M520181211111122118120050802WTTTYWBTY122222122222 0422071 0000 +M520181211111122118120030103WTTTP#@#Z122222122222 0422081 0000 +M520181211111122118120010513WTTT0Z0B0122222122222 0422111 0000 +M42018121111112215121400406791993113 +M520181211111122151119940613WTTT#B9WP12222222222210112111122640000 +M520181211111122151120100101WTTT09@@P222222122222 0422011 0000 +M42018121111112242720600400871161113 +M520181211111122427119950126WTTT#TP#W12222222222210112111100000000 +M520181211111122427120120123WTTTPP90Y122222222222 0422981 0000 +M42018121111112248221700405291163113 +M520181211111122482119840606WTTT0WPY#22222122222211012121141700000 +M520181211111122482219750821WTTTPWB9T12222211222130112111200000800 +M520181211111122482120170601WTTT#ZBT0122221122222 0422981 0000 +M520181211111122482120070115WTTTP9TPB222221222222 0422051 0000 +M520181211111122482120030109WTTTYB@9T222221122222 0422091 0000 +M42018121111112266520600401421163113 +M520181211111122665219970109WTTT0#B0B22222212222110412082200000530 +M520181211111122665119760118WTTT#0BT@22222222222230112082121240000 +M520181211111122665120030514WTTTPP@PB222222222222 0422092 0000 +M42019011111111120521400400351161113 +M520190111111111205120000501WTTTP0YP012222222222210412081118290000 +M520190111111111205119831106WTTTPZYY#12222222222210112111115940000 +M520190111111111205120041102WTTT#Y@0W122222222222 0422081 0000 +M42019011111111125820600405341163113 +M520190111111111258119910113WTTTY9@ZB12222122222210112121129390000 +M520190111111111258120170618WTTTYPW9Y222222222222 0422981 0000 +M520190111111111258120100122WTTTP90P#122222122222 0422021 0000 +M42019011111111142420600402031163113 +M520190111111111424119880113WTTT0W90@22222222222210112111129030000 +M520190111111111424120150107WTTTY9W@B222222222222 0422981 0000 +M520190111111111424120050523WTTTPTPTP222222222222 0422071 0000 +M42019011111111152620000406911163113 +M520190111111111526119750519WTTT0@Z0#22212222222220112131125150000 +M520190111111111526120040815WTTT0@TZY222122222222 0422081 0000 +M520190111111111526120030521WTTT#@T0P222122222222 0422091 0000 +M520190111111111526120011119WTTTY@9#0222122222222 0422111 0000 +M42019011111111161521100406541013113 +M520190111111111615119870119WTTTYZTB012222212222230112111120500000 +M520190111111111615120140115WTTTYP9ZZ122222122222 0422981 0000 +M42019011111111182221100401181161113 +M520190111111111822119850602WTTTP@YTP12222222222210112121124350000 +M520190111111111822120110823WTTT#YZ#9222122122222 0422011 0000 +M42019011111111186420600401161161113 +M520190111111111864119900626WTTTPPTP022212222222210112081116790000 +M520190111111111864120050619WTTTPZ9YB222122122222 0422071 0000 +M42019011111111205820300403511993113 +M520190111111112058119920521WTTT#Z9W022212122222210112121120460000 +M520190111111112058120180521WTTTY9ZPB222222122222 0422981 0000 +M520190111111112058120140807WTTT#TB@9222221222222 0422981 0000 +M42019011111111244421100403821163113 +M520190111111112444119860812WTTTPTBWZ22222222222210112121118910000 +M520190111111112444120110113WTTTYWYTT222222222222 0422981 0000 +M42019011111111262120000400361161113 +M520190111111112621119680606WTTT#WP@912222222222250112081125460000 +M520190111111112621120060726WTTT#Y99@222222222222 0422061 0000 +M520190111111112621120031121WTTT#ZY@#122222122222 0422091 0000 +M42019011111111290920000403951162113 +M520190111111112909119880619WTTTY#W#022222122222210112121116770000 +M520190111111112909120140101WTTTPY9PY222221122222 0422981 0000 +M42019011111111333921700401121162113 +M520190111111113339119900121WTTT0@ZP@22222122222210112081116420000 +M520190111111113339120180726WTTT#@#B9122221122222 0422981 0000 +M520190111111113339120160814WTTTY#PY9122221222222 0422981 0000 +M520190111111113339120150709WTTT09000122221122222 0422981 0000 +M42019011111111348621700400981163113 +M520190111111113486119771121WTTTP@YYY22222122222250112121125480000 +M520190111111113486120080619WTTT#0B0#222221222222 0422041 0200 +M520190111111113486120030719WTTT#P@99222221122222 0422091 0200 +M42019011111111356222400401011163113 +M520190111111113562119860501WTTTP#TP022122212222220112161131690000 +M520190111111113562219851119WTTTP00P@22122222222220212123207080000 +M520190111111113562120170722WTTTY9ZY0221222122222 0422981 0000 +M520190111111113562120160109WTTTPBPTT221222122222 0422981 0000 +M42019011111111363121100406001163113 +M520190111111113631119900501WTTT#PWY912222222222210112111119530000 +M520190111111113631120120106WTTTY#Y@B122222122222 0422981 0133 +M520190111111113631120070121WTTTY#@PP122222122222 0422051 0133 +M520190111111113631120041113WTTT#9ZT0122222222222 0422081 0133 +M42019011111111377822700400671162113 +M520190111111113778119940615WTTT#Z@@B12222222222210112121118390000 +M520190111111113778120150601WTTTP90YP122222122222 0422981 0000 +M42019011111111382922400401281163113 +M520190111111113829119750707WTTTPB@ZW22222122222220112141117710050 +M520190111111113829119740721WTTTYP@P@22222112222220212981141790000 +M520190111111113829120160801WTTTY@TT#222221222222 0422981 0000 +M520190111111113829120160801WTTT0WT9Y222221222222 0422981 0000 +M520190111111113829120150102WTTT#9@TY222221122222 0422981 0000 +M42019011111111386720000403951163113 +M520190111111113867119860823WTTTBTZTY12222222222210112111116780000 +M520190111111113867120180508WTTTY09BB222222122222 0422981 0000 +M42019011111111407622700402531163113 +M520190111111114076119780119WTTT#ZWB#22222122222210112121115070000 +M520190111111114076120080815WTTT#W9##222222222222 0422041 0000 +M520190111111114076120060107WTTT#PB9#222221222222 0422051 0000 +M520190111111114076120040123WTTTPWZ99222221222222 0422081 0000 +M42019011111111426621100402441163113 +M520190111111114266119910526WTTT#PTYW12222222222210112131127710000 +M520190111111114266120150601WTTTPW@W0122222122222 0422981 0000 +M520190111111114266120140123WTTTYWYB9222222122222 0422981 0000 +M42019011111111433120900406421161113 +M520190111111114331119780619WTTTPTWB012222222222210112161120210000 +M520190111111114331120160512WTTT#09YT122222122222 0422981 0000 +M520190111111114331120030519WTTTYTT0B222222122222 0422091 0000 +M520190111111114331120020602WTTTPYYP@122222122222 0422101 0000 +M42019011111111448021100406471163113 +M520190111111114480119840503WTTTPZZ9Y12222222222220112141123910000 +M520190111111114480120131113WTTT#PBWT122222122222 0422981 0000 +M520190111111114480120090115WTTTYZWP#122222122222 0422021 0000 +M520190111111114480120070109WTTT#00TP122222222222 0422051 0000 +M520190111111114480120060619WTTT0YBW9122222122222 0422061 0000 +M42019011111111448620900406741163113 +M520190111111114486119860122WTTT0P9@B12222222222210112141100000000 +M520190111111114486120150713WTTTPBZW@122222122222 0422981 0000 +M42019011111111466520900403031161113 +M520190111111114665119820602WTTT0PTY912222222222210112141119740000 +M520190111111114665120040501WTTTP#W9B122222222222 0422081 0000 +M42019011111111473021400400351163113 +M520190111111114730119700114WTTT##T#T22212222222210112112118350000 +M520190111111114730120050602WTTTY0P9T222122122222 0422072 0000 +M520190111111114730120020103WTTTPT9@Y222122122222 0422102 0000 +M42019011111111490121700401091163113 +M520190111111114901119960501WTTT#Y9T#22222122222210112111126850000 +M520190111111114901120180119WTTT#9WW9222222122222 0422981 0000 +M520190111111114901120140114WTTTYP0#W222222122222 0422981 0000 +M42019011111111504420600401421163113 +M520190111111115044119940506WTTTYZZY#12222122222210112121115700000 +M520190111111115044120171122WTTT0ZYW0222221222222 0422981 0000 +M520190111111115044120160701WTTTYTT9Z122222222222 0422981 0000 +M520190111111115044120110801WTTTPZ#T0122122222222 0422011 0000 +M42019011111111514920900403071161113 +M520190111111115149119760613WTTT#Z9TP22222222222210112111133030000 +M520190111111115149120130822WTTTY9#@9222122222222 0422981 0000 +M520190111111115149120130822WTTT#9P9#222122222222 0422981 0000 +M42019011111111517821400406791163113 +M520190111111115178119660119WTTTY#@#T12212222222230112111119590000 +M520190111111115178120020106WTTTP0@99222122122222 0422101 0000 +M42019011111111533422400403421163113 +M520190111111115334119920109WTTTYZ@WT22222122222210112131115390000 +M520190111111115334120130621WTTTP9YY9222221122222 0422981 0000 +M42019011111111536920900400391161113 +M520190111111115369119730726WTTT#PZPW22212222222230112121118090000 +M520190111111115369120131103WTTTYPWZB222122222222 0422981 0000 +M42019011111111538020900403031163113 +M520190111111115380119920719WTTT0PWYB12222222222210112111115280000 +M520190111111115380120180601WTTTP0#B9222222222222 0422981 0000 +M42019011111111555820000403181162113 +M520190111111115558119900618WTTTPY#@922212222222210112111116190000 +M520190111111115558120170101WTTT0T#B9222122222222 0422981 0000 +M520190111111115558120110512WTTTPP0YW222122122222 0422011 0156 +M520190111111115558120080819WTTT09P#W222122122222 0422041 0232 +M520190111111115558120070714WTTT#T#ZW222122222222 0422051 0076 +M42019011111111559620000404271163113 +M520190111111115596119870114WTTTP@@YP22222122222250112111119350000 +M520190111111115596120100702WTTTPYPT0222221122222 0422021 0000 +M520190111111115596120040721WTTT0@99W222221122222 0422081 0000 +M42019011111111598720000406951013113 +M520190111111115987119750701WTTTYB#0Y22212222222210112111125510000 +M520190111111115987120130115WTTTYWBPB222122222222 0422981 0108 +M520190111111115987120060106WTTT0Y@BW222222222222 0422061 0000 +M42019011111111604520900406601163113 +M520190111111116045219780822WTTT0Y@W012222222222220112113200000000 +M520190111111116045119770619WTTT#0BBB12222112222220212111125310000 +M520190111111116045120160115WTTTPT#0B122221222222 0422981 0000 +M42019011111111641920900402921161113 +M520190111111116419119870519WTTTPTWT@22212222222210112112114850000 +M520190111111116419120160801WTTT0##Z#122122222222 0422981 0000 +M520190111111116419120110715WTTTY#PP@222122122222 0422011 0000 +M520190111111116419120070719WTTT#0BTW222222122222 0422051 0000 +M42019011111111659122700402231013113 +M520190111111116591119840119WTTTPWYYT22222122222250112111120800000 +M520190111111116591120170113WTTT##Y@@222221122222 0422981 0000 +M520190111111116591120130722WTTT0T@0Z222221222222 0422981 0000 +M42019011111111680221100406391013113 +M520190111111116802119760115WTTTP@#9012222222222210112121115521206 +M520190111111116802120070102WTTTPPBPY122222122222 0422041 0000 +M42019011111111684720900400501163113 +M520190111111116847119890623WTTT0P#@#22212222222210112121121250000 +M520190111111116847120150522WTTT0BTWW222122222222 0422981 0000 +M520190111111116847120090101WTTTP@YWZ222122122222 0422031 0375 +M42019011111111705021100406391163113 +M520190111111117050120000802WTTT0B9@Y12222222222210412081110990000 +M520190111111117050120160723WTTT0@BZT122222222222 0622981 0000 +M42019011111111715821700404101163113 +M520190111111117158119920702WTTT0TYTP12222222222210112111119040000 +M520190111111117158120150523WTTTYP09P122222222222 0422981 0000 +M520190111111117158120130723WTTTP@YZB122222122222 0422981 0000 +M42019011111111724820900404651163113 +M520190111111117248119840115WTTTY@@9P22222122222210112121121480000 +M520190111111117248120150501WTTT#ZT0Z222221222222 0422981 0000 +M520190111111117248120120623WTTTP#9P@122221222222 0422981 0000 +M520190111111117248120100114WTTT0TZ0Y122221122222 0422021 0000 +M42019011111111726321100403821163113 +M520190111111117263119900113WTTTYW9PB12222222222250112111129210000 +M520190111111117263120160613WTTTYP0YY222222122222 0422981 0000 +M520190111111117263120130106WTTT0YW@T122221222222 0422981 0000 +M42019011111111729321700402341163113 +M520190111111117293119940809WTTTY90Y922222122222210112081116320150 +M520190111111117293120180515WTTTY#B#W222221122222 0422981 0000 +M42019011111111733321400400351161113 +M520190111111117333119830515WTTTYBW0#22212222222210112112121440700 +M520190111111117333120100821WTTT#ZPPT222222222222 0422021 0000 +M520190111111117333120090819WTTTP0009222222222222 0422031 0000 +M520190111111117333120040519WTTTYPYY0222222122222 0422083 0000 +M42019011111111758920600403391163113 +M520190111111117589119730815WTTTYZBWP22222122222250112131120210000 +M520190111111117589120070623WTTTY#ZBB222221222222 0422051 0000 +M520190111111117589120041108WTTTYP9@Y222221122222 0422081 0000 +M42019011111111766420900403431161113 +M520190111111117664119890614WTTT#@P@W12222222222210112111100000000 +M520190111111117664120071112WTTTPBTZB122222222222 0422051 0000 +M42019011111111782121100404711163113 +M520190111111117821119860512WTTT0#@9@22222122222210112111112280000 +M520190111111117821120160116WTTTP@#9B222221122222 0422981 0000 +M520190111111117821120150714WTTT#TTB#222221122222 0422981 0000 +M520190111111117821120041121WTTTPW9T0222221122222 0422081 0000 +M42019011111111783322700403611163113 +M520190111111117833119780726WTTTY0PPZ22222122222210112111105180000 +M520190111111117833120180108WTTT0T00Y222222122222 0422981 0000 +M520190111111117833120110126WTTT0BBYW222221222222 0422011 0000 +M42019011111111783621700404101163113 +M520190111111117836119811106WTTTP0@TY22222122222210112111120770000 +M520190111111117836120070123WTTT#0B#T222221122222 0422041 0000 +M520190111111117836120070123WTTTPT0P#222221122222 0422041 0000 +M42019011111111789721700403151162113 +M520190111111117897119910119WTTTYW0PW12222222222210112121116860000 +M520190111111117897120160819WTTT#P@9P122221122222 0422981 0000 +M42019011111111792820600405471163113 +M520190111111117928119841102WTTTPWTB@22212222222210112132114200000 +M520190111111117928120170702WTTT#PPYT222222222222 0422981 0000 +M520190111111117928120150115WTTTYYPZZ222122222222 0422981 0000 +M42019011111111822620600401981163113 +M520190111111118226119840714WTTT0B9T922222112222210112121123740000 +M520190111111118226120081122WTTT#P0WB222221122222 0422041 0000 +M520190111111118226120070707WTTT#PP9B222221222222 0422051 0000 +M42019011111111844021200402561163113 +M520190111111118440119830118WTTT0YWW922222112222220212111125040000 +M520190111111118440119790821WTTTP9Y@P22222121222230112111200000926 +M520190111111118440120110512WTTTPBPY@222221222222 0422011 0136 +M520190111111118440120090121WTTT00YW9222221122222 0422031 0136 +M42019011111111887921400406651163113 +M520190111111118879119891126WTTT#BZ9P22222122222210112111113220000 +M520190111111118879120170526WTTT0T#@9222221122222 0422981 0000 +M42019011111111895821100406001163113 +M520190111111118958119820601WTTTY#0Z@12222222222210112112115250130 +M520190111111118958120081126WTTTYT9WZ122221222222 0422042 0000 +M520190111111118958120040821WTTTPW00P122221122222 0422082 0000 +M520190111111118958120020115WTTT#0#BW122221122222 0422102 0000 +M42019011111111905221100405971163113 +M520190111111119052219760121WTTT#WBTW22212222222220212112200000000 +M520190111111119052119670103WTTTPB#@@22212212222220112112121530000 +M520190111111119052120120112WTTT0##BP222122222222 0422982 0000 +M520190111111119052120080106WTTT0P#Y#222122122222 0422042 0000 +M520190111111119052120060116WTTTYT0@P222122122222 0422062 0000 +M520190111111119052120030515WTTTYT@@Y222122122222 0422092 0000 +M42019011111111939021400400351163113 +M520190111111119390220030601WTTTY#0TP22212222222210412113200000000 +M520190111111119390119840118WTTT#WWZW22212222222220112112126060000 +M520190111111119390120160802WTTT0@ZTZ122221222222 0422981 0670 +M520190111111119390120061112WTTTY9B@Z222122122222 0422063 0000 +M42019011111111940720600401981163113 +M520190111111119407119940102WTTTP99#B12222122222210112111115500000 +M520190111111119407120130126WTTTPBYTP122221222222 0422981 0000 +M42019011111111949620600405471992113 +M520190111111119496119920126WTTT0TZTZ12222222222210112121117310000 +M520190111111119496120130608WTTTPT#BW122222122221 0422981 0864 +M520190111111119496120100106WTTTYZWWT122222222222 0422021 0000 +M520190111111119496120080822WTTT##9ZB122222222222 0422041 0000 +M42019011111111973322700401931163113 +M520190111111119733119900126WTTT#Y00022222122222210112121128030000 +M520190111111119733120140107WTTT0ZZZ9222221122222 0422981 0000 +M520190111111119733120120715WTTT#WWPZ222221222222 0422981 0000 +M42019011111111973521700401121162113 +M520190111111119735119950715WTTTYZY9P12222222222210112981119500000 +M520190111111119735120150801WTTTPP099122221222222 0422981 0000 +M42019011111111974420600405341163113 +M520190111111119744119951126WTTTPB@YB22222222222210112081123940000 +M520190111111119744120160723WTTTYWTZ@222221122222 0422981 0000 +M42019011111111991320900406421162113 +M520190111111119913119871101WTTT#PTT@22222222222210112112113700000 +M520190111111119913120160603WTTTP9#YP122221222222 0422981 0200 +M520190111111119913120140116WTTT0WY9#122222222222 0422981 0200 +M520190111111119913120120114WTTT0YW0W222222122222 0422981 0200 +M520190111111119913120080719WTTTPZYY@122222122222 0422041 0200 +M42019011111112001322700400671163113 +M520190111111120013119830512WTTTYT@Y#22122222222210112111139900000 +M520190111111120013120050509WTTT#B@9#221222222222 0422071 0000 +M520190111111120013120040101WTTTPP#ZP221222122222 0422081 0000 +M520190111111120013120020819WTTTYT9P#221222122222 0422101 0000 +M520190111111120013120010714WTTTPWZ#B221222122222 0422111 0000 +M42019011111112008420000406951163113 +M520190111111120084119750702WTTTP0#TB22222222222250112111130930000 +M520190111111120084120050501WTTTPPYYB222122122222 0422071 0000 +M42019011111112009322700403941123113 +M520190111111120093119910114WTTT#PW0T22222122222210112121118960000 +M520190111111120093120170719WTTT0WZT0222222122222 0422981 0000 +M42019011111112029422700403241163113 +M520190111111120294119921102WTTTPY@0022222122222210112121121990000 +M520190111111120294120170115WTTTY#WZT222222122222 0422981 0000 +M520190111111120294120111115WTTT0WWP9122222222222 0422011 0000 +M42019011111112055122700400681161113 +M520190111111120551119810116WTTT0Z#B@12222222222210112131120080000 +M520190111111120551120100522WTTT##TYT122222122222 0422021 0000 +M520190111111120551120060615WTTTPZY09122222222222 0422061 0000 +M42019011111112069520600402121991113 +M520190111111120695119940501WTTT09Y0T22222122222210112111118020000 +M520190111111120695120121119WTTT#0@@9122221122222 0422981 0000 +M520190111111120695120110513WTTT#BB#Y122222222222 0422011 0000 +M42019011111112077720600405471161113 +M520190111111120777119831114WTTT090P@22222122222210112131115240000 +M520190111111120777120090702WTTTP9ZZP222221222222 0422031 0000 +M520190111111120777120040519WTTT0W#PZ222221122222 0422081 0000 +M42019011111112088922400402481163113 +M520190111111120889119980626WTTT#WZ0W22222122222210122081112670000 +M520190111111120889120180123WTTT#T#YY222221122222 0422981 0000 +M42019011111112096821100404801162113 +M520190111111120968119780613WTTT0BPZY22222122222210112111124820000 +M520190111111120968120040109WTTTP@#0Y222222222222 0422081 0000 +M42019011111112142621400400351163113 +M520190111111121426119930812WTTTYB90Y22212222222210112121100000149 +M520190111111121426120141116WTTTYP990222122122222 0422981 0000 +M42019011111112142921100403821163113 +M520190111111121429119840102WTTT#YWZ912222222222210112112100000000 +M520190111111121429120020614WTTTPTYZT122222122222 0422102 0000 +M520190111111121429120000101WTTTY0PZ#122222122222 0422112 0000 +M42019011111112145120000403721162113 +M520190111111121451119840719WTTT##9Y@22212222222210112121126000000 +M520190111111121451120160602WTTT#WT9Y222122122222 0422981 0000 +M520190111111121451120050526WTTTY##Y0222122122222 0422071 0000 +M42019011111112147720600405171161113 +M520190111111121477119810715WTTT#W9WT22222122222210112121119340000 +M520190111111121477120150118WTTT#B@0B222221122222 0422981 0000 +M520190111111121477120040618WTTT#ZT#9222122122222 0422081 0000 +M42019011111112161022700403241161113 +M520190111111121610119870101WTTTY0BWY22222222222230112111114530000 +M520190111111121610120141119WTTTBTTYT222222222222 0422981 0000 +M520190111111121610120120121WTTT0#PB0222222122222 0422981 0000 +M42019011111112174420600402121163113 +M520190111111121744119900819WTTT099WY22222122222210112121111800000 +M520190111111121744120160701WTTTPZZW0222221122222 0422981 0000 +M42019011111112195520600401151163113 +M520190111111121955119950802WTTT0YB9W12222222222210112111113440000 +M520190111111121955120140818WTTT#0ZT#122222122222 0422981 0000 +M520190111111121955120120706WTTT0BY0#122222222222 0422981 0000 +M42019011111112195921100406541163113 +M520190111111121959119870119WTTT09#YB22122222222210112111122880000 +M520190111111121959120180101WTTTY09ZZ222222122222 0422981 0000 +M520190111111121959120130702WTTTPPTBZ222222122222 0422981 0000 +M42019011111112213822700403351993113 +M520190111111122138119670707WTTTYBT#922222122222220122111308470000 +M520190111111122138119650123WTTT#@PTZ22222111222220222111133011594 +M520190111111122138120001123WTTTYTY0@222221122222 0422121 0797 +M42019011111112222022700403611161113 +M520190111111122220119920514WTTTP9B0@11222222222210112121121500000 +M520190111111122220120100618WTTT#@9BY122221122222 0422021 0000 +M520190111111122220120080823WTTT0ZTT#122122122222 0422041 0188 +M42019011111112225220500402421991113 +M520190111111122252119950123WTTT#0PZ@22212222222210112111118930149 +M520190111111122252120160102WTTTYY@9P222122222222 0422981 0000 +M42019011111112233820600400291163113 +M520190111111122338119910506WTTTPY9PW12222222222210112111114620000 +M520190111111122338120130103WTTT#0P9P122222122222 0422981 0000 +M520190111111122338120110101WTTT#@900122221122222 0422011 0000 +M520190111111122338120080715WTTT00Z9#122222122222 0422041 0000 +M520190111111122338120060126WTTTYZWTP122222122221 0422061 0864 +M42019011111112247521700406571162113 +M520190111111122475119810715WTTT0TBZW12222222222220112121119740313 +M520190111111122475120160123WTTT0Z09T122222222222 0422981 0000 +M520190111111122475120080106WTTTY@P#9122221222222 0422041 0000 +M42019011111112254420600401981161113 +M520190111111122544119870501WTTTYP9PZ12222222222210112121115550000 +M520190111111122544120080119WTTTYBT@T222222122222 0422031 0000 +M42019011111112271422200404361163113 +M520190111111122714119920613WTTT#9T@@22222122222210112111117980000 +M520190111111122714120160119WTTT0#00Y222221222222 0422981 0000 +M42019011111112276020600405941163113 +M520190111111122760119911102WTTT#TYTP22222122222230112121128930000 +M520190111111122760120150109WTTTPZYW0222222122222 0422981 0000 +M520190111111122760120120519WTTTPYW0@222221222222 0422981 0000 +M42019011111112289522400400121993113 +M520190111111122895119790815WTTTPP#0B22222222222210112111136400000 +M520190111111122895120180621WTTT#WBY#122222222222 0422981 0000 +M520190111111122895120180621WTTT0P9@Y122222222222 0422981 0000 +M42019021111111117921400400351163113 +M520190211111111179219870114WTTTY#Z9Y22222222222220112113200000000 +M520190211111111179119800726WTTT#0#9@22222212222210212112121670000 +M520190211111111179120180521WTTTPYB#W222122122222 0422981 0000 +M520190211111111179120130615WTTTY@YBW222222222222 0422983 0000 +M520190211111111179120080126WTTT0ZB9T222222222222 0422043 0000 +M42019021111111129220900406601162113 +M520190211111111292119730102WTTTYTPTW22222122222230112111121440000 +M520190211111111292120070606WTTTP##@#222221122222 0422051 0000 +M42019021111111174220600402031163113 +M520190211111111742119680126WTTT##BZ#22212222222230112121118570000 +M520190211111111742120030615WTTTPZTWP222122122222 0422091 0000 +M42019021111111201121400400351163113 +M520190211111112011119670626WTTTY@0@Z22212222222220112111123060000 +M520190211111112011120070618WTTTY@#YP222122122222 0422051 0000 +M42019021111111212520000401451163113 +M520190211111112125119880703WTTT#BT9P22222122222210112121112780000 +M520190211111112125120170715WTTT#PTB0222222122222 0422981 0000 +M520190211111112125120100502WTTT0WPTB222222222222 0422021 0000 +M42019021111111216920900406131162113 +M520190211111112169119780112WTTTYYZ@P22212222222210112121129230000 +M520190211111112169120030712WTTTP@0##122222222222 0422091 0000 +M520190211111112169120010715WTTT0WZ0@222221122222 0422111 0000 +M42019021111111217020600402031163113 +M520190211111112170119830614WTTT090Y922212222222210112121125810000 +M520190211111112170120110121WTTT0##PW222122122222 0422011 0304 +M520190211111112170120030506WTTTY9TB@222122122222 0422091 0000 +M42019021111111274321700401121163113 +M520190211111112743119960709WTTTYP#WY22212222222210112121115980000 +M520190211111112743120170801WTTTPT#PT222122122222 0422981 0000 +M520190211111112743120160121WTTT0T0Y@222122222222 0422981 0000 +M42019021111111285920600402121163113 +M520190211111112859119790118WTTTBTT@022122212222220112082124890000 +M520190211111112859119781126WTTTY@#TZ22122222222220212112117080000 +M520190211111112859120080101WTTTYB0WB221222122222 0422042 0000 +M520190211111112859120060113WTTTYWB#0221222222222 0422062 0000 +M520190211111112859120030626WTTTP##Y#221222122222 0422092 0000 +M42019021111111301420900403031163113 +M520190211111113014119780626WTTTP0PP922212222222210112112116820000 +M520190211111113014120130107WTTTPW@PT222222222222 0422981 0000 +M520190211111113014120120515WTTTYZ99B222222122222 0422981 0000 +M520190211111113014120081114WTTT0@T9W222122122221 0422041 0789 +M42019021111111315221100401181163113 +M520190211111113152119840507WTTT0YP0Y12222222222230112122119590000 +M520190211111113152120130723WTTTY#B@#222222122222 0422981 0000 +M520190211111113152120090121WTTT0TWT0122222122222 0422031 0000 +M42019021111111323720500404091163113 +M520190211111113237119810109WTTT#B0T@22222122222220112111115220000 +M520190211111113237119800516WTTTYBZZW22222112222210212111116900000 +M520190211111113237120160119WTTT0ZTP#222222222222 0422981 0000 +M520190211111113237120071108WTTT00T0W222221222222 0422051 0000 +M520190211111113237120010123WTTT#TPPY222221122222 0422111 0000 +M42019021111111335322700402581163113 +M520190211111113353119850121WTTT#PPB012222222222210112111114040000 +M520190211111113353120160516WTTTYWPW0122221222222 0422981 0000 +M42019021111111356721700403911163113 +M520190211111113567119900615WTTT00B9W22222112222210112111115330000 +M520190211111113567120130603WTTTYZ#@Y222221122222 0422981 0000 +M42019021111111385620900404651163113 +M520190211111113856119910615WTTT#0PPT22212222222210112081118680000 +M520190211111113856120130526WTTT#@TTT222122222222 0422981 0000 +M42019021111111429021700406571161113 +M520190211111114290119920115WTTTPYZZB12222222222210112111116900000 +M520190211111114290120160701WTTT#Z@Z0122222122222 0422981 0000 +M520190211111114290120110516WTTT0WTWP122222122222 0422011 0000 +M42019021111111449222700400671163113 +M520190211111114492119930112WTTT#W#ZP12222222222210112111127250000 +M520190211111114492120170519WTTT#BP0Y122222122222 0422981 0000 +M42019021111111476221100404801162113 +M520190211111114762119800702WTTTPT9YY12222222222210112111119680000 +M520190211111114762120130101WTTT0YZPT122222122222 0422981 0000 +M520190211111114762120040621WTTT#090T122222122222 0422081 0000 +M42019021111111491822200402941163113 +M520190211111114918119840616WTTTY@0@P22222122222210112111117740000 +M520190211111114918120160626WTTT#WBYT222222122222 0422981 0000 +M520190211111114918120130106WTTTYP@#0222222122222 0422981 0000 +M42019021111111497121100406001163113 +M520190211111114971119910715WTTTP9@Y@12222222222210112081120320000 +M520190211111114971120170121WTTT#TB90122222122222 0422981 0000 +M520190211111114971120160113WTTT0Z@90222222222222 0422981 0000 +M520190211111114971120070519WTTT0T#W0122222122222 0422051 0000 +M42019021111111527720900403071013113 +M520190211111115277119721101WTTTYPW9#22212222222210112111121290000 +M520190211111115277120060609WTTTYT0BY222122222222 0422061 0768 +M42019021111111552520000404271163113 +M520190211111115525119800715WTTT0ZP9Y22122222222210112112129020000 +M520190211111115525120120501WTTT0ZYWY222222222222 0422981 0000 +M520190211111115525120090515WTTTPT#ZP221222222222 0422031 0000 +M520190211111115525120030626WTTTYTZWZ222222222222 0422091 0230 +M42019021111111553621700401091163113 +M520190211111115536119890123WTTTYWTTW22222122222210112111119530000 +M520190211111115536120170721WTTT0@ZPP222221222222 0422981 0000 +M520190211111115536120120514WTTT0WYWB222221122222 0422981 0000 +M42019021111111556821700402381163113 +M520190211111115568119900101WTTT0TPWY12222222222230112121122580000 +M520190211111115568120160723WTTTP9@WB122222222222 0422981 0000 +M520190211111115568120110109WTTT##@#@222121122222 0422011 0000 +M42019021111111565120600400871162113 +M520190211111115651119910715WTTT0B@W912222222222210112111126400000 +M520190211111115651120130103WTTTPT#@@122222222222 0422981 0000 +M42019021111111584521100403821993113 +M520190211111115845119870118WTTTYWTB@12212222222210112112119240000 +M520190211111115845120130102WTTT0WP9B222222122222 0422981 0000 +M520190211111115845120120115WTTTP#T9B222222122222 0422981 0000 +M42019021111111596720900404621161113 +M520190211111115967119920123WTTTYTZ9@22222222222210112081112300050 +M520190211111115967120160721WTTT#Z00B222222122222 0422981 0000 +M42019021111111619620300404191993113 +M520190211111116196119920701WTTT#YYYP22222122222210112111118440000 +M520190211111116196120160819WTTTY@YT9222221122221 0422981 0141 +M42019021111111634421700405821163113 +M520190211111116344119970815WTTTPT9T#12222122222220112111118310000 +M520190211111116344120140606WTTTP9TP@122221122222 0422981 0000 +M42019021111111643822700400671162113 +M520190211111116438119830614WTTT#@09P12222222222210112121128810000 +M520190211111116438120160115WTTTPY9ZT222222222222 0422981 0000 +M520190211111116438120060706WTTT0009T122222222222 0422061 0000 +M42019021111111646221400400351161113 +M520190211111116462119800619WTTTYBWWB12222222222210112121118350000 +M520190211111116462120130108WTTTP0ZY@122222222222 0422981 0000 +M520190211111116462120030601WTTTPYTPB122222222222 0422091 0000 +M42019021111111672520000404071161113 +M520190211111116725119870121WTTTPY9@@12222222222210112122125590000 +M520190211111116725120181116WTTT#ZTP0222222222222 0422981 0000 +M520190211111116725120100606WTTTY#@#B222122122222 0422021 0000 +M520190211111116725120050119WTTT0B0PZ122222122222 0422071 0000 +M42019021111111678022700402321163113 +M520190211111116780119900702WTTTY009Y22222122222210112111113610000 +M520190211111116780120150503WTTT#W9BB222222222222 0422981 0000 +M42019021111111710020900406131161113 +M520190211111117100119830709WTTTY90##12222222222210112081120500000 +M520190211111117100120130115WTTTYW@9#122222222222 0422981 0000 +M520190211111117100120060522WTTTY0WP#122222222222 0422061 0000 +M520190211111117100120040715WTTT0TP99122222222222 0422081 0000 +M520190211111117100120010802WTTT#BW0@122222222222 0422111 0000 +M42019021111111728921100401691993113 +M520190211111117289119900716WTTTY09#B22222212222220222111200000000 +M520190211111117289119860723WTTT0ZT@922222122222210112141115190000 +M520190211111117289120130107WTTTYT9WP222221122222 0422981 0000 +M42019021111111806022700403941162113 +M520190211111118060119860801WTTT0W@9022212222222210112121119100000 +M520190211111118060120130601WTTTYTWW@222122122222 0422981 0000 +M520190211111118060120090612WTTTP0YT#222122122222 0422031 0000 +M42019021111111836921100401691163113 +M520190211111118369119780115WTTT#PZW022222122222220112121124270000 +M520190211111118369120041101WTTT0Z@0Y222221122222 0422081 0000 +M42019021111111857320600401151162113 +M520190211111118573119900701WTTTYP0BP12222222222210112131113220000 +M520190211111118573120170519WTTTYT#B@222222222222 0422981 0000 +M520190211111118573120130101WTTTY#PZ9122222222222 0422981 0400 +M42019021111111870121100401691163113 +M520190211111118701119880107WTTTYPPTP22212222222210112122117470149 +M520190211111118701120161101WTTTYBY@#222222222222 0422981 0000 +M42019021111111880020000406951163113 +M520190211111118800119850108WTTT#P@##22212222222210112131118120000 +M520190211111118800120150501WTTT0Z9BB222122122222 0422981 0000 +M42019021111111900222700403611161113 +M520190211111119002119850819WTTTYZWBT22222122222210112121117660000 +M520190211111119002120100619WTTT#090@122222222222 0422021 0000 +M520190211111119002120080121WTTTYTWZT122221222222 0422041 0000 +M520190211111119002120050114WTTT0T@0T222221222222 0422071 0000 +M42019021111111904520600405341162113 +M520190211111119045119830118WTTTP#@T912222222222210112111109530000 +M520190211111119045120170523WTTT#YTWY222221122222 0422981 0000 +M42019021111111912921700404101163113 +M520190211111119129119850101WTTTY9#Z@12222122222210112111120870000 +M520190211111119129120040706WTTT0YYPW122221222222 0422081 0000 +M520190211111119129120030801WTTTPPP9Y122221122222 0422091 0000 +M42019021111111917821400400351163113 +M520190211111119178119741126WTTT0B@Y@22212222222220112112118880250 +M520190211111119178120110819WTTTP9YPB222122222222 0422011 0000 +M42019021111111932520600402981013113 +M520190211111119325119930123WTTT#YZW#22212222222210112131116450000 +M520190211111119325120130815WTTTYP@ZP222122222222 0422981 0000 +M42019021111111944620900406421162113 +M520190211111119446119860602WTTTPPZTP12222222222210112121109530000 +M520190211111119446120130701WTTTY09YZ122222222222 0422981 0000 +M520190211111119446120070107WTTT00T99222222222222 0422051 0000 +M520190211111119446120020112WTTT0B##@122222222222 0422101 0000 +M42019021111111944721100401181161113 +M520190211111119447119850126WTTT00@0Y22222122222210112111116600000 +M520190211111119447120120102WTTT00WTB122221122222 0422981 0000 +M520190211111119447120051108WTTTY0PZB222122222222 0422071 0000 +M42019021111111969021200404541163113 +M520190211111119690119850626WTTTYT09Y12222122222230112131119760000 +M520190211111119690120140102WTTT#@#@W122221122222 0422981 0845 +M42019021111111975120900402921162113 +M520190211111119751119880615WTTT#B@0W22212222222210112121119670000 +M520190211111119751120170115WTTT09P9Y222222222222 0422981 0000 +M520190211111119751120070121WTTTP@0B@222122222222 0422051 0000 +M42019021111112013820600401421163113 +M520190211111120138119800502WTTT0PZ9B12222222222230112111121810000 +M520190211111120138120060116WTTTPWW@B122222122222 0422061 0000 +M520190211111120138120040115WTTT0##ZB122222222222 0422081 0000 +M520190211111120138120020701WTTT0@WBT122222222222 0422101 0000 +M42019021111112016621700403971163113 +M520190211111120166119660615WTTT0#@0P22222122222250112111125920000 +M520190211111120166120050814WTTT0TBY#222221222222 0422071 0000 +M42019021111112028820900403071163113 +M520190211111120288119720102WTTT#B#0W22212222222210112121117960000 +M520190211111120288120101114WTTT0YBBY222122122222 0422021 0000 +M520190211111120288120060701WTTTYB0TB222122222222 0422061 0000 +M520190211111120288120020801WTTTP#TW#222122122222 0422101 0000 +M42019021111112036621100401461163113 +M520190211111120366119890619WTTTPBT#@22222122222210112111122530000 +M520190211111120366120110109WTTTY9W@W222221122222 0422011 0000 +M42019021111112043321400406901163113 +M520190211111120433219800101WTTTP@P@Z22222222222220212113200000000 +M520190211111120433119750119WTTT00BWZ22222112222210112111125750000 +M520190211111120433120170512WTTT#9ZZB222221222222 0422981 0000 +M520190211111120433120150814WTTTYYB0W222222222222 0422981 0000 +M42019021111112062120900406601161113 +M520190211111120621119900501WTTT#9@@@12222222222210112121125730000 +M520190211111120621120160616WTTTPWZ#Z122221122222 0422981 0000 +M520190211111120621120110615WTTT0Z9WP122221122222 0422011 0035 +M520190211111120621120100115WTTT#W9WB122221122222 0422021 0035 +M42019021111112084620000403951163113 +M520190211111120846119860118WTTTP0WZ@22212222222210112121129310000 +M520190211111120846120160512WTTT#9@0Z222222222222 0422981 0000 +M520190211111120846120111115WTTTY9B#B222122122222 0422011 0462 +M520190211111120846120050718WTTTPZZP0222122222222 0422071 0000 +M42019021111112088821100406001163113 +M520190211111120888119911108WTTT0ZPYP22222122222230112121119460000 +M520190211111120888120130114WTTT0ZP0Z222221222222 0422981 0000 +M42019021111112110720000404071163113 +M520190211111121107119870101WTTT09PYZ22212222222210112131114990000 +M520190211111121107120160703WTTTYZZ9Z222222122222 0422981 0000 +M520190211111121107120080101WTTT0@W@#222122122222 0422041 0000 +M42019021111112120920600400871161113 +M520190211111121209119890723WTTTPPZZW12222222222210112111119750000 +M520190211111121209120150606WTTT0P#9T122222222222 0422981 0000 +M520190211111121209120131113WTTTY9#BT122222122222 0422981 0000 +M520190211111121209120120621WTTTPB@0Z122222222222 0422981 0000 +M42019021111112154120900402921162113 +M520190211111121541119920123WTTTPTB0Y22212222222210112081127220000 +M520190211111121541120160122WTTTPT9@P222222222222 0422981 0000 +M42019021111112174621700406571193113 +M520190211111121746119850701WTTTPY9#@22212222222210112142129200000 +M520190211111121746120110615WTTTY00@#222121222222 0422011 0000 +M520190211111121746120090526WTTT#ZW#@222122122222 0422031 0000 +M42019021111112215820000406951163113 +M520190211111122158119870719WTTT00PBP22222122222210112121113690000 +M520190211111122158120140123WTTTBT9#P222122222222 0422981 0000 +M520190211111122158120060616WTTT#ZTZY222221122222 0422061 0000 +M42019021111112254021400400351162113 +M520190211111122540119840126WTTTYYZ0#22222122222210112111130640000 +M520190211111122540120160102WTTTYWB#@222221222222 0422981 0000 +M520190211111122540120140718WTTT0P0Z9222222122222 0422981 0000 +M520190211111122540120061107WTTTPYYYW222221122222 0422061 0000 +M520190211111122540120050103WTTTYT@TP222221222222 0422071 0000 +M42019021111112287121100406001163113 +M520190211111122871119930806WTTTP09YY12222222222220112112117690000 +M520190211111122871120161119WTTT0PB09122222122222 0422981 0000 +M42019021111112296722700402581162113 +M520190211111122967119930119WTTTYP9PT22222122222210112111100000000 +M520190211111122967120170715WTTTP#@WY222221222222 0422981 0000 +M520190211111122967120150601WTTTP#BWB222222222222 0422981 0000 +M42019031111111140420600403391161113 +M520190311111111404119770701WTTTYTYPW12222222222210112121122160000 +M520190311111111404120120801WTTT0WZWT122222122222 0422981 0000 +M520190311111111404120050102WTTTP90ZW122222222222 0422071 0000 +M520190311111111404120040615WTTTPTWY9222122222221 0422081 0885 +M42019031111111163320900402921161113 +M520190311111111633119860102WTTTYB##T12222222222210112982112630000 +M520190311111111633120160103WTTTYPTYT122122122222 0422981 0000 +M520190311111111633120060815WTTT##PWZ122222122222 0422061 0700 +M520190311111111633120040609WTTT009P@122222222222 0422082 0000 +M42019031111111188321100402161162113 +M520190311111111883119730719WTTTYYY#022222122222210112111117160000 +M520190311111111883120130507WTTTY9ZY#222222122222 0422981 0000 +M520190311111111883120070722WTTTYP@W9222221222222 0422051 0000 +M520190311111111883120050502WTTTP#B@B222221122222 0422071 0000 +M520190311111111883120030101WTTTPW@09222221222222 0422091 0000 +M42019031111111222020600405171161113 +M520190311111112220119940618WTTTP0PWW12222222222210112111113520000 +M520190311111112220120150123WTTTYTW9Y122222122222 0422981 0000 +M520190311111112220120130501WTTT#PW@0122222222222 0422981 0000 +M42019031111111239722700405241163113 +M520190311111112397119830619WTTT#9#0B22222122222210112131119920000 +M520190311111112397120170603WTTTY#ZBP222221222222 0422981 0000 +M520190311111112397120090703WTTT#0Z@@222221222222 0422031 0063 +M42019031111111240421100401551163113 +M520190311111112404119850119WTTT0YTB#12222222222210112111123440000 +M520190311111112404120120119WTTT#TBY#222222122222 0422981 0000 +M520190311111112404120091119WTTT#PPT9222222122222 0422031 0000 +M520190311111112404120040519WTTT##@TY122222122222 0422081 0148 +M42019031111111245520600401151161113 +M520190311111112455119860113WTTTP#PZ012222222222210112131136600000 +M520190311111112455120100502WTTT#BZPP122222122222 0422021 0000 +M42019031111111248320600401981193113 +M520190311111112483119920106WTTT09@Z012222222222210112081119450000 +M520190311111112483120140806WTTT0BYBY222222222222 0422981 0000 +M520190311111112483120100714WTTTYWPYZ122222122222 0422021 0000 +M42019031111111249720900400501163113 +M520190311111112497119760507WTTTP@WB922212222222210112121123400000 +M520190311111112497120140826WTTT#@#99222122122222 0422981 0000 +M520190311111112497120090526WTTTPB#9#222122222222 0422031 0000 +M42019031111111257521100401181161113 +M520190311111112575119860112WTTTPW@#912222222222210112111114630000 +M520190311111112575120150601WTTT0BZ09122222222222 0422981 0000 +M520190311111112575120080123WTTTP0T@W222222122222 0422041 0000 +M42019031111111275320000400801163113 +M520190311111112753119800513WTTTYBZPB22122222222220212112116670000 +M520190311111112753119740701WTTT#@T9B22122212222220112112128320000 +M520190311111112753120171102WTTT#9BYB222222122222 0422981 0000 +M520190311111112753120140713WTTT00B9P221222122222 0422981 0000 +M520190311111112753120110626WTTTYPY@B221222122222 0422011 0000 +M520190311111112753120081107WTTT#BZ@W221222122222 0422041 0000 +M42019031111111303320600402031013113 +M520190311111113033119860103WTTT##W0Z22212222222210112121121880000 +M520190311111113033120130113WTTTYY9T0222122222222 0422981 0000 +M520190311111113033120090122WTTT#0Y0P222122122222 0422031 0000 +M42019031111111313920000403721993113 +M520190311111113139119790519WTTTPT@P912222122222210112111118990000 +M520190311111113139120160609WTTTPB#WB222222222222 0422981 0000 +M42019031111111316020600401151163113 +M520190311111113160119760112WTTT0Z@#W12222222222250112111119470000 +M520190311111113160120060126WTTTP9ZW@222222122222 0422061 0221 +M520190311111113160120030115WTTT0T#9T222222122222 0422091 0221 +M42019031111111325421700402341163113 +M520190311111113254119710709WTTTPYPB#12222222222230122121126760000 +M520190311111113254120090101WTTTYZYPZ122222222222 0622041 0000 +M42019031111111362521200404681163113 +M520190311111113625119950101WTTTY#TBW12222222222210112111118510000 +M520190311111113625120171115WTTT#PBBY222222222222 0422981 0000 +M520190311111113625120090101WTTTPB9TB122222222222 0422031 0092 +M42019031111111392920600401421162113 +M520190311111113929119940626WTTTPB@#Z12222222222210112121118620000 +M520190311111113929120150121WTTTPPZZ#122222222222 0422981 0000 +M520190311111113929120110701WTTT0YP0P222222222221 0422011 0801 +M42019031111111410722700403941163113 +M520190311111114107119700115WTTT00ZY022222122222250122141114260000 +M520190311111114107120140126WTTTPYZY#222221222222 0622981 0000 +M520190311111114107120100818WTTTYZTY@222221222221 0622021 0602 +M42019031111111414321400403641162113 +M520190311111114143119770113WTTTPPWY#22212212222210112111131590000 +M520190311111114143120080122WTTT09@ZP222222222222 0422041 0000 +M520190311111114143120060816WTTTYW0T0122222122222 0422061 0000 +M520190311111114143120050526WTTT0WBPY222122122222 0422071 0000 +M520190311111114143120010506WTTT0BYT#222122122222 0422111 0000 +M42019031111111438721100406001163113 +M520190311111114387119930515WTTTYT09922221222222230112111118680000 +M520190311111114387120170106WTTT0@BPY122222122222 0422981 0000 +M520190311111114387120140103WTTTPZTY#222222222222 0422981 0000 +M42019031111111454822700400671013113 +M520190311111114548119700602WTTTYPPYY22222122222250112121119860000 +M520190311111114548120040715WTTT0T@P@222221122222 0422081 0022 +M42019031111111505721700406341163113 +M520190311111115057119860119WTTT##ZP@22222222222210112131121240000 +M520190311111115057120160112WTTTYBBP0222222222222 0422981 0000 +M520190311111115057120070602WTTT0W@TY222222222222 0422051 0000 +M42019031111111513620600400871163113 +M520190311111115136119930601WTTTYPPPZ12222222222210112111123200000 +M520190311111115136120130715WTTTP9WW9122222122222 0422981 0000 +M520190311111115136120120606WTTT#9W@#122222122222 0422981 0000 +M42019031111111521720600403391163113 +M520190311111115217119860115WTTTP@PP#12222222222210112111125290000 +M520190311111115217120130615WTTTPP99#222122122222 0422981 0000 +M42019031111111529721400406791161113 +M520190311111115297119891109WTTT0T0ZT12222222222210112131118110000 +M520190311111115297120160719WTTTYWZWW222222222222 0422981 0000 +M520190311111115297120140107WTTT0PYPW122221222222 0422981 0000 +M520190311111115297120100707WTTTPTWT9122222122222 0422021 0000 +M42019031111111564920600406321013113 +M520190311111115649219890619WTTT0PT9@22212222222220112113200000000 +M520190311111115649119870102WTTT0#@TZ22212212222220212111139470000 +M520190311111115649120181119WTTTYBT#Y222222122222 0422981 0000 +M520190311111115649120170715WTTTP0B90222122122222 0422981 0000 +M42019031111111567422400402111993113 +M520190311111115674119940523WTTT0#BW#22212222222210112112114990000 +M520190311111115674120180619WTTTY@TBZ222122222222 0422981 0000 +M42019031111111575221700404101162113 +M520190311111115752119811112WTTTY0ZZ922212222222230112121116650000 +M520190311111115752120180101WTTTPWTT0222222122222 0422981 0000 +M520190311111115752120080814WTTTYT0#T222122222222 0422041 0000 +M520190311111115752120030801WTTT0ZZ@B222122122222 0422091 0000 +M42019031111111599021200406661163113 +M520190311111115990119860709WTTTYZ@YT22222122222210112131121460000 +M520190311111115990120150523WTTT00ZW@222222122222 0422981 0000 +M520190311111115990120150523WTTT#9WTB222222122222 0422981 0000 +M520190311111115990120050518WTTTYPTZ0222221222222 0422071 0121 +M42019031111111636522200402491163113 +M520190311111116365119710726WTTT0TZWT22222112222230112131121410000 +M520190311111116365120060706WTTTY00Y0222221122222 0422061 0000 +M520190311111116365120040719WTTTP0PPP222221122222 0422081 0000 +M42019031111111639921100405971163113 +M520190311111116399119871115WTTT#9@9T12222122222210112111132320000 +M520190311111116399120140121WTTTYWW#B122222122222 0422981 0000 +M520190311111116399120100712WTTTP@YPW122222222222 0422021 0000 +M520190311111116399120050102WTTTP@9B@122221122222 0422071 0000 +M42019031111111641321100401181163113 +M520190311111116413119830101WTTT#9YT912222222222210112122124390500 +M520190311111116413120091109WTTTYYZZZ122222222222 0422031 0000 +M520190311111116413120070121WTTT0W@@#122222122222 0422051 0000 +M520190311111116413120060815WTTTPBYZP122222122222 0422061 0000 +M520190311111116413120020602WTTTP#99B122222122222 0422101 0000 +M42019031111111642120000400921163113 +M520190311111116421119840118WTTT0PWWP22212222222250112121116430000 +M520190311111116421120140126WTTT0ZW0Z222122122222 0422981 0000 +M520190311111116421120120601WTTTYWTBW222122122222 0422981 0000 +M520190311111116421120080701WTTTYZW#0222122122222 0422041 0000 +M42019031111111651922400401471993113 +M520190311111116519119790712WTTT#WBB022222122222250112111125220000 +M520190311111116519120080706WTTT0ZWT#222221222222 0422041 0000 +M520190311111116519120030708WTTTY9TYY222221222222 0422091 0000 +M42019031111111653321700406831163113 +M520190311111116533119880612WTTT#Z@PY22222112222210112111122390000 +M520190311111116533120090601WTTT0@P#P222221222222 0422031 0000 +M42019031111111685320900406421161113 +M520190311111116853119830118WTTTYT0Y922212222222230112122200000000 +M520190311111116853119610118WTTT0Y00022212212222220212981229050000 +M520190311111116853120151102WTTT0@##Y222122122222 0422981 0000 +M520190311111116853120130723WTTT00Z9B222222222222 0422981 0000 +M520190311111116853120120715WTTTP@B#T222222122222 0422981 0000 +M520190311111116853120090815WTTT#BZ99222122122222 0422031 0000 +M520190311111116853120060516WTTTY9TBY222122222222 0422061 0000 +M520190311111116853120020601WTTTBTZPW222122122222 0422102 0000 +M42019031111111704721400400351163113 +M520190311111117047119860102WTTTPTPZY22222122222230112111116120000 +M520190311111117047120170115WTTTYW###222222222222 0422981 0000 +M42019031111111716321400406791991113 +M520190311111117163119890607WTTTYPW@@12222222222210112131115910000 +M520190311111117163120150702WTTT0T#T0122222122222 0422981 0000 +M42019031111111750420900402921163113 +M520190311111117504119870109WTTTYWZBP22212222222210112131121650000 +M520190311111117504120110719WTTT##YWP222222122222 0422011 0000 +M42019031111111791321400400351163113 +M520190311111117913119660101WTTT#TT0Y22212222222230112111123180000 +M520190311111117913120020606WTTT0WP##222122122222 0422101 0000 +M42019031111111819821200402291163113 +M520190311111118198119910123WTTTY@#T922222222222210112131112830241 +M520190311111118198120150107WTTTYYW09222222222222 0422981 0000 +M42019031111111860720000401061163113 +M520190311111118607119860115WTTT00ZTB12222122222210112131131740000 +M520190311111118607120150806WTTTYT9Z#222222122222 0422981 0000 +M520190311111118607120120501WTTT#PYWT122221222222 0422981 0000 +M42019031111111869322700403941993113 +M520190311111118693119790119WTTTY9TBT22222122222210112111127580000 +M520190311111118693120150521WTTTY@W0P222221222222 0422981 0000 +M520190311111118693120110518WTTT#BT00222221222222 0422021 0000 +M42019031111111894922700403611162113 +M520190311111118949119900101WTTTPTTWY22222122222210112121114900000 +M520190311111118949120140119WTTTPW9Z@222121122222 0422981 0000 +M520190311111118949120110121WTTT0P0YW222222222222 0422011 0000 +M520190311111118949120070102WTTTPT0YY222221122222 0422051 0000 +M42019031111111910120900400501163113 +M520190311111119101119910801WTTTPW9#022212222222210112081115840149 +M520190311111119101120180101WTTTY9ZB9222122222222 0422981 0000 +M42019031111111923121700402381013113 +M520190311111119231119920622WTTT0W9ZT22222112222210112111123890000 +M520190311111119231120110621WTTT0W@Y9222222122222 0422011 0000 +M42019031111111933021700401121012113 +M520190311111119330119820819WTTTYPP#B12222222222210112131116510000 +M520190311111119330120080101WTTT0@PYY122222222222 0422041 0000 +M42019031111111985321100401181162113 +M520190311111119853119940712WTTT0Y9#@12222222222210112121124110000 +M520190311111119853120140708WTTTYZB9Z122222222222 0422981 0000 +M520190311111119853120110615WTTT0@9TZ122222222221 0422011 0158 +M520190311111119853120091101WTTTY9TWZ122222122222 0422031 0000 +M42019031111112000221100403821163113 +M520190311111120002119870702WTTTPZBYB22222222222210112111100000000 +M520190311111120002120150606WTTTYPZZY122222222222 0422981 0000 +M520190311111120002120140115WTTTY0Y#0222222122222 0422981 0000 +M42019031111112020320000404151161113 +M520190311111120203119800115WTTT#PPW@22122222222210112111124700000 +M520190311111120203120160813WTTTP09@B221222222222 0422981 0000 +M520190311111120203120110119WTTTYP0Y#221222122222 0422011 0000 +M520190311111120203120030716WTTT#0@@Z221222122222 0422091 0480 +M520190311111120203120020619WTTTPZ#0Y221222122222 0422101 0000 +M42019031111112024120900406131163113 +M520190311111120241119840102WTTT#@PYT12222222222210112111130410000 +M520190311111120241120170815WTTTPZWT0122222122222 0422981 0000 +M520190311111120241120030801WTTT0P@#B122222122222 0422091 0000 +M42019031111112024321100404791162113 +M520190311111120243119920801WTTTYTZ@B22222122222210112111112900000 +M520190311111120243120170115WTTT00W@P222221222222 0422981 0000 +M520190311111120243120150519WTTT0W9W9222221122222 0422981 0000 +M520190311111120243120110626WTTT0TW@B222221222222 0422011 0080 +M42019031111112047420600401151993113 +M520190311111120474119810116WTTT0P@YY12222122222210112111120800000 +M520190311111120474120040706WTTT0#BTT122222122222 0422081 0000 +M520190311111120474120030719WTTTYP0Y@122222122222 0422091 0000 +M42019031111112052720900403031163113 +M520190311111120527119930507WTTTPPT@Z22212222222210112111113050000 +M520190311111120527120150714WTTTY@@TY222122122222 0422981 0000 +M42019031111112071320500402421161113 +M520190311111120713119890101WTTT00YTT22222122222210112121126300000 +M520190311111120713120160702WTTTP##@W222222222222 0422981 0000 +M520190311111120713120100115WTTT0WZTB222222222222 0422021 0000 +M42019031111112080321100401691163113 +M520190311111120803119931106WTTTYZ99T22222122222210112111117550000 +M520190311111120803120180701WTTTP9BTY222221222222 0422981 0000 +M42019031111112082420000401371163113 +M520190311111120824119900106WTTT#W@@Z22222112222210112111117120000 +M520190311111120824120160102WTTT0YYPP222221222222 0422981 0000 +M520190311111120824120120115WTTT#T99W222221122222 0422981 0000 +M42019031111112115722700400671163113 +M520190311111121157119820503WTTTYB0PB22222122222230112111115800000 +M520190311111121157120060609WTTT0B@T#222221122222 0422061 0000 +M520190311111121157120030119WTTTYPPYB222221222222 0422091 0000 +M42019031111112124520000400941161113 +M520190311111121245119870614WTTTY0B@P22212222222210112121111790000 +M520190311111121245120150801WTTT0PBTY222122122222 0422981 0000 +M520190311111121245120100702WTTTPTP09222122122222 0422021 0153 +M520190311111121245120050609WTTT#ZZ0W222122122222 0422071 0408 +M42019031111112132720900403071161113 +M520190311111121327119880101WTTT0T#@T12222222222210112111110900000 +M520190311111121327120140519WTTTPBT@@222222122222 0422981 0000 +M520190311111121327120100712WTTT#Z#90122222222222 0422021 0000 +M520190311111121327120071101WTTT0P00T122222222222 0422051 0000 +M42019031111112143022700403941163113 +M520190311111121430119910513WTTT0BY#B22222122222210112121116780149 +M520190311111121430120160116WTTT0T0T@122222222222 0422981 0000 +M520190311111121430120100123WTTTYBZWP222222222222 0422031 0000 +M42019031111112160521100406391163113 +M520190311111121605119910608WTTTPYWBT22222122222220112121125910000 +M520190311111121605120130101WTTTY@B#P222222122222 0422981 0000 +M520190311111121605120090521WTTTPWBT0122222222222 0422031 0178 +M42019031111112202220900403031162113 +M520190311111122022119720706WTTT#WPZP22212222222210112111121710000 +M520190311111122022120150715WTTT0ZY@P222122222222 0422981 0000 +M520190311111122022120090519WTTT#9Y#Y222122122222 0422031 0000 +M520190311111122022120060813WTTTPPPBW222122122222 0422061 0100 +M520190311111122022120030101WTTTY#@#P222122122222 0422101 0100 +M42019031111112212620000401371163113 +M520190311111122126119730102WTTT#90TT22222122222230112111132570000 +M520190311111122126120111112WTTTYYP#0222221222222 0422011 0000 +M520190311111122126120050719WTTT0TW#W222221122222 0422071 0000 +M520190311111122126120020707WTTTYZ##Z222221222222 0422101 0000 +M42019031111112225821100406001163113 +M520190311111122258119830609WTTTYW@T@12222222222220112111126800000 +M520190311111122258120090103WTTT0#YPT122222222222 0422041 0000 +M520190311111122258120060723WTTT#B0W@122222222222 0422061 0000 +M42019031111112236220000401511161113 +M520190311111122362119900626WTTTP@BT021212222222210112161114480000 +M520190311111122362120150723WTTT0W0P0212122222222 0422981 0000 +M42019031111112291720600405341122113 +M520190311111122917119860126WTTTP#YZW22222222222210112131126460000 +M520190311111122917120100707WTTTY9900222222122222 0422021 0000 +M520190311111122917120070121WTTTP#Z@W222222122222 0422051 0000 +M42019031111112294522700402401163113 +M520190311111122945119691118WTTTPWYBP22222122222250112121100000000 +M520190311111122945120140107WTTT##9WP222222122222 0422981 0000 +M42019041111111132220900406421162113 +M520190411111111322119901116WTTT#@9#P12222222222210112111118420000 +M520190411111111322120150715WTTT0ZZT0222222222222 0422981 0000 +M520190411111111322120090626WTTTPTT#Y122222222222 0422031 0000 +M42019041111111143822700403611163113 +M520190411111111438119700101WTTT0P#P#12222222222210112141117650000 +M520190411111111438120070112WTTTPP0@9222221222222 0422061 0000 +M42019041111111148120900400501161113 +M520190411111111481119890119WTTTYWT0P12222222222210112121130810000 +M520190411111111481120180502WTTT#9#9T122222222222 0422981 0000 +M520190411111111481120130714WTTT#BZB#122221222222 0422981 0000 +M520190411111111481120110623WTTTY99@P122222122222 0422011 0000 +M520190411111111481120050703WTTTYP90P122222122222 0422071 0000 +M42019041111111169720000406951012113 +M520190411111111697119690815WTTT009@W22222112222220112111253060000 +M520190411111111697119670703WTTTYYTYB22222122222220212111200000000 +M520190411111111697120080807WTTTY@TB#222221222222 0422041 0000 +M42019041111111176520300404901162113 +M520190411111111765119940706WTTT0WB9Z22222122222210112111120590000 +M520190411111111765120150701WTTT0ZB#Y222221222222 0422981 0000 +M42019041111111178421100401181163113 +M520190411111111784119950601WTTT#ZT@P12222122222210112111123920000 +M520190411111111784120150118WTTTP#PZZ122221222222 0422981 0000 +M42019041111111219021700405121163113 +M520190411111112190119830813WTTTY@YP922212222222210112121128860000 +M520190411111112190120140813WTTTYYTBZ222122222222 0422981 0000 +M520190411111112190120100115WTTT0B@YB222122122222 0422031 0000 +M42019041111111251022200405781163113 +M520190411111112510119900115WTTT0TW@922222122222210112111122910000 +M520190411111112510120140601WTTTY#YZ0222221122222 0422981 0000 +M42019041111111259520600403391993113 +M520190411111112595119841106WTTT##BT922222122222250112111127200000 +M520190411111112595120100807WTTTYW@ZT222221122222 0422021 0000 +M520190411111112595120080715WTTTY0@P9222221122222 0422041 0000 +M42019041111111271021400400351161113 +M520190411111112710119890509WTTT0@PTT12222222222210112131100000000 +M520190411111112710120140101WTTT0B9#0122222222222 0422981 0000 +M42019041111111274221700406221163113 +M520190411111112742119930112WTTTYZ#PY22222122222210112131124530000 +M520190411111112742120130626WTTT0Z@BY222121222222 0422981 0000 +M42019041111111291621100403821163113 +M520190411111112916119750123WTTTP9PZ012222222222210112112122920500 +M520190411111112916120100708WTTT0WPZ#122222222222 0422021 0000 +M520190411111112916120070802WTTT##Z9#122222222222 0422051 0000 +M520190411111112916120040516WTTTY@BPY122222122222 0422092 0000 +M42019041111111298222700400991163113 +M520190411111112982119810715WTTTYYB@922222122222210112121127770000 +M520190411111112982120080519WTTT#TZWT222221222222 0422041 0000 +M520190411111112982120070815WTTTY@###222221122222 0422051 0000 +M42019041111111308821100401181163113 +M520190411111113088119880626WTTTP@Z@022222122222210112111121680000 +M520190411111113088120090106WTTT#P0@B222221222222 0422031 0000 +M520190411111113088120090106WTTT###Y@222221222222 0422031 0000 +M42019041111111314121100406001163113 +M520190411111113141119811108WTTTY##TT12222222222230112982119500000 +M520190411111113141120160615WTTTP@@PB122221222222 0422981 0000 +M520190411111113141120030518WTTTP##T#222222122222 0422092 0000 +M42019041111111384420900404651163113 +M520190411111113844119840519WTTTYYTW022212222222210112111128080000 +M520190411111113844120090523WTTTPZWWY222222122222 0422041 0000 +M520190411111113844120050615WTTTY9B@#222122122222 0422071 0000 +M42019041111111403521400403651163113 +M520190411111114035119920808WTTTY##PZ22222122222210112121113230000 +M520190411111114035120140601WTTTYZTY0222222222222 0422981 0000 +M42019041111111404320500402421161113 +M520190411111114043119930626WTTT#9TZZ22222122222210112121116090000 +M520190411111114043120150516WTTT#0ZTW222221222222 0422981 0000 +M42019041111111415420900403071161113 +M520190411111114154119770102WTTTPT#P#12222222222250112131131140000 +M520190411111114154120090718WTTTP9B#Y122222222222 0422031 0000 +M520190411111114154120050701WTTTY0#WY122222222222 0422071 0000 +M42019041111111422021700402341163113 +M520190411111114220119710118WTTTP9B@#22212222222210112131124280000 +M520190411111114220120020116WTTTYBPTZ222122122222 0422101 0000 +M42019041111111447221100406001013113 +M520190411111114472119920614WTTT#TTYT12222222222210112081100000000 +M520190411111114472120150102WTTTYW9@@122222122222 0422981 0000 +M42019041111111454622700404531163113 +M520190411111114546119941116WTTTYY9ZB22222122222210112111122960000 +M520190411111114546120180701WTTTYP#@P222222122222 0422981 0000 +M42019041111111457020000404071163113 +M520190411111114570119850106WTTT#P9##22212222222210112123122390000 +M520190411111114570120170606WTTTP9@@W222122122222 0422981 0000 +M42019041111111484120900404431161113 +M520190411111114841119740115WTTT0BB#022222122222220112111200000000 +M520190411111114841119701119WTTT00YYZ22222112222220212111236870000 +M520190411111114841120080126WTTTPYTWP222222122222 0422041 0000 +M520190411111114841120020512WTTTBT@@#222221222222 0422101 0000 +M42019041111111489320600401151161113 +M520190411111114893119950512WTTTY#9W@12222222222210112111115160000 +M520190411111114893120160723WTTT0B0ZY122222222222 0422981 0000 +M520190411111114893120130512WTTTPW#99122222222222 0422981 0000 +M42019041111111500121700404101013113 +M520190411111115001119840502WTTT09PWB12222222222210112111122570000 +M520190411111115001219830601WTTT#YPZ012222212222110212081200000801 +M520190411111115001120080114WTTTY9#@Z122222122222 0422041 0000 +M520190411111115001120060108WTTT0Y0#W122222222222 0422061 0000 +M520190411111115001120040103WTTT0Z@00122222222222 0422081 0000 +M520190411111115001120030123WTTT#Y@BP122222122222 0422101 0000 +M42019041111111532220900403031163113 +M520190411111115322119860115WTTTYP#@Z22212222222210112111116120000 +M520190411111115322120131115WTTTPY@09222122122222 0422981 0000 +M42019041111111570121400400351163113 +M520190411111115701219880703WTTTP#ZWB22222222222220212983200000000 +M520190411111115701119630513WTTTP0@0#22222212222220112121132210400 +M520190411111115701120160103WTTTYZWPT222222222222 0422981 0000 +M520190411111115701120150702WTTT#T@YP222222222222 0422981 0000 +M520190411111115701120140103WTTTYZWTT222222122222 0422981 0000 +M42019041111111581421400400351163113 +M520190411111115814119820618WTTTYPY#B22212222222210112111143550000 +M520190411111115814120160712WTTT0T#YP122222222222 0422981 0645 +M520190411111115814120110118WTTTYP09T222222222222 0422011 0645 +M520190411111115814120100626WTTT0990#222222222222 0422021 0645 +M520190411111115814120080121WTTTP00PP222222222222 0422041 0645 +M42019041111111585020500402421163113 +M520190411111115850119870121WTTTY9Y#Z22222122222210112121124480000 +M520190411111115850120131113WTTTPZPWW222222122221 0422981 0544 +M520190411111115850120131113WTTTY0ZBW222222222221 0422981 0544 +M42019041111111589720900406131162113 +M520190411111115897119840622WTTTPY@@Z12222122222210112121128390000 +M520190411111115897120120116WTTTYZ909122222222222 0422981 0000 +M520190411111115897120120116WTTTY0BY@122222122222 0422981 0000 +M520190411111115897120100715WTTTPBZZ#122221222222 0422021 0000 +M520190411111115897120070602WTTT#B@WT122221122222 0422051 0000 +M520190411111115897120050115WTTTYZTZT122221222222 0422071 0000 +M42019041111111601622700402321163113 +M520190411111116016119810615WTTT0#T@B22222122222210112121121550000 +M520190411111116016120110126WTTT0P#9Z222221222222 0422011 0000 +M520190411111116016120040108WTTT0#Z0B222221222222 0422081 0000 +M520190411111116016120010107WTTT###YB222221122222 0422111 0000 +M42019041111111605520600405341013113 +M520190411111116055119910722WTTT09W#922212222222210112121124260000 +M520190411111116055120110715WTTTYZ@YY222122122222 0422011 0000 +M42019041111111611321700405821163113 +M520190411111116113119900708WTTT#YP9W12222222222230112081121610000 +M520190411111116113120170615WTTTYPZ#T222222222222 0422981 0000 +M520190411111116113120120119WTTT0@@BP122222122222 0422981 0000 +M42019041111111620120000403951163113 +M520190411111116201119950618WTTTPPZ@P22222122222210112131100000000 +M520190411111116201120160612WTTT0#@0Y222221222222 0422981 0000 +M42019041111111626020900406131163113 +M520190411111116260119930121WTTT0Y0P012222222222210112111111700000 +M520190411111116260120170119WTTTPPZB#222222222222 0422981 0000 +M520190411111116260120130512WTTT#WP0T222222122222 0422981 0000 +M42019041111111632220600405171161113 +M520190411111116322119760607WTTTYTZZT12222122222210112121117570000 +M520190411111116322120060518WTTTYZ#0Z122222122222 0422061 0000 +M520190411111116322120010106WTTT0BT@9122222122222 0422111 0000 +M42019041111111644220000404271163113 +M520190411111116442119940118WTTTYWP#P22212222222210112082118360000 +M520190411111116442120110501WTTTPWTB9222122122222 0422012 0000 +M42019041111111707122700403941163113 +M520190411111117071119830501WTTT0YP9#22222222222220112112120550000 +M520190411111117071120170101WTTT0YZY0222222222222 0422981 0000 +M520190411111117071120090815WTTT0@0@T222222222222 0422031 0000 +M520190411111117071120080519WTTT00P#Z222222222222 0422051 0000 +M520190411111117071120070813WTTT#PB0B222222222222 0422051 0000 +M42019041111111765322700400671163113 +M520190411111117653119880123WTTTPTY#T22222122222210112121119120000 +M520190411111117653120130714WTTTY@ZZY122221122222 0422981 0000 +M520190411111117653120080626WTTTY#Y0Y122222222222 0422041 0000 +M42019041111111774022700402851163113 +M520190411111117740119850119WTTT0TZ9W22222122222250112121123210000 +M520190411111117740120160619WTTTYTY@Y222221222222 0422981 0000 +M520190411111117740120050503WTTT0@W00222221222222 0422081 0000 +M520190411111117740120030806WTTT#Z#W#222221222222 0422091 0000 +M42019041111111778420000405381163113 +M520190411111117784119830721WTTTPB9W#22222122222210112131100000000 +M520190411111117784120140516WTTTP9P#B222222122222 0422981 0000 +M520190411111117784120040106WTTT##YTW222221222222 0422081 0000 +M42019041111111786420900406151163113 +M520190411111117864119920121WTTT#PPY922222222222210112112118810000 +M520190411111117864120170115WTTTPYPYY222222222222 0422981 0000 +M42019041111111787021100401461163113 +M520190411111117870119820514WTTTYZBY#12222222222210112122110540000 +M520190411111117870119820721WTTT#B@@922222112222210212111132060000 +M520190411111117870120110101WTTTPWW99122221222222 0422021 0000 +M520190411111117870120040516WTTTY0TBT122222222222 0422091 0238 +M42019041111111811721700406341163113 +M520190411111118117119850601WTTT##PB012222222222210112111109660000 +M520190411111118117120160119WTTTP0T##222222222222 0422981 0000 +M520190411111118117120141109WTTT09PBY122222222222 0422981 0000 +M520190411111118117120070123WTTTY@T#W122222222222 0422051 0115 +M42019041111111838320600405341163113 +M520190411111118383119900119WTTT0@##W12222222222230112082113650000 +M520190411111118383120160526WTTTP9#09122222122221 0422981 0602 +M42019041111111859720600405471991113 +M520190411111118597119950126WTTT0T09T12222122222210112131111920000 +M520190411111118597120140615WTTT#0YWY122221122222 0422981 0000 +M42019041111111870822700400671163113 +M520190411111118708119870501WTTT#@9@922222222222210112121117950000 +M520190411111118708120160107WTTTYZ#BP222222222222 0422981 0000 +M520190411111118708120110518WTTTY#@B#122221222222 0422011 0000 +M520190411111118708120070126WTTTPT#T@222222222222 0422051 0023 +M42019041111111908020000403181993113 +M520190411111119080119900101WTTTPW@0W22212222222210112161123640000 +M520190411111119080120160107WTTTBT@0W222122122222 0422981 0000 +M42019041111111911821100401691163113 +M520190411111119118119720526WTTT#PP@P22222122222210112111121450000 +M520190411111119118120090602WTTTY@9BW222222122222 0422031 0000 +M520190411111119118120060101WTTT0@TTW222221222222 0422061 0000 +M42019041111111952821100406391163113 +M520190411111119528119880619WTTTP0#PP12222222222210112131118770000 +M520190411111119528120160518WTTT0YWZ9122222222222 0422981 0000 +M520190411111119528120110115WTTTP#0T@122222122222 0422021 0000 +M520190411111119528120070819WTTTPW@P9122222222222 0422051 0000 +M42019041111111960520600405471163113 +M520190411111119605119900107WTTT09PPB12222222222220112121250130000 +M520190411111119605119830119WTTT#ZT0912222212222210212121200000000 +M520190411111119605120100721WTTTYPY#0122222222222 0422021 0000 +M520190411111119605120080626WTTTP0B9Z122222122222 0422041 0000 +M520190411111119605120060703WTTTY@BB9222222222222 0422061 0000 +M42019041111111987620900406421161113 +M520190411111119876119860701WTTT0@0ZW12222122222210112121141160000 +M520190411111119876120120119WTTTP#@#Y122221122222 0422981 0000 +M520190411111119876120100509WTTT09B#@122222122222 0422021 0000 +M520190411111119876120090721WTTTPZW9Z222222122222 0422031 0000 +M520190411111119876120040603WTTT#WTP#122221122222 0422081 0000 +M42019041111111999022700400671163113 +M520190411111119990119810721WTTTP@0@B22222222222210112131128270000 +M520190411111119990120080521WTTTP9@0P122222122222 0422041 0000 +M520190411111119990120060506WTTTY9@W#122222222222 0422071 0000 +M520190411111119990120050612WTTT0@TP0122222222222 0422071 0000 +M42019041111112011622700400671123113 +M520190411111120116119800115WTTTYP0@P22222122222220112131117400550 +M520190411111120116120140716WTTT090#0222221222222 0422981 0000 +M520190411111120116120140716WTTT#TWT0222221222221 0422981 0695 +M42019041111112017621700400981163113 +M520190411111120176119850719WTTT#T0YB22222122222230112111122100292 +M520190411111120176120150121WTTTPT@BP222221122222 0422981 0000 +M520190411111120176120080126WTTT#WB@#222221222222 0422041 0000 +M520190411111120176120060112WTTTYY@9T222221122222 0422061 0000 +M42019041111112021920000403951992113 +M520190411111120219119910102WTTT#BY9B12212222222210112081119440000 +M520190411111120219120120621WTTTY0TY#212122222222 0422981 0000 +M42019041111112045920900403071161113 +M520190411111120459119910709WTTTPT99B12222222222210112131116390000 +M520190411111120459120121119WTTT0@9#@222222122222 0422981 0000 +M42019041111112064920900400501161113 +M520190411111120649119890101WTTTPBYTT12222122222210112121125050050 +M520190411111120649120150119WTTTP0ZT0122121122222 0422981 0000 +M520190411111120649120120115WTTTY@TZ@122222222222 0422981 0000 +M520190411111120649120080123WTTT0TZPZ122221122221 0422041 0684 +M42019041111112065720600401981162113 +M520190411111120657119830708WTTTPWP9B12222222222210112121121100000 +M520190411111120657120110715WTTT#P#@T122222222222 0422011 0000 +M520190411111120657120031123WTTTPW@#W122222222222 0422091 0255 +M42019041111112111620000400131163113 +M520190411111121116119840515WTTTY@ZTY12222222222220112131112150000 +M520190411111121116120160519WTTTYYZ0T222222122222 0422981 0000 +M520190411111121116120130601WTTT09T0P122222222222 0422981 0000 +M520190411111121116120030701WTTT0BYBT122222122222 0422091 0000 +M42019041111112120321100406541163113 +M520190411111121203119900726WTTT09BW@22212222222210112121117300000 +M520190411111121203120140606WTTT#WBY0222122122222 0422981 0000 +M42019041111112132420600400291012113 +M520190411111121324119840126WTTTY#9YP12222222222210112131124260000 +M520190411111121324120110121WTTT#@#0W122222222222 0422021 0000 +M42019041111112152220600402031163113 +M520190411111121522119890601WTTT0P@P#12222222222230112111100000000 +M520190411111121522120160123WTTT##TZ9122222122222 0422981 0000 +M520190411111121522120131118WTTT#@#TY122222222222 0422981 0000 +M42019041111112187521100405971993113 +M520190411111121875119650107WTTTPYWT@22212212222210112111125350000 +M520190411111121875120180501WTTTYY9T@222222222222 0422981 0000 +M520190411111121875120050115WTTTYZ@W@222222122222 0422083 0000 +M42019041111112213420600402661163113 +M520190411111122134119810522WTTTYZY0@22212222222210112111113250400 +M520190411111122134120130102WTTT0YPZ@222222122222 0422981 0000 +M520190411111122134120060101WTTTPWYTT222222222222 0422071 0000 +M520190411111122134120020815WTTT#YP#Y222222122222 0422101 0000 +M42019041111112262620900402921163113 +M520190411111122626119800826WTTT0BT9T22212222222210112131118330000 +M520190411111122626120080101WTTT#Y90@222122122222 0422041 0000 +M520190411111122626120010821WTTT0B0Z@222122222222 0422111 0000 +M42019041111112262820000403721163113 +M520190411111122628119930516WTTT0@##B12222222222210112081126490000 +M520190411111122628120141119WTTT0Y#W9222222222222 0422981 0000 +M520190411111122628120120114WTTTBTTZW222222122222 0422981 0000 +M42019041111112266021100403821163113 +M520190411111122660119790713WTTTBTZ0Z22122222222210112112130760783 +M520190411111122660120180726WTTTY9WBP222222222222 0422981 0000 +M520190411111122660120130616WTTTYT#@9221222122222 0422981 0000 +M520190411111122660120110512WTTT00T@T221222122222 0422011 0000 +M520190411111122660120070802WTTT0Y@9@221222222222 0422051 0000 +M520190411111122660120030515WTTTYWPPZ221222122222 0422101 0000 +M520190411111122660120010102WTTT0WWWW221222122222 0422111 0000 +M42019041111112284221700406831193113 +M520190411111122842119850115WTTTYWBPP12222222222210112121122500000 +M520190411111122842120070606WTTTY@YW#122222222222 0422051 0000 +M520190411111122842120050701WTTTP9BY9122222122222 0422071 0000 +M520190411111122842120020614WTTT09PZ#122222222222 0422101 0000 +M42019051111111112020600405471163113 +M520190511111111120119810606WTTTY9P9B22212222222210112111116970000 +M520190511111111120120140115WTTT0Y99T222122122221 0422981 0885 +M520190511111111120120100707WTTT#PT@Y222122222222 0422021 0000 +M42019051111111180222200405781161113 +M520190511111111802119890606WTTTPB#B#22222122222210112121119370000 +M520190511111111802120130508WTTTPWWBT222222222222 0422981 0000 +M520190511111111802120080503WTTTPBYZ9212222222222 0422041 0000 +M42019051111111180720600405471163113 +M520190511111111807119850109WTTTPWWYT11222122222210112111131760000 +M520190511111111807120180108WTTTYB00B122222122222 0422981 0000 +M520190511111111807120160718WTTT0BW#Y222222222222 0422981 0000 +M520190511111111807120050126WTTTP9B9T222222122222 0422071 0148 +M520190511111111807120030603WTTTYT@WY222222222222 0422091 0148 +M42019051111111192121700404101163113 +M520190511111111921119720601WTTT0909Y22222122222230112111120800000 +M520190511111111921120010113WTTTPTZBZ222222222222 0422111 0085 +M42019051111111208820900404431163113 +M520190511111112088119770601WTTTY@ZT912222222222210112161118190000 +M520190511111112088120110523WTTTPZ@BY122222122222 0422021 0000 +M520190511111112088120080714WTTT0@YY@122221122222 0422041 0000 +M520190511111112088120060519WTTT0#W0T122222122222 0422071 0000 +M520190511111112088120030121WTTTPWP@@122222122221 0422091 0885 +M42019051111111226121700404101993113 +M520190511111112261119950119WTTTBTZ0@12222222222211012111121580000 +M520190511111112261119940821WTTTYY#P#22222112222210112081112770000 +M520190511111112261120160103WTTTYZ#T@122222122222 0422981 0000 +M520190511111112261120130506WTTTP9@9@122222222222 0422981 0000 +M42019051111111229321100406541193113 +M520190511111112293119880101WTTT0Z@0Z12222222222210112111121800000 +M520190511111112293120100126WTTT#@ZP@122222222222 0422021 0000 +M42019051111111231022700400441162113 +M520190511111112310119851108WTTT#B99#22222122222210112121119010000 +M520190511111112310120150515WTTT0Z9#Z222222122222 0422981 0000 +M520190511111112310120110103WTTTP9YZT222221222222 0422021 0000 +M42019051111111314021700405821163113 +M520190511111113140119880609WTTT#@@9T12222222222210112081114660000 +M520190511111113140120140519WTTTPPWY0222222122222 0422981 0000 +M520190511111113140120080612WTTT#Z@BZ122222122222 0422051 0000 +M42019051111111319620000402101163113 +M520190511111113196119900615WTTT#WY#P12222222222230112111119070000 +M520190511111113196120170119WTTT0TYTW122222222222 0422981 0000 +M42019051111111337320600401421163113 +M520190511111113373119710121WTTTP9Y0@12222212222220112112130530000 +M520190511111113373120020819WTTTP0WT9222222222222 0422102 0000 +M42019051111111368022400401011161113 +M520190511111113680119850715WTTTPY#B@22222122222210112121120350000 +M520190511111113680120060818WTTTYBZYW222221222222 0422061 0000 +M520190511111113680120050621WTTT0#00W222221222222 0422081 0000 +M42019051111111373422700403241992113 +M520190511111113734119981101WTTT0YZ9012222222222210112111115530000 +M520190511111113734120160115WTTT#PPB@222222222222 0422981 0000 +M42019051111111380021700404101993113 +M520190511111113800119970103WTTTPBZT912222222222210112081123210000 +M520190511111113800120170701WTTT##BTB122221222222 0422981 0000 +M42019051111111394621100401691162113 +M520190511111113946119890113WTTTPYB9022222122222210112111123680000 +M520190511111113946120140522WTTTP@PZ9122222122222 0422981 0000 +M520190511111113946120140522WTTTYZBT0122222122222 0422981 0000 +M520190511111113946120080608WTTTP0Y#@222222222222 0422051 0000 +M42019051111111401420900402621162113 +M520190511111114014119950621WTTTYZW#B22212212222211012111126620000 +M520190511111114014119921103WTTT#W0#P12222222222210112121112630000 +M520190511111114014120180606WTTT0Z#WY122122122222 0422981 0000 +M42019051111111439820000402281163113 +M520190511111114398119940809WTTTYBZ0922222122222210112131118240000 +M520190511111114398120150708WTTT0BTPY222222222222 0422981 0000 +M42019051111111447922700400671163113 +M520190511111114479119770626WTTT0YW#Z12222222222210112111118240000 +M520190511111114479120080115WTTTYW@0T222222222222 0422041 0000 +M520190511111114479120070106WTTTYP@ZZ122222122222 0422051 0000 +M42019051111111470820600401161162113 +M520190511111114708119800101WTTT0B0Y022212222222210112121124120000 +M520190511111114708120120506WTTTP9Z9T222122122222 0422981 0000 +M42019051111111476621100406001163113 +M520190511111114766119950626WTTT#@B#T22212222222210112081114910000 +M520190511111114766120150509WTTTPPZYP222122222222 0422981 0000 +M520190511111114766120140709WTTTP0Z9@122222122222 0422981 0000 +M42019051111111485220900403071161113 +M520190511111114852119911126WTTT#W00022212222222210112131115740000 +M520190511111114852120160719WTTTBT@BP222122122222 0422981 0000 +M520190511111114852120120723WTTT0#P90222122122222 0422981 0000 +M42019051111111494520600405341163113 +M520190511111114945119811108WTTTY99T922222222222250112111119990000 +M520190511111114945120050108WTTTY9#9P222222122222 0422081 0000 +M520190511111114945120030626WTTT0@TTP222222222222 0422101 0000 +M42019051111111499622400405611161113 +M520190511111114996119890102WTTT#TZW#22212222222210112121128600000 +M520190511111114996120170723WTTT#BZTB222122122222 0422981 0000 +M520190511111114996120130106WTTTYTB@P222122222222 0422981 0000 +M42019051111111500720900403031163113 +M520190511111115007119950601WTTT#0Z#@22212222222210112112126190000 +M520190511111115007120180119WTTT#YZWT222122122222 0422981 0000 +M42019051111111502320600405341162113 +M520190511111115023119740601WTTTPB0P922212222222210112121127290000 +M520190511111115023120080715WTTTY9PBW222122222222 0422041 0000 +M42019051111111504621400400351163113 +M520190511111115046119770101WTTTYW@Y022212222222230112112122940000 +M520190511111115046120121103WTTTYP#0#222222222222 0422981 0000 +M42019051111111554222700400671163113 +M520190511111115542119870806WTTT0B9TT22212212222230112112123940000 +M520190511111115542120130615WTTT#Y@YT222222122222 0422981 0000 +M520190511111115542120110719WTTTY9@9Y222222222222 0422011 0000 +M42019051111111579322700403941013113 +M520190511111115793119880823WTTT00PWB22222122222210112121127300000 +M520190511111115793120150119WTTTY0ZW0222221122222 0422981 0000 +M42019051111111601222700402801163113 +M520190511111116012119870719WTTTYZTW#12222222222210112121124250000 +M520190511111116012120080118WTTTYTTZ@122222122222 0422041 0000 +M520190511111116012120060516WTTT090@P122222122222 0422061 0000 +M520190511111116012120040818WTTT#9YP9122222222222 0422081 0000 +M42019051111111613921700406751163113 +M520190511111116139119750113WTTTYPB0B22222212222220212112119220000 +M520190511111116139219570106WTTT#9WBW22222222222120112111200000885 +M520190511111116139120010709WTTTPTWB@222222122222 0422111 0000 +M42019051111111623721700406341161113 +M520190511111116237119830601WTTTP0TYZ12222222222210112131113100000 +M520190511111116237120170722WTTTPB#Z#122222222222 0422981 0000 +M520190511111116237120160501WTTTYW0Y9222221122222 0422981 0000 +M42019051111111636820600402031163113 +M520190511111116368119801109WTTTYWZ#T12222122222210112121116070000 +M520190511111116368120070601WTTTY@BYW122221222222 0422051 0000 +M520190511111116368120031121WTTTYTW#0122221122221 0422091 0865 +M42019051111111654621100406541163113 +M520190511111116546119940515WTTTP#ZZY12222222222210112082129720000 +M520190511111116546120170713WTTTPZ#0T122222222222 0422981 0000 +M520190511111116546120160514WTTT#ZB@9122222222222 0422981 0000 +M42019051111111696721200404291163113 +M520190511111116967119910101WTTTPP0ZT12222222222210112111122100000 +M520190511111116967120120119WTTT#Z#9#122222122222 0422981 0000 +M520190511111116967120070102WTTTYPPTT122222122222 0422051 0000 +M42019051111111697120900401881161113 +M520190511111116971119980621WTTT0TWB#22212212222210412081120190000 +M520190511111116971119801119WTTTPYZZ022212222222210112131132630000 +M520190511111116971120110121WTTT#Z0@@222122122222 0422011 0000 +M520190511111116971120050115WTTTPT9@#122222222222 0422071 0000 +M520190511111116971120030521WTTTY@T9Z222222122222 0422091 0000 +M42019051111111710321100401181163113 +M520190511111117103119720112WTTT#0T9#22212222222210112081122570000 +M520190511111117103120080106WTTTY#@P0222222122222 0422041 0000 +M520190511111117103120060106WTTT0#YWW222122122222 0422061 0000 +M42019051111111723921100401181161113 +M520190511111117239119720101WTTTY@TZ#12222222222210112121121780000 +M520190511111117239120130106WTTTPW@YT222221122222 0422981 0000 +M42019051111111729122700403941163113 +M520190511111117291119870701WTTTP9PTZ22222122222210112111114290000 +M520190511111117291120131108WTTT00#@Z222221122222 0422981 0000 +M520190511111117291120080119WTTT#090B122221122222 0422041 0000 +M520190511111117291120040601WTTT#PZTZ222221122222 0422091 0000 +M42019051111111731120900403071162113 +M520190511111117311119640606WTTT#0PYW22212222222210112121115720000 +M520190511111117311120060607WTTT#0YWB222122122222 0422061 0000 +M520190511111117311120020615WTTT0B##9222122122222 0422101 0000 +M42019051111111752421700401121163113 +M520190511111117524119890107WTTT##BY922212222222210112111126860000 +M520190511111117524120170816WTTT#WZPP222222122222 0422981 0000 +M42019051111111755520500401731163113 +M520190511111117555119830615WTTTP@YWT22222122222210112121130530000 +M520190511111117555120170115WTTT0#W@P222221122222 0422981 0000 +M520190511111117555120070819WTTTYBYPT222221222222 0422051 0000 +M520190511111117555120040119WTTTYWWTP222221122222 0422081 0000 +M42019051111111760822400402111163113 +M520190511111117608119870115WTTT#B@0922212222222210112121116530000 +M520190511111117608120131126WTTT##9#W222122222221 0422981 0779 +M520190511111117608120070713WTTT#0Z9@222122122222 0422051 0000 +M42019051111111773920000404831161113 +M520190511111117739119940521WTTT#9WZ022212222222210112141114210000 +M520190511111117739120160726WTTTPBWY9222222122222 0422981 0000 +M520190511111117739120140114WTTT#PTWB222122222222 0422981 0000 +M520190511111117739120120503WTTTY0Y@Y222122222222 0422011 0000 +M42019051111111774520600405171163113 +M520190511111117745119930614WTTT0#YYP22212222222210112111119590000 +M520190511111117745120180719WTTT#WP#P222122122222 0422981 0000 +M520190511111117745120140502WTTT0#T0P222122222222 0422981 0000 +M520190511111117745120130502WTTTPTYYY222122122222 0422981 0000 +M42019051111111830822700403941163113 +M520190511111118308119960501WTTTYP0P022212222222210112112119300000 +M520190511111118308120170521WTTT#PY@9222222122222 0422981 0000 +M42019051111111831421100401551163113 +M520190511111118314119900506WTTTYW9PY12222222222210112111122780000 +M520190511111118314120080815WTTTPB9PW122222222222 0422041 0100 +M520190511111118314120070119WTTTPB9PB122222122222 0422051 0100 +M42019051111111833120000401511162113 +M520190511111118331119880102WTTT0PYWB12222222222210112121121730000 +M520190511111118331120130112WTTT##@B@122222222222 0422981 0000 +M520190511111118331120060609WTTTYYZ0Z122222122222 0422061 0000 +M42019051111111842022700400441161113 +M520190511111118420119870716WTTT#YZZY22222222222210112131115840000 +M520190511111118420120130119WTTT0BWWW222121122222 0422981 0000 +M520190511111118420120080121WTTT#09PB222122222222 0422041 0000 +M42019051111111917220000403321163113 +M520190511111119172119680619WTTT00BZW22222122222250112111121210000 +M520190511111119172120060615WTTT0ZT@Y222221122222 0422071 0000 +M42019051111111930922700400671162113 +M520190511111119309119990121WTTT00P0Z22212222222210612981111680000 +M520190511111119309120170101WTTT0YYBZ222122222222 0622981 0000 +M42019051111111946420500404981163113 +M520190511111119464119920808WTTTYP#Y@22222122222210112131123660000 +M520190511111119464120160519WTTT0WWPT222222122222 0422981 0000 +M520190511111119464120100815WTTTYB#W0222221222222 0422021 0000 +M42019051111111964420000404271162113 +M520190511111119644219890122WTTTYBZY012222221222110112081111560801 +M520190511111119644120170102WTTT#BWBZ222222122222 0422981 0000 +M520190511111119644120150707WTTT#Y@PZ122222122222 0422981 0000 +M42019051111111978421700400981161113 +M520190511111119784119880522WTTTY@99Y22212222222210112121120760000 +M520190511111119784120140819WTTT00@BW122122122222 0422981 0000 +M520190511111119784120091114WTTTY@T0P222122122222 0422031 0000 +M42019051111111993621100401181163113 +M520190511111119936119890101WTTT099T912222222222220112121117270000 +M520190511111119936120171107WTTT#T00P122222122222 0422981 0000 +M520190511111119936120070101WTTT#YY#T122222222222 0422051 0000 +M42019051111111997421100405971161113 +M520190511111119974119780508WTTTYY0#T12222222222210112111118150000 +M520190511111119974120180602WTTTP0BWP222222122222 0422981 0000 +M520190511111119974120080115WTTT###PW122222122221 0422041 0761 +M42019051111112065921400400351163113 +M520190511111120659119890512WTTTYB#0B22212222222210112112123680000 +M520190511111120659120180101WTTT#YBWB222222222222 0422981 0000 +M520190511111120659120151123WTTT#YZYZ122222122222 0422981 0000 +M520190511111120659120100701WTTT0900T222222222222 0422021 0000 +M42019051111112089120000404271163113 +M520190511111120891119920714WTTTYPZZT22222122222210112081114820000 +M520190511111120891120150506WTTTPZBWP122122222222 0422981 0000 +M520190511111120891120130819WTTTYTB0#222222122222 0422981 0000 +M42019051111112129920000404041162113 +M520190511111121299119940802WTTT#Z09@22222122222210112111127810000 +M520190511111121299120150123WTTTPZ0T0122221222222 0422981 0000 +M520190511111121299120120123WTTT#Y@ZY122222222222 0422981 0230 +M42019051111112185321700401121161113 +M520190511111121853119860119WTTT#W0WT12222222222210112131115430000 +M520190511111121853120180708WTTT#BB09222222122222 0422981 0000 +M520190511111121853120130113WTTT0WBTT122222222222 0422981 0000 +M42019051111112200422700403611163113 +M520190511111122004119880113WTTT0YBZZ12222222222210112111123400000 +M520190511111122004120120115WTTT#B@B#222222222222 0422011 0000 +M520190511111122004120070506WTTTYBP#W222222122222 0422051 0000 +M42019051111112208320900403031192113 +M520190511111122083219820102WTTTP0YWZ12222122222220212123200000000 +M520190511111122083119800126WTTTPPY@@12222212222220112111118880000 +M520190511111122083120180115WTTTPZ#ZT122222122222 0422981 0000 +M520190511111122083120130121WTTTYPP@Y122222122222 0422981 0000 +M42019051111112212920900406421161113 +M520190511111122129119900819WTTTYTBZW22212222222250112121121590000 +M520190511111122129120190515WTTTYW@Z0222222222222 0422981 0000 +M520190511111122129120160523WTTT#Y@YY222122122222 0422981 0000 +M520190511111122129120100701WTTTYZPZ9122122122222 0422021 0000 +M42019051111112213320600400871163113 +M520190511111122133119910708WTTT##YBY22222122222210112121116910000 +M520190511111122133120150708WTTT0BWYZ222221222222 0422981 0000 +M520190511111122133120111103WTTTYTTWW222221222222 0422011 0000 +M42019051111112217221100406001163113 +M520190511111122172119820702WTTT#Y#B#12222222222210112121117560000 +M520190511111122172120160115WTTT#PYPP122222122222 0422981 0000 +M520190511111122172120110703WTTT##W0#122221222222 0422011 0000 +M520190511111122172120070115WTTTPPWYT122222122222 0422051 0000 +M42019051111112233520600405771163113 +M520190511111122335119870614WTTT0#@T912222122222210112111126740400 +M520190511111122335120180115WTTT#00T#222222122222 0422981 0000 +M520190511111122335120140621WTTT0WBTW122221122222 0422981 0000 +M520190511111122335120080601WTTT0W@B9122221222222 0422051 0000 +M42019051111112292122400405111992113 +M520190511111122921119840115WTTTYZ9#912222122222210112121121650000 +M520190511111122921120130119WTTTBT@W@122122122222 0422981 0000 +M520190511111122921120040114WTTT#YZTW122221222222 0422081 0000 +M42019051111112294122400400881163113 +M520190511111122941119960713WTTTYPBZY22212122222210112111112350000 +M520190511111122941120160501WTTT#T@#W222121122222 0422981 0000 +M42019061111111114821100406001161113 +M520190611111111148119850526WTTT#P#W#12222222222210112121121910000 +M520190611111111148120160119WTTT##YY0222222122222 0422981 0861 +M520190611111111148120110116WTTTPYZ@Z222222122222 0422011 0000 +M520190611111111148120070115WTTTP#TB@122222222222 0422051 0000 +M520190611111111148120040821WTTT0ZTTT122222122221 0422081 0484 +M42019061111111168420600405341163113 +M520190611111111684119900723WTTTYY0PT22222222222210112111123430000 +M520190611111111684120160103WTTTP#@WZ122221222222 0422981 0000 +M42019061111111181121100404791162113 +M520190611111111811119850123WTTTYYBW022212222222220112121130010500 +M520190611111111811120150601WTTT#P##@222122122222 0422981 0000 +M520190611111111811120120126WTTTY@W09222122122222 0422981 0000 +M520190611111111811120100115WTTT0009P222122122222 0422021 0000 +M520190611111111811120070707WTTTYBT9Z222122222222 0422051 0000 +M42019061111111187222700403941163113 +M520190611111111872119840609WTTTP9#ZP22222122222210112111124940000 +M520190611111111872120070518WTTT#B@T#222221222222 0422051 0000 +M520190611111111872120060126WTTT##B0Z222221222222 0422061 0000 +M520190611111111872120040512WTTTYBTB0222221222222 0422081 0000 +M42019061111111204722400406441162113 +M520190611111112047119770515WTTTY0@0022212222222210112131122070000 +M520190611111112047120060701WTTT#Y@@Y222122122222 0422061 0000 +M42019061111111224522400405581161113 +M520190611111112245119780115WTTT#BWB012222122222210112131135420000 +M520190611111112245120110801WTTTPPP@#122221222222 0422011 0000 +M520190611111112245120090602WTTT###@W122222222222 0422031 0000 +M520190611111112245120030501WTTT#@TYZ122222222222 0422101 0503 +M42019061111111248721100405971163113 +M520190611111112487119910615WTTTPB9@T12222222222210112111121670000 +M520190611111112487120160501WTTTPZW9Y122222122222 0422981 0000 +M520190611111112487120100109WTTTYBY0W122222122222 0422031 0000 +M520190611111112487120080103WTTT0W#@B122222122222 0422041 0000 +M42019061111111256122700400441163113 +M520190611111112561119901122WTTT09YP@22212222222210112131126990000 +M520190611111112561120150803WTTT##0@T222122122222 0422981 0000 +M42019061111111308522200405781161113 +M520190611111113085119880606WTTT#P9W922222122222210112111118410000 +M520190611111113085120130802WTTT0T9#0222221222222 0422981 0000 +M520190611111113085120110501WTTTY@Y9W222221222222 0422011 0000 +M42019061111111315721700405821163113 +M520190611111113157119791102WTTTPWYP912222212222210112111126250000 +M520190611111113157120050626WTTTPP0WP122222222222 0422071 0000 +M520190611111113157120030721WTTT0P@P0122222122222 0422091 0000 +M520190611111113157120020715WTTTP#TB9122222122222 0422101 0000 +M42019061111111316120000402101163113 +M520190611111113161119730118WTTTP@@B022212222222220212082121520000 +M520190611111113161119660118WTTT#ZBY@22212212222220112982121170000 +M520190611111113161120100109WTTT#@PZZ222122122222 0422032 0000 +M520190611111113161120080715WTTT0@WP0222122222222 0422042 0000 +M520190611111113161120060115WTTTP@#Z9222122222222 0422072 0000 +M520190611111113161120040506WTTT00@@T222122122222 0422092 0000 +M520190611111113161120020506WTTT0YTP0222122222222 0422112 0000 +M42019061111111350020900404651163113 +M520190611111113500119950503WTTT0YZWP12222222222210112081137500000 +M520190611111113500120170623WTTTPW9W#122222122222 0422981 0000 +M520190611111113500120140503WTTTY@09T122122222222 0422981 0000 +M42019061111111354920000406011163113 +M520190611111113549119940601WTTTYYZW022222122222210112111119720000 +M520190611111113549120130602WTTT0P#WB222222222222 0422981 0000 +M520190611111113549120110523WTTTPY#TB222221122222 0422011 0000 +M42019061111111359522700405651163113 +M520190611111113595119910606WTTTYYBB922222122222210112121114960000 +M520190611111113595120140121WTTTPZWY@222221222221 0422981 0885 +M42019061111111361422700403941162113 +M520190611111113614119830521WTTTBT@9Z22222122222210112121128290000 +M520190611111113614120160603WTTT#90ZZ222221122222 0422981 0319 +M520190611111113614120120715WTTT#W0P0222221222222 0422981 0319 +M520190611111113614120050106WTTT#9#B#222221122222 0422081 0000 +M42019061111111367621700404401163113 +M520190611111113676119910708WTTTYYWW@22222122222210112111119260000 +M520190611111113676120100126WTTT#TYWP222221222222 0422021 0000 +M42019061111111397120900406421163113 +M520190611111113971119850103WTTT#0TYB12222222222210112111121210000 +M520190611111113971120030714WTTTYZB0W122222222222 0422091 0000 +M42019061111111416020600405771161113 +M520190611111114160119910119WTTTP@##912222222222210112111111750000 +M520190611111114160120150826WTTTY@9T@122221122222 0422981 0000 +M520190611111114160120101102WTTT0YPBT122221222222 0422021 0000 +M42019061111111439421700406831162113 +M520190611111114394119910103WTTTYY@9Z22222122222210112121127680000 +M520190611111114394120140723WTTTYY#@@222222222222 0422981 0000 +M520190611111114394120120515WTTTPTTT0222222222222 0422011 0000 +M520190611111114394120100721WTTTPY0PW222222222222 0422021 0000 +M42019061111111446120900401881161113 +M520190611111114461119890506WTTTYPWZP22212222222250112121120060000 +M520190611111114461120120107WTTT0Z0T#222222122222 0422981 0000 +M520190611111114461120090726WTTTYPPBT122122122222 0422031 0000 +M520190611111114461120080613WTTT0PZ#9222122122222 0422051 0000 +M520190611111114461120060718WTTT#9TBB222122222222 0422061 0000 +M42019061111111458020600404951163113 +M520190611111114580119920115WTTTPZZW@22222122222210112131122650000 +M520190611111114580120130607WTTT0ZYY#222221222222 0422981 0000 +M42019061111111464220900402921162113 +M520190611111114642119830521WTTT0Z@P022212222222210112112121290000 +M520190611111114642119810721WTTTY9BYP22212212222211012112117440000 +M520190611111114642120130516WTTT#BYB@222122222222 0422981 0000 +M520190611111114642120110526WTTT0#B99222222222222 0422021 0000 +M520190611111114642120060718WTTTP@Y@W222122222222 0422063 0000 +M42019061111111474121200404541161113 +M520190611111114741119960101WTTT##B@012222222222210112121125440000 +M520190611111114741120130619WTTTP#0ZT122222122222 0422981 0000 +M42019061111111484620600403781163113 +M520190611111114846119870601WTTTYBY9@22222122222210112111119170000 +M520190611111114846120130702WTTTYZT##222221222222 0422981 0000 +M520190611111114846120090512WTTT0W99Y222221222222 0422041 0000 +M520190611111114846120070806WTTT#TW#@222221222222 0422051 0000 +M42019061111111487521700405121161113 +M520190611111114875119760103WTTTYTZWW12222222222220112111134660000 +M520190611111114875120090714WTTTPW@00222222122222 0422031 0000 +M520190611111114875120040123WTTT09W@T222221122222 0422091 0000 +M42019061111111488920600405341013113 +M520190611111114889119920519WTTT#0@9T22212222222210112111126740000 +M520190611111114889120140126WTTTY0WW#222222222222 0422981 0000 +M42019061111111509722400402111013113 +M520190611111115097119780114WTTT00@YP22212222222250112111137730000 +M520190611111115097120120519WTTTYP#W9222221222222 0422981 0000 +M520190611111115097120090515WTTTYWZ0Z222221222222 0422031 0000 +M520190611111115097120080116WTTT#T@Z0222221122222 0422051 0000 +M42019061111111509821100401541162113 +M520190611111115098119860819WTTT#Z#0W22222122222210112121130000000 +M520190611111115098120140112WTTTP0YBP222221122222 0422981 0000 +M520190611111115098120100121WTTTP90#Y222221122222 0422031 0000 +M520190611111115098120060106WTTT#9@B#222221222222 0422061 0000 +M42019061111111529622700400681162113 +M520190611111115296119860722WTTT##W0@12222122222210112111100000000 +M520190611111115296120030116WTTT#ZTBP122221122222 0422101 0000 +M42019061111111553220600402981161113 +M520190611111115532119880101WTTTPZ09@12222222222210112141100000000 +M520190611111115532120131121WTTT#0YYP122222122222 0422981 0000 +M520190611111115532120111106WTTTP9BT9122221222222 0422011 0000 +M42019061111111561021700404181163113 +M520190611111115610119880101WTTT09Z9Y22222122222250112131127410000 +M520190611111115610120180102WTTTPTT#T222221122222 0422981 0000 +M520190611111115610120120623WTTTYWY0T222221122222 0422981 0000 +M42019061111111584021100406391163113 +M520190611111115840119920619WTTTYP9TY22222122222210112121113940000 +M520190611111115840120170714WTTT#0@Z#222221122222 0422981 0000 +M42019061111111602320300401761162113 +M520190611111116023119900506WTTTP@YB922222122222210112111124770000 +M520190611111116023120130121WTTTP9Z@#222221222222 0422981 0000 +M42019061111111602822700403941163113 +M520190611111116028119910126WTTT0WYP#22222122222210112121116130000 +M520190611111116028120170809WTTTP#99@222222222222 0422981 0000 +M520190611111116028120130116WTTTPWYBW222221222222 0422981 0000 +M42019061111111622222700403241163113 +M520190611111116222119780119WTTT0#@W@22222122222210112121121110000 +M520190611111116222120030615WTTT#T0@#222221122222 0422101 0000 +M42019061111111662222700402581162113 +M520190611111116622119880826WTTT#B@TB22222122222210112111112730000 +M520190611111116622120130603WTTT0YTT0222222222222 0422981 0000 +M42019061111111700922700403941163113 +M520190611111117009119900103WTTT0B0#922212222222210112121122830000 +M520190611111117009120151116WTTTPZZ#W222122222222 0422981 0000 +M520190611111117009120120115WTTT0@@BW222122222222 0422981 0000 +M520190611111117009120120118WTTTY@@@P222122122222 0422011 0000 +M42019061111111720920000404071163113 +M520190611111117209119810701WTTT###Z012222222222250112112126470000 +M520190611111117209120120116WTTT#B9#@122222222222 0422981 0000 +M520190611111117209120070101WTTT#WWW9122222122222 0422061 0000 +M520190611111117209120050116WTTT#@WZB122222122222 0422081 0000 +M42019061111111742520900400501162113 +M520190611111117425119900623WTTTYY@WW12222222222210112121122930000 +M520190611111117425120180615WTTTY000T122221122222 0422981 0000 +M520190611111117425120130819WTTT#TBP#222222122222 0422981 0000 +M520190611111117425120100619WTTT#ZZW9122222222222 0422021 0000 +M520190611111117425120070502WTTTPWYYP222221122222 0422051 0000 +M42019061111111755220000402281162113 +M520190611111117552119850106WTTTYTTBZ22222122222210112121113320000 +M520190611111117552120160706WTTTP0ZPZ122221222222 0422981 0000 +M520190611111117552120130107WTTT#9@@Z222221122222 0422981 0000 +M520190611111117552120080115WTTTPYYT0222221122222 0422041 0000 +M42019061111111768420600400291163113 +M520190611111117684119890719WTTT#T0@B22222122222210112111114510000 +M520190611111117684120170821WTTTBT@TZ222221222222 0422981 0000 +M520190611111117684120160126WTTT#0#ZY222221222222 0422981 0000 +M42019061111111776821700404611162113 +M520190611111117768119940608WTTT#WT#022212222222220112121118330000 +M520190611111117768120171101WTTT#PTW9222122222222 0422981 0000 +M42019061111111901221100406001161113 +M520190611111119012119860815WTTTPB0TP12222222222210112131133040000 +M520190611111119012120150621WTTTYZ##@222222222222 0422981 0000 +M520190611111119012120140102WTTTP@PTP122122122222 0422981 0000 +M520190611111119012120070713WTTT##PP#222222222222 0422051 0000 +M520190611111119012120051102WTTT0WWTZ122222122222 0422071 0000 +M42019061111111904420000400131163113 +M520190611111119044119880119WTTT##@PY22222122222210112111126490000 +M520190611111119044120160501WTTTPZWWT222222222222 0422981 0000 +M42019061111111906120900401881163113 +M520190611111119061119800101WTTTY90TW22222222222210112131100000000 +M520190611111119061120130815WTTTPT@WT222122222222 0422981 0000 +M520190611111119061120110507WTTTP##B@222122222222 0422021 0000 +M42019061111111950021100406541163113 +M520190611111119500119840619WTTT0@9@Z12222222222230112112121520000 +M520190611111119500120150103WTTTP9TTW122222122222 0422981 0000 +M520190611111119500120070701WTTT09TWZ122222222222 0422051 0000 +M42019061111111997322700403611163113 +M520190611111119973119730826WTTT0T#Y#22222122222210112121121070000 +M520190611111119973120030121WTTTYTYB0222221222222 0422101 0080 +M42019061111111997720900400501161113 +M520190611111119977219821118WTTTPZPT@22222222222210112113200000000 +M520190611111119977119770615WTTTPPZTY22212222222220212111121480000 +M520190611111119977120190519WTTTYTZ@Z222222122222 0422981 0000 +M520190611111119977120160602WTTT0Y#9Y222222222222 0422981 0000 +M42019061111112009621100403821163113 +M520190611111120096119770608WTTTYP0@Z12222222222210112081132360000 +M520190611111120096120060614WTTTYZZ@P222122222222 0422071 0000 +M42019061111112009820900403031163113 +M520190611111120098119730713WTTTY099P22212222222220112123120350000 +M520190611111120098120110116WTTTY@WTB222122122222 0422021 0000 +M42019061111112013121100403821163113 +M520190611111120131119801107WTTT0TPYW12222222222210112121115390000 +M520190611111120131120160726WTTTYY@T0222222122222 0422981 0000 +M520190611111120131120150113WTTT#0W0Y222222222222 0422981 0000 +M520190611111120131120030116WTTT##99Z122222122222 0422101 0000 +M42019061111112019821100402441993113 +M520190611111120198119800718WTTTPT0@@22222122222210112111118850000 +M520190611111120198120160616WTTT0BWZY222221122222 0422981 0000 +M520190611111120198120120121WTTT#YWPY222221122222 0422011 0000 +M42019061111112046522400401481163113 +M520190611111120465119830702WTTTPZ0@@22222122222210112111118870000 +M520190611111120465120130719WTTT#Y9TT222222122221 0422981 0412 +M520190611111120465120090618WTTT#TPZ@222221122222 0422041 0000 +M42019061111112051221400405981163113 +M520190611111120512119740614WTTTPBTPZ22222122222230112121117330000 +M520190611111120512120080513WTTT#TTT@222221222222 0422051 0000 +M520190611111120512120050803WTTT0WT9Z222221222222 0422071 0000 +M42019061111112081620900406601162113 +M520190611111120816119890519WTTT0YZ@#12222222222210112141110400000 +M520190611111120816120140521WTTTP@ZYZ222222222222 0422981 0000 +M42019061111112108420500406931161113 +M520190611111121084119820721WTTTP0ZTP22222122222210112121116950000 +M520190611111121084120180101WTTT0BZPB122221122221 0422981 0712 +M520190611111121084120030112WTTT0@ZZ0222221122221 0422101 0639 +M42019061111112111120000404071163113 +M520190611111121111119820103WTTTY#00912222122222230112121124310000 +M520190611111121111120050123WTTT0B#WB122222222222 0422081 0000 +M42019061111112165920900400501162113 +M520190611111121659119860126WTTTYZ#WT22222122222210112111120880000 +M520190611111121659120140519WTTTP9YB0222221222222 0422981 0000 +M520190611111121659120090602WTTT#PYTZ222221222222 0422041 0000 +M520190611111121659120060508WTTT0PYPZ222221222222 0422071 0000 +M520190611111121659120030509WTTT#PBTY222221122222 0422101 0000 +M42019061111112194320000402281161113 +M520190611111121943119680707WTTT0WTTW22212222222210112131123560000 +M520190611111121943120091116WTTTP00@B222122222222 0422031 0000 +M42019061111112194920900406421161113 +M520190611111121949219771119WTTT0TWYT22222212222220222113200000000 +M520190611111121949119720119WTTT0YTYZ12222222222210112121118200000 +M520190611111121949120070623WTTTP@@@9122221122222 0422061 0000 +M42019061111112207120600400871163113 +M520190611111122071119960113WTTT#0WZ012222122222210112111103850925 +M520190611111122071120190519WTTTPP9TB122222122222 0422981 0000 +M520190611111122071120170708WTTT0P@#P222222122222 0422981 0000 +M42019061111112214920900406151162113 +M520190611111122149119700623WTTT##ZZP12222222222210112121122300000 +M520190611111122149120100615WTTTPPT0Z222122122222 0422031 0000 +M42019061111112230220900401881161113 +M520190611111122302119770709WTTT00#0Y12222222222210112111118020000 +M520190611111122302120100603WTTTPPB0P122222222222 0422031 0000 +M520190611111122302120060601WTTT#@0TY122222122222 0422061 0000 +M520190611111122302120040122WTTTYZWZ9122222122222 0422091 0000 +M42019061111112234221100406001163113 +M520190611111122342119870706WTTTY@@9Z12222122222210112111129460000 +M520190611111122342120160112WTTT#PY#Z122222222222 0422981 0000 +M520190611111122342120070809WTTT#9ZP0122222122222 0422051 0000 +M42019061111112234920900406151163113 +M520190611111122349119950806WTTT0009W12222222222210112111120800000 +M520190611111122349120170723WTTT09TZZ122222222222 0422981 0000 +M42019061111112238720600400291163113 +M520190611111122387119820723WTTT#9@@W22212122222230112161126240000 +M520190611111122387120090603WTTT#YTW@222122122222 0422041 0000 +M42019061111112248620600400431163113 +M520190611111122486119830701WTTTYYYYP22222122222210112121117240000 +M520190611111122486120180614WTTTP@TTW222222122222 0422981 0000 +M42019061111112295820600401981993113 +M520190611111122958119880801WTTTPYYP#12222222222210112141122810130 +M520190611111122958120050718WTTTPTZZZ122221122222 0422071 0000 +M520190611111122958120040106WTTTYP@0P122221122222 0422091 0000 +M42019071111111125720900404621163113 +M520190711111111257119830602WTTTYP00P22122222222220112121113200000 +M520190711111111257119810626WTTTYYTPY22122212222220212111122500000 +M520190711111111257120170108WTTT0Z0BY222222122222 0422981 0000 +M520190711111111257120120119WTTT#B@P9221222222222 0422981 0000 +M520190711111111257120100103WTTT0@B9Y221222222222 0422021 0000 +M520190711111111257120090115WTTTPBBZ@221222222222 0422041 0000 +M520190711111111257120070719WTTT#T@T9221222222222 0422051 0000 +M42019071111111127322400406121163113 +M520190711111111273119680509WTTT0Z0T@21212222222210112121121700000 +M520190711111111273120050115WTTT##PY@222122222222 0422081 0000 +M520190711111111273120020102WTTT0ZZ9B222122222222 0422101 0000 +M42019071111111130321700406831162113 +M520190711111111303119970122WTTTYWZB012222222222210112081119410000 +M520190711111111303120180801WTTT#YPW0222222122222 0422981 0000 +M520190711111111303120150619WTTTYW0@Y122221222222 0422981 0000 +M42019071111111150421100401691161113 +M520190711111111504119860515WTTT00@@W12222122222210112131127730000 +M520190711111111504120120518WTTT0Y@09122221222222 0422981 0000 +M520190711111111504120070518WTTT09BB@122221122222 0422051 0000 +M520190711111111504120020114WTTTPW0ZW122222122222 0422101 0150 +M42019071111111150621700405821161113 +M520190711111111506119770615WTTT0PTYW12222122222250112141125690000 +M520190711111111506120090622WTTT#B@9B122222122222 0422041 0000 +M520190711111111506120070718WTTTPW9@T122222122222 0422061 0000 +M520190711111111506120030115WTTT00ZW0122222222222 0422101 0000 +M42019071111111166322700403941161113 +M520190711111111663119790115WTTT#YZBP22212222222230112131123110000 +M520190711111111663120050101WTTTYZZ#@222122122222 0422081 0000 +M42019071111111200920000403951163113 +M520190711111112009119790812WTTT00@ZB22212222222220212112300000000 +M520190711111112009119510602WTTTPBY#922212211222220112111123950968 +M520190711111112009120170515WTTTYBBPB222222122222 0422981 0131 +M520190711111112009120130101WTTTY@PZW222122122222 0422981 0142 +M520190711111112009120091101WTTT#BWZT222122222222 0422031 0142 +M520190711111112009120061108WTTTY#BTY222122222222 0422061 0142 +M42019071111111205820300403511163113 +M520190711111112058119920521WTTT#Z9W022212122222210112121111010000 +M520190711111112058120180521WTTTY9ZPB222222122222 0422981 0000 +M520190711111112058120140807WTTT#TB@9222221222222 0422981 0000 +M42019071111111214921700404101163113 +M520190711111112149119920114WTTTPPYTY12222222222210112111116580000 +M520190711111112149120100101WTTTYBP0T122221222222 0422031 0000 +M42019071111111224121700406831993113 +M520190711111112241119800115WTTT0WP0Y22222222222210112111128020000 +M520190711111112241120100721WTTT#BB@#222221122222 0422021 0000 +M42019071111111281322200404211163113 +M520190711111112813119910818WTTTYTZ9B22222122222210112111118290000 +M520190711111112813120140714WTTTY@BZ9222222222222 0422981 0000 +M520190711111112813120110115WTTTP@PZY222221122222 0422011 0000 +M42019071111111290820000403011163113 +M520190711111112908119950723WTTT#T0#B22212222222210112111119380000 +M520190711111112908120150509WTTT#B@@0222222122222 0422981 0000 +M42019071111111291320600402201163113 +M520190711111112913119790119WTTTYYP9B22222122222210112111125350000 +M520190711111112913120130701WTTTBTT9B222221222222 0422981 0000 +M42019071111111318721100401181163113 +M520190711111113187119810126WTTTY9WY@12222222222230112112120190000 +M520190711111113187120080101WTTTPZY0W122222222222 0422042 0000 +M520190711111113187120050809WTTTP0Z00122222222222 0422072 0000 +M42019071111111319520000404071162113 +M520190711111113195119810501WTTT#@YBZ12222222222210112111128640000 +M520190711111113195120101122WTTT0@@@Z122222122222 0422021 0000 +M520190711111113195120050701WTTTP@B9@122222222222 0422071 0000 +M520190711111113195120030102WTTT#BT9Y122222222221 0422101 0471 +M520190711111113195120020119WTTT0##P@122222222222 0422111 0000 +M42019071111111321422400405111161113 +M520190711111113214119840821WTTTYZPZB12222222222250112111123740000 +M520190711111113214120120122WTTT#@@@P122221222222 0422981 0000 +M520190711111113214120080101WTTTYWPB#122221122222 0422051 0000 +M520190711111113214120030506WTTT#PP@B122222122222 0422101 0000 +M42019071111111330022400400961162113 +M520190711111113300119860703WTTTY@TP@22222122222210112121117070000 +M520190711111113300120150113WTTTYP#P@222221222222 0422981 0000 +M520190711111113300120100108WTTT#W9W@222221122222 0422021 0000 +M520190711111113300120071112WTTTP#YTT222221222222 0422051 0329 +M520190711111113300120050626WTTT0B0Z#222221122222 0422081 0000 +M42019071111111364021100401461163113 +M520190711111113640119900626WTTTYYPW#22222122222210112121125990000 +M520190711111113640120170121WTTT#9B0W122222222222 0422981 0000 +M520190711111113640120170121WTTTPZ9YT122222222222 0422981 0000 +M42019071111111389820600401981161113 +M520190711111113898119770615WTTT0T@@Y12222222222220112081120190000 +M520190711111113898120060501WTTTP0ZZB122222222222 0422061 0000 +M520190711111113898120040603WTTT0#0PT122222122222 0422091 0000 +M42019071111111394021400401581161113 +M520190711111113940119940113WTTT#B#BT22222122222210112121100000000 +M520190711111113940120170723WTTTPB90W222222222222 0422981 0000 +M520190711111113940120130501WTTT##9W@222221122222 0422981 0000 +M520190711111113940120110723WTTT0WT0Y222221122222 0422011 0000 +M42019071111111399122400400231163113 +M520190711111113991119851118WTTT0Y@BY22212222222230112112123590000 +M520190711111113991120160116WTTT0WWYY222122222222 0422981 0000 +M42019071111111399620900401881163113 +M520190711111113996119731106WTTT0WY#T22212222222210112111122120000 +M520190711111113996120020113WTTT#WY@Y222122222222 0422101 0000 +M42019071111111457220900406601011113 +M520190711111114572119780601WTTTYZW@T22222222222250112111120810000 +M520190711111114572120060603WTTTY@Z9#222222222222 0422071 0000 +M42019071111111483620900406131163113 +M520190711111114836119960616WTTT#@BTW12222222222210112112122180000 +M520190711111114836120180122WTTT0@ZWB122221122222 0422981 0000 +M520190711111114836120160615WTTTYZ@T0122222122222 0422981 0000 +M42019071111111508120600401981163113 +M520190711111115081119890615WTTT0TB@922222122222230112121126270000 +M520190711111115081120150119WTTTPPWP@122221122222 0422981 0000 +M520190711111115081120120123WTTT#ZTTZ122222222222 0422981 0000 +M520190711111115081120110806WTTTPBY##222222222222 0422011 0000 +M520190711111115081120070121WTTTYBB#@222122122222 0422061 0000 +M42019071111111536920900400391161113 +M520190711111115369119730726WTTT#PZPW22212222222230112121117710000 +M520190711111115369120131103WTTTYPWZB222122222222 0422981 0000 +M42019071111111551321700402341163113 +M520190711111115513119901122WTTTYTBPZ22222222222210112111126840000 +M520190711111115513120160112WTTTYWPZY122222222222 0422981 0000 +M520190711111115513120080109WTTTY@090222122222222 0422041 0000 +M42019071111111556022700402801161113 +M520190711111115560119800821WTTTYYBBW22222122222210112111119570000 +M520190711111115560120130602WTTT0Y90P222221122222 0422981 0000 +M42019071111111565320600405471163113 +M520190711111115653119841101WTTT000@Y22222112222210112121115890000 +M520190711111115653120070123WTTT#P9B0222221222222 0422051 0000 +M42019071111111577720600405171193113 +M520190711111115777119920526WTTT##9YZ12222222222210112121100000000 +M520190711111115777120120626WTTTY0WY0122222122222 0422011 0000 +M42019071111111605020900406421161113 +M520190711111116050119810101WTTT0W9@T12222222222210112111117390000 +M520190711111116050120150721WTTT0YB0Z222222122222 0422981 0000 +M520190711111116050120060123WTTTP#PW0122222122222 0422061 0000 +M520190711111116050120020802WTTT0BB#9122222122222 0422101 0000 +M42019071111111627720600402981013113 +M520190711111116277119880619WTTT0ZYPW22212222222210112141124930000 +M520190711111116277120180101WTTT#@@0B222222122222 0422981 0000 +M42019071111111629721200406661163113 +M520190711111116297119910623WTTT#ZTBZ22222122222210112121124150000 +M520190711111116297120170701WTTT#Y0#0222221222222 0422981 0000 +M520190711111116297120140115WTTTY@ZP0222221222222 0422981 0000 +M42019071111111629921100406391162113 +M520190711111116299119760823WTTT#0Z@#12222221222210112121112420817 +M520190711111116299120130722WTTT00W@9222222122222 0422981 0153 +M520190711111116299120110715WTTT#YB##222222222222 0422011 0153 +M42019071111111642921400403091163113 +M520190711111116429119950712WTTTYWYZT22222122222210112111126480000 +M520190711111116429120150123WTTTYWBW@222221122222 0422981 0000 +M42019071111111643321100405971163113 +M520190711111116433119920826WTTT#WP9012222222222220112121130490000 +M520190711111116433120130116WTTT##Y0B122222222222 0422981 0000 +M520190711111116433120101115WTTT#Z@Y0122222222222 0422021 0000 +M520190711111116433120060801WTTTPWW0@122222122222 0422061 0000 +M42019071111111654321700401221163113 +M520190711111116543119850723WTTTPPP9P22222112222210112121126980000 +M520190711111116543120120702WTTTY##9#222221222222 0422981 0000 +M42019071111111692820600401151163113 +M520190711111116928119730526WTTT#@Z9Z12222212222210112082118860000 +M520190711111116928120011101WTTT00W@W122222222222 0422112 0000 +M42019071111111702221400406791163113 +M520190711111117022119770515WTTT#WYW922212222222220112112117100000 +M520190711111117022120100502WTTT#P@@Y222122122222 0422022 0000 +M42019071111111705321100403821013113 +M520190711111117053119680815WTTTY#0PB12222222222210112111123511500 +M520190711111117053120020121WTTT0Y@TT122222122222 0422111 0000 +M42019071111111723621100405971013113 +M520190711111117236119840513WTTTYPY#@22222222222210112111131580000 +M520190711111117236120180115WTTTPZ9TY222222222222 0422981 0000 +M520190711111117236120120616WTTTPP@ZZ222222122222 0422011 0000 +M520190711111117236120080501WTTTYT#9@122222222222 0422051 0580 +M42019071111111757621100406391163113 +M520190711111117576119820615WTTT#B@YY22222121222230112121113970916 +M520190711111117576120130715WTTT0WW#B122222122222 0422981 0128 +M520190711111117576120081119WTTT0Y0WP122222122222 0422041 0064 +M520190711111117576120010719WTTTY9YP9222221122222 0422111 0064 +M42019071111111771021700404101162113 +M520190711111117710119850823WTTT#WB0@12222122222210112111119350000 +M520190711111117710120080707WTTT0ZPBW122221222222 0422041 0000 +M520190711111117710120050101WTTT009PY122221222222 0422081 0000 +M520190711111117710120030115WTTTPWTB0122221222222 0422091 0000 +M42019071111111777020000401371163113 +M520190711111117770119890701WTTTP#ZBT22222122222210112131117700000 +M520190711111117770120140614WTTTPYT@9222222122222 0422981 0000 +M42019071111111892020900403431162113 +M520190711111118920119800102WTTT#B9WW22212222222210112111114740000 +M520190711111118920120130502WTTT##WBB222122122222 0422981 0000 +M520190711111118920120010726WTTT#9#Z9222122222222 0422111 0000 +M42019071111111902621400406791163113 +M520190711111119026119990106WTTT#0ZP@22222122222210112131300000000 +M520190711111119026219890113WTTTP9ZP922222112222111012121119180724 +M520190711111119026120190122WTTTYP99Y222221122222 0422981 0000 +M42019071111111914622700402231162113 +M520190711111119146119860123WTTTY@@B912222222222210112111125020000 +M520190711111119146120120815WTTT#ZTBY222222222222 0422981 0000 +M520190711111119146120040106WTTT#9@ZP122222122222 0422091 0000 +M42019071111111919921100402161013113 +M520190711111119199119770819WTTT0Y@W#22212222222230112141141930000 +M520190711111119199120140515WTTTYY9P@222122122222 0422981 0000 +M520190711111119199120110113WTTT099TP222122122222 0422021 0000 +M520190711111119199120080502WTTTY0@PP222122222222 0422051 0000 +M520190711111119199120050123WTTTP#YZT222122122222 0422071 0000 +M520190711111119199120030613WTTT0T#Y0222122122222 0422101 0000 +M42019071111111924821700405821162113 +M520190711111119248119940119WTTT#YTP#22212222222210112131122740000 +M520190711111119248120150619WTTT009WB222222222222 0422981 0000 +M42019071111111938022700400671013113 +M520190711111119380119930608WTTTYY@9@22222122222210112121121330000 +M520190711111119380120130606WTTTY@WPY222221122222 0422981 0000 +M42019071111111979122700406761161113 +M520190711111119791119940715WTTT#T@0022222122222210112121116030000 +M520190711111119791120150126WTTT#BPTT222222122222 0422981 0000 +M42019071111111998621100404791163113 +M520190711111119986119890708WTTTPWWTT22222122222210112111237260000 +M520190711111119986119871119WTTT##YT#12222212222210212121200000000 +M520190711111119986120150121WTTT#WT9T122221222222 0422981 0000 +M520190711111119986120130701WTTT#WPBZ222222122222 0422981 0000 +M520190711111119986120080806WTTT0WY#B222221122222 0422041 0000 +M42019071111112015420900401031161113 +M520190711111120154119780107WTTTPB09P22212222222210112111112520000 +M520190711111120154120140103WTTTPP9#T222122122222 0422981 0000 +M520190711111120154120080116WTTT0WPP9222122122222 0422041 0000 +M42019071111112026320600405471163113 +M520190711111120263119920713WTTTY0ZYW12222222222210112111116150000 +M520190711111120263120171103WTTTYTW#P222221122222 0422981 0000 +M520190711111120263120150719WTTT0PP#9122221122222 0422981 0000 +M520190711111120263120120106WTTTPT0YW222222222222 0422011 0000 +M520190711111120263120101126WTTT#BTWP222222122221 0422021 0885 +M42019071111112034820900402621161113 +M520190711111120348119720715WTTT0@Z@T12222222222210112131126010000 +M520190711111120348120030712WTTTY@YYB122222222222 0422091 0000 +M42019071111112075221100403821162113 +M520190711111120752119810106WTTTYT9YY12222222222210112111130220000 +M520190711111120752120120116WTTTY0YWY122222122222 0422011 0000 +M520190711111120752120060815WTTTPZY#T122222122222 0422061 0000 +M520190711111120752120030623WTTTPP09Z122222122222 0422101 0000 +M42019071111112080020000400131163113 +M520190711111120800119890709WTTT#TYB@22222122222210112121117390000 +M520190711111120800120100816WTTTP@@0T222221222222 0422021 0000 +M42019071111112156020600405471193113 +M520190711111121560119850501WTTT0TZBP12222222222230112121113040000 +M520190711111121560120160708WTTTYBWW@122222222222 0422981 0000 +M520190711111121560120120519WTTTP@T9Z122222122222 0422981 0000 +M42019071111112157622700402581163113 +M520190711111121576119960619WTTT0Z0T922222122222210112081126000000 +M520190711111121576120170606WTTT##BPT222221122222 0422981 0000 +M42019071111112176121400400351163113 +M520190711111121761219850609WTTTPY#P@12222222222220212113200000000 +M520190711111121761119680126WTTT0@BT@12222212222220112111128640000 +M520190711111121761120030616WTTTY0P9@122222222222 0422101 0000 +M42019071111112211420600401981163113 +M520190711111122114119930523WTTT0PPP912222222222210112121112730000 +M520190711111122114120170618WTTTP0##P122221122222 0422981 0030 +M42019071111112223420500402421013113 +M520190711111122234119750115WTTTYBPYP22222122222210112111128170000 +M520190711111122234120040806WTTTP9@ZY222221222222 0422081 0000 +M520190711111122234120010815WTTTP9PP0222221122222 0422111 0000 +M42019071111112244120000402101163113 +M520190711111122441119780822WTTT0YB@012222222222220112131125410000 +M520190711111122441120141115WTTT##Y9#222221222222 0422981 0000 +M42019071111112248320600405471163113 +M520190711111122483119880108WTTT0TBPP22212222222210112112123320000 +M520190711111122483120180702WTTTPBZBW222222122222 0422981 0000 +M42019071111112277420600405771163113 +M520190711111122774119900822WTTT#ZZT022222122222210122111121670000 +M520190711111122774120130707WTTT#TTZT222121222222 0722981 0563 +M42019071111112277520000404271163113 +M520190711111122775219800726WTTTYY#ZY22122222222211012113200000000 +M520190711111122775119750119WTTT00#WY22122212222220112111131500000 +M520190711111122775120170122WTTT0W9@@222222122222 0422981 0000 +M520190711111122775120090115WTTTBTT@T222222222222 0422041 0000 +M42019071111112279522400406121162113 +M520190711111122795119811115WTTT#9W9@22212222222210112131133630000 +M520190711111122795120170115WTTTPWBZZ222122222222 0422981 0000 +M520190711111122795120141114WTTTPZ@9@222122122222 0422981 0000 +M520190711111122795120080708WTTTYPZPY222122122222 0422041 0000 +M42019081111111140220600405341161113 +M520190811111111402119900118WTTT#YYBB22212222222210112121119560000 +M520190811111111402120150123WTTT0#9PW222122222222 0422981 0000 +M42019081111111209720600401151163113 +M520190811111112097119750708WTTT0WZYT12212222222230112111126000000 +M520190811111112097120110126WTTT0#B@W122122122222 0422011 0000 +M42019081111111213820900406601993113 +M520190811111112138119830119WTTTP#B9#22222122222250112111124970000 +M520190811111112138120180112WTTTY09Y#222222122222 0422981 0000 +M42019081111111215621400405981163113 +M520190811111112156119900501WTTT0YPY@22212222222210112111116900000 +M520190811111112156120160119WTTT#0YW9222122122222 0422981 0000 +M42019081111111218020900402621161113 +M520190811111112180119860608WTTT0ZWZ#22212222222210112131100000000 +M520190811111112180120170515WTTTYZ9P#222122222222 0422981 0000 +M520190811111112180120130112WTTTP9Z#W212222222222 0422981 0000 +M520190811111112180120080101WTTT0B900222122122222 0422051 0000 +M42019081111111223621100404801163113 +M520190811111112236119830119WTTT0YZYW22222122222210112121120930000 +M520190811111112236120010819WTTTP##9Y222221122222 0422111 0000 +M42019081111111289521200404291163113 +M520190811111112895119920116WTTT##@WY22222122222210112111120180000 +M520190811111112895120120101WTTT##90Z222221222222 0422011 0000 +M42019081111111297822700403941163113 +M520190811111112978119950815WTTT#BT0#22222122222210112111122140000 +M520190811111112978120160821WTTTY0TBZ222121222222 0422981 0000 +M42019081111111304520900401031161113 +M520190811111113045119910701WTTTPTY9@22212222222230112121121670000 +M520190811111113045120160703WTTTPPPT0222122222222 0422981 0000 +M520190811111113045120120701WTTT0BT9W222122222222 0422011 0000 +M520190811111113045120120701WTTT0#T@0222122222222 0422011 0000 +M520190811111113045120100123WTTT#9#Z#222122222222 0422031 0000 +M520190811111113045120060706WTTTP#ZY@222122122222 0422071 0000 +M42019081111111337621100406541011113 +M520190811111113376119900815WTTT#BB#@12222222222210112111126980000 +M520190811111113376120170612WTTT#@BWP122222222222 0422981 0000 +M520190811111113376120130106WTTT#B99P222222222222 0422981 0000 +M42019081111111348222400401011162113 +M520190811111113482119940723WTTT#BZ9#12222222222210112081113180000 +M520190811111113482120170618WTTT#WBWW222222122222 0422981 0000 +M42019081111111353521100406541013113 +M520190811111113535119920801WTTTY0ZPZ22222122222210112121126130000 +M520190811111113535120160106WTTT0#B00122222222222 0422981 0000 +M42019081111111368320900406131163113 +M520190811111113683119920719WTTT0PPY012212122222211012121121170000 +M520190811111113683119780521WTTTPP#BT12222211222210112121200000789 +M520190811111113683120170101WTTTYT@WW122222222222 0422981 0000 +M520190811111113683120150713WTTTYTYWP122221222222 0422981 0000 +M42019081111111393621100404711162113 +M520190811111113936119920512WTTT##9@T22222122222210112121130340000 +M520190811111113936120140107WTTT#WPY0222221122222 0422981 0000 +M520190811111113936120110506WTTT##0Y9222221122222 0422011 0000 +M42019081111111394321400402181161113 +M520190811111113943119900823WTTTP9@TY21212122222210112121100000000 +M520190811111113943120170114WTTT##YYZ222221222222 0422981 0000 +M520190811111113943120120123WTTT0BBB9222222122222 0422981 0000 +M42019081111111411021100401541162113 +M520190811111114110119790102WTTTPWB#P22222122222210112121127710000 +M520190811111114110120110608WTTT#Y#YP222221222222 0422021 0000 +M520190811111114110120090702WTTTY#Z9@222221222222 0422031 0000 +M520190811111114110120070126WTTTY@TZ9222222122222 0422061 0000 +M520190811111114110120021122WTTT#BTZ#222221122222 0422101 0000 +M42019081111111415722700400671163113 +M520190811111114157119780109WTTTP@#T@22212222222210112112127750000 +M520190811111114157120080714WTTT0@0TB222222222222 0422052 0000 +M520190811111114157120020501WTTTPW@9#222222122222 0422102 0000 +M42019081111111429520900400501993113 +M520190811111114295119900626WTTT##P0B22122212222220112111113000000 +M42019081111111466220600405471163113 +M520190811111114662119940122WTTTYZ9P012212222222210112121112130000 +M520190811111114662120140116WTTTP@YW0222222122222 0422981 0000 +M42019081111111472221700406571163113 +M520190811111114722119860101WTTTP@YY922222122222220112111118510000 +M520190811111114722119691113WTTT09B0W22212212222220212121130060000 +M520190811111114722120180623WTTT#Z@Z9222222222222 0422981 0000 +M520190811111114722120141102WTTT#WBYB222222122222 0422981 0000 +M520190811111114722120130114WTTT##00#222222222222 0422981 0000 +M42019081111111503922400406121163113 +M520190811111115039119830102WTTT#ZT9B22212212222220112111122030000 +M520190811111115039120130713WTTTY#0#B222122122222 0422981 0000 +M42019081111111523221700402381163113 +M520190811111115232119790115WTTTY900T12222222222210112121126600000 +M520190811111115232120050603WTTT0@@YZ122222222222 0422081 0000 +M520190811111115232120020121WTTTY9W#W122222122222 0422111 0000 +M42019081111111558520000402281161113 +M520190811111115585119850715WTTTY#WTZ12222222222210112111117360000 +M520190811111115585120080506WTTTY99Y0122222122222 0422051 0000 +M520190811111115585120060615WTTTYPPW9122222222222 0422071 0000 +M520190811111115585120050616WTTTY0#Y0122222122222 0422081 0000 +M520190811111115585120030101WTTT09Y#W122222122222 0422101 0000 +M42019081111111576120300404901161113 +M520190811111115761219850702WTTT00PZW22222122222110112121115230885 +M520190811111115761120170101WTTTYY#TY222222222222 0422981 0000 +M520190811111115761120100619WTTT0@@90222221122222 0422031 0000 +M42019081111111605920600400291163113 +M520190811111116059119890626WTTTPPTT#22222122222210112111123830000 +M520190811111116059120131123WTTT0#@@0222222222222 0422981 0000 +M520190811111116059120080508WTTTP0T0W222222222221 0422051 0771 +M42019081111111626420900402921012113 +M520190811111116264119890103WTTTPBP#T22222122222210112131124570000 +M520190811111116264120180118WTTTPW#@Z222221222222 0422981 0000 +M520190811111116264120151116WTTT0W009222221222222 0422981 0000 +M42019081111111627521100406541163113 +M520190811111116275119630709WTTTPW0YT12222222222230112121119570000 +M520190811111116275120040119WTTT##B@9122222222222 0422091 0000 +M42019081111111670520600404951163113 +M520190811111116705119710615WTTT0B#9W22222122222250112111116000000 +M520190811111116705120061101WTTT##P@P222221122221 0422061 0801 +M520190811111116705120020606WTTTBTZYY222221122221 0422111 0801 +M42019081111111689520600401161161113 +M520190811111116895119950123WTTT#9Y0W22222122222210112111113150000 +M520190811111116895120161114WTTTYZBBY222221222222 0422981 0000 +M42019081111111690620600404461013113 +M520190811111116906119871113WTTT#TT@T22222122222210112111119580000 +M520190811111116906120130712WTTT#T0Y#222221222222 0422981 0000 +M42019081111111701021100404801161113 +M520190811111117010119840514WTTT0ZB#B22222122222210112111119200000 +M520190811111117010120170716WTTTPBP9B122222222222 0422981 0000 +M520190811111117010120170716WTTTYZZBY122222222222 0422981 0000 +M520190811111117010120051109WTTT#0ZWB122222122222 0422071 0000 +M42019081111111701622400400551993113 +M520190811111117016219850519WTTT#@BPY22212222222220112113211970000 +M520190811111117016119830119WTTT0B99@22212212222220212111129850000 +M520190811111117016120160814WTTT#PZPZ222122222222 0422981 0000 +M520190811111117016120160814WTTT#W#YT222122222222 0422981 0000 +M520190811111117016120051112WTTT#ZTTW222122122222 0422073 0000 +M520190811111117016120020523WTTT#ZYPT222122122222 0422102 0000 +M42019081111111734721100406391163113 +M520190811111117347119920116WTTTYW@@B12222222222210112121115600000 +M520190811111117347120160802WTTT090YB122221222222 0422981 0000 +M520190811111117347120130609WTTTPBYBP122222122222 0422981 0000 +M42019081111111745920500404091163113 +M520190811111117459119810718WTTT#YTBY22222122222210112111116350000 +M520190811111117459120170116WTTT0ZB0Y222221122222 0422981 0000 +M520190811111117459120090703WTTTP00Y9222221122222 0422041 0000 +M42019081111111756120900401881161113 +M520190811111117561119930106WTTT#TPW#22212222222210112111121640000 +M520190811111117561120100126WTTTYW9B0222122122222 0422031 0000 +M42019081111111823720000406161163113 +M520190811111118237119910723WTTTYYZT022222122222210112111129440000 +M520190811111118237120120716WTTTYY9@B222222122222 0422981 0000 +M520190811111118237120100119WTTTY0WYT222222222222 0422021 0000 +M42019081111111827220000404271163113 +M520190811111118272119930701WTTT#BZ@@12222122222250112121119540149 +M520190811111118272120160623WTTTPPW0B122222222222 0422981 0000 +M520190811111118272120140102WTTT0WYZY122222122222 0422981 0000 +M42019081111111835221700402341163113 +M520190811111118352119920613WTTT#Z0TB12222222222210112111122080000 +M520190811111118352120150126WTTT0ZYBT122222122222 0422981 0000 +M520190811111118352120110515WTTT#BBPT122222222222 0422021 0000 +M520190811111118352120080716WTTTYBYBT122221122222 0422051 0000 +M42019081111111836020900401881163113 +M520190811111118360119840601WTTTYY9WP22212222222210112111122310000 +M520190811111118360120141103WTTTP0@9Y222222122222 0422981 0000 +M520190811111118360120101115WTTTPPT9@222122122222 0422021 0000 +M42019081111111856322700400671163113 +M520190811111118563119771107WTTTYZW@P12222212222250112111126490000 +M520190811111118563120060709WTTT0WY#0122222122222 0422061 0000 +M520190811111118563120030715WTTTY#900122222222222 0422091 0000 +M42019081111111858721400400351161113 +M520190811111118587119881118WTTTYTZT@22212222222210112121119480000 +M520190811111118587120110715WTTTPT0@P222122122222 0422021 0000 +M520190811111118587120090723WTTTPT#T#122122122222 0422031 0000 +M42019081111111896921100406001162113 +M520190811111118969119930601WTTT0PP0Y12212222222210112121121830000 +M520190811111118969120130707WTTTY00@T222222122222 0422981 0000 +M520190811111118969120090602WTTTPZWBY222122122222 0422041 0000 +M42019081111111906522200403201163113 +M520190811111119065119740115WTTTPWPWP22222122222210112111135630000 +M520190811111119065120080608WTTT#ZPPP222222122222 0422051 0000 +M520190811111119065120080608WTTTP##99222222122222 0422051 0000 +M520190811111119065120040616WTTT#W@9Y222222122222 0422091 0000 +M42019081111111910820900403071161113 +M520190811111119108119850601WTTT0ZYBZ22212222222210112111100000000 +M520190811111119108120070608WTTT0@#@W222122222222 0422061 0000 +M520190811111119108120020519WTTTYTB@W222122222222 0422111 0000 +M42019081111111919320000402281013113 +M520190811111119193119920826WTTT0@W#B22222222222210112111121650000 +M520190811111119193120180502WTTT09Z9#122221222222 0422981 0000 +M42019081111111981020900406131162113 +M520190811111119810119851101WTTT#T00T12222222222210112121130540000 +M520190811111119810120170519WTTTPBW@T222222222222 0422981 0000 +M520190811111119810120100115WTTTYPZ9T222222222222 0422031 0000 +M520190811111119810120070619WTTT#9@TW222222222222 0422061 0000 +M520190811111119810120030101WTTT0Y9Y9222221222222 0422091 0000 +M42019081111111987321700406831163113 +M520190811111119873119880816WTTT#0BY022222122222210112121117220000 +M520190811111119873120140815WTTT#TTTZ222222122222 0422981 0000 +M520190811111119873120090526WTTTPY9B0222221122222 0422031 0000 +M520190811111119873120080119WTTT0@0##222221122222 0422041 0444 +M42019081111111990920900403031162113 +M520190811111119909119880509WTTT#000P22212222222210112111129540000 +M520190811111119909120180726WTTT0TPYT222122222222 0422981 0000 +M520190811111119909120090601WTTTYPBYB222122222222 0422041 0000 +M42019081111112013921700405151163113 +M520190811111120139119660116WTTTY9#0W22222122222220112111122220000 +M520190811111120139120040501WTTTPBWTP222221222222 0422081 0000 +M42019081111112046121100401551163113 +M520190811111120461119880115WTTT0YB#Y12222222222220112131132030000 +M520190811111120461120111115WTTTPY9T9122222122222 0422011 0000 +M520190811111120461120111115WTTT099T#122222122222 0422011 0000 +M42019081111112058522700400441163113 +M520190811111120585119920603WTTTPTZ0#22212122222210112081113330000 +M520190811111120585120180519WTTTPWZ00222221222222 0422981 0000 +M42019081111112060021100406391163113 +M520190811111120600119930715WTTTY9T##22222222222210112081113320000 +M520190811111120600120140612WTTTP@BWW222221122222 0422981 0000 +M520190811111120600120110102WTTTYB0#P222221222222 0422021 0000 +M42019081111112085221200404541163113 +M520190811111120852119920515WTTT0@P9@22222122222210112111119860000 +M520190811111120852120170721WTTTP9WBY222221122222 0422981 0000 +M42019081111112099520600400871163113 +M520190811111120995119970101WTTTY9PZY22222222222210112081116480000 +M520190811111120995120160521WTTT#P00#222222122222 0422981 0000 +M42019081111112116520000406951162113 +M520190811111121165119770116WTTTY#99P22212222222250112121125401000 +M520190811111121165120130803WTTT#00#@222222222222 0422981 0000 +M520190811111121165120110502WTTTY0W#W222122122222 0422011 0000 +M520190811111121165120070119WTTT#W0Z9222122222222 0422061 0000 +M520190811111121165120050115WTTTP0B0W222122222222 0422071 0000 +M42019081111112126322700400671163113 +M520190811111121263119880102WTTT0@YP#22222122222210112131131210000 +M520190811111121263120181119WTTT0TYWY222122122222 0422981 0000 +M520190811111121263120150116WTTT#WZ9#122221122222 0422981 0000 +M42019081111112181022400406941163113 +M520190811111121810119740119WTTTYYWZP22222122222210112111120880000 +M520190811111121810120030715WTTTPZTB@222221222222 0422091 0000 +M520190811111121810120010806WTTTPZ0PY222221122222 0422111 0000 +M42019081111112189922400400881163113 +M520190811111121899119940102WTTTYP#BW22222122222210112121113310000 +M520190811111121899120180821WTTT0BY9B222221122222 0422981 0000 +M520190811111121899120140715WTTT0WT#@222221222222 0422981 0100 +M42019081111112190621700404201161113 +M520190811111121906119860722WTTTP#9ZP12222222222210112121136370000 +M520190811111121906120120515WTTTPPP#T122221222222 0422981 0000 +M520190811111121906120080519WTTT0@@T9122222222222 0422041 0000 +M520190811111121906120070621WTTT0BYY#122222122222 0422061 0000 +M42019081111112193921400400351163113 +M520190811111121939119910812WTTT0ZWYW22212222222210112131127080000 +M520190811111121939120140607WTTTY99@#222122222222 0422981 0000 +M42019081111112205221700406831993113 +M520190811111122052119901114WTTTPWPZ922222211222210212121200000932 +M520190811111122052119870115WTTT0PW#922222122222210112121116690000 +M520190811111122052120180121WTTT0#9#@222221122222 0422981 0000 +M520190811111122052120170502WTTT090W@222222122222 0422981 0079 +M520190811111122052120050723WTTT0PYW@222222222222 0422081 0000 +M42019081111112206622700402801163113 +M520190811111122066119940101WTTT0BZB#22222122222210112121116410200 +M520190811111122066120161101WTTTPB#@W222221222222 0422981 0000 +M42019081111112229521700405121162113 +M520190811111122295119990116WTTTP9@P@12222222222210112981124700000 +M520190811111122295120180101WTTTYZ#P0122222122222 0422981 0000 +M42019081111112262022700400671161113 +M520190811111122620119870726WTTT#T#0Z22212222222210112121119250000 +M520190811111122620120110801WTTTYZ9TY222122222222 0422011 0000 +M520190811111122620120100119WTTTYPBT9222122222222 0422031 0000 +M520190811111122620120061114WTTT#YPBY222122222222 0422061 0000 +M42019081111112284920600404951162113 +M520190811111122849119861116WTTT0TW@022212222222210112111126220000 +M520190811111122849120130109WTTT#BZT0222222122222 0422981 0000 +M520190811111122849120090819WTTTP0ZBY222222222222 0422031 0000 +M42019091111111115922700400671161113 +M520190911111111159119800722WTTT#P#0B22222122222230112131120160000 +M520190911111111159120020116WTTTYBWYB222122222222 0422101 0000 +M42019091111111151121400400351163113 +M520190911111111511220070513WTTTYZTPB22212212222210412113200000000 +M520190911111111511119650101WTTTP##B#22212212222210112111132170000 +M520190911111111511120111119WTTT0PW#Z222212222222 0422013 0000 +M520190911111111511120100622WTTTY9P9Y222122222222 0422033 0000 +M520190911111111511120040101WTTT#WWBP222122222222 0422092 0000 +M520190911111111511120010519WTTT#9P#@222122122222 0422112 0000 +M42019091111111152521700405521163113 +M520190911111111525119890506WTTTYY#9B22222122222210112131121450213 +M520190911111111525120170726WTTT#@WWB222222122222 0422981 0000 +M520190911111111525120110702WTTT#T###222221222222 0422021 0000 +M520190911111111525120080123WTTT#00PZ222221122222 0422041 0000 +M42019091111111190420900403031163113 +M520190911111111904119870815WTTT0@99B22212222222210112121100000000 +M520190911111111904120111126WTTTY#WBW222122222222 0422011 0000 +M42019091111111197621700402341162113 +M520190911111111976119860102WTTT#WB0Z12222222222210112121116610000 +M520190911111111976120160123WTTTY@99#122222122222 0422981 0000 +M520190911111111976120111121WTTTPZPT#222222122221 0422011 0673 +M42019091111111199020600405341163113 +M520190911111111990119930114WTTT###ZZ12222222222210112131119670000 +M520190911111111990120180606WTTT0TP#B222222222222 0422981 0000 +M520190911111111990120120703WTTT0WBYZ122221122222 0422011 0000 +M42019091111111199720000406821163113 +M520190911111111997119800526WTTT0YYB922212222222220112131117440000 +M520190911111111997120050708WTTTYW#WP222122222222 0422081 0000 +M42019091111111214320900401881163113 +M520190911111112143119950518WTTTPZP@#22222222222210112121118210000 +M520190911111112143120161122WTTTPBPP9222222122222 0422981 0000 +M42019091111111247320000405601162113 +M520190911111112473119890721WTTT0T#9W22222122222220212131100950000 +M520190911111112473119820123WTTT00YTZ22222112222220112131136960000 +M520190911111112473120180101WTTTYP@TZ222222222222 0422981 0000 +M520190911111112473120160516WTTTY90WZ222221222222 0422981 0000 +M42019091111111251920500402421993113 +M520190911111112519119960808WTTT#Y9@022222122222210112111116900000 +M520190911111112519120190615WTTTYZ0WY222222122222 0422981 0000 +M520190911111112519120170119WTTTYPWT#222222222222 0422981 0000 +M42019091111111256722700403941163113 +M520190911111112567119870101WTTT0@9P#22212222222210112131124720100 +M520190911111112567120170101WTTT#YZ#Z222222222222 0422981 0000 +M520190911111112567120100601WTTT#W@9#222122222222 0422031 0000 +M520190911111112567120050615WTTTPTB@#222122222222 0422081 0000 +M42019091111111260021100403751161113 +M520190911111112600119900602WTTT#TPTZ22212222222210112121119180000 +M520190911111112600120170707WTTT#W#PZ222122122222 0422981 0000 +M520190911111112600120140715WTTT#W#@W222222122222 0422981 0000 +M520190911111112600120060706WTTTY0BY#222122122222 0422071 0000 +M42019091111111261820600403391163113 +M520190911111112618119890114WTTT#9P@912222222222210112121120080000 +M520190911111112618120121119WTTTP@PZ0222222222222 0422981 0000 +M520190911111112618120080506WTTTP0@WY122221222222 0422051 0000 +M520190911111112618120070509WTTT#PY0Y122222122222 0422061 0000 +M42019091111111297420600401421162113 +M520190911111112974119810723WTTTPPY9Z22222112222211022111200000000 +M520190911111112974119800508WTTTP@WY022222122222220112111120870000 +M520190911111112974120021102WTTTP0P0Y222221222222 0422101 0000 +M42019091111111333620900401881162113 +M520190911111113336119870116WTTTY@P@022212222222210112111119220000 +M520190911111113336120130115WTTTP#9W0222122122222 0422981 0000 +M42019091111111335120000402101163113 +M520190911111113351119860821WTTT#9@BZ22122222222210112121143460000 +M520190911111113351120170107WTTTYB#Z9222222222222 0422981 0000 +M520190911111113351120150802WTTTYYWYB221222122222 0422981 0000 +M520190911111113351120070526WTTTYZ#00221222222222 0422061 0000 +M520190911111113351120030719WTTT09BZP221222122222 0422101 0000 +M520190911111113351120020622WTTT0Z9PT221222222222 0422111 0000 +M42019091111111344220900404651163113 +M520190911111113442119880101WTTT#0#Y@22212222222210112111116490000 +M520190911111113442120140102WTTT#BZ#W122221122222 0422981 0000 +M520190911111113442120090819WTTT#TZPB222122222222 0422031 0000 +M520190911111113442120070502WTTT#PBZ@222222122222 0422063 0000 +M42019091111111346521100406491162113 +M520190911111113465119850523WTTTP@99#12222222222210112131129300000 +M520190911111113465120080112WTTT0BPBP222222122222 0422051 0000 +M520190911111113465120030726WTTTYYYWW122222222222 0422101 0000 +M42019091111111396020900400501163113 +M520190911111113960119760523WTTTP#9B022212222222210112082112730000 +M520190911111113960120130822WTTT#BPTY122222122222 0422981 0000 +M520190911111113960120060815WTTTPZ9#Y222122122222 0422062 0000 +M520190911111113960120020721WTTTY##9B222122122222 0422112 0000 +M42019091111111433022700406371993113 +M520190911111114330119970602WTTT#00YT22222122222210112121116690000 +M520190911111114330120140118WTTT0@0ZT222221122222 0422981 0000 +M42019091111111459021200406661163113 +M520190911111114590119870523WTTT##BBB22222121222220112131121540590 +M520190911111114590119840706WTTTP#PYT22222112222220212111300000000 +M520190911111114590120170821WTTTP@TW0222221222222 0422981 0000 +M520190911111114590120150115WTTT#09YB222222122222 0422981 0000 +M520190911111114590120090726WTTTYBP@#222222122222 0422041 0000 +M42019091111111465420900404651161113 +M520190911111114654119850107WTTTYP@@912222222222230112111125640000 +M520190911111114654120070514WTTT#W00#122222122222 0422051 0000 +M520190911111114654120020122WTTTPZBZY122222222222 0422101 0000 +M42019091111111481221100403821163113 +M520190911111114812119880515WTTTY0WPB12222212222210112121119740000 +M520190911111114812120130115WTTTY9YT@122221222222 0422981 0000 +M42019091111111488820900406601013113 +M520190911111114888119740707WTTTPY9W@22222122222210112131121650000 +M520190911111114888120020102WTTT0Y9YP222221122222 0422101 0000 +M42019091111111499120000404151162113 +M520190911111114991119670606WTTT#TZTT22212222222230112122129110000 +M520190911111114991120020102WTTTY0#W@222122222222 0422111 0000 +M42019091111111505020600405471161113 +M520190911111115050119820101WTTT#ZPB#12222222222210112121114590000 +M520190911111115050120170615WTTTYP9T@122222222222 0422981 0000 +M520190911111115050120110715WTTT0BZ#@122222222222 0422021 0000 +M520190911111115050120070601WTTT0PTPZ122222122222 0422061 0000 +M520190911111115050120020714WTTT0Z9@P122222222222 0422111 0000 +M42019091111111506821700404181163113 +M520190911111115068119910814WTTT0#09W22222122222210112081131560000 +M520190911111115068120180515WTTTPZ##0222222122222 0422981 0000 +M520190911111115068120150502WTTT#WWWY222221222222 0422981 0000 +M520190911111115068120100801WTTTPY9@Y222221122222 0422021 0000 +M42019091111111513422400401011163113 +M520190911111115134119720123WTTT#WB#@22222122222210112131120060750 +M520190911111115134120070513WTTT#ZY@P222221122222 0422051 0000 +M42019091111111522320000401371163113 +M520190911111115223119870512WTTTYW@9Z22222122222210112121120900000 +M520190911111115223120180106WTTTY@9BZ222222122222 0422981 0000 +M42019091111111538420600401981163113 +M520190911111115384119990519WTTT0#@W012222222222210112121118650000 +M520190911111115384120150706WTTTYPTPW122222122222 0422981 0000 +M42019091111111540721700402341163113 +M520190911111115407119870712WTTTYTYTW22222122222210112121124800000 +M520190911111115407120100515WTTTYY#YW222221222222 0422031 0000 +M42019091111111596520000404271162113 +M520190911111115965119681116WTTTYPY0Y22122222222220112111127620000 +M520190911111115965120010826WTTTP0@YZ221222222222 0422111 0000 +M42019091111111634921400405981163113 +M520190911111116349119840119WTTT0099W22222122222210112121125820000 +M520190911111116349120170501WTTT0BY99222221222222 0422981 0000 +M520190911111116349120160506WTTT#0Z@Y222221222222 0422981 0000 +M42019091111111643020000404071162113 +M520190911111116430119760701WTTT00Y#P12222222222210112121118950000 +M520190911111116430120140816WTTTY9WYW222222122222 0422981 0000 +M520190911111116430120110615WTTT0@#9P122221222222 0422021 0000 +M520190911111116430120031114WTTTY#T9#122222122222 0422091 0000 +M42019091111111653221100401181163113 +M520190911111116532119921115WTTT#ZWY@22122222222210112121127260000 +M520190911111116532120160816WTTTP0WP0222222222222 0422981 0000 +M42019091111111680620000403181161113 +M520190911111116806119840507WTTTPPWZZ22212222222210112111128790000 +M520190911111116806120090502WTTT0BB@Y222122122222 0422041 0000 +M520190911111116806120070826WTTT0W09#222122122222 0422051 0000 +M42019091111111687520900406601163113 +M520190911111116875119830507WTTT#P@B022122222222210112111129900000 +M520190911111116875120160714WTTTYWY09222222222222 0422981 0000 +M520190911111116875120070101WTTTP@YWW221222222222 0422061 0000 +M520190911111116875120020519WTTT0ZW#Z221222122222 0422101 0000 +M42019091111111694521400401581163113 +M520190911111116945119950708WTTTY##@Y22222122222220112111113480000 +M520190911111116945120170614WTTT#PZ#P222221222222 0422981 0000 +M520190911111116945120150507WTTTPP9Y#222221122222 0422981 0000 +M42019091111111756521400402181163113 +M520190911111117565119930806WTTTY@PYY22222122222210112121123740000 +M520190911111117565120140515WTTTP#WY9222222122222 0422981 0000 +M520190911111117565120120106WTTT#W9P#222222222222 0422011 0000 +M42019091111111783621700404101163113 +M520190911111117836119811106WTTTP0@TY22222122222210112111120300000 +M520190911111117836120070123WTTT#0B#T222221122222 0422051 0000 +M520190911111117836120070123WTTTPT0P#222221122222 0422051 0000 +M42019091111111803120900400391162113 +M520190911111118031119640626WTTTY@BW022222222222250112141118760000 +M520190911111118031120030726WTTTPP@Y0222222122222 0422101 0000 +M42019091111111852820600402121163113 +M520190911111118528119920713WTTT#9PB#22222122222210112121128370000 +M520190911111118528120160602WTTT00WTY222222222222 0422981 0000 +M520190911111118528120100119WTTTP@@WW222221222222 0422031 0000 +M42019091111111855022700402581163113 +M520190911111118550119790101WTTTPBP9P22222122222210112121124200000 +M520190911111118550120070701WTTT0Z#9B222221222222 0422061 0000 +M520190911111118550120040701WTTT#0T09222221122222 0422091 0000 +M42019091111111863021400400351993113 +M520190911111118630119630102WTTT0T##W22212222222250112112118200000 +M520190911111118630120030702WTTT0W@BP222122222222 0422103 0000 +M42019091111111865521100401181993113 +M520190911111118655119940721WTTTY9@ZW22212222222210112121114520000 +M520190911111118655120180506WTTTYW@BW222122122222 0422981 0000 +M520190911111118655120150715WTTT09#W9222122122222 0422981 0000 +M520190911111118655120100707WTTTYZ0B0222122122222 0422031 0000 +M42019091111111871320600405471013113 +M520190911111118713119910808WTTT0#0BY22222122222210112081130330000 +M520190911111118713120120815WTTTP#ZY#222222222222 0422981 0000 +M520190911111118713120110118WTTTP#TBW122221222222 0422021 0000 +M42019091111111893320900404621163113 +M520190911111118933119790714WTTT#P#0@22222112222220112111118332600 +M520190911111118933119790114WTTT#Z#9T22222122222220212111117330000 +M520190911111118933120180726WTTT0YB#0222222222222 0422981 0000 +M520190911111118933120150102WTTT0ZBZY222222122222 0422981 0000 +M520190911111118933120130119WTTT0@TWY222222122222 0422981 0000 +M520190911111118933120130119WTTT0WWYT222222222222 0422981 0000 +M520190911111118933120110126WTTT000@0222221222222 0422021 0000 +M520190911111118933120090806WTTTYPY09222221122222 0422031 0000 +M520190911111118933120070806WTTTP#Y0Z222221122222 0422051 0000 +M520190911111118933120060119WTTTY#YY0222221222222 0422071 0000 +M520190911111118933120040723WTTT0PW9B222221222222 0422091 0000 +M42019091111111909721100403821163113 +M520190911111119097119940121WTTTP#PYZ12222222222210112081126100000 +M520190911111119097120140622WTTT#ZBZZ222222222222 0422981 0000 +M42019091111111919821100406001163113 +M520190911111119198119960519WTTT0@Z#Y12222222222210112122116830000 +M520190911111119198120140719WTTTPY@BP122221222222 0422981 0000 +M520190911111119198120110521WTTT#9Y#P122221222222 0422021 0000 +M42019091111111928921100401691163113 +M520190911111119289119870123WTTT0BTBT12222222222230112111123490000 +M520190911111119289120130115WTTT0Z###122222122222 0422981 0000 +M520190911111119289120110609WTTT##YPB122222222222 0422021 0000 +M520190911111119289120091113WTTTY9#T0122222222222 0422031 0000 +M42019091111111931121100401181163113 +M520190911111119311119970121WTTTYBBZB12222222222210112111117390000 +M520190911111119311120150726WTTT09Z#W122222222222 0422981 0000 +M42019091111111960020600401981163113 +M520190911111119600119800507WTTT0PT9#12222212222210112111132690149 +M520190911111119600120030522WTTT#0BB@122222222222 0422101 0000 +M520190911111119600120010106WTTT#TP9@122222122222 0422111 0000 +M42019091111112032920600405471163113 +M520190911111120329119880515WTTT0T9YZ12222222222210112111128170000 +M520190911111120329120170123WTTT0#9PT122222122222 0422981 0000 +M520190911111120329120090801WTTTY9P9#122222122222 0422031 0000 +M520190911111120329120060119WTTTYZ0BW122222122222 0422061 0000 +M42019091111112034521700405291163113 +M520190911111120345119850618WTTTYY9ZT22222122222210112111134380000 +M520190911111120345120140101WTTTYT0YY222222222222 0422981 0000 +M520190911111120345120120708WTTT00TPT222222122222 0422011 0000 +M42019091111112090420900400501193113 +M520190911111120904119810818WTTT0@T9022212222222210112111128290000 +M520190911111120904120151102WTTT#YZY@122222122222 0422981 0000 +M520190911111120904120110512WTTT#0YBP122222122222 0422011 0000 +M520190911111120904120070701WTTTY0TZ9122222122222 0422061 0000 +M520190911111120904120020523WTTT09#B#222122122222 0422111 0000 +M42019091111112116922700402801013113 +M520190911111121169119960715WTTT#T09#22222222222210112112121670000 +M520190911111121169120160101WTTTYP@0@222222122222 0422981 0000 +M42019091111112155622700400681193113 +M520190911111121556119770706WTTT0Z09W22222122222220112131119060000 +M520190911111121556119710512WTTT0Y99#22222111222220212121200000756 +M520190911111121556120050102WTTTY@WBB222221222222 0422081 0000 +M520190911111121556120020702WTTT000Y#222221222222 0422111 0000 +M42019091111112167921400406791161113 +M520190911111121679119830502WTTT0Z99Z12222222222210112141119330000 +M520190911111121679120040522WTTT0BY#9122222222222 0422091 0000 +M42019091111112171622700400441163113 +M520190911111121716119830107WTTT0ZWB922222122222210112121118090000 +M520190911111121716120140812WTTTY@0YB222221122222 0422981 0000 +M42019091111112187421400403591163113 +M520190911111121874119920823WTTT#YB0@22222122222210112121133380000 +M520190911111121874120171112WTTT#@B##222222222222 0422981 0000 +M520190911111121874120150806WTTTY9TY0222221122222 0422981 0000 +M42019091111112188121100406001163113 +M520190911111121881119920807WTTTP@P#B12222222222210112121100001200 +M520190911111121881120131115WTTT09TTZ122222122222 0422981 0000 +M42019091111112199921700402341163113 +M520190911111121999119750109WTTTP0YBT22222222222230112081117010000 +M520190911111121999120051108WTTTYWTBP222222222222 0422071 0000 +M42019091111112218422200404361163113 +M520190911111122184119900808WTTT00Y@022222222222210112121112010000 +M520190911111122184120150619WTTT##Y#P222222222222 0422981 0000 +M520190911111122184120080107WTTTP@BBT222222222222 0422051 0000 +M42019091111112223221700404101163113 +M520190911111122232119810619WTTT0@BYP12222222222230112121132630000 +M520190911111122232120140508WTTT0BPZ9122222222222 0422981 0000 +M42019091111112223622700405651163113 +M520190911111122236119760726WTTT0##WB22222122222230112111121230000 +M520190911111122236120020119WTTT0BZ#0222221222222 0422101 0000 +M42019091111112225122700402801163113 +M520190911111122251119890123WTTTY9PTB22222122222210112121119820000 +M520190911111122251120120714WTTT#YPPY222222122222 0422011 0000 +M42019091111112226521700401121161113 +M520190911111122265119890101WTTT0TY@Y12222222222220112121118340000 +M520190911111122265120090719WTTTY9Z#Y122222222222 0422041 0000 +M520190911111122265120070123WTTTY@PZB122222122222 0422051 0000 +M42019091111112285020600405341163113 +M520190911111122850119900102WTTT0BWWT12222222222210112111123560000 +M520190911111122850120130703WTTTBTT9Y122221222222 0422981 0000 +M520190911111122850120070619WTTT0YWT0122222222222 0422061 0000 +M42019101111111133221100406471163113 +M520191011111111332119900106WTTT#YB@B22222222222230112111115460000 +M520191011111111332120170114WTTT#Z@B@222222122222 0422981 0000 +M42019101111111142720600405341163113 +M520191011111111427119890106WTTT#PYBY12222222222210112111119390000 +M520191011111111427120160601WTTTPB###122222122222 0422981 0000 +M42019101111111143520900406601013113 +M520191011111111435119920121WTTT#9##922222122222210112111115540000 +M520191011111111435120181102WTTT0@#Y9222222222222 0422981 0000 +M42019101111111186620900406601163113 +M520191011111111866119930719WTTT#Z@9P22222222222210112121124700000 +M520191011111111866120140701WTTTP#PWZ222122122222 0422981 0000 +M42019101111111197421400400351162113 +M520191011111111974119890701WTTT#T0P022212222222210112111121610000 +M520191011111111974120110512WTTTBT9WW222122122222 0422021 0000 +M42019101111111225320600402981991113 +M520191011111112253119790115WTTT#Z0#P22212222222230112082126360000 +M520191011111112253120180501WTTT#Y0ZT222222122222 0422981 0000 +M520191011111112253120170815WTTTY#PPW222222122222 0422981 0000 +M520191011111112253120140121WTTTY@B0P222222222222 0422981 0000 +M520191011111112253120090607WTTTYY#W9222122122222 0422042 0000 +M42019101111111248421100406631163113 +M520191011111112484119650507WTTT0WY@T22222222222220112111128600000 +M520191011111112484120020715WTTT0T#PP222221222222 0422111 0000 +M42019101111111254720900401881161113 +M520191011111112547119860503WTTTPB@W#12222222222220112111110560000 +M520191011111112547119830101WTTTPP@@P12222212222220212111130100000 +M520191011111112547120140723WTTTPB@TB122222222222 0422981 0000 +M520191011111112547120040803WTTT#Y9#P122222122222 0422091 0000 +M42019101111111280021100401181163113 +M520191011111112800119920601WTTT#W0Z@12222222222210112121120680000 +M520191011111112800120150108WTTTYZZ00222222122222 0422981 0000 +M42019101111111298021400406791163113 +M520191011111112980119810813WTTTYTPTT22222122222210112111134760000 +M520191011111112980120180126WTTTPZZ0@222222122222 0422981 0000 +M520191011111112980120080719WTTT09Z09222221122222 0422051 0000 +M520191011111112980120050723WTTTYBT0P222221122222 0422081 0000 +M42019101111111305321700403901163113 +M520191011111113053119850819WTTTY9YTT22222122222210112131115600000 +M520191011111113053120100109WTTTYZ#Y0222221122222 0422021 0000 +M520191011111113053120070115WTTTP#WPP222221222222 0422061 0000 +M520191011111113053120031116WTTTYYBB@222221222222 0422091 0000 +M42019101111111339321100406001163113 +M520191011111113393119900718WTTT#PW@T12222122222230112111133560000 +M520191011111113393120150622WTTTY9ZZ0122222222222 0422981 0000 +M520191011111113393120120615WTTT09TW9122222222222 0422011 0000 +M520191011111113393120100715WTTTY#ZB@222222122222 0422031 0000 +M520191011111113393120090719WTTT0T9ZB122221222222 0422041 0000 +M42019101111111342322700402801163113 +M520191011111113423119890518WTTT00B9022222122222210112131115750000 +M520191011111113423120110809WTTTYBP@B222221222222 0422021 0000 +M520191011111113423120070101WTTTP9TZT222221222222 0422051 0000 +M42019101111111353121100406001163113 +M520191011111113531119840122WTTT099T@12222222222250112121115970000 +M520191011111113531120180512WTTTPWW0W122222122221 0422981 0801 +M42019101111111362820900401231161113 +M520191011111113628119670101WTTTYBPTW22122222222220212081123690000 +M520191011111113628119630721WTTT0Z@9B22122212222220112112109020000 +M520191011111113628120010118WTTT#ZPPB221222122222 0422111 0000 +M42019101111111366420600400291162113 +M520191011111113664119910126WTTTPTPWW12222222222210112111113260000 +M520191011111113664120150607WTTTY9#YP122221122222 0422981 0000 +M520191011111113664120130619WTTTYYW9T122222122222 0422981 0000 +M42019101111111368120900406421163113 +M520191011111113681119910626WTTTP#PTZ12222222222210112081130480000 +M520191011111113681120190718WTTT0ZWW#122222222222 0422981 0000 +M520191011111113681120190718WTTT0#0ZT122222222222 0422981 0000 +M520191011111113681120120806WTTTYP@P#122222222222 0422011 0000 +M42019101111111378522700406371163113 +M520191011111113785119820123WTTTPPTW922222222222220112111143750000 +M520191011111113785119770719WTTTYYZW#22222112222220212111112010000 +M520191011111113785120130818WTTT0Z#9P222222122222 0422981 0000 +M520191011111113785120110115WTTTPBP@W222221122222 0422021 0000 +M520191011111113785120050108WTTT#BZWW222221222222 0422071 0000 +M520191011111113785120040621WTTTP#B99222221222222 0422091 0000 +M42019101111111383320900402921163113 +M520191011111113833119720502WTTTY0PBB22222122222250112131122750000 +M520191011111113833120130101WTTT#YWWZ222222222222 0422981 0000 +M520191011111113833120110721WTTTYZTPZ222222122222 0422021 0000 +M42019101111111393920600404461163113 +M520191011111113939119840718WTTT0YZ@W22222122222210112131126010000 +M520191011111113939120170619WTTT#W#W@122222122222 0422981 0000 +M520191011111113939120060106WTTT#PZP#222221222222 0422071 0000 +M42019101111111401020500402421163113 +M520191011111114010119850707WTTT0PT@W12222222222250112131127330000 +M520191011111114010120180802WTTT0BY#@222222222222 0422981 0000 +M520191011111114010120080715WTTTP999#222222122222 0422051 0082 +M520191011111114010120060514WTTT0WWPW222222222222 0422061 0082 +M42019101111111402020600401981192113 +M520191011111114020119890106WTTT09#Y012222212222211012121130600000 +M520191011111114020119840606WTTTYBZB#12222222222210112121112760000 +M520191011111114020120120122WTTTP9YZB122222222222 0422981 0000 +M520191011111114020120080623WTTT0#YY0122222122222 0422051 0000 +M42019101111111405221700404401162113 +M520191011111114052119891102WTTT0ZYZW22222122222210112111124970000 +M520191011111114052120140107WTTT#BZ09222222222222 0422981 0000 +M520191011111114052120100521WTTTP#Y@P222222222222 0422031 0000 +M42019101111111427620900403071162113 +M520191011111114276119830814WTTTP#Z9W12222222222210112121100000000 +M520191011111114276120150601WTTTYP0WB122222122222 0422981 0000 +M520191011111114276120120701WTTTYT0PZ122222222222 0422011 0000 +M520191011111114276120060626WTTT#9BZZ122222222222 0422071 0000 +M520191011111114276120020619WTTT#90PP122221222222 0422111 0000 +M42019101111111429021700406571161113 +M520191011111114290119920115WTTTPYZZB12222222222210112111116830000 +M520191011111114290120160701WTTT#Z@Z0122222122222 0422981 0000 +M520191011111114290120110516WTTT0WTWP122222122222 0422021 0000 +M42019101111111460622700402231161113 +M520191011111114606119840815WTTTYWBPY22122222222210112131115860000 +M520191011111114606120180719WTTTPZZ@Y222222122222 0422981 0000 +M520191011111114606120050606WTTT0##9@221222122222 0422081 0000 +M520191011111114606120040718WTTTY0BY9221222122222 0422091 0000 +M42019101111111475720000400361163113 +M520191011111114757119930615WTTTYWP9T12222122222230112111121950000 +M520191011111114757120130821WTTTPBBZP222222222222 0422981 0000 +M42019101111111477320900402921163113 +M520191011111114773119850115WTTTP##Y922212222222210112121120960000 +M520191011111114773120080807WTTTYZPY0222122222222 0422051 0000 +M520191011111114773120020119WTTTPYPZB222122222222 0422101 0000 +M42019101111111477622400406121163113 +M520191011111114776119690814WTTT0#TBP22222222222250112121121910000 +M520191011111114776120020115WTTTPY9ZZ212222222222 0422111 0000 +M42019101111111482422200403201163113 +M520191011111114824119700119WTTTP@@ZP22222222222220212111123040000 +M520191011111114824119700121WTTTP9P#T22222112222220112111124170000 +M520191011111114824120020609WTTT0TBWT222222122222 0422111 0000 +M42019101111111501720600400871163113 +M520191011111115017119820723WTTTPTB0T22222122222210112141119090000 +M520191011111115017120160601WTTTYTYPB222222222222 0422981 0000 +M520191011111115017120100615WTTTPPP#0222221122222 0422031 0000 +M42019101111111502620000406951162113 +M520191011111115026119820101WTTT#W09W12222222222220112121119620000 +M520191011111115026120120121WTTTYT@ZB222222222222 0422011 0000 +M520191011111115026120100716WTTT#Y#PY122221222221 0422031 0885 +M520191011111115026120021102WTTT#ZW#W222221122222 0422101 0000 +M42019101111111519620600401981163113 +M520191011111115196119751101WTTTP0#WY22222222222230112121121930453 +M520191011111115196120130716WTTTP09PT222221222222 0422981 0000 +M42019101111111529022700400671163113 +M520191011111115290119880113WTTTPWZPB22212212222210112111122740000 +M520191011111115290120121118WTTTYW@Y9222222222222 0422981 0000 +M42019101111111529221700402381163113 +M520191011111115292119830608WTTTYZ9ZP22222122222210112121115690000 +M520191011111115292120130719WTTTYZZ@0222221122222 0422981 0000 +M42019101111111545520000404271013113 +M520191011111115455119850123WTTTP#B@#22122222222210112111136240000 +M520191011111115455120110526WTTT#@YPW221222122222 0422011 0000 +M520191011111115455120090114WTTTY@##Z221222122222 0422041 0000 +M520191011111115455120030713WTTTPW9WY221222122222 0422101 0000 +M42019101111111546020000406951161113 +M520191011111115460119810807WTTTYWZB922212222222230112081113000000 +M520191011111115460120170806WTTT#B9BZ222222122222 0422981 0000 +M520191011111115460120110516WTTTY9Z#Z222122222222 0422011 0000 +M520191011111115460120060823WTTT#T9PT222122222222 0422071 0000 +M42019101111111564221400400351163113 +M520191011111115642119920809WTTT#WP9T22222222222210112111116060000 +M520191011111115642120180507WTTTY@T9@222222222222 0422981 0000 +M42019101111111609120600401421162113 +M520191011111116091119760101WTTT#BPYZ12212122222210112111124690000 +M520191011111116091120040721WTTTYBW@T122121122222 0422091 0000 +M42019101111111647720000405421163113 +M520191011111116477119930621WTTTPTT9@22222122222210112131120320000 +M520191011111116477120151103WTTT#90ZP222222222222 0422981 0000 +M520191011111116477120110601WTTT0YZ9P122122122222 0422021 0000 +M42019101111111660521700402861163113 +M520191011111116605119830702WTTTYBPZT22222122222210112131112020000 +M520191011111116605120131119WTTT#BW@P222222222222 0422981 0000 +M520191011111116605120030601WTTT0@Y@@222221122222 0422101 0000 +M42019101111111696221100406541163113 +M520191011111116962119860709WTTTPZ09#12222222222220112112125930000 +M520191011111116962119760815WTTTP9TT022222212222220212111112050000 +M520191011111116962120160126WTTT#Y@0P122222222222 0422981 0000 +M520191011111116962120140601WTTTP@WWT222222222222 0422981 0000 +M42019101111111714622400406121012113 +M520191011111117146119921112WTTTPB@WZ22212221222210112121116040810 +M520191011111117146120170112WTTTY#WWY222222122222 0422981 0039 +M42019101111111733720500402421163113 +M520191011111117337119880506WTTTPPW9Y22222122222210112111124260000 +M520191011111117337120130818WTTTY0TP#222222122222 0422981 0000 +M520191011111117337120110101WTTT0YT#@222221222222 0422021 0000 +M520191011111117337120070806WTTT#ZP0@222221222222 0422061 0000 +M42019101111111742322700403941163113 +M520191011111117423119890818WTTTP9TBB22222122222210112111120450000 +M520191011111117423120140801WTTT#9Z@0222221222222 0422981 0000 +M42019101111111743620900400501163113 +M520191011111117436119880121WTTTP9W0Y22212222222210112131117420000 +M520191011111117436120120112WTTT#Y0BB222222222222 0422011 0000 +M42019101111111748720600406321163113 +M520191011111117487119960102WTTTY#Y0T22222122222210112111125600000 +M520191011111117487120190116WTTT0PWB9122221222222 0422981 0000 +M42019101111111767022700400681161113 +M520191011111117670119790523WTTT#Y9Y@12222222222210112131122910000 +M520191011111117670120050501WTTTY9P@B122222222222 0422081 0000 +M42019101111111778621700406831161113 +M520191011111117786119910113WTTTY9Y@P12222122222210112131119330000 +M520191011111117786120180502WTTT0@@Y#122122222222 0422981 0000 +M520191011111117786120130112WTTTY@PPW122222122222 0422981 0000 +M42019101111111814221100404801162113 +M520191011111118142119900119WTTTYY@WB12222222222230112131118480000 +M520191011111118142120170719WTTT#YZZ@122122122222 0422981 0000 +M520191011111118142120170719WTTTPW00Z122122222222 0422981 0000 +M520191011111118142120130102WTTTBT@PT122222222222 0422981 0000 +M520191011111118142120090101WTTTPYWWB122222122222 0422041 0000 +M42019101111111830522700403941163113 +M520191011111118305119920719WTTTYT09012222122222210112121126060000 +M520191011111118305120180801WTTT#0ZBB222222222222 0422981 0000 +M520191011111118305120150616WTTT#BPBB222222222222 0422981 0000 +M520191011111118305120120606WTTTY@YTP222221222222 0422011 0000 +M42019101111111849721400406791163113 +M520191011111118497119890513WTTT0BB0922212222222210112111114100000 +M520191011111118497120180126WTTT#YZPT222222122222 0422981 0000 +M520191011111118497120130613WTTT#T0BT122222122222 0422981 0000 +M520191011111118497120100815WTTT#@@T0222222122222 0422031 0000 +M520191011111118497120070719WTTT#B9Y@222222222222 0422063 0000 +M42019101111111854621700406221163113 +M520191011111118546119860109WTTT#BBZB22222122222210112121118800000 +M520191011111118546120090101WTTTPPZP@222221122222 0422041 0000 +M42019101111111863522700400671163113 +M520191011111118635119971101WTTT0Y@Y#22212222222210112112116350000 +M520191011111118635219880708WTTTYP9PB22222212222211012113200000000 +M520191011111118635120180614WTTT0T9Z#222222122222 0422981 0000 +M42019101111111893420900403431161113 +M520191011111118934119840115WTTTP@YYB22212222222210112121100000000 +M520191011111118934120160126WTTT0#0PP222122222222 0422981 0000 +M520191011111118934120120613WTTT#PT0B222122222222 0422011 0000 +M520191011111118934120030515WTTT#P#@Z222122222222 0422101 0000 +M42019101111111900420000401061163113 +M520191011111119004119870101WTTTYWPT922212222222210112111126220000 +M520191011111119004120170618WTTTYBWB#222222222222 0422981 0000 +M520191011111119004120150521WTTT#YY@@222122222222 0422981 0000 +M42019101111111922920600400871161113 +M520191011111119229119730521WTTTPBZ9B12222122222210112121119950000 +M520191011111119229120050603WTTTY9@9P122221122222 0422081 0000 +M42019101111111924520900406421161113 +M520191011111119245119830101WTTTP9W0B12222222222210112111120590000 +M520191011111119245120060523WTTT#BPB0122222122222 0422061 0000 +M520191011111119245120050118WTTTPT0TT122222222222 0422071 0000 +M42019101111111931921700405121161113 +M520191011111119319119900107WTTT00YYY12222222222210112141120560000 +M520191011111119319120120701WTTTP#BT@122222122222 0422011 0000 +M520191011111119319120090514WTTT#P0YW122222122222 0422031 0000 +M520191011111119319120060719WTTTPW9B0122222222222 0422071 0000 +M42019101111111948820600401421161113 +M520191011111119488119770506WTTT0ZBBY22122222222210112112124170000 +M520191011111119488120170106WTTTYT9W@222222222222 0422981 0000 +M520191011111119488120050615WTTT#P9P0221222222222 0422081 0000 +M42019101111111952621100406001993113 +M520191011111119526119941126WTTTY9@#Z12222122222210112112117350000 +M520191011111119526120170106WTTT#B0PB122222222222 0422981 0000 +M42019101111111966321100401551993113 +M520191011111119663119971106WTTT#WYP@22222222222210112111115710000 +M520191011111119663120170616WTTTPZYPP222222222222 0422981 0000 +M42019101111111971221700403811162113 +M520191011111119712119851101WTTTYT@0T22222222222220212131200000000 +M520191011111119712119760618WTTTPPBP922222212222220112161240600000 +M520191011111119712120160603WTTTP9B@T222122222222 0422981 0000 +M520191011111119712120140622WTTTPY900222222222222 0422981 0000 +M520191011111119712120110107WTTTP9BPW222222222222 0422011 0000 +M520191011111119712120090719WTTT09ZBZ222222122222 0422042 0000 +M42019101111112039821100401181163113 +M520191011111120398119870607WTTT#WB0Y12222222222250112121120550000 +M520191011111120398120090526WTTT0@9ZP122222122222 0422031 0000 +M520191011111120398120070716WTTT0PT9P122222222222 0422061 0000 +M42019101111112040420600400871163113 +M520191011111120404119950723WTTT#ZW#922222222222210112121116570000 +M520191011111120404120140508WTTT##PY#222222122222 0422981 0000 +M42019101111112067722400405111161113 +M520191011111120677119850713WTTT#BB#T22222122222210112131124430007 +M520191011111120677120120707WTTTPZB0@222221222222 0422011 0000 +M520191011111120677120101114WTTTY0Z9@222121122222 0422021 0000 +M42019101111112087020000404271163113 +M520191011111120870119880626WTTTPBBPP22122222222210112111129230000 +M520191011111120870120150621WTTT#BPP9222222122222 0422981 0000 +M520191011111120870120070619WTTTYW##9221222122222 0422061 0000 +M42019101111112089022700400441163113 +M520191011111120890119940715WTTTPW0#Y12222222222210112121100000000 +M520191011111120890120120115WTTT0TY#W122221222222 0422981 0000 +M42019101111112090220600405341163113 +M520191011111120902119930103WTTTYBBW#12222222222210112111113910000 +M520191011111120902120160102WTTTYW#9B122222222222 0422981 0000 +M42019101111112090920600405171163113 +M520191011111120909119860715WTTTP@@Y012222222222210112111119870000 +M520191011111120909120100701WTTT0@T#Y122222122222 0422031 0000 +M520191011111120909120080115WTTTPW##Z122222222221 0422051 0801 +M520191011111120909120021123WTTTY#@ZZ122222122221 0422101 0801 +M42019101111112095621700406751163113 +M520191011111120956119880502WTTT#B#B#12222122222210112121119340000 +M520191011111120956120130507WTTT0YBWW122121222222 0422981 0000 +M520191011111120956120060723WTTTYTPZT122222222222 0422071 0000 +M42019101111112100522400400961163113 +M520191011111121005119931119WTTT#W0@922122222222210112111115170000 +M520191011111121005120140106WTTT#009B221222222222 0422981 0000 +M42019101111112132520600405171161113 +M520191011111121325119870707WTTT##TW912222222222210112111111020000 +M520191011111121325120180116WTTTP##PZ122222122222 0422981 0000 +M520191011111121325120150102WTTTP#YBZ222222222222 0422981 0000 +M520191011111121325120090602WTTT#ZPY#122222122222 0422041 0000 +M42019101111112133222700402231163113 +M520191011111121332119920101WTTTYYW9#22222122222210112121112400000 +M520191011111121332120170121WTTTPTZY#222221122222 0422981 0000 +M520191011111121332120130622WTTT0T@B9222221122222 0422981 0000 +M42019101111112136822700403941163113 +M520191011111121368119860121WTTT#9PZW12222222222210112121119630000 +M520191011111121368120160614WTTTY#PB@222222122222 0422981 0000 +M520191011111121368120090716WTTTY#90#122222222222 0422041 0000 +M42019101111112148821700404181163113 +M520191011111121488119820806WTTT0@YZ@22222122222220112121112910000 +M520191011111121488120130502WTTTP#90T222222122222 0422981 0000 +M520191011111121488120020501WTTTY0@9W222221222222 0422101 0000 +M42019101111112161320000402101163113 +M520191011111121613119880702WTTT0Y00@12222222222210112121127910000 +M520191011111121613120140719WTTT#90YZ122222122222 0422981 0000 +M520191011111121613120100626WTTT0##Y@122222222222 0422031 0000 +M520191011111121613120050615WTTTPB#9B122222122222 0422081 0000 +M42019101111112180321700404201163113 +M520191011111121803119840509WTTT#0TZZ12222222222230112121112740000 +M520191011111121803120160119WTTTPWW9W122222222222 0422981 0000 +M520191011111121803120090101WTTT#@BYY122222222222 0422041 0000 +M520191011111121803120070513WTTT0T0WY122222122222 0422061 0000 +M42019101111112190721100403821163113 +M520191011111121907119770726WTTTY@PP012222222222250112112123140000 +M520191011111121907120080601WTTTPTWB#122222122222 0422052 0000 +M520191011111121907120040518WTTT#WPWZ122222122222 0422092 0000 +M42019101111112193120900402921163113 +M520191011111121931119780815WTTTPYZZ#22212222222210112112112690000 +M520191011111121931120161121WTTTY@WBW222122122222 0422981 0000 +M520191011111121931120040715WTTTPP@YB222222222222 0422092 0000 +M42019101111112194420600400871163113 +M520191011111121944119940503WTTT#BP##12222222222210112111123200000 +M520191011111121944120130726WTTTYZT@Z122222122222 0422981 0000 +M42019101111112208221400400351163113 +M520191011111122082119940113WTTT00YTW22212222222210112111128010000 +M520191011111122082120150606WTTTYZZZT222222122222 0422981 0000 +M42019101111112226422700402581163113 +M520191011111122264119850123WTTT0#YWZ22212222222210112121123290000 +M520191011111122264120080626WTTT0B0BT222222222222 0422051 0000 +M520191011111122264120080626WTTTYZ9@0222222222222 0422051 0000 +M520191011111122264120060701WTTT00YYB222222222222 0422071 0000 +M42019101111112228821100406001162113 +M520191011111122288119930819WTTT00#WP12222221222230112111110400767 +M520191011111122288120150119WTTT#BZZZ222222222222 0422981 0000 +M520191011111122288120140819WTTTY0Z@0222222222222 0422981 0000 +M42019101111112239320900403031163113 +M520191011111122393119880626WTTT#P@@Z12222222222210112111100000000 +M520191011111122393120090123WTTT09ZP9222222222222 0422041 0000 +M42019101111112262320900403071161113 +M520191011111122623119720502WTTT099#P12222222222210112131122520000 +M520191011111122623120050719WTTTP9ZY9122222122222 0422081 0000 +M42019101111112274522700400671163113 +M520191011111122745119840116WTTTPTZZB22212222222210112121130160000 +M520191011111122745120060722WTTTPTYB0222122122222 0422071 0000 +M520191011111122745120010101WTTT0B0WT222122122222 0422111 0000 +M42019111111111115520900406421163113 +M520191111111111155119870522WTTTP#WT022212222222210112112115860000 +M520191111111111155120141109WTTTP#ZW9122221222222 0422981 0000 +M520191111111111155120100523WTTTY9BPZ222222222222 0422031 0000 +M520191111111111155120071119WTTT0WT9@222122122222 0422051 0000 +M42019111111111159121100401461163113 +M520191111111111591119870115WTTTY0BYZ22222122222210112111119800000 +M520191111111111591120100708WTTTPWWPT222221222222 0422031 0000 +M42019111111111162720000402101163113 +M520191111111111627119700609WTTTPZWZ#22212222222210112121132190000 +M520191111111111627120170726WTTTY0BYT222122222222 0422981 0457 +M520191111111111627120110606WTTTYWBBB222222222222 0422021 0457 +M520191111111111627120070802WTTTYYTTP222222122222 0422061 0457 +M520191111111111627120050119WTTT#9WYT222222222222 0422071 0457 +M520191111111111627120040721WTTTP90@T222222122222 0422091 0457 +M42019111111111182121100402161163113 +M520191111111111821119910801WTTTPBY0#22222222222210112081116650000 +M520191111111111821120170615WTTTYB9WY222122222222 0422981 0000 +M520191111111111821120160113WTTTYT9Y@222122122222 0422981 0000 +M42019111111111214521700404101011113 +M520191111111112145119890626WTTTY#BPP22212222222210112131127080000 +M520191111111112145120140107WTTTPPPYW222222122222 0422981 0000 +M520191111111112145120080801WTTTY0#ZT222122222222 0422051 0000 +M42019111111111216420900406421161113 +M520191111111112164119880723WTTTP0ZZZ22212222222210112121125700000 +M520191111111112164120170501WTTTPP#@P122122222222 0422981 0000 +M520191111111112164120090722WTTTYZB#B222222222222 0422041 0000 +M42019111111111222821100406471163113 +M520191111111112228119890523WTTT#@@TT22122222222210112111110830000 +M520191111111112228120150526WTTT00W@0222221222222 0422981 0000 +M42019111111111235222200401591163113 +M520191111111112352119810107WTTTP#P0Z22222122222220112121116830000 +M520191111111112352119630109WTTT090YP22222112222220212121125940000 +M520191111111112352120070614WTTTBTZ@@222221222222 0422061 0000 +M42019111111111250921700406571163113 +M520191111111112509119920726WTTTY0B#T22222122222210112161123980000 +M520191111111112509120130101WTTT#BB@Y222221222222 0422981 0000 +M42019111111111276220000400171163113 +M520191111111112762119900107WTTTPYTP022222122222210112121118260000 +M520191111111112762120151109WTTTP@WPP222221222222 0422981 0000 +M42019111111111282320900400501163113 +M520191111111112823119890815WTTTP90BZ21212212222210112121112570000 +M520191111111112823120190119WTTTYPYYB222222222222 0422981 0000 +M42019111111111297922700400681163113 +M520191111111112979119940507WTTTP9WTW22222122222210112121119860000 +M520191111111112979120140702WTTT0ZPBP222222222222 0422981 0000 +M520191111111112979120090719WTTTYW@Y@222221122222 0422041 0000 +M42019111111111317221100404791163113 +M520191111111113172119820715WTTTP0PZY22222122222250112111129460000 +M520191111111113172120090106WTTTPY0BW222221222222 0422031 0000 +M520191111111113172120080619WTTTYBY#@222221122221 0422051 0248 +M520191111111113172120030101WTTT0BZPY222221122221 0422101 0325 +M42019111111111336120600400291163113 +M520191111111113361119780607WTTT0BWWP22222222222210112111136860000 +M520191111111113361120110626WTTTPZTZ9122222222222 0422021 0000 +M520191111111113361120090109WTTTY9BP0222222122222 0422041 0000 +M520191111111113361120011126WTTTP00T0122222122222 0422111 0000 +M42019111111111343621700404101993113 +M520191111111113436119960607WTTTYPT0922222122222210112111113930000 +M520191111111113436120190501WTTT#W#00222222122222 0422981 0000 +M42019111111111350321100406001163113 +M520191111111113503119840513WTTT0BZYW12222222222230112121129460000 +M520191111111113503120130606WTTTP9TBY122222122222 0422981 0000 +M520191111111113503120080815WTTTYPZP9222222222222 0422051 0000 +M520191111111113503120060106WTTTP#9Z0122222222222 0422061 0000 +M520191111111113503120050714WTTT0Z#T@122222222222 0422081 0000 +M42019111111111367321400400351161113 +M520191111111113673119871121WTTT0P9ZP12212222222210112121132630000 +M520191111111113673120170801WTTT##TZW122222222222 0422981 0000 +M520191111111113673120110612WTTT#B##Z122222222222 0422021 0000 +M520191111111113673120080119WTTTYWBWB222122222222 0422051 0000 +M42019111111111408720900403431161113 +M520191111111114087119750507WTTT09@WB22212212222250112111129550000 +M520191111111114087120170809WTTT#Z0W@222122122222 0422981 0000 +M520191111111114087120140606WTTT09ZBW222222222222 0422981 0000 +M520191111111114087120120526WTTTYY@YP222122122222 0422011 0000 +M520191111111114087120040114WTTT#TZ0Y222122222222 0422081 0000 +M42019111111111446020300404901163113 +M520191111111114460119940103WTTT0Z9B022222122222210112111121460000 +M520191111111114460120160801WTTT00BZY222221122222 0422981 0000 +M42019111111111482021100401461162113 +M520191111111114820119740126WTTT0@@PZ22222222222210112122122310000 +M520191111111114820120050706WTTT#YY0T222222222222 0422081 0000 +M42019111111111492420900404651163113 +M520191111111114924119800101WTTT#TZZP22122222222210112081114570000 +M520191111111114924120130121WTTT09PPZ221222222222 0422981 0000 +M42019111111111495921100406001163113 +M520191111111114959119910519WTTT0W#@012222222222210112121114980000 +M520191111111114959120160119WTTTP9PYT122222122222 0422981 0000 +M520191111111114959120141126WTTTYZPWZ122222122222 0422981 0000 +M42019111111111503420000406911162113 +M520191111111115034119820106WTTT0##@Z22222222222220112111119930000 +M520191111111115034120131108WTTT0PZY#222222222222 0422981 0000 +M520191111111115034120110101WTTTP0ZW9222222122222 0422021 0000 +M520191111111115034120060106WTTT0###W222222222222 0422061 0000 +M42019111111111518322700402001163113 +M520191111111115183119860115WTTTPYZ0T22222122222210112141124620000 +M520191111111115183120110707WTTT0@90W222221122222 0422021 0000 +M42019111111111522622700402801161113 +M520191111111115226119810701WTTTYWP9W22222122222210112121130660000 +M520191111111115226120150523WTTTY9T@0222222122222 0422981 0000 +M520191111111115226120110102WTTTP9Y09222221122222 0422011 0000 +M520191111111115226120051114WTTTYYWZ#222221222222 0422071 0000 +M42019111111111528722700406401162113 +M520191111111115287119890115WTTTYYZYW22222122222210112121100000000 +M520191111111115287120131106WTTTPYT#Z222221222222 0422981 0000 +M42019111111111529521400400351163113 +M520191111111115295119860115WTTTYWY@022222222222230112112117310000 +M520191111111115295120130513WTTT0@TWB122222222222 0422981 0309 +M520191111111115295120090119WTTT#B09Y222222122222 0422041 0309 +M520191111111115295120020612WTTT#9@9@222212222222 0422113 0000 +M42019111111111550820600400871163113 +M520191111111115508119780109WTTT0#0PB22222121222220112131111920989 +M520191111111115508120180526WTTTYTYPY222221222222 0422981 0000 +M520191111111115508120020614WTTTP##W@222221222221 0422111 0707 +M42019111111111588620600402031163113 +M520191111111115886119900507WTTTYB90012222222222250112121117940000 +M520191111111115886120181119WTTT#WWWB122222122222 0422981 0000 +M520191111111115886120160519WTTTPZW@W122222222222 0422981 0000 +M520191111111115886120110116WTTTPWPY0122222222222 0422011 0000 +M42019111111111593620600400871013113 +M520191111111115936119890122WTTTP0@W#22222122222250112121112710000 +M520191111111115936120180114WTTTY#0ZT222222222222 0422981 0000 +M520191111111115936120110526WTTTYP@B0222221222222 0422021 0000 +M42019111111111602720900402921163113 +M520191111111116027119950702WTTTYT@0Z22212222222210112081122700000 +M520191111111116027120180506WTTTYBBTW222122222222 0422981 0000 +M42019111111111607021100406001161113 +M520191111111116070119850726WTTTYB0##12222122222210112121119090000 +M520191111111116070120180512WTTTPBBY#122222222222 0422981 0000 +M520191111111116070120170619WTTT0WPTT122222222222 0422981 0000 +M520191111111116070120160518WTTTP@YW9122221222222 0422981 0000 +M520191111111116070120080115WTTTYZT0T122222122222 0422051 0000 +M520191111111116070120050507WTTT#WYW#122222222222 0422081 0000 +M42019111111111609421200404691163113 +M520191111111116094119860123WTTT0P@BP22222122222220112121123400000 +M520191111111116094120160102WTTTP#BB9222222222222 0422981 0000 +M520191111111116094120130519WTTTYYP0Z222221222222 0422981 0000 +M42019111111111630920900406421163113 +M520191111111116309119750814WTTT0@B0P22212222222250112081126610000 +M520191111111116309120110615WTTT0Z0P@222222222222 0422021 0000 +M42019111111111631622700402231163113 +M520191111111116316119900719WTTTY9Z@922222122222210112131123280000 +M520191111111116316120071115WTTTPBYP0222221222222 0422051 0000 +M520191111111116316120071115WTTTP9TWT222221222222 0422051 0000 +M42019111111111637720600405771163113 +M520191111111116377119920615WTTTY99ZW22222122222210112122122450000 +M520191111111116377119900623WTTT0#@Z@22212212222211012122109110000 +M520191111111116377120180826WTTT0##T9222212222222 0422981 0000 +M520191111111116377120170501WTTT##B@B222212122222 0422981 0000 +M520191111111116377120150615WTTT0T0W#222212122222 0422981 0000 +M42019111111111645221700401121163113 +M520191111111116452119881107WTTTY0ZBP21222122222220112121100000000 +M520191111111116452120130515WTTTYB#0P212222222222 0422981 0425 +M520191111111116452120100515WTTT0@0TZ212222122222 0422031 0000 +M42019111111111673022700403611163113 +M520191111111116730119900619WTTTYWPWZ22222122222230112121124000000 +M520191111111116730120130101WTTTPYT0B222121122222 0422981 0000 +M520191111111116730120070115WTTTYZ@0T222221122222 0422051 0000 +M42019111111111680822400406121163113 +M520191111111116808119770112WTTTP#0PB22222222222210112111131710000 +M520191111111116808120110101WTTTYTP0W222222122221 0422011 0444 +M520191111111116808120050609WTTTYTP@9222222122222 0422081 0000 +M42019111111111683721100406001163113 +M520191111111116837119940802WTTT#WY9912222222222210112081126330000 +M520191111111116837120160613WTTT#B0P9122222222222 0422981 0000 +M520191111111116837120130601WTTTPT00@122222122222 0422981 0000 +M42019111111111690720900406601163113 +M520191111111116907119800518WTTTYTTP@12222222222210112111125080000 +M520191111111116907120180103WTTT0#W#T222221122222 0422981 0000 +M520191111111116907120140819WTTTPT9P@122222222222 0422981 0000 +M520191111111116907120070723WTTT#0#0T222222122222 0422061 0675 +M42019111111111759521700400091163113 +M520191111111117595119900114WTTTP#ZWP22222122222210112121113240000 +M520191111111117595120150626WTTT#0ZTZ222221122222 0422981 0000 +M520191111111117595120070823WTTTYYY0W222221222222 0422061 0000 +M42019111111111764520000404071162113 +M520191111111117645119830118WTTTY#PP912222222222210112121127790000 +M520191111111117645120110102WTTT#0WW@122222222222 0422021 0000 +M520191111111117645120090115WTTTYPY#Y222222222222 0422031 0000 +M520191111111117645120070701WTTT0ZBZ0122222222222 0422061 0000 +M42019111111111786522700402401163113 +M520191111111117865119860108WTTT#0TBT22222122222210112121114230000 +M520191111111117865120130106WTTT09PZZ222222122222 0422981 0000 +M520191111111117865120100126WTTT#@WWT222221122222 0422021 0023 +M520191111111117865120080521WTTTYPYYW222221222222 0422051 0023 +M42019111111111793522400403441162113 +M520191111111117935119770115WTTT#0#YW12222122222230112111124050000 +M520191111111117935120050101WTTT0PZZ@122222122222 0422071 0000 +M520191111111117935120011102WTTT#9@##122222222222 0422111 0000 +M42019111111111802220900402621161113 +M520191111111118022119880706WTTT0TBYB12222122222210112121117250000 +M520191111111118022120180126WTTTYZ00T122222122222 0422981 0000 +M520191111111118022120140708WTTTPB@#B122222222222 0422981 0000 +M520191111111118022120081119WTTT#ZZB9122221222222 0422041 0000 +M42019111111111807220600405471161113 +M520191111111118072119891123WTTT0WZ9@22212222222210112111121140000 +M520191111111118072120110606WTTT#YZPB222122222222 0422021 0000 +M42019111111111842621100401691163113 +M520191111111118426119910122WTTT0ZWWY22222122222210112111115340000 +M520191111111118426120160106WTTT#TPZZ222222222222 0422981 0175 +M42019111111111853121400400351161113 +M520191111111118531119760706WTTTYW#B@22212222222210112131115650000 +M520191111111118531120100501WTTTPT99T222122122222 0422031 0000 +M520191111111118531120100501WTTT0#T@#222122122222 0422031 0000 +M520191111111118531120060119WTTT#B@ZW222122122222 0422061 0000 +M42019111111111856722200402681162113 +M520191111111118567119740615WTTT0Y#9T22222122222250112111142910000 +M520191111111118567120090526WTTTPZTZ0222221122222 0422041 0000 +M520191111111118567120070807WTTTPPTTB222221222222 0422061 0000 +M520191111111118567120050706WTTT#T#WW222221222222 0422081 0000 +M42019111111111884720600401421163113 +M520191111111118847119940126WTTTYYT@#22222122222210112111117740000 +M520191111111118847120180726WTTT#TWWW222222222222 0422981 0000 +M42019111111111893921100402161163113 +M520191111111118939119790102WTTT09P#022212222222220112111129990000 +M520191111111118939119740115WTTTPY0P922212212222220212112107280000 +M520191111111118939120100815WTTTPZ9#T222122122222 0422031 0000 +M520191111111118939120080101WTTT0YZWT222122222222 0422041 0000 +M520191111111118939120070706WTTTY9YW9222122222222 0422061 0000 +M520191111111118939120040509WTTTY@WTP222122122222 0422091 0000 +M42019111111111902722700403941162113 +M520191111111119027119930112WTTTY@00T12222222222210112111113050000 +M520191111111119027120130119WTTT0@BWY222222222222 0422981 0000 +M42019111111111913522700400671163113 +M520191111111119135119930706WTTT0TYWB22222122222210112111114480000 +M520191111111119135120150721WTTTPWBZB222221122222 0422981 0000 +M42019111111111918421100403821163113 +M520191111111119184119850101WTTT#@B#Y22221222222210112111119500000 +M520191111111119184120110119WTTT#ZBB#222222122221 0422011 0468 +M520191111111119184120070123WTTTYTW#@222222222222 0422061 0000 +M520191111111119184120040501WTTT#9TZP222222222222 0422091 0000 +M42019111111111920720000402281012113 +M520191111111119207119690106WTTTYY#@T12222222222210112111128150000 +M520191111111119207120040119WTTT#ZTZT222222122222 0422081 0000 +M42019111111111929121400400351162113 +M520191111111119291119890114WTTTP9@BT22212222222210112131100000000 +M520191111111119291120170623WTTTY9@0Y222222222222 0422981 0048 +M42019111111111930321100401181162113 +M520191111111119303119950115WTTTYZ0PZ22212222222210112121121670000 +M520191111111119303120140101WTTTPPB@#222122222222 0422981 0000 +M42019111111111942320900406601163113 +M520191111111119423119820614WTTTPT9T912222222222210112111124920000 +M520191111111119423120150112WTTT#W#PW122222122222 0422981 0000 +M520191111111119423120030112WTTTP@BT@122222222222 0422091 0000 +M42019111111111942920000402281163113 +M520191111111119429119830701WTTT00@##22222122222230112111114450000 +M520191111111119429120140706WTTT0WYWT222221122222 0422981 0000 +M42019111111111951021100403821163113 +M520191111111119510119970723WTTTY#B9Z12222222222210112081125040000 +M520191111111119510120160119WTTTP0ZP@122222222222 0422981 0000 +M42019111111111954020000404151163113 +M520191111111119540119720622WTTTY90YP12212222222210112112118730000 +M520191111111119540120110126WTTTPZZTZ122122122222 0422021 0000 +M42019111111111956720600401421163113 +M520191111111119567119930119WTTT0##0@12222222222210112081113000000 +M520191111111119567120170122WTTTPP000222221122222 0422981 0000 +M42019111111111962320500402421163113 +M520191111111119623119841102WTTTPYPY@22222122222210112111118080000 +M520191111111119623120170608WTTTYWZ9#222222222222 0422981 0000 +M520191111111119623120140126WTTT09WYP222221122222 0422981 0000 +M42019111111111986520500402421162113 +M520191111111119865119790801WTTTY#BZT22212222222210112131117520000 +M520191111111119865120151115WTTTY0###122122222222 0422981 0000 +M520191111111119865120140801WTTT#099T222122222222 0422981 0000 +M520191111111119865120020102WTTT#B@Z@222122222222 0422111 0000 +M42019111111112034021700402341163113 +M520191111111120340119910518WTTT#BBB922212222222210112112120940000 +M520191111111120340120160107WTTT##9P@222221122222 0422981 0000 +M42019111111112036520600402121163113 +M520191111111120365119950813WTTT00#WB12222222222220112121112550900 +M520191111111120365120130121WTTT##T0#122222122222 0422981 0000 +M42019111111112042120600401421161113 +M520191111111120421119700706WTTT#@WW922122222222210112111120190000 +M520191111111120421120030615WTTTP#9WZ221222222222 0422101 0000 +M42019111111112059820900401881161113 +M520191111111120598119690718WTTT0#@@912222222222210122121130870000 +M520191111111120598120150118WTTTP90T@122221222222 0622981 0000 +M520191111111120598120140113WTTTY@0Z@122222222222 0622981 0000 +M42019111111112064020600402031163113 +M520191111111120640119740526WTTT#@YTW12222222222210122111118780000 +M520191111111120640120080113WTTTYP@B#122222122221 0722041 0801 +M42019111111112065221700402341993113 +M520191111111120652119931113WTTTY#0W922222122222210112111111270000 +M520191111111120652120190721WTTT09BP@222222222222 0422981 0000 +M42019111111112080420000404071013113 +M520191111111120804119800722WTTT#WWBZ12222222222210112141126170000 +M520191111111120804120060623WTTT##9@Y122222222222 0422071 0000 +M42019111111112087821700406891163113 +M520191111111120878119870115WTTTYYYP@22222122222210112111125820000 +M520191111111120878120130706WTTT0TB@W222221122222 0422981 0000 +M520191111111120878120100502WTTT#PZ0#222221122222 0422031 0000 +M42019111111112114721400401581162113 +M520191111111121147119960121WTTTP@ZW022212222222210112081117640000 +M520191111111121147120170702WTTTPYTWB222222122222 0422981 0000 +M42019111111112123220500404091163113 +M520191111111121232119910621WTTTPB9#@22222122222210112121100000000 +M520191111111121232120180109WTTT#@@09222221222222 0422981 0000 +M520191111111121232120130709WTTTPB@9Y222222222222 0422981 0000 +M42019111111112143520600405471163113 +M520191111111121435119791101WTTT#P9W012222222222210112111114320000 +M520191111111121435120150526WTTTYB9@Z122222122222 0422981 0000 +M520191111111121435120070116WTTTP#TB0122222222222 0422051 0000 +M42019111111112176220600401981162113 +M520191111111121762119950526WTTTYTY9#12222222222210112121119190000 +M520191111111121762120150115WTTT0WWBY122222222222 0422981 0000 +M42019111111112181222700400671123113 +M520191111111121812119660623WTTT0YY9Y22212222222210112081122160000 +M520191111111121812120080121WTTTY0ZPY222222122222 0422041 0000 +M42019111111112187321700402861163113 +M520191111111121873119670122WTTT0TB@#22222122222250112141117600000 +M520191111111121873120080801WTTTPBBP#222221122222 0422051 0000 +M520191111111121873120030501WTTT#YY0Z222221222222 0422101 0000 +M42019111111112196621400400351163113 +M520191111111121966119890119WTTT#9@9W22212222222210112111116641240 +M520191111111121966120160123WTTTYP99W222222222222 0422981 0000 +M520191111111121966120140515WTTTPYT00222222222222 0422981 0000 +M520191111111121966120080815WTTT#ZZZY222222222222 0422051 0000 +M42019111111112228222400401281163113 +M520191111111122282119890101WTTT#9WZB12222222222210112161121730000 +M520191111111122282120180626WTTTY9BYW122222222222 0422981 0000 +M42019111111112234120900403071162113 +M520191111111122341119910519WTTTPW@ZT12212222222210112111115790000 +M520191111111122341120130115WTTT#Y9YW122122222222 0422981 0000 +M520191111111122341120090106WTTTY#0P@122122222222 0422031 0000 +M42019111111112258122700400671193113 +M520191111111122581119890108WTTT0Z0PW12222222222230112122112320000 +M520191111111122581120140507WTTTYY@BB122222222222 0422981 0000 +M520191111111122581120091121WTTT#BTZY122222122222 0422031 0000 +M520191111111122581120080616WTTT0BT@Z122222122222 0422051 0000 +M42019111111112290621700404401163113 +M520191111111122906119870623WTTT0BY0022222122222210112131126000000 +M520191111111122906120141101WTTTP0YWW222222122222 0422981 0000 +M520191111111122906120070608WTTTYBT@@222221222222 0422061 0000 +M520191111111122906120050801WTTTPBWPT222221122222 0422081 0000 +M42019111111112298220000401371163113 +M520191111111122982119830113WTTT#YTTW22222122222230112111117290000 +M520191111111122982120060619WTTTPB#PZ222221122222 0422071 0000 +M42019121111111171820900401881161113 +M520191211111111718119830119WTTT0ZWB#22212222222210112111116760000 +M520191211111111718120170619WTTT##9PB222122122222 0422981 0000 +M42019121111111188720000401061162113 +M520191211111111887119850101WTTTPYPW@22222122222210112121133580000 +M520191211111111887120140702WTTTPP9##222221222222 0422981 0000 +M520191211111111887120120601WTTTPB000222221222222 0422011 0000 +M520191211111111887120090119WTTT#0T9@222122222222 0422041 0000 +M520191211111111887120070106WTTTP0WWZ222221122222 0422061 0000 +M42019121111111199920900403071163113 +M520191211111111999119830603WTTTPWBZ#22212222222210112131129160000 +M520191211111111999120130802WTTTPTW@T222122122222 0422981 0000 +M520191211111111999120050507WTTT#PY#@222122122222 0422081 0000 +M42019121111111201721100406391163113 +M520191211111112017119840518WTTT00WYP22222122222210112121115350000 +M520191211111112017120170101WTTTP#BZ0222222122222 0422981 0000 +M520191211111112017120070119WTTT#@#PW222221222222 0422051 0000 +M42019121111111210920000403721162113 +M520191211111112109119910701WTTTY9Z9B12222222222210112121119590000 +M520191211111112109120140114WTTTPTP@Z222222122222 0422981 0000 +M520191211111112109120101126WTTTY@T@9222222222222 0422021 0000 +M520191211111112109120070502WTTT#9WY9122222222222 0422061 0000 +M42019121111111219821700404101013113 +M520191211111112198119630101WTTTYPBYZ22222112222250112111148300000 +M520191211111112198120060602WTTT0Y9##222221222222 0422071 0000 +M42019121111111221220300404901163113 +M520191211111112212120040113WTTT#T0ZB22212112222210412081200000000 +M520191211111112212119770101WTTTYBBZW22212112222210112131234620000 +M520191211111112212120120608WTTTP@BP9222122222222 0422011 0000 +M42019121111111231721400406791163113 +M520191211111112317119801101WTTTPYYYY12222222222210112121123240000 +M520191211111112317120061106WTTTYTYTY222221122222 0422061 0000 +M42019121111111241221700406751163113 +M520191211111112412119910103WTTT0BTW@12222222222210112131125610000 +M520191211111112412120150723WTTTY9#ZY222222222222 0422981 0000 +M42019121111111263020600406451163113 +M520191211111112630119770502WTTT09@0Z22222122222220112111127310000 +M520191211111112630120050123WTTTPZPT0222221222222 0422081 0000 +M42019121111111264722700404531161113 +M520191211111112647119860521WTTTPB#0Z22222122222230112111127190000 +M520191211111112647120150607WTTTY9@PB222222222222 0422981 0000 +M520191211111112647120140122WTTT00ZY@222122122221 0422981 0698 +M520191211111112647120100506WTTT00WT9222221222222 0422031 0000 +M520191211111112647120080501WTTT0##TP222222122222 0422051 0000 +M520191211111112647120060101WTTTYP@00222221222222 0422071 0320 +M42019121111111297320500402421163113 +M520191211111112973119881122WTTT#WT@#22222112222210112131120650000 +M520191211111112973120150819WTTTYPZB0222221122222 0422981 0000 +M520191211111112973120131113WTTTYZ9@9222221222221 0422981 0808 +M42019121111111314222700400671162113 +M520191211111113142119890506WTTT00B0T22212222222210112121118880000 +M520191211111113142120180108WTTT#9#9#122222122222 0422981 0000 +M520191211111113142120120726WTTT#@WY#222222222222 0422011 0000 +M520191211111113142120100615WTTTPW#BB222122122222 0422031 0000 +M42019121111111317622700403241163113 +M520191211111113176119850123WTTT#@#9Y22222122222210112111122240000 +M520191211111113176120190622WTTT0YB9#222221222222 0422981 0000 +M520191211111113176120150619WTTTY00@0222222122222 0422981 0000 +M42019121111111317922700403241993113 +M520191211111113179119920123WTTTPWWBW22222122222210112111113930000 +M520191211111113179120180618WTTTPPWWW222221122222 0422981 0000 +M42019121111111342620000400131161113 +M520191211111113426119710115WTTTY0WWY22212222222210112111118570000 +M520191211111113426120100619WTTTYTZPY222122222222 0422031 0000 +M520191211111113426120050601WTTTP#P#Z222122222222 0422081 0000 +M42019121111111392820900401231163113 +M520191211111113928119720115WTTTP##BW22222222222220212112115350000 +M520191211111113928119630126WTTTPYZ#P22222212222220112112117290000 +M520191211111113928120130121WTTT0PBZ9122222122222 0422981 0000 +M520191211111113928120020101WTTT#9T@#222222122222 0422112 0000 +M42019121111111431821100403821163113 +M520191211111114318119970626WTTTP#Y#B12222222222210112121125290000 +M520191211111114318120160801WTTTPZ#YP122222222222 0422981 0000 +M520191211111114318120140113WTTT#Z99B122222122222 0422981 0000 +M42019121111111433821100406001163113 +M520191211111114338119900606WTTTPYPTT12222222222230112141119700000 +M520191211111114338120180801WTTT0ZW@W222222122222 0422981 0000 +M520191211111114338120160512WTTTP#00@122222222222 0422981 0000 +M42019121111111459521400400771163113 +M520191211111114595119880506WTTT#W@YZ22212212222210222111200000000 +M520191211111114595119850612WTTT#0@PT22222122222220112121120200000 +M520191211111114595120090601WTTT09WYB222221222222 0422041 0000 +M520191211111114595120090601WTTTYW#ZT222221122222 0422041 0000 +M520191211111114595120050723WTTT#T09Y222221122222 0422081 0000 +M42019121111111483720000401371163113 +M520191211111114837119920519WTTT0#BTW22222122222210112121127160000 +M520191211111114837120160108WTTT0Z@Y#222221122222 0422981 0000 +M520191211111114837120150502WTTTY9PT0222221122222 0422981 0000 +M42019121111111486121700401121162113 +M520191211111114861119810715WTTT0TB0Y22222122222230112132114670000 +M520191211111114861120150102WTTTPP#W#122222222222 0422981 0000 +M42019121111111489020600401981163113 +M520191211111114890119930818WTTTP0ZZ@22222122222210112121124490000 +M520191211111114890120170806WTTT0B@0Y222222122222 0422981 0000 +M520191211111114890120140115WTTTP09WP122222122222 0422981 0000 +M520191211111114890120091112WTTTYPTY0122222122222 0422031 0000 +M42019121111111508320600404951013113 +M520191211111115083119910121WTTT0TTBT22222122222211012111123410000 +M520191211111115083119880719WTTTPTBYW22222112222210112111116340000 +M520191211111115083120150518WTTTPWYPT222221122222 0422981 0000 +M520191211111115083120110521WTTT00#Z0222221122222 0422021 0000 +M42019121111111512620600402031163113 +M520191211111115126119880123WTTTP0W0#12222122222210112121127680000 +M520191211111115126120050115WTTT0#0WT222122122222 0422081 0000 +M42019121111111514620900400501163113 +M520191211111115146119810521WTTTP@09W22222222222210112112130730000 +M520191211111115146120120602WTTTP90B9222122122222 0422012 0000 +M520191211111115146120090122WTTTYT0ZP222122122222 0422042 0000 +M42019121111111521221700405631163113 +M520191211111115212119890821WTTT#BB9B22222122222230112111129210000 +M520191211111115212120150103WTTT#Y##Y222221122222 0422981 0000 +M520191211111115212120120823WTTTPB#ZT222221122222 0422011 0000 +M520191211111115212120090626WTTT#Z@9B222221122222 0422041 0000 +M42019121111111543720000402101163113 +M520191211111115437119831107WTTT#PTT922222122222250112121120471404 +M520191211111115437120170516WTTTPWPB0222221122222 0422981 0000 +M520191211111115437120121106WTTT##WZ9222221222222 0422981 0000 +M520191211111115437120030509WTTT0B9BW222221122222 0422101 0000 +M42019121111111567121100401691163113 +M520191211111115671119860101WTTT#@T0T12222222222210112121122270000 +M520191211111115671119861119WTTT#Z@W912222212222210212121120350000 +M520191211111115671120090519WTTT#TW0Y122222122222 0422041 0000 +M520191211111115671120080112WTTT0Z#Y#122222122222 0422051 0000 +M42019121111111582622400401481993113 +M520191211111115826119900123WTTT#W@BW22122222222250112111122990000 +M520191211111115826120160101WTTTPTW9W221222122222 0422981 0000 +M520191211111115826120150115WTTT#TW#W221222122222 0422981 0000 +M520191211111115826120130119WTTTPY@Y0221222122222 0422981 0000 +M42019121111111601521400406791161113 +M520191211111116015119860526WTTT00WY922212222222210112111118570000 +M520191211111116015120100521WTTTY0#BT222222222222 0422031 0000 +M520191211111116015120030115WTTTPWPWT222221122222 0422091 0000 +M42019121111111628020900402921161113 +M520191211111116280119860526WTTTY#Y0W12222222222210112121124190000 +M520191211111116280120150719WTTT00#WT122222122222 0422981 0000 +M520191211111116280120050121WTTT0B9@#122222122222 0422081 0000 +M520191211111116280120040118WTTT#99ZY122222222222 0422091 0000 +M42019121111111637020600405341162113 +M520191211111116370119880519WTTTP#YZB12222222222210112131126930000 +M520191211111116370120180101WTTTY@ZW@222222122222 0422981 0000 +M520191211111116370120070502WTTTYZZ@Z122222122222 0422061 0000 +M42019121111111640822400401011161113 +M520191211111116408119810126WTTTYWZBZ22212212222220112121241330000 +M520191211111116408119800723WTTTP#0#Y22212222222220212121200000000 +M520191211111116408120131115WTTT0ZTBY222122122222 0422981 0000 +M520191211111116408120110102WTTT#YWW0222222222222 0422021 0000 +M520191211111116408120100815WTTTYT@99222122122222 0422031 0000 +M42019121111111649822700403611163113 +M520191211111116498119771116WTTTYPYT922222122222210112121123710000 +M520191211111116498120101115WTTT#9ZB#222221222222 0422021 0000 +M520191211111116498120060101WTTTYZZTB222222122222 0422061 0000 +M42019121111111676121400400351163113 +M520191211111116761119840808WTTTYT9YZ22212222222210112111121940000 +M520191211111116761120100701WTTT#00W@222122222222 0422031 0000 +M520191211111116761120090702WTTT#ZWP@222122122222 0422041 0000 +M520191211111116761120060123WTTT0BYW9222122222222 0422061 0000 +M42019121111111678620900406601163113 +M520191211111116786119841119WTTT#Y#9P22212222222210112121115190000 +M520191211111116786120141123WTTT#BYY0222222222222 0422981 0000 +M520191211111116786120100123WTTT#B0BY222122222222 0422031 0000 +M42019121111111679120900403071163113 +M520191211111116791119910821WTTT#ZBT922212222222210112121118360150 +M520191211111116791120150702WTTTYPZ@@212121122222 0422981 0000 +M42019121111111685120500403231163113 +M520191211111116851119790119WTTTPWP@B22222122222250112161119360000 +M520191211111116851120120101WTTTP@BPB222221122222 0422981 0000 +M520191211111116851120120101WTTT#W@BZ222221122222 0422981 0000 +M520191211111116851120080809WTTTPBZWZ222221222222 0422051 0000 +M520191211111116851120050101WTTTYPBPT222221122222 0422081 0000 +M42019121111111685421700401121163113 +M520191211111116854119860609WTTTYYPWY22221222222210112131117180000 +M520191211111116854120180819WTTT09TTB122222122222 0422981 0000 +M42019121111111735621100401181163113 +M520191211111117356119800701WTTT#TZ9922122222222210112112136560000 +M520191211111117356120150506WTTTYYY9P221222222222 0422981 0000 +M520191211111117356120090515WTTTY#T90222222222222 0422041 0000 +M520191211111117356120030515WTTT0Y999221222122222 0422101 0000 +M42019121111111761621100406001162113 +M520191211111117616119660101WTTTY0YZ912222222222210112112124420000 +M520191211111117616120070702WTTT0#BZ@222222122222 0422061 0000 +M520191211111117616120040701WTTT##009122222122222 0422091 0000 +M42019121111111777922700400441163113 +M520191211111117779119880113WTTTPZ@W022222122222210112111100000000 +M520191211111117779120180119WTTTP99ZB222222122222 0422981 0000 +M42019121111111783021100403821013113 +M520191211111117830119830807WTTT#@00B12222222222210112111136240000 +M520191211111117830120130121WTTT00Y##222222222222 0422981 0000 +M520191211111117830120070615WTTT#ZW#Z222222222222 0422061 0000 +M42019121111111809620000402101161113 +M520191211111118096119710115WTTT09T#@12222222222230112111123170000 +M520191211111118096120020106WTTTYW0#W122222122222 0422111 0000 +M42019121111111814620600401151162113 +M520191211111118146119960609WTTT0#YB@22212222222210112121115560000 +M520191211111118146120140712WTTTY@PB#222122222222 0422981 0000 +M42019121111111818120900401031193113 +M520191211111118181119800608WTTT#00BB22222122222210112121119110000 +M520191211111118181120150626WTTTY#0Y@122222222222 0422981 0000 +M520191211111118181120030501WTTT0ZTW0222222122222 0422101 0000 +M42019121111111818821700401121011113 +M520191211111118188119880501WTTTY#9#Z22222122222210112121200000000 +M520191211111118188119720101WTTT#9TYP12222212222211012121222530000 +M520191211111118188120190603WTTT00YW0222221222222 0422981 0000 +M520191211111118188120120514WTTT#@90T122222122222 0422011 0000 +M42019121111111831122700403941163113 +M520191211111118311119970701WTTTYWTW@22222122222210112121120910000 +M520191211111118311120170121WTTTPZ0W9222222122222 0422981 0000 +M42019121111111831720900401881163113 +M520191211111118317119860103WTTTY0TYT22212222222210112121127720000 +M520191211111118317120060108WTTTPYB9W222122222222 0422071 0000 +M42019121111111849420900406421162113 +M520191211111118494119890716WTTTP@#@922212222222210112121125490000 +M520191211111118494120171113WTTT#PPY@222122122222 0422981 0000 +M520191211111118494120110518WTTT#0@WT222122122222 0422021 0000 +M520191211111118494120090121WTTTPBTBW222122222222 0422041 0000 +M42019121111111860522700402581163113 +M520191211111118605119831115WTTT0BB##12222222222210112121127710000 +M520191211111118605120050715WTTT#Y09Y122222222222 0422081 0000 +M520191211111118605120040601WTTT#@0@#122222122222 0422091 0000 +M42019121111111862520900406601161113 +M520191211111118625119770719WTTT09WW#12222222222230112121134620000 +M520191211111118625120100821WTTTP9@99122222222222 0422031 0000 +M520191211111118625120070502WTTT0W0PZ122222122222 0422061 0000 +M520191211111118625120030508WTTT0PWY9122222222222 0422101 0000 +M42019121111111871622200401591163113 +M520191211111118716119850112WTTTYYYWB22212222222210112112117900000 +M520191211111118716120130802WTTTY@BYP222222222222 0422981 0000 +M520191211111118716120020119WTTTYT#9T222122222222 0422103 0000 +M42019121111111903722700402801161113 +M520191211111119037119820706WTTT#ZW9B12222222222250112121118210000 +M520191211111119037120040702WTTTPTPY@122222222222 0422091 0000 +M42019121111111982420600402121163113 +M520191211111119824119950106WTTT0P@@P22222122222210112081121510000 +M520191211111119824120170115WTTTY#TP@122221222222 0422981 0000 +M42019121111111988222700400381163113 +M520191211111119882119690819WTTTYPB9922212212222210112141117580000 +M520191211111119882120120103WTTT#9W0@222122122222 0422011 0000 +M520191211111119882120100702WTTT09#00222122122222 0422031 0000 +M42019121111112049220600400871163113 +M520191211111120492119830102WTTTYZPW921222122222220112111119390000 +M520191211111120492120160503WTTT#ZTBW222221122221 0422981 0622 +M520191211111120492120100719WTTTYBB@P222221122222 0422031 0000 +M42019121111112054920600405341163113 +M520191211111120549119840622WTTTPT@@#22212222222210112111127480000 +M520191211111120549120130519WTTT0PB0Z222222122222 0422981 0000 +M42019121111112068122400406121161113 +M520191211111120681119850501WTTTPZBZP22212222222210112121118350000 +M520191211111120681120151108WTTTYYZB9222122122222 0422981 0000 +M520191211111120681120070713WTTTPZ#BW222122222222 0422061 0000 +M42019121111112074120900406601162113 +M520191211111120741119910621WTTT#PZ9@22222122222210112121116010000 +M520191211111120741120170519WTTT0YB#W222221122222 0422981 0000 +M42019121111112113621100405881162113 +M520191211111121136119700623WTTT000TT22222122222210112161117360000 +M520191211111121136120080726WTTT#000#222222222222 0422051 0000 +M42019121111112131821100401461162113 +M520191211111121318119820502WTTT0YYTZ12222222222210112111117550000 +M520191211111121318120010123WTTT0#BZW122222122221 0422111 0885 +M42019121111112169120900405331161113 +M520191211111121691119850513WTTTP9P0922122222222210112121118000000 +M520191211111121691120140107WTTTP@TT0221222222222 0422981 0000 +M520191211111121691120071102WTTTY@YBP221222122222 0422051 0000 +M42019121111112180820000404271163113 +M520191211111121808119870123WTTTP#0YY12222212222210112111118010000 +M520191211111121808120110123WTTT0#9PZ122222122222 0422021 0000 +M42019121111112183221700404181163113 +M520191211111121832119820801WTTTP##WZ22222122222210112111123100000 +M520191211111121832120151115WTTTPT#@W222221122222 0422981 0000 +M520191211111121832120130101WTTT0P99P222221222222 0422981 0000 +M42019121111112186920600405171162113 +M520191211111121869119940119WTTTY0@WP22212222222210112081115000000 +M520191211111121869120160715WTTTYZ0TB222222122222 0422981 0000 +M520191211111121869120140815WTTTYTB0P222122222222 0422981 0000 +M520191211111121869120140815WTTTYWY0@222122222222 0422981 0000 +M42019121111112188520900400501011113 +M520191211111121885119870119WTTT0T#PB22222222222250112121139000000 +M520191211111121885120180519WTTT0TZ@Z122222222222 0422981 0000 +M520191211111121885120150115WTTTPW#Y9122222122222 0422981 0000 +M520191211111121885120110119WTTT0W0@Y122222122222 0422021 0000 +M520191211111121885120060119WTTTPBBT9122222122222 0422061 0000 +M42019121111112188922200400631162113 +M520191211111121889119820816WTTTPY@ZT21222122222220112161115330000 +M520191211111121889119750507WTTT#TZB@22212212222220212112133260000 +M520191211111121889120160523WTTTPWY0B222121122222 0422981 0000 +M520191211111121889120150106WTTTYYYWP222121222222 0422981 0000 +M42019121111112205821100406471163113 +M520191211111122058119870103WTTT#9YPT22212122222210112111131200000 +M520191211111122058120160113WTTTYP@WZ222121122222 0422981 0000 +M520191211111122058120131107WTTTP@W0P222121222222 0422981 0000 +M42019121111112235221100405951163113 +M520191211111122352119950116WTTT0P0W@12222222222210112121119570000 +M520191211111122352120160119WTTTPYPPP122222222222 0422981 0000 +M520191211111122352120140114WTTTYBTBT122222222222 0422981 0000 +M42019121111112245021200404291163113 +M520191211111122450119970803WTTTYWWY922222222222220112131112310000 +M42019121111112270521700401121161113 +M520191211111122705119810702WTTT#P#@B22212222222230112111126210000 +M520191211111122705120190806WTTT0ZTZZ222222222222 0422981 0000 +M520191211111122705120060121WTTTY#PBZ222222222222 0422061 0000 +M520191211111122705120010101WTTTY0T#T222222222222 0422111 0000 +M42019121111112271221400406791163113 +M520191211111122712119840107WTTTP@PWZ12222222222220112111131850000 +M520191211111122712120190515WTTTPP0YZ222222122222 0422981 0000 +M520191211111122712120120615WTTTPP@@#122221122222 0422011 0000 +M520191211111122712120060801WTTTY09T0122222222222 0422071 0000 +M42019121111112272520000404071162113 +M520191211111122725119920626WTTTP0@0Y22212222222210112121114790000 +M520191211111122725120160515WTTT0P9TB222122222222 0422981 0000 +M520191211111122725120110618WTTT0@#ZP222122222222 0422021 0000 +M42019121111112277920600405341163113 +M520191211111122779119951126WTTT0T@PY12222122222210112131120030000 +M520191211111122779120170119WTTTYBTTP122221122222 0422981 0000 +M520191211111122779120160703WTTTPY@WZ122221122222 0422981 0000 +M42019121111112278520000406821163113 +M520191211111122785119880515WTTTP00PY22222122222210112111116830000 +M520191211111122785120190507WTTT#WT@Y222221122222 0422981 0000 +M42019121111112296220600401421163113 +M520191211111122962119910123WTTTP0ZTY22222122222210112121124490000 +M520191211111122962120160712WTTT0P9WT122221222222 0422981 0000 +M520191211111122962120110816WTTTYPZ0#222222222222 0422021 0000 +M520191211111122962120081102WTTTYZ0YZ222221222222 0422041 0000 +M42020011111111111521700406341163113 +M520200111111111115119980126WTTTY9WBT22222122222210112111119260000 +M520200111111111115120161123WTTT#YB09222221222222 0422981 0000 +M42020011111111119322400406121163113 +M520200111111111193119740116WTTT0@Z9@22212222222220112111124130000 +M520200111111111193120100118WTTTP0@WB222222122222 0422031 0000 +M42020011111111145722400406121013113 +M520200111111111457119870506WTTTP0TZ#22122222222250112111117700000 +M520200111111111457120110515WTTT0WW@Y221222122222 0422021 0000 +M42020011111111149520600401421163113 +M520200111111111495119831115WTTTBTZBT22212222222210112121121880000 +M520200111111111495120160821WTTTP#ZZ0222122122222 0422981 0000 +M520200111111111495120060718WTTTY#Z09222222222222 0422071 0000 +M42020011111111173022200402941163113 +M520200111111111730119790103WTTTP9BYB22212222222210112121121750000 +M520200111111111730120050606WTTT#09TY222122222222 0422081 0000 +M42020011111111176320000401371163113 +M520200111111111763119860108WTTT#@W9922222122222210112131116250000 +M520200111111111763120140107WTTT0ZB##222221222222 0422981 0000 +M42020011111111182020900403071162113 +M520200111111111820119950515WTTT0PB#012212122222210112121119850000 +M520200111111111820120160802WTTTPTW09122122122222 0422981 0000 +M42020011111111186020900405911161113 +M520200111111111860119870826WTTT#TW#022212222222210112121114110000 +M520200111111111860120130106WTTT#YTY9222122122222 0422981 0351 +M42020011111111210621100406001163113 +M520200111111112106119910506WTTTYZTWZ12222222222210112121117350000 +M520200111111112106120150823WTTT0B#BT222222222222 0422981 0000 +M42020011111111213321700405121163113 +M520200111111112133119770619WTTTPZPYY12222222222230112112128890000 +M520200111111112133120050518WTTTY#T9W222221222222 0422082 0000 +M520200111111112133120020119WTTTY0ZTZ122221122222 0422102 0000 +M42020011111111227122700403941163113 +M520200111111112271119830123WTTT#YY9922212222222210112121131230000 +M520200111111112271120130708WTTT00P90222122222222 0422981 0000 +M520200111111112271120111119WTTT0PY@Z222122122222 0422021 0000 +M42020011111111227321700402341162113 +M520200111111112273119800106WTTTYZT0P22222122222210112131123690000 +M520200111111112273120050108WTTT#BT@9122221222222 0422081 0000 +M42020011111111231320600405171161113 +M520200111111112313119900112WTTTPT##W12222222222210112121110400000 +M520200111111112313120140121WTTTYWZWT122222222222 0422981 0000 +M42020011111111232920000402281013113 +M520200111111112329119780122WTTT0BPWT22222222222220212162200000000 +M520200111111112329119700119WTTTYZTYZ22222112222220112162238180000 +M520200111111112329120190613WTTTY9YW@222221222222 0422981 0000 +M520200111111112329120170519WTTT0W@@B222221122222 0422981 0000 +M520200111111112329120150718WTTT0BBB#222222222222 0422981 0000 +M42020011111111250320300405411162113 +M520200111111112503119930521WTTT#T0Z922222122222210112081117530000 +M520200111111112503119800109WTTT#YWZB22222112222211012121115370000 +M520200111111112503120170602WTTTPP#YP222222222222 0422981 0000 +M42020011111111261121200406661163113 +M520200111111112611119920102WTTTY##BT22222112222250112111115270000 +M520200111111112611120150602WTTTPBWBW222222122222 0422981 0000 +M520200111111112611120130601WTTTYBP0@122222122221 0422981 0522 +M42020011111111261620600401421163113 +M520200111111112616119960723WTTT#0#@B12222222222210112121113360000 +M520200111111112616120130101WTTTY90@T122222222222 0422981 0000 +M42020011111111293722200402491163113 +M520200111111112937119890808WTTTYYYB#12222222222210112131117400000 +M520200111111112937120180714WTTTYWWZZ222222122222 0422981 0000 +M520200111111112937120110115WTTT#TZ0B122222122222 0422021 0000 +M520200111111112937120090123WTTTP@Y9T122222222222 0422031 0000 +M42020011111111301220900403031162113 +M520200111111113012119750114WTTTPPB#W12222222222210122121131070000 +M520200111111113012120140626WTTT#TTT0122222222222 0622981 0000 +M520200111111113012120130118WTTTY99T@122222122222 0622981 0000 +M42020011111111318921100403821161113 +M520200111111113189119790515WTTTP##@922222122222220112131133100000 +M520200111111113189120190806WTTT#WZ00122222122222 0422981 0000 +M520200111111113189120150514WTTT0PY#Y122222222222 0422981 0000 +M520200111111113189120140715WTTT#9ZTZ122222122222 0422981 0000 +M520200111111113189120110126WTTTPB#B@222221122222 0422021 0000 +M42020011111111350422700403611163113 +M520200111111113504119770101WTTT#ZZ@922222122222220112141120370000 +M520200111111113504120050501WTTTPZT9T222222122222 0422081 0000 +M520200111111113504120040106WTTT0PWYY222222122222 0422091 0000 +M42020011111111356120900406151163113 +M520200111111113561119720706WTTT0TYPZ22212212222210112112124740000 +M520200111111113561120070116WTTT#9@9Y222122122222 0422062 0000 +M42020011111111380821100401181013113 +M520200111111113808119890119WTTT0YZ@@22222122222210112111121670000 +M520200111111113808120160506WTTT0PW0Z222121222222 0422981 0000 +M42020011111111400920900400501161113 +M520200111111114009119720512WTTTY##@T22212221222250112111121500868 +M520200111111114009120030503WTTTY09BT122222122222 0422101 0048 +M520200111111114009120020602WTTT#0WTP122222122222 0422111 0048 +M42020011111111418320000404071011113 +M520200111111114183119830521WTTT0@90#12222122222210112121126060000 +M520200111111114183120080808WTTTYBTZP222221122222 0422051 0000 +M42020011111111434420000404151993113 +M520200111111114344219830502WTTT#BZPW22222222222220212113200000000 +M520200111111114344119690515WTTTP9Y@Z22222212222220112111116320000 +M520200111111114344120160616WTTTPBBZY222222222222 0422981 0000 +M42020011111111451922700403611163113 +M520200111111114519119940601WTTTPWWZY12222222222210112111115370600 +M520200111111114519120180702WTTT#@ZWP122222122222 0422981 0000 +M42020011111111452321400403481192113 +M520200111111114523119720721WTTTY00TZ12222222222210112121132970000 +M520200111111114523120060501WTTT09P9Z122222122222 0422071 0000 +M520200111111114523120040112WTTTY99Z@122222122222 0422091 0000 +M42020011111111490821400400351163113 +M520200111111114908119870815WTTT0B#0Y22212222222220112111100000000 +M520200111111114908120160115WTTTYWB0W222122222222 0422981 0000 +M520200111111114908120140126WTTTY#P#@222122222222 0422981 0000 +M520200111111114908120060702WTTT0W#Z0222222222222 0422073 0000 +M520200111111114908120040506WTTTP#Y0T222222122222 0422093 0000 +M42020011111111503321700401301163113 +M520200111111115033119880119WTTT###@Z22212222222210112122122600000 +M520200111111115033120150708WTTTP@9BW222222122222 0422981 0000 +M42020011111111503620900402921162113 +M520200111111115036119760119WTTT0TPYB22212222222250112121125780000 +M520200111111115036120080601WTTT##9T@222122122222 0422051 0000 +M520200111111115036120050518WTTT#T##Z222122122222 0422081 0000 +M520200111111115036120040801WTTT0Y#BT222122222222 0422091 0000 +M42020011111111504020000403951163113 +M520200111111115040119841121WTTT#Z9YT12222222222220222111218620000 +M520200111111115040119811126WTTTPW@9Z12222222222210112112120470000 +M520200111111115040120070109WTTT#TTT9222221122222 0422061 0000 +M520200111111115040120040126WTTTYTPZ@222221122222 0422081 0000 +M42020011111111533022700405241163113 +M520200111111115330119900708WTTT00BBT22222122222250112111119880100 +M520200111111115330120170526WTTT#T##P222221222222 0422981 0000 +M520200111111115330120130706WTTT00@TT222221222222 0422981 0000 +M42020011111111542520600405771163113 +M520200111111115425119960502WTTTPW@B022212222222210112161117240000 +M520200111111115425120180619WTTT0PB99222122122222 0422981 0000 +M520200111111115425120160502WTTTY#9@Z122122122221 0422981 0712 +M42020011111111556921700406571162113 +M520200111111115569119830126WTTT0YW0#22212222222210112121100000000 +M520200111111115569120140719WTTT#@ZZW222122222222 0422981 0000 +M520200111111115569120100712WTTT###ZW222122122222 0422031 0000 +M520200111111115569120080101WTTTP9YPZ222122122222 0422041 0000 +M42020011111111570622700400681163113 +M520200111111115706119860521WTTTPBZY922222122222210112111113730000 +M520200111111115706120170507WTTT#9PWB222221122222 0422981 0000 +M520200111111115706120130106WTTT0TP#Z222221222222 0422981 0267 +M520200111111115706120110114WTTT#YWP@222221222222 0422011 0300 +M42020011111111586620900406601993113 +M520200111111115866119840723WTTT0W9Y022222122222220212111200000000 +M520200111111115866119830515WTTTP0PZ022222112222220112111240850000 +M520200111111115866120160809WTTT090T0222222222222 0422981 0000 +M520200111111115866120140814WTTTYB0BT222221122222 0422981 0000 +M42020011111111595722700400671162113 +M520200111111115957119890726WTTT0Y0@#12222222222210112111118980000 +M520200111111115957120111112WTTT0YZTT122221122222 0422021 0000 +M520200111111115957120090518WTTT0T@99122221122222 0422041 0000 +M42020011111111612622700400681161113 +M520200111111116126119880609WTTTPWYYB22212222222210112121126760000 +M520200111111116126120080106WTTT0@BBP122222222222 0422051 0000 +M42020011111111615220900402921993113 +M520200111111116152119960619WTTT#TPP912222222222210112111118180000 +M520200111111116152120150126WTTTPY#9@122222222222 0422981 0000 +M42020011111111620721100404801163113 +M520200111111116207119750115WTTTY##ZW22222122222230112121121910000 +M520200111111116207120100613WTTTP@0Z@222221222222 0422031 0000 +M520200111111116207120080814WTTT0@WZ@222221122222 0422051 0000 +M520200111111116207120040603WTTTP#TW9222221122222 0422091 0000 +M42020011111111623020600400871161113 +M520200111111116230119910807WTTTY#9W012222222222210112121114930000 +M520200111111116230120160106WTTT##Z0Z122222222222 0422981 0000 +M520200111111116230120130522WTTT#Y#@9122222222222 0422981 0000 +M520200111111116230120100119WTTTYYBW9122222122222 0422021 0000 +M42020011111111638220600406321161113 +M520200111111116382119810715WTTTP0WW912222222222210112131116250000 +M520200111111116382120170121WTTT0YZZ#122222222222 0422981 0000 +M520200111111116382120160715WTTT#B#0@222222222222 0422981 0000 +M520200111111116382120030101WTTTP@Z#Z122222222222 0422101 0000 +M42020011111111663620900402921163113 +M520200111111116636119690819WTTT#9W#P22212222222250112111127960000 +M520200111111116636120090107WTTTPBB@0222122122222 0422041 0000 +M42020011111111669721100406391163113 +M520200111111116697119730119WTTT0W0@#12222222222230112111121130000 +M520200111111116697120080119WTTTYP0W0122222222222 0422051 0000 +M42020011111111674120500402421013113 +M520200111111116741119841113WTTTYPBTY22222122222210112111124620000 +M520200111111116741120181123WTTTYYPB@222222222222 0422981 0000 +M42020011111111700721100401461163113 +M520200111111117007119760719WTTTY#PYP22222122222220212111200000000 +M520200111111117007119610707WTTT0#9@Z22222112222220112111264980000 +M520200111111117007120150108WTTT0WPP0222221122222 0422981 0000 +M520200111111117007120120103WTTT0#WZT222222122222 0422011 0000 +M42020011111111707122700403941163113 +M520200111111117071119830501WTTT0YP9#22222222222220112112100000000 +M520200111111117071120170101WTTT0YZY0222222222222 0422981 0000 +M520200111111117071120090815WTTT0@0@T222222222222 0422042 0000 +M520200111111117071120080519WTTT00P#Z222222222222 0422052 0000 +M520200111111117071120070813WTTT#PB0B222222222222 0422062 0000 +M42020011111111730922700403611163113 +M520200111111117309119940818WTTT#0TZ022222122222210112111115290000 +M520200111111117309120150818WTTT#TBYY222221122222 0422981 0000 +M42020011111111732922700400681163113 +M520200111111117329119790622WTTTYTPT@12222222222210112081116250000 +M520200111111117329120090626WTTT##Z0T122222222222 0422041 0000 +M520200111111117329120020608WTTTYWWBB122222222222 0422111 0000 +M42020011111111743021100401181162113 +M520200111111117430119860526WTTTPZB9922212222222210112121121480000 +M520200111111117430120050626WTTTP00B9222122222221 0422081 0534 +M42020011111111771421100406001163113 +M520200111111117714120010115WTTTP##YT12222122222210412081110430000 +M520200111111117714120181107WTTT0@ZT#222222122222 0622981 0000 +M520200111111117714120181107WTTT##T9#222222122222 0622981 0000 +M42020011111111772820600405471163113 +M520200111111117728119710118WTTT0P#YZ12222222222250112111126990000 +M520200111111117728120060719WTTTP@T0T122222122221 0422071 0502 +M42020011111111780421100403821161113 +M520200111111117804119870513WTTTY9WWT12222222222220112111110830000 +M520200111111117804120131114WTTTPT#BT122222122222 0422981 0000 +M520200111111117804120080812WTTT#B9BW122222222222 0422051 0000 +M520200111111117804120020109WTTTY9YZ9122222122222 0422111 0227 +M42020011111111788220600401981162113 +M520200111111117882119780126WTTTP@ZWP22222222222210112131126290000 +M520200111111117882120120126WTTTPZ9T0222122222222 0422011 0000 +M520200111111117882120110703WTTTP#0PW222222222222 0422021 0000 +M520200111111117882120060715WTTT0BZ#P222122222221 0422071 0808 +M42020011111111791520600401151163113 +M520200111111117915119680113WTTT#P0B@22222222222220112121127960000 +M520200111111117915120150116WTTTP@#Y@222122222222 0422981 0000 +M520200111111117915120080723WTTTPTT0P222222222222 0422051 0000 +M42020011111111806621100406001011113 +M520200111111118066119880116WTTTYTT##12222222222230112121126250000 +M520200111111118066120060107WTTTY#YYW122222222222 0422071 0000 +M42020011111111817320900406151162113 +M520200111111118173219941123WTTTY##PP22212212222220212123200000000 +M520200111111118173119900112WTTTY@##T22212222222220112131116940000 +M520200111111118173120160102WTTTYYYT0222122122222 0422981 0000 +M42020011111111821620900406601013113 +M520200111111118216119850509WTTT#ZZTT22212222222210112131117950000 +M520200111111118216119830101WTTT#090#22212212222220212121134360000 +M520200111111118216120140114WTTT#Y09@222122122222 0422981 0000 +M520200111111118216120120715WTTTP@Z0@222122222222 0422011 0000 +M42020011111111825521200404541161113 +M520200111111118255119990603WTTT#T@P#22222122222210112111114770000 +M520200111111118255120190715WTTTPT@#9222222222222 0422981 0000 +M520200111111118255120160815WTTT0YT9Y222221122222 0422981 0000 +M42020011111111879521700406831161113 +M520200111111118795119960509WTTT0Y#P022222122222210112111124520000 +M520200111111118795120150819WTTT#0YWZ222222222222 0422981 0000 +M42020011111111885920600402121163113 +M520200111111118859119880602WTTTYZWZT22222122222210112121111710000 +M520200111111118859120131114WTTTP09Z0222221122222 0422981 0000 +M520200111111118859120120501WTTTY#ZWW222221122222 0422011 0000 +M42020011111111917722400406441163113 +M520200111111119177119760518WTTTP0@Z012212222222210112121116890000 +M520200111111119177120160503WTTTPT9B9222122122222 0422981 0000 +M520200111111119177120071122WTTTYPZP0222122122222 0422061 0000 +M42020011111111934520000404271162113 +M520200111111119345119890626WTTT#@PYY22222122222210112111126400000 +M520200111111119345120100126WTTT#ZZ9@122221122222 0422031 0000 +M520200111111119345120070501WTTTP@Z9B222222222222 0422061 0000 +M42020011111111945320900406421163113 +M520200111111119453219850819WTTTPB99T12222222222220212113200000000 +M520200111111119453119790106WTTT0B###12222212222210112122128490000 +M520200111111119453120120619WTTTP9TBW122222122222 0422013 0000 +M520200111111119453120040816WTTTYPPTW122222122222 0422093 0000 +M520200111111119453120040618WTTTY099Z122222222222 0422092 0000 +M520200111111119453120020703WTTTY9#P#122222222222 0422112 0000 +M42020011111111949021100406001163113 +M520200111111119490119840121WTTT#WWBY12222222222220112112115980000 +M520200111111119490120150101WTTTP#@Z#122222122222 0422981 0000 +M520200111111119490120090119WTTTY099@222222222222 0422042 0000 +M42020011111111954221700404101163113 +M520200111111119542119760806WTTTP#9ZY22122222222210112121118590000 +M520200111111119542120060121WTTT0W@TW222221222222 0422061 0000 +M42020011111111971520600402981163113 +M520200111111119715119880102WTTT#T@W912222222222210112111115770000 +M520200111111119715120151123WTTT0#TT9122222122221 0422981 0801 +M520200111111119715120120601WTTTPZBP@122222222222 0422011 0000 +M520200111111119715120060501WTTT##ZBZ122222222222 0422071 0000 +M42020011111111985821700402381162113 +M520200111111119858119920115WTTT0@#@#22222122222210112121120840000 +M520200111111119858120190108WTTT#TWBT222222122222 0422981 0000 +M520200111111119858120140108WTTT0W#Z9222222222222 0422981 0000 +M42020011111111992821700402341163113 +M520200111111119928119890114WTTT0@BPP12222222222210112121132710000 +M520200111111119928120180506WTTT0Y0@@222122222222 0422981 0000 +M520200111111119928120100101WTTTP0WP#122222122222 0422031 0000 +M520200111111119928120080609WTTT09#YT122222222222 0422051 0000 +M42020011111112001322700400671163113 +M520200111111120013119830512WTTTYT@Y#22122222222210112111138330000 +M520200111111120013120050509WTTT#B@9#221222222222 0422081 0000 +M520200111111120013120040101WTTTPP#ZP221222122222 0422091 0000 +M520200111111120013120020819WTTTYT9P#221222122222 0422111 0000 +M42020011111112009422700402001163113 +M520200111111120094119760719WTTT#@@9#22222122222210112121121190000 +M520200111111120094120080615WTTT##PW0222221222222 0422051 0000 +M520200111111120094120020116WTTT0BTPB222221222222 0422111 0000 +M42020011111112015221100404791162113 +M520200111111120152119830806WTTTYW#0#12222222222210112121119630000 +M520200111111120152120160623WTTT#@ZWY222221122222 0422981 0000 +M520200111111120152120040802WTTT#PYYW122222122222 0422091 0000 +M42020011111112019221400406791163113 +M520200111111120192119850112WTTT#Y0WY12222222222210112111141030000 +M520200111111120192120170503WTTT0B9Z@222222122222 0422981 0000 +M520200111111120192120130712WTTT0PZ@#122222122222 0422981 0000 +M520200111111120192120110814WTTTYT#BT122222122222 0422021 0000 +M520200111111120192120080509WTTT#B#P0122222122222 0422051 0000 +M520200111111120192120050814WTTTPZT90122222122222 0422081 0000 +M42020011111112021520900401881162113 +M520200111111120215119850814WTTTP0BT912222222222210112121120760000 +M520200111111120215119670121WTTTPYBYT12222212222250222112200000000 +M520200111111120215120070809WTTT0B@T@122222222222 0422061 0000 +M42020011111112029220500402421163113 +M520200111111120292119920123WTTT#W@TT22212222222210112111124860000 +M520200111111120292120141115WTTT##@#P222122222222 0422981 0000 +M520200111111120292120110806WTTTY9WZY222122122221 0422021 0732 +M42020011111112035121400401831163113 +M520200111111120351119880701WTTT0BBZ@12222222222210112111122760000 +M520200111111120351120170108WTTT0@BWP122222122222 0422981 0000 +M42020011111112035720000403721163113 +M520200111111120357119930518WTTT0WPPT22222122222210112131125350000 +M520200111111120357120190601WTTTPZ9W@122222122222 0422981 0000 +M520200111111120357120150621WTTTYTZBY122222222222 0422981 0000 +M42020011111112088020000406951162113 +M520200111111120880119770615WTTTPZTPW12222222222210112121121170000 +M520200111111120880120050623WTTTYYZYY122222122222 0422081 0000 +M42020011111112094020000406011163113 +M520200111111120940119770615WTTT0WBBZ22222122222220112111200000000 +M520200111111120940119760614WTTTPP@Y@22222112222221012111230000000 +M520200111111120940120050115WTTTP9B9B222221122222 0422081 0000 +M42020011111112117520600405471163113 +M520200111111121175119880101WTTTP9BBB12222222222210112111125410000 +M520200111111121175120170119WTTT0#090122222122222 0422981 0000 +M520200111111121175120120518WTTTYTY##122221122222 0422011 0000 +M520200111111121175120080121WTTTY9BT9122222222222 0422051 0000 +M42020011111112125720900406421162113 +M520200111111121257119780801WTTTP9P#912222222222210112121119660000 +M520200111111121257120050822WTTTPWT@#122222222222 0422081 0000 +M520200111111121257120020115WTTT09Z@Y122222222222 0422111 0000 +M42020011111112143620600401161161113 +M520200111111121436119970108WTTTPPBPP12222222222210112121126160000 +M520200111111121436120160606WTTT#B00Z122221222222 0422981 0000 +M42020011111112149922700400671163113 +M520200111111121499119840526WTTT0990@22222122222230112121130290000 +M520200111111121499120100501WTTT0PBTW222221122222 0422031 0000 +M520200111111121499120090722WTTTYP9B@222221122222 0422041 0000 +M42020011111112165421200404541163113 +M520200111111121654119910103WTTTYZT@T22222122222210112111115600000 +M520200111111121654120160115WTTT0#T#0222222222222 0422981 0000 +M42020011111112200621100401691163113 +M520200111111122006119970523WTTTYB0PW22222122222210112121117330000 +M520200111111122006120180109WTTTYP#@B222221222222 0422981 0000 +M520200111111122006120160501WTTTP#WYY222221122222 0422981 0000 +M520200111111122006120150102WTTT0T0@P222222222222 0422981 0000 +M520200111111122006120130721WTTT0PT9Y222221222222 0422981 0000 +M42020011111112215021400400351163113 +M520200111111122150119860102WTTTYWT@P22222122222210112121133330000 +M520200111111122150120140716WTTTYPW0Y222121122222 0422981 0000 +M520200111111122150120121103WTTTY#YB#222121222222 0422011 0000 +M520200111111122150120110108WTTTP0#PY222121222222 0422021 0000 +M520200111111122150120080114WTTTPZ0#Y222121222222 0422051 0000 +M42020011111112220121700406751163113 +M520200111111122201119661109WTTT0TZW022212212222220212121180140000 +M520200111111122201120130701WTTT0ZBT0222122122221 0422981 0885 +M520200111111122201120111122WTTT##WWP222122222222 0422021 0000 +M42020011111112226621700403251162113 +M520200111111122266119860815WTTTYY0ZW22222122222210112131134810000 +M520200111111122266120140102WTTT0#P0T222221122222 0422981 0000 +M520200111111122266120061101WTTT0Z9YY222221222222 0422071 0000 +M42020011111112231421100402871161113 +M520200111111122314119840522WTTT00Z@Y22212222222210112141121310000 +M520200111111122314120090106WTTT0Y#ZP122222122222 0422031 0000 +M520200111111122314120040126WTTT0W#W0222122222222 0422091 0000 +M42020011111112235921100401551163113 +M520200111111122359119990618WTTT0#WB#12222222222210112111122840000 +M520200111111122359120160115WTTT#YPPZ122222122222 0422981 0000 +M42020011111112268520600405341163113 +M520200111111122685119850106WTTTYT#PP12222222222230112131123280000 +M520200111111122685120110123WTTT#ZTW9122222122222 0422021 0000 +M520200111111122685120070701WTTT009B9122222122222 0422061 0000 +M520200111111122685120060615WTTT0BPTP122222122222 0422071 0000 +M42020011111112285820000403951161113 +M520200111111122858119940108WTTTY#WBP12222222222210112121124970000 +M520200111111122858120130113WTTT0TYBW222222122222 0422981 0000 +M42020011111112291821100406001163113 +M520200111111122918119620501WTTTYZZW@12222222222250122112116900000 +M520200111111122918120080108WTTTP#9W@222222222222 0622052 0000 +M520200111111122918120050702WTTT0ZWP0222222222222 0622082 0000 +M42020021111111131822700402801123113 +M520200211111111318119850121WTTT#0W9922212222222230112121124140000 +M520200211111111318120190512WTTT0TW#9222122222222 0422981 0000 +M42020021111111138120900406601163113 +M520200211111111381119870713WTTT0YP9Y12212222222210112131117510000 +M520200211111111381120150715WTTT0@TWW222222222222 0422981 0000 +M42020021111111160121100401691163113 +M520200211111111601119890714WTTT#0@ZT12222222222210112121132410000 +M520200211111111601120160822WTTTP0PZT222222122222 0422981 0000 +M520200211111111601120070815WTTT0@##9122222222222 0422061 0000 +M520200211111111601120060602WTTTYWWW@122222122222 0422071 0000 +M42020021111111160220900403031161113 +M520200211111111602119910701WTTTP0B#Y12222222222210112121117980000 +M520200211111111602219820526WTTT0T9TT22222212222220212113200000000 +M520200211111111602120170101WTTTPPBPB122222222222 0422981 0000 +M520200211111111602120140626WTTT0W9ZW122222122222 0422981 0000 +M520200211111111602120110102WTTTPZ#99122222222222 0422021 0000 +M520200211111111602120080819WTTTYZP@@122222122221 0422051 0808 +M42020021111111168322700402231161113 +M520200211111111683119820815WTTTPB#Z@12222122222250112121126250000 +M520200211111111683120070819WTTTP0T9T122221122222 0422061 0000 +M520200211111111683120050501WTTTPWP@T122221222222 0422081 0000 +M42020021111111170122700400681161113 +M520200211111111701119780601WTTT#WT#@22212222222210112122124890500 +M520200211111111701120180603WTTT##WWB222222222222 0422981 0000 +M520200211111111701120020115WTTT0PT@T222122122222 0422112 0000 +M42020021111111178021100406001163113 +M520200211111111780119880813WTTT090PT12222222222230112121110830000 +M520200211111111780120170101WTTT#9#TY122222122222 0422981 0000 +M520200211111111780120090123WTTTPPWT#122222222222 0422042 0000 +M42020021111111183622700400441161113 +M520200211111111836119860626WTTT#0T#P22222122222210112111116250000 +M520200211111111836120150515WTTTPZP@9222221222222 0422981 0000 +M520200211111111836120100815WTTT0ZZ@9222222122221 0422031 0885 +M520200211111111836120060715WTTT#YZY#222221122222 0422071 0000 +M42020021111111190321400400161161113 +M520200211111111903119820609WTTT#090022222122222210112111115060000 +M520200211111111903120160715WTTT##0P0222221122222 0422981 0425 +M520200211111111903120110818WTTTY0ZW9222221122222 0422021 0425 +M520200211111111903120040516WTTTY0ZT0222221122222 0422091 0000 +M42020021111111196720000400171163113 +M520200211111111967119810703WTTT#PBZ022212222222210112111123240000 +M520200211111111967120140522WTTT0#TPB222122222222 0422981 0000 +M520200211111111967120080115WTTT#9T9#222122222222 0422051 0000 +M520200211111111967120030101WTTTYTBWZ222122122222 0422101 0000 +M42020021111111197322700402001163113 +M520200211111111973119890806WTTTYZW#Y22212222222210112111120360000 +M520200211111111973120120112WTTTYZYWZ222122222222 0422011 0000 +M520200211111111973120090115WTTT#Y90W222122222222 0422041 0000 +M42020021111111208021700406571163113 +M520200211111112080119790816WTTTYPB@@22222122222220212142116250000 +M520200211111112080119770718WTTTP@PPY22222112222220112122122180000 +M520200211111112080120050708WTTT##BTY222221222222 0422082 0000 +M520200211111112080120030701WTTT090#Z222221122222 0422102 0000 +M42020021111111214420900403071161113 +M520200211111112144119780126WTTTPTP@@22222222222210112122113190000 +M520200211111112144120160114WTTTYBB@W222222222222 0422981 0000 +M520200211111112144120040621WTTTYWB#B222222122222 0422091 0000 +M520200211111112144120020115WTTTP9W9Z222222122222 0422111 0000 +M42020021111111234820000400921993113 +M520200211111112348119730106WTTT0WBPW22212222222210112081116410000 +M520200211111112348120110619WTTT#B@0@222122122222 0422021 0000 +M42020021111111235720900403071192113 +M520200211111112357119900106WTTTP09B022212222222210112121125750000 +M520200211111112357120130606WTTT#TWYY222122222222 0422981 0000 +M42020021111111236621100406001163113 +M520200211111112366119810118WTTT##PB912222222222210112112121290000 +M520200211111112366120190508WTTTPTZ0P122222122222 0422981 0000 +M520200211111112366120110103WTTTPY@T@122222122222 0422022 0000 +M42020021111111259620600405171163113 +M520200211111112596119880102WTTT09P0T12222222222210112111113790000 +M520200211111112596120160618WTTT#P#PB222222222222 0422981 0000 +M520200211111112596120160618WTTTY#0TT222222122221 0422981 0921 +M520200211111112596120130801WTTT00YTY222222222222 0422981 0000 +M520200211111112596120090507WTTTPZPB#122222222222 0422041 0000 +M520200211111112596120040619WTTTY9#@0122222222222 0422091 0000 +M42020021111111269320600401421163113 +M520200211111112693119900119WTTTYWW##22212222222210112121121460000 +M520200211111112693120160701WTTT09@P#222122122222 0422981 0000 +M520200211111112693120100719WTTT0B@ZB222122222222 0422031 0000 +M42020021111111270420000403951163113 +M520200211111112704119770101WTTT#T0@912222122222210112122127290000 +M520200211111112704120170618WTTTYZ0T@122222222222 0422981 0000 +M520200211111112704120090103WTTT0#990222122222222 0422041 0000 +M520200211111112704120030123WTTT#B#T@222221222222 0422102 0000 +M42020021111111283320000403951163113 +M520200211111112833119930112WTTT#WYWY22222122222210112111118240000 +M520200211111112833120150614WTTTY@TTT222221122222 0422981 0000 +M42020021111111294421400400351163113 +M520200211111112944119820109WTTTP@WW022222222222220112112120800000 +M520200211111112944120150719WTTT0PZP0222222222222 0422981 0000 +M520200211111112944120080526WTTT#T@09222222122222 0422053 0000 +M520200211111112944120040115WTTT#00@P222122122222 0422093 0000 +M42020021111111327822200403201163113 +M520200211111113278119900106WTTTYTB#@22212222222210112121100000000 +M520200211111113278120170108WTTT#Z0BP222122222222 0422981 0000 +M520200211111113278120130815WTTTP9#T9222122222222 0422981 0000 +M42020021111111330621100401181011113 +M520200211111113306119890106WTTT00T0#12222222222210112121129690000 +M520200211111113306120140615WTTT#99T9122222122222 0422981 0000 +M520200211111113306120080523WTTTP@0WP122222122222 0422051 0000 +M42020021111111348921100401561163113 +M520200211111113489119810521WTTTPZ@W#22222122222230112121100000000 +M520200211111113489120100501WTTT#ZTB#222221222222 0422031 0000 +M520200211111113489120061107WTTT#@PWZ222221222222 0422071 0000 +M42020021111111357420600402031162113 +M520200211111113574119910721WTTT0#WWT11111122222210112121117550000 +M520200211111113574120160119WTTTPTWYZ122222222222 0422981 0000 +M42020021111111366821700406831163113 +M520200211111113668119810619WTTT#90@Z12222222222210112111119660000 +M520200211111113668120040123WTTTY@0#W122222222222 0422091 0000 +M520200211111113668120040123WTTTYYYY9122222222222 0422091 0000 +M42020021111111386421200402561013113 +M520200211111113864119890114WTTTPW#0T12222222222210112121118460000 +M520200211111113864120140619WTTT#0W@Y222221122222 0422981 0000 +M520200211111113864120080801WTTTPBY99122222222222 0422051 0000 +M42020021111111397521100404791162113 +M520200211111113975119800507WTTT#00P@12222222222250112111123400000 +M520200211111113975120100715WTTT0TZWP122222222222 0422031 0000 +M42020021111111398022700402531163113 +M520200211111113980119710502WTTTPY#TP22222122222210112121124700000 +M520200211111113980120060519WTTT#9@@0122222222222 0422071 0096 +M520200211111113980120050101WTTTP#TBB222221222222 0422081 0096 +M42020021111111438120500402421161113 +M520200211111114381119720701WTTT#WZ#T22222122222250112121115860000 +M520200211111114381120110802WTTTP@ZY0222221222222 0422021 0000 +M42020021111111447021700405281993113 +M520200211111114470119970601WTTT0TT@Y22222122222210112121115900000 +M520200211111114470120180126WTTTPWTP0222221222222 0422981 0000 +M42020021111111472921100406001162113 +M520200211111114729119841119WTTTPW#ZB12222222222230112121123590000 +M520200211111114729120070102WTTT0B9YP222222122222 0422061 0000 +M520200211111114729120051116WTTT#ZZ#Z122222222222 0422081 0000 +M42020021111111501221200402291162113 +M520200211111115012119870821WTTT0Y0PB12222222222210112112114640000 +M520200211111115012120150606WTTT0ZWBP122222122222 0422981 0000 +M520200211111115012120090814WTTT0@YB@122222122222 0422042 0000 +M42020021111111510721700403151163113 +M520200211111115107119790714WTTT0#9@912222122222210112121130670000 +M520200211111115107120141115WTTTYY#BP122221222222 0422981 0000 +M520200211111115107120070703WTTTY0YB@122221222222 0422061 0000 +M42020021111111516520600406321163113 +M520200211111115165119880507WTTT0T9TY12222222222210112121125670000 +M520200211111115165120140123WTTTYW#ZP122222122222 0422981 0000 +M520200211111115165120090123WTTTP0ZT@122222222221 0422041 0645 +M42020021111111529820000403951163113 +M520200211111115298119840702WTTT0YZTZ12222222222210112121114300450 +M520200211111115298120170706WTTTPB0#T122222122222 0422981 0000 +M520200211111115298120170706WTTTY9PZ#122222122222 0422981 0000 +M520200211111115298120070707WTTTP90WB122222122222 0422061 0000 +M42020021111111561220900400501161113 +M520200211111115612119930114WTTT#ZPWB12212222222210112111111770000 +M520200211111115612120170126WTTTPB@WW122222122222 0422981 0000 +M520200211111115612120150101WTTT#W#TP122222222222 0422981 0000 +M42020021111111601021400401841163113 +M520200211111116010119880114WTTTYT@TY22222122222250112121121710000 +M520200211111116010120130126WTTTYZPW#222221122222 0422981 0000 +M520200211111116010120110801WTTTYB9PZ222221122221 0422021 0158 +M42020021111111610821100405141163113 +M520200211111116108119820808WTTT0P@WW22222122222230112141122310000 +M520200211111116108120180119WTTTY#ZYW222221222222 0422981 0000 +M520200211111116108120140102WTTTPZP@P222222222222 0422981 0000 +M520200211111116108120080516WTTT0#@@B222222222222 0422051 0000 +M42020021111111664520900406601013113 +M520200211111116645119870621WTTTP#YT012222222222210112111128140000 +M520200211111116645120160119WTTTY00Y@222222222222 0422981 0000 +M42020021111111676321100406001163113 +M520200211111116763119870703WTTTY0YT#12222222222220112081124070000 +M520200211111116763119820601WTTTP@TYB12222212222220212121114080000 +M520200211111116763120150606WTTTYTT99122222122222 0422981 0000 +M520200211111116763120111115WTTTYZ0W@122222122222 0422021 0000 +M520200211111116763120090123WTTT09@@Y122222222222 0422041 0000 +M42020021111111742721700404181161113 +M520200211111117427119870619WTTTP@9#P22222122222210112121117160000 +M520200211111117427120090606WTTTPZWB#222221122222 0422041 0000 +M520200211111117427120040116WTTTYB9Y9122222122222 0422091 0000 +M42020021111111763320000404071162113 +M520200211111117633119921106WTTT0B#B022212222222210112081128560000 +M520200211111117633120131107WTTTPBT9Z222122222222 0422981 0000 +M520200211111117633120100102WTTT0P0ZP222222122222 0422031 0000 +M42020021111111786820900401231163113 +M520200211111117868119980119WTTTYY9TT11222122222210112081114030000 +M520200211111117868120161107WTTT0P09T112222122222 0422981 0000 +M42020021111111786921700404611161113 +M520200211111117869119890121WTTTYTPBZ22222122222210112121118170000 +M520200211111117869120130122WTTTPP#0#222222122221 0422981 0897 +M42020021111111790420000403951161113 +M520200211111117904119800118WTTTYTZ0T12222122222210112121100000000 +M520200211111117904120160119WTTT0T0YT122221222222 0422981 0000 +M520200211111117904120110606WTTTPBWWW122222222222 0422021 0000 +M520200211111117904120080822WTTT#TB9Y122221122222 0422051 0000 +M42020021111111799820600402121163113 +M520200211111117998119960721WTTT00ZWT22222122222210112081116270000 +M520200211111117998120170101WTTTPY0BP222221222222 0422981 0000 +M42020021111111800821700402701163113 +M520200211111118008119800501WTTTYZ0YW22222122222210112121125430000 +M520200211111118008120170612WTTT0W#TB222221122222 0422981 0000 +M520200211111118008120150816WTTT0@P0@222222122222 0422981 0000 +M520200211111118008120140509WTTT#PZPP222222222222 0422981 0000 +M520200211111118008120120823WTTT#Y99Z222222222222 0422011 0000 +M520200211111118008120110719WTTT0@09Y222222222222 0422021 0000 +M520200211111118008120100602WTTTPZBYW222221122222 0422031 0000 +M520200211111118008120080118WTTT0Y0WY222221122222 0422051 0000 +M520200211111118008120070112WTTTYZ099222221122222 0422061 0000 +M42020021111111802420600405341163113 +M520200211111118024119860126WTTTY#PYW22122222222220112082116290000 +M520200211111118024120170719WTTTYWZZB222222222222 0422981 0000 +M520200211111118024120110615WTTT#@BZB222222122222 0422021 0000 +M520200211111118024120090123WTTTY9YZT222222222222 0422041 0000 +M42020021111111804420600401981161113 +M520200211111118044119770119WTTT#YYYZ12222212222211012111235350000 +M520200211111118044119750608WTTT09YYT12222222222210112121200000000 +M520200211111118044120040114WTTTPY@W#122222222222 0422091 0000 +M42020021111111830321700404401161113 +M520200211111118303119790612WTTTP@#0T22212222222210112121124220000 +M520200211111118303120160701WTTT#YZ0P222122122222 0422981 0000 +M520200211111118303120140621WTTT0P#ZB222122122222 0422981 0000 +M520200211111118303120040106WTTTYT#P9222122222222 0422091 0000 +M42020021111111837621700406571162113 +M520200211111118376119780701WTTTPY9TW12222222222210112131128050000 +M520200211111118376120120813WTTTP0PWY122222222222 0422011 0000 +M520200211111118376120050726WTTT#T9T@122222222222 0422081 0000 +M42020021111111843821700400981993113 +M520200211111118438119740519WTTTPYTBB12222122222210112121117270000 +M520200211111118438120030606WTTT0B@TY122221122222 0422101 0000 +M42020021111111844720900403071162113 +M520200211111118447119890101WTTTPZB@T12222222222210112121124870000 +M520200211111118447120130618WTTTPZTTW122221222222 0422981 0000 +M520200211111118447120070113WTTTPT@TB122222222222 0422061 0000 +M42020021111111867720900403031163113 +M520200211111118677119840521WTTTPPW#@22212122222210112121132130000 +M520200211111118677120170715WTTTPWT0#222122122222 0422981 0000 +M520200211111118677120090115WTTT#YB@P222121222222 0422041 0000 +M42020021111111875920000403951013113 +M520200211111118759119990119WTTTPYBY@12222122222210112981124860000 +M520200211111118759120190515WTTT0ZP@B122221222222 0422981 0000 +M42020021111111876022200402941163113 +M520200211111118760119810621WTTTY99B@21222222222220112121132370000 +M520200211111118760119810503WTTT#Z9WY22212212222210212121131830000 +M520200211111118760120190801WTTTY@009212122122222 0422981 0000 +M520200211111118760120190801WTTT#BWBP212122122222 0422981 0000 +M520200211111118760120180107WTTTY@T90212122122222 0422981 0000 +M520200211111118760120110108WTTT0TBPZ212122122222 0422021 0000 +M520200211111118760120090615WTTT#@B99212122122222 0422041 0000 +M520200211111118760120021126WTTT#TT9B212122122222 0522111 0000 +M42020021111111877321100406541163113 +M520200211111118773119771119WTTTP@@P#12222222222210112141116560000 +M520200211111118773120170112WTTTP@WZY122222122222 0422981 0000 +M520200211111118773120090526WTTTP99#9122222222222 0422041 0000 +M42020021111111892320600406381163113 +M520200211111118923119990107WTTT##BW022222122222210112121113700000 +M520200211111118923120180618WTTTPTPWP222221122222 0422981 0000 +M42020021111111896121400400351163113 +M520200211111118961119911101WTTTY@@#@22212222222210112112126190000 +M520200211111118961120130609WTTTYTP9P222122122222 0422981 0000 +M42020021111111919521400403651163113 +M520200211111119195119880606WTTT0YT@W22222122222210112131126260000 +M520200211111119195120080608WTTTYYZYT222221122222 0422051 0000 +M42020021111111924220600401421013113 +M520200211111119242119770122WTTT#PZYW12222222222210112111126170000 +M520200211111119242120130115WTTTYTPZ0222222222222 0422981 0000 +M42020021111111928422700400671163113 +M520200211111119284119930814WTTT0ZYBW22222122222210112121122640000 +M520200211111119284120120101WTTT#TB0@122222122222 0422011 0000 +M42020021111111930020600405471162113 +M520200211111119300119840126WTTTY9@P#12222222222210112111128440000 +M520200211111119300120090606WTTT#B@Y9222222122222 0422041 0000 +M520200211111119300120050826WTTTP@PWB222222222222 0422081 0000 +M520200211111119300120030115WTTT#9##Y222222222222 0422101 0000 +M42020021111111932421100402161163113 +M520200211111119324119860623WTTTBTZ@W22222122222210112121123570000 +M520200211111119324120160615WTTT0ZPBT222222222222 0422981 0000 +M520200211111119324120090523WTTT#WBP0222222122222 0422041 0000 +M520200211111119324120050113WTTTYTZT9122222122222 0422081 0000 +M42020021111111938721400400351163113 +M520200211111119387119790626WTTTPBY0W22212222222210112111126070000 +M520200211111119387120020114WTTT#WYY@222122222222 0422112 0000 +M42020021111111945220900402921163113 +M520200211111119452119860115WTTTP0W9W22212222222210112111127730000 +M520200211111119452120180714WTTT0@PP@222222222222 0422981 0000 +M520200211111119452120110623WTTT0ZW0@222122222222 0422021 0000 +M520200211111119452120081115WTTTPW@TY222122122222 0422051 0000 +M42020021111111950622400400231161113 +M520200211111119506119840701WTTT0PWPP22222222222210112121127360000 +M520200211111119506120180621WTTTY#WYZ122222122222 0422981 0000 +M520200211111119506120150101WTTT#P00Y222222222222 0422981 0000 +M42020021111111977020900401881161113 +M520200211111119770119810113WTTT#BZ#@12222222222210112121116030000 +M520200211111119770120140121WTTTP@BZT122222222222 0422981 0000 +M520200211111119770120120602WTTTPZP0@122222222222 0422011 0000 +M42020021111111987221400400351162113 +M520200211111119872119910626WTTTP9#9P22222122222210112111123470425 +M520200211111119872120150126WTTTY9WWY122221222222 0422981 0000 +M520200211111119872120070621WTTT#99Y0122221122222 0422061 0000 +M42020021111112009720900402921163113 +M520200211111120097119860706WTTTY#Z@#22212222222210112121121780000 +M520200211111120097120110814WTTT#9W@@222122122222 0422021 0000 +M520200211111120097120020106WTTTYW@P0222122222222 0422111 0000 +M42020021111112020720000403951163113 +M520200211111120207119911102WTTT#B09022222122222220112111124520000 +M520200211111120207120150126WTTT#W0WY122222122222 0422981 0000 +M520200211111120207120100119WTTTPYTTP222221222222 0422031 0000 +M42020021111112043120300403001163113 +M520200211111120431219850602WTTT#Y0ZY22222222222220212113200000000 +M520200211111120431119780118WTTT##0W#22222112222210112111116490000 +M520200211111120431120190601WTTTP#ZTT222221122222 0422981 0000 +M520200211111120431120170601WTTTYP#09222222122222 0422981 0000 +M42020021111112062421100401181163113 +M520200211111120624119670702WTTTY@W#Y22212222222230112111130450000 +M520200211111120624120080121WTTT##PBB222122222222 0422051 0000 +M520200211111120624120050501WTTTP99PW222122222222 0422081 0000 +M42020021111112068320900403031163113 +M520200211111120683119740601WTTT#@TTY22212212222210112111126910000 +M520200211111120683120110507WTTTPBTWT222122122222 0422021 0000 +M42020021111112080720900406421161113 +M520200211111120807119860107WTTTYZYZY22212222222210112111114330000 +M520200211111120807120180706WTTT#ZZ9W222222122222 0422981 0000 +M520200211111120807120141119WTTTPP#W0222122222222 0422981 0000 +M520200211111120807120120515WTTTPTZBP222122222222 0422011 0000 +M520200211111120807120120515WTTT0WP@0222122222222 0422011 0000 +M520200211111120807120090614WTTTP@W0B222122222222 0422041 0000 +M520200211111120807120060615WTTTP#0@0222122222222 0422071 0000 +M42020021111112104621100401181013113 +M520200211111121046119950102WTTTPZZB912222222222210112081114520000 +M520200211111121046120140601WTTT0PBZY122222122222 0422981 0000 +M42020021111112116420600402201163113 +M520200211111121164119900101WTTT0YP9@22222122222210112111112350000 +M520200211111121164120150706WTTTPYZBT222222122222 0422981 0000 +M520200211111121164120090515WTTT##@BY222221122222 0422041 0000 +M42020021111112156722700400671161113 +M520200211111121567119900522WTTT#BB0@22222122222210112121117680000 +M520200211111121567120140823WTTTYZW0P222221222222 0422981 0000 +M42020021111112191921400400351161113 +M520200211111121919119750601WTTTYY0ZZ22222222222210112111128580000 +M520200211111121919120100601WTTT#00ZW222222222222 0422031 0000 +M520200211111121919120090603WTTT#0TWY222222222222 0422041 0000 +M520200211111121919120070121WTTT#YZ0Z222222222222 0422061 0000 +M42020021111112198820600401981163113 +M520200211111121988119900715WTTT09T0912222222222210112121117690000 +M520200211111121988120180726WTTTY#YP@122222222222 0422981 0000 +M520200211111121988120150702WTTTYPB@0122222122222 0422981 0000 +M520200211111121988120130818WTTT0BB#Y122221122222 0422981 0000 +M520200211111121988120120515WTTT0WB9B222222122222 0422011 0000 +M520200211111121988120080113WTTT#ZP9@122222222222 0422051 0000 +M42020021111112199320600405341163113 +M520200211111121993119770522WTTTYTBB922222122222210112121129270000 +M520200211111121993120160121WTTTP0Z@W222222222222 0422981 0057 +M520200211111121993120080606WTTTYPYPB222222222222 0422051 0057 +M520200211111121993120050106WTTT0PYT9122222122222 0422081 0057 +M520200211111121993120030726WTTT#@@0P222222122222 0422101 0057 +M42020021111112217321100401181013113 +M520200211111122173119930115WTTTPT9#Z12222122222230112131121300000 +M520200211111122173120151106WTTT#Y@0Z122222222222 0422981 0000 +M42020021111112235420000405601163113 +M520200211111122354119930701WTTT#P9@P22222122222210112121120190000 +M520200211111122354120170626WTTT0TWTZ222221222222 0422981 0000 +M42020021111112239421100401461161113 +M520200211111122394119760601WTTT0BPPW22222122222220112121115700000 +M520200211111122394120160106WTTT09BPB222221122222 0422981 0000 +M520200211111122394120120707WTTT#P#0T222221122222 0422011 0000 +M520200211111122394120100708WTTT#Y@W@222221122222 0422031 0000 +M42020021111112263721700406341163113 +M520200211111122637119980119WTTTYP#@Y11222222222210112131115170150 +M520200211111122637120180115WTTT#WWT@122221122222 0422981 0000 +M42020021111112286522700403941011113 +M520200211111122865119910508WTTTY0YBT12222222222210112111100000000 +M520200211111122865120191106WTTTPTYYT222222122222 0422981 0000 +M520200211111122865120130106WTTTYB0#Z122122222222 0422981 0000 +M42020021111112299220900402921163113 +M520200211111122992119940526WTTTY9Z@022212222222210112121118120000 +M520200211111122992120160621WTTT#BYWP222122222222 0422981 0000 +M42020031111111124820600400871162113 +M520200311111111248119960514WTTTYZY@Z12222222222210112121129620000 +M520200311111111248120180103WTTTY@PTW122221222222 0422981 0000 +M520200311111111248120150626WTTT09T0Y122222122222 0422981 0000 +M42020031111111144021200404691163113 +M520200311111111440119770123WTTT#WW@#12222222222210112121117410000 +M520200311111111440120020714WTTT#PP#Y122222222222 0422111 0426 +M42020031111111153221700402341161113 +M520200311111111532119910801WTTTPZBZ#12222222222210112121125720000 +M520200311111111532120170615WTTT090@Y222222222222 0422981 0000 +M520200311111111532120130601WTTT#0@YP222221122222 0422981 0000 +M520200311111111532120100121WTTTP@T9W122222122222 0422031 0000 +M42020031111111179821100406001163113 +M520200311111111798119920115WTTTPYWT912222222222220112121115480000 +M520200311111111798120140122WTTT#B9ZZ222222122222 0422981 0000 +M520200311111111798120110512WTTTY99PZ122222222222 0422021 0000 +M520200311111111798120100602WTTT09W9T222222122222 0422031 0000 +M520200311111111798120070102WTTTPPB#P222222222222 0422061 0000 +M42020031111111197121400400351013113 +M520200311111111971119890101WTTTYTP0T22212222222210112121126190000 +M520200311111111971120130101WTTTPYBZB222222222222 0422981 0000 +M42020031111111227220900405911011113 +M520200311111112272119930121WTTTYZP@Y22212222222210112121116160000 +M520200311111112272120140515WTTT#TB#Z222222222222 0422981 0000 +M42020031111111241521700402381163113 +M520200311111112415119810701WTTTYTWBY22222122222210112141129460000 +M520200311111112415120110102WTTTYZ09B222221122222 0422021 0000 +M520200311111112415120060612WTTT0YPYT222221222222 0422071 0000 +M520200311111112415120030606WTTTYZPYY222221122222 0422101 0000 +M42020031111111293922700400671163113 +M520200311111112939119960619WTTTPT#Z@22222122222210112121119550000 +M520200311111112939120150522WTTT#WYB@222221222222 0422981 0000 +M42020031111111313220900404421163113 +M520200311111113132219780515WTTT#ZW9Y22212222222220112113200000000 +M520200311111113132119620118WTTTPZTZ#22212212222220212111122120000 +M520200311111113132120190515WTTT#PY#Y222122222222 0422981 0000 +M520200311111113132120170501WTTTYZ990222122122222 0422981 0000 +M520200311111113132120141103WTTTPWPT9222122122222 0422981 0000 +M520200311111113132120120815WTTT#W#TY222122122222 0422011 0000 +M42020031111111331420000406821163113 +M520200311111113314119810621WTTT0WP0P12222122222230112111121890000 +M520200311111113314120120723WTTT#PWZB122221122222 0422011 0000 +M520200311111113314120080615WTTT0BW09122221222222 0422051 0000 +M42020031111111359021100403821163113 +M520200311111113590119870501WTTT#Z@ZZ22212222222210112161123710000 +M520200311111113590120110714WTTT0TZ0B222222222222 0422021 0000 +M520200311111113590120060101WTTTYY#W#222122222222 0422071 0000 +M42020031111111372820900405131011113 +M520200311111113728119950109WTTTY0ZZT22212222222210112081128000000 +M520200311111113728120180821WTTTP@YYP222122222222 0422981 0000 +M520200311111113728120150701WTTTPW#YZ222122222222 0422981 0000 +M42020031111111400220900401031162113 +M520200311111114002119700821WTTT0WB@P22212222222210112111129370000 +M520200311111114002120080106WTTTY9B9Y222122222222 0422051 0000 +M520200311111114002120030819WTTTP@TYT222122222222 0422101 0000 +M42020031111111407222700402581163113 +M520200311111114072119890515WTTT0T@0922222122222210112121122730000 +M520200311111114072119830615WTTTP@9ZB22222112222211012121116670000 +M520200311111114072120120618WTTT0WWTT222222122222 0422011 0000 +M520200311111114072120060122WTTT#W0B9222221122222 0422081 0000 +M42020031111111413120000406281163113 +M520200311111114131119880615WTTT#WYP022222122222210112131121130000 +M520200311111114131120150721WTTT0#P0@222222122222 0422981 0000 +M520200311111114131120060701WTTTPPBTP222221222222 0422071 0000 +M42020031111111414122700402231163113 +M520200311111114141119940606WTTTP#YT921222122222210112121118840000 +M520200311111114141120180615WTTTP#YPW222221122222 0422981 0000 +M42020031111111422922700403941993113 +M520200311111114229119890621WTTTPYBB022222122222210112111122440000 +M520200311111114229120180119WTTT#0W0@222221122222 0422981 0000 +M42020031111111440821400400351162113 +M520200311111114408119900521WTTTP9@PP22222122222210112111118320000 +M520200311111114408120180101WTTT0WPWY222222122222 0422981 0000 +M42020031111111473521100404791161113 +M520200311111114735119830715WTTTYTB@@22222122222210112121115620000 +M520200311111114735120150107WTTT#099Z222221122222 0422981 0000 +M520200311111114735120120521WTTTY@9#T222221122222 0422011 0000 +M520200311111114735120050608WTTTYBZ99222221222222 0422081 0076 +M42020031111111476520600400291163113 +M520200311111114765119970101WTTTP@TBY12222122222210112121122640000 +M520200311111114765120180703WTTTPBZYP122221122222 0422981 0000 +M42020031111111482821400400351163113 +M520200311111114828119730515WTTTPYYYZ22212222222230112111123660000 +M520200311111114828120121113WTTT#TZW0222221222222 0422011 0000 +M520200311111114828120110723WTTTPZTBT222221122222 0422021 0000 +M42020031111111494820900406421162113 +M520200311111114948119781119WTTT0Z9@922212222222210122121124170000 +M520200311111114948120020108WTTTPW@Z@222122222222 0422121 0000 +M42020031111111526021100406001163113 +M520200311111115260119780626WTTT#@YWT12222222222210112111123510000 +M520200311111115260120160106WTTT0YP9W122222222222 0422981 0000 +M520200311111115260120130609WTTTY#PY@122222222222 0422981 0000 +M42020031111111545921100401181993113 +M520200311111115459119930101WTTT#009T12222122222210112081127180000 +M520200311111115459120190508WTTT#YW@Z122221222222 0422981 0000 +M42020031111111546420600405341163113 +M520200311111115464119940709WTTTPPTW012222222222210112121122530000 +M520200311111115464120170123WTTTPTZWP122221122222 0422981 0000 +M520200311111115464120130515WTTT0T@P0122222122222 0422981 0000 +M42020031111111554222700400671163113 +M520200311111115542119870806WTTT0B9TT22212212222230112112124570000 +M520200311111115542120130615WTTT#Y@YT222222122222 0422981 0000 +M520200311111115542120110719WTTTY9@9Y222222222222 0422021 0000 +M42020031111111564121100402441162113 +M520200311111115641119750109WTTT0Y0YB12222122222210112111119990000 +M520200311111115641120150512WTTT0BWZ@122221222222 0422981 0000 +M520200311111115641120110701WTTTY#P0Z122221122222 0422021 0000 +M520200311111115641120041101WTTTYWWB@122221122222 0422091 0000 +M42020031111111566420000402281162113 +M520200311111115664119860608WTTTYB00@12222222222210112121119230000 +M520200311111115664120090521WTTTP#YB0122222122222 0422041 0000 +M42020031111111577320600401981013113 +M520200311111115773119760115WTTT0@W0T12222222222210122111130290000 +M520200311111115773120040502WTTTYYZ@B122222222222 0422091 0000 +M42020031111111590521700404101163113 +M520200311111115905119890521WTTTY9PBP22122222222210112111133120000 +M520200311111115905120130119WTTTP0@#0221222122222 0422981 0000 +M520200311111115905120110523WTTT0BYY0221222222222 0422021 0000 +M520200311111115905120080118WTTT0YY@P221222222222 0422051 0000 +M520200311111115905120070621WTTTPZ9ZT221222122222 0422061 0000 +M42020031111111595020900402921993113 +M520200311111115950219770726WTTT0#PBZ12222222222220112113200000000 +M520200311111115950119670106WTTT0PB9Y22222212222220212112100000339 +M520200311111115950120180101WTTT#09B#222222122222 0422981 0000 +M520200311111115950120140823WTTT0BBP#222222222222 0422981 0000 +M520200311111115950120020607WTTTY0BTB222222222222 0422113 0000 +M42020031111111616220500402421163113 +M520200311111116162119900601WTTTPW0B912222122222210112122117370000 +M520200311111116162120171121WTTT00WP0122221122222 0422981 0000 +M520200311111116162120160615WTTTY9PW0122221122222 0422981 0000 +M520200311111116162120070721WTTT09T@9122221122222 0422061 0000 +M42020031111111618322700400671162113 +M520200311111116183119870821WTTT#9YYP22222122222210112121115270000 +M520200311111116183120150806WTTTYTBPW222222122222 0422981 0000 +M520200311111116183120080119WTTT###ZP222222222222 0422051 0000 +M42020031111111628120600400291013113 +M520200311111116281119880801WTTTBTT0022222122222220112111200000000 +M520200311111116281119820106WTTT#0#TP22222112222210212111274100000 +M520200311111116281120180106WTTTP999B222221222222 0422981 0000 +M520200311111116281120160623WTTT#9PP#222221222222 0422981 0000 +M520200311111116281120140116WTTT0#ZPW222222222222 0422981 0000 +M42020031111111630622400404241161113 +M520200311111116306119850601WTTTPY@W022212222222210112121115310000 +M520200311111116306120170119WTTT0@0TY222222222222 0422981 0000 +M520200311111116306120030601WTTTPYZWY222122122222 0422101 0000 +M42020031111111643220900402921161113 +M520200311111116432119830503WTTT0YZYY12222222222210112111127770000 +M520200311111116432120130615WTTTYZ@9W122222222222 0422981 0000 +M520200311111116432120040113WTTTPB#0W122222222222 0422091 0000 +M520200311111116432120030603WTTTP09#Y122222222221 0422101 0711 +M42020031111111651522700402801163113 +M520200311111116515119770606WTTTBTZTP22222222222210112112120780000 +M520200311111116515120080102WTTTBT9ZW222222222222 0422051 0000 +M42020031111111652421100401551993113 +M520200311111116524119971109WTTT#9ZBW12222222222210112111119220000 +M520200311111116524120180121WTTT#Z@0P222222222222 0422981 0000 +M42020031111111653821700402341163113 +M520200311111116538119880119WTTTYPPZ022222222222220112121139140000 +M520200311111116538120170826WTTTPT90T222222122222 0422981 0000 +M520200311111116538120100615WTTTY9B0P222222222222 0422031 0000 +M520200311111116538120060518WTTT#@ZB9222222122222 0422081 0000 +M42020031111111655321400400351163113 +M520200311111116553119750607WTTTYB99@22212222222230112112120100000 +M520200311111116553120091116WTTTYYT0T222122222222 0422041 0000 +M520200311111116553120030501WTTTY0BZ#222122222222 0422102 0000 +M42020031111111662821700402341993113 +M520200311111116628119900722WTTTPBP9922222122222210112121114010000 +M520200311111116628120170602WTTT0P0T@222221122222 0422981 0000 +M520200311111116628120150702WTTTP0B0T222222222222 0422981 0000 +M520200311111116628120080123WTTT#Z0@0222221122221 0422051 0897 +M42020031111111667720600401421162113 +M520200311111116677119830718WTTTY9YYW12222222222230112121118240000 +M520200311111116677120141102WTTTYP@0W122222222222 0422981 0000 +M520200311111116677120030622WTTT0WP@@122221222222 0422101 0000 +M42020031111111721821100401181163113 +M520200311111117218119920123WTTTPP@YT12222222222210112121119670000 +M520200311111117218120140114WTTTYPP9W122222222222 0422981 0000 +M42020031111111722022200400911163113 +M520200311111117220119700101WTTTPT#PP22222122222210112161159440000 +M520200311111117220120100721WTTT0Z0Y0222121122222 0422031 0000 +M520200311111117220120060121WTTTY@#WP222121222222 0422081 0000 +M42020031111111728721700401121161113 +M520200311111117287119930103WTTT0Y@@012222122222210112121113840000 +M520200311111117287120170626WTTTYPYPP122221222222 0422981 0000 +M520200311111117287120140621WTTT#00TT122222122222 0422981 0000 +M42020031111111734320900402921161113 +M520200311111117343119860507WTTTYYT#B12222222222210112111131390000 +M520200311111117343120180801WTTT#P0#@122222222222 0422981 0000 +M520200311111117343120080806WTTTP9PT@122222122222 0422051 0000 +M520200311111117343120070102WTTTY#BZ0222122222222 0422061 0000 +M42020031111111735020000404071163113 +M520200311111117350119980823WTTT0BWWB22222222222210112111121580250 +M520200311111117350120150121WTTTPB09W222222222222 0422981 0000 +M42020031111111749820600402121161113 +M520200311111117498119940806WTTTP#Y#Y22222122222210112111109620000 +M520200311111117498120180108WTTT0@P9B222222222222 0422981 0000 +M520200311111117498120150801WTTT#T@#Z222221122222 0422981 0000 +M520200311111117498120110106WTTT090TZ222222122222 0422021 0000 +M42020031111111764721400400931163113 +M520200311111117647119890612WTTT#B0WZ22222122222230112131121550000 +M520200311111117647120170707WTTTPB9WB222222122222 0422981 0000 +M520200311111117647120110601WTTT00WWW222221222222 0422021 0000 +M42020031111111782220000401371162113 +M520200311111117822119820723WTTT#Y@PB22212222222220212131122650000 +M520200311111117822119690623WTTT0@YYY22212212222220122121200000600 +M520200311111117822120030519WTTT0##PB222122222222 0522101 0000 +M42020031111111794421400400771193113 +M520200311111117944119860606WTTT0#TB012222122222230112111113730000 +M520200311111117944120160519WTTTY0YB#222221122222 0422981 0000 +M520200311111117944120140512WTTT#WP0Z222221222222 0422981 0000 +M520200311111117944120130109WTTTY@WT9222221122222 0422011 0000 +M42020031111111809521200402291013113 +M520200311111118095119730808WTTT0#@Z022222122222230112111122090000 +M520200311111118095120100813WTTT0#Y9B222221222222 0422031 0000 +M42020031111111816320600405471161113 +M520200311111118163119690506WTTT#TP9#22212222222210112121122130000 +M520200311111118163120120712WTTT0TTYP222122222222 0422011 0000 +M520200311111118163120090113WTTTPPTYY222122122222 0422041 0000 +M42020031111111836620900406601163113 +M520200311111118366119880121WTTT#W#0#22222122222210112111124140000 +M520200311111118366120140606WTTTBTTZ@222222122222 0422981 0000 +M520200311111118366120140606WTTTPY0T9222222122222 0422981 0000 +M520200311111118366120100119WTTT#@BZP222221222222 0422031 0000 +M42020031111111852420900406421993113 +M520200311111118524119580115WTTTP##YY22222212222220222111200000000 +M520200311111118524119560102WTTTP9#BP22212222222210122111234740000 +M520200311111118524120050119WTTTP@#9P222122122222 0622081 0000 +M42020031111111861221700406571161113 +M520200311111118612119760102WTTT0ZT9T12222122222210112122124400000 +M520200311111118612120060709WTTT0PZZT122221122222 0422071 0000 +M42020031111111880421100406001163113 +M520200311111118804119910701WTTT09Y9B12222222222210112121127010000 +M520200311111118804120110123WTTTYBB9#122221222222 0422031 0000 +M520200311111118804120070615WTTT##WBP122222122222 0422061 0000 +M42020031111111912822700403941161113 +M520200311111119128119890616WTTT#BBZ#22212222222210112121118200000 +M520200311111119128120150501WTTT#PT09222222222222 0422981 0000 +M520200311111119128120120512WTTT0P0BB222122222222 0422011 0000 +M42020031111111952122700403611163113 +M520200311111119521119870107WTTT09@P@22222122222210112121115630000 +M520200311111119521120170715WTTTYB9@P222221122222 0422981 0000 +M520200311111119521120090506WTTT0W09@222221122222 0422041 0000 +M520200311111119521120080508WTTT#Y@W#222221122222 0422051 0000 +M42020031111111957421700400471163113 +M520200311111119574119980114WTTTPYB0922222122222210112081114170000 +M520200311111119574120160615WTTT#BTZ9212111222222 0422981 0000 +M42020031111111965920000404271161113 +M520200311111119659119760115WTTT000BZ22222122222210112111119940000 +M520200311111119659120080702WTTT0#Z9B222122122222 0422051 0000 +M42020031111111981120600402031161113 +M520200311111119811119950526WTTTY#PPP22222122222210112111116650000 +M520200311111119811120170823WTTT#PBWY122221222222 0422981 0000 +M520200311111119811120150112WTTTPPYT9122222122222 0422981 0083 +M42020031111112012821100403821163113 +M520200311111120128119910716WTTTYZYPT12222222222210112111118330000 +M520200311111120128120150718WTTT0TY99122222122222 0422981 0000 +M42020031111112014421400406791163113 +M520200311111120144119920523WTTT#WP0022222122222210112121115550000 +M520200311111120144120160123WTTT00T#0222222122222 0422981 0000 +M42020031111112044321700405671163113 +M520200311111120443119660719WTTTPZ9T922222122222250112111117020000 +M520200311111120443120030109WTTT#B@9T222221222222 0422101 1038 +M42020031111112051020600401161163113 +M520200311111120510119870515WTTT#9ZWT22222122222250112121130360000 +M520200311111120510120170713WTTT0@90B222222122222 0422981 0000 +M520200311111120510120140602WTTTYB##Y222221122222 0422981 0000 +M520200311111120510120100108WTTTP0Y#0222121122222 0422031 0000 +M42020031111112096720600405471161113 +M520200311111120967119750102WTTTYTZZZ22212222222230112111116890000 +M520200311111120967120130716WTTTYBPB#222122222222 0422981 0000 +M42020031111112100620900403071161113 +M520200311111121006119860702WTTT0PT#W12222222222210112121130040000 +M520200311111121006120120503WTTT#9Z@#122122122222 0422021 0000 +M520200311111121006120040101WTTT#TWTB122222122222 0422091 0000 +M42020031111112109121700404101161113 +M520200311111121091119920726WTTTP#Y#Z22212222222210112121120640000 +M520200311111121091120191114WTTTPTZ00222222122222 0422981 0000 +M520200311111121091120140106WTTTYB9BZ222122222222 0422981 0000 +M520200311111121091120130712WTTT0Z0@9222122122222 0422981 0000 +M42020031111112113420000403011161113 +M520200311111121134119800503WTTT#B@ZP22122212222220212122110830000 +M520200311111121134119750703WTTTP0T0B22122222222220112111122270000 +M520200311111121134120101115WTTTYWWT@221212222222 0422031 0000 +M520200311111121134120090722WTTT0@@ZW221222122222 0422041 0000 +M42020031111112123021700405291163113 +M520200311111121230119890502WTTTP@YTY22222122222210112111122360000 +M520200311111121230120180106WTTT0PTZY222222122222 0422981 0000 +M520200311111121230120180101WTTT#ZP0Y222222122222 0422981 0000 +M520200311111121230120110601WTTTY9ZYZ222221122222 0422021 0000 +M42020031111112130921100401181162113 +M520200311111121309119900615WTTT#ZW9022212222222210112121118790000 +M520200311111121309120110607WTTTY@#YZ222122122222 0422021 0000 +M520200311111121309120080706WTTTY9Z##222122122222 0422051 0000 +M42020031111112180220000404271163113 +M520200311111121802119860619WTTT#P#9Z22212221222210112121116990925 +M520200311111121802120170119WTTTY00#@222122222222 0422981 0000 +M520200311111121802120161123WTTT#W#W0222122222222 0422981 0000 +M520200311111121802120110601WTTTPZ9BB222122122222 0422021 0058 +M520200311111121802120070503WTTTYY9#T222122222222 0422071 0058 +M42020031111112186420600405471162113 +M520200311111121864119770626WTTTPY@WY22212222222210112131127310000 +M520200311111121864120080706WTTT#W@W9222122122222 0422051 0000 +M42020031111112208721100403821163113 +M520200311111122087119940723WTTT#@BB912222222222210112122118240000 +M520200311111122087120190121WTTT#0Z9P122222122222 0422981 0000 +M520200311111122087120170708WTTTYY#YB122221122222 0422981 0000 +M42020031111112209221100406541163113 +M520200311111122092119940103WTTTY0ZP012222122222210112111117050000 +M520200311111122092120090119WTTTY0PWT122221222222 0422041 0000 +M42020031111112217021100401181163113 +M520200311111122170119840715WTTT#Z00Y22212222222230112122117660000 +M520200311111122170120190115WTTT#ZYZ@122222122222 0422981 0000 +M520200311111122170120180523WTTTYPZBZ222221122222 0422981 0000 +M520200311111122170120070622WTTTBT@0T122222222222 0422061 0000 +M42020031111112221522400403061162113 +M520200311111122215119790123WTTTYZB##22222122222250112111116970000 +M520200311111122215120030613WTTTY9TW#222221122222 0422101 0738 +M42020031111112228921100406541163113 +M520200311111122289119830601WTTTP9#Z022222222222250112111125980000 +M520200311111122289120140101WTTT#BB9Y222222222222 0422981 0000 +M520200311111122289120090602WTTTPY0BZ222221122222 0422041 0000 +M520200311111122289120090602WTTT#90Y9222221122222 0422041 0000 +M42020031111112240620600401421161113 +M520200311111122406119890618WTTT##@9#12222222222210112111131920000 +M520200311111122406120190518WTTTYYW0Z122222222222 0422981 0000 +M520200311111122406120050807WTTT0TZT0222222222222 0422081 0000 +M42020031111112243621700401121161113 +M520200311111122436119910612WTTT0P#T#22212222222210112111120030000 +M520200311111122436120160523WTTT#0@Z0122122122222 0422981 0000 +M520200311111122436120120826WTTTPYY#W222222122222 0422011 0000 +M42020031111112259321400406791163113 +M520200311111122593119960115WTTT09##Y22212122222210112121100000000 +M520200311111122593120171101WTTTPW##T222121122222 0422981 0000 +M42020031111112269220900401881162113 +M520200311111122692119820523WTTTP@T0P12222222222230112121113530000 +M520200311111122692120150619WTTTY#B#T122222122222 0422981 0000 +M520200311111122692120080715WTTTP9ZW#122222222222 0422051 0000 +M42020031111112291222700402001163113 +M520200311111122912119830712WTTTPW#0#22212222222220112121100960000 +M520200311111122912219800719WTTTP0#Z@22212212222220212113205680000 +M520200311111122912120170507WTTT#@P@B222122122222 0422981 0000 +M520200311111122912120060123WTTT#B00W222122122222 0422071 0000 +M42020041111111116420600401421163113 +M520200411111111164119900523WTTT#YBYY12222222222210112121124690000 +M520200411111111164120160106WTTTY#W@9122222222222 0422981 0000 +M520200411111111164120120101WTTT009BB122222122222 0422011 0000 +M42020041111111116820000403951163113 +M520200411111111168119791101WTTT#TZZB12222222222230112111120910000 +M520200411111111168120090601WTTTY@#TW122222222222 0422041 0000 +M520200411111111168120060501WTTTP#9#Y122222122222 0422081 0000 +M42020041111111132420600400871163113 +M520200411111111324119940719WTTT0WY0Z22222122222210112131113020000 +M520200411111111324120170826WTTT0PZ0Z222221222222 0422981 0000 +M42020041111111134922400406121163113 +M520200411111111349119840508WTTTY@0TB22212222222210112121132220000 +M520200411111111349120180722WTTTP@@ZY222222222222 0422981 0000 +M520200411111111349120150619WTTT#YZZW222222222222 0422981 0000 +M520200411111111349120120615WTTTPZWPZ222122122222 0422011 0000 +M520200411111111349120080523WTTTPTP90222122122222 0422051 0000 +M42020041111111149721100401181993113 +M520200411111111497119900108WTTT0@YPT12222122222210112111120630000 +M520200411111111497120180821WTTTYZ00P122222222222 0422981 0000 +M42020041111111150520600402981161113 +M520200411111111505119820821WTTT#TT9#12222222222210112121120010000 +M520200411111111505120050703WTTTBT9BB122222122222 0422081 0186 +M520200411111111505120031119WTTT0WW09122222222222 0422101 0186 +M42020041111111165821100403821161113 +M520200411111111658119880103WTTT0ZY#T12222222222210112121134660000 +M520200411111111658120160618WTTTP#BWY122222122222 0422981 0000 +M520200411111111658120110119WTTT#WZPW122222122222 0422031 0000 +M520200411111111658120080619WTTTYBZ9B222222122222 0422051 0000 +M42020041111111165922400404731161113 +M520200411111111659119930515WTTTPYWTT22212222222210112121114540000 +M520200411111111659120170715WTTTY0B@W222122122222 0422981 0000 +M520200411111111659120130121WTTTPP@0@222122122222 0422981 0000 +M520200411111111659120110119WTTTY#@BT222122122222 0422021 0000 +M42020041111111166722400405111161113 +M520200411111111667119910126WTTT0T@9B12222222222210112121127690000 +M520200411111111667120160619WTTTPZYZT222222122222 0422981 0000 +M520200411111111667120110619WTTT#P00B122222122222 0422021 0000 +M42020041111111172820900401031161113 +M520200411111111728119870619WTTT0@@Z922222122222210112111117460000 +M520200411111111728120170619WTTTPPZ@Y222221222222 0422981 0000 +M520200411111111728120150826WTTT#BP@B222222122222 0422981 0000 +M42020041111111183120600405471993113 +M520200411111111831119901119WTTTPBB#Y12222222222210112112119050215 +M520200411111111831120150119WTTTPY0@0222222122222 0422981 0000 +M42020041111111201522700402231161113 +M520200411111112015119780606WTTTP0W9@22222122222250112111123460800 +M520200411111112015120100115WTTT#@9B9222222122222 0422031 0000 +M520200411111112015120050501WTTT0ZY09222221222222 0422091 0070 +M42020041111111206622700400671163113 +M520200411111112066119800113WTTT#@W0@22222122222210112111120390000 +M520200411111112066120190502WTTTYBY9Z222222222222 0422981 0000 +M520200411111112066120130109WTTT0@@YP222221222222 0422981 0000 +M42020041111111209220600405341163113 +M520200411111112092119901109WTTT0WB#W12222122222210112121128810000 +M520200411111112092120150108WTTTP9P@0222222122222 0422981 0000 +M520200411111112092120100612WTTTPT9P9122222122222 0422031 0000 +M42020041111111210020600402121161113 +M520200411111112100119960121WTTTP@P0T22222122222210112121122980000 +M520200411111112100120170126WTTTPWPYB222121122222 0422981 0000 +M42020041111111216320000404551993113 +M520200411111112163119970118WTTT#PWBZ12222222222210112081114560000 +M520200411111112163120190518WTTTY@ZTZ122222222222 0422981 0000 +M42020041111111218221100406001163113 +M520200411111112182119930701WTTT#YT@W11222222222210112081127090000 +M520200411111112182120180622WTTTP9@9P222221122222 0422981 0000 +M520200411111112182120140821WTTTYT0@9122221122222 0422981 0000 +M42020041111111225021700401121163113 +M520200411111112250119960615WTTTPZ0Y#12222222222210112112119000000 +M520200411111112250120180101WTTTP0900122222222222 0422981 0000 +M42020041111111231222700400381162113 +M520200411111112312119801123WTTTYW90Z22222222222230112111126000000 +M520200411111112312120070507WTTTP##Z#222222122222 0422061 0000 +M520200411111112312120040715WTTTYB9Z9122222222222 0422091 0000 +M42020041111111246321100401181162113 +M520200411111112463119860719WTTT#Y#TT12222222222210112121117330000 +M520200411111112463120171115WTTTYP9YW122222222222 0422981 0000 +M520200411111112463120100606WTTTPBTW#122222122222 0422031 0000 +M520200411111112463120060715WTTT09YPT122222222222 0422071 0000 +M42020041111111257020900403031162113 +M520200411111112570119790801WTTT0BWWY12222222222210112121114870000 +M520200411111112570120160721WTTT0TY0P122222222222 0422981 0000 +M520200411111112570120130519WTTT#P0Z9122222222222 0422981 0000 +M520200411111112570120120719WTTTPB00Z122222222222 0422011 0000 +M520200411111112570120030115WTTT#WZTB122222222222 0422101 0000 +M42020041111111281121100401561163113 +M520200411111112811119870715WTTTYY@ZB22222122222210112141124480000 +M520200411111112811120180816WTTTY99ZY222222222222 0422981 0000 +M42020041111111326320000402891163113 +M520200411111113263119850601WTTTY0##W22222122222230112141120310000 +M520200411111113263120110102WTTT0#P0Z222222222222 0422021 0000 +M42020041111111342721700404101161113 +M520200411111113427119820108WTTTY9PP#22222122222210112111120640000 +M520200411111113427120120501WTTT#BTWZ222222222221 0422011 0813 +M520200411111113427120110702WTTTYPBYW222221222222 0422021 0000 +M520200411111113427120100521WTTT0T0@#122221222221 0422041 0813 +M42020041111111346220600403391163113 +M520200411111113462119890115WTTT00#Y@22222122222210112111121550000 +M520200411111113462120130501WTTTY#PT9222221122222 0422981 0000 +M42020041111111351721700402861163113 +M520200411111113517119891123WTTT#W@#W22222122222210112111124510000 +M520200411111113517120160603WTTT0T9B0222222122222 0422981 0000 +M520200411111113517120160603WTTTYP@TB222222122222 0422981 0000 +M520200411111113517120140512WTTT#0WTZ222222122222 0422981 0000 +M42020041111111351821400400561163113 +M520200411111113518119800622WTTTP09YZ22222122222250112121116860000 +M520200411111113518120100713WTTT0@WW@222221122222 0422031 0000 +M520200411111113518120090101WTTTYWYPB222222222222 0422051 0000 +M42020041111111365020000404151163113 +M520200411111113650119740823WTTTY#W@P22222122222230112141132870000 +M520200411111113650120100701WTTT#90W9222221122222 0422031 0000 +M42020041111111366122700402801161113 +M520200411111113661119880521WTTTPYZT#22222222222230112081116010000 +M520200411111113661120170615WTTTYZ#@0222222122222 0422981 0000 +M520200411111113661120120115WTTTYTPB#222122122222 0422011 0000 +M520200411111113661120090815WTTT0#BZ0222122222222 0422041 0000 +M42020041111111370920600400871162113 +M520200411111113709119940501WTTTYZPW@12212122222210112111124510000 +M520200411111113709120150723WTTT000B#122121122222 0422981 0000 +M42020041111111387722700402581163113 +M520200411111113877119891122WTTTP#00T12212222222210112121115990000 +M520200411111113877120140115WTTT0TT0B222222122222 0422981 0000 +M42020041111111404720000402281161113 +M520200411111114047119920123WTTTYT#P#12222222222210112081124830000 +M520200411111114047120170519WTTTYYY9Z122122222222 0422981 0000 +M520200411111114047120131119WTTT0WBTP122122122222 0422981 0000 +M42020041111111425220600402121162113 +M520200411111114252119960715WTTT000WY12222122222210112111100000000 +M520200411111114252120150615WTTTPP0@B122222222222 0422981 0000 +M42020041111111429121400402181161113 +M520200411111114291219731112WTTTPZ90922212222222120112111200000813 +M520200411111114291119640119WTTTYB@Z#22212212222210212131121330000 +M520200411111114291120150601WTTTYZTB@222222122222 0422981 0000 +M520200411111114291120100622WTTTBT9BW222122222222 0422031 0000 +M42020041111111441820000404151992113 +M520200411111114418119860614WTTTY99PP22212222222210112121136190000 +M520200411111114418120191116WTTT0@PW9222222122222 0422981 0000 +M520200411111114418120170115WTTTPPBZ@222122222222 0422981 0000 +M520200411111114418120100106WTTTPWY9@122122122222 0422031 0000 +M520200411111114418120050701WTTT#T0Y@222122122222 0422081 0000 +M42020041111111462620600405341163113 +M520200411111114626119960102WTTT0YYZ022222122222210112121125120000 +M520200411111114626120150515WTTTP@W09222222122222 0422981 0000 +M42020041111111482622200404361162113 +M520200411111114826119870701WTTT0@B0Z22212222222210112111114450000 +M520200411111114826120170706WTTTYPZ#0222222122222 0422981 0000 +M42020041111111485821100406001162113 +M520200411111114858119740519WTTTY9P0B12222222222210112112124160000 +M520200411111114858120090606WTTT0P0PW122222122222 0422041 0000 +M520200411111114858120040109WTTT#@T0#122222122222 0422092 0000 +M42020041111111503220000403951162113 +M520200411111115032119840815WTTT0BWYT22122222222230112122132340000 +M520200411111115032120050115WTTTPT##9221222122222 0422081 0000 +M42020041111111534921100405971163113 +M520200411111115349119920126WTTT#0WWP12222222222210112111124310000 +M520200411111115349120160506WTTT#T0Z@222221122222 0422981 0000 +M520200411111115349120141126WTTT#Z9ZZ222222222222 0422981 0000 +M42020041111111542920900404651163113 +M520200411111115429119930116WTTT0W9@Z22212222222210112131120140000 +M520200411111115429120130121WTTT0BYYY222122222221 0422981 0610 +M42020041111111554720600400291161113 +M520200411111115547119780115WTTTPT#ZT22222122222210112131125320000 +M520200411111115547120060126WTTT#0BZW222221122222 0422071 0203 +M42020041111111591722700400681161113 +M520200411111115917119761115WTTTYBWZZ22222112222220212141230950000 +M520200411111115917119751106WTTT00@PT22222122222220112121200000000 +M520200411111115917120180701WTTT#Z99Z222222122222 0422981 0000 +M520200411111115917120160715WTTTP#B@Y222221122222 0422981 0000 +M520200411111115917120150723WTTT0@Z@@222222122222 0422981 0000 +M520200411111115917120120123WTTT#9YTW222222122222 0422011 0000 +M520200411111115917120100708WTTTYTYWZ222221122222 0422031 0000 +M520200411111115917120080626WTTT0TYT#222221222222 0422051 0000 +M520200411111115917120060502WTTTYTWW9222222122222 0422071 0000 +M520200411111115917120040126WTTTPZ@Z#222222122222 0422101 0000 +M520200411111115917120020606WTTT#Z#TW222222222222 0422111 0000 +M42020041111111594021400403481012113 +M520200411111115940119740519WTTTYPB9T22222222222220112141120800000 +M520200411111115940120070113WTTTY#@@0222222222222 0422061 0000 +M520200411111115940120050122WTTT0#YT0222222122222 0422081 0000 +M42020041111111651121100401461162113 +M520200411111116511119820121WTTT#Z@PP12222222222210112111121410000 +M520200411111116511120130126WTTTP@##B122222122222 0422981 0000 +M520200411111116511120070615WTTT#ZW#0122222122222 0422061 0000 +M42020041111111660621400400351162113 +M520200411111116606119690722WTTTYZ#@#22212222222230112121118570000 +M520200411111116606120100113WTTT0BPW9222222222222 0422031 0000 +M520200411111116606120060106WTTT#Y#B@222122222222 0422071 0000 +M42020041111111676721700405821163113 +M520200411111116767119850521WTTTPT9@B12222122222210112161132150000 +M520200411111116767120110614WTTTP99P@122221222222 0422021 0000 +M520200411111116767120040509WTTT0B000122221222222 0422101 0000 +M42020041111111701722700400681993113 +M520200411111117017119761102WTTT#PB#@22212212222220112111200000000 +M520200411111117017119750706WTTT#9PP022212222222220212111232760000 +M520200411111117017120170519WTTT#PWTP222122222222 0422981 0000 +M42020041111111705420900402921162113 +M520200411111117054219850126WTTT#9WT022212222222110112111112920053 +M520200411111117054120170108WTTT0#PT#222122122222 0422981 0000 +M520200411111117054120140114WTTTYPWY#222222122221 0422981 0813 +M520200411111117054120110121WTTT#B@#0222122222222 0422021 0000 +M520200411111117054120060619WTTTY@WYW222122122221 0422071 0813 +M520200411111117054120030719WTTT#TW@B222122122222 0422101 0000 +M42020041111111728221100403821163113 +M520200411111117282119940106WTTTYBW@B12222222222210112111100000000 +M520200411111117282120150719WTTTPYTW@122222122222 0422981 0000 +M42020041111111754020500402421162113 +M520200411111117540119870515WTTT00@P@22222122222210112111113350000 +M520200411111117540120140601WTTT0YTYW222222222222 0422981 0000 +M520200411111117540120080101WTTTY0TZY222221122222 0422051 0000 +M520200411111117540120050101WTTTPP#Z#222221222222 0422091 0000 +M520200411111117540120030615WTTTYYWPP222221222222 0422101 0000 +M42020041111111763720600401981163113 +M520200411111117637119930515WTTT0Z#BT12222222222210112111115400000 +M520200411111117637120140607WTTT0@0YP122222222222 0422981 0000 +M520200411111117637120120822WTTT#9YW@222222222222 0422011 0000 +M42020041111111794820900403071161113 +M520200411111117948119880101WTTT##PYT12222222222210112111119140000 +M520200411111117948120140612WTTT0W@@@122222122222 0422981 0000 +M42020041111111857521100406001161113 +M520200411111118575119740612WTTTYTBPY12222222222210112121112800000 +M520200411111118575120150618WTTTY#T0T122221222222 0422981 0000 +M42020041111111872320900406131163113 +M520200411111118723119911113WTTT0Y#Y912222222222210112122121790000 +M520200411111118723120160107WTTTYY#Y#122222122222 0422981 0000 +M520200411111118723120140722WTTTY@BWT122222222222 0422981 0000 +M520200411111118723120060802WTTT0W###122222222222 0422071 0000 +M42020041111111873222700400671162113 +M520200411111118732119720701WTTTPZY9Y22222222222210112112117680000 +M520200411111118732120120722WTTT09ZTY222222122222 0422011 0000 +M42020041111111882021700406571161113 +M520200411111118820119930612WTTTP0#Z012222122222210112141119230000 +M520200411111118820120100119WTTTBT@00122121222222 0422031 0000 +M42020041111111883522200406641163113 +M520200411111118835119850622WTTTPPWYB22222122222250112111138390000 +M520200411111118835120190501WTTT#B9PT222222222222 0422981 0000 +M520200411111118835120090702WTTT##9BW222221122222 0422041 0000 +M520200411111118835120070818WTTTP9@Z0222221222222 0422061 0000 +M520200411111118835120050513WTTT#TZW9222221122222 0422081 0000 +M42020041111111883621100404711163113 +M520200411111118836119890614WTTT0TZ9P22222122222210112111123050000 +M520200411111118836120140115WTTTYZBT@222221222222 0422981 0000 +M42020041111111909420000406201163113 +M520200411111119094119951116WTTT0BZBY22222122222210112121115490000 +M520200411111119094120160108WTTT09T9Z222221222222 0422981 0748 +M42020041111111914820900403031162113 +M520200411111119148119750615WTTTY@B0T22212222222210112121119050000 +M520200411111119148120080702WTTT0B00P222122222222 0422051 0000 +M520200411111119148120060119WTTTYPYW@222122122222 0422081 0000 +M520200411111119148120030702WTTTYTBYZ222122122222 0422101 0000 +M42020041111111925020900406741162113 +M520200411111119250119751116WTTT#P90B12222222222210112112121530000 +M520200411111119250120090622WTTT0PTYB122222122222 0422041 0000 +M42020041111111955422700402401163113 +M520200411111119554119890601WTTT0ZB0#22222122222220112121137750000 +M520200411111119554120140812WTTTY#PYT222221122221 0422981 0813 +M42020041111111973420900406131163113 +M520200411111119734119941122WTTT0P#T912212222222210112111122530000 +M520200411111119734120090121WTTTP0P99122122222222 0422051 0000 +M42020041111112049721700404401163113 +M520200411111120497119780121WTTT#9WYZ22212222222250112111127350000 +M520200411111120497120060102WTTT09BP0222122222222 0422071 0000 +M520200411111120497120020519WTTTYP#YZ222122222222 0422113 0000 +M520200411111120497120020519WTTT0ZY#W222122122222 0422113 0000 +M42020041111112061120000404071992113 +M520200411111120611119940116WTTT09WPB12222222222210112111126120000 +M520200411111120611120121106WTTTYTTB9122221222222 0422011 0000 +M520200411111120611120110615WTTT#WYBP122221122221 0422021 0897 +M42020041111112086220900401881163113 +M520200411111120862119840622WTTT#ZWPB22212222222210112111100000000 +M520200411111120862120060512WTTT#B@TZ222122222222 0422071 0000 +M42020041111112121722700402001193113 +M520200411111121217119770701WTTT0ZB0@22212212222250112111120890000 +M520200411111121217120100101WTTTPWYPY222222222222 0422031 0000 +M520200411111121217120050115WTTTP99PB222222122222 0422091 0000 +M42020041111112123620600400291163113 +M520200411111121236119880606WTTTP#W@W22222122222210112131113000000 +M520200411111121236120140815WTTT#TWTY222222122222 0422981 0000 +M42020041111112146120900406131162113 +M520200411111121461219850123WTTT0Y9YZ12222122222210112083200000000 +M520200411111121461119830114WTTTP#BP912222112222211012981118880000 +M520200411111121461120180106WTTTPBYZ#122222122222 0422981 0000 +M42020041111112155521100403821013113 +M520200411111121555119870621WTTTP9@@912212222222250112112118910000 +M520200411111121555120050507WTTT00B@0122122222222 0422083 0000 +M42020041111112179021100406001993113 +M520200411111121790119840721WTTTYB#ZW12222122222210112112120970000 +M520200411111121790120130519WTTTY0Y0T122221222222 0422011 0000 +M520200411111121790120080823WTTT##BZY122221222222 0422051 0000 +M520200411111121790120050607WTTT#WBTZ122221222222 0422081 0000 +M42020041111112224120300404901161113 +M520200411111122241119930822WTTTYPZWT12222222222220112131123910000 +M520200411111122241120160101WTTTYWWT#122222222222 0422981 0000 +M520200411111122241120130512WTTTP#ZWZ122222222222 0422981 0000 +M42020041111112237021700406341163113 +M520200411111122370119850123WTTTPPZZ022222222222210112121117560000 +M520200411111122370120111101WTTTY@P9P122222222222 0422021 0000 +M42020041111112252321700404101163113 +M520200411111122523119780601WTTTPZB0T12222222222210112131124420000 +M520200411111122523120200501WTTTY@W@Y222222222222 0422981 0000 +M520200411111122523120091119WTTTPPT##122222222222 0422041 0000 +M520200411111122523120020103WTTTY0BW#122222222222 0412111 0000 +M42020041111112266620900406701161113 +M520200411111122666119880601WTTT#P#0022122212222250112112115680000 +M520200411111122666120140601WTTTPBZWB221222222222 0422981 0000 +M42020041111112286120600402981993113 +M520200411111122861119950126WTTTY0#BZ12222222222210112081122880000 +M520200411111122861120150122WTTT#T9YP122222122222 0422981 0000 +M42020051111111128920500402421163113 +M520200511111111289119840523WTTTYY0ZP22222122222210112121126820000 +M520200511111111289120070116WTTT#WB#Z222221222222 0422061 0000 +M520200511111111289120050115WTTTY@WP#222221122222 0422081 0000 +M42020051111111136320000401371163113 +M520200511111111363119880102WTTT#W9TY22222122222210112121111410000 +M520200511111111363120160819WTTTY9ZTZ222221222222 0422981 0301 +M42020051111111147421100406001163113 +M520200511111111474119960716WTTT#0T@W12222222222210112121111610000 +M520200511111111474120160521WTTTP#0B#122222222222 0422981 0000 +M42020051111111176721700406571193113 +M520200511111111767119840509WTTTY0WZ922222222222210112111131330000 +M520200511111111767120150601WTTT#BBBB222222222222 0422981 0000 +M520200511111111767120110123WTTTPPWYZ222222122222 0422021 0000 +M42020051111111193220600400871161113 +M520200511111111932119900806WTTT#0Z#Z22212122222210112121100000000 +M520200511111111932120120602WTTTYP9TZ222121222222 0422021 0000 +M42020051111111216822700400671162113 +M520200511111112168119870701WTTTBTTTW12222222222210112121128690000 +M520200511111112168120120615WTTTP@9BB122222122222 0422011 0000 +M520200511111112168120110521WTTT##0WT122222122222 0422031 0000 +M42020051111111220221700405121163113 +M520200511111112202119890606WTTT0@0#W12222222222210112111114060000 +M520200511111112202120150521WTTT0T0B#122222222222 0422981 0000 +M520200511111112202120110118WTTT0ZYYT122222222222 0422021 0000 +M42020051111111228720900401881162113 +M520200511111112287119690521WTTTY#P@Y22212222222230112121125830000 +M520200511111112287120020619WTTTP09BW222122222222 0422111 0000 +M42020051111111238721400400351161113 +M520200511111112387119880626WTTTYPB#W12222222222220112111121820000 +M520200511111112387120170121WTTT0ZBP@122221222222 0422981 0000 +M520200511111112387120090526WTTTY0W#@122222122222 0422051 0000 +M42020051111111248120000403721163113 +M520200511111112481119820507WTTT0BY#Y22222122222210112131121270000 +M520200511111112481120150519WTTT#Y@9P122221122222 0422981 0000 +M520200511111112481120150519WTTTP#P@9122221222222 0422981 0000 +M42020051111111251120900402921992113 +M520200511111112511119960518WTTTYYY#P22212222222210112111114770000 +M520200511111112511120150118WTTTPZ#BZ222122122222 0422981 0000 +M42020051111111256322700402851013113 +M520200511111112563119960101WTTTP9ZW922212122222210112111122170000 +M520200511111112563120190601WTTT0PYZY222222122222 0422981 0000 +M42020051111111262720600400871161113 +M520200511111112627119810622WTTTP0BP@12222222222250112111118180050 +M520200511111112627120070819WTTTYY#9@122222222222 0422061 0025 +M42020051111111272020600402981163113 +M520200511111112720119890801WTTT0#BWW12212222222210112131128030000 +M520200511111112720120160502WTTT0YB0@222222222222 0422981 0000 +M520200511111112720120140719WTTT0YB0#122122222222 0422981 0000 +M42020051111111277722400406441013113 +M520200511111112777119840714WTTT00#TZ22212222222230112161134060000 +M520200511111112777120160819WTTTP0#ZB222122122222 0422981 0000 +M520200511111112777120140722WTTTPYYPT222122222222 0422981 0000 +M42020051111111285520600402121162113 +M520200511111112855119780118WTTTYPTZ#12222112222250112131129420000 +M520200511111112855120160619WTTTPW0ZZ122222222222 0422981 0000 +M520200511111112855120140819WTTTYY0TW222221222222 0422981 0000 +M42020051111111288421100403821993113 +M520200511111112884119810707WTTTPWY9Z12222122222210112112117750000 +M520200511111112884120121118WTTT0PY0B122222122222 0422012 0000 +M42020051111111294120600401151163113 +M520200511111112941119880514WTTTPY9BP12222212222211012122120540000 +M520200511111112941219860512WTTT#Y#@012222222222210112083200000000 +M520200511111112941120130815WTTTYP#T@122222122222 0422981 0000 +M520200511111112941120061113WTTTPWP0T122222222222 0422071 0000 +M42020051111111296020600405341163113 +M520200511111112960119930806WTTTY9YT#22222122222210112121130050000 +M520200511111112960120180506WTTTPPPB@122221122222 0422981 0000 +M520200511111112960120121107WTTT0P@WZ122221222222 0422011 0000 +M42020051111111304922400401011163113 +M520200511111113049119720101WTTTP00ZZ22222122222210112121124040000 +M520200511111113049120070802WTTT00WYB222221122222 0422061 0000 +M42020051111111309920000401371161113 +M520200511111113099119831114WTTT099ZT22222122222230112111123950000 +M520200511111113099120070615WTTT0B#PW222221222222 0422071 0000 +M42020051111111338520600400871163113 +M520200511111113385119840815WTTT0BYPB12222222222210112111118070000 +M520200511111113385120120101WTTTY9T@P122222222222 0422021 0000 +M42020051111111340320600402031161113 +M520200511111113403119900801WTTT#9###12222222222210112111122640068 +M520200511111113403120180823WTTTPP#Y#222222222222 0422981 0000 +M520200511111113403120150621WTTTYZ0Y@122122222222 0422981 0000 +M42020051111111341620000403721162113 +M520200511111113416119880716WTTT0W#T#22222122222210112131125960000 +M520200511111113416120150718WTTTPBZBB222121222222 0422981 0000 +M520200511111113416120130502WTTT0@#WY222122222222 0422011 0000 +M42020051111111346921700402341163113 +M520200511111113469119880516WTTT#PZ@012222222222210112081115600000 +M520200511111113469120160715WTTT#TP@P122222222222 0422981 0000 +M520200511111113469120070116WTTTY@TWZ122222122222 0422071 0000 +M520200511111113469120040719WTTTY00ZB122222122222 0422091 0000 +M42020051111111355522400400551162113 +M520200511111113555119930102WTTT#W@0#22212222222210112121100000000 +M520200511111113555120101115WTTTY99P9222122222222 0422031 0000 +M42020051111111370520000406951161113 +M520200511111113705119710601WTTT#WZY@22222122222210112121117180000 +M520200511111113705120090813WTTTY@0PZ222221122222 0422041 0000 +M42020051111111371221400401581163113 +M520200511111113712119800115WTTT#@90Y22222122222210112121236300000 +M520200511111113712119710715WTTT0Y9B022222112222210212121200000000 +M520200511111113712120050701WTTT#00ZY222221122222 0422081 0000 +M520200511111113712120020508WTTT0##W#222221122222 0422111 0000 +M42020051111111373720000406951161113 +M520200511111113737119810502WTTT0P9YT22212222222230112111115800000 +M520200511111113737120150119WTTT#Y#Z#222122122222 0422981 0000 +M520200511111113737120090701WTTTP#9@9222122122222 0422041 0000 +M42020051111111379820900400391163113 +M520200511111113798119840506WTTTP09YB22212222222210112111121210000 +M520200511111113798120050715WTTT#BZ9B222122122222 0422081 0000 +M42020051111111426320600402661993113 +M520200511111114263119770719WTTT##YT@22222122222230112131128760000 +M520200511111114263120070626WTTTP@@#T122222122222 0422071 0000 +M520200511111114263120050119WTTTYZTP9222221122222 0422081 0000 +M520200511111114263120040518WTTT0@#T0222221222222 0422101 0000 +M520200511111114263120040518WTTTY#WY#222221122222 0422101 0000 +M42020051111111453620300404901162113 +M520200511111114536119780526WTTT0T99Y22212122222210112121120040061 +M520200511111114536120021101WTTTYWWWY122222122222 0422111 0000 +M42020051111111463020900402921013113 +M520200511111114630119860113WTTTPPY0Z22212222222210112121100000000 +M520200511111114630120140802WTTTPW#WT222122122222 0422981 0000 +M42020051111111466821100401551163113 +M520200511111114668119820101WTTTP##ZW22222122222230112141133540000 +M520200511111114668120130101WTTTP9ZPZ222222122221 0422011 0813 +M520200511111114668120100501WTTTYBZZP222222222222 0422041 0000 +M520200511111114668120050621WTTT0#YT#122222222222 0422091 0000 +M520200511111114668120030126WTTT#W00P122222122222 0422101 0000 +M42020051111111475621700405121163113 +M520200511111114756119890502WTTTY99YY12222222222210112111121030000 +M520200511111114756120160819WTTTYZYW#222222222222 0422981 0000 +M520200511111114756120110118WTTT0TT9B122222222222 0422021 0000 +M520200511111114756120090601WTTT0BZP#122222122222 0422041 0000 +M42020051111111480521400401841163113 +M520200511111114805119900122WTTTP9PB922222122222210112121125060000 +M520200511111114805120100601WTTT#0B9T222222222222 0422031 0000 +M42020051111111488221100406001162113 +M520200511111114882119840123WTTT##ZP012222222222210112121122010000 +M520200511111114882120111119WTTT#9P@W122222122222 0422021 0000 +M520200511111114882120070526WTTTPPP0W122222122222 0422061 0000 +M520200511111114882120040702WTTTPPT#Z122222122222 0422091 0000 +M42020051111111530821400406791163113 +M520200511111115308119830109WTTTPTWZY22222122222210112131113430000 +M520200511111115308120190101WTTTY#WTT222222222222 0422981 0000 +M520200511111115308120121107WTTT##T0B222221122222 0422011 0429 +M520200511111115308120061121WTTTYY@ZY222221222222 0422071 0429 +M42020051111111549620900404651163113 +M520200511111115496119930716WTTTP9WT912222222222210112111113670000 +M520200511111115496120170101WTTTPY0Z0122222122222 0422981 0000 +M42020051111111558421400403091163113 +M520200511111115584119910716WTTT#TB0Y22222122222210112121112480000 +M520200511111115584120180718WTTTY9W@Z222222122222 0422981 0000 +M520200511111115584120141106WTTTYTP@T222222222222 0422981 0000 +M42020051111111566821100405141163113 +M520200511111115668119870721WTTT099Y#22222122222210112111115920000 +M520200511111115668120170506WTTTY9P@Z222222122222 0422981 0000 +M520200511111115668120170506WTTT0W@TZ222222122222 0422981 0000 +M42020051111111568421100405951162113 +M520200511111115684119760101WTTT#09BY22212222222230112111132990000 +M520200511111115684120170109WTTT0BPYW222122122222 0422981 0000 +M520200511111115684120070121WTTTPWWBB222122122222 0422061 0000 +M42020051111111588821100401461163113 +M520200511111115888119850515WTTT#Y0Y@12212222222220112111121050000 +M520200511111115888120170708WTTT0P0TP122222222222 0422981 0000 +M520200511111115888120111102WTTTPZBZ9122222122222 0422021 0000 +M520200511111115888120100106WTTT#@@99122222122222 0422031 0000 +M42020051111111635520000406011162113 +M520200511111116355119790608WTTT0WTTB12222222222210112121116240000 +M520200511111116355120180121WTTT#TTPT122222122222 0422981 0000 +M520200511111116355120110116WTTTP#9P0122222222222 0422021 0000 +M520200511111116355120020808WTTTY9#Z#122222122222 0422111 0658 +M42020051111111647720000405421163113 +M520200511111116477119930621WTTTPTT9@22222122222210112131125390000 +M520200511111116477120151103WTTT#90ZP222222222222 0422981 0000 +M520200511111116477120110601WTTT0YZ9P122122122222 0422021 0000 +M42020051111111649720900402921163113 +M520200511111116497119850121WTTTYT0#Y12222222222210112111125840000 +M520200511111116497120150719WTTTPP9Z9222222222222 0422981 0000 +M520200511111116497120110815WTTTP#W#T222222222222 0422021 0000 +M42020051111111673220600405341161113 +M520200511111116732119820118WTTTYP9W#22222222222250112111121900000 +M520200511111116732120160701WTTT#W#TB222222222221 0422981 0897 +M520200511111116732120130515WTTTPPYY@222122122222 0422011 0000 +M520200511111116732120100615WTTTPT0WB222122222222 0422031 0000 +M520200511111116732120071115WTTT#@0#T222122122222 0422061 0000 +M520200511111116732120050109WTTT00PP#222122122222 0422081 0000 +M520200511111116732120020522WTTTPBB#T222222122222 0422111 0000 +M42020051111111674320000400171162113 +M520200511111116743119690101WTTT#Y9P@22222122222210112121126000000 +M520200511111116743120090508WTTTYWTZZ222221122222 0422051 0000 +M42020051111111676321100406001163113 +M520200511111116763119870703WTTTY0YT#12222222222220112081128190000 +M520200511111116763119820601WTTTP@TYB12222212222220212121108670000 +M520200511111116763120150606WTTTYTT99122222122222 0422981 0000 +M520200511111116763120111115WTTTYZ0W@122222122222 0422021 0000 +M520200511111116763120090123WTTT09@@Y122222222222 0422041 0000 +M42020051111111697520600404951011113 +M520200511111116975119840815WTTT#TBY922222222222250112131124900000 +M520200511111116975120150121WTTTP@0B#222122222222 0422981 0000 +M42020051111111701221100403821163113 +M520200511111117012119900801WTTTPZ0PP12222222222210112112128730000 +M520200511111117012120170519WTTT0BTZZ122222222222 0422981 0000 +M520200511111117012120130603WTTT#YZZZ122122222222 0422011 0000 +M42020051111111733022700403611161113 +M520200511111117330119910619WTTTPT#9012222212222211012111122600000 +M520200511111117330119890506WTTTY00T@12222222222210112121119710000 +M520200511111117330120170626WTTTY#Y@Y122221222222 0422981 0000 +M520200511111117330120150606WTTT0PWWW222222222222 0422981 0000 +M42020051111111744422400406121163113 +M520200511111117444119940126WTTT0TPT#22222122222210112081121160000 +M520200511111117444120170602WTTT#0Y0@222221222222 0422981 0000 +M42020051111111757722700402581163113 +M520200511111117577119820619WTTT#T0WY22222122222210112121128340000 +M520200511111117577120090721WTTT#B0#9222222122222 0422041 0000 +M520200511111117577120070622WTTTY9TY#222222122222 0422071 0000 +M42020051111111758221100404801013113 +M520200511111117582119790801WTTT00TPP22222122222230112111117810000 +M520200511111117582120110609WTTTYPPB0222222222222 0422031 0000 +M520200511111117582120040122WTTTYY9YB222221122222 0422091 1163 +M42020051111111762321400400351013113 +M520200511111117623119840723WTTT##@##22212222222210112111127860000 +M520200511111117623120121101WTTTY9W0W222122222222 0422012 0000 +M520200511111117623120040123WTTTPBB0T122222222222 0422093 0000 +M42020051111111766222200403201163113 +M520200511111117662119930801WTTT#BZ#Z22222122222210112121115740000 +M520200511111117662120170515WTTT#YZ@B222221222222 0422981 0000 +M520200511111117662120140619WTTT0Y09Z222221222222 0422981 0000 +M520200511111117662120120802WTTT0WZZW222221222221 0422011 0801 +M42020051111111769520900401031161113 +M520200511111117695119880709WTTT#0PP#12222222222210112111120340000 +M520200511111117695120160518WTTT0B##W122222122222 0422981 0000 +M520200511111117695120090501WTTTYB9W#122222222222 0422051 0000 +M520200511111117695120090501WTTTY@@ZB122222222222 0422051 0000 +M520200511111117695120060715WTTTY#0TB122222122222 0422071 0000 +M42020051111111780820600405341162113 +M520200511111117808119801126WTTT#9BT@12222122222210112131114790000 +M520200511111117808120140703WTTTPY#9P122222122222 0422981 0000 +M520200511111117808120060801WTTT0#ZWW122222122222 0422071 0000 +M520200511111117808120030106WTTT0WYPP122222122222 0422101 0000 +M42020051111111804720600405171161113 +M520200511111118047119920119WTTTYW9TP12222222222210112121119930000 +M520200511111118047120160101WTTT#P#BY122222222222 0422981 0000 +M520200511111118047120120719WTTT0YYPT122222122222 0422011 0000 +M42020051111111810920000402101161113 +M520200511111118109119831113WTTT09Z0#22222122222210112121130050000 +M520200511111118109120080121WTTTYP0#0222221122222 0422051 0000 +M520200511111118109120070515WTTT0B#90222221122222 0422061 0000 +M42020051111111811020600401421163113 +M520200511111118110119740118WTTTP9B9922212222222220212112100000000 +M520200511111118110119670118WTTTPZ#9W22212212222220112112100000000 +M520200511111118110120060503WTTTP0P9@222122122222 0422072 0000 +M520200511111118110120041113WTTTP009@222122122222 0422092 0000 +M520200511111118110120041113WTTTPPT0W222122122222 0422092 0000 +M42020051111111829420900403031013113 +M520200511111118294119830814WTTTPY#0P22212222222230112111155110000 +M520200511111118294120170118WTTTYT0TW222122222222 0422981 0000 +M520200511111118294120130101WTTTPP@00222222122222 0422981 0000 +M520200511111118294120090822WTTTP09#9222222222222 0422041 0000 +M42020051111111834222400402111163113 +M520200511111118342119820515WTTT#TP#022222122222210112121117110000 +M520200511111118342120180721WTTTPZ99Y222222122222 0422981 0000 +M520200511111118342120100521WTTTY#@Y#222222122222 0422031 0000 +M42020051111111852020900401031161113 +M520200511111118520119880712WTTT0W9@Y12212222222210112111121100000 +M520200511111118520120160501WTTTY#W0Z222222222222 0422981 0000 +M520200511111118520120070506WTTTP@BTZ122222222222 0422061 0000 +M42020051111111874820500403231163113 +M520200511111118748119730126WTTTY99#Y22222122222250112111126080000 +M520200511111118748120111119WTTT0##YY222222222222 0422021 0000 +M520200511111118748120030121WTTTBTZ#W222221122222 0422111 0000 +M42020051111111933220600400871163113 +M520200511111119332119870523WTTT0B#BY22222122222230112132124970000 +M520200511111119332120140713WTTT0BT0B222222122222 0422981 0287 +M520200511111119332120130126WTTTP#TZB222222122222 0422981 0287 +M520200511111119332120080115WTTTY@WZZ222221122222 0422051 0287 +M42020051111111936720900406421013113 +M520200511111119367119800119WTTT0Z0B@12222222222230112111124660000 +M520200511111119367120080501WTTT0#YPP122222222222 0422051 0000 +M520200511111119367120020513WTTTP9T#Y122222122222 0422111 0000 +M42020051111111959820000402591163113 +M520200511111119598119890607WTTT0#WYP22222222222210112111117390000 +M520200511111119598120170601WTTTYTZ9P222222122222 0422981 0000 +M42020051111111986221400401841163113 +M520200511111119862119890101WTTTP99PP22222122222210112121130670000 +M520200511111119862120090115WTTTPP0P@222221122222 0422041 0000 +M520200511111119862120080601WTTT0@TYT222221222222 0422051 0000 +M42020051111112011720000403951163113 +M520200511111120117119730806WTTT#BPTZ22212222222230112111124330600 +M520200511111120117120180726WTTT#ZWTB222222222222 0422981 0000 +M520200511111120117120150126WTTTP9BWY222122122222 0422981 0000 +M520200511111120117120070106WTTT00##W222122122222 0422061 0000 +M520200511111120117120050707WTTTPYTT9222122222222 0422081 0000 +M42020051111112036420600402981123113 +M520200511111120364119970701WTTT##@PZ22222222222210112121100000000 +M520200511111120364120170518WTTT0#0@0222222222222 0422981 0000 +M520200511111120364120170518WTTT#PWP9222222222222 0422981 0000 +M42020051111112060820900402921161113 +M520200511111120608119890613WTTTP#0#B12222222222210112111124110000 +M520200511111120608120170501WTTT0T@PW222222222222 0422981 0000 +M520200511111120608120090816WTTT#ZZTW122222222222 0422041 0000 +M520200511111120608120060615WTTT#YTWB122222222222 0422081 0000 +M42020051111112079122700402801163113 +M520200511111120791119910701WTTT#0PZT12222222222210112111125090000 +M520200511111120791120140121WTTTP0TBY222222222222 0422981 0000 +M520200511111120791120110701WTTTYWYT#122221222222 0422021 0000 +M520200511111120791120080619WTTTY0@TB222222122222 0422061 0000 +M42020051111112090821100401181163113 +M520200511111120908119850119WTTTPB#@B22212222222210112141127880000 +M520200511111120908120070109WTTT#PZZ#222122222222 0422061 0000 +M42020051111112096221700406571163113 +M520200511111120962119890821WTTT#@TWB22212212222210112111133570000 +M520200511111120962120140506WTTTP@@WT222222122222 0422981 0000 +M520200511111120962120071119WTTTP0PBY222222222222 0422061 0000 +M42020051111112100021700404101123113 +M520200511111121000119850606WTTT#0#T912222222222210112111133080000 +M520200511111121000120190108WTTT#WP9W122222122222 0422981 0000 +M520200511111121000120121119WTTT009TZ222222122222 0422011 0000 +M520200511111121000120040521WTTTPPW9#122222122222 0422101 0000 +M42020051111112147521100406001163113 +M520200511111121475119950706WTTTPZWTB12222222222210112112115240000 +M520200511111121475120171101WTTT0@PYZ122222122222 0422981 0000 +M42020051111112158521100402211163113 +M520200511111121585119910619WTTTPBW#P22222122222250112121100000000 +M520200511111121585120100526WTTTP@0@9222221222222 0422041 0000 +M42020051111112167221100406001163113 +M520200511111121672119940126WTTTYZ99#12222122222210112111115260000 +M520200511111121672120170102WTTTPZ0YP122222122222 0422981 0000 +M520200511111121672120110523WTTTP#WW@122221222222 0422021 0000 +M42020051111112168520900401031161113 +M520200511111121685119810518WTTT0BPT#12222222222210112111119720000 +M520200511111121685120140701WTTT#YT9#122221222222 0422981 0000 +M520200511111121685120050707WTTTP@P0@122222222222 0422081 0000 +M42020051111112171821700400981163113 +M520200511111121718119740618WTTT0YBZY22222112222251012111130560000 +M520200511111121718120160106WTTT0PY0@222222222222 1022981 0000 +M520200511111121718120140702WTTTPZZ0P222221222222 1022981 0000 +M520200511111121718120130626WTTT#09P#222221122222 1022981 0000 +M42020051111112174822700400441163113 +M520200511111121748119860615WTTT#BY#B22222122222210112121125160000 +M520200511111121748120160808WTTTY#Y9@222221122222 0422981 0000 +M520200511111121748120041119WTTTY90@Y222221222222 0422091 0438 +M42020051111112179120900405911162113 +M520200511111121791119830102WTTT#ZWBT22212222222210112111122670000 +M520200511111121791120140108WTTTPYT@Y222222122222 0422981 0000 +M520200511111121791120100519WTTTY@@P#222122122222 0422041 0000 +M520200511111121791120080113WTTTYWZ@W222122122222 0422061 0000 +M42020051111112181222700400671163113 +M520200511111121812119660623WTTT0YY9Y22212222222210112081122160000 +M520200511111121812120080121WTTTY0ZPY222222122222 0422051 0000 +M42020051111112182322700400671163113 +M520200511111121823119750101WTTT#W0PT22222122222210112981122780000 +M520200511111121823120090519WTTT0@0TT222221222222 0422051 0000 +M520200511111121823120070119WTTTPWYBT222221122222 0422061 0000 +M520200511111121823120030615WTTT#9W09222221222222 0422101 0000 +M42020051111112194121700405821163113 +M520200511111121941119860618WTTTBTTBP22222122222210112131120510000 +M520200511111121941120110608WTTTYP#PB222221222222 0422021 0000 +M520200511111121941120060602WTTT#YPB#222221122222 0422071 0000 +M42020051111112195020600400871163113 +M520200511111121950119880726WTTTP#PWT22222121222230112121114390629 +M520200511111121950120150102WTTT#PYPW222221222222 0422981 0000 +M520200511111121950120051115WTTTY00BT222221222222 0422081 0000 +M42020051111112198421700401091162113 +M520200511111121984119880115WTTT#WWZT22212222222230112111113040000 +M520200511111121984120190602WTTTPB9W0222222122222 0422981 0000 +M520200511111121984120190602WTTT#Z@Y@222222222222 0422981 0000 +M42020051111112200020900406131162113 +M520200511111122000119830501WTTTYTPWY22222122222210112121118470000 +M520200511111122000120170726WTTT0B0PP122222122222 0422981 0000 +M520200511111122000120070719WTTT#B0PY222221222222 0422061 0000 +M42020051111112206221700401021163113 +M520200511111122062119870814WTTTY0#Y@22222122222210112121118740000 +M520200511111122062120120721WTTTY@9TW222222222222 0422011 0000 +M520200511111122062120090623WTTT09ZY#122222122222 0422051 0000 +M42020051111112206321700402381993113 +M520200511111122063119870102WTTT0@99@22222122222210112111127180000 +M520200511111122063120151108WTTT0ZBPY222221122222 0422981 0000 +M520200511111122063120110801WTTT0#YYT222221222222 0422021 0000 +M42020051111112217221100403821163113 +M520200511111122172119820702WTTT#Y#B#12222122222210112121114700000 +M520200511111122172120160115WTTT#PYPP122221122222 0422981 0000 +M520200511111122172120110703WTTT##W0#122221222222 0422021 0000 +M520200511111122172120070115WTTTPPWYT122221122222 0422061 0000 +M42020051111112265622700402801161113 +M520200511111122656119910509WTTTPPTB922212222222210112131120340000 +M520200511111122656120150803WTTT0Z@TZ222222122222 0422981 0000 +M42020051111112269121100401461161113 +M520200511111122691119810107WTTTYB###12222222222230112121118080000 +M520200511111122691120150601WTTTP0WZB122222222222 0422981 0000 +M520200511111122691120050123WTTTY9Y0#122222222222 0422092 0000 +M42020051111112269921700402831163113 +M520200511111122699119870723WTTTP9ZY@22222122222210112121127870000 +M520200511111122699120180119WTTTPTZWZ222221222222 0422981 0000 +M42020051111112270321100406001013113 +M520200511111122703119940621WTTT#B0Z#12222222222210112131130080000 +M520200511111122703120181101WTTTY@YZP122222122222 0422981 0000 +M520200511111122703120171101WTTT#T0W@122222122222 0422981 0000 +M42020051111112272820900403071193113 +M520200511111122728119740621WTTTPP9W@22212222222210112131126310000 +M520200511111122728120050115WTTT#B#@0222122122222 0422081 0000 +M42020061111111132020600401421163113 +M520200611111111320119900106WTTT#WP#@12222222222220112111118460000 +M520200611111111320120160503WTTT0B@9Z122221122222 0422981 0000 +M520200611111111320120160503WTTTPY90T122221122222 0422981 0000 +M520200611111111320120130107WTTTY#0T#122222222222 0422981 0000 +M42020061111111132521700404101163113 +M520200611111111325119930123WTTT00YYT22222122222210112081124020000 +M520200611111111325120150619WTTT0T@#T222221222222 0422981 0000 +M520200611111111325120140115WTTTP@BTP222221122222 0422981 0000 +M520200611111111325120110721WTTT#T00#122222222222 0422021 0000 +M42020061111111146621100401181162113 +M520200611111111466219711112WTTT0B9ZT12222212222220212113200000000 +M520200611111111466119700706WTTT#0YT922212222222230112121122400000 +M520200611111111466120120119WTTTY@W0Z122122122222 0422011 0000 +M520200611111111466120020101WTTTYYZB@122122122222 0422111 0000 +M42020061111111149621100403821162113 +M520200611111111496119900626WTTTPZWZ012222222222210112111117620000 +M520200611111111496120190123WTTTP#@@@222222222222 0422981 0000 +M520200611111111496120130809WTTTYTT9T122221122222 0422981 0000 +M42020061111111155421400403651013113 +M520200611111111554119910509WTTT##0YY22222122222210112111118100000 +M520200611111111554120160606WTTT0P99W222221222222 0422981 0000 +M42020061111111159222400404941163113 +M520200611111111592119910714WTTTYWZTB22222122222210112121119500000 +M520200611111111592120161106WTTT00B##222221122222 0422981 0000 +M520200611111111592120150126WTTT0@TZ9222222222222 0422981 0000 +M520200611111111592120110102WTTT#@PTB222221122222 0422031 0000 +M520200611111111592120080516WTTTP@BZZ222221222221 0422051 0552 +M42020061111111171221700401121013113 +M520200611111111712119910123WTTT#0BYT22212222222210112111130410000 +M520200611111111712120150112WTTT0@W99222222222222 0422981 0000 +M42020061111111174121100401461163113 +M520200611111111741119910123WTTT#@YPP22222122222210112131115750000 +M520200611111111741120150707WTTTPTWBP222221222222 0422981 0000 +M42020061111111206121100401181123113 +M520200611111112061119810621WTTT090@B12222122222210112121121750000 +M520200611111112061120110615WTTT#9PBW122222222222 0422031 0000 +M520200611111112061120060601WTTTYZ9Y#122222122222 0422081 0000 +M42020061111111210520600401981163113 +M520200611111112105119860619WTTT0TB0@12222222222210112121119750000 +M520200611111112105120090821WTTTP#P@T222221222222 0422041 0000 +M520200611111112105120050101WTTT00#@9122222122222 0422081 0000 +M42020061111111210920000403721162113 +M520200611111112109119910701WTTTY9Z9B12222222222210112121119590000 +M520200611111112109120140114WTTTPTP@Z222222122222 0422981 0000 +M520200611111112109120101126WTTTY@T@9222222222222 0422031 0000 +M520200611111112109120070502WTTT#9WY9122222222222 0422061 0000 +M42020061111111217420600401981161113 +M520200611111112174119860123WTTT0Z0W912222222222210112121120940000 +M520200611111112174120090123WTTTPWBBP122222122222 0422041 0000 +M42020061111111228822700400681163113 +M520200611111112288219870603WTTTPB#T@12222212222220222113200000000 +M520200611111112288119850526WTTTP9#0Y12222222222210112121124220796 +M520200611111112288120080702WTTT0TP0@122222122222 0422051 0000 +M520200611111112288120020721WTTT0P#@Z122222222222 0422111 0000 +M42020061111111235321400403171163113 +M520200611111112353119770502WTTTP9Z9P22222122222220112111140420000 +M520200611111112353120190706WTTT#T9W9222221122222 0422981 0000 +M520200611111112353120111101WTTTP00PB222221122222 0422021 0000 +M520200611111112353120100803WTTT#YPW9222221122222 0422031 0000 +M520200611111112353120080107WTTT#T0Z#222221122222 0422061 0000 +M520200611111112353120051123WTTTYBTWB222221122222 0422081 0000 +M42020061111111252821400400351163113 +M520200611111112528119880516WTTT0WZBB22212222222220112111130670000 +M520200611111112528120110506WTTT09TWT222222222222 0422031 0000 +M520200611111112528120040502WTTTPPW#Z222222222222 0422102 0000 +M42020061111111266020000402891163113 +M520200611111112660119870123WTTT0W@YP22222122222210112121119640000 +M520200611111112660120150519WTTT0TTYT222221122222 0422981 0000 +M520200611111112660120150519WTTTBTTPT222221122222 0422981 0000 +M42020061111111268821100401781163113 +M520200611111112688119950715WTTTY#Y9912222222222220112112113240000 +M520200611111112688120170801WTTTYBZTP122222122222 0422981 0000 +M520200611111112688120150821WTTT0ZT#T122222222222 0422981 0000 +M42020061111111271222400401011993113 +M520200611111112712119730614WTTT0YZY@22222122222210112111121670000 +M520200611111112712120150508WTTT0@YBT222221222222 0422981 0000 +M42020061111111274321700401121161113 +M520200611111112743119960709WTTTYP#WY22212222222210112121119570000 +M520200611111112743120170801WTTTPT#PT222122122222 0422981 0000 +M520200611111112743120160121WTTT0T0Y@222122222222 0422981 0000 +M42020061111111278720900402921162113 +M520200611111112787119900122WTTTYT9##22212222222210112121123760000 +M520200611111112787120130112WTTT###BT122222122222 0422981 0000 +M520200611111112787120100103WTTT0YBP#122221122222 0422041 0000 +M42020061111111288121400401841161113 +M520200611111112881119920121WTTTYT9Y922222122222210412111115660000 +M520200611111112881120170719WTTT0WY0@222221122222 0622981 0000 +M520200611111112881120150121WTTT00YY9222221122222 0622981 0000 +M520200611111112881120090618WTTTYYPP9222221122222 0622051 0000 +M42020061111111288520900401881162113 +M520200611111112885119780701WTTT09PT#12222222222210112121122310000 +M520200611111112885120130515WTTTPZ99@122222122222 0422981 0000 +M520200611111112885120100118WTTTYP0PY122222222222 0422031 0000 +M42020061111111297520600402981163113 +M520200611111112975119920623WTTTYBB9Y22212222222210112121125390000 +M520200611111112975120140806WTTT0PWZZ222122222222 0422981 0000 +M520200611111112975120120123WTTTBT@TY222222122222 0422021 0000 +M42020061111111309620300404901163113 +M520200611111113096119780701WTTTYPTW922222122222220112111123450000 +M520200611111113096119770507WTTT##9T022222111222220212111200001789 +M520200611111113096120160819WTTT009TB222221222222 0422981 0000 +M520200611111113096120140521WTTTYYB@W222221122222 0422981 0000 +M42020061111111321621700402631163113 +M520200611111113216119720701WTTTP#Z9022222122222220112121200000000 +M520200611111113216119630115WTTTY00YB22222112222210212121200000000 +M520200611111113216120100506WTTT#TYYT222222222222 0422031 0000 +M520200611111113216120080502WTTT0P0ZB222222122222 0422061 0000 +M42020061111111322421700402511163113 +M520200611111113224119830715WTTTYZTW@22222112222210112121123010000 +M520200611111113224120080606WTTT0@#YT222221122222 0422061 0000 +M42020061111111323320000403951122113 +M520200611111113233119860719WTTT#TT#912222122222210112121122560000 +M520200611111113233120150813WTTT0PYPT122221222222 0422981 0000 +M42020061111111329221700400141163113 +M520200611111113292119880501WTTT0W#YZ22222122222230112131117610000 +M520200611111113292120160112WTTTYY9BY122221222222 0422981 0000 +M42020061111111335520600401421162113 +M520200611111113355119720807WTTT#ZYYB12222222222210112111129020000 +M520200611111113355120090719WTTTP0PT@122222122222 0422041 0000 +M520200611111113355120050708WTTT00BBW122222122222 0422081 0000 +M520200611111113355120030121WTTT0##0T122222222222 0422111 0000 +M42020061111111336620600406321163113 +M520200611111113366119870801WTTTPBY0B12222222222210112111125960000 +M520200611111113366120140126WTTTYP#9Y222222222222 0422981 0000 +M42020061111111382622700403611993113 +M520200611111113826119960715WTTT#ZTZZ22222122222210112111120810000 +M520200611111113826120180601WTTT0@@WT222222122222 0422981 0000 +M42020061111111385721400400351162113 +M520200611111113857119820619WTTT#WYBZ22212222222230112121114850000 +M520200611111113857120150721WTTT#P##Y222222222222 0422981 0000 +M520200611111113857120121113WTTTP#0YZ222222222222 0422011 0000 +M42020061111111398621400406481162113 +M520200611111113986119840109WTTT0WT@T22222122222210112121121560000 +M520200611111113986120180106WTTTPTBZP222222122222 0422981 0000 +M520200611111113986120160615WTTTYZ0P0222221222222 0422981 0000 +M520200611111113986120130107WTTT0WWWY222221222222 0422011 0000 +M520200611111113986120120518WTTTP0WYZ122221222222 0422021 0000 +M520200611111113986120070521WTTTPBBP@222221122222 0422061 0000 +M520200611111113986120030523WTTT#WPYY222221222222 0422101 0000 +M42020061111111414620600401981163113 +M520200611111114146119860608WTTTPYTYW12222222222210112121125040000 +M520200611111114146120030815WTTT0W#WZ122222222222 0422101 0000 +M42020061111111442822700402231161113 +M520200611111114428119820701WTTT00ZZ#22122222222210112112122530000 +M520200611111114428219801101WTTT#ZTWZ22212212222111012111200000885 +M520200611111114428120160626WTTT0@W@B222222222222 0422981 0000 +M520200611111114428120110701WTTTPP0YB221122222222 0422021 0000 +M520200611111114428120060726WTTT0PBYY222222222222 0422071 0000 +M520200611111114428120040608WTTT0#ZPT222222222222 0422101 0000 +M42020061111111464520900404651163113 +M520200611111114645119771126WTTT09Y#B22222222222250112111126000900 +M520200611111114645120090106WTTT##ZZB221222122222 0422051 0000 +M42020061111111466621700404101993113 +M520200611111114666119870123WTTTPB#T#12222222222210112111113400000 +M520200611111114666120150815WTTTPY@@Y122222122222 0422981 0000 +M520200611111114666120110114WTTT0#9W@122222222222 0422031 0000 +M42020061111111472420600405471161113 +M520200611111114724119910101WTTT09PP912222222222210112121121060000 +M520200611111114724120170107WTTT#T@@9122222222222 0422981 0000 +M520200611111114724120120122WTTT0TBT@122222222222 0422021 0210 +M520200611111114724120100101WTTTP#B0B122222122222 0422031 0210 +M42020061111111474620900400501121113 +M520200611111114746119680709WTTT#B9TT12222222222230112121126490000 +M520200611111114746120040812WTTTP9YP9122222222222 0422091 0000 +M42020061111111489122400404811163113 +M520200611111114891119900612WTTT#YZ0W22222122222210112111116990000 +M520200611111114891120141106WTTTP999W222221222222 0422981 0000 +M42020061111111497720600405341163113 +M520200611111114977119890715WTTTY@WY#12222122222210112131133330000 +M520200611111114977120100115WTTTPTW9B222221122222 0422031 0000 +M520200611111114977120090802WTTT#Z#W9222221122222 0422041 0000 +M42020061111111502822700406401162113 +M520200611111115028119900114WTTTY9W9@22222122222210112121113180000 +M520200611111115028120160502WTTTPBBY9222222122222 0422981 0000 +M520200611111115028120110113WTTTYT0B#222221222222 0422021 0000 +M42020061111111504120900406421161113 +M520200611111115041119640701WTTTY#BP912222222222250112111122740000 +M520200611111115041120060109WTTT#T0P@122222122222 0422081 0000 +M520200611111115041120040103WTTT0Z9ZZ122222222221 0422101 0897 +M42020061111111510121700406341013113 +M520200611111115101119840501WTTTYY0ZB22222222222250112121121940000 +M520200611111115101120120101WTTTPTY@9222222222222 0422021 0000 +M520200611111115101120090118WTTTPZB#P222222222222 0422051 0000 +M520200611111115101120070126WTTTYB9@Y222222122222 0422071 0000 +M42020061111111511320900406601993113 +M520200611111115113119860103WTTT0Y@9W22222122222220212111104160000 +M520200611111115113119840801WTTTPYP##22222212222220112111133450000 +M520200611111115113120150118WTTT0PW@T222222122222 0422981 0000 +M42020061111111512720500402421163113 +M520200611111115127119910723WTTTY09W012222222222210112111121980000 +M520200611111115127120180108WTTTYYBYT222222222222 0422981 0000 +M42020061111111515521100401541163113 +M520200611111115155119790802WTTTPB0T922212222222230112111137580000 +M520200611111115155120170108WTTTYW##Z222122222222 0422981 0000 +M520200611111115155120140506WTTT##Z#9222122122222 0422981 0000 +M520200611111115155120100614WTTT#Y@ZB222122122222 0422031 0000 +M42020061111111517421100401541163113 +M520200611111115174119950619WTTT0BB#W22222122222210112111124670000 +M520200611111115174120190715WTTTYZ#TY222221122222 0422981 0000 +M520200611111115174120180502WTTTYY9WT222221222222 0422981 0000 +M42020061111111519620600401981123113 +M520200611111115196119751101WTTTP0#WY22222222222230112121122710000 +M520200611111115196120130716WTTTP09PT222221222222 0422981 0000 +M42020061111111540020900406131163113 +M520200611111115400119940813WTTTPP@TB12222122222210112131120800000 +M520200611111115400120181115WTTTYTPYY222122222222 0422981 0000 +M42020061111111542022400400231163113 +M520200611111115420119840119WTTT00Z@T22122222222250112111120560000 +M520200611111115420120190626WTTTPP#@Y222222122222 0422981 0000 +M520200611111115420120150801WTTT0Z0PP221222222222 0422981 0000 +M520200611111115420120130103WTTT#BPPP221222122222 0422981 0000 +M42020061111111545820600403781163113 +M520200611111115458119930115WTTT0ZT@W22222122222210112081130940000 +M520200611111115458120170512WTTTY#TTY222222222222 0422981 0000 +M520200611111115458120150701WTTT0ZYWZ222221222222 0422981 0000 +M42020061111111563222400406121163113 +M520200611111115632119930101WTTT#TY9W22122222222210112111117470000 +M520200611111115632120170109WTTTPWP9P221222122222 0422981 0000 +M42020061111111582320900401031163113 +M520200611111115823119800107WTTTYYZPY22222222222220112111121020000 +M520200611111115823119680118WTTTPY@9@22222212222220212111127890000 +M520200611111115823120170707WTTT0@@@T222222222222 0422981 0000 +M520200611111115823120150803WTTTY9PY0222222222222 0422981 0000 +M520200611111115823120090112WTTT0Z909222222122222 0422041 0000 +M42020061111111584122700400671161113 +M520200611111115841119730512WTTT0TPYY12222222222230112081116840000 +M520200611111115841120030519WTTT#@BZT122222122222 0422111 0000 +M42020061111111587621100406001163113 +M520200611111115876119710123WTTTP#@PB12222222222210112111120610000 +M520200611111115876120030806WTTTY@00Z122222122222 0422101 0000 +M42020061111111588320600400871161113 +M520200611111115883119930123WTTT00@9#12222222222210112111116900000 +M520200611111115883120160121WTTTP#YZ@122222122222 0422981 0000 +M42020061111111616821100401181161113 +M520200611111116168119850503WTTT#@PYB12222222222210112121115170000 +M520200611111116168120190603WTTT#@Z#T122222122222 0422981 0000 +M520200611111116168120061119WTTTY9PYT222222122222 0422071 0000 +M42020061111111621422700402231013113 +M520200611111116214119710623WTTT#P9WT22222122222230112121134430000 +M520200611111116214120030118WTTTY9##9222221222222 0422111 0000 +M520200611111116214120020626WTTT0ZB90222221122222 0422111 0000 +M42020061111111623221700404401993113 +M520200611111116232119880119WTTTYW@#922212212222210112111117350000 +M520200611111116232120150126WTTTPY@99222222222222 0422981 0000 +M520200611111116232120110502WTTT0YTYT122222222222 0422021 0000 +M520200611111116232120100606WTTT#@YWP222222122222 0422041 0000 +M42020061111111647620900402921161113 +M520200611111116476119730815WTTTYT@B@22212222222210112131121530000 +M520200611111116476120040607WTTTYY9P0222122222222 0422101 0000 +M520200611111116476120020106WTTT0TT09222122222222 0422111 0000 +M42020061111111657420900405911161113 +M520200611111116574119940602WTTT#WPYZ12222222222210112081119850000 +M520200611111116574120150714WTTTYBY90122222122222 0422981 0000 +M520200611111116574120120101WTTTYB#PW122222122222 0422021 0000 +M42020061111111661521100406391162113 +M520200611111116615119880615WTTTPB0T012222122222210112121111050000 +M520200611111116615120150115WTTT0TT#P122221122222 0422981 0000 +M520200611111116615120080712WTTT#BP9P122221222222 0422051 0000 +M520200611111116615120060722WTTT0Z#0W122221122221 0422071 0575 +M42020061111111669321100406391122113 +M520200611111116693119690116WTTT0W0@Z12222222222230112111119580000 +M520200611111116693120020119WTTTYP@P0122222222222 0422112 0000 +M42020061111111675022200405571993113 +M520200611111116750119820126WTTT0PTW#12222222222210112121116810000 +M520200611111116750120180507WTTTY0@WB222222222222 0422981 0000 +M520200611111116750120150109WTTTPWTYB122222222222 0422981 0000 +M42020061111111682022700400441121113 +M520200611111116820119830119WTTTY9PBY12222222222210112131120270000 +M520200611111116820120180515WTTTY@YYP122222222222 0422981 0000 +M520200611111116820120090101WTTTYTWWZ222222122222 0422051 0000 +M42020061111111685620900403431162113 +M520200611111116856119810714WTTT#B0BP12222222222210112121130430000 +M520200611111116856120110823WTTT00#TT122222122222 0422021 0000 +M520200611111116856120070719WTTT0B@PW122222122221 0422061 0897 +M42020061111111696321700400981161113 +M520200611111116963119920101WTTTYYWB012222222222220112121123740000 +M520200611111116963119790121WTTTYBZ9T22222212222220212111124050000 +M520200611111116963120170103WTTT0W0W@122222122222 0422981 0000 +M520200611111116963120160126WTTTP09@W122221122222 0422981 0000 +M520200611111116963120140815WTTTPZ#@#122222222222 0422981 0000 +M520200611111116963120120721WTTT0PTYT122222222222 0422011 0000 +M42020061111111705921700405121162113 +M520200611111117059119920819WTTTYWYT012222122222230112112113410000 +M520200611111117059120180818WTTTPW0BP122121222222 0422981 0000 +M520200611111117059120140514WTTT0#@BB122221222222 0422981 0000 +M42020061111111713320000402101123113 +M520200611111117133119870706WTTTPWY#W22222122222210112111114350000 +M520200611111117133120160115WTTT0#WP0222221122222 0422981 0000 +M520200611111117133120080702WTTTY0WP@222221222222 0422051 0000 +M42020061111111719220000403551123113 +M520200611111117192119920707WTTTY0@@B22222122222210112111120870000 +M520200611111117192120160619WTTTYPZPB222221222222 0422981 0000 +M520200611111117192120100503WTTT#TP@#222222122222 0422041 0000 +M42020061111111720021700405121162113 +M520200611111117200119800703WTTTPW#Y#12222222222230112121131530000 +M520200611111117200120090115WTTTPWWY#122222222222 0422041 0000 +M520200611111117200120030715WTTT0ZW9T122222222222 0422101 0000 +M42020061111111725821100401691123113 +M520200611111117258119800607WTTT#Z@TT12222222222210112121239900000 +M520200611111117258119770509WTTTP#0ZB12222212222220212111200000000 +M520200611111117258120110501WTTTPT@9@122222122222 0422031 0000 +M520200611111117258120040508WTTTYZYWT222222122222 0422101 0000 +M42020061111111738220900400261161113 +M520200611111117382119760626WTTTPW00912212222222210112111132800000 +M520200611111117382120180726WTTTP99ZY122222222222 0422981 0000 +M520200611111117382120110801WTTTBTZP9122222122222 0422021 0000 +M520200611111117382120090602WTTT#00Y@122222222222 0422041 0000 +M42020061111111743120900401231162113 +M520200611111117431119900121WTTTYBPYW22222122222210112111114260000 +M520200611111117431120190508WTTTPZ@#P222221122222 0422981 0000 +M42020061111111749021100406391993113 +M520200611111117490119850819WTTT#Y#WY22222112222210112111100000000 +M520200611111117490119810715WTTTPTP9T22222121222250212121200000908 +M520200611111117490120060602WTTT0P#B9222221122221 0422081 0652 +M42020061111111752720600401981122113 +M520200611111117527119880709WTTTYT0YZ12222222222210112121124740000 +M520200611111117527120120114WTTT#WZ@0122222222222 0422011 0000 +M520200611111117527120071103WTTT0WBP9122222222222 0422061 0000 +M42020061111111769020000401451123113 +M520200611111117690119660621WTTTP@PYT22222122222220112111135620000 +M520200611111117690120041118WTTTP0BY9222221222222 0422091 0000 +M520200611111117690120041118WTTT0Y@PY222221222222 0422091 0000 +M42020061111111789022700405651163113 +M520200611111117890119900701WTTT0@TB@22222122222210112121127490000 +M520200611111117890120160122WTTT#WBZ@222221222222 0422981 0000 +M42020061111111792122700400671163113 +M520200611111117921119930802WTTT09BZ012222222222220112081100000940 +M520200611111117921120160722WTTTY9WWZ122222122222 0422981 0000 +M520200611111117921120120519WTTT#0WTT222222222222 0422011 0000 +M42020061111111799320900406151163113 +M520200611111117993119870702WTTT0TPWB11222222222230112111121000000 +M520200611111117993120170716WTTT#9@PP122221222222 0422981 0000 +M520200611111117993120120718WTTTYB9#W222222122222 0422011 0000 +M520200611111117993120070119WTTTP0TY@122222122222 0422061 0000 +M42020061111111805821100401691013113 +M520200611111118058119830521WTTTPWY#012222122222210112121129460000 +M520200611111118058120080613WTTT#Z#T@122221122222 0422051 0000 +M520200611111118058120020518WTTT#@Z@@122221122222 0422111 0000 +M42020061111111808022700400671161113 +M520200611111118080119950102WTTT#TZZ022212222222210112081119030000 +M520200611111118080120170126WTTT0PB0#222222122222 0422981 0000 +M520200611111118080120160123WTTT#YY9Z222222122222 0422981 0000 +M42020061111111811322400402111121113 +M520200611111118113119870619WTTT#@BZY12222222222210112111120580000 +M520200611111118113120190521WTTTP9#P#222222222222 0422981 0000 +M520200611111118113120080102WTTT#PYT@222222122222 0422061 0000 +M42020061111111816020500404091162113 +M520200611111118160119870109WTTT00BP022222122222210112121122620000 +M520200611111118160120160621WTTTP@0TY222221122222 0422981 0000 +M520200611111118160120070602WTTTP0YZ9222221122222 0422061 0000 +M42020061111111816920000400281123113 +M520200611111118169119840613WTTTY0Z0#22222122222210112111121670000 +M520200611111118169120170822WTTTP#BBY222222222222 0422981 0000 +M42020061111111822020900403031163113 +M520200611111118220119791126WTTTYTW9W22222222222210112122130630000 +M520200611111118220120180606WTTTBTTP0222222122222 0422981 0000 +M520200611111118220120160619WTTTY@#0P222222122222 0422981 0000 +M520200611111118220120050115WTTTPBYB9222222222222 0422092 0000 +M42020061111111829020900406151161113 +M520200611111118290119670115WTTT0P00@22212222222230112111136510000 +M520200611111118290120070715WTTT0YY##222122222222 0422062 0000 +M520200611111118290120030716WTTT0BPWZ222122122222 0422102 0000 +M42020061111111836122700400671123113 +M520200611111118361119890813WTTTYZ@#Z22222122222210112111124730000 +M520200611111118361120190706WTTTYZWPP222222222222 0422981 0000 +M42020061111111839920900401231163113 +M520200611111118399119870515WTTTPT@BW12222222222210112111121080000 +M520200611111118399120100119WTTT0@#TT122221122222 0422041 0000 +M520200611111118399120100119WTTT#Z0WP122221122222 0422041 0000 +M42020061111111843620900406421163113 +M520200611111118436119890106WTTT0@@0T12222222222210112121117710000 +M520200611111118436120171126WTTT0YBW#122222222222 0422981 0000 +M520200611111118436120070821WTTT#T#@#122221122222 0422061 0000 +M42020061111111844521100401551163113 +M520200611111118445119770116WTTT0#9#Z12222212222210112112126000964 +M520200611111118445120031102WTTT0#P@Z122222122222 0422102 0000 +M42020061111111856620500402421123113 +M520200611111118566119860809WTTTY@09B12222222222210112111117870000 +M520200611111118566120160515WTTT0ZZYW222222122222 0422981 0000 +M520200611111118566120130701WTTTYWW9@222222222222 0422981 0000 +M42020061111111875221100406391123113 +M520200611111118752119780501WTTTY#BY922222122222220112121128700000 +M520200611111118752120110122WTTTYTZ#P222222122222 0422031 0000 +M520200611111118752120090108WTTTPTWY#222222222222 0422041 0000 +M42020061111111879420000402281163113 +M520200611111118794119910103WTTTY#YY912222222222210112111125030000 +M520200611111118794120150107WTTTP9#Z#222221222222 0422981 0000 +M42020061111111898722700400991163113 +M520200611111118987119920615WTTTYB##P22222122222210112121114440000 +M520200611111118987120170115WTTTPP9@W222222122222 0422981 0000 +M520200611111118987120150526WTTT#@9#@222221222222 0422981 0000 +M42020061111111921920600405341163113 +M520200611111119219119880119WTTT0W##B12222222222230112111113640000 +M520200611111119219120170706WTTTYYT9T122222222222 0422981 0000 +M42020061111111922621400400561123113 +M520200611111119226119900102WTTTP9WT@22222122222210112111100000942 +M520200611111119226120190101WTTTP@W0Y222222222222 0422981 0000 +M520200611111119226120170814WTTTPWT#T222222122222 0422981 0000 +M42020061111111925720900400501992113 +M520200611111119257119970721WTTTPYWTP22212222222210112081124960000 +M520200611111119257120131118WTTTYYY@P222122222222 0422981 0000 +M42020061111111927621100405971993113 +M520200611111119276119940526WTTT#@Z#022122222222210112111123400000 +M520200611111119276120100102WTTTY#WZZ122222222222 0422031 0000 +M42020061111111941820900402921161113 +M520200611111119418119910121WTTTYT0TY22222222222210112111120100000 +M520200611111119418120150501WTTTP0@YP122222122222 0422981 0000 +M520200611111119418120130101WTTTP9PPT122221122222 0422981 0000 +M520200611111119418120080118WTTT##WT#222222122222 0422061 0000 +M42020061111111949721700402381163113 +M520200611111119497119900522WTTT#@@YY22222122222210112111123080000 +M520200611111119497120170126WTTT#BY0#222222122222 0422981 0000 +M520200611111119497120140101WTTT#YBZ@222221122222 0422981 0000 +M42020061111111961321100406391162113 +M520200611111119613119780521WTTT#WTTP12222222222210112121124260000 +M520200611111119613120170126WTTT#W0#@122221222222 0422981 0000 +M520200611111119613120080814WTTT0Z#B9122222122222 0422051 0000 +M520200611111119613120040523WTTTP@B9P122222222222 0422091 0000 +M42020061111111995020600402661163113 +M520200611111119950119880123WTTTY009Z22222122222210112111127550000 +M520200611111119950120160108WTTT0#P9W122221122222 0422981 0000 +M520200611111119950120150112WTTT0TZP#122221222222 0422981 0000 +M42020061111112014920900406421162113 +M520200611111120149119910719WTTT#W@Y022212222222210112121131200000 +M520200611111120149120130116WTTT0#W@9222122122222 0422981 0000 +M520200611111120149120090706WTTTYYTT0222122222222 0422041 0000 +M42020061111112026720600401421163113 +M520200611111120267119870708WTTT00Y#W22212222222210112121117990000 +M520200611111120267120081119WTTT#YZP9222122122222 0422051 0000 +M42020061111112042420000403011013113 +M520200611111120424119670112WTTT#PZW922222122222220112122119140000 +M520200611111120424120060626WTTT0T0W9222221222222 0422072 0000 +M42020061111112046320900401031162113 +M520200611111120463119830701WTTT#T##Y12222222222210112131123080957 +M520200611111120463120110501WTTT#P09B222122122222 0422021 0000 +M520200611111120463120070106WTTTYY@9Y222222222222 0422071 0000 +M42020061111112056620000403131123113 +M520200611111120566119890802WTTTPWTBY22222122222210112121128150000 +M520200611111120566120120121WTTT#B9TP222221222222 0422011 0000 +M42020061111112060420600400291161113 +M520200611111120604119840714WTTTPY@#012222222222230112131123290000 +M520200611111120604120080512WTTT0@BT#122222122222 0422061 0000 +M520200611111120604120041126WTTTYY#WT122222122221 0422091 0873 +M42020061111112066321100404791163113 +M520200611111120663119970513WTTT0Z#B022222122222210112131116230000 +M520200611111120663120170515WTTTPYW@9222222122222 0422981 0000 +M42020061111112079220000400131993113 +M520200611111120792119820826WTTT#Z#Z@22222122222220112111111290000 +M520200611111120792119760506WTTT#ZTTT22222112222220212111133520000 +M520200611111120792120160119WTTTBTZ#@222221222222 0422981 0000 +M520200611111120792120140623WTTT#09PW222221222222 0422981 0000 +M520200611111120792120121116WTTTPTWT0222221122222 0422011 0000 +M42020061111112082120000405551013113 +M520200611111120821119760102WTTT0Z99T22212212222250112111132490000 +M520200611111120821120190613WTTT#YYWP222122222222 0422981 0000 +M520200611111120821120090515WTTTYY@Y#222122222222 0422053 0000 +M520200611111120821120050115WTTTYZ9WP222122222222 0422083 0000 +M42020061111112092121700406831163113 +M520200611111120921119880615WTTT#WB#Y12222222222210112121122530000 +M520200611111120921120160519WTTTP00##122221122222 0422981 0000 +M520200611111120921120140503WTTT##P#Z122221222222 0422981 0000 +M520200611111120921120121106WTTTYPBT@122221122222 0422011 0000 +M42020061111112093422700403611163113 +M520200611111120934119820106WTTTP9PB022222122222250112121120800000 +M520200611111120934120140609WTTT0PW9P222221122222 0422981 0254 +M520200611111120934120130109WTTT#9TY9222221222222 0422011 0254 +M520200611111120934120040101WTTTY@TPP222221222222 0422091 0000 +M42020061111112095920900406151163113 +M520200611111120959119830609WTTTPZBTY22212222222220112121130630000 +M520200611111120959120120806WTTT0@#B@222122222222 0422011 0000 +M520200611111120959120040106WTTT##@#0222122222222 0422101 0489 +M42020061111112105620000406951993113 +M520200611111121056119820523WTTT0#T#Z12222122222210112111117000000 +M520200611111121056120160612WTTT#Y9TZ222222122222 0422981 0000 +M42020061111112113721700406891163113 +M520200611111121137119800806WTTT0T#W#12222222222210112121122570000 +M520200611111121137120090115WTTT#BBB#122222222222 0422051 0000 +M42020061111112118121100406001123113 +M520200611111121181119920123WTTTPW9#@12222222222210112112120990500 +M520200611111121181120160122WTTTYBZZ0222222122222 0422981 0000 +M520200611111121181120100515WTTT#TWBB122222122222 0422032 0000 +M42020061111112131522400406121161113 +M520200611111121315119851102WTTTYTT#T22212222222210112121117870000 +M520200611111121315120090109WTTT0TWYP222122222222 0422051 0000 +M520200611111121315120070603WTTTPTP##222222222222 0422071 0000 +M42020061111112131920600401421011113 +M520200611111121319119740609WTTTP9YW022222122222210112121122530000 +M520200611111121319120120501WTTTPW@#T222222122222 0422021 0000 +M520200611111121319120051126WTTT0WPWB222222122222 0422081 0000 +M42020061111112134821100403821163113 +M520200611111121348119850115WTTTYBBWB12222222222250112111121670000 +M520200611111121348120090503WTTT000PW122222122222 0422041 0000 +M520200611111121348120070123WTTT#YT9B122222222222 0422061 0000 +M42020061111112182921700406751163113 +M520200611111121829119880101WTTT##WP#22222122222210112141116360000 +M520200611111121829120150602WTTT0B0T9122222222222 0422981 0000 +M520200611111121829120130121WTTTY#@W#222222122222 0422011 0000 +M42020061111112186522700400671163113 +M520200611111121865119940108WTTTY0ZWP22212222222230112112116170000 +M520200611111121865120180601WTTTPYTBP222222222222 0422981 0000 +M42020061111112194022700403941122113 +M520200611111121940119750602WTTTPZ0TY22212222222210112161124630000 +M520200611111121940120110122WTTT#9PWP222122222222 0422021 0000 +M42020061111112201121700405521163113 +M520200611111122011119960715WTTT0Y@Z922222122222210112121126700000 +M520200611111122011120190512WTTT0@PBB222221222222 0422981 0000 +M42020061111112214220600402121123113 +M520200611111122142119650709WTTT#W@PW22222122222250112111123980000 +M520200611111122142120030519WTTT0Z90W222222122222 0422111 0000 +M42020061111112218120000402281163113 +M520200611111122181119970621WTTTYTZT022222122222210112081117350000 +M520200611111122181120180726WTTT0ZY#9222222122222 0422981 0000 +M42020061111112219520900401231163113 +M520200611111122195119910715WTTT#9ZP@12222122222210112111122700000 +M520200611111122195120160119WTTT##@B9122221122222 0422981 0000 +M42020061111112220321400400351161113 +M520200611111122203119840807WTTT#9ZZ922222122222220112121118520000 +M520200611111122203120180526WTTT00YBY222222222222 0422981 0000 +M520200611111122203120150601WTTT00P9Z222222122222 0422981 0000 +M520200611111122203120070702WTTT0PPZT122222222222 0422061 0000 +M520200611111122203120040626WTTT#YBT#222221122222 0422101 0000 +M42020061111112221420600405171161113 +M520200611111122214119900501WTTTY0BPZ12222122222210112111116200000 +M520200611111122214120160726WTTTPB90Y122222222222 0422981 0000 +M42020061111112242622400406121163113 +M520200611111122426119870119WTTTY0PP921212222222210112121117310000 +M520200611111122426120190601WTTT#9BPW222222222222 0422981 0000 +M520200611111122426120170119WTTTPBPY0222122222222 0422981 0000 +M520200611111122426120170119WTTT0T#T9222122222222 0422981 0000 +M520200611111122426120150118WTTT#WY@W222122222222 0422981 0000 +M42020061111112250021400401841123113 +M520200611111122500119810123WTTTYZ@@B22222122222210112121118780000 +M520200611111122500120170513WTTT#T9Z@222222122222 0422981 0000 +M520200611111122500120100113WTTTPBW9Y222221122222 0422031 0000 +M42020061111112253522700400671161113 +M520200611111122535119890701WTTTYT00@22222222222230112131126910000 +M520200611111122535120150112WTTTY9PWP222222222222 0422981 0000 +M520200611111122535120120115WTTTPY09Z222222122222 0422021 0000 +M42020061111112257821100401551123113 +M520200611111122578119920708WTTTY0YBB12222222222210112121125780000 +M520200611111122578120140509WTTTYB@#Z122222122222 0422981 0000 +M42020061111112279920000404071163113 +M520200611111122799119750506WTTT0BB#P22222112222210112111117700000 +M520200611111122799120140601WTTT0YBPB222221122222 0422981 0714 +M42020061111112280022200405781162113 +M520200611111122800119690126WTTTY@T@Y22222122222210112141121020000 +M520200611111122800120030122WTTTY0#B0222221222222 0422111 0000 +M42020061111112282622200402681123113 +M520200611111122826119890607WTTT#99ZW22222112222210112111129240000 +M520200611111122826120120607WTTTY00PW222222122222 0422011 0000 +M520200611111122826120070501WTTT#WT00222221122222 0422061 0000 +M42020061111112282720600405471163113 +M520200611111122827119841119WTTT#TBPY22122222222210112111112700000 +M520200611111122827120170519WTTT00WP@222222122222 0422981 0000 +M520200611111122827120160802WTTTY9@#T221222122222 0422981 0000 +M42020061111112284021100406001162113 +M520200611111122840119850522WTTTPBBZB12222222222230112111115770000 +M520200611111122840120170126WTTT#09PT122221122222 0422981 0000 +M520200611111122840120080112WTTT0@#PZ122222122222 0422052 0000 +M520200611111122840120050626WTTT0BWW@122222222222 0422092 0000 +M42020061111112294621400400351123113 +M520200611111122946119820523WTTT#Y9P022222222222210112111120210000 +M520200611111122946120150726WTTTP0B9P222222122222 0422981 0000 +M42020071111111111421100404801161113 +M520200711111111114119840816WTTT#PZZW12222222222230112111108890600 +M520200711111111114120170723WTTT0WWWP122222222222 0422981 0000 +M520200711111111114120140801WTTTYB0B0122222222222 0422981 0000 +M520200711111111114120080716WTTTP##YP122222222222 0422051 0000 +M520200711111111114120050115WTTTBT9@9122222222222 0422091 0000 +M42020071111111117520900406421162123 +M520200711111111175119780501WTTT0W@Z@12222122222250112121100000000 +M520200711111111175120130106WTTTY@0Y@122221222222 0422981 0000 +M520200711111111175120110115WTTT0#99Y122221222222 0422021 0000 +M42020071111111123721400400351163113 +M520200711111111237119990726WTTTPTZ#T22222122222210112111116900000 +M520200711111111237120190715WTTTPBZ@Y222222122222 0422981 0000 +M42020071111111135021100405951163113 +M520200711111111350119880115WTTT0@TB012222222222210112121113880000 +M520200711111111350120160719WTTTP9YBY122222222222 0422981 0000 +M520200711111111350120120826WTTT#9WP0222222222222 0422011 0000 +M42020071111111158220600401161163113 +M520200711111111582119900521WTTTPY9YY22222122222230112111122790000 +M520200711111111582120101108WTTTYY0P9222221222222 0422031 0000 +M42020071111111218120800406181161113 +M520200711111112181119930114WTTT#WYTP22222122222210112121119440000 +M520200711111112181120140515WTTTP@P9P222222222222 0422981 0000 +M42020071111111255421700406891993113 +M520200711111112554119820806WTTTY0Z#P22222122222230112121129460000 +M520200711111112554120140806WTTT00##T222221122222 0422981 0000 +M520200711111112554120090701WTTT0YZBZ222222222222 0422041 0000 +M520200711111112554120070113WTTTYPWPT222221122222 0422061 0000 +M42020071111111276922700403611123123 +M520200711111112769119891121WTTT#W0TB22222122222210112111100000986 +M520200711111112769120180615WTTTY#T@B122221222222 0422981 0000 +M520200711111112769120160526WTTT0TZ09222221222222 0422981 0000 +M42020071111111290022400404941122123 +M520200711111112900119731109WTTT0PPW922212222222210112121100000870 +M520200711111112900120150806WTTTY0W09222222122222 0422981 0000 +M42020071111111302020000406821123123 +M520200711111113020119720116WTTT#@9PW22212222222210112081127231123 +M520200711111113020120110101WTTTYTWZP222122122222 0422021 0000 +M520200711111113020120060815WTTT#P#T#222122122222 0422071 0000 +M42020071111111314721700402831163113 +M520200711111113147119910619WTTT0PZZP22222122222210112121116820000 +M520200711111113147120140115WTTT0T#09222222122222 0422981 0000 +M42020071111111383621400400351123113 +M520200711111113836119821106WTTTYBWP922212222222210112121112350000 +M520200711111113836120130622WTTT0B#YY222122122222 0422011 0000 +M42020071111111384822700400671163113 +M520200711111113848119790723WTTT#T@WW12222222222210112121129920000 +M520200711111113848120110719WTTTYYBBT122222122222 0422021 0000 +M520200711111113848120021122WTTTP@TZZ122222122222 0422111 0000 +M42020071111111421920000404151163113 +M520200711111114219119890826WTTT#YW@B22222122222210112121125740000 +M520200711111114219120131102WTTTP0@@Y222221222222 0422981 0000 +M42020071111111443120900402921122113 +M520200711111114431119850823WTTTY9YB@12222222222230112111124380000 +M520200711111114431120120123WTTT0TBWZ122222122222 0422011 0000 +M520200711111114431120070819WTTT0W9YB122222122222 0422061 0000 +M42020071111111494221700405821123113 +M520200711111114942119961126WTTT#P0PY12222122222210112081100000900 +M520200711111114942120160126WTTT#@BB@222222222222 0422981 0000 +M42020071111111502921100401181163113 +M520200711111115029119900614WTTTPWW@T22222122222210112121115110000 +M520200711111115029120170719WTTTYYPZY222222222222 0422981 0000 +M42020071111111510621700401121163113 +M520200711111115106119730526WTTTPWPPB22222222222220112111125960000 +M520200711111115106120140701WTTTYP0YW222222122222 0422981 0000 +M520200711111115106120100612WTTT0TPY@222222222222 0422041 0000 +M520200711111115106120060507WTTTP0@9P222122122222 0422081 0000 +M520200711111115106120030719WTTTBT9TP222122222222 0422101 0000 +M42020071111111547421700404101192113 +M520200711111115474119940501WTTTPW0TB22222122222210112111118910000 +M520200711111115474120140102WTTT#T0#@222221122222 0422981 0000 +M42020071111111585520600402031163113 +M520200711111115855119790109WTTTY@#Z912222222222210112111100000653 +M520200711111115855120160722WTTT09@B@122122122222 0422981 0000 +M520200711111115855120080502WTTTP#Y0#122222122222 0422061 0000 +M520200711111115855120030703WTTTPBYT@122222122222 0422101 0000 +M42020071111111602120500402421123113 +M520200711111116021119730102WTTTP@PB#22212222222230112121100000000 +M520200711111116021120100513WTTTY@@9Y222222122222 0422041 0000 +M42020071111111603621700403151013113 +M520200711111116036119900623WTTTP#0#912222222222210112121118200000 +M520200711111116036120160119WTTT#00YZ122221222222 0422981 0000 +M520200711111116036120140719WTTT#@9TW122221222222 0422981 0000 +M42020071111111624021100403821163113 +M520200711111116240119850109WTTT0ZP9Z12222222222210112111100000922 +M520200711111116240120160618WTTTPPWTT122222222222 0422981 0000 +M520200711111116240120150115WTTT#T@#0222222122222 0422981 0000 +M520200711111116240120110107WTTTYZ@W0122222122222 0422031 0000 +M42020071111111648422700402001123113 +M520200711111116484219940507WTTTPY0@@22222222222220212113200000000 +M520200711111116484119830522WTTT09Z@@22222112222220112111100000000 +M520200711111116484120180119WTTT0#0@P222222222222 0422981 0000 +M520200711111116484120161107WTTTPTPZ9222221222222 0422981 0000 +M42020071111111659720900402921122113 +M520200711111116597119920521WTTTPW9B#12222222222210112131133540000 +M520200711111116597120190102WTTT0WZWP222222222222 0422981 0000 +M520200711111116597120100113WTTTY9@00122222122221 0422031 0819 +M42020071111111670422700402001163113 +M520200711111116704119860619WTTTY@ZPZ22222122222210112111118060000 +M520200711111116704120080522WTTTBT@B9222221122222 0422061 0000 +M520200711111116704120060715WTTT0ZT9P222221222222 0422071 0000 +M42020071111111683522700406761163113 +M520200711111116835119850512WTTT#@W#@22222122222210112121100000000 +M520200711111116835120080106WTTTPWZY@222221222222 0422051 0000 +M520200711111116835120040101WTTT0Y#09222221122222 0422101 0000 +M42020071111111689222700402581162113 +M520200711111116892119790801WTTTYW@PZ12222222222230112111100001480 +M520200711111116892120160116WTTTPWWY@122222222222 0422981 0000 +M520200711111116892120041119WTTTYYTT@122222122222 0422091 0000 +M42020071111111778321700406831193113 +M520200711111117783119820502WTTTPWY@Y12222222222210112112100000879 +M520200711111117783120060714WTTTY9WW@122222122222 0422071 0000 +M520200711111117783120030823WTTT#YW0@122222122222 0422101 0000 +M42020071111111799720900400501161113 +M520200711111117997119860115WTTT0#TYZ22212222222210112111115400000 +M520200711111117997120160801WTTT#PZZ9222222222222 0422981 0000 +M42020071111111801520000403721121113 +M520200711111118015119840107WTTTY0W@P22222222222220112121118960000 +M520200711111118015120130703WTTTPPY@#222222222222 0422981 0000 +M42020071111111801820900406421162123 +M520200711111118018119770815WTTTYBYPW22222222222210112112118380000 +M520200711111118018120140701WTTTY@ZYT222122122222 0422981 0000 +M520200711111118018120080101WTTT#Y0BW222222222222 0422062 0000 +M520200711111118018120040501WTTTY@9#B222222122222 0422092 0000 +M42020071111111805622400401011161113 +M520200711111118056119720701WTTT#T9Y@12222222222210112121117640000 +M520200711111118056120110509WTTTPW9TZ122221122222 0422031 0000 +M42020071111111834521100406001193123 +M520200711111118345119950119WTTT090#922222222222210112112121450000 +M520200711111118345120161115WTTT#9@BT222222122222 0422981 0000 +M42020071111111857920000403181123113 +M520200711111118579119620601WTTT0#TT#22222112222230112121100000928 +M520200711111118579120110726WTTT09#0T122221222222 0422021 0000 +M42020071111111864220000403551163113 +M520200711111118642119830614WTTTYZ@0Z22222122222210112121125080000 +M520200711111118642120110602WTTT##YY9222221222222 0422031 0000 +M42020071111111870320600405341163113 +M520200711111118703119870619WTTTP90PZ12222222222221012121140000000 +M520200711111118703120080521WTTTPYZZ@122222122222 1022061 0647 +M520200711111118703120040121WTTT#BW#9122222122222 1022091 0000 +M42020071111111885120600405471192113 +M520200711111118851119970701WTTT0PZYP12222122222210112111119440000 +M520200711111118851120150714WTTTP9P#Z122222222222 0422981 0000 +M42020071111111886820600401981161113 +M520200711111118868119920514WTTTY0WBB12222222222210112121121020000 +M520200711111118868120150503WTTT#0BWB222222222222 0422981 0000 +M520200711111118868120110501WTTT0YY0Z122222122221 0422031 0813 +M520200711111118868120100501WTTTY9ZBB122222122222 0422041 0100 +M42020071111111888820600401981013113 +M520200711111118888119940513WTTT#WZWP22212222222210112081125400000 +M520200711111118888120160719WTTTY#ZTP222222222222 0422981 0000 +M42020071111111910021400400351123123 +M520200711111119100119750716WTTTP99##22212222222210112111100000849 +M520200711111119100120050821WTTTYW#WB122222122222 0422081 0000 +M42020071111111916022700403941163113 +M520200711111119160119930706WTTT#YWPP22212222222210112131123140000 +M520200711111119160120190707WTTT###YP222222122222 0422981 0000 +M42020071111111916421700403151162113 +M520200711111119164119950821WTTT#Z9@Y22222122222210112121119560000 +M520200711111119164120140118WTTT0YT#T122221122222 0422981 0000 +M42020071111111922522700400681161113 +M520200711111119225119930615WTTT#@#@922212222222210112081125670000 +M520200711111119225120120112WTTTYZT#T122122122222 0422011 0000 +M42020071111111942222700400441122123 +M520200711111119422119890714WTTTYP0@Y22222122222210112111112550725 +M520200711111119422120180721WTTTYBY@@222122122222 0422981 0000 +M42020071111111966021100401181123113 +M520200711111119660119890612WTTTY9T9P22122222222210112081100001035 +M520200711111119660120130715WTTT##PT@221222122222 0422981 0000 +M520200711111119660120080701WTTTBTT90221222122222 0422051 0000 +M42020071111111966722400401281162113 +M520200711111119667119870506WTTT#09T@22212222222210112141134160000 +M520200711111119667120160113WTTTPZW0T222122122222 0422981 0000 +M520200711111119667120160113WTTTPY@YY222122222222 0422981 0000 +M520200711111119667120090723WTTTPY99W222122122222 0422041 0000 +M42020071111111978121100406001123113 +M520200711111119781119820707WTTT##TWZ12222122222210112112100000878 +M520200711111119781120150809WTTTPZP@Z122221122222 0422981 0000 +M520200711111119781120091106WTTTY#PPT122222222222 0422041 0000 +M42020071111111997520900401031121113 +M520200711111119975119910803WTTT0@YY#22212222222210112111112310817 +M520200711111119975120200501WTTTY0PZ@222122222222 0422981 0000 +M520200711111119975120170707WTTT#YY9P222122122222 0422981 0000 +M520200711111119975120100515WTTT#90#B222122222222 0422031 0000 +M42020071111112024920000403271163113 +M520200711111120249119841121WTTT0@9B@22222112222220212111125540000 +M520200711111120249119830518WTTTYTW9Z22222222222220112111100000797 +M520200711111120249120140109WTTTPT#@0222221122222 0422981 0000 +M520200711111120249120050719WTTTY##W@222221222222 0422081 0000 +M42020071111112052720900403031163113 +M520200711111120527119930507WTTTPPT@Z22212222222210112111111960000 +M520200711111120527120150714WTTTY@@TY222122122222 0422981 0000 +M42020071111112054820900406741162113 +M520200711111120548119820726WTTT0#WYZ22212222222210112121121920000 +M520200711111120548120160126WTTTPW0@9222122122222 0422981 0000 +M520200711111120548120041115WTTTYTPTZ222122122222 0422091 0000 +M42020071111112081120300401961163113 +M520200711111120811119890502WTTTPB#9@22222122222220112111116620000 +M520200711111120811120160115WTTT#B0YB222222222222 0422981 0000 +M520200711111120811120070721WTTT#TY@@222221222222 0422061 0000 +M42020071111112083221100403821013113 +M520200711111120832119770721WTTTYWBWZ12222222222210112121126000000 +M520200711111120832120020815WTTTYYT#P122222222222 0422111 0000 +M42020071111112086721400400351161113 +M520200711111120867119970806WTTTPW#Z@22212212222211012111113770000 +M520200711111120867119940102WTTTPBPP022212222222210112111121380000 +M520200711111120867120170118WTTTYB#PZ222122222222 0422981 0000 +M520200711111120867120130108WTTT0#Z9W222122122222 0422981 0000 +M520200711111120867120130106WTTTP#0@W222122122222 0422011 0000 +M520200711111120867120110601WTTT0#BY0222122222222 0422031 0000 +M520200711111120867120091101WTTT0Y#TY222122122222 0422041 0000 +M42020071111112093520000404151123113 +M520200711111120935119800121WTTT0ZB9B22222122222210112121121000000 +M520200711111120935120050513WTTTPYW@Z222221122222 0422091 0000 +M42020071111112169321100406001123113 +M520200711111121693119850716WTTTY##TW12222222222220212112200000879 +M520200711111121693119741121WTTTP9YT012222212222220112112223050000 +M520200711111121693120180822WTTT0WPZP122222222222 0422981 0000 +M520200711111121693120081113WTTT#ZYPY122222222222 0422052 0000 +M520200711111121693120050618WTTT##9PP122222222222 0422092 0000 +M520200711111121693120030103WTTT#W0B#122222222222 0422102 0000 +M42020071111112191321400406091123113 +M520200711111121913119900719WTTTPBP@@22222122222210112111119090917 +M520200711111121913120140119WTTT#@0BZ222221122222 0422981 0000 +M42020071111112195320600405471122113 +M520200711111121953119720502WTTT00Z9012222222222210112081123800910 +M520200711111121953120130119WTTT0YBW0122222222222 0422011 0000 +M520200711111121953120040715WTTTPW@BY122222222222 0422091 0000 +M42020071111112232121700402381163113 +M520200711111122321119800716WTTT0Z@WB12222222222210112121128140000 +M520200711111122321120060115WTTTY@P#B122222222222 0422071 0000 +M520200711111122321120040126WTTTP#TPZ122222122221 0422091 0897 +M520200711111122321120030121WTTTY#0#P122222222222 0422111 0000 +M42020071111112233621100404001123113 +M520200711111122336119860606WTTTPPP@@22222122222250112141100000861 +M520200711111122336120110119WTTTYW#@Z222221122222 0422021 0000 +M520200711111122336120100601WTTT#BWB#222221122222 0422041 0000 +M42020071111112237220000405421162123 +M520200711111122372119690818WTTTY0YW#12222222222250112131127200000 +M520200711111122372120040512WTTT09@0@222122222222 0422101 0000 +M42020071111112240320000404271161113 +M520200711111122403119860602WTTT09ZZY12222222222210112121113200000 +M520200711111122403120150112WTTTY9#@W222222222222 0422981 0000 +M520200711111122403120030701WTTTYWWPP122222122222 0422101 0754 +M42020071111112263520500406931162113 +M520200711111122635119750603WTTTYB##Z22222122222210112111123530000 +M520200711111122635120050615WTTT0TY9@222221222222 0422091 0000 +M520200711111122635120021103WTTT0TPZ9222221122222 0422111 0000 +M42020071111112287821700404101123113 +M520200711111122878119970703WTTT00@TY22222122222210112081100000918 +M520200711111122878120171126WTTT0PB9#222222222222 0422981 0000 +M42020071111112290020600402031991113 +M520200711111122900119850122WTTT#9YZ912222212222250112121130320000 +M520200711111122900120100715WTTTPY09@122222222222 0422031 0000 +M520200711111122900120080621WTTTPPT9T122222222222 0422061 0000 +M520200711111122900120060501WTTT#T@@#122222222222 0422071 0000 +M42020081111111126021100406001163113 +M520200811111111260219760123WTTTP@0YP12222222222220212113220030000 +M520200811111111260119680518WTTTYWZB@12222212222220112112124160000 +M520200811111111260120130623WTTT#ZY0B122222222222 0422013 0000 +M520200811111111260120070126WTTT0Z@TY122222122222 0422072 0000 +M520200811111111260120050112WTTT#BWPB122222222222 0422082 0000 +M42020081111111126921700405821163113 +M520200811111111269119800115WTTT##ZTY22222122222250112111138130000 +M520200811111111269120120701WTTTBTTBT222121122222 0422021 0000 +M520200811111111269120090708WTTT09B00222121222222 0422051 0000 +M520200811111111269120070519WTTTP#ZYB222121122222 0422061 0000 +M520200811111111269120070519WTTTPB009222121122221 0422061 0897 +M42020081111111142022700403611163113 +M520200811111111420119860515WTTTPBBW#22222122222210112111128770000 +M520200811111111420120080519WTTT#Y999222221222222 0422051 0000 +M42020081111111142621700401441013123 +M520200811111111426119910822WTTT009WW22222122222210112111126680000 +M520200811111111426120190618WTTTP#WTP222222122222 0422981 0000 +M520200811111111426120160118WTTTP0BYT222221122222 0422981 0000 +M42020081111111151021700406571163123 +M520200811111111510119650801WTTT0PY0922212222222230112111141170000 +M520200811111111510120030106WTTTYYYY0222122122222 0422111 0000 +M42020081111111178720600402981163113 +M520200811111111787119880614WTTTYZWYW22222122222210112131142250000 +M520200811111111787120160623WTTT#W9T@122222122222 0422981 0000 +M520200811111111787120110807WTTT#PT#@122222122222 0422021 0000 +M520200811111111787120100816WTTT#00TW222221222222 0422031 0000 +M42020081111111179620000404271193113 +M520200811111111796119730106WTTT#TW@Y22122212222210112111131550000 +M520200811111111796120090608WTTTYWTB#221222222222 0422051 0000 +M520200811111111796120040813WTTT#0ZY9221222122222 0422091 0000 +M42020081111111184722700400671991113 +M520200811111111847119900518WTTTY#T#912222222222210112121128990000 +M520200811111111847120120119WTTT#0#ZZ122222222222 0422011 0000 +M520200811111111847120080121WTTTY9YPP122222222222 0422051 0000 +M42020081111111185620900402921012113 +M520200811111111856119870506WTTTY9@B012212222222210112121119910000 +M520200811111111856120070526WTTTPB0PB222122222222 0422061 0157 +M42020081111111193820600402031161113 +M520200811111111938119840119WTTT0B@@922222121222220112121134490613 +M520200811111111938120100712WTTTY0WW@122222222222 0422041 0000 +M520200811111111938120080801WTTTP0P#Z122222222222 0422051 0000 +M520200811111111938120030506WTTT0@9W9122222222222 0422111 0000 +M42020081111111194620600401421163113 +M520200811111111946119910101WTTTPP90T22222122222210112131122900000 +M520200811111111946120100515WTTT0B0PT222221122222 0422031 0000 +M42020081111111220420600401421162113 +M520200811111112204119911101WTTTPW#WB22222122222250112121121390000 +M520200811111112204120190121WTTTYPP#W122222122222 0422981 0000 +M520200811111112204120110114WTTTP@TY#122222122222 0422021 0000 +M520200811111112204120090101WTTTP0W@9122221122222 0422051 0000 +M42020081111111224820900406601163113 +M520200811111112248119890503WTTT#9#BW22122222222210112081133930000 +M520200811111112248120061123WTTT#TWWT221222122222 0422071 0000 +M520200811111112248120050615WTTT0Y@9B221222222222 0422091 0000 +M42020081111111226820600401421163113 +M520200811111112268119790515WTTTPPZZT22212222222210112111136380000 +M520200811111112268120120703WTTTPBPT#222122222222 0422021 0000 +M520200811111112268120080603WTTTP#@YT222122222222 0422061 0000 +M42020081111111231622700402001161113 +M520200811111112316119820818WTTTPP#BB12222222222210112121124990000 +M520200811111112316120090609WTTT#P0TT122222222222 0422051 0000 +M520200811111112316120070715WTTT#ZBZ#122222122222 0422071 0000 +M520200811111112316120030809WTTT0T#W9122222122221 0422101 0835 +M42020081111111233120600400871163123 +M520200811111112331119940113WTTTYTZ0922222122222220212111200000000 +M520200811111112331119890802WTTTP0@Z#22222112222220112121236290000 +M520200811111112331120180715WTTT0YP90222222222222 0422981 0000 +M520200811111112331120150619WTTT#@BY#222221222222 0422981 0000 +M42020081111111285620000404271163123 +M520200811111112856119810501WTTT#W#BP22122222222250112111132270000 +M520200811111112856120170503WTTT09P#Y222222222222 0422981 0000 +M520200811111112856120090501WTTT#T0TP221222222222 0422041 0399 +M42020081111111286921100406541163113 +M520200811111112869119680621WTTTP#P9Y22222112222220112111131750000 +M520200811111112869120080101WTTT0#@PZ222222222222 0422061 0000 +M520200811111112869120060719WTTT0W0Y0222221222222 0422081 0000 +M42020081111111291222700403941163113 +M520200811111112912119670801WTTTYY9WB22212222222210112111121100000 +M520200811111112912120050621WTTT0Z9T9222122222222 0422091 0000 +M520200811111112912120020515WTTTYP00W222122222222 0422111 0000 +M42020081111111294620600402661993113 +M520200811111112946119840106WTTTYYZ#022222112222210112111141420000 +M520200811111112946120140615WTTT0##Z@222222122222 0422981 0000 +M520200811111112946120100109WTTT#BZZY222222222222 0422041 0000 +M520200811111112946120050506WTTT0W#BW222222222222 0422081 0000 +M42020081111111295720900400391162113 +M520200811111112957119770101WTTT#Z#P912212222222230112081130910000 +M520200811111112957120040101WTTT0Y##P122222122222 0422101 0000 +M42020081111111310520000406951163113 +M520200811111113105119660613WTTTPZ#0Z22222122222220112121121200000 +M520200811111113105120060603WTTTY#0BB222221122222 0422081 0000 +M520200811111113105120031112WTTT#Z#9B222221122222 0422101 0000 +M42020081111111311421100401181012113 +M520200811111113114119800706WTTT###P022122222222210112111126240000 +M520200811111113114120060107WTTTP0B00221222222222 0422071 0000 +M520200811111113114120020808WTTTY#Y0B221222122222 0422111 0000 +M42020081111111318621100401691123123 +M520200811111113186119860606WTTTPZ@0T22222122222210112121124190000 +M520200811111113186120161123WTTT##TPB222222222222 0422981 0000 +M520200811111113186120030108WTTT#09WP222221122222 0422101 0000 +M42020081111111327620900401881163113 +M520200811111113276119950515WTTTYW09022222222222210112111111520000 +M520200811111113276120200502WTTT0P@BY222222222222 0422981 0000 +M42020081111111328820900400501163123 +M520200811111113288119880101WTTT0Y0Y#22212222222210112111135550000 +M520200811111113288120120102WTTTPZTTY122122222222 0422011 0000 +M520200811111113288120050109WTTTP99Y0122221122222 0422091 0000 +M42020081111111346320900402921161113 +M520200811111113463119820118WTTT0Z00022212222222210112121120560000 +M520200811111113463120150703WTTTPZT9P222122222222 0422981 0000 +M520200811111113463120130121WTTT#B#Y@222122122222 0422011 0000 +M520200811111113463120070119WTTTYYY0Z222122222222 0422071 0000 +M520200811111113463120060114WTTT#TBWP222122222222 0422081 0000 +M42020081111111346722700400671161113 +M520200811111113467119800616WTTTYTYZT22222122222210112121122550000 +M520200811111113467120101101WTTTY@@TT222222122222 0422031 0000 +M520200811111113467120060106WTTT#ZB0#222221122222 0422081 0000 +M42020081111111362722700402401013113 +M520200811111113627119800719WTTT0@TY022222122222210112131112570000 +M520200811111113627120150115WTTT#WZ9Z222221222222 0422981 0000 +M42020081111111379321700400511163113 +M520200811111113793119880821WTTT0@@B#22222122222210112131126310000 +M520200811111113793120110706WTTT0@TZZ222222122222 0422021 0000 +M520200811111113793120070612WTTT0Y9BT222221122222 0422071 0000 +M42020081111111387020000405351163123 +M520200811111113870119800114WTTTPPP9#22212222222250112111118620000 +M520200811111113870120150508WTTTPZB#Z222122122221 0422981 0586 +M520200811111113870120130106WTTTYBY@W222122122222 0422981 0000 +M520200811111113870120060715WTTTP@@Z0222122122221 0422071 0777 +M520200811111113870120030122WTTTYZ@WY222122222222 0422101 0000 +M42020081111111412621700401121013113 +M520200811111114126119830121WTTTYB@@B22212222222210112121132930000 +M520200811111114126120100501WTTT#@##T222222222222 0422031 0000 +M520200811111114126120050623WTTTPYZW#222122222222 0422091 0000 +M42020081111111425421200404291161113 +M520200811111114254119890519WTTT#9TTT22212222222250112131126590000 +M520200811111114254120170612WTTTYBZYT222222222222 0422981 0000 +M520200811111114254120101101WTTT0ZYYB222122222222 0422031 0000 +M42020081111111432520500402421163123 +M520200811111114325119790719WTTT0#0TZ22212222222210112111120670000 +M520200811111114325120180108WTTT0W0ZB222122222222 0422981 0000 +M520200811111114325120150616WTTTPPYZ0222222122222 0422981 0000 +M520200811111114325120130602WTTT0P#@0222122122222 0422011 0000 +M42020081111111444620000403951163113 +M520200811111114446119680116WTTT#PPW922212212222210112111128760000 +M520200811111114446120060507WTTTPB@0T222122122222 0422081 0000 +M42020081111111453120900403031161123 +M520200811111114531119840702WTTT#W9@#22222122222210112121116500000 +M520200811111114531120170718WTTT0B@##222222222222 0422981 0000 +M520200811111114531120090701WTTTBTTT@222222222222 0422041 0000 +M42020081111111454421100401181162113 +M520200811111114544119840521WTTTY@Z#P12222122222210112121132270000 +M520200811111114544120181119WTTT0W9BB122221222222 0422981 0000 +M520200811111114544120090503WTTTP9@##122221122222 0422041 0000 +M42020081111111461721400406791163113 +M520200811111114617119950107WTTTY9@0P22222122222210112081117000000 +M520200811111114617120170819WTTTY@WP9222221222222 0422981 0000 +M42020081111111464920000404271993113 +M520200811111114649119720126WTTTY@YYZ22122222222210112121131890000 +M520200811111114649120160701WTTTPWZTY221222122222 0422981 0000 +M520200811111114649120130823WTTTPYZB#221222122222 0422981 0000 +M42020081111111475020900401881162113 +M520200811111114750119800522WTTT0PYY#22212222222210112121142480000 +M520200811111114750120120514WTTTPWT#@222122122222 0422021 0000 +M520200811111114750120120514WTTT#Z0Y0222122222222 0422021 0000 +M520200811111114750120020706WTTTPY0ZT222122222222 0422111 0000 +M42020081111111479020900406131163123 +M520200811111114790119850601WTTTPBW9B22222222222210112121130030000 +M520200811111114790120160101WTTTY#TTP222222222222 0422981 0000 +M520200811111114790120090503WTTTYZ@PP222222122222 0422041 0000 +M520200811111114790120030107WTTT#0BBW222122122222 0422101 0000 +M42020081111111496421400406791163113 +M520200811111114964119870626WTTTYZZ#P22222122222210112121126560000 +M520200811111114964120100615WTTT#Y9#Y222222222222 0422041 0000 +M520200811111114964120080614WTTTYPPY0222221222222 0422061 0000 +M520200811111114964120050626WTTT#W@P0222221122222 0422091 0000 +M42020081111111513322700403941993113 +M520200811111115133119980103WTTT0P0PZ22222122222210112081122530000 +M520200811111115133120170107WTTTY9B#@222121222222 0422981 0000 +M42020081111111514020000400311163113 +M520200811111115140119920508WTTTYBTP#22222122222210112131123860000 +M520200811111115140120170109WTTT0T@W0222221122222 0422981 0000 +M42020081111111517520600405471162123 +M520200811111115175119881121WTTT#9#B@12222222222210112111113890000 +M520200811111115175120170715WTTTP99WW122222122222 0422981 0000 +M520200811111115175120120718WTTTP#0YT122222222222 0422021 0000 +M520200811111115175120101112WTTT#Y#WT122222222222 0422031 0000 +M520200811111115175120060601WTTTYTBYW122222222222 0422083 0000 +M42020081111111519020600401981162113 +M520200811111115190119950606WTTTPP00P22222122222210112081113670000 +M520200811111115190119900626WTTT0ZYB012222112222211012121132790000 +M520200811111115190120150501WTTT#Z@PW122222122222 0422981 0000 +M42020081111111521920900402621161113 +M520200811111115219119810518WTTT#W@@Y22212222222220112131122050000 +M520200811111115219120160826WTTT#0T0#222122222222 0422981 0000 +M520200811111115219120110123WTTTYZ#YY222122122222 0422031 0149 +M520200811111115219120090115WTTT##W@B222122122221 0422041 0796 +M520200811111115219120080609WTTTPPTWP222122222222 0422061 0149 +M520200811111115219120060101WTTTPZW99222122222222 0422071 0149 +M42020081111111523320900400501161113 +M520200811111115233119860623WTTT0ZY@T12222222222210112111134120000 +M520200811111115233120080512WTTT0Y0@T122222222222 0422051 0000 +M520200811111115233120080512WTTT#0Z9T122222222222 0422051 0000 +M42020081111111525320600405171162113 +M520200811111115253119610715WTTTP@99P12222222222210122111133900000 +M520200811111115253120120114WTTTP##TP122222222222 0622011 0000 +M520200811111115253120110107WTTT0T@BZ122222222222 0622031 0000 +M42020081111111549322400405611162113 +M520200811111115493119660713WTTT0BTB022212222222230112111118750000 +M520200811111115493120060521WTTT0W9B#222122122222 0422081 0000 +M520200811111115493120021126WTTT#BYPY222122122222 0422111 0000 +M42020081111111560022400401011162113 +M520200811111115600119931118WTTTYYBWZ22222122222210112111122750000 +M520200811111115600120130106WTTT0Y@0P222221122222 0422011 0000 +M42020081111111562721700404101163113 +M520200811111115627119900113WTTT#Z#TB22222122222210112121123430000 +M520200811111115627120160512WTTTYB9TZ222221222222 0422981 0000 +M520200811111115627120070523WTTT0T@TZ222221122222 0422071 0000 +M42020081111111573822700405241013113 +M520200811111115738119940101WTTTY@WPW22222122222220212121112300000 +M520200811111115738119940119WTTT#T#YZ22222112222220112081123690000 +M520200811111115738120160103WTTTP9#0W222221222222 0422981 0000 +M42020081111111582820600405471163113 +M520200811111115828119820119WTTT#PZBB12222222222210112111136400000 +M520200811111115828120030607WTTT#9T##122222222222 0422111 0000 +M42020081111111590922400406121163113 +M520200811111115909119741107WTTTP0P9W22212222222230112121126310000 +M520200811111115909120080123WTTTY#BT@122122122222 0422061 0000 +M520200811111115909120060726WTTT0B@BB222122122222 0422071 0000 +M42020081111111605622700402801013113 +M520200811111116056119930106WTTTPWYW022222222222210112111122650000 +M520200811111116056120150722WTTT#BBZW222122222222 0422981 0000 +M520200811111116056120140116WTTTYPTTT222122122222 0422981 0000 +M42020081111111634622700402321013123 +M520200811111116346119830619WTTTPZW@Z22222122222210112111118810000 +M520200811111116346120070709WTTT0Z0TP222221222222 0422061 0000 +M520200811111116346120051103WTTTYW#W@222221222222 0422081 0000 +M520200811111116346120030501WTTT#P#WP222221122222 0422101 0000 +M42020081111111639821100401181161113 +M520200811111116398119790714WTTT#0YY@12222222222230112121123570000 +M520200811111116398120110115WTTTYZTY#222222222222 0422021 0000 +M42020081111111649020000404271162123 +M520200811111116490119920526WTTTYWWP#12222222222210112121130990000 +M520200811111116490120130709WTTT##YW#222222222222 0422981 0000 +M520200811111116490120100118WTTT0WBPP222222122222 0422031 0000 +M520200811111116490120080612WTTT#Z#0#222222222222 0422061 0000 +M42020081111111657821700400781163113 +M520200811111116578119780612WTTTYWY9@22222122222230112111128690000 +M520200811111116578120080802WTTT#WBZP122221122222 0422051 0000 +M42020081111111674021100404791993113 +M520200811111116740119850703WTTTY0TW@22222122222210112111131850000 +M520200811111116740120190726WTTTP9P9W222222122222 0422981 0000 +M520200811111116740120171116WTTT0ZYY9222222122222 0422981 0000 +M42020081111111681520500404091161113 +M520200811111116815119760515WTTT#T#TB22222122222250112121126930000 +M520200811111116815120151113WTTTP@BY0222222222222 0422981 0000 +M42020081111111691620900403031013113 +M520200811111116916119850626WTTT#P0B#22212222222210112131130460000 +M520200811111116916120140602WTTT00@B#222222222222 0422981 0000 +M520200811111116916120080503WTTT#0TPY222122122222 0422051 0000 +M42020081111111696021100401691163123 +M520200811111116960119960121WTTTY9@TY12222122222210112121122320000 +M520200811111116960120161121WTTT#T0P#122222222222 0422981 0000 +M42020081111111696920600402121161113 +M520200811111116969119780726WTTT#@BYW12222222222250112121125650714 +M520200811111116969120180721WTTT#00@T222222222222 0422981 0000 +M520200811111116969120140721WTTTP@#TT222222222222 0422981 0000 +M520200811111116969120110606WTTT#0T@@222222222222 0422031 0000 +M520200811111116969120081108WTTTYYYYT222122122222 0422051 0000 +M520200811111116969120030121WTTT0Z#9Z122222222222 0422111 0000 +M42020081111111708821100401691163123 +M520200811111117088119841126WTTTPWYB022122222222210112121131150000 +M520200811111117088120060522WTTT#00Y9222222122222 0422071 0000 +M520200811111117088120020501WTTT#TP@T221222222222 0422111 0000 +M42020081111111723020600405171013113 +M520200811111117230119820115WTTT#9@YB12222222222230112111133330000 +M520200811111117230120060501WTTT0ZPW0122222122222 0422071 0000 +M520200811111117230120040103WTTT#0WTY122222222222 0422091 0000 +M42020081111111756221700400981993113 +M520200811111117562119841122WTTT0Y@@Z22222222222210112111125150000 +M520200811111117562120171116WTTT#@#@0222222122222 0422981 0243 +M520200811111117562120160113WTTTYWYYW222221222222 0422981 0000 +M42020081111111759721400400351123113 +M520200811111117597119840815WTTTYT##P22222222222230122112100000925 +M520200811111117597120160112WTTT#9B@#222221122222 0422981 0000 +M520200811111117597120090106WTTT09PTW222221122222 0422042 0000 +M42020081111111759820600403391162123 +M520200811111117598119910108WTTTPWP#P12222122222210112141132620000 +M520200811111117598120190616WTTT0T9P9122221122222 0422981 0000 +M520200811111117598120170119WTTTPBT#B122221222222 0422981 0000 +M520200811111117598120110823WTTT#9TW9122221222222 0422021 0000 +M42020081111111777521100405951163113 +M520200811111117775119830615WTTTY0TYZ22222122222210112111143520000 +M520200811111117775120150815WTTTPYY@Y122221122222 0422981 0000 +M520200811111117775120110723WTTTPTYWW122221222222 0422031 0000 +M520200811111117775120040526WTTT#0#ZW222221122222 0422101 0000 +M42020081111111792222700402001013113 +M520200811111117922119820702WTTTPYWZP22122222222210112111131340000 +M520200811111117922120090521WTTTYZT9Z221222222222 0422041 0000 +M520200811111117922120070715WTTTYZPPB221222222222 0422071 0000 +M42020081111111793120600405471013113 +M520200811111117931119911123WTTTYBP@W22212122222210112111137560000 +M520200811111117931120180123WTTTPWW@@222121122222 0422981 0000 +M520200811111117931120180123WTTTPZWYW222121222222 0422981 0000 +M520200811111117931120120107WTTT0Z@99222121122222 0422011 0000 +M42020081111111802822400406121122123 +M520200811111118028119790506WTTT#0W0#22212222222210112121100000984 +M520200811111118028120070109WTTTP9BP0222122222222 0422071 0000 +M42020081111111803420600405171163113 +M520200811111118034119840121WTTT#P#0P12222122222230112111120800000 +M520200811111118034120100102WTTTY#Y#0122222222222 0422041 0000 +M520200811111118034120050813WTTT#0#TT122222122222 0422081 0000 +M42020081111111819521100406001163113 +M520200811111118195119770523WTTT0P@W012222222222210112141130330000 +M520200811111118195120070101WTTTPTW#T222222122221 0422061 0000 +M42020081111111850621700405821163113 +M520200811111118506219770123WTTT#Y@9922222222222220212113200000000 +M520200811111118506119740115WTTTPZB@Z22212212222220112111119930000 +M520200811111118506120170806WTTT#WWTW222122222222 0422981 0000 +M520200811111118506120100716WTTTP0ZY9222122222222 0422043 0000 +M520200811111118506120060119WTTTPW9P0222122122222 0422073 0000 +M42020081111111854020300405931163113 +M520200811111118540119860601WTTT#YYBZ22222112222210112111119000000 +M520200811111118540120070112WTTT0WBT#122221222222 0422071 0000 +M42020081111111861922200402491163113 +M520200811111118619119750115WTTT#B#W#22222112222220112111137720000 +M520200811111118619120110102WTTT0WB0P222221122222 0422031 0000 +M520200811111118619120070622WTTT#YBTZ222221222222 0422071 0000 +M520200811111118619120040726WTTT#@@BZ222221122222 0422101 0000 +M42020081111111874220900404431123123 +M520200811111118742119931103WTTT#009Z12222222222210112082116680000 +M520200811111118742120160822WTTTPBBWZ222122122222 0422981 0000 +M42020081111111881621700404611993113 +M520200811111118816119690706WTTT#W##@22212222222250112141149750000 +M520200811111118816120040106WTTT090Y@222122222222 0422091 0000 +M42020081111111895421100406391163113 +M520200811111118954119920509WTTT0@0PY22222222222210112081131270000 +M520200811111118954120180123WTTT#@@Y@122221222222 0422981 0000 +M520200811111118954120120622WTTT#TWY@222222122222 0422021 0000 +M42020081111111897321400406791162113 +M520200811111118973119870818WTTTY0#WB22212222222210112131139980000 +M520200811111118973120160121WTTT0Y#YB222222222222 0422981 0000 +M520200811111118973120160121WTTT0#BY@222222222222 0422981 0000 +M520200811111118973120090126WTTT00#ZB222122222222 0422051 0000 +M42020081111111899421700404401123123 +M520200811111118994119850116WTTTYZ00Y22222122222210112131100000881 +M520200811111118994120190123WTTTY9Z0Z222222222221 0422981 0859 +M520200811111118994120061109WTTT0#00Z222222122222 0422071 0000 +M42020081111111959521100403821163113 +M520200811111119595119800114WTTTY#W9912222122222210112112132770000 +M520200811111119595120181114WTTTY9@@B122222222222 0422981 0000 +M520200811111119595120041119WTTTP0BWY222222122222 0422092 0000 +M42020081111111965520900401881123113 +M520200811111119655119970126WTTT###@T22212222222210112081121670000 +M520200811111119655120180115WTTT0W9@P222122222222 0422981 0000 +M42020081111111992320900403431161113 +M520200811111119923119811102WTTT#ZZPP22212222222210112131139350000 +M520200811111119923120140701WTTTYBP9#222122122222 0422981 0000 +M520200811111119923120100613WTTTP0ZZY222222222222 0422041 0000 +M520200811111119923120040819WTTTPW9Y0222122222222 0422091 0000 +M42020081111111995422700402231193113 +M520200811111119954119990619WTTTPYYTY22222122222210112111126000000 +M520200811111119954120200101WTTT#T#Z#222221122222 0422981 0000 +M42020081111112002822200405781162123 +M520200811111120028119860715WTTT0T90Z22222222222210112131116140000 +M520200811111120028120160112WTTTYP#BZ222221222222 0422981 0000 +M520200811111120028120130721WTTT09P@#222221122222 0422011 0000 +M520200811111120028120130721WTTT#@BPB222221122222 0422011 0000 +M42020081111112004320600405341163113 +M520200811111120043119831101WTTT0TYB#22212222222210112131134030000 +M520200811111120043120111119WTTTPB#ZW222122122222 0422021 0000 +M520200811111120043120070612WTTT#B9#0222122122222 0422071 0000 +M42020081111112010921100406541162113 +M520200811111120109119960119WTTTYW0BY22222222222210112111114360000 +M520200811111120109120160603WTTT#TWT#222222222222 0422981 0000 +M42020081111112013621100406001163113 +M520200811111120136119890518WTTT0P0Y912222222222210112081113350000 +M520200811111120136120160116WTTT0ZBZ#222222122222 0422981 0000 +M520200811111120136120090115WTTT00PT0122222222222 0422041 0000 +M42020081111112032021100404801163113 +M520200811111120320119790112WTTTYY0B#22222112222250112111134140000 +M520200811111120320120050709WTTTP@BZW222221122222 0422081 0000 +M520200811111120320120030721WTTT00YYW222221122222 0422111 0000 +M42020081111112050922700402581163113 +M520200811111120509119860515WTTTP999022222212222210112121119160000 +M520200811111120509120120623WTTTYWYBY222121122222 0422021 0000 +M42020081111112057020500401501163113 +M520200811111120570119860119WTTTYBB#B22222122222210112121120950000 +M520200811111120570120110112WTTT00Y09222221222222 0422031 0000 +M520200811111120570120080719WTTTY@@Z0222221122222 0422061 0000 +M520200811111120570120050521WTTT#Z9#9222221222222 0422081 0000 +M42020081111112057520600401151163123 +M520200811111120575119940507WTTT0@@T012222222222210112111115080000 +M520200811111120575120170113WTTT0#B9P122122122222 0422981 0000 +M520200811111120575120130101WTTTY##P0122122222222 0422011 0000 +M42020081111112058221700405121162113 +M520200811111120582119910619WTTTYPZ#912222222222210112131123350000 +M520200811111120582120160701WTTTYW#YZ222222122222 0422981 0000 +M520200811111120582120150114WTTT#Y#0Z122222122222 0422981 0000 +M520200811111120582120140601WTTT#@9PP122222122222 0422981 0000 +M520200811111120582120130615WTTTPW909122222222222 0422011 0000 +M42020081111112062820000404861162113 +M520200811111120628119830102WTTTPZ@TY12222222222210112131143810000 +M520200811111120628120190715WTTT0@T@W222222222222 0422981 0000 +M520200811111120628120080121WTTT0@P9W122122122222 0422051 0000 +M520200811111120628120070801WTTTPWZ@P122122122222 0422061 0000 +M520200811111120628120060826WTTTY@9BB122222122222 0422071 0000 +M42020081111112080820000400131161113 +M520200811111120808119790626WTTT0ZZTP22222122222210112131118200000 +M520200811111120808120080601WTTT#WBYP222221122222 0422061 0000 +M520200811111120808120040607WTTT00Y0B222221122222 0422101 0000 +M42020081111112085720600401981162113 +M520200811111120857119810819WTTTPBTB022222122222250112111137200000 +M520200811111120857120080102WTTT#Y#9@122221222222 0422051 0000 +M520200811111120857120050809WTTT#YTZP122221222222 0422081 0000 +M520200811111120857120030519WTTTPBW@Z222221122222 0422111 0000 +M42020081111112112320000400591163113 +M520200811111121123119860502WTTTYW0ZZ12222122222210112121129040000 +M520200811111121123120130701WTTTP@00P122222122222 0422011 0000 +M520200811111121123120060526WTTT09##0122222122222 0422081 0000 +M42020081111112118921100406001163113 +M520200811111121189119890506WTTT0B#BW12222222222210112112100000208 +M520200811111121189120180107WTTTPB099122222122222 0422981 0000 +M520200811111121189120140712WTTTP#ZPW122222222222 0422981 0000 +M42020081111112127621700404101161113 +M520200811111121276119810816WTTTY99#922222112222210112131113030000 +M520200811111121276120160706WTTTPZ90W222221122222 0422981 0000 +M42020081111112142221700404101993113 +M520200811111121422119810119WTTT0YWZP12222222222210112111120570000 +M520200811111121422120080503WTTTYBTW#122222222222 0422051 0000 +M520200811111121422120070601WTTT#PTWT122222122222 0422071 0000 +M42020081111112185221100401461163113 +M520200811111121852119771126WTTT0WY9012222112222210112112117780000 +M520200811111121852120090726WTTT#ZZ@T122222222222 0422052 0000 +M42020081111112194620600403391163113 +M520200811111121946119860706WTTT0P90P22222222222210112111143120000 +M520200811111121946120150719WTTTPZ##Z222222122222 0422981 0000 +M520200811111121946120100101WTTT#0#WW222222122222 0422041 0000 +M520200811111121946120080115WTTT0ZZ09222222122222 0422061 0000 +M520200811111121946120040106WTTT#YB90222222122222 0422101 0000 +M42020081111112204321400405841012113 +M520200811111122043119840102WTTTPTY#W22222122222250112111127730000 +M520200811111122043120130714WTTT0TP00222221222222 0422011 0000 +M520200811111122043120081121WTTTYWY@#222221122222 0422051 0000 +M42020081111112207620900404651163113 +M520200811111122076119860726WTTT#T9BT22212222222210112111129100000 +M520200811111122076120191118WTTTPYBZ@222122122222 0422981 0000 +M520200811111122076120050715WTTT0ZP00222122222222 0422081 0000 +M520200811111122076120040101WTTT#Z##9222122122222 0422101 0000 +M42020081111112223122700402581162113 +M520200811111122231119860603WTTT#9Z0Z12222222222210112121126080000 +M520200811111122231120071115WTTTY#@TY122222222222 0422061 0000 +M520200811111122231120060626WTTTYBT#B122222122222 0422081 0000 +M42020081111112226121700403901163113 +M520200811111122261119800526WTTTPPY#022222122222210112161127800000 +M520200811111122261120130123WTTTPP@B#222221222222 0422981 0000 +M520200811111122261120111109WTTT#9WZW222221122222 0422021 0000 +M42020081111112229021700404201161123 +M520200811111122290119860715WTTT#@#9P12222222222210112111127750000 +M520200811111122290120070621WTTTY@@YT122222122222 0422071 0000 +M520200811111122290120040718WTTT#0@B@122222122222 0422101 0000 +M42020081111112230121700405121163113 +M520200811111122301119690603WTTTYTT#022212222222210112112121380000 +M520200811111122301120110101WTTT##BTZ222122122222 0422021 0000 +M520200811111122301120061109WTTTPZWB0222122122221 0422071 0897 +M42020081111112232822700400671993113 +M520200811111122328119740503WTTTYY9PB12222222222210112131133920000 +M520200811111122328120150108WTTT#W0@Z122222122222 0422981 0000 +M520200811111122328120100101WTTTYBY#T122222122222 0422031 0000 +M42020081111112246920900404651162113 +M520200811111122469119810519WTTT0W#YW22122222222210112122123660000 +M520200811111122469120050102WTTT#@0@T221222222222 0422081 0000 +M42020081111112256720900402621162123 +M520200811111122567119900119WTTT0#9YT12222222222210112131134080000 +M520200811111122567120170619WTTTPPW@T222222222222 0422981 0000 +M520200811111122567120110608WTTT#@@PB122222222222 0422031 0000 +M42020081111112264621700400471163123 +M520200811111122646119791123WTTT#B#B922222122222230112111143330000 +M520200811111122646120140515WTTT0#@P9222221222222 0422981 0000 +M520200811111122646120080507WTTTYWP##222221122222 0422061 0000 +M520200811111122646120080507WTTTPZTB0222221222222 0422061 0000 +M42020081111112282421100406001993113 +M520200811111122824119990606WTTT0Y#BW12222222222210112112114620300 +M520200811111122824120190515WTTTPW0@Y122222222222 0422981 0000 +M42020091111111113722700403611162113 +M520200911111111137119830709WTTT0@Y9012222122222220112121119990000 +M520200911111111137120090506WTTTPT@#@122221122222 0422041 0000 +M520200911111111137120060623WTTT#P0PP122222222222 0422081 0000 +M42020091111111119220000406351163113 +M520200911111111192119830623WTTT0@@TY22212222222210112161127600000 +M520200911111111192120190507WTTT##ZTT222122222222 0422981 0000 +M520200911111111192120160119WTTT00BYZ222122122222 0422981 0000 +M520200911111111192120120601WTTTYWP99222122122222 0422021 0000 +M520200911111111192120060103WTTT0T#Y@222222122222 0422081 0000 +M42020091111111131121700405121013113 +M520200911111111311119870115WTTT#Z@#Y12222222222210112121122920000 +M520200911111111311120090522WTTT0#@TT122222222222 0422041 0000 +M42020091111111133920900401031161113 +M520200911111111339119900608WTTTYPPBZ22212222222210112111130600000 +M520200911111111339120160719WTTTPZB#@222122122222 0422981 0000 +M520200911111111339120130101WTTT0PB0W222122122222 0422011 0000 +M42020091111111134320900403431161113 +M520200911111111343119750719WTTTY#P#Y12222222222210112131126890000 +M520200911111111343120100502WTTTPBYY0122222122222 0422041 0000 +M520200911111111343120081106WTTTPY@9Y222222122222 0422051 0000 +M520200911111111343120030103WTTTP0@#B122222222222 0422101 0000 +M42020091111111140622700400681163113 +M520200911111111406119920601WTTTPTT0W22212222222210112121113320000 +M520200911111111406120190716WTTT0YP#Z222222122222 0422981 0000 +M520200911111111406120120118WTTT0#TWP222122122222 0422021 0000 +M42020091111111147120500402421993113 +M520200911111111471119950101WTTT##YZ#22222122222210112081114730000 +M520200911111111471120200612WTTT#0@9@222221222222 0422981 0000 +M42020091111111166922700404841993113 +M520200911111111669119970113WTTT0Z99922212222222210112131118850000 +M520200911111111669120190115WTTT0T09P222222222222 0422981 0000 +M42020091111111182720900402921163113 +M520200911111111827119850621WTTTY99YT22212222222230112121131200000 +M520200911111111827120100115WTTTY@P0W222122122222 0422031 0000 +M520200911111111827120070716WTTT0P0@T122122122222 0422071 0000 +M520200911111111827120050509WTTTYYTB#122122222222 0422091 0000 +M42020091111111192320900406151163113 +M520200911111111923119900508WTTT0#YZ922212222222210112111117950000 +M520200911111111923120130118WTTTPYZ9Y222122222222 0422981 0000 +M42020091111111258822200400631163113 +M520200911111112588119910519WTTTPWBY#22222122222210112131119250000 +M520200911111112588120150822WTTT0W#9B222222122222 0422981 0000 +M520200911111112588120130818WTTT#TB@#222222122222 0422011 0000 +M520200911111112588120110723WTTT#0@ZB222222122222 0422031 0000 +M42020091111111262821100406001163123 +M520200911111112628119820119WTTTP##0B12222222222210112141119890000 +M520200911111112628120160501WTTTPT@@0122222222222 0422981 0000 +M520200911111112628120140801WTTT0PYZW122221122222 0422981 0000 +M520200911111112628120050708WTTTPYBP9222222122222 0422091 0000 +M42020091111111264822400400881163123 +M520200911111112648119860101WTTTY0#Z922222122222210112131122020000 +M520200911111112648120070507WTTT0@YP@222222122222 0422061 0000 +M42020091111111305421100401691163113 +M520200911111113054119871121WTTTYW9WY21222222222210112111121530000 +M520200911111113054120130707WTTTYYB0#212222122222 0422011 0000 +M520200911111113054120070726WTTTY9ZY@212221222222 0422071 0000 +M42020091111111310121100401461163113 +M520200911111113101119861114WTTTP0@Z@12222222222210112111117100000 +M520200911111113101120150703WTTT#Y0Z@122222222222 0422981 0000 +M520200911111113101120090818WTTT00B9Z122221122222 0422051 0000 +M42020091111111334820600401421163113 +M520200911111113348119830626WTTT#YP0#22212222222210112121123310000 +M520200911111113348120060703WTTT0P0YY222122122222 0422081 0000 +M520200911111113348120060703WTTT#WTW9222122122222 0422081 0000 +M520200911111113348120030114WTTTY9Y@B222122122222 0422101 0000 +M42020091111111358320900401881161113 +M520200911111113583119830101WTTT00W9912222222222230112112121750000 +M520200911111113583120140119WTTTP#BTZ222222222222 0422981 0000 +M520200911111113583120130612WTTT#9Y@W222222222222 0422011 0000 +M42020091111111392420900406601013113 +M520200911111113924119890523WTTT0@TPW22222122222210112081132680000 +M520200911111113924219800621WTTT#Z@9W12222212222220212113200000000 +M520200911111113924120160709WTTTY0@0T222222222222 0422981 0000 +M520200911111113924120160709WTTTP@Y@0222222222222 0422981 0000 +M520200911111113924120100122WTTT09ZYW222222122222 0422031 0000 +M520200911111113924120050106WTTTP00WT122222222222 0422091 0000 +M42020091111111406922700402001163123 +M520200911111114069119950103WTTTP9T#022222122222210112111122690000 +M520200911111114069120200121WTTTYY0P@222222122222 0422981 0000 +M520200911111114069120160513WTTT0#TYY222221222222 0422981 0000 +M42020091111111410020300404901163123 +M520200911111114100119810815WTTTPYP0@22222122222250112111122030000 +M520200911111114100120160702WTTTYTBY#222221122222 0422981 0000 +M42020091111111410921100401461161113 +M520200911111114109119900112WTTTY#@YB12222122222210112121121440000 +M520200911111114109120100802WTTTYP#WT122222122222 0422031 0000 +M42020091111111413322700402001163113 +M520200911111114133119710807WTTT#T9T922222122222220112111121450000 +M520200911111114133120100615WTTTPPZPP222221222222 0422041 0000 +M520200911111114133120060123WTTT090WT222221122222 0422071 0000 +M520200911111114133120040501WTTT09BTT222221122222 0422091 0000 +M42020091111111423121700405121163113 +M520200911111114231119791126WTTT0PZZ012222222222230112111127400000 +M520200911111114231120100512WTTT#@##P222222122222 0422041 0000 +M42020091111111430721100402441161113 +M520200911111114307119860513WTTTY#WZB22222122222210112131119490000 +M520200911111114307120110726WTTTY@99Z222222222222 0422031 0000 +M42020091111111472721700402341163113 +M520200911111114727119910103WTTTP#TY#12222122222220112111120370000 +M520200911111114727120180818WTTTY0#PZ122222222222 0422981 0000 +M520200911111114727120120115WTTT00009122222222222 0422011 0000 +M42020091111111487020600401981993113 +M520200911111114870119770501WTTT0Z90@22122222222210112111132980000 +M520200911111114870120090703WTTT0ZBTB122222222222 0422051 0000 +M520200911111114870120090703WTTTY09Z0221222122222 0422051 0000 +M520200911111114870120050126WTTTYW@PW221222222222 0422091 0000 +M520200911111114870120030719WTTTYBW#B221222222222 0422111 0000 +M42020091111111531220900403031011113 +M520200911111115312119910102WTTT0PZZB22212222222210112121121510000 +M520200911111115312120130601WTTTPB9@W222122122222 0422011 0000 +M42020091111111532120000406821163113 +M520200911111115321119780115WTTTP90@#22212222222230112122126000000 +M520200911111115321120080615WTTT099WW222221122222 0422061 0000 +M520200911111115321120030501WTTTP@T#T222122222222 0422101 0000 +M42020091111111543221200402571163113 +M520200911111115432119950101WTTT#P@#Y22222122222230112121122190000 +M520200911111115432120141106WTTT#@ZZ9222221122222 0422981 0000 +M42020091111111548920900406601161113 +M520200911111115489119820821WTTT#ZTTP22222122222230112121118470000 +M520200911111115489120170702WTTTY09TW222221122222 0422981 0000 +M520200911111115489120070619WTTTY@@WW122221122222 0422071 0000 +M520200911111115489120060715WTTT0WPTW122221222222 0422081 0000 +M42020091111111570220600402121163113 +M520200911111115702119860501WTTTP9#B912222222222210112111130000000 +M520200911111115702120160112WTTT0#PTW222222122222 0422981 0000 +M520200911111115702120120801WTTT#BTTY122222122222 0422011 0000 +M42020091111111597421700405821163113 +M520200911111115974119810714WTTT0BTZ@22222222222210112121126070000 +M520200911111115974120080118WTTT#W@ZT222222122222 0422061 0000 +M42020091111111626320900401881163113 +M520200911111116263119970726WTTTPY9P012222222222210112121113840000 +M520200911111116263120170526WTTTPBT0Z222222122222 0422981 0000 +M42020091111111635021100401691163113 +M520200911111116350119890114WTTT#ZZTB12222222222210112082122170000 +M520200911111116350120170101WTTTPTP#Y122222222222 0422981 0000 +M520200911111116350120150126WTTTYWZZT122222122222 0422981 0000 +M520200911111116350120060114WTTT0#0TY122222222222 0422072 0000 +M42020091111111672120900404651162113 +M520200911111116721119800101WTTTYY9W922212222222210112121109530000 +M520200911111116721120100809WTTTP@W@Z222122222222 0422031 0000 +M520200911111116721120090101WTTT0@TPZ222122122221 0422051 0318 +M520200911111116721120050114WTTT0TYYZ222122222222 0422081 0000 +M42020091111111727020600401161163123 +M520200911111117270219910119WTTTYP@Z@22122222222220212113200000000 +M520200911111117270119900123WTTT0#Y##22122212222220112112100000000 +M520200911111117270120190126WTTT#B90P221222222222 0422981 0000 +M520200911111117270120160119WTTT0#Y@0221222122222 0422983 0000 +M520200911111117270120130115WTTTYZP9T221222122222 0422983 0000 +M42020091111111733922700400671163113 +M520200911111117339119920619WTTT0BZ@#22222122222210112121125730000 +M520200911111117339120180119WTTT#@@@Z222221122222 0422981 0000 +M520200911111117339120180119WTTTYYWP@222221222222 0422981 0000 +M520200911111117339120170606WTTT#PWY@222222222222 0422981 0000 +M42020091111111793420500402421012113 +M520200911111117934119820721WTTT0BTZY22222122222210112121124410000 +M520200911111117934120100723WTTT#WB9T222222222222 0422041 0000 +M42020091111111798521100401691163113 +M520200911111117985119830119WTTTPT@WY22222122222210112131100000254 +M520200911111117985120180612WTTT0Z9##122222122222 0422981 0000 +M520200911111117985120160126WTTT0Y@@9222222122222 0422981 0000 +M42020091111111831620600400871192123 +M520200911111118316119890601WTTTYPB#P22222122222210112121113260000 +M520200911111118316120160816WTTT##@YW222221222222 0422981 0000 +M520200911111118316120130719WTTT0999B222221222222 0422011 0000 +M520200911111118316120090715WTTTPW99T222122122222 0422051 0000 +M42020091111111838120600405341163113 +M520200911111118381119850106WTTTPY#B922222222222210112121125400000 +M520200911111118381120100706WTTT#TBPZ222222122222 0422041 0000 +M520200911111118381120030508WTTT0W0#W222222122222 0422111 0000 +M42020091111111860821400400351163113 +M520200911111118608119900619WTTTYPWT912222222222210112111127180000 +M520200911111118608120130716WTTT0WW#Y222222122222 0422011 0000 +M42020091111111862520900406601162113 +M520200911111118625119770719WTTT09WW#12222222222230112121136640000 +M520200911111118625120100821WTTTP9@99222222222222 0422031 0000 +M520200911111118625120070502WTTT0W0PZ222222122222 0422071 0000 +M520200911111118625120030508WTTT0PWY9222222222222 0422111 0000 +M42020091111111869421100406001163113 +M520200911111118694119900119WTTTP@9PW12222122222230112112113860000 +M520200911111118694120190101WTTT0ZBBP122222122222 0422981 0000 +M520200911111118694120160813WTTT#@PY9122221122222 0422981 0000 +M42020091111111897220000403951163113 +M520200911111118972119860121WTTTY@#PY12222222222210112121123380000 +M520200911111118972120160708WTTTYPWTZ222222222222 0422981 0000 +M520200911111118972120120526WTTTY0#@Y222222122222 0422011 0000 +M42020091111111899922700402231163123 +M520200911111118999119920601WTTTPZ9Z022222122222210112121100000000 +M520200911111118999120140101WTTT0@B#Z122221222222 0422981 0000 +M520200911111118999120120518WTTT#9#PB122221222222 0422021 0000 +M42020091111111904120000402281163113 +M520200911111119041119930708WTTTPB0Z012222222222210112121119310000 +M520200911111119041120171113WTTT#BP#@222222222222 0422981 0000 +M520200911111119041120120626WTTTYWPYW222222222222 0422021 0000 +M42020091111112018321700401121161113 +M520200911111120183119840708WTTTPWT##22222122222210112141113380000 +M520200911111120183120150114WTTTP09Y0222222222222 0422981 0271 +M42020091111112021720600405471161113 +M520200911111120217119870618WTTTP@YWP12222222222210112111119630000 +M520200911111120217120070626WTTT00ZTZ122222122222 0422071 0000 +M520200911111120217120041101WTTT#0P00122222222221 0422091 0739 +M42020091111112039620600405341161113 +M520200911111120396119830101WTTTY09P012222222222210112131125300000 +M520200911111120396120150516WTTTP#P0Y222222222222 0422981 0000 +M520200911111120396120131123WTTTP9ZTT122221222222 0422981 0000 +M520200911111120396120110807WTTT#0B@@222222222222 0422021 0000 +M520200911111120396120070515WTTT0@@Y0122222122222 0422071 0000 +M520200911111120396120030506WTTT#T9BB122222222221 0422101 0897 +M42020091111112039720600401981163113 +M520200911111120397119750106WTTT00TW922222122222250112111125750000 +M520200911111120397120080715WTTTYY0BT222221122222 0422061 0000 +M520200911111120397120060719WTTT#PB#9222221122222 0422081 0000 +M42020091111112060621400400351163113 +M520200911111120606119780122WTTTPY@Z@22212122222220112111128980528 +M520200911111120606120140713WTTTY#W@Z222121222222 0422981 0000 +M520200911111120606120090102WTTT0TTTT222121122222 0422041 0000 +M520200911111120606120030515WTTTY9B#T222121222222 0422101 0000 +M42020091111112081222400402111161113 +M520200911111120812119911122WTTT#Z9YZ22222122222210112111123770000 +M520200911111120812120190102WTTTYZBYZ222221122222 0422981 0000 +M520200911111120812120130601WTTT#0#TB222221122222 0422011 0000 +M42020091111112092821700406831163113 +M520200911111120928119980102WTTTYBT0@22222122222210112111123070000 +M520200911111120928120180119WTTTYTPY9222222222222 0422981 0000 +M42020091111112124922700402801162113 +M520200911111121249119900119WTTTY#WP922212222222210112131117290819 +M520200911111121249120121114WTTT00PWP222222122222 0422011 0000 +M520200911111121249120110119WTTT0WYZ@222122222222 0422031 0000 +M42020091111112135220600405171163123 +M520200911111121352119970514WTTTYTPBW12222222222210112081127140000 +M520200911111121352120180606WTTTYZZP9122222122222 0422981 0000 +M42020091111112145720000402281163113 +M520200911111121457119910815WTTTPBZ9Y12222222222210112081114680000 +M520200911111121457120190716WTTT0@#ZW122221122222 0422981 0000 +M520200911111121457120120823WTTTPWY@T122222222222 0422011 0000 +M42020091111112165720600404951013113 +M520200911111121657119960519WTTT#00PY22222122222210112121126030000 +M520200911111121657120180819WTTTPW@0Y122222122222 0422981 0000 +M520200911111121657120160109WTTT#WBW9222222122222 0422981 0000 +M42020091111112166321400400351193113 +M520200911111121663119760623WTTTPB@@@22222222222210112111133950000 +M520200911111121663120100715WTTT0@9T0222222222222 0422041 0000 +M520200911111121663120100715WTTT##@WB222122122222 0422041 0000 +M520200911111121663120040512WTTT#@Y0Y222122122222 0422092 0000 +M42020091111112169921700406831161113 +M520200911111121699119920706WTTTYYTW@12222122222210112131115110000 +M520200911111121699120190607WTTT0Y#BZ122221122222 0422981 0000 +M520200911111121699120120115WTTT#TB9W122221122222 0422021 0000 +M42020091111112182621100401181161113 +M520200911111121826119880808WTTTY@PPP22222222222220112121118760000 +M520200911111121826120150509WTTT0ZZW0222122222222 0422981 0000 +M520200911111121826120080621WTTT#PP90222122222222 0422061 0000 +M42020091111112185721400400351163113 +M520200911111121857119820115WTTTYPZ@922212222222210112131126060000 +M520200911111121857120170103WTTTY9T0Y222221222222 0422981 0000 +M520200911111121857120100715WTTT0YBB9222122222222 0422041 0000 +M520200911111121857120070815WTTTYWYYZ222122222222 0422061 0000 +M42020091111112196321100406001163123 +M520200911111121963119910601WTTTYWTBT12222222222210112121100000000 +M520200911111121963120161106WTTT09YW9122222122221 0422981 0581 +M42020091111112211321700401121163113 +M520200911111122113119830819WTTTPPB#T12222122222210122121127360000 +M520200911111122113120020818WTTTYTYWB222222222222 0422121 0000 +M42020091111112234821100406001163113 +M520200911111122348119910616WTTTPW0#W12222222222210112121114740000 +M520200911111122348120150723WTTTPP@T9222222122222 0422981 0000 +M520200911111122348120130712WTTT0W0#@222222222222 0422011 0000 +M42020091111112242422700400671163113 +M520200911111122424119810822WTTT#0PBP12222222222210112121118080000 +M520200911111122424120100501WTTTPZ0BT222222122222 0422041 0000 +M520200911111122424120060103WTTTPZ@PT122222222222 0422071 0000 +M42020091111112268820600401981121113 +M520200911111122688119890823WTTTYYB#T22222222222210112081121950871 +M520200911111122688120140501WTTTBTTZB222222122222 0422981 0000 +M42020101111111115621100406001162113 +M520201011111111156119810112WTTTPZWTT12222222222210112111124700000 +M520201011111111156120020113WTTT#T9B9122222122222 0422111 0000 +M42020101111111118721700405121013113 +M520201011111111187119920812WTTT0ZWP922222122222210112111126640000 +M520201011111111187120170809WTTT#0W@T222221122222 0422981 0000 +M42020101111111119721100406391163113 +M520201011111111197119850619WTTT#Y#9912222222222210112111127820000 +M520201011111111197120160113WTTTP0TT@222222122222 0422981 0000 +M520201011111111197120110108WTTT#YYW#122222122222 0422031 0000 +M520201011111111197120080519WTTT#9WWZ222222122222 0422061 0000 +M520201011111111197120060501WTTT0YTTT122222222222 0422081 0000 +M520201011111111197120040123WTTTYZ@WP122222122221 0422101 0813 +M42020101111111157520500402421163113 +M520201011111111575119760722WTTT0#B0P22212222222250112161123130000 +M520201011111111575120110719WTTTP@ZPP222122222222 0422031 0000 +M520201011111111575120090723WTTT0#ZWB222222122222 0422051 0000 +M42020101111111200820600401981162113 +M520201011111112008119800101WTTTYBB#T12222222222220212121115030000 +M520201011111112008119770801WTTTPZ9B012222212222220112121118610000 +M520201011111112008120041106WTTT#TY@Y122222222222 0422091 0000 +M42020101111111202722400406121163113 +M520201011111112027119950119WTTTPPP0@22212222222210112111116241000 +M520201011111112027120180116WTTT0WPWP222122122222 0422981 0000 +M42020101111111215221700405821163113 +M520201011111112152119790621WTTTYT9ZT12222222222210112121130330000 +M520201011111112152120130102WTTTPYWB#122222122221 0422011 0309 +M520201011111112152120030809WTTTPZ#YB122222122222 0422111 0000 +M42020101111111236021100401181163113 +M520201011111112360119870102WTTTPBPYP12222222222210112121118000000 +M520201011111112360120080519WTTT0TZB@122222222222 0422051 0000 +M42020101111111237520000401821162113 +M520201011111112375119800614WTTT#99T012222122222250112122123300000 +M520201011111112375120160713WTTT0WB#@122221222222 0422981 0582 +M520201011111112375120050521WTTT09Y9Y122221222222 0422091 0000 +M520201011111112375120030121WTTT#P0B0122221222222 0422111 0000 +M42020101111111263222700403241161113 +M520201011111112632119780614WTTT#YZ9012222222222210112141121360000 +M520201011111112632120070103WTTT0Z0@W122222222222 0422061 0000 +M42020101111111266121200404691163113 +M520201011111112661119960615WTTTY#9WZ12222122222210112111126860000 +M520201011111112661120170822WTTT0BB9Z122221222222 0422981 0000 +M42020101111111325722700400671161123 +M520201011111113257119910502WTTT0Z@YZ12222222222210112081113750000 +M520201011111113257120180126WTTT#TB9#222222122222 0422981 0000 +M520201011111113257120140119WTTT#YB0T122221122222 0422981 0000 +M42020101111111343021100401551163113 +M520201011111113430119990601WTTT0ZYP@12222222222210112081120800000 +M520201011111113430120160713WTTTY##@0122222122222 0422981 0000 +M42020101111111363221100406471162113 +M520201011111113632119630726WTTTP9TZB12222222222210122121124490000 +M520201011111113632120140123WTTTY0#TP122222122222 0622981 0000 +M42020101111111392320000403721162113 +M520201011111113923119980115WTTTP9YWT12222212222210412111115170000 +M520201011111113923120151123WTTTPYP0Z222222122222 0622981 0000 +M42020101111111404221400406791163113 +M520201011111114042119920106WTTTYZ9YP22222222222210112111129190000 +M520201011111114042120160526WTTT0TWBP222122122222 0422981 0000 +M520201011111114042120140801WTTT0YYYP222222222222 0422981 0000 +M520201011111114042120130601WTTT#Y0@P222222122222 0422011 0000 +M520201011111114042120110118WTTTPPBBZ222222222222 0422031 0000 +M42020101111111409520900400501991113 +M520201011111114095119710619WTTTP@@PZ22212212222210112121117600191 +M520201011111114095120160116WTTT#@##Y222222222222 0422981 0000 +M520201011111114095120150519WTTTPY90Y222122222222 0422981 0000 +M42020101111111411820000402281162113 +M520201011111114118119840626WTTT0#PYB12222222222230112111117880000 +M520201011111114118120160618WTTTP09WZ222222122222 0422981 0000 +M520201011111114118120030718WTTTPT0YZ122222122222 0422111 0000 +M42020101111111433322700402801161113 +M520201011111114333119960123WTTT0909922212222222210112082112290000 +M520201011111114333120150622WTTTPBWTY222122222222 0422981 0000 +M42020101111111486722700402801013113 +M520201011111114867119920719WTTTP09P022222122222210112111125220000 +M520201011111114867120181123WTTTPWWZ#222222122222 0422981 0000 +M42020101111111502521700400981161113 +M520201011111115025119930101WTTT#0WZW12222222222210112141112080000 +M520201011111115025120140514WTTTP9W@Y122222222222 0422981 0000 +M520201011111115025120131101WTTT0TZW@122222222222 0422981 0000 +M42020101111111502720600405471993113 +M520201011111115027119960519WTTTP#BTP12222122222210112111116010000 +M520201011111115027120160509WTTTPB0Z@222222222222 0422981 0000 +M42020101111111531420900401881163113 +M520201011111115314119960115WTTTPY@YP12222222222230112111128540000 +M520201011111115314120180719WTTTPY@BW122222122222 0422981 0000 +M42020101111111591221200401971163113 +M520201011111115912119860106WTTTY0@PT22222122222210112121120580000 +M520201011111115912120130103WTTTY0#PB222221122222 0422981 0000 +M520201011111115912120130103WTTTYZ9BW222221122222 0422981 0000 +M42020101111111610120600402981163113 +M520201011111116101119960501WTTTY9WYB12222122222210112081116030000 +M520201011111116101120190608WTTT#09TW222222122222 0422981 0000 +M42020101111111611420600403781162113 +M520201011111116114119850123WTTT#WW0P12222222222210112141125900000 +M520201011111116114120090619WTTTP9P9@122222222222 0422051 0000 +M520201011111116114120060108WTTTY@##P122222222222 0422081 0000 +M42020101111111612122700400681163113 +M520201011111116121119770515WTTT0@Z##22222122222210112111133880000 +M520201011111116121120090719WTTTP9@0#222221222222 0422051 0000 +M520201011111116121120050115WTTTYP#PW222222122222 0422081 0000 +M42020101111111613222700400211163113 +M520201011111116132119950119WTTTPZZWB22222122222210112131113870000 +M520201011111116132120180113WTTT##TT#122221122222 0422981 0000 +M520201011111116132120160723WTTT09#0P122221222222 0422981 0000 +M42020101111111636620600401421012113 +M520201011111116366119840616WTTTYWP9P12222222222210112111120400000 +M520201011111116366120090103WTTT#ZW@9122221222221 0422041 0467 +M42020101111111638322700402801163113 +M520201011111116383119830702WTTTYZZWB22222122222210112111116530000 +M520201011111116383120180519WTTT#YWYW222221122222 0422981 0000 +M520201011111116383120150119WTTTYBZTZ222222222222 0422981 0000 +M42020101111111694120900403071161113 +M520201011111116941119900508WTTTYWPY022212222222210112121100000391 +M520201011111116941120190508WTTT#WBW0222122222222 0422981 0000 +M520201011111116941120160119WTTT#YY#@222122122222 0422981 0000 +M520201011111116941120120615WTTTPYTT0222122222222 0422021 0000 +M42020101111111705120300400651163113 +M520201011111117051119970616WTTT0B9WW22222122222210112111117330000 +M520201011111117051120170613WTTTPBZPY222221222222 0422981 0000 +M42020101111111711721100402161993113 +M520201011111117117119940112WTTTP#@#@22222112222210112111126000000 +M520201011111117117120160101WTTT00PYT222222122222 0422981 0000 +M42020101111111724120000401821993113 +M520201011111117241119910807WTTT#TP#Z12222222222210112113117150000 +M520201011111117241120190102WTTT0WWY0222222222222 0422981 0000 +M42020101111111734620900401881163113 +M520201011111117346119950521WTTTY0TWW22212222222210112111124000000 +M520201011111117346120191116WTTT0B@0W222222122222 0422981 0000 +M520201011111117346120171116WTTTYY0TP222122122222 0422981 0000 +M42020101111111740621100401181163113 +M520201011111117406119880113WTTT#@@#P22212222222210112111118260000 +M520201011111117406120170723WTTT0@B@W222122122222 0422981 0000 +M42020101111111741820900406131162113 +M520201011111117418119800503WTTT#09Z912222222222230112111121350000 +M520201011111117418120150723WTTT##YBW122222222222 0422981 0000 +M520201011111117418120130601WTTTPYTZ0222222122222 0422011 0000 +M42020101111111763921700404201993113 +M520201011111117639119730501WTTT0T9BZ22212222222210112111124550000 +M520201011111117639120040823WTTTPWPTB222122122222 0422101 0000 +M42020101111111767220000406951163113 +M520201011111117672119910703WTTT09@@Z12222222222210112111124390000 +M520201011111117672120130123WTTTPBTBY122222222222 0422981 0000 +M520201011111117672120120522WTTT0@PTW122222222222 0422011 0000 +M520201011111117672120110706WTTT0Y0B@122221222222 0422031 0000 +M42020101111111833221400400351162113 +M520201011111118332119840101WTTT09W@P22212222222210112121117430000 +M520201011111118332120090122WTTTYTZ9W222222222222 0422051 0000 +M520201011111118332120040126WTTT##@PW122222222222 0422101 0000 +M42020101111111841520900402921162113 +M520201011111118415119920618WTTT#Z9P012222222222220112121118740000 +M520201011111118415120130126WTTTPBWBZ122222222222 0422981 0000 +M42020101111111844920600402121163113 +M520201011111118449119930626WTTT0TWW022212122222210112121123920000 +M520201011111118449120200619WTTTP#@T0222121222222 0422981 0000 +M520201011111118449120100608WTTT#WZPT222221122222 0422041 0000 +M520201011111118449120080115WTTTYYT@@222221122222 0422051 0000 +M42020101111111897821100406391162113 +M520201011111118978119750101WTTT0WWBP22212222222210112111122810000 +M520201011111118978120120615WTTT##PTB222122122222 0422021 0000 +M520201011111118978120090701WTTT0@W@P222122222222 0422051 0000 +M520201011111118978120070715WTTTPB09@222122222222 0422071 0000 +M42020101111111946122700400671163123 +M520201011111119461119710602WTTT#P0Y022222122222220112161113870000 +M520201011111119461120150503WTTTPW0W@222222222222 0422981 0000 +M520201011111119461120100121WTTT0@9#P222221122222 0422031 0000 +M42020101111112007522400406441163113 +M520201011111120075119860626WTTTP#0WZ22222122222210112111121070000 +M520201011111120075120110526WTTT0@9BW222222122222 0422021 0000 +M520201011111120075120081126WTTTYT9@#222222122222 0422051 0000 +M42020101111112014820600405171162113 +M520201011111120148119730601WTTTYZ9T#12222222222210112121121020000 +M520201011111120148120040121WTTT0BY90122222122222 0422091 0000 +M42020101111112056521700401121163113 +M520201011111120565119790107WTTT#0WZP22212222222230112111129840000 +M520201011111120565120190621WTTTPB0YT222122222222 0422981 0000 +M520201011111120565120150102WTTT#W#B#222122222222 0422981 0000 +M520201011111120565120130119WTTT0WBW9222122222222 0422981 0000 +M520201011111120565120120815WTTT#@B@@222122122222 0422021 0000 +M42020101111112081422400404731163113 +M520201011111120814119780718WTTT0BYZ921222112222210112121119730000 +M520201011111120814120070513WTTT#0W09222221122222 0422061 0000 +M42020101111112093620600405171161113 +M520201011111120936119920723WTTTY#TT@12222222222210112111124430000 +M520201011111120936120190115WTTT#TTBT122222222222 0422981 0000 +M520201011111120936120170701WTTTYT#TB222222122222 0422981 0000 +M520201011111120936120100715WTTTPZ0W#122222222222 0422041 0000 +M42020101111112160022400401011163123 +M520201011111121600119850119WTTTY0PYZ22222122222230112121121180000 +M520201011111121600120040101WTTT00#TY222221122222 0422101 0000 +M42020101111112177921100401181123123 +M520201011111121779119890519WTTT#@@ZY22212222222210112131100000577 +M520201011111121779120130719WTTT#P@9W222122122222 0422011 0000 +M42020101111112207521700404101012113 +M520201011111122075119940109WTTTYYTP#12222222222220112121124260000 +M520201011111122075120180723WTTT#TTYP122222122222 0422981 0000 +M520201011111122075120160115WTTT#TBP@222222222222 0422981 0000 +M42020101111112223320900403071162113 +M520201011111122233119890126WTTTYYB@P22212222222230112132134680000 +M520201011111122233120170821WTTTYY9W#222122222222 0422981 0000 +M520201011111122233120110615WTTTYBTBY222122122222 0422031 0000 +M520201011111122233120080102WTTTY@ZWW222122122222 0422051 0000 +M42020101111112240821100401781013113 +M520201011111122408119860813WTTT###B912222222222210112111127730000 +M520201011111122408120090815WTTT#PZBT222222122222 0422051 0000 +M520201011111122408120071107WTTTPYBZP122222122222 0422061 0000 +M42020101111112240920000403951163113 +M520201011111122409119940718WTTTYZZ9Y22222222222210112081122420328 +M520201011111122409120180115WTTTYYWYP222222122222 0422981 0000 +M520201011111122409120160118WTTTPBYBB222222222222 0422981 0000 +M42020101111112246321700401121012123 +M520201011111122463119860716WTTT#9@P912222212222210212111122840000 +M520201011111122463219860501WTTT#WB9@12222222222220112113200000000 +M520201011111122463120170502WTTT#@0YT122222222222 0422981 0000 +M42020101111112260722400406121163113 +M520201011111122607119620716WTTT#WW@T22212222222220112111124860000 +M520201011111122607120060701WTTTYPTBY222122222222 0422081 0000 +M42020101111112278820000404271161113 +M520201011111122788119750621WTTT#T0YT22122212222250112111128820000 +M520201011111122788120050121WTTTYTYP0221222222222 0422081 0000 +M42020111111111141622700403941163113 +M520201111111111416119950102WTTT#@#0B22222122222210112111123390000 +M520201111111111416120160622WTTT###B@222222122222 0422981 0000 +M42020111111111142921400400351163113 +M520201111111111429119780706WTTTY@W0W22212222222230112111135380000 +M520201111111111429120140713WTTTPY000222222222222 0422981 0000 +M520201111111111429120090701WTTTPTT0Z222222222222 0422051 0000 +M42020111111111156620600401421163113 +M520201111111111566119940118WTTT#BZ9W22222222222210412081116570000 +M520201111111111566120170108WTTTP@9B9122222222222 0622981 0000 +M520201111111111566120120603WTTTYYY#Y122222122222 0622021 0000 +M520201111111111566120110126WTTTPYBPT122222122222 0622031 0000 +M42020111111111162521100405401162113 +M520201111111111625119840118WTTTY0ZP#12222222222210112111122760000 +M520201111111111625120090702WTTT0Z#Z@122222122222 0422051 0000 +M520201111111111625120060815WTTTYTYT9122222222222 0422081 0000 +M42020111111111171520600400291163113 +M520201111111111715119800118WTTT0#ZWZ22222122222210112111121670000 +M520201111111111715120180502WTTT#PPYB222222222222 0422981 0000 +M520201111111111715120130608WTTT0YPPY222222122222 0422011 0000 +M42020111111111172020600400871163123 +M520201111111111720119920106WTTTYB0WZ12222222222230112121127080000 +M520201111111111720120170503WTTTYP@YT122222122222 0422981 0000 +M520201111111111720120090807WTTT#Z9PW122222222222 0422051 0000 +M42020111111111179521700401121161113 +M520201111111111795119940723WTTTYZ@9Y12222222222210112081118900000 +M520201111111111795120200516WTTT#W@Z@222222222222 0422981 0000 +M520201111111111795120200516WTTT##@9T222222222222 0422981 0000 +M520201111111111795120170506WTTTYZPBP122222222222 0422981 0000 +M520201111111111795120120115WTTTPTYY#122221122222 0422011 0000 +M42020111111111212322200405781163113 +M520201111111112123119860126WTTT#90B921222222222230112161127150000 +M520201111111112123120161115WTTTY#BYW222222222222 0422981 0000 +M520201111111112123120110112WTTT0P@Z@222222122222 0422031 0000 +M42020111111111226921700404101163113 +M520201111111112269119860115WTTT0TBB#12222222222210112121116660000 +M520201111111112269120150101WTTT##@ZZ122222122222 0422981 0000 +M520201111111112269120070122WTTT#T@T@122222122222 0422061 0000 +M520201111111112269120030806WTTTP#9YY122222222222 0422111 0216 +M42020111111111259120900403071163113 +M520201111111112591119840108WTTT0Z9#T12222222222230112111138870000 +M520201111111112591120100815WTTT#T0TW122222122222 0422041 0000 +M520201111111112591120071121WTTT#00#B122222222222 0422061 0000 +M520201111111112591120060623WTTTY0B0Z122222222222 0422081 0000 +M42020111111111289720000403951163113 +M520201111111112897119910723WTTT0YPBB22222122222210112111117730000 +M520201111111112897120180815WTTT#W@TP222122122222 0422981 0137 +M42020111111111384721100406001013113 +M520201111111113847119770706WTTT099YY12222222222210112111136170000 +M520201111111113847120170115WTTTYY@@Z222222222222 0422981 0000 +M520201111111113847120090119WTTTPY9YP122221122222 0422041 0000 +M520201111111113847120020101WTTTY@WY@122222222222 0422111 0000 +M42020111111111408420900401031162123 +M520201111111114084119880806WTTT#T0@@12222222222210112131140410000 +M520201111111114084120160102WTTT#@WY0122222222222 0422981 0000 +M520201111111114084120140706WTTT0@W@@222222222222 0422981 0000 +M520201111111114084120090121WTTT#TZ@Z122222222222 0422041 0000 +M42020111111111420420900403031163113 +M520201111111114204119940119WTTTY0WT@22212222222210112111127670000 +M520201111111114204120180802WTTT#0PB9222122222222 0422981 0000 +M520201111111114204120160721WTTT#T0TB222122122222 0422981 0000 +M42020111111111428720000403951161113 +M520201111111114287119880102WTTTYBWWY12222222222210112081116900000 +M520201111111114287120180118WTTTP#0#0122222222222 0422981 0000 +M520201111111114287120121112WTTTP#9Z9122222222222 0422011 0000 +M42020111111111480820600401151161113 +M520201111111114808119880822WTTTYYB0@12222222222210112131100000000 +M520201111111114808120130126WTTTYZ0@T122221222222 0422011 0000 +M520201111111114808120100123WTTTPZ0ZW222122122222 0422041 0000 +M42020111111111484021200404691163113 +M520201111111114840119800122WTTT0@Y0#12222222222250112121114650000 +M520201111111114840120150622WTTT0ZBZ@122222122222 0422981 0000 +M520201111111114840120040113WTTT0WBWB122222222222 0422091 0000 +M520201111111114840120030801WTTTP0W#P122222222222 0422111 0000 +M42020111111111487621700402861163113 +M520201111111114876119881101WTTTY##BP22222122222210112111130170000 +M520201111111114876120190723WTTT0@0#P222222222222 0422981 0000 +M520201111111114876120150621WTTT#PYZT222222122222 0422981 0000 +M42020111111111495120900403031163113 +M520201111111114951119740623WTTT00B9T22212222222210112111124620000 +M520201111111114951120130715WTTT0PB@#222122122221 0422011 0766 +M520201111111114951120130715WTTTPZWP@222122122222 0422011 0000 +M42020111111111585220900403071162113 +M520201111111115852119800116WTTT#P9BW22212222222210112161133800000 +M520201111111115852120100501WTTTYBYTZ222122222222 0422041 0000 +M520201111111115852120050708WTTTYPTTZ222122222222 0422091 0000 +M42020111111111653421100402161013113 +M520201111111116534119831114WTTT0#9Z022222222222210112121120450000 +M520201111111116534120100101WTTT#BYY9222222122222 0422031 0000 +M42020111111111677521200404691163123 +M520201111111116775119861118WTTT0ZBW#22222111222210112111116251085 +M520201111111116775120190119WTTT#P#P#222222222222 0422981 0000 +M520201111111116775120180126WTTTYZ#P@222222122222 0422981 0000 +M520201111111116775120160103WTTTY0#PT222222122222 0422981 0000 +M520201111111116775120121101WTTT0@YWT222221222222 0422011 0000 +M520201111111116775120100126WTTT#0BTB222221222222 0422031 0000 +M42020111111111765820900406421163113 +M520201111111117658119830126WTTTYZPYB22212222222210112111117580000 +M520201111111117658120150715WTTT0@T@Z222122122222 0422981 0000 +M520201111111117658120110708WTTTPWYW#222122222222 0422031 0000 +M42020111111111766820500404091163113 +M520201111111117668119880113WTTTYB9YT22222122222210112121125190000 +M520201111111117668120121101WTTTYPY#9222221222222 0422011 0000 +M520201111111117668120070501WTTTPYWW@222221222222 0422071 0000 +M42020111111111778922400402911993113 +M520201111111117789119710103WTTTP0BZT22212212222210112111124160000 +M520201111111117789120080615WTTTYZWBP222122122222 0422061 0000 +M42020111111111785220000406951163113 +M520201111111117852119890509WTTTYWTYY12222122222210112112128570000 +M520201111111117852120150107WTTT#TBYB122221122222 0422981 0000 +M520201111111117852120060606WTTTPPW#0122221122222 0422082 0000 +M42020111111111818421700404101163113 +M520201111111118184119910726WTTTYY@Z012222122222210112121127650000 +M520201111111118184120160815WTTTY@0@B122222122222 0422981 0000 +M520201111111118184120120606WTTT0@#PY122122122222 0422021 0000 +M42020111111111838221700403151163123 +M520201111111118382119940708WTTT0T0BW22212222222210112111124740000 +M520201111111118382120160121WTTT0Z0@0222222122222 0422981 0000 +M42020111111111857020000404071161113 +M520201111111118570119840622WTTT0@B#012222222222210112111124960000 +M520201111111118570120080123WTTTP#YYB122221122222 0422051 0000 +M520201111111118570120030106WTTT#9P#9122222122222 0422111 0000 +M42020111111111869922700400681162113 +M520201111111118699119830101WTTTYZ9PB12222212222220212121243880000 +M520201111111118699119820102WTTTYBPBB12212222222220112131200000000 +M520201111111118699120180508WTTT#ZYTW222222122222 0422981 0000 +M520201111111118699120130116WTTTYZTZ#122222122222 0422981 0000 +M520201111111118699120101107WTTT0#90T122222122222 0422031 0000 +M520201111111118699120080513WTTTPZT9Y222221122222 0422061 0000 +M42020111111111918920600405341162113 +M520201111111119189119800621WTTTYZP0P12222222222210112111129550000 +M520201111111119189120050801WTTTP@YBZ122222222222 0422091 0000 +M42020111111111925922700402801163113 +M520201111111119259119960715WTTTY@0ZP12222222222210412121119830000 +M520201111111119259120151126WTTT0B009122222122222 0622981 0000 +M520201111111119259120130823WTTTPT@T@122222222222 0622011 0000 +M520201111111119259120120119WTTTBTTTZ122222222222 0622021 0000 +M42020111111111940020600402031163113 +M520201111111119400119920707WTTTPZTPZ12222222222210112081128000000 +M520201111111119400120110102WTTT0TY09122222122222 0422021 0000 +M42020111111111940122700403611162113 +M520201111111119401119910506WTTTPP#YZ22222122222210112121120660000 +M520201111111119401120090521WTTTBTTW#222221122222 0422051 0000 +M42020111111111952220000403011013113 +M520201111111119522119920118WTTTPW0#@22122222222230112081125940000 +M520201111111119522120131121WTTTYTP0#221222122222 0422981 0000 +M42020111111111967720000404151993113 +M520201111111119677119710119WTTTY#Y#P22212222222210112111122000000 +M520201111111119677120120101WTTT0YBZB222222222222 0422011 0000 +M42020111111112019122700400671163113 +M520201111111120191119950606WTTTPW9YT22222122222210112121114200000 +M520201111111120191120170119WTTTPPTPY222222222222 0422981 0000 +M520201111111120191120170119WTTT0P@9W222222222222 0422981 0000 +M42020111111112024821100401691163123 +M520201111111120248119820119WTTT#BW#Y22222122222210112121134880000 +M520201111111120248120171107WTTTYY0YW222222222222 0422981 0000 +M520201111111120248120080522WTTT#WP@B222221122221 0422061 0798 +M520201111111120248120060621WTTT#@@P#222122222222 0422081 0000 +M520201111111120248120040615WTTT09PWW222221222222 0422101 0000 +M42020111111112026422700400671163113 +M520201111111120264119860121WTTT0PBZ#22222122222210112111126990000 +M520201111111120264120100726WTTTYPYYY222221122222 0422041 0000 +M42020111111112026820600400871162113 +M520201111111120268119811126WTTTPW0ZY22212222222210112121129600000 +M520201111111120268120120621WTTTBT9W#222221222222 0422021 0000 +M520201111111120268120090509WTTTPW0TW222122222222 0422051 0000 +M520201111111120268120080518WTTT#0W@P222122222222 0422061 0000 +M42020111111112038920900402921013113 +M520201111111120389119980126WTTT0T#W@12212222222210112131124000000 +M520201111111120389120200615WTTTYWYW#222222122222 0422981 0000 +M42020111111112061222700403351163113 +M520201111111120612119600106WTTT0PZ9Z22222112222220112111144190000 +M520201111111120612120050601WTTT0WTP9222221122222 0422091 0000 +M42020111111112089821100406001163113 +M520201111111120898119840819WTTTP#YBB12222222222220112122130280000 +M520201111111120898120130601WTTTPPW#9122222222222 0422011 0000 +M520201111111120898120050109WTTT0T099122222122222 0422082 0000 +M520201111111120898120040126WTTTY9#9W122222122222 0422102 0000 +M42020111111112118020000404271163113 +M520201111111121180119910715WTTTPBB0@22122222222210112121121670000 +M520201111111121180120180115WTTT#TZ9T221222122222 0422981 0000 +M520201111111121180120140715WTTTPYTWZ221222222222 0422981 0000 +M520201111111121180120101119WTTTP@@9#222222122222 0422031 0000 +M42020111111112119821100401181013113 +M520201111111121198119930521WTTT0#0WZ12222222222210112111118570000 +M520201111111121198120170614WTTT#9WT9122222222222 0422981 0000 +M42020111111112121321100406471163113 +M520201111111121213119851119WTTT0PT0T22222122222210112121123830000 +M520201111111121213120080118WTTTYZB#W222221222222 0422051 0000 +M520201111111121213120020119WTTT#P@Z0222221222222 0422111 0000 +M42020111111112175720000404151013113 +M520201111111121757119920619WTTTPZ@@012222222222210112111117250000 +M520201111111121757120140119WTTT#ZPBP122222122222 0422981 0000 +M42020111111112183620900406131163123 +M520201111111121836119910515WTTTY9ZTT12222222222230112112118000000 +M520201111111121836120140109WTTTYPY90122222222222 0422981 0000 +M520201111111121836120120821WTTTPY0@#122221222222 0422021 0000 +M42020111111112193221400400351163113 +M520201111111121932119890601WTTT#@#Z@22212222222210112112112370000 +M520201111111121932120160606WTTT#W9PP222222222222 0422981 0000 +M520201111111121932120050108WTTT#@#9W222122122222 0422082 0000 +M42020111111112201922400406251012113 +M520201111111122019119771126WTTTY@W9022212222222210112132119500000 +M520201111111122019120080101WTTTY09P9222122122222 0422051 0000 +M42020111111112254921700405321162113 +M520201111111122549119860503WTTT09PWZ22222222222210112111113000000 +M520201111111122549120171107WTTTPP09T222222222222 0422981 0000 +M42020111111112257621700406571163113 +M520201111111122576119940806WTTTYTB9022222122222210112161113660000 +M520201111111122576120161114WTTTP9WT0222222122222 0422981 0000 +M42020121111111112921100401181161113 +M520201211111111129119920601WTTTYWTY022212222222210112121119240000 +M520201211111111129120180116WTTTP9ZYB222221222222 0422981 0000 +M42020121111111160520900400501162113 +M520201211111111605119830502WTTTYY90B12222122222210112111120770000 +M520201211111111605120080815WTTT0YB9B122221122222 0422061 0000 +M42020121111111178320600405341193113 +M520201211111111783119830112WTTT#T0@Y12222222222210112111126870000 +M520201211111111783120040122WTTTPWYW9122222222222 0422101 0000 +M42020121111111185922400401281161113 +M520201211111111859119880102WTTTPTPPY22212222222110112111121230792 +M520201211111111859120181101WTTTBTZ0T222222222222 0422981 0000 +M42020121111111195522700403241163113 +M520201211111111955119970123WTTTY@Y#912212222222210112122114650000 +M520201211111111955120190521WTTT0@YWZ222222222222 0422981 0000 +M42020121111111299222400401471163113 +M520201211111112992119940715WTTTYB#B@12222222222210112121132330000 +M520201211111112992120191102WTTT00PPW122221222222 0422981 0000 +M520201211111112992120180701WTTT0BW@T122122222222 0422981 0000 +M520201211111112992120170102WTTTY@Y0B222221222222 0422981 0000 +M520201211111112992120140523WTTT#Z@P#222221222222 0422981 0385 +M42020121111111317520900401231163113 +M520201211111113175119870116WTTT##YBB12222212222210112111119800000 +M520201211111113175120050101WTTT#YZ0B122222222222 0422091 0000 +M42020121111111332521100401691163113 +M520201211111113325119900721WTTTPZW@@22222122222210112121112350000 +M520201211111113325120160101WTTTPZ0W@122221222222 0422981 0000 +M42020121111111378121400400351163113 +M520201211111113781119910522WTTTP@P##22222222222210112111118320000 +M520201211111113781120130819WTTT0PBP0222122222222 0422011 0000 +M42020121111111410121100403821993113 +M520201211111114101120001123WTTT0Z9#P12222122222210112111115180000 +M520201211111114101120190809WTTT0T@YY122222222222 0422981 0000 +M42020121111111441721700400981162113 +M520201211111114417119890822WTTT#T0#P12222222222210112121114010000 +M520201211111114417120190507WTTT#B#00222222222222 0422981 0000 +M520201211111114417120091121WTTT0###P122222122222 0422041 0470 +M520201211111114417120060713WTTT#Z99#122222122222 0422081 0470 +M42020121111111448120600403391163123 +M520201211111114481119710815WTTTY9##B22222122222220212121116590000 +M520201211111114481219660715WTTT0##PP22212212222120112121200000835 +M520201211111114481120060723WTTTPT9BP222221122222 0422081 0000 +M520201211111114481120030115WTTTPW@9@222122222222 0422111 0000 +M42020121111111465120900403071161113 +M520201211111114651119861102WTTT0P9WZ12222222222210112111126950000 +M520201211111114651120130119WTTT00WB@122222122222 0422981 0000 +M520201211111114651120060621WTTTPTWPB122222122222 0422081 0000 +M520201211111114651120030807WTTT#B9@9122222122222 0422111 0000 +M42020121111111531521400401581993113 +M520201211111115315119951121WTTT#@#WP22222122222210112111117060000 +M520201211111115315120200108WTTTYY00#222221122222 0422981 0000 +M520201211111115315120180723WTTT#@TTB222221122222 0422981 0000 +M42020121111111573220000403761012113 +M520201211111115732119770713WTTT#@#WW22212222222230112111146380000 +M520201211111115732120180621WTTTPPT9P222222122222 0422981 0000 +M520201211111115732120130115WTTTYT#YB222222222222 0422011 0000 +M520201211111115732120091102WTTT#ZTPP222222222222 0422041 0000 +M42020121111111573722200404011123113 +M520201211111115737119830123WTTTP9PPY22222122222210112121130330000 +M520201211111115737120130815WTTT0TB#9222222222222 0422011 0000 +M520201211111115737120120602WTTTP@ZPB222222222222 0422021 0000 +M520201211111115737120090715WTTTYPZY#222222122222 0422051 0000 +M42020121111111589020600402031123123 +M520201211111115890119880126WTTT00ZP#12222222222210112121123030000 +M520201211111115890120141115WTTT#TWB0222222122222 0422981 0000 +M520201211111115890120061101WTTTYYP#9122222122222 0422071 0000 +M42020121111111592520600404951163113 +M520201211111115925119750712WTTT#Z@0Z22222122222210112111120800000 +M520201211111115925120031119WTTTBTZZ#222221222222 0422101 0000 +M42020121111111603920000404151162123 +M520201211111116039119800706WTTT09W#P22212222222210112981127230000 +M520201211111116039120170608WTTT0PZ#Z222122122222 0422981 0000 +M520201211111116039120110114WTTTYP0TP222222222222 0422031 0000 +M42020121111111610421100401181163113 +M520201211111116104119860521WTTT#90Y#22212222222210112121122710000 +M520201211111116104120140818WTTT0ZZ9@222222222222 0422981 0000 +M42020121111111652520600401421163123 +M520201211111116525119800109WTTT0WPB022212222222210112161132430000 +M520201211111116525120180612WTTTY0@9B122222222222 0422981 0000 +M520201211111116525120130101WTTT#@TW9222222222222 0422011 0000 +M520201211111116525120050112WTTTPP9P@222122222222 0422081 0000 +M42020121111111723120000404581163113 +M520201211111117231119770802WTTT09W9Y22222122222220112141118110000 +M520201211111117231119710507WTTT0ZWY012222211222220212131200000827 +M520201211111117231120021126WTTT0WP#P122222122222 0422111 0000 +M42020121111111760720600401981161113 +M520201211111117607119920101WTTT0TTWB22222122222210112121119940000 +M520201211111117607120170123WTTTYTP#T122222122222 0422981 0000 +M520201211111117607120120815WTTT0P0#0222221122222 0422021 0000 +M42020121111111784220000404271163113 +M520201211111117842119900515WTTTP@99@22122222222210112111131140000 +M520201211111117842119870119WTTTY0W0Z22122212222211012111127960000 +M520201211111117842120171102WTTTY@9YP221222122222 0422981 0000 +M520201211111117842120110113WTTTYT9BY221221122222 0422021 0000 +M520201211111117842120090514WTTTP9Z#Z221222222222 0422051 0000 +M42020121111111791121100406541163113 +M520201211111117911119880619WTTTY@@BT12222222222210112111125950000 +M520201211111117911120140102WTTTYW#Z9122221122222 0422981 0000 +M42020121111111842122700403611163113 +M520201211111118421119910813WTTTY@@TB22222122222210112121114460000 +M520201211111118421120100106WTTT0B9TY222222122221 0422041 0819 +M42020121111111866621100401551163113 +M520201211111118666119761119WTTTY@90912222222222220112142137370000 +M520201211111118666120150719WTTTPP90Z122222122222 0422981 0000 +M520201211111118666120060521WTTT0P@@0122222222222 0422081 0000 +M42020121111111881321400406791163113 +M520201211111118813119880501WTTT0P#TP22212222222210112111122420000 +M520201211111118813120131119WTTTY@B9T222122222222 0422981 0000 +M520201211111118813120100809WTTT0BTTB222222122222 0422041 0000 +M42020121111111885220600402031161123 +M520201211111118852119870106WTTT00P0#12222222222210112131113470000 +M520201211111118852120170713WTTT##W0B122221122222 0422981 0000 +M520201211111118852120130119WTTTPZ9YZ122222222222 0422981 0000 +M42020121111111929720900403071993113 +M520201211111119297119930615WTTTP900Y12222222222210112111124040000 +M520201211111119297120160723WTTTP9WWB222221222222 0422981 0000 +M42020121111111946221700405821161113 +M520201211111119462119861103WTTTYW0B022222222222210112121121700000 +M520201211111119462120090102WTTTP0#YT222222122222 0422041 0000 +M520201211111119462120070515WTTTP@T0W222222122222 0422071 0000 +M520201211111119462120040126WTTT#ZZZ@222222122222 0422101 0000 +M42020121111112064521700405821161113 +M520201211111120645119870106WTTTYBTWP12222222222230112121116290000 +M520201211111120645120170801WTTT#ZT0T122222222222 0422981 0000 +M520201211111120645120100706WTTTY909W122222222222 0422041 0000 +M520201211111120645120060601WTTTPP#Y9122222222222 0422081 0000 +M42020121111112137322700403611992113 +M520201211111121373119921119WTTT0BZ@Y12222222222210112121127990000 +M520201211111121373120180115WTTTPWY09122221122222 0422981 0000 +M520201211111121373120130101WTTTY0@@W122222222222 0422011 0000 +M42020121111112140220600401151992113 +M520201211111121402119840726WTTT#9@0012222222222210112111118860000 +M520201211111121402120120626WTTT#@9Y9122222222222 0422021 0000 +M520201211111121402120080502WTTTYYY0B122222222222 0422061 0000 +M42020121111112173021400401581163113 +M520201211111121730119910823WTTTYW@0Y22222122222210112111115690000 +M520201211111121730120180621WTTT0@BB0222222222222 0422981 0000 +M42020121111112194022700403941122113 +M520201211111121940119750602WTTTPZ0TY22212222222210112161120560000 +M520201211111121940120110122WTTT#9PWP222122222222 0422031 0000 +M42020121111112199121100401181163113 +M520201211111121991119820701WTTT0P@9Z22222222222220112111118060000 +M520201211111121991120170126WTTTPYW9T122222122221 0422981 0644 +M520201211111121991120170126WTTT0BPB@122222122221 0422981 0644 +M520201211111121991120090619WTTTY0B9T222222222222 0422051 0000 +M42020121111112247620900403031013113 +M520201211111122476219820101WTTT#W9WY22212212222220212113200000000 +M520201211111122476119810614WTTTYT@Y022212222222220112141144190000 +M520201211111122476120170615WTTT0@P#@222122122222 0422981 0000 +M520201211111122476120040615WTTT#900T222122222222 0422101 0000 +M42020121111112251620900404651163113 +M520201211111122516119750618WTTT0@00#22222222222210112081125710000 +M520201211111122516120050707WTTTY90T@222222122222 0422091 0000 +M42020121111112251721700401121193113 +M520201211111122517119780108WTTT##PZ#22212222222210112111130760579 +M520201211111122517120180719WTTTY090@222122222222 0422981 0000 +M520201211111122517120100619WTTTPWPPZ222122222222 0422041 0000 +M520201211111122517120070106WTTTYZ@PB222122122222 0422071 0000 +M520201211111122517120050801WTTTYT9WT222122122222 0422091 0000 +M42021011111111115321200404541013113 +M520210111111111153119790109WTTT0PYYT22222122222210112121124100000 +M520210111111111153120070101WTTTYP99Z222221222222 0422071 0000 +M42021011111111141920600405171161113 +M520210111111111419119920808WTTT0B#0T22212222222210112121122580000 +M520210111111111419120170708WTTTPZ@BW222122122222 0422981 0000 +M42021011111111149420900406601012113 +M520210111111111494119820119WTTT00Y9912222222222210112111123400238 +M520210111111111494120191107WTTTPYPBB222222122222 0422981 0000 +M520210111111111494120120823WTTT#P#TY122222122222 0422021 0000 +M42021011111111228120600402121163113 +M520210111111112281119810601WTTT#PT@@22222122222210112131123400000 +M520210111111112281120130813WTTTPT9WT222221122222 0422011 0000 +M42021011111111229420000404661991113 +M520210111111112294119830608WTTTYWPWY22222122222230112981133880000 +M520210111111112294120111123WTTT##TZ#222221222222 0422031 0000 +M520210111111112294120070721WTTTPZ0#P222221222222 0422071 0000 +M520210111111112294120050807WTTTP@BP0222221122222 0422091 0000 +M520210111111112294120040715WTTTPBT#0222221222222 0422101 0000 +M42021011111111250121400406791163113 +M520210111111112501119910114WTTT##T@P22222122222210112111122680000 +M520210111111112501120170702WTTT0P#@B222222222222 0422981 0000 +M520210111111112501120150702WTTTY0T@Z222221222222 0422981 0000 +M42021011111111259420600401161163113 +M520210111111112594119780621WTTT#0W#B12222222222210112141126090000 +M520210111111112594120140119WTTT0W@B#222222222222 0422981 0000 +M520210111111112594120030513WTTTPYBZ0222122222222 0422111 0000 +M42021011111111283620000402281013113 +M520210111111112836119920506WTTTPWW0P12222122222210112981112120000 +M520210111111112836120180114WTTTP0BWT122222122222 0422981 0000 +M42021011111111299821700406571163113 +M520210111111112998119950502WTTT0BYBB22222122222210112121127300000 +M520210111111112998120190115WTTTP0ZT#222222122222 0422981 0000 +M520210111111112998120171102WTTT0BPZT222221222222 0422981 0000 +M42021011111111341822700403241163113 +M520210111111113418119980701WTTTPZYY922212222222210112121112080000 +M520210111111113418120190806WTTT#0B00222222122222 0422981 0000 +M520210111111113418120160102WTTT09Y@P222122222222 0422981 0000 +M42021011111111357522700400381163113 +M520210111111113575119820113WTTTP0PT#22222122222250112111123480000 +M520210111111113575120101102WTTT0ZPWB222221122222 0422041 0200 +M520210111111113575120070509WTTT0P0TT222221222222 0422071 0200 +M520210111111113575120050807WTTT0WB#T222221222222 0422091 0200 +M42021011111111447720000400791163113 +M520210111111114477119840826WTTT#ZWYZ22222122222220212121120990000 +M520210111111114477119770501WTTTY0ZB022222112222220112121152910000 +M520210111111114477120160715WTTT#YZB@222221122222 0422981 0000 +M520210111111114477120100515WTTTBT9WZ221222222221 0422041 0215 +M520210111111114477120071108WTTT0ZTBT222221222222 0422071 0000 +M42021011111111492620900400261122113 +M520210111111114926119910126WTTT#P0ZB12222222222210112081111050000 +M520210111111114926120150706WTTT0P@PZ122221122222 0422981 0000 +M42021011111111539921100406471163113 +M520210111111115399219930102WTTT##YPT12222222222130112081200000779 +M520210111111115399119770714WTTTYPTZT22212212222211012121120910000 +M520210111111115399120201116WTTT0TBWW222222122222 0422981 0000 +M42021011111111557720600405471163113 +M520210111111115577119860126WTTTYP9Z912222212222210112111132730000 +M520210111111115577120080126WTTTPB@TW122222122222 0422061 0000 +M520210111111115577120060106WTTTYTP#0222222122222 0422071 0000 +M520210111111115577120050108WTTTP00T#122222222222 0422081 0000 +M42021011111111563320600401601993113 +M520210111111115633119930119WTTT00T0@22212212222210112111126610000 +M520210111111115633120160521WTTTPB99Y222222122222 0422981 0000 +M42021011111111563520900400501163113 +M520210111111115635119780815WTTTY9BY@22212222222210112112118730000 +M520210111111115635120190723WTTTPZ0Z9222222222222 0422981 0000 +M42021011111111572920900403031012113 +M520210111111115729119840721WTTTP@0T012212222222210112121126900000 +M520210111111115729120060708WTTTPP0W#222222122222 0422081 0160 +M520210111111115729120040126WTTTY@TB0222222122222 0422091 0000 +M42021011111111603720500402421163113 +M520210111111116037119690719WTTT0B09Z22222122222250112111123170000 +M520210111111116037120020119WTTT09ZYZ222221122222 0422111 0000 +M42021011111111671921100401691163113 +M520210111111116719119820615WTTT#TYW022222122222250112111120980000 +M520210111111116719120080715WTTT##BW#222222222222 0422061 0000 +M520210111111116719120060115WTTT0PB@Z222222222222 0422081 0000 +M42021011111111683320900402921163123 +M520210111111116833119850123WTTTP0W9922212212222230112111100000000 +M520210111111116833120170707WTTT#@9TT222222122222 0422981 0000 +M520210111111116833120110101WTTT0TBP#222122222222 0422031 0000 +M520210111111116833120090723WTTTPW0TZ222122222222 0422051 0000 +M42021011111111684820000402281993113 +M520210111111116848219840507WTTT##TP@22122222222220212113200000000 +M520210111111116848119810726WTTTYY@T#22122212222220112111133350000 +M520210111111116848120200115WTTTBTZT@221222222222 0422981 0000 +M520210111111116848120160815WTTTPPZ0Y221222122222 0422981 0000 +M42021011111111725021100406391163113 +M520210111111117250219880115WTTT0TB9022222222222230212113200000040 +M520210111111117250119840118WTTT#9@TP22212212222220112111116900000 +M520210111111117250120180626WTTT#YBWY222222222222 0422981 0000 +M520210111111117250120170108WTTT0BWTW222222122222 0422981 0000 +M42021011111111726922400400121013113 +M520210111111117269119830815WTTT#90ZY22212222222210112111137050000 +M520210111111117269120150122WTTTP#YZY222222122222 0422981 0000 +M520210111111117269120090101WTTTYZTYT222122122222 0422041 0000 +M42021011111111737820000404151163113 +M520210111111117378119840116WTTT#PYW#22222122222230112121100000000 +M520210111111117378120180607WTTTYW0YB222122122222 0422981 0000 +M520210111111117378120150709WTTT0Y#@#222221122222 0422981 0000 +M520210111111117378120130716WTTT#@TP0222221122222 0422011 0000 +M42021011111111748620900406151162113 +M520210111111117486119880715WTTT0BB0B22212222222210112121112970000 +M520210111111117486120170101WTTTPBT@9222122122222 0422981 0000 +M520210111111117486120160601WTTTY#0PT222222222222 0422981 0000 +M520210111111117486120090722WTTT09WWW222122122222 0422051 0000 +M42021011111111781520600402031993113 +M520210111111117815119910512WTTTYW9Z@22212222222210112121128070000 +M520210111111117815120150702WTTT#P#PT222222122222 0422981 0000 +M520210111111117815120130702WTTT#WY9B222222222222 0422011 0000 +M520210111111117815120100121WTTTYB00#222222122222 0422041 0000 +M42021011111111783121400401581013113 +M520210111111117831119940616WTTTY0TP@22222122222210112111128530000 +M520210111111117831120170119WTTT0#9B0222221122222 0422981 0000 +M42021011111111798922700403241163113 +M520210111111117989119920815WTTT0TWWW22222122222210112111122610000 +M520210111111117989120140106WTTTYWB99222122222222 0422981 0000 +M42021011111111810620000403721162113 +M520210111111118106119710113WTTTBTZ@P22222122222210112131132100000 +M520210111111118106120070523WTTTYPY9P122222222222 0422071 0000 +M520210111111118106120040106WTTTYPZBY122222122222 0422101 0000 +M42021011111111822922700402231013113 +M520210111111118229119830515WTTTPTBZ912222212222250112121136070000 +M520210111111118229120150715WTTT0ZZB0122222122222 0422981 0000 +M520210111111118229120060106WTTT0BZ0Y122222122222 0422071 0000 +M520210111111118229120040701WTTT0B0YT122222222222 0422101 0000 +M42021011111111861122400401481993113 +M520210111111118611119910701WTTT0BB9T22212222222210112111122950000 +M520210111111118611120190501WTTT##WPP222222222222 0422981 0000 +M42021011111111874522700400671012113 +M520210111111118745119830503WTTT#B##B22222122222210112131118290000 +M520210111111118745120150103WTTT09@ZB222222122222 0422981 0000 +M520210111111118745120060519WTTTYTB0W222222122222 0422081 0000 +M42021011111111921120000404151163113 +M520210111111119211219860718WTTT##BZZ22122222222220112113200000000 +M520210111111119211119830107WTTTP0WWW22122212222220212112126000000 +M520210111111119211120180119WTTT##@WP222222122222 0422981 0000 +M520210111111119211120170126WTTTPP0T@221222122222 0422981 0000 +M520210111111119211120100721WTTTPYY@#221222122222 0422043 0000 +M42021011111111958620900406421163113 +M520210111111119586119991101WTTTPYTY#22212222222210112111112010150 +M520210111111119586120180701WTTTP#TYZ222122222222 0422981 0000 +M42021011111111993721700401121161123 +M520210111111119937119660613WTTT#WZ9Y12222222222220112112121900000 +M520210111111119937120110119WTTTPZ@Y0122222122222 0422021 0000 +M42021011111111993921400405841162113 +M520210111111119939119840815WTTT#000Z12222122222210112141130330000 +M520210111111119939120120513WTTT0W@ZT222221122222 0422021 0000 +M520210111111119939120090106WTTTPYP09122221122222 0422051 0000 +M42021011111112016321700405121161113 +M520210111111120163119970101WTTT#YW##12222222222210112081112480000 +M520210111111120163120170101WTTTY@WB9122222222222 0422981 0000 +M520210111111120163120150506WTTT0PT0#122221122222 0422981 0000 +M42021011111112027120000401371163113 +M520210111111120271119820126WTTT#9PW022222112222250112111159540000 +M520210111111120271120130701WTTT00@ZW222222122222 0422011 0000 +M520210111111120271120120618WTTT0PT#Z222221122222 0422021 0000 +M520210111111120271120100701WTTT0P#90222221222222 0422041 0000 +M42021011111112089621400400351163113 +M520210111111120896119670114WTTTPT@Y#22212222222220212112120090000 +M520210111111120896119610715WTTT0TYP022212212222220112121124290000 +M520210111111120896120110723WTTTP#B90222122222222 0422031 0000 +M520210111111120896120080623WTTT#0BP9222122122222 0422061 0000 +M520210111111120896120030126WTTT0PYP9222122222222 0422111 0000 +M42021011111112096421400401581013113 +M520210111111120964119840123WTTT0P9#Z22222122222210112111118580230 +M520210111111120964120200614WTTTPZZPP222221122222 0422981 0000 +M520210111111120964120190621WTTT0#9BT222221222222 0422981 0000 +M42021011111112099420600401981163113 +M520210111111120994119981103WTTT##P@Y22212222222210112121122840000 +M520210111111120994120200515WTTT0ZZ#P222122222222 0422981 0000 +M520210111111120994120180119WTTTYBPPB122222122222 0422981 0000 +M520210111111120994120160702WTTT#BYP0222122122222 0422981 0000 +M42021011111112119321100401691163113 +M520210111111121193119720115WTTTPTYBW12222222222210112121124570000 +M520210111111121193120060702WTTTP#9ZW122222222222 0422081 0000 +M520210111111121193120040607WTTTPWZP9122222122222 0422101 0000 +M42021011111112178320600402981122113 +M520210111111121783119880101WTTT0BYB912222222222210112121231600000 +M520210111111121783119860607WTTT#@Z@Y12222212222210212121200000238 +M520210111111121783120120108WTTT#9TZ@122222122222 0422021 0000 +M520210111111121783120081118WTTTP#T#T122222222222 0422061 0000 +M520210111111121783120060802WTTT09TYT122222222222 0422081 0000 +M42021011111112181321700404201163113 +M520210111111121813119870121WTTT09WT@12222122222210112131130600000 +M520210111111121813120180123WTTT00Y9Z222222122222 0422981 0000 +M520210111111121813120160509WTTTYYYTY122221122222 0422981 0000 +M520210111111121813120050118WTTTPYW@T222221222222 0422091 0000 +M42021011111112210221700400981162113 +M520210111111122102119860515WTTT#Z@BW12222222222220112121126690000 +M520210111111122102120180726WTTTYYWBW122222222222 0422981 0000 +M520210111111122102120161113WTTT#PZ@9122221122222 0422981 0000 +M520210111111122102120150712WTTTPYPZ@122221222222 0422981 0000 +M520210111111122102120120109WTTT#YBYZ122222222222 0422021 0000 +M520210111111122102120090121WTTTP@0YB122221222222 0422051 0000 +M520210111111122102120070107WTTTPW9BW122222222222 0422071 0000 +M520210111111122102120060115WTTT0TWY9122222222222 0422081 0000 +M42021011111112225521100406001161123 +M520210111111122255119830126WTTTP@W#012222222222210112112125110000 +M520210111111122255120080515WTTTY00TY122222122222 0422061 0000 +M520210111111122255120060713WTTT##0@9122222222222 0422081 0000 +M520210111111122255120040601WTTT0#YPY222222122222 0422102 0000 +M42021011111112292622700402231193113 +M520210111111122926119830103WTTT0990P22222122222250112111118330000 +M520210111111122926120160101WTTT0W0@W222222122222 0422981 0000 +M42021021111111182421700405821163113 +M520210211111111824119890626WTTTYBW9#12212222222210112141142910000 +M520210211111111824120190718WTTT#@TBP122122222222 0422981 0000 +M520210211111111824120180522WTTTY@0ZZ122122122222 0422981 0000 +M520210211111111824120120709WTTTPZZP9122222122222 0422021 0000 +M42021021111111225722700400681163113 +M520210211111112257119870116WTTTYPBWY22212122222210112121120800000 +M520210211111112257120100118WTTTPPWPT222221222222 0422041 0000 +M520210211111112257120081119WTTT00YTP222221122222 0422061 0000 +M42021021111111284321100406001161113 +M520210211111112843119800101WTTTYT0TZ22212222222210112121122100000 +M520210211111112843120060815WTTT0TT0Z222122222222 0422081 0000 +M520210211111112843120050713WTTTPZ0@W222122122222 0422091 0000 +M520210211111112843120030723WTTT0TBBT222122122222 0422111 0000 +M42021021111111337521400403641013113 +M520210211111113375119810119WTTT#99PT22222122222210112131116300000 +M520210211111113375120170714WTTTPBBYB222221122222 0422981 0000 +M42021021111111357420600402031162113 +M520210211111113574119910721WTTT0#WWT11111122222210112121119350000 +M520210211111113574120160119WTTTPTWYZ122222222222 0422981 0000 +M42021021111111362320600405471163113 +M520210211111113623119920622WTTTYB90Z12222222222210112121124710000 +M520210211111113623120110815WTTT0B0#B122222222222 0422031 0000 +M42021021111111379121100406001993113 +M520210211111113791119890626WTTT0TB9Y12222222222220112111124260000 +M520210211111113791120150108WTTTY9##Z122222222222 0422981 0000 +M520210211111113791120110109WTTTYTPYW122222122222 0422031 0000 +M42021021111111380421100405971161113 +M520210211111113804119900507WTTT#B0T912222222222210112131136390000 +M520210211111113804120100519WTTT0@YZ9122222222222 0422041 0000 +M520210211111113804120100519WTTTP9@T@122222122222 0422041 0000 +M520210211111113804120090723WTTTY@9YY122222222222 0422051 0000 +M42021021111111393420000400941991113 +M520210211111113934119870602WTTT#BB0P12222222222210112111114070000 +M520210211111113934120160107WTTTPPPB9122222122222 0422981 0000 +M520210211111113934120120719WTTT0YZTW122222122222 0422021 0000 +M520210211111113934120101121WTTTP9BY0122222122222 0422041 0000 +M42021021111111401722400401011013123 +M520210211111114017119891107WTTTPZBWT22222212222250112111130770000 +M520210211111114017120160101WTTT#09#Z222222222222 0422981 0000 +M520210211111114017120130108WTTTPZ#90222222122222 0422011 0000 +M42021021111111403020900401031163113 +M520210211111114030119840101WTTT0#WY022222222222220112112117330000 +M520210211111114030120040102WTTT0@TW@222222122222 0422102 0000 +M42021021111111434021400401581163113 +M520210211111114340119890701WTTT0YPBW22222122222210112111115770000 +M520210211111114340120200715WTTT0PZ0W222221222222 0422981 0000 +M520210211111114340120170119WTTTP90ZB222121122222 0422981 0000 +M520210211111114340120120809WTTTPB@@0222121122222 0422021 0000 +M42021021111111503521700402341163113 +M520210211111115035119940126WTTT0Z0YY12222222222210112111118960087 +M520210211111115035120181103WTTT0TPTW122221222222 0422981 0000 +M520210211111115035120140515WTTT#999Y222222222222 0422981 0000 +M42021021111111524422400404731161113 +M520210211111115244119880706WTTT#WTZZ22212222222210112131118120172 +M520210211111115244120150615WTTTPWZ0P222122222222 0422981 0000 +M520210211111115244120130716WTTT0ZW9P222122122222 0422011 0000 +M520210211111115244120100502WTTT09BTZ222122122222 0422041 0000 +M42021021111111548521700401121012113 +M520210211111115485119630101WTTT#@ZBZ22222122222250112121128640000 +M520210211111115485120030123WTTTPWWPP222221222222 0422111 0000 +M42021021111111602020000403951162113 +M520210211111116020119830521WTTTYB@T@12222222222210112111122380000 +M520210211111116020120180609WTTT09Z9B122222222222 0422981 0000 +M520210211111116020120140119WTTT#@YW0122222122222 0422981 0000 +M520210211111116020120110509WTTT#WY#T122221222222 0422031 0000 +M520210211111116020120080709WTTT0#BBY122222222222 0422061 0000 +M520210211111116020120070703WTTTYZTTW122222122222 0422071 0000 +M42021021111111613020000402591161113 +M520210211111116130119870703WTTTPYZWB12222222222210112121124670000 +M520210211111116130120120101WTTT0W9#Y122222222222 0422021 0000 +M520210211111116130120120101WTTT0@#TY122222122222 0422021 0000 +M520210211111116130120110712WTTTYP##W122222222222 0422031 0000 +M520210211111116130120060106WTTT0WBW#122222222222 0422081 0000 +M42021021111111621621100401461162113 +M520210211111116216119770801WTTTP#ZWW12222222222210112122120790000 +M520210211111116216120100601WTTT0@Z#Z222222222222 0422042 0000 +M42021021111111802520500402421163113 +M520210211111118025119890701WTTTYYTWB22222122222210112111120180000 +M520210211111118025120071106WTTT0@BB@222221222222 0422071 0000 +M42021021111111820221400400161163113 +M520210211111118202119930703WTTT#9PZ#22212222222230112131126050000 +M520210211111118202120160113WTTT##ZYZ222222122222 0422981 0000 +M520210211111118202120120726WTTT#WPWT222122222222 0422021 0000 +M42021021111111868420600405341163113 +M520210211111118684119890515WTTT0PZB@12222222222210112121116350000 +M520210211111118684120150121WTTT#P0@Y122221122221 0422981 0813 +M520210211111118684120120719WTTTPZP9#122222222222 0422021 0000 +M520210211111118684120100714WTTTPTB@@122222222222 0422041 0000 +M520210211111118684120080803WTTTYYB#W122222122221 0422061 0803 +M520210211111118684120060112WTTTPPT9#122222122222 0422081 0000 +M42021021111111885620300404901163113 +M520210211111118856119951112WTTTPT#9W22122222222210112111126000000 +M520210211111118856120160119WTTTYPZW0221222222222 0422981 0000 +M520210211111118856120130115WTTTP##WT221222222222 0422011 0000 +M42021021111111923722700401651162113 +M520210211111119237119900823WTTT#WTBP22222122222210112121122860000 +M520210211111119237120180119WTTTPP@BB222222222222 0422981 0000 +M520210211111119237120130101WTTT0W0WB222221222222 0422011 0000 +M520210211111119237120090821WTTTP#T90222221122222 0422051 0000 +M42021021111111928022700400681163113 +M520210211111119280119930803WTTTPT##T12222222222210112121117460000 +M520210211111119280120120509WTTT#@WTB122222222222 0422021 0000 +M520210211111119280120110601WTTT#@WPW122222222222 0422031 0000 +M42021021111111952720600402981161113 +M520210211111119527119890606WTTT0YYBW22212222222210112131122830000 +M520210211111119527120100601WTTT0Y@PP222122222222 0422041 0000 +M42021021111111973720900402151161113 +M520210211111119737119850114WTTTP@Z0#22222122222210112121116980000 +M520210211111119737120150115WTTT09PT0222122222222 0422981 0000 +M42021021111111996920900401881161123 +M520210211111119969119890606WTTTY@0YY12222222222210112121130160000 +M520210211111119969120170719WTTT#PBTW222222222222 0422981 0000 +M520210211111119969120090616WTTT00YBB122222222222 0422051 0000 +M42021021111112068521400400561013113 +M520210211111120685119800821WTTT0PBWT22222122222220212131133180000 +M520210211111120685119760601WTTTPYYY#22222112222210112111123150000 +M520210211111120685120190516WTTTY@YBT222222122222 0422981 0000 +M520210211111120685120060708WTTTY#T@W222221122222 0422081 0000 +M520210211111120685120040121WTTTPT#@Y222221122222 0422101 0000 +M42021021111112139921700402381013113 +M520210211111121399119860819WTTT0990B22222122222230112121129670000 +M520210211111121399120130506WTTT0Z9W0222222222222 0422011 0000 +M520210211111121399120060608WTTT#T@@P222222122222 0422081 0000 +M42021021111112145921700406831123113 +M520210211111121459119930101WTTT0PP#B12222122222210112121133530000 +M520210211111121459120190113WTTTYT@YP222222222222 0422981 0000 +M520210211111121459120180101WTTT#@TT#222222122222 0422981 0000 +M42021021111112165820600401981163113 +M520210211111121658119710501WTTT#0W0T12222212222210112111119150000 +M520210211111121658120030526WTTTYTW@B122221222222 0422111 0000 +M42021021111112234621100406001163113 +M520210211111122346119800118WTTT#PBT912222222222210112121116640399 +M520210211111122346120160621WTTT0#W9@122221122222 0422981 0000 +M520210211111122346120100118WTTTP@WBY122222122222 0422041 0000 +M520210211111122346120060522WTTTP@Y#9122222222222 0422081 0000 +M42021021111112247320000406951163123 +M520210211111122473220060715WTTT0B@#Y22222212222210412113200000000 +M520210211111122473219750502WTTT#B#0922222222222220212113200000000 +M520210211111122473119610101WTTTPZY9922222212222220112111121550000 +M520210211111122473120150726WTTTPTBPY222222222222 0422981 0000 +M520210211111122473120090519WTTTPBWZT222222122222 0422053 0000 +M520210211111122473120070721WTTTPPT0#222222222222 0422073 0000 +M42021031111111120420600405771162113 +M520210311111111204119920608WTTT#@W#912222222222210112111118180000 +M520210311111111204120171102WTTT#Z9TZ122222122222 0422981 0000 +M520210311111111204120130701WTTT#0ZP0122222122222 0422011 0000 +M42021031111111129122700403941013113 +M520210311111111291119900708WTTTYTTZ922212222222210112141128510000 +M520210311111111291120180521WTTTP##BT222122122222 0422981 0000 +M42021031111111132122700402231163113 +M520210311111111321119810613WTTTYW@@Y22212221222220112082120030295 +M520210311111111321120150115WTTTY@B@Z122222222222 0422981 0295 +M520210311111111321120100119WTTT0#T##222222222222 0422042 0295 +M520210311111111321120040126WTTT#B#ZT222222222222 0422102 0295 +M42021031111111229020900401231163113 +M520210311111112290119810721WTTT#0ZWY12222122222210112132128330000 +M520210311111112290120120101WTTT#BPZ0122221122222 0422022 0000 +M520210311111112290120090815WTTTPPP#@122221122222 0422051 0000 +M520210311111112290120060119WTTTYTY9T122221222222 0422081 0000 +M42021031111111316422700403941163113 +M520210311111113164119760702WTTT#00W922222222222210112112125010000 +M520210311111113164120160501WTTTYZ90Y222222122222 0422981 0000 +M520210311111113164120051108WTTT0@W9#222222222222 0422092 0000 +M42021031111111437120500406931163113 +M520210311111114371119921121WTTTP0PY022222122222210112111119960000 +M520210311111114371120200119WTTT#YW#T222222122222 0422981 0000 +M42021031111111451822700403941191113 +M520210311111114518119880108WTTTYWBBW22212222222210112121127570000 +M520210311111114518120180103WTTT#WB@Z122222122222 0422981 0000 +M520210311111114518120180103WTTTP@@P0122222122222 0422981 0000 +M520210311111114518120170722WTTTPW9BP222222122222 0422981 0000 +M42021031111111491620600405171163113 +M520210311111114916120000521WTTTY9BPW12222222222210112121115000128 +M520210311111114916120180102WTTT0BWTB122222122222 0422981 0000 +M42021031111111506520600401981163113 +M520210311111115065119860601WTTTP9TP922212222222210112111123520000 +M520210311111115065120100618WTTTY0@YP222122122222 0422041 0000 +M520210311111115065120040106WTTT0#@W#222122222222 0422101 0000 +M520210311111115065120030709WTTT0WP9Z222122122222 0422111 0000 +M42021031111111518820000405691163113 +M520210311111115188119960815WTTT0YWZZ22222222222210112131113350000 +M520210311111115188120160116WTTT#Y0YZ122221222222 0422981 0000 +M42021031111111573020000404271013113 +M520210311111115730119910801WTTTYT#0922122222222210112081132060000 +M520210311111115730120170721WTTT#TZPW222222222222 0422981 0000 +M520210311111115730120120716WTTT#ZP#W221222222222 0422021 0000 +M42021031111111625221100406001163113 +M520210311111116252119910803WTTTP0BY@12222222222210112111114300000 +M520210311111116252120190115WTTTYB9ZW122221222222 0422981 0000 +M42021031111111626121700405121993113 +M520210311111116261119990109WTTT0@T0P12222122222210112111121270000 +M520210311111116261120190721WTTT#ZZWB222222222222 0422981 0000 +M42021031111111678921700401121161113 +M520210311111116789119800626WTTTYP@#B22222222222210112121131940000 +M520210311111116789120130709WTTT0PTBY222222122222 0422011 0000 +M520210311111116789120130709WTTT0Z0B9222222122222 0422011 0000 +M520210311111116789120110101WTTT#BTBY222222222222 0422031 0000 +M42021031111111709520600405471991113 +M520210311111117095119851107WTTTPPB0Z12222122222210112121122230000 +M520210311111117095120040106WTTT#B9@P122221222222 0422111 0000 +M42021031111111724021700406571163113 +M520210311111117240119850123WTTTPTW#P22222222222210112112125100000 +M520210311111117240120160723WTTTP9BW@222222122222 0422981 0000 +M520210311111117240120140515WTTTYW@ZP222222222222 0422981 0000 +M42021031111111733821100403751163113 +M520210311111117338119780108WTTT#@YYP22222122222210112121129270000 +M520210311111117338120080619WTTT0T#PY222222222222 0422061 0000 +M42021031111111761521100401461163113 +M520210311111117615119930619WTTTY0T@Y22212222222210112111124050000 +M520210311111117615120120107WTTT#ZTZW222122222222 0422021 0000 +M520210311111117615120110622WTTTP#WPY222122222222 0422031 0000 +M42021031111111848821400406481163113 +M520210311111118488119770622WTTT0ZB@922222122222210112111120790000 +M520210311111118488120090121WTTT0BY#0222222122222 0422051 0000 +M520210311111118488120050121WTTT#BP#0222221122222 0422091 0000 +M42021031111111895721400400351133113 +M520210311111118957119910602WTTT0@BPW22212222222210112131130000000 +M520210311111118957120160113WTTTPZZYY222222222222 0422981 0000 +M520210311111118957120150506WTTT0@P#9222122122222 0422981 0000 +M42021031111111927420600401421163113 +M520210311111119274119910113WTTTYB@#912222222222210112111116090000 +M520210311111119274120150715WTTTPB0@Z122222222222 0422981 0000 +M520210311111119274120110101WTTTY#@BW122222122222 0422041 0000 +M42021031111111978620300404901163123 +M520210311111119786120000626WTTT#@0Y922222122222210112121139580050 +M520210311111119786120180622WTTTYWZYW222222122222 0422981 0000 +M42021031111112009920000406201163113 +M520210311111120099119940114WTTTPY9BW22222122222210112111120480000 +M520210311111120099120200501WTTT#@P#B222222122222 0422981 0000 +M520210311111120099120160523WTTTPZ#BY222221222222 0422981 0000 +M520210311111120099120140119WTTT#9T#Z222221122222 0422011 0080 +M42021031111112028720000404551993113 +M520210311111120287119880123WTTT#T@PP22222122222230112111146581750 +M520210311111120287120170801WTTT#TW09122222222222 0422981 0000 +M520210311111120287120130103WTTTYPTBZ122222222222 0422011 0000 +M42021031111112152921100406541162113 +M520210311111121529119711119WTTT#@@YZ12222222222210112121128100000 +M520210311111121529120071119WTTTPTZ#9222122222222 0422071 0000 +M520210311111121529120030115WTTTP0TPT222122222222 0422111 0000 +M42021031111112160822700402581162113 +M520210311111121608119780107WTTTYPB@B12212122222210112111123470000 +M520210311111121608120030621WTTT0@99Z122222122222 0422111 0000 +M42021031111112182621100401181162113 +M520210311111121826119880808WTTTY@PPP22222222222220112121121340000 +M520210311111121826120150509WTTT0ZZW0222122222222 0422981 0000 +M520210311111121826120080621WTTT#PP90222122222222 0422061 0000 +M42021031111112189420000404271161123 +M520210311111121894119810608WTTT0WYBW22122222222250112112118420000 +M520210311111121894120190115WTTTBT@B#221222122222 0422981 0000 +M520210311111121894120120802WTTT#TTW@221222122222 0422021 0000 +M520210311111121894120110706WTTT#ZZY9221222122222 0422031 0000 +M42021031111112189520900404421163113 +M520210311111121895119901115WTTTPZ0ZP22212222222210112112117000000 +M520210311111121895120181113WTTT0@YW9222122122222 0422981 0000 +M520210311111121895120151126WTTT#TZ@B222122122222 0422981 0000 +M42021031111112189821100406001161113 +M520210311111121898119881114WTTT#YBZW12222222222210112121126890000 +M520210311111121898120120519WTTT#@#WZ222222122222 0422021 0000 +M520210311111121898120110115WTTTPBPZT222222122222 0422031 0000 +M520210311111121898120091107WTTT0ZBWB222222122222 0422051 0000 +M520210311111121898120080115WTTTYZZWZ222222122222 0422061 0000 +M520210311111121898120070126WTTTP99BW122222222222 0422081 0000 +M42021031111112197122700403241163123 +M520210311111121971119950509WTTT#@W#B22212222222210112112119590000 +M520210311111121971120170119WTTTP#@BT222122222222 0422981 0000 +M42021031111112222820900402921161123 +M520210311111122228119770709WTTT##Z@T12222222222210112112100000368 +M520210311111122228120160718WTTTYWZYY122222222222 0422981 0000 +M520210311111122228120031122WTTTY00B#122222222222 0422111 0000 +TRAILER0008941 diff --git a/tdrs-backend/tdpservice/parsers/test/factories.py b/tdrs-backend/tdpservice/parsers/test/factories.py index b12d3c5ad..63a6d237d 100644 --- a/tdrs-backend/tdpservice/parsers/test/factories.py +++ b/tdrs-backend/tdpservice/parsers/test/factories.py @@ -349,3 +349,39 @@ class Meta: TDRS_SECTION_IND = '1' STRATUM = '01' FAMILIES_MONTH = 1 + +class SSPM5Factory(factory.django.DjangoModelFactory): + """Generate SSP M5 record for testing.""" + + class Meta: + """Hardcoded meta data for SSP_M5.""" + + model = "search_indexes.SSP_M5" + + RPT_MONTH_YEAR = 1 + CASE_NUMBER = '1' + + FAMILY_AFFILIATION = 1 + DATE_OF_BIRTH = '11111111' + SSN = '123456789' + RACE_HISPANIC = 1 + RACE_AMER_INDIAN = 1 + RACE_ASIAN = 1 + RACE_BLACK = 1 + RACE_HAWAIIAN = 1 + RACE_WHITE = 1 + GENDER = 1 + REC_OASDI_INSURANCE = 1 + REC_FEDERAL_DISABILITY = 1 + REC_AID_TOTALLY_DISABLED = 1 + REC_AID_AGED_BLIND = 1 + REC_SSI = 1 + MARITAL_STATUS = 1 + RELATIONSHIP_HOH = '01' + PARENT_MINOR_CHILD = 1 + NEEDS_OF_PREGNANT_WOMAN = 1 + EDUCATION_LEVEL = '01' + CITIZENSHIP_STATUS = 1 + EMPLOYMENT_STATUS = 1 + AMOUNT_EARNED_INCOME = '1000' + AMOUNT_UNEARNED_INCOME = '1000' diff --git a/tdrs-backend/tdpservice/parsers/test/test_parse.py b/tdrs-backend/tdpservice/parsers/test/test_parse.py index 305a0a721..088fc9795 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_parse.py +++ b/tdrs-backend/tdpservice/parsers/test/test_parse.py @@ -5,7 +5,7 @@ from .. import parse from ..models import ParserError, ParserErrorCategoryChoices, DataFileSummary from tdpservice.search_indexes.models.tanf import TANF_T1, TANF_T2, TANF_T3, TANF_T4, TANF_T5, TANF_T6, TANF_T7 -from tdpservice.search_indexes.models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M6, SSP_M7 +from tdpservice.search_indexes.models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M4, SSP_M5, SSP_M6, SSP_M7 from .factories import DataFileSummaryFactory from tdpservice.data_files.models import DataFile from .. import schema_defs, util @@ -561,6 +561,7 @@ def super_big_s1_file(stt_user, stt): @pytest.mark.django_db() +@pytest.mark.skip(reason="long runtime") # big_files def test_parse_super_big_s1_file(super_big_s1_file): """Test parsing of super_big_s1_file and validate all T1/T2/T3 records are created.""" parse.parse_datafile(super_big_s1_file) @@ -927,12 +928,36 @@ def test_parse_ssp_section4_file(ssp_section4_file): assert first.RPT_MONTH_YEAR == 201810 assert first.FAMILIES_MONTH == 748 +@pytest.fixture +def ssp_section2_file(stt_user, stt): + """Fixture for ADS.E2J.FTP4.TS06.""" + return util.create_test_datafile('ADS.E2J.NDM2.MS24', stt_user, stt, 'SSP Closed Case Data') + +@pytest.mark.django_db() +def test_parse_ssp_section2_file(ssp_section2_file): + """Test parsing SSP Section 2 submission.""" + parse.parse_datafile(ssp_section2_file) + + m4_objs = SSP_M4.objects.all().order_by('id') + m5_objs = SSP_M5.objects.all().order_by('AMOUNT_EARNED_INCOME') + + assert SSP_M4.objects.all().count() == 2205 + assert SSP_M5.objects.all().count() == 6736 + + m4 = m4_objs.first() + assert m4.DISPOSITION == 1 + assert m4.REC_SUB_CC == 3 + + m5 = m5_objs.first() + assert m5.FAMILY_AFFILIATION == 1 + assert m5.AMOUNT_EARNED_INCOME == '0000' + assert m5.AMOUNT_UNEARNED_INCOME == '0000' + @pytest.fixture def ssp_section3_file(stt_user, stt): """Fixture for ADS.E2J.FTP3.TS06.""" return util.create_test_datafile('ADS.E2J.NDM3.MS24', stt_user, stt, "SSP Aggregate Data") - @pytest.mark.django_db() def test_parse_ssp_section3_file(ssp_section3_file): """Test parsing TANF Section 3 submission.""" diff --git a/tdrs-backend/tdpservice/parsers/test/test_validators.py b/tdrs-backend/tdpservice/parsers/test/test_validators.py index ecca06561..db7153c41 100644 --- a/tdrs-backend/tdpservice/parsers/test/test_validators.py +++ b/tdrs-backend/tdpservice/parsers/test/test_validators.py @@ -3,6 +3,7 @@ import pytest from .. import validators from tdpservice.parsers.test.factories import TanfT1Factory, TanfT2Factory, TanfT3Factory, TanfT5Factory, TanfT6Factory +from tdpservice.parsers.test.factories import SSPM5Factory def test_or_validators(): @@ -1024,3 +1025,136 @@ def test_sum_of_recipients(self, record): assert result == (False, "The sum of ['NUM_ADULT_RECIPIENTS', 'NUM_CHILD_RECIPIENTS'] does not equal " + "NUM_RECIPIENTS.") + +class TestM5Cat3Validators(TestCat3ValidatorsBase): + """Test category three validators for TANF T6 records.""" + + @pytest.fixture + def record(self): + """Override default record with TANF T6 record.""" + return SSPM5Factory.create() + + def test_fam_affil_ssn(self, record): + """Test cat3 validator for family affiliation and ssn.""" + val = validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='SSN', result_function=validators.validateSSN(), + ) + + result = val(record) + assert result == (True, None) + + record.SSN = '111111111' + result = val(record) + + assert result == (False, "if FAMILY_AFFILIATION :1 validator1 passed then SSN 111111111 is in ['000000000', " + + "'111111111', '222222222', '333333333', '444444444', '555555555', '666666666', '777777777'," + + " '888888888', '999999999'].") + + def test_validate_race_ethnicity(self, record): + """Test cat3 validator for race/ethnicity.""" + races = ["RACE_HISPANIC", "RACE_AMER_INDIAN", "RACE_ASIAN", "RACE_BLACK", "RACE_HAWAIIAN", "RACE_WHITE"] + for race in races: + val = validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field=race, result_function=validators.isInLimits(1, 2), + ) + result = val(record) + assert result == (True, None) + + def test_fam_affil_marital_stat(self, record): + """Test cat3 validator for family affiliation, and marital status.""" + val = validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='MARITAL_STATUS', result_function=validators.isInLimits(1, 5), + ) + + result = val(record) + assert result == (True, None) + + record.MARITAL_STATUS = 0 + + result = val(record) + assert result == (False, 'if FAMILY_AFFILIATION :1 validator1 passed then MARITAL_STATUS 0 is not larger ' + + 'or equal to 1 and smaller or equal to 5.') + + def test_fam_affil_parent_with_minor(self, record): + """Test cat3 validator for family affiliation, and parent with minor child.""" + val = validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 2), + result_field='PARENT_MINOR_CHILD', result_function=validators.isInLimits(1, 3), + ) + + result = val(record) + assert result == (True, None) + + record.PARENT_MINOR_CHILD = 0 + + result = val(record) + assert result == (False, 'if FAMILY_AFFILIATION :1 validator1 passed then PARENT_MINOR_CHILD 0 is not ' + + 'larger or equal to 1 and smaller or equal to 3.') + + def test_fam_affil_ed_level(self, record): + """Test cat3 validator for family affiliation, and education level.""" + val = validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.isInLimits(1, 3), + result_field='EDUCATION_LEVEL', result_function=validators.or_validators( + validators.isInStringRange(1, 16), validators.isInStringRange(98, 99)), + ) + + result = val(record) + assert result == (True, None) + + record.EDUCATION_LEVEL = 0 + + result = val(record) + assert result == (False, 'if FAMILY_AFFILIATION :1 validator1 passed then EDUCATION_LEVEL 0 is not in range ' + + '[1, 16]. or 0 is not in range [98, 99].') + + def test_fam_affil_citz_stat(self, record): + """Test cat3 validator for family affiliation, and citizenship status.""" + val = validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='CITIZENSHIP_STATUS', result_function=validators.isInLimits(1, 3), + ) + + result = val(record) + assert result == (True, None) + + record.CITIZENSHIP_STATUS = 0 + + result = val(record) + assert result == (False, 'if FAMILY_AFFILIATION :1 validator1 passed then CITIZENSHIP_STATUS 0 is not larger ' + + 'or equal to 1 and smaller or equal to 3.') + + def test_dob_oasdi_insur(self, record): + """Test cat3 validator for dob, and REC_OASDI_INSURANCE.""" + val = validators.if_then_validator( + condition_field='DATE_OF_BIRTH', condition_function=validators.olderThan(18), + result_field='REC_OASDI_INSURANCE', result_function=validators.isInLimits(1, 2), + ) + + result = val(record) + assert result == (True, None) + + record.REC_OASDI_INSURANCE = 0 + + result = val(record) + assert result == (False, 'if DATE_OF_BIRTH :11111111 validator1 passed then REC_OASDI_INSURANCE 0 is not ' + + 'larger or equal to 1 and smaller or equal to 2.') + + def test_fam_affil_fed_disability(self, record): + """Test cat3 validator for family affiliation, and REC_FEDERAL_DISABILITY.""" + val = validators.if_then_validator( + condition_field='FAMILY_AFFILIATION', condition_function=validators.matches(1), + result_field='REC_FEDERAL_DISABILITY', result_function=validators.isInLimits(1, 2), + ) + + result = val(record) + assert result == (True, None) + + record.REC_FEDERAL_DISABILITY = 0 + + result = val(record) + assert result == (False, 'if FAMILY_AFFILIATION :1 validator1 passed then REC_FEDERAL_DISABILITY 0 is not ' + + 'larger or equal to 1 and smaller or equal to 2.') diff --git a/tdrs-backend/tdpservice/parsers/util.py b/tdrs-backend/tdpservice/parsers/util.py index 3ee209607..c8f33d7a9 100644 --- a/tdrs-backend/tdpservice/parsers/util.py +++ b/tdrs-backend/tdpservice/parsers/util.py @@ -161,8 +161,8 @@ def get_schema_options(program, section, query=None, model=None, model_name=None 'C': { 'section': DataFile.Section.SSP_CLOSED_CASE_DATA, 'models': { - # 'M4': schema_defs.ssp.m4, - # 'M5': schema_defs.ssp.m5, + 'M4': schema_defs.ssp.m4, + 'M5': schema_defs.ssp.m5, } }, 'G': { diff --git a/tdrs-backend/tdpservice/search_indexes/admin/__init__.py b/tdrs-backend/tdpservice/search_indexes/admin/__init__.py index f9b99f7d9..29e140056 100644 --- a/tdrs-backend/tdpservice/search_indexes/admin/__init__.py +++ b/tdrs-backend/tdpservice/search_indexes/admin/__init__.py @@ -13,5 +13,7 @@ admin.site.register(models.ssp.SSP_M1, ssp.SSP_M1Admin) admin.site.register(models.ssp.SSP_M2, ssp.SSP_M2Admin) admin.site.register(models.ssp.SSP_M3, ssp.SSP_M3Admin) +admin.site.register(models.ssp.SSP_M4, ssp.SSP_M4Admin) +admin.site.register(models.ssp.SSP_M5, ssp.SSP_M5Admin) admin.site.register(models.ssp.SSP_M6, ssp.SSP_M6Admin) admin.site.register(models.ssp.SSP_M7, ssp.SSP_M7Admin) diff --git a/tdrs-backend/tdpservice/search_indexes/admin/ssp.py b/tdrs-backend/tdpservice/search_indexes/admin/ssp.py index 97112628d..8c590e14e 100644 --- a/tdrs-backend/tdpservice/search_indexes/admin/ssp.py +++ b/tdrs-backend/tdpservice/search_indexes/admin/ssp.py @@ -55,6 +55,36 @@ class SSP_M3Admin(admin.ModelAdmin): 'RPT_MONTH_YEAR', ] +class SSP_M4Admin(admin.ModelAdmin): + """ModelAdmin class for parsed M3 data files.""" + + list_display = [ + 'RecordType', + 'RPT_MONTH_YEAR', + 'CASE_NUMBER', + 'datafile', + ] + + list_filter = [ + CreationDateFilter, + 'RPT_MONTH_YEAR', + ] + +class SSP_M5Admin(admin.ModelAdmin): + """ModelAdmin class for parsed M3 data files.""" + + list_display = [ + 'RecordType', + 'RPT_MONTH_YEAR', + 'CASE_NUMBER', + 'datafile', + ] + + list_filter = [ + CreationDateFilter, + 'RPT_MONTH_YEAR', + ] + class SSP_M6Admin(admin.ModelAdmin): """ModelAdmin class for parsed M6 data files.""" diff --git a/tdrs-backend/tdpservice/search_indexes/documents/ssp.py b/tdrs-backend/tdpservice/search_indexes/documents/ssp.py index 1f571101f..c8018287f 100644 --- a/tdrs-backend/tdpservice/search_indexes/documents/ssp.py +++ b/tdrs-backend/tdpservice/search_indexes/documents/ssp.py @@ -2,7 +2,7 @@ from django_elasticsearch_dsl import Document from django_elasticsearch_dsl.registries import registry -from ..models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M6, SSP_M7 +from ..models.ssp import SSP_M1, SSP_M2, SSP_M3, SSP_M4, SSP_M5, SSP_M6, SSP_M7 from .document_base import DocumentBase @@ -200,6 +200,85 @@ class Django: 'OTHER_UNEARNED_INCOME', ] +@registry.register_document +class SSP_M4DataSubmissionDocument(DocumentBase, Document): + """Elastic search model mapping for a parsed SSP M4 data file.""" + + class Index: + """ElasticSearch index generation settings.""" + + name = 'ssp_m4_submissions' + settings = { + 'number_of_shards': 1, + 'number_of_replicas': 0, + } + + class Django: + """Django model reference and field mapping.""" + + model = SSP_M4 + fields = [ + 'RecordType', + 'RPT_MONTH_YEAR', + 'CASE_NUMBER', + 'COUNTY_FIPS_CODE', + 'STRATUM', + 'ZIP_CODE', + 'DISPOSITION', + 'CLOSURE_REASON', + 'REC_SUB_HOUSING', + 'REC_MED_ASSIST', + 'REC_FOOD_STAMPS', + 'REC_SUB_CC', + ] + +@registry.register_document +class SSP_M5DataSubmissionDocument(DocumentBase, Document): + """Elastic search model mapping for a parsed SSP M5 data file.""" + + class Index: + """ElasticSearch index generation settings.""" + + name = 'ssp_m5_submissions' + settings = { + 'number_of_shards': 1, + 'number_of_replicas': 0, + } + + class Django: + """Django model reference and field mapping.""" + + model = SSP_M5 + fields = [ + 'RecordType', + 'RPT_MONTH_YEAR', + 'CASE_NUMBER', + 'FAMILY_AFFILIATION', + 'DATE_OF_BIRTH', + 'SSN', + 'RACE_HISPANIC', + 'RACE_AMER_INDIAN', + 'RACE_ASIAN', + 'RACE_BLACK', + 'RACE_HAWAIIAN', + 'RACE_WHITE', + 'GENDER', + 'REC_OASDI_INSURANCE', + 'REC_FEDERAL_DISABILITY', + 'REC_AID_TOTALLY_DISABLED', + 'REC_AID_AGED_BLIND', + 'REC_SSI', + 'MARITAL_STATUS', + 'RELATIONSHIP_HOH', + 'PARENT_MINOR_CHILD', + 'NEEDS_OF_PREGNANT_WOMAN', + 'EDUCATION_LEVEL', + 'CITIZENSHIP_STATUS', + 'EMPLOYMENT_STATUS', + 'AMOUNT_EARNED_INCOME', + 'AMOUNT_UNEARNED_INCOME', + ] + @registry.register_document class SSP_M6DataSubmissionDocument(DocumentBase, Document): """Elastic search model mapping for a parsed SSP M6 data file.""" diff --git a/tdrs-backend/tdpservice/search_indexes/migrations/0020_ssp_m4_ssp_m5.py b/tdrs-backend/tdpservice/search_indexes/migrations/0020_ssp_m4_ssp_m5.py new file mode 100644 index 000000000..ae07879a6 --- /dev/null +++ b/tdrs-backend/tdpservice/search_indexes/migrations/0020_ssp_m4_ssp_m5.py @@ -0,0 +1,69 @@ +# Generated by Django 3.2.15 on 2023-10-10 18:12 + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('data_files', '0012_datafile_s3_versioning_id'), + ('search_indexes', '0019_ssp_m6'), + ] + + operations = [ + migrations.CreateModel( + name='SSP_M5', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('RecordType', models.CharField(max_length=156, null=True)), + ('RPT_MONTH_YEAR', models.IntegerField(null=True)), + ('CASE_NUMBER', models.CharField(max_length=11, null=True)), + ('FAMILY_AFFILIATION', models.IntegerField(null=True)), + ('DATE_OF_BIRTH', models.CharField(max_length=8, null=True)), + ('SSN', models.CharField(max_length=9, null=True)), + ('RACE_HISPANIC', models.IntegerField(null=True)), + ('RACE_AMER_INDIAN', models.IntegerField(null=True)), + ('RACE_ASIAN', models.IntegerField(null=True)), + ('RACE_BLACK', models.IntegerField(null=True)), + ('RACE_HAWAIIAN', models.IntegerField(null=True)), + ('RACE_WHITE', models.IntegerField(null=True)), + ('GENDER', models.IntegerField(null=True)), + ('REC_OASDI_INSURANCE', models.IntegerField(null=True)), + ('REC_FEDERAL_DISABILITY', models.IntegerField(null=True)), + ('REC_AID_TOTALLY_DISABLED', models.IntegerField(null=True)), + ('REC_AID_AGED_BLIND', models.IntegerField(null=True)), + ('REC_SSI', models.IntegerField(null=True)), + ('MARITAL_STATUS', models.IntegerField(null=True)), + ('RELATIONSHIP_HOH', models.CharField(max_length=2, null=True)), + ('PARENT_MINOR_CHILD', models.IntegerField(null=True)), + ('NEEDS_OF_PREGNANT_WOMAN', models.IntegerField(null=True)), + ('EDUCATION_LEVEL', models.CharField(max_length=2, null=True)), + ('CITIZENSHIP_STATUS', models.IntegerField(null=True)), + ('EMPLOYMENT_STATUS', models.IntegerField(null=True)), + ('AMOUNT_EARNED_INCOME', models.CharField(max_length=4, null=True)), + ('AMOUNT_UNEARNED_INCOME', models.CharField(max_length=4, null=True)), + ('datafile', models.ForeignKey(blank=True, help_text='The parent file from which this record was created.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='m5_parent', to='data_files.datafile')), + ], + ), + migrations.CreateModel( + name='SSP_M4', + fields=[ + ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), + ('RecordType', models.CharField(max_length=156, null=True)), + ('RPT_MONTH_YEAR', models.IntegerField(null=True)), + ('CASE_NUMBER', models.CharField(max_length=11, null=True)), + ('COUNTY_FIPS_CODE', models.CharField(max_length=3, null=True)), + ('STRATUM', models.CharField(max_length=2, null=True)), + ('ZIP_CODE', models.CharField(max_length=5, null=True)), + ('DISPOSITION', models.IntegerField(null=True)), + ('CLOSURE_REASON', models.CharField(max_length=2, null=True)), + ('REC_SUB_HOUSING', models.IntegerField(null=True)), + ('REC_MED_ASSIST', models.IntegerField(null=True)), + ('REC_FOOD_STAMPS', models.IntegerField(null=True)), + ('REC_SUB_CC', models.IntegerField(null=True)), + ('datafile', models.ForeignKey(blank=True, help_text='The parent file from which this record was created.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='m4_parent', to='data_files.datafile')), + ], + ), + ] diff --git a/tdrs-backend/tdpservice/search_indexes/migrations/0021_ssp_m7.py b/tdrs-backend/tdpservice/search_indexes/migrations/0021_ssp_m7.py index acfaf91ad..3bfa7f5e1 100644 --- a/tdrs-backend/tdpservice/search_indexes/migrations/0021_ssp_m7.py +++ b/tdrs-backend/tdpservice/search_indexes/migrations/0021_ssp_m7.py @@ -9,7 +9,7 @@ class Migration(migrations.Migration): dependencies = [ ('data_files', '0012_datafile_s3_versioning_id'), - ('search_indexes', '0019_ssp_m6'), + ('search_indexes', '0020_ssp_m4_ssp_m5'), ] operations = [ diff --git a/tdrs-backend/tdpservice/search_indexes/models/ssp.py b/tdrs-backend/tdpservice/search_indexes/models/ssp.py index f362fb374..b11e6fff5 100644 --- a/tdrs-backend/tdpservice/search_indexes/models/ssp.py +++ b/tdrs-backend/tdpservice/search_indexes/models/ssp.py @@ -199,6 +199,86 @@ class SSP_M3(models.Model): UNEARNED_SSI = models.IntegerField(null=True, blank=False) OTHER_UNEARNED_INCOME = models.IntegerField(null=True, blank=False) +class SSP_M4(models.Model): + """ + Parsed record representing an SSP M1 data submission. + + Mapped to an elastic search index. + """ + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + datafile = models.ForeignKey( + DataFile, + blank=True, + help_text='The parent file from which this record was created.', + null=True, + on_delete=models.CASCADE, + related_name='m4_parent' + ) + + RecordType = models.CharField(max_length=156, null=True, blank=False) + RPT_MONTH_YEAR = models.IntegerField(null=True, blank=False) + CASE_NUMBER = models.CharField(max_length=11, null=True, blank=False) + COUNTY_FIPS_CODE = models.CharField( + max_length=3, + null=True, + blank=False + ) + STRATUM = models.CharField(max_length=2, null=True, blank=False) + ZIP_CODE = models.CharField(max_length=5, null=True, blank=False) + DISPOSITION = models.IntegerField(null=True, blank=False) + CLOSURE_REASON = models.CharField(max_length=2, null=True, blank=False) + REC_SUB_HOUSING = models.IntegerField(null=True, blank=False) + REC_MED_ASSIST = models.IntegerField(null=True, blank=False) + REC_FOOD_STAMPS = models.IntegerField(null=True, blank=False) + REC_SUB_CC = models.IntegerField(null=True, blank=False) + +class SSP_M5(models.Model): + """ + Parsed record representing an SSP M1 data submission. + + Mapped to an elastic search index. + """ + + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + datafile = models.ForeignKey( + DataFile, + blank=True, + help_text='The parent file from which this record was created.', + null=True, + on_delete=models.CASCADE, + related_name='m5_parent' + ) + + RecordType = models.CharField(max_length=156, null=True, blank=False) + RPT_MONTH_YEAR = models.IntegerField(null=True, blank=False) + CASE_NUMBER = models.CharField(max_length=11, null=True, blank=False) + + FAMILY_AFFILIATION = models.IntegerField(null=True, blank=False) + DATE_OF_BIRTH = models.CharField(max_length=8, null=True, blank=False) + SSN = models.CharField(max_length=9, null=True, blank=False) + RACE_HISPANIC = models.IntegerField(null=True, blank=False) + RACE_AMER_INDIAN = models.IntegerField(null=True, blank=False) + RACE_ASIAN = models.IntegerField(null=True, blank=False) + RACE_BLACK = models.IntegerField(null=True, blank=False) + RACE_HAWAIIAN = models.IntegerField(null=True, blank=False) + RACE_WHITE = models.IntegerField(null=True, blank=False) + GENDER = models.IntegerField(null=True, blank=False) + REC_OASDI_INSURANCE = models.IntegerField(null=True, blank=False) + REC_FEDERAL_DISABILITY = models.IntegerField(null=True, blank=False) + REC_AID_TOTALLY_DISABLED = models.IntegerField(null=True, blank=False) + REC_AID_AGED_BLIND = models.IntegerField(null=True, blank=False) + REC_SSI = models.IntegerField(null=True, blank=False) + MARITAL_STATUS = models.IntegerField(null=True, blank=False) + RELATIONSHIP_HOH = models.CharField(max_length=2, null=True, blank=False) + PARENT_MINOR_CHILD = models.IntegerField(null=True, blank=False) + NEEDS_OF_PREGNANT_WOMAN = models.IntegerField(null=True, blank=False) + EDUCATION_LEVEL = models.CharField(max_length=2, null=True, blank=False) + CITIZENSHIP_STATUS = models.IntegerField(null=True, blank=False) + EMPLOYMENT_STATUS = models.IntegerField(null=True, blank=False) + AMOUNT_EARNED_INCOME = models.CharField(max_length=4, null=True, blank=False) + AMOUNT_UNEARNED_INCOME = models.CharField(max_length=4, null=True, blank=False) + class SSP_M6(models.Model): """ Parsed record representing an M6 data submission. diff --git a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py index 8386c5d48..d6089228f 100644 --- a/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py +++ b/tdrs-backend/tdpservice/search_indexes/test/test_model_mapping.py @@ -577,6 +577,86 @@ def test_can_create_and_index_ssp_m3_submission(): assert response.hits.total.value == 1 +@pytest.mark.django_db +def test_can_create_and_index_ssp_m4_submission(): + """SSP M4 submissions can be created and mapped.""" + record_num = fake.uuid4() + + submission = models.ssp.SSP_M4.objects.create( + RecordType=record_num, + RPT_MONTH_YEAR=1, + CASE_NUMBER='1', + COUNTY_FIPS_CODE='1', + STRATUM='01', + ZIP_CODE='11111', + DISPOSITION=1, + CLOSURE_REASON='01', + REC_SUB_HOUSING=1, + REC_MED_ASSIST=1, + REC_FOOD_STAMPS=1, + REC_SUB_CC=1 + ) + + assert models.ssp.SSP_M4.objects.count() == 1 + + assert submission.id is not None + + assert submission.id is not None + + search = documents.ssp.SSP_M4DataSubmissionDocument.search().query( + 'match', + RecordType=record_num + ) + response = search.execute() + + assert response.hits.total.value == 1 + +@pytest.mark.django_db +def test_can_create_and_index_ssp_m5_submission(): + """SSP M5 submissions can be created and mapped.""" + record_num = fake.uuid4() + + submission = models.ssp.SSP_M5.objects.create( + RecordType=record_num, + RPT_MONTH_YEAR=1, + CASE_NUMBER='1', + + FAMILY_AFFILIATION=1, + DATE_OF_BIRTH='11111111', + SSN='123456789', + RACE_HISPANIC=1, + RACE_AMER_INDIAN=1, + RACE_ASIAN=1, + RACE_BLACK=1, + RACE_HAWAIIAN=1, + RACE_WHITE=1, + GENDER=1, + REC_OASDI_INSURANCE=1, + REC_FEDERAL_DISABILITY=1, + REC_AID_TOTALLY_DISABLED=1, + REC_AID_AGED_BLIND=1, + REC_SSI=1, + MARITAL_STATUS=1, + RELATIONSHIP_HOH='01', + PARENT_MINOR_CHILD=1, + NEEDS_OF_PREGNANT_WOMAN=1, + EDUCATION_LEVEL='01', + CITIZENSHIP_STATUS=1, + EMPLOYMENT_STATUS=1, + AMOUNT_EARNED_INCOME='1000', + AMOUNT_UNEARNED_INCOME='1000' + ) + + assert submission.id is not None + + search = documents.ssp.SSP_M5DataSubmissionDocument.search().query( + 'match', + RecordType=record_num + ) + response = search.execute() + + assert response.hits.total.value == 1 + @pytest.mark.django_db def test_can_create_and_index_ssp_m6_submission(test_datafile): """SSP M6 submissions can be created and mapped.""" diff --git a/tdrs-backend/tdpservice/users/test/test_permissions.py b/tdrs-backend/tdpservice/users/test/test_permissions.py index 404fdd9ae..4ac21409a 100644 --- a/tdrs-backend/tdpservice/users/test/test_permissions.py +++ b/tdrs-backend/tdpservice/users/test/test_permissions.py @@ -123,6 +123,12 @@ def test_ofa_system_admin_permissions(ofa_system_admin): 'search_indexes.add_ssp_m3', 'search_indexes.view_ssp_m3', 'search_indexes.change_ssp_m3', + 'search_indexes.add_ssp_m4', + 'search_indexes.view_ssp_m4', + 'search_indexes.change_ssp_m4', + 'search_indexes.add_ssp_m5', + 'search_indexes.view_ssp_m5', + 'search_indexes.change_ssp_m5', 'search_indexes.add_ssp_m6', 'search_indexes.view_ssp_m6', 'search_indexes.change_ssp_m6', From cd6213a41862e47e35da89258ac9d53eb246ae04 Mon Sep 17 00:00:00 2001 From: Miles Reiter Date: Wed, 22 Nov 2023 15:39:34 -0500 Subject: [PATCH 46/49] Create sprint-86-summary.md (#2752) Co-authored-by: Andrew <84722778+andrew-jameson@users.noreply.github.com> --- docs/Sprint-Review/sprint-86-summary.md | 69 +++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 docs/Sprint-Review/sprint-86-summary.md diff --git a/docs/Sprint-Review/sprint-86-summary.md b/docs/Sprint-Review/sprint-86-summary.md new file mode 100644 index 000000000..36b249411 --- /dev/null +++ b/docs/Sprint-Review/sprint-86-summary.md @@ -0,0 +1,69 @@ +# Sprint 86 Summary +11/08/23 - 11/21/23 + +Velocity (Dev): 6 + +## Sprint Goal +* Dev: + * Continue parsing engine development + * Review all SSP Sec (01-04) + * #2730 Resolve deployment blocker + * #2683 - ZAP CORS Misconfiguration + * Coordinate w/ OFA and draft dev contingency plan for future gov shutdown + - Document any further planning (if any beyond Andrew's use of ACF laptop) +* DevOps: + * 2429 - Singular Clam AV + * 2722 - Singular deployment workflow + * Scoped out of 2419 + * #2729 - Migrations via CircleCI + +--- + +## Tickets +### Completed/Merged +* [#2116 Container registry creation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2116) +* [#2709 SSP Active Data (01) Validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2709) + + +### Ready to Merge +* [#1119 SSP Aggregate (03) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1119) + + + + +### Submitted (QASP Review, OCIO Review) +* [#2683 ZAP result - CORS config issue](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2683) +* [#1118 SSP Closed Data (02) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1118) +* [#1120 SSP Stratum (04) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1120) +* [#2748 Fix parser/preparser validation of empty strings](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2748) + +### Closed (not merged) +* [Debug migration deployments (resolved by other deployment fix work)](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2740) + +--- + +## Moved to Next Sprint (Blocked, Raft Review, In Progress, Current Sprint Backlog) +### In Progress +* [#2536 [spike] Cat 4 validation](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2536) +* [#2592 Deploy celery as a separate cloud.gov app](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2592) +* [#2729 - Migrations via CircleCI](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2729) + + + +### Blocked +* N/A + +### Raft Review + + +* [#2599 Readability enhancements for error reports](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2599) +* [#2722 simplify workflows and de-bloat pipeline code](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2722) +* [Spike - Investigate OWASP nightly scan findings](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/2663) +* [Tribal TANF Active Data (01) Parsing](https://app.zenhub.com/workspaces/sprint-board-5f18ab06dfd91c000f7e682e/issues/gh/raft-tech/tanf-app/1114) + +### Current Sprint Backlog + + +### Demo +* N/A + From a8326054d85ffbba7d4f93f7cf57ecfd3d408d02 Mon Sep 17 00:00:00 2001 From: mitika-lj Date: Tue, 28 Nov 2023 13:21:04 -0600 Subject: [PATCH 47/49] Fixing the link ( removing the "copy" from the file name --- ...ot Program copy.md => 2023, Winter - TDP 3.0 Pilot Program.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/User-Experience/Research-Syntheses/{2023, Winter - TDP 3.0 Pilot Program copy.md => 2023, Winter - TDP 3.0 Pilot Program.md} (100%) diff --git a/docs/User-Experience/Research-Syntheses/2023, Winter - TDP 3.0 Pilot Program copy.md b/docs/User-Experience/Research-Syntheses/2023, Winter - TDP 3.0 Pilot Program.md similarity index 100% rename from docs/User-Experience/Research-Syntheses/2023, Winter - TDP 3.0 Pilot Program copy.md rename to docs/User-Experience/Research-Syntheses/2023, Winter - TDP 3.0 Pilot Program.md From dbfc3662336ab1404e5658d0ab98d018080d2dd2 Mon Sep 17 00:00:00 2001 From: George Hudson Date: Tue, 28 Nov 2023 13:40:00 -0700 Subject: [PATCH 48/49] removed deploy develop from github actions --- .github/workflows/deploy-develop-on-merge.yml | 52 ------------------- 1 file changed, 52 deletions(-) delete mode 100644 .github/workflows/deploy-develop-on-merge.yml diff --git a/.github/workflows/deploy-develop-on-merge.yml b/.github/workflows/deploy-develop-on-merge.yml deleted file mode 100644 index ee4eee057..000000000 --- a/.github/workflows/deploy-develop-on-merge.yml +++ /dev/null @@ -1,52 +0,0 @@ -########################################################################### -# GitHub Action Workflow -# On push to the develop branch (which should only be done through PR) -# in GitHub this action will trigger a deploy job within CircleCI for the -# deployment and e2e testing of the develop environment. -# -# Step 0: Checkout latest commit on develop -# -# Step 1: Makes a request to the V2 CircleCI API to initiate the project, -# which will filter based upon the branch to initiate the -# workflow/jobs listed here: -# staging-deployment:[ -# deploy-project-updates-site, -# deploy-infrastructure-develop, -# deploy-develop, -# test-deployment-e2e -# ] -# -# Leverages the open source GitHub Action: -# https://github.com/promiseofcake/circleci-trigger-action -########################################################################### -name: Deploy Develop on PR Merge -on: - push: - branches: - - develop - paths-ignore: - - 'docs/**' - - '**.md' - - '**.txt' - - '.gitattributes' - - '.gitignore' - - 'LICENSE' -jobs: - merge_deployment: - if: github.ref == 'refs/heads/develop' - runs-on: ubuntu-latest - name: Initiate deploy job in CircleCI - steps: - - uses: actions/checkout@v2 - - name: Circle CI Deployment Trigger - id: curl-circle-ci - uses: promiseofcake/circleci-trigger-action@v1 - with: - user-token: ${{ secrets.CIRCLE_CI_V2_TOKEN }} - project-slug: ${{ github.repository }} - branch: ${{ github.ref_name }} - payload: '{ - "develop_branch_deploy": true, - "target_env": "develop", - "triggered": true - }' From eac7e505eac1596af557608760fffad0833742e6 Mon Sep 17 00:00:00 2001 From: raftmsohani <97037188+raftmsohani@users.noreply.github.com> Date: Wed, 29 Nov 2023 15:53:45 -0500 Subject: [PATCH 49/49] add file size to clamav-nginx (#2760) --- tdrs-backend/clamav-router/nginx.conf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tdrs-backend/clamav-router/nginx.conf b/tdrs-backend/clamav-router/nginx.conf index 50cc6395b..142657ffb 100644 --- a/tdrs-backend/clamav-router/nginx.conf +++ b/tdrs-backend/clamav-router/nginx.conf @@ -5,6 +5,7 @@ events { worker_connections 1024; http{ server { listen {{port}}; + client_max_body_size 100m; location /scan { proxy_pass http://tanf-prod-clamav-rest.apps.internal:9000/scan; proxy_pass_request_headers on; @@ -12,6 +13,7 @@ http{ } server { listen 9000; + client_max_body_size 100m; location /scan { proxy_pass http://tanf-prod-clamav-rest.apps.internal:9000/scan; proxy_pass_request_headers on;

{`Section ${section} - ${label}`}
Submitted OnSubmitted ByFile NameAcceptance StatusError Reports (In development) + Submitted On + + Submitted By + + File Name + + Status + + Error Reports (In development) +