diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b1b2df4d..2df808fa 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,7 +27,7 @@ jobs: needs: [build-ods, build-odm] strategy: matrix: - python-version: ["3.7", "3.8", "3.9", "3.10"] + python-version: ["3.8", "3.9", "3.10", "3.11"] steps: - uses: actions/checkout@v3 diff --git a/.gitignore b/.gitignore index 17753647..c9a01b3c 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,9 @@ coverage.xml # excel *.xlsx# + +# venv +.venv/ + +# vscode +.vscode/ diff --git a/CHANGELOG.rst b/CHANGELOG.rst index ce7d082b..dbbfc326 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,14 @@ ODS_Tools Changelog =================== +`3.2.2`_ + --------- +* [#92](https://github.com/OasisLMF/ODS_Tools/pull/92) - Release 3.2.1 +* [#93](https://github.com/OasisLMF/ODS_Tools/pull/93) - include peril group as valid when doing peril filtering +* [#94](https://github.com/OasisLMF/ODS_Tools/pull/94) - CI update - replace py3.7 with py3.11 +* [#90](https://github.com/OasisLMF/ODS_Tools/pull/95) - Incorporate odtf in ods_tools +.. _`3.2.2`: https://github.com/OasisLMF/ODS_Tools/compare/3.2.1...3.2.2 + * [#91](https://github.com/OasisLMF/ODS_Tools/pull/91) - Add ri_inuring_priorities field to analysis settings schema for outputs at intermediate inuring priorities .. _`3.2.1`: https://github.com/OasisLMF/ODS_Tools/compare/3.2.0...3.2.1 diff --git a/ods_tools/__init__.py b/ods_tools/__init__.py index 5657ebb1..9cd07238 100644 --- a/ods_tools/__init__.py +++ b/ods_tools/__init__.py @@ -1,4 +1,4 @@ -__version__ = '3.2.1' +__version__ = '3.2.2' import logging diff --git a/ods_tools/main.py b/ods_tools/main.py index fdadfb09..e4b9c42f 100644 --- a/ods_tools/main.py +++ b/ods_tools/main.py @@ -18,6 +18,7 @@ ModelSettingSchema, AnalysisSettingSchema, ) +from ods_tools.odtf.controller import transform_format def get_oed_exposure(config_json=None, oed_dir=None, **kwargs): @@ -92,9 +93,27 @@ def convert(**kwargs): oed_exposure.save(path=path, **kwargs) +def transform(**kwargs): + """Wrapper function for transform command. + Transform location and account data to a new format (ex: AIR to OED)""" + path_to_config_file = kwargs['config_file'] + try: + transform_result = transform_format(path_to_config_file) + if not kwargs.get('nocheck'): + for output_file in transform_result: + if output_file[1] == 'location' and os.path.isfile(output_file[0]): + check(location=output_file[0]) + elif output_file[1] == 'account' and os.path.isfile(output_file[0]): + check(account=output_file[0]) + except OdsException as e: + logger.error("Transformation failed:") + logger.error(e) + + command_action = { 'check': check, 'convert': convert, + 'transform': transform, } @@ -150,15 +169,22 @@ def add_exposure_data_args(command): default=30, type=int) +transform_description = """ +Transform data format to/from OED. +""" +transform_command = command_parser.add_parser('transform', description=transform_description, + formatter_class=argparse.RawTextHelpFormatter) +transform_command.add_argument('--config-file', help='Path to the config file', required=True) +transform_command.add_argument('-v', '--logging-level', help='logging level (debug:10, info:20, warning:30, error:40, critical:50)', + default=30, type=int) +transform_command.add_argument('--nocheck', help='if True, OED file will not be checked after transformation', default=False) + + def main(): """command line interface for ODS conversion between csv and parquet""" kwargs = vars(main_parser.parse_args()) - ch = logging.StreamHandler() - formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') - ch.setFormatter(formatter) - logger.addHandler(ch) logging_level = kwargs.pop('logging_level') - logger.setLevel(logging_level) + logging.basicConfig(level=logging_level, format='%(asctime)s - %(levelname)s - %(message)s') command_action[kwargs.pop('command')](** kwargs) diff --git a/ods_tools/odtf/__init__.py b/ods_tools/odtf/__init__.py new file mode 100644 index 00000000..b7acd171 --- /dev/null +++ b/ods_tools/odtf/__init__.py @@ -0,0 +1,6 @@ +from .config import Config + + +__all__ = [ + "Config", +] diff --git a/ods_tools/odtf/config.py b/ods_tools/odtf/config.py new file mode 100644 index 00000000..4e8931e1 --- /dev/null +++ b/ods_tools/odtf/config.py @@ -0,0 +1,585 @@ +import os +import re +from functools import reduce +from itertools import chain +from typing import Any, Dict, Iterable, List, Tuple, TypeVar, Union + +import yaml + +from .errors import ConfigurationError +from .files.yaml import read_yaml + + +T = TypeVar("T") +ConfigSource = Dict[str, Any] + + +class NotFoundType: + def get(self, *args, **kwargs): + return self + + +NotFound = NotFoundType() + + +def deep_merge_dictionary_items( + first: Union[Dict, "Config"], second: Union[Dict, "Config"] +) -> ConfigSource: + """ + Merges the 2 dictionary entries, the process is as follows: + + 1. If the element from the first dictionary is not found use the + element from the second independent from type + 2. If the element in the second dictionary is not a dictionary and has + been found stop here and use it + 3. If the second element isn't found and the first has use the first + value + 4. If both elements have been found then use the merge of the 2 + + :param first: The first dict or the value from the first dict to try + to merge + :param second: The second dict or the value from the second dict to + try to merge + + :return: The merged result + """ + if isinstance(first, Config): + first = first.config + + if isinstance(second, Config): + second = second.config + + if first is NotFound or ( + second is not NotFound and not isinstance(second, dict) + ): + # if the first value was not found or the second value has been + # found and is not a dictionary, use it + return second + elif first is not NotFound and second is NotFound: + # else if we have no value from second and first is found use it + return first + else: + # otherwise, continue merging deeper + return { + key: deep_merge_dictionary_items( + first.get(key, NotFound), second.get(key, NotFound) + ) + for key in chain(first.keys(), second.keys()) + } + + +def get_json_path( + config: Dict[str, Any], path: str, fallback: Any = NotFound +) -> Any: + """ + Gets a property from the configuration from it's path in the config. + The path should be dotted path into the config. For example, with the + config:: + + { + "foo": { + "bar": "baz" + } + } + + The path `"foo.bar"` would return `"baz"` and the path `"foo"` would + return `{"bar": "baz"}`. + + If the path isn't found in the config the `fallback` value is used if + one is provided, if no fallback is provided a `KeyError` is raised. + + :param path: The path of the requested value into the config. + :param fallback: The value to use if the path isn't found. + + :return: The found path ot fallback if provided + """ + res = reduce( + lambda conf, path_part: conf.get(path_part, NotFound), + path.lower().split("."), + config, + ) + + if res is not NotFound: + return res + + if fallback is not NotFound: + return fallback + + raise KeyError(path) + + +class Config: + """ + Configuration class that loads the config file, environment, + command line and overrides and merges them into a single map. + """ + + TEMPLATE_TRANSFORMATION_PATH = "template_transformation" + TRANSFORMATIONS_PATH = "transformations" + ACC_TRANSFORMATION_LABEL = "acc" + ACC_TRANSFORMATION_PATH = ( + f"{TRANSFORMATIONS_PATH}.{ACC_TRANSFORMATION_LABEL}" + ) + LOC_TRANSFORMATION_LABEL = "loc" + LOC_TRANSFORMATION_PATH = ( + f"{TRANSFORMATIONS_PATH}.{LOC_TRANSFORMATION_LABEL}" + ) + RI_TRANSFORMATION_LABEL = "ri" + RI_TRANSFORMATION_PATH = ( + f"{TRANSFORMATIONS_PATH}.{RI_TRANSFORMATION_LABEL}" + ) + + TRANSFORMATION_PATH_SUB = re.compile(r"^transformations\.[^.]+") + + def __init__( + self, + argv: Dict[str, Any] = None, + config_path: str = None, + overrides: Dict[str, Any] = None, + env: Dict[str, str] = None, + ): + self.path = ( + os.path.abspath(config_path) + if config_path and os.path.exists(config_path) + else None + ) + self.argv = argv + self.env = env + self.overrides = overrides + self.config = self.merge_config_sources( + *self.get_config_sources( + config_path=config_path, + env=env, + argv=argv, + overrides=overrides, + ) + ) + + def __eq__(self, other): + return self.config in [other, getattr(other, "config", {})] + + def __bool__(self): + return bool(self.config) + + def get_config_sources( + self, + config_path: str = None, + env: Dict[str, str] = None, + argv: Dict[str, Any] = None, + overrides: ConfigSource = None, + ) -> Iterable[ConfigSource]: + """ + Returns all the provided config sources in order of increasing + precedence, the order is: + + 1. Config file + 2. Environment + 3. Command line + 4. Hard coded overrides + + :param config_path: The path to the config file + :param env: The systems environment dict + :param argv: Dict of config paths to values + :param overrides: hard coded override values for the config + + :return: An iterable of normalised configs from the various sources + """ + if config_path and os.path.exists(config_path): + yield self.normalise_property_names(read_yaml(config_path)) + + if env: + yield self.normalise_property_names(self.process_env_options(env)) + + if argv: + yield self.normalise_property_names(self.process_cli_options(argv)) + + if overrides: + yield self.normalise_property_names(overrides) + + def _get_config_dict_from_path_value_pairs( + self, + paths_and_values, + separator, + ): + conf = {} + for path, value in paths_and_values: + *parts, final = path.lower().split(separator) + reduce(lambda c, part: c.setdefault(part, {}), parts, conf)[ + final + ] = value + + return conf + + def process_cli_options(self, argv): + return self._get_config_dict_from_path_value_pairs(argv.items(), ".") + + def process_env_options(self, env): + env_search = "CONVERTER_".lower() + + return self._get_config_dict_from_path_value_pairs( + ( + ( + k.lower().replace(env_search, ""), + yaml.load(v, yaml.SafeLoader), + ) + for k, v in env.items() + if k.lower().startswith(env_search) + ), + "_", + ) + + @classmethod + def validate(cls, config_path: str): + """ + Basic validation check of the config file. + """ + config = read_yaml(config_path) + # If transformations key not in yaml file flag as invalid. + if 'transformations' not in config: + raise ConfigurationError("Invalid config file - transformation key required") + + @classmethod + def merge_config_sources( + cls, + first: ConfigSource = None, + second: ConfigSource = None, + *others: ConfigSource, + ) -> ConfigSource: + """ + Merges any number of config sources the later sources taking precedence + over the former. + + :param first: The first source + :param second: The second source + :param others: The other sources + + :return: The merged config source + """ + first = first or {} + second = second or {} + + merged = deep_merge_dictionary_items(first, second) + + if others: + return cls.merge_config_sources(merged, *others) + + return merged + + def normalise_property_names(self, d: ConfigSource) -> ConfigSource: + """ + Converts all names in all levels of the dictionary to lowercase + + :param d: The dictionary to normalise + + :return: The normalised dictionary + """ + return dict(map(lambda kv: self.normalise_property(*kv), d.items())) + + def normalise_property(self, key: str, value: Any) -> Tuple[str, Any]: + """ + Gets the normalised (lowercase) name with the normalised value. + If the value is a dictionary it is normalised otherwise the value + is returned unchanged. + + :param key: The key name for the entry + :param value: The value for the entry + + :return: A 2-tuple of the normalised key and value of the entry + """ + if isinstance(value, dict): + return key.lower(), self.normalise_property_names(value) + else: + return key.lower(), value + + def get(self, path: str, fallback: Any = NotFound) -> Any: + """ + Gets a property from the configuration from it's path in the config. + The path should be dotted path into the config. For example, with the + config:: + + { + "foo": { + "bar": "baz" + } + } + + The path `"foo.bar"` would return `"baz"` and the path `"foo"` would + return `{"bar": "baz"}`. + + If the path isn't found in the config the `fallback` value is used if + one is provided, if no fallback is provided a `KeyError` is raised. + + :param path: The path of the requested value into the config. + :param fallback: The value to use if the path isn't found. + + :return: The found path ot fallback if provided + """ + return get_json_path(self.config, path, fallback=fallback) + + def get_template_resolved_value(self, path: str, fallback: Any = NotFound): + """ + Gets the value for a given path reverting to the transformation + template if the value is not found. + + :param path: The path of the requested value into the config. + :param fallback: The value to use if the path isn't found. + + :return: The found path ot fallback if provided + """ + + try: + return self.get(path) + except KeyError: + pass + + try: + template_property_path = self.TRANSFORMATION_PATH_SUB.sub( + self.TEMPLATE_TRANSFORMATION_PATH, + path, + ) + return self.get(template_property_path) + except KeyError: + pass + + if fallback is not NotFound: + return fallback + + raise KeyError(path) + + def set(self, path: str, value: Any): + """ + Sets a property in the configuration by it's path in the config. + The path should be dotted path into the config. For example, setting + the path `"foo.bar"` to `"baz"` the following config will be created:: + + { + "foo": { + "bar": "baz" + } + } + + :param path: The path of the value to set. + :param value: The value to set. + """ + block = self.config + + path_parts = path.lower().split(".") + for path_part in path_parts[:-1]: + block = block.setdefault(path_part, {}) + + block[path_parts[-1]] = value + + def delete(self, path): + """ + Removes a specific path from the config + + :param path: The path to remove. + """ + block = self.config + + path_parts = path.lower().split(".") + for path_part in path_parts[:-1]: + if path_part not in block: + return + block = block[path_part] + + if path_parts[-1] in block: + del block[path_parts[-1]] + + def to_yaml(self): + """ + Generates a yaml string representation of the normalised config + + :return: The yaml representation + """ + return yaml.safe_dump(self.config) + + def absolute_path(self, p): + """ + Gets the absolute path relative to the config files directory. + + :param p: The path relative to the config file + + :return: The absolute path if both the config path and `p` are set, + if `p` is `None`, `None` is returned. If the config path is `None`, + `p` is returned without modification + """ + if p is not None: + return os.path.abspath( + os.path.join(os.path.dirname(self.path or "."), p) + ) + + return p + + def save(self, new_filename=None): + """ + Writes the configuration to a yaml file. + + :param new_filename: The filename to use. If not set the current + filename in the configuration is used. + """ + with open(new_filename or self.path, "w") as f: + f.write(self.to_yaml()) + + def keys(self): + """ + Gets an iterable keys. + """ + return self.config.keys() + + def items(self): + """ + Gets an iterable of (key, value) tuples. + """ + return self.config.items() + + def get_transformation_configs(self) -> List["TransformationConfig"]: + """ + Generates all the configs for running specific transformations + resolved with the template transformation + + :return: A list of transformation configs + """ + return [ + TransformationConfig(self, file_type) + for file_type in self.get( + self.TRANSFORMATIONS_PATH, fallback={} + ).keys() + ] + + @property + def has_template(self) -> bool: + """ + Checks if the config has a template transformation + """ + return self.TEMPLATE_TRANSFORMATION_PATH in self + + @property + def has_acc(self): + """ + Checks if the config has an account transformation + """ + return self.ACC_TRANSFORMATION_PATH in self + + @property + def has_loc(self): + """ + Checks if the config has a location transformation + """ + return self.LOC_TRANSFORMATION_PATH in self + + @property + def has_ri(self): + """ + Checks if the config has a reinsurance transformation + """ + return self.RI_TRANSFORMATION_PATH in self + + def uses_template_value(self, property_path): + """ + Checks if a given path uses the value from the template transformation. + """ + template_property_path = self.TRANSFORMATION_PATH_SUB.sub( + self.TEMPLATE_TRANSFORMATION_PATH, + property_path, + ) + try: + template_value = self.get(template_property_path) + except KeyError: + # if the property isn't in the template then we cant be + # using the template value + return False + + try: + config_value = self.get(property_path) + except KeyError: + # if the property is in the template but not in the config + # we must be using the template path + return True + + # if it is set in both specify we are using the template if + # the 2 values are the same + return template_value == config_value + + def __contains__(self, item): + try: + self.get(item) + return True + except KeyError: + return False + + +class TransformationConfig: + def __init__(self, config: Config, file_type: str): + self.root_config = config + self.file_type = file_type + + # merge the template transformation with the overrides + self.config = deep_merge_dictionary_items( + self.root_config.get( + self.root_config.TEMPLATE_TRANSFORMATION_PATH, fallback={} + ), + self.root_config.get( + f"{self.root_config.TRANSFORMATIONS_PATH}.{file_type}", + fallback={}, + ), + ) + + def absolute_path(self, p): + """ + Gets the absolute path relative to the config files directory. + + :param p: The path relative to the config file + + :return: The absolute path if both the config path and `p` are set, + if `p` is `None`, `None` is returned. If the config path is `None`, + `p` is returned without modification + """ + return self.root_config.absolute_path(p) + + def keys(self): + """ + Gets an iterable keys. + """ + return self.config.keys() + + def items(self): + """ + Gets an iterable of (key, value) tuples. + """ + return self.config.items() + + @property + def path(self): + """ + Returns the path of the root config + """ + return self.root_config.path + + def get(self, path: str, fallback: Any = NotFound) -> Any: + """ + Gets a property from the configuration from it's path in the config. + The path should be dotted path into the config. For example, with the + config:: + + { + "foo": { + "bar": "baz" + } + } + + The path `"foo.bar"` would return `"baz"` and the path `"foo"` would + return `{"bar": "baz"}`. + + If the path isn't found in the config the `fallback` value is used if + one is provided, if no fallback is provided a `KeyError` is raised. + + :param path: The path of the requested value into the config. + :param fallback: The value to use if the path isn't found. + + :return: The found path ot fallback if provided + """ + return get_json_path(self.config, path, fallback=fallback) + + def __eq__(self, other): + return self.config == other.config diff --git a/ods_tools/odtf/connector/__init__.py b/ods_tools/odtf/connector/__init__.py new file mode 100644 index 00000000..8c5cc1b6 --- /dev/null +++ b/ods_tools/odtf/connector/__init__.py @@ -0,0 +1,11 @@ +from .base import BaseConnector +from .csv import CsvConnector + + +__all__ = [ + "BaseConnector", + "CsvConnector", + "SQLiteConnector", + "PostgresConnector", + "SQLServerConnector", +] diff --git a/ods_tools/odtf/connector/base.py b/ods_tools/odtf/connector/base.py new file mode 100644 index 00000000..9003f167 --- /dev/null +++ b/ods_tools/odtf/connector/base.py @@ -0,0 +1,64 @@ +from typing import Any, AsyncIterable, Dict, Iterable + +from ..config import TransformationConfig + + +class BaseConnector: + """ + Connects to the the data source + + :param config: The global config for the system + :param options_schema: A dictionary representing the + schema of field connectors options json schema property + types (https://python-jsonschema.readthedocs.io/en/stable/) + :param name: The human readable name of the connector for + use in the UI + """ + + name = "Base Connector" + options_schema = {"type": "object", "properties": {}} + + def __init__(self, config: TransformationConfig, **options): + self._options = options + self.config = config + + def extract(self) -> Iterable[Dict[str, Any]]: + """ + Extracts the data from the connected source and returns + an iterable of dictionaries. + + :return: An iterable of the extracted data + """ + raise NotImplementedError() + + async def aextract(self) -> AsyncIterable[Dict[str, Any]]: + """ + Extracts the data from the connected source and returns + an asynchronous iterable of dictionaries. + + :return: An iterable of the extracted data + """ + raise NotImplementedError() + yield {} # pragma: no cover + + def load(self, data: Iterable[Dict[str, Any]]): + """ + Loads the data into the connected data object. + + :param data: An iterable of dictionaries representing + the data to push to the connected source. + """ + raise NotImplementedError() + + async def aload(self, data: AsyncIterable[Dict[str, Any]]): + """ + Loads the data into the connected data object. + + :param data: An iterable of dictionaries representing + the data to push to the connected source. + """ + raise NotImplementedError() + + @classmethod + def fully_qualified_name(cls): + return f"{cls.__module__}.{cls.__qualname__}" diff --git a/ods_tools/odtf/connector/csv.py b/ods_tools/odtf/connector/csv.py new file mode 100644 index 00000000..90d9f94c --- /dev/null +++ b/ods_tools/odtf/connector/csv.py @@ -0,0 +1,97 @@ +import csv +from typing import Any, Dict, Iterable + +from .base import BaseConnector +from ..notset import NotSetType + + +class CsvConnector(BaseConnector): + """ + Connects to a csv file on the local machine for reading and writing data. + + **Options:** + + * `path` - The path to the csv file to read/write + * `write_header` - Flag whether the header row should be written to the + target when loading data (default: `True`) + * `quoting` - What type of quoting should be used when reading and writing + data. Valid values are `all`, `minimal`, `nonnumeric` and `none`. + Descriptions of these values are given in the + `python csv module documentation + `__. + (default: `nonnumeric`). + """ + + name = "CSV Connector" + options_schema = { + "type": "object", + "properties": { + "path": { + "type": "string", + "description": ( + "The path to the file to load relative to the config file" + ), + "subtype": "path", + "title": "Path", + }, + "write_header": { + "type": "boolean", + "description": "Should the header row be written?", + "default": True, + "title": "Include Header", + }, + "quoting": { + "type": "string", + "description": ( + "The type of quoting to use when " + "reading/writing entries (see " + "https://docs.python.org/3/library/csv.html#csv.QUOTE_ALL " + "for a description of the values)" + ), + "enum": ["all", "minimal", "none", "nonnumeric"], + "default": "nonnumeric", + "title": "Quoting", + }, + }, + "required": ["path"], + } + + def __init__(self, config, **options): + super().__init__(config, **options) + + self.file_path = config.absolute_path(options["path"]) + self.write_header = options.get("write_header", True) + self.quoting = { + "all": csv.QUOTE_ALL, + "minimal": csv.QUOTE_MINIMAL, + "none": csv.QUOTE_NONE, + "nonnumeric": csv.QUOTE_NONNUMERIC, + }.get(options.get("quoting", "nonnumeric")) + + def _data_serializer(self, row): + return { + k: v if v is not None and not isinstance(v, NotSetType) else "" + for k, v in row.items() + } + + def load(self, data: Iterable[Dict[str, Any]]): + try: + data = iter(data) + first_row = next(data) + except StopIteration: + return + + with open(self.file_path, "w", newline="") as f: + writer = csv.DictWriter( + f, fieldnames=list(first_row.keys()), quoting=self.quoting + ) + + if self.write_header: + writer.writeheader() + + writer.writerow(self._data_serializer(first_row)) + writer.writerows(map(self._data_serializer, data)) + + def extract(self) -> Iterable[Dict[str, Any]]: + with open(self.file_path, "r") as f: + yield from csv.DictReader(f, quoting=self.quoting) diff --git a/ods_tools/odtf/controller.py b/ods_tools/odtf/controller.py new file mode 100644 index 00000000..ccf829ef --- /dev/null +++ b/ods_tools/odtf/controller.py @@ -0,0 +1,133 @@ +import importlib +import logging +import sys +import threading +from datetime import datetime +from typing import Any, Type +import yaml + +from .config import Config, TransformationConfig +from .connector import BaseConnector +from .mapping import BaseMapping +from .runner import BaseRunner + +logger = logging.getLogger(__name__) + + +class Controller: + """ + Class controlling the transformation flow + + :param config: The resolved normalised config + """ + + def __init__(self, config: Config): + self.config = config + + def _load_from_module(self, path: str) -> Any: + module_path, cls = path.rsplit(".", 1) + module = importlib.import_module(module_path) + return getattr(module, cls) + + def run(self): + """ + Generates the converter components from the config and runs the + transformation + """ + start_time = datetime.now() + logger.info("Starting transformation") + + transformation_configs = self.config.get_transformation_configs() + output_file_paths = [] + if self.config.get("parallel", True): + threads = list( + map( + lambda c: threading.Thread( + target=lambda: output_file_paths.append(self._run_transformation(c)) + ), + transformation_configs, + ) + ) + + for thread in threads: + thread.start() + + for thread in threads: + thread.join() + output_file_paths = [path for path in output_file_paths if path is not None] + else: + for c in transformation_configs: + output_file_path = self._run_transformation(c) + if output_file_path: + output_file_paths[c.file_type] = output_file_path + + logger.info( + f"Transformation finished in {datetime.now() - start_time}" + ) + return output_file_paths + + def _run_transformation(self, config: TransformationConfig): + try: + mapping_class: Type[BaseMapping] = self._load_from_module( + config.get( + "mapping.path", fallback="ods_tools.odtf.mapping.FileMapping" + ) + ) + mapping: BaseMapping = mapping_class( + config, + config.file_type, + **config.get("mapping.options", fallback={}), + ) + + extractor_class: Type[BaseConnector] = self._load_from_module( + config.get( + "extractor.path", fallback="ods_tools.odtf.connector.CsvConnector" + ) + ) + extractor: BaseConnector = extractor_class( + config, **config.get("extractor.options", fallback={}) + ) + + loader_class: Type[BaseConnector] = self._load_from_module( + config.get( + "loader.path", fallback="ods_tools.odtf.connector.CsvConnector" + ) + ) + loader: BaseConnector = loader_class( + config, **config.get("loader.options", fallback={}) + ) + + runner_class: Type[BaseRunner] = self._load_from_module( + config.get("runner.path", fallback="ods_tools.odtf.runner.PandasRunner") + ) + runner: BaseRunner = runner_class( + config, **config.get("runner.options", fallback={}) + ) + + runner.run(extractor, mapping, loader) + + except Exception as e: + exc_type, exc_obj, exc_tb = sys.exc_info() + logger.error( + f"{repr(e)}, line {exc_tb.tb_lineno} in {exc_tb.tb_frame.f_code.co_filename}" + ) + return None + + +def transform_format(path_to_config_file): + with open(path_to_config_file, 'r') as file: + config_dict = yaml.safe_load(file) + config = Config(config_dict) + controller = Controller(config) + controller.run() + outputs = [] + for key, value in config_dict.get('transformations', {}).items(): + if value.get('output_format').get('name') == 'OED_Location': + output_file_type = 'location' + elif value.get('output_format').get('name') == 'OED_Contract': + output_file_type = 'account' + else: + output_file_type = 'other' + output_file_path = value.get('loader', {}).get('options', {}).get('path') + outputs.append((output_file_path, output_file_type)) + return outputs diff --git a/ods_tools/odtf/data/.gitkeep b/ods_tools/odtf/data/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/ods_tools/odtf/data/__init__.py b/ods_tools/odtf/data/__init__.py new file mode 100644 index 00000000..62c8b83c --- /dev/null +++ b/ods_tools/odtf/data/__init__.py @@ -0,0 +1,50 @@ +import os +import sys +from pathlib import Path + + +def get_data_root(): + """ + Gets the root of the data directory. This handles running as a normal + python project and when ran as the pyinstaller exe. + """ + return getattr(sys, "_MEIPASS", os.path.dirname(__file__)) + + +def get_data_path(*parts): + """ + Gets a path in the data dir (either in the normal dir or the temp + dir for the py installer exe) + + :param parts: The parts of the path to join (similar to os.path.join) + """ + return os.path.join(get_data_root(), *parts) + + +def hide_system_data_path(path): + """ + Takes a path and replaces the system directory with a more useful string. + + When the exe is ran the data files will be extracted to a tmp directory + which is not useful as it will not exist once the exe is closed. Here + we replace the system data path with something that makes it more explicit + that the file came from the tool. + + The result is no longer a useful path from a system point of view and + should only be used for reporting to users + + :param path: The path to process + + :return: The processed path + """ + data_root_path = Path(get_data_root()) + path = Path(path) + + if data_root_path in path.parents: + return str( + Path("").joinpath( + str(path.relative_to(data_root_path)) + ) + ) + + return str(path) diff --git a/ods_tools/odtf/data/forms/metadata.yaml b/ods_tools/odtf/data/forms/metadata.yaml new file mode 100644 index 00000000..a98ffed1 --- /dev/null +++ b/ods_tools/odtf/data/forms/metadata.yaml @@ -0,0 +1,346 @@ +portfolio_name: + title: Portfolio Name + type: string +entity_company_book: + title: Entity/Company/Book + type: string +as_of_date: + title: As-Of Date + type: date +notes: + title: Notes + type: string + sub_type: text_area +separator: + type: line +perils: + title: Perils + type: string + sub_type: multiselect + enum: + - Earthquake - Shake only + - Fire Following + - Tsunami + - Sprinkler Leakage + - Landslide + - Liquefaction + - Tropical Cyclone + - Extra Tropical Cyclone + - Storm Surge + - River / Fluvial Flood + - Flash / Surface / Pluvial Flood + - Straight-line / other convective wind + - Tornado + - Hail + - Snow + - Ice + - Freeze + - NonCat + - Wildfire / Bushfire + - NBCR Terrorism + - Conventional Terrorism + - Lightning + - Winterstorm Wind + - Smoke + - Drought Induced Subsidence + - Crop Hail (From Convective Storm) + - Cyber Security Data and Privacy Breach + - Cyber Security Property Damage + - Pandemic Flu + - Other +line_of_business: + title: Line Of Business + type: string + sub_type: multiselect + enum: + - Residential + - Commercial + - Industrial + - Automotive + - MH +geographic_scope: + title: Geographic Scope + type: string + sub_type: multiselect + enum: + - Global + - group: Regions + entries: + - Africa + - Americas + - Asia + - Europe + - Oceania + - group: Countries + entries: + - Abkhazia + - Afghanistan + - Åland (Finland) + - Albania + - Algeria + - American Samoa (United States) + - Andorra + - Angola + - Anguilla (United Kingdom) + - Antigua and Barbuda + - Argentina + - Armenia + - Aruba (Netherlands) + - Australia + - Austria + - Azerbaijan + - Bahamas + - Bahrain + - Bangladesh + - Barbados + - Belarus + - Belgium + - Belize + - Benin + - Bermuda (United Kingdom) + - Bhutan + - Bolivia + - Bosnia and Herzegovina + - Botswana + - Brazil + - British Virgin Islands (United Kingdom) + - Brunei + - Bulgaria + - Burkina Faso + - Burundi + - Cambodia + - Cameroon + - Canada + - Cape Verde + - Cayman Islands (United Kingdom) + - Central African Republic + - Chad + - Chile + - China + - Christmas Island (Australia) + - Cocos (Keeling) Islands (Australia) + - Colombia + - Comoros + - Congo + - Cook Islands (New Zealand) + - Costa Rica + - Croatia + - Cuba + - Curaçao (Netherlands) + - Cyprus + - Czech Republic + - DR Congo + - Denmark + - Djibouti + - Dominica + - Dominican Republic + - East Timor + - Ecuador + - Egypt + - El Salvador + - Equatorial Guinea + - Eritrea + - Estonia + - Eswatini + - Ethiopia + - Falkland Islands (United Kingdom) + - Faroe Islands (Denmark) + - Fiji + - Finland + - France + - French Polynesia (France) + - Gabon + - Gambia + - Georgia + - Germany + - Ghana + - Gibraltar (United Kingdom) + - Greece + - Greenland (Denmark) + - Grenada + - Guam (United States) + - Guatemala + - Guernsey (British Crown Dependency) + - Guinea + - Guinea-Bissau + - Guyana + - Haiti + - Honduras + - Hong Kong (China) + - Hungary + - Iceland + - India + - Indonesia + - Iran + - Iraq + - Ireland + - Isle of Man (British Crown Dependency) + - Israel + - Italy + - Ivory Coast + - Jamaica + - Japan + - Jersey (British Crown Dependency) + - Jordan + - Kazakhstan + - Kenya + - Kiribati + - Kosovo + - Kuwait + - Kyrgyzstan + - Laos + - Latvia + - Lebanon + - Lesotho + - Liberia + - Libya + - Liechtenstein + - Lithuania + - Luxembourg + - Macau (China) + - Madagascar + - Malawi + - Malaysia + - Maldives + - Mali + - Malta + - Marshall Islands + - Mauritania + - Mauritius + - Mexico + - Micronesia + - Moldova + - Monaco + - Mongolia + - Montenegro + - Montserrat (United Kingdom) + - Morocco + - Mozambique + - Myanmar + - Namibia + - Nauru + - Nepal + - Netherlands + - New Caledonia (France) + - New Zealand + - Nicaragua + - Niger + - Nigeria + - Niue (New Zealand) + - Norfolk Island (Australia) + - North Korea + - North Macedonia + - Northern Cyprus + - Northern Mariana Islands (United States) + - Norway + - Oman + - Pakistan + - Palau + - Palestine + - Panama + - Papua New Guinea + - Paraguay + - Peru + - Philippines + - Pitcairn Islands (United Kingdom) + - Poland + - Portugal + - Puerto Rico (United States) + - Qatar + - Republic of Artsakh + - Romania + - Russia + - Rwanda + - Saint Barthélemy (France) + - Saint Helena, Ascension and Tristan da Cunha (United Kingdom) + - Saint Kitts and Nevis + - Saint Lucia + - Saint Martin (France) + - Saint Pierre and Miquelon (France) + - Saint Vincent and the Grenadines + - Samoa + - San Marino + - Saudi Arabia + - Senegal + - Serbia + - Seychelles + - Sierra Leone + - Singapore + - Sint Maarten (Netherlands) + - Slovakia + - Slovenia + - Solomon Islands + - Somalia + - South Africa + - South Korea + - South Ossetia + - South Sudan + - Spain + - Sri Lanka + - Sudan + - Suriname + - Sweden + - Switzerland + - Syria + - São Tomé and Príncipe + - Taiwan + - Tajikistan + - Tanzania + - Thailand + - Togo + - Tokelau (New Zealand) + - Tonga + - Transnistria + - Trinidad and Tobago + - Tunisia + - Turkey + - Turkmenistan + - Turks and Caicos Islands (United Kingdom) + - Tuvalu + - U.S. Virgin Islands (United States) + - Uganda + - Ukraine + - United Arab Emirates + - United Kingdom + - United States + - Uruguay + - Uzbekistan + - Vanuatu + - Vatican City + - Venezuela + - Vietnam + - Wallis and Futuna (France) + - Western Sahara + - Yemen + - Zambia + - Zimbabwe +contract_features: + title: Contract features + type: string + sub_type: multiselect + enum: + - Contract features + - Excess & Layered policies + - CEA mini-policy + - Franchise deductibles + - min-max deductibles + - Sublimits + - Facultative + - Step policy conditions + - Franchise deductibles + - Other +special_conditions: + title: Special conditions + type: string + sub_type: multiselect + enum: + - JER + - Large industrial facilities + - Greenhouses + - New Zealand Earthquake Commission + - Wind farms + - Flood mitigation + - Builders risk + - GoM + - Secondary modifiers + - Other diff --git a/ods_tools/odtf/data/mappings/README.md b/ods_tools/odtf/data/mappings/README.md new file mode 100644 index 00000000..d606a8cd --- /dev/null +++ b/ods_tools/odtf/data/mappings/README.md @@ -0,0 +1,11 @@ +# MAPPING FILES + +The files in this folder are published mapping files, for community use. + +If your local folder containing config files and input data files but does not contain mapping files, the code will search these files for a mapping containing the matching `input_format` and `output_format` contained in your config file. + +These can be copied and edited to create your own versions. We encourage you to share new mappings via this GitHub repo (with update headers to describe the new version and your changes). + +For example or demonstration mapping files, please also see https://github.com/OasisLMF/OpenDataTransform/tree/master/examples + + diff --git a/ods_tools/odtf/data/mappings/header_templates/mapfile_acc_template.yml b/ods_tools/odtf/data/mappings/header_templates/mapfile_acc_template.yml new file mode 100644 index 00000000..b72fe3d2 --- /dev/null +++ b/ods_tools/odtf/data/mappings/header_templates/mapfile_acc_template.yml @@ -0,0 +1,9 @@ +# MAPPING VERSION: OED-AIR-acc-default-1.0 +# CREATOR: IDF Open Data Transformation steering committee +# MODEL VERSIONS: OED 1.1.5 | AIR CEDE (flat file) v8 +# MAP FILETYPE: Account +# LICENSE: BSD 3 clause license +# SOURCE: https://github.com/OasisLMF/OpenDataTransform/ +# COMMENTS: Header for mapping file to transform account information. + + diff --git a/ods_tools/odtf/data/mappings/header_templates/mapfile_loc_template.yml b/ods_tools/odtf/data/mappings/header_templates/mapfile_loc_template.yml new file mode 100644 index 00000000..69da94c9 --- /dev/null +++ b/ods_tools/odtf/data/mappings/header_templates/mapfile_loc_template.yml @@ -0,0 +1,10 @@ +# MAPPING VERSION: OED-AIR-loc-default-1.0 +# CREATOR: IDF Open Data Transformation steering committee +# MODEL VERSIONS: OED 1.1.5 | AIR CEDE (flat file) v8 +# MAP FILETYPE: Location +# LICENSE: BSD 3 clause license +# SOURCE: https://github.com/OasisLMF/OpenDataTransform/ +# COMMENTS: Header for mapping file to transform Location information. + + + diff --git a/ods_tools/odtf/data/mappings/header_templates/mapfile_ri_template.yml b/ods_tools/odtf/data/mappings/header_templates/mapfile_ri_template.yml new file mode 100644 index 00000000..074c30f7 --- /dev/null +++ b/ods_tools/odtf/data/mappings/header_templates/mapfile_ri_template.yml @@ -0,0 +1,10 @@ +# MAPPING VERSION: OED-AIR-ri-default-1.0 +# CREATOR: IDF Open Data Transformation steering committee +# MODEL VERSIONS: OED 1.1.5 | AIR CEDE (flat file) v8 +# MAP FILETYPE: Reinsurance +# LICENSE: BSD 3 clause license +# SOURCE: https://github.com/OasisLMF/OpenDataTransform/ +# COMMENTS: Header for mapping file to transform reinsurance conditions. + + + diff --git a/ods_tools/odtf/data/mappings/mapping_acc_Cede-OED.yaml b/ods_tools/odtf/data/mappings/mapping_acc_Cede-OED.yaml new file mode 100644 index 00000000..0b9f3fb6 --- /dev/null +++ b/ods_tools/odtf/data/mappings/mapping_acc_Cede-OED.yaml @@ -0,0 +1,477 @@ +# MAPPING VERSION: CEDEDB_OED_Test +# CREATOR: Ben Hayes +# MODEL VERSIONS: OED 3.0.2 | AIR CEDE (database) v10.0.0 +# MAP FILETYPE: SQL Server DB extract file to Flat File +# LICENSE: BSD 3 clause license +# SOURCE: https://github.com/OasisLMF/OpenDataTransform/ +# COMMENTS: Full example to demonstrate Sql Server DB extract to Flat File + +file_type: acc +input_format: + name: Cede_Contract + version: "10.0.0" +output_format: + name: OED_Contract + version: "3.0.2" +forward: + types: + ContractID: + type: string + InsuredName: + type: string + Producer: + type: string + Underwriter: + type: string + Branch: + type: string + ExpiringContract: + type: string + Status: + type: string + InceptionDate: + type: string + ExpirationDate: + type: string + Perils: + type: int + LOB: + type: string + Form: + type: string + Currency: + type: string + UDF1: + type: string + UDF2: + type: string + UDF3: + type: string + UDF4: + type: string + UDF5: + type: string + LayerID: + type: string + LayerPerils: + type: string + LimiType: + type: string + Limit1: + type: float + LimitA: + type: float + LimitB: + type: float + LimitC: + type: float + LimitD: + type: float + Limit2: + type: float + DedAmt1: + type: float + DedAmt2: + type: float + DedAmt3: + type: float + DedAmt4: + type: float + AttachmentAmt: + type: float + AttachmentPtA: + type: float + AttachmentPtB: + type: float + AttachmentPtC: + type: float + AttachmentPtD: + type: float + DedType: + type: string + Premium: + type: float + AggregateLimitType: + type: string + AggregateLimit: + type: float + AggregateAttachmentPt: + type: float + AggregateDedType: + type: string + AggregateDedAmt: + type: float + SublimitPerils: + type: string + SublimitArea: + type: string + SubLimitLimitType: + type: string + SublimitDedType: + type: string + SubLimitOcc: + type: float + SublimitPart: + type: float + SublimitAttachAmt: + type: float + SublimitLimitA: + type: float + SublimitLimitB: + type: float + SublimitLimitC: + type: float + SublimitLimitD: + type: float + SublimitAttachA: + type: float + SublimitAttachB: + type: float + SublimitAttachC: + type: float + SublimitAttachD: + type: float + SublimitDedAmt1: + type: float + SublimitDedAmt2: + type: float + SublimitDedAmt3: + type: float + SublimitDedAmt4: + type: float + SublimitName: + type: string + ParentSublimitName: + type: string + SublimitAggregateLimitType: + type: string + SublimitAggregateLimit: + type: float + SublimitAggregateAttachmentPt: + type: float + SublimitAggregateDedType: + type: string + SublimitAggregateDedAmt: + type: float + null_values: + - "''" + - Null + - NULL + transform: + AccCurrency: + - transformation: Currency + AccUserDef1: + - transformation: UDF1 + AccUserDef2: + - transformation: UDF2 + AccUserDef3: + - transformation: UDF3 + AccUserDef4: + - transformation: UDF4 + AccUserDef5: + - transformation: UDF5 + AccName: + - transformation: InsuredName + AccNumber: + - transformation: ContractID + AccPeril: + - transformation: | + replace( + Perils, + 'CF','WSS', + 'CH','XCH', + 'EQ','QEQ', + 'FF','QFF', + 'HL','XHL', + 'IF','ORF', + 'LQ','QLF', + 'LS','QLS', + 'NC','BFR', + 'PD','CPD', + 'PF','OSF', + 'PN','PNF', + 'SB','CSB', + 'SL','QSL', + 'ST','XLT', + 'SU','WSS', + 'SW','XSL', + 'TC','WTC', + 'TD','XTD', + 'TR','MTR', + 'TS','QTS', + 'WF','BBF', + 'WS','ZST', + ',', ';' + ) + AccStatus: + - transformation: Status + BranchName: + - transformation: Branch + CondDed6All: # No 'C' or 'CB' or 'S' type for Condition deductible - therefore all transform to 6All + - transformation: SublimitDedAmt1 + - transformation: SublimitDedAmt2 + - transformation: SublimitDedAmt3 + - transformation: SublimitDedAmt4 + CondLimit1Building: + - transformation: SublimitLimitA + when: SubLimitLimitType is 'C' + CondLimit2Other: + - transformation: SublimitLimitB + when: SubLimitLimitType is 'C' + CondLimit3Contents: + - transformation: SublimitLimitC + when: SubLimitLimitType is 'C' + CondLimit4BI: + - transformation: SublimitLimitD + when: SubLimitLimitType is 'C' + CondLimit5PD: + - transformation: SublimitLimitA + when: SubLimitLimitType is 'CB' + CondLimit6All: # Most values are E - so all can convert to 6All when above contions aren't met + - transformation: SublimitLimitA + when: SubLimitLimitType is not in ['C','CB'] + - transformation: SublimitLimitB + when: SubLimitLimitType is not 'C' + - transformation: SublimitLimitC + when: SubLimitLimitType is not 'C' + - transformation: SublimitLimitD + when: SubLimitLimitType is not 'C' + CondName: + - transformation: SublimitName + CondPeril: + - transformation: | + replace( + SublimitPerils, + 'CF','WSS', + 'CH','XCH', + 'EQ','QEQ', + 'FF','QFF', + 'HL','XHL', + 'IF','ORF', + 'LQ','QLF', + 'LS','QLS', + 'NC','BFR', + 'PD','CPD', + 'PF','OSF', + 'PN','PNF', + 'SB','CSB', + 'SL','QSL', + 'ST','XLT', + 'SU','WSS', + 'SW','XSL', + 'TC','WTC', + 'TD','XTD', + 'TR','MTR', + 'TS','QTS', + 'WF','BBF', + 'WS','ZST', + ',', ';' + ) + ExpiringAccNumber: + - transformation: ExpiringContract + FlexiAccPolicyForm: + - transformation: Form + LayerAttachment: + - transformation: AttachmentAmt + LayerNumber: + - transformation: LayerID + PolPeril: + - transformation: | + replace( + LayerPerils, + 'CF','WSS', + 'CH','XCH', + 'EQ','QEQ', + 'FF','QFF', + 'HL','XHL', + 'IF','ORF', + 'LQ','QLF', + 'LS','QLS', + 'NC','BFR', + 'PD','CPD', + 'PF','OSF', + 'PN','PNF', + 'SB','CSB', + 'SL','QSL', + 'ST','XLT', + 'SU','WSS', + 'SW','XSL', + 'TC','WTC', + 'TD','XTD', + 'TR','MTR', + 'TS','QTS', + 'WF','BBF', + 'WS','ZST', + ',', ';' + ) + LOB: + - transformation: LOB + PolDed6All: # No 'C' or 'CB' or 'S' type for Layer (Policy) deductible - therefore all transform to 6All + - transformation: DedAmt1 + - transformation: DedAmt2 + - transformation: DedAmt3 + - transformation: DedAmt4 + PolLimit6All: # Only LimitType's in cede_acc file are 'E' and 'B' - no OED equivalent, therefore map to PolLimit6All + - transformation: Limit1 + - transformation: Limit2 + PolExpiryDate: + - transformation: ExpirationDate + PolInceptionDate: + - transformation: InceptionDate + ProducerName: + - transformation: Producer + PolNetPremium: + - transformation: Premium + Underwriter: + - transformation: Underwriter +reverse: + types: + AccCurrency: + type: string + AccName: + type: string + AccNumber: + type: string + AccPeril: + type: string + AccStatus: + type: string + AccUserDef1: + type: string + AccUserDef2: + type: string + AccUserDef3: + type: string + AccUserDef4: + type: string + AccUserDef5: + type: string + BranchName: + type: string + CondDed1Building: + type: float + CondDed2Other: + type: float + CondDed3Contents: + type: float + CondDed4BI: + type: float + CondDed5PD: + type: float + CondDed6All: + type: float + CondName: + type: string + CondPeril: + type: string + ExpiringAccNumber: + type: string + FlexiAccPolicyForm: + type: string + LayerAttachment: + type: float + LayerNumber: + type: int + LOB: + type: string + PolDed1Building: + type: float + PolDed2Other: + type: float + PolDed3Contents: + type: float + PolDed4BI: + type: float + PolDed5PD: + type: float + PolDed6All: + type: float + PolExpiryDate: + type: string + PolInceptionDate: + type: string + ProducerName: + type: string + PolNetPremium: + type: float + Underwriter: + type: string + null_values: + - "''" + - Null + - NULL + transform: + AttachmentPoint: + - transformation: LayerAttachment + Branch: + - transformation: BranchName + ContractID: + - transformation: AccNumber + CurrencyCode: + - transformation: AccCurrency + ExpirationDate: + - transformation: PolExpiryDate + ExpiringContractID: + - transformation: ExpiringAccNumber + InsuredName: + - transformation: AccName + InceptionDate: + - transformation: PolInceptionDate + LayerConditionName: + - transformation: CondName + LayerID: + - transformation: LayerNumber + LayerPerils: + - transformation: AccPeril + Perils: + - transformation: AccPeril + PolicyForm: + - transformation: FlexiAccPolicyForm + Premium: + - transformation: PolNetPremium + ProducerName: + - transformation: ProducerName + StatusCode: + - transformation: AccStatus + SublimitLimitA: + #- transformation: CondLimit1Building + # when: CondLimit1Building gt 0 + #- transformation: CondLimit5PD + # when: CondLimit5PD gt 0 + #- transformation: CondLimit6All + # when: CondLimit6All gt 0 + - transformation: "''" + SublimitLimitB: + - transformation: CondLimit2Other + SublimitLimitC: + - transformation: CondLimit3Contents + SublimitLimitD: + - transformation: CondLimit4BI + SubLimitLimitType: + #- transformation: "'C'" + # when: CondLimit1Building gt 0 and CondLimit2Other lte 0 and CondLimit3Contents lte 0 and CondLimit4BI lte 0 and CondLimit5PD lte 0 and CondLimit6All lte 0 + #- transformation: "'C'" + # when: CondLimit2Other gt 0 and CondLimit1Building lte 0 and CondLimit3Contents lte 0 and CondLimit4BI lte 0 and CondLimit5PD lte 0 and CondLimit6All lte 0 + #- transformation: "'C'" + # when: CondLimitContents gt 0 and CondLimit1Building lte 0 and CondLimit2Other lte 0 and CondLimit4BI lte 0 and CondLimit5PD lte 0 and CondLimit6All lte 0 + #- transformation: "'C'" + # when: CondLimit4BI gt 0 and CondLimit1Building lte 0 and CondLimit2Other lte 0 and CondLimit3Contents lte 0 and CondLimit5PD lte 0 and CondLimit6All lte 0 + #- transformation: "'CB'" + # when: CondLimit5PD gt 0 and CondLimit1Building lte 0 and CondLimit2Other lte 0 and CondLimit3Contents lte 0 and CondLimit4BI lte 0 and CondLimit6All lte 0 + - transformation: "''" + SublimitPerils: + - transformation: CondPeril + UserDefined1: + - transformation: AccUserDef1 + UserDefined2: + - transformation: AccUserDef2 + UserDefined3: + - transformation: AccUserDef3 + UserDefined4: + - transformation: AccUserDef4 + UserDefined5: + - transformation: AccUserDef5 + Underwriter: + - transformation: Underwriter + UserLineOfBusiness: + - transformation: LOB diff --git a/ods_tools/odtf/data/mappings/mapping_loc_Cede-OED.yaml b/ods_tools/odtf/data/mappings/mapping_loc_Cede-OED.yaml new file mode 100644 index 00000000..22da38ac --- /dev/null +++ b/ods_tools/odtf/data/mappings/mapping_loc_Cede-OED.yaml @@ -0,0 +1,3604 @@ +# MAPPING VERSION: CEDEDB_OED_Test +# CREATOR: Ben Hayes +# MODEL VERSIONS: OED 3.0.2 | AIR CEDE (database) v10.0.0 +# MAP FILETYPE: SQL Server DB extract file to Flat File +# LICENSE: BSD 3 clause license +# SOURCE: https://github.com/OasisLMF/OpenDataTransform/ +# COMMENTS: Full example to demonstrate Sql Server DB extract to Flat File + +file_type: loc +input_format: + name: Cede_Location + version: "10.0.0" +output_format: + name: OED_Location + version: "3.0.2" +forward: + types: + AdjacentBuildingHeight: + type: int + AppurtenantStructures: + type: int + Area: + type: string + AreaName: + type: string + BaseFloodElevation: + type: float + BaseFloodElevationUnit: + type: string + BasementFinishType: + type: int + BasementLevelCount: + type: int + BrickVeneer: + type: int + BuildingCondition: + type: int + BuildingExteriorOpening: + type: int + BuildingHeight: + type: int + BuildingHeightUnitCode: + type: string + BuildingShape: + type: int + BuildingValue: + type: float + CargoPacking: + type: int + CargoProtection: + type: int + Cede Field: + type: ODTF Data Type + CertifiedStructuresIBHS: + type: int + Chimney: + type: int + City: + type: string + ColdFormedTube: + type: int + ColumnBasement: + type: int + ContentDamageability: + type: int + ContentsValue: + type: float + ContentVulnerability: + type: int + ContractID: + type: string + ConstructionCode: + type: string + ConstructionOther: + type: int + CRESTA: + type: string + CountryISO: + type: string + Currency: + type: string + CustomElevation: + type: float + CustomElevationUnit: + type: string + CustomFloodSOP: + type: float + CustomFloodSOPType: + type: string + CustomFloodZone: + type: int + DaysCovered: + type: int + DeductBldg: + type: float + DeductOther: + type: float + DeductContent: + type: float + DeductTime: + type: float + DeductType: + type: string + DefensibleSpace: + type: int + EnhancedGeoMatchLevelCode: + type: string + Equipment: + type: string + ExpirationDate: + type: string + #ExposureSetName: + #type: string + ExternalDoors: + type: int + FirewiseCommunityParticipation: + type: int + FIRMCompliance: + type: int + FirstFloorHeight: + type: float + FirstFloorHeightUnit: + type: string + FloorArea: + type: int + FloorAreaUnitCode: + type: string + FloorsOccupied: + type: string + FloorOfInterest: + type: int + FoundationType: + type: int + FoundationConnection: + type: int + GeocoderCode: + type: string + GeocoderAccountId: + type: string + GeoMatchLevelCode: + type: string + GlassPercent: + type: int + GlassType: + type: int + GrossArea: + type: float + GrossAreaUnit: + type: string + ISOBIN: + type: string + ISOConstructionCode: + type: string + ISOOccupancyCode: + type: string + InceptionDate: + type: string + InternalPartition: + type: int + IsFireSprinklerAvailable: + type: int + IsPrimary: + type: int + IsTenant: + type: int + #ISValueType: + #type: float + LargeMissile: + type: int + Latitude: + type: float + LatticeType: + type: int + LimitBldg: + type: float + LimitContent: + type: float + LimitOther: + type: float + LimitTime: + type: float + LocationDFID: + type: string + LocationGroup: + type: string + LocationID: + type: string + LocationName: + type: string + LocLimitType: + type: string + LocPerils: + type: string + Longitude: + type: float + MaxDeduct: + type: float + MinDeduct: + type: float + MinMaxDeductType: + type: string + MinDeduct: + type: float + MultiStoryHallType: + type: int + NonCATGroundUpLoss: + type: float + NumberOfStories: + type: int + OccupancyCode: + type: int + OEDVersion: + type: string + Ornamentation: + type: int + OtherValue: + type: float + Participation1: + type: float + Participation2: + type: float + PostalCode: + type: string + Pounding: + type: int + PPCCode: + type: string + Premium: + type: float + ProjectCompletion: + type: float + ProjectPhaseCode: + type: int + Redundancy: + type: int + TimeElementValue: + type: float + Retrofit: + type: int + RiskCount: + type: string + RoofAnchorage: + type: int + RoofAttachedStructure: + type: int + RoofCoverAttachment: + type: int + RoofCover: + type: int + RoofDeckAttachment: + type: int + RoofDeck: + type: int + RoofGeometry: + type: int + RoofHailImpactResistance: + type: int + RoofPitch: + type: int + RoofYearBuilt: + type: int + SalvagePotential: + type: int + SealOfApproval: + type: int + ServiceEquipmentProtection: + type: int + ShapeIrregularity: + type: int + ShortColumn: + type: int + SmallDebris: + type: int + SoftStory: + type: int + SpecialConstruction: + type: int + SpecieStorage: + type: int + SprinklerType: + type: int + Street: + type: string + SubArea: + type: string + SubArea2: + type: string + SublimitArea: + type: string + TallOneStory: + type: int + Tank: + type: int + TerrainRoughness: + type: int + Territory: + type: string + Torsion: + type: int + TransitionInSRC: + type: int + TreeExposure: + type: int + #UserConstructionCodeA: + #type: string + #UserConstructionSchemeCode: + #type: string + UserGeocodeMatchLevel: + type: string + UDF1: + type: string + UDF2: + type: string + UDF3: + type: string + UDF4: + type: string + UDF5: + type: string + #UserOccupancyCode: + #type: string + #UserOccupancySchemeCode: + #type: string + WetFloodProofing: + type: int + #WallAttachedStructureCode: + #type: string + WallSiding: + type: int + WallType: + type: int + WaterHeater: + type: int + Welding: + type: int + WindowProtection: + type: int + YearBuilt: + type: int + null_values: + - "''" + - Null + - NULL + transform: + AccNumber: + - transformation: ContractID + AppurtenantStructure: + - transformation: AppurtenantStructures + AreaCode: + - transformation: Area + AreaName: + - transformation: Area + BaseFloodElevation: + - transformation: BaseFloodElevation + BaseFloodElevationUnit: + - transformation: | + replace( + BaseFloodElevationUnit, + 'SQFT','11', + 'SQM','12', + 'AC','13', + 'HA','14', + 'FT','1', + 'M','2', + 'KM','3', + 'MI','4', + 'None','' + ) + when: BaseFloodElevationUnit is not in [Null, 'NULL'] + - transformation: "''" + Basement: + - transformation: BasementFinishType + BasementLevelCount: + - transformation: BasementLevelCount + BIPOI: + - transformation: DaysCovered + BITIV: + - transformation: TimeElementValue + BrickVeneer: + - transformation: BrickVeneer + BuildingCondition: + - transformation: | + replace( + BuildingCondition, + '0','0', + '1','1', + '2','2', + '3','3', + '4','3' + ) + BuildingExteriorOpening: + - transformation: BuildingExteriorOpening + BuildingHeight: + - transformation: BuildingHeight + BuildingHeightUnit: + - transformation: | + replace( + BuildingHeightUnitCode, + 'SQFT','11', + 'SQM','12', + 'AC','13', + 'HA','14', + 'FT','1', + 'M','2', + 'KM','3', + 'MI','4', + 'None','' + ) + when: BuildingHeightUnitCode is not in [Null, 'NULL'] + - transformation: "''" + BuildingShape: + - transformation: BuildingShape + BuildingTIV: + - transformation: BuildingValue + Packaging: + - transformation: | + replace( + CargoPacking, + '0','0', + '1','3', + '2','2', + '3','1' + ) + Protection: + - transformation: | + replace( + CargoProtection, + '0','0', + '1','3', + '2','2', + '3','1' + ) + Chimney: + - transformation: Chimney + City: + - transformation: City + CondTag: + - transformation: SublimitArea + ConstructionQuality: + - transformation: CertifiedStructuresIBHS + ConstructionCode: + - transformation: | + replace( + ConstructionCode, + '2286','5662', + '2285','5661', + '2284','5660', + '2283','5659', + '2282','5658', + '2281','5657', + '2276','5656', + '2275','5655', + '2274','5654', + '2273','5653', + '2272','5652', + '2271','5651', + '2270','5650', + '2263','5614', + '2262','5613', + '2261','5612', + '2253','5611', + '2252','5610', + '2251','5609', + '2243','5608', + '2242','5607', + '2241','5606', + '2233','5605', + '2232','5604', + '2231','5603', + '2221','5602', + '2211','5601', + '2210','5600', + '2152','5555', + '2151','5554', + '2150','5550', + '2142','5557', + '2141','5552', + '2132','5556', + '2131','5551', + '2031','5403', + '2022','5410', + '2021','5409', + '2016','5408', + '2015','5407', + '2013','5406', + '2012','5405', + '2011','5404', + '2010','5400', + '813','7013', + '812','7012', + '811','7011', + '810','7010', + '809','7009', + '808','7008', + '807','7007', + '806','7006', + '805','7005', + '804','7004', + '803','7003', + '802','7002', + '801','7001', + '800','7000', + '296','6150', + '295','6156', + '294','6155', + '293','6154', + '292','6153', + '291','6152', + '290','6151', + '286','6100', + '285','6106', + '284','6105', + '283','6104', + '282','6103', + '281','6102', + '280','6101', + '276','6000', + '275','6056', + '274','6055', + '273','6054', + '272','6053', + '271','6052', + '270','6051', + '267','5902', + '266','5901', + '265','5900', + '263','5854', + '262','5853', + '261','5850', + '260','5960', + '259','5959', + '258','7000', + '257','5958', + '256','5957', + '255','5956', + '254','5955', + '253','5954', + '252','5953', + '251','5952', + '250','5951', + '247','5807', + '246','5806', + '245','5805', + '244','5804', + '243','5803', + '242','5802', + '241','5801', + '238','5755', + '237','5754', + '236','5753', + '235','5752', + '234','5751', + '233','5703', + '232','5702', + '231','5701', + '228','5657', + '227','5651', + '226','5612', + '225','5609', + '224','5606', + '223','5603', + '222','5602', + '221','5601', + '215','5553', + '214','5552', + '213','5551', + '212','5502', + '211','5501', + '206','5453', + '205','5452', + '204','5451', + '203','5403', + '202','5402', + '201','5401', + '194','5353', + '193','5352', + '192','5351', + '191','5350', + '187','5306', + '186','5305', + '185','5304', + '183','5303', + '182','5302', + '181','5301', + '179','5265', + '178','5264', + '177','5263', + '176','5262', + '175','5261', + '174','5260', + '173','5259', + '172','5258', + '171','5257', + '166','5256', + '165','5255', + '164','5254', + '163','5253', + '162','5252', + '161','5251', + '160','5209', + '159','5208', + '158','5207', + '157','5206', + '156','5205', + '155','5204', + '154','5203', + '153','5202', + '152','5201', + '151','5200', + '140','5159', + '139','5158', + '138','5157', + '137','5156', + '136','5155', + '135','5154', + '134','5153', + '133','5152', + '132','5151', + '131','5150', + '121','5110', + '120','5109', + '119','5108', + '118','5107', + '117','5106', + '116','5105', + '115','5104', + '114','5103', + '113','5102', + '112','5101', + '111','5100', + '108','5057', + '107','5056', + '106','5055', + '105','5054', + '104','5053', + '103','5052', + '102','5051', + '101','5050', + '100','5000' + ) + ContentsFloodVuln: + - transformation: | + replace( + ContentVulnerability, + '0','0', + '1','3', + '2','4', + '3','5', + '4','6' + ) + ContentsTIV: + - transformation: ContentsValue + CountryCode: + - transformation: CountryISO + CustomFloodSOP: + - transformation: CustomFloodSOP + CustomFloodZone: + - transformation: CustomFloodZone + EquipmentBracing: + - transformation: Equipment + ExternalDoors: + - transformation: ExternalDoors + FEMACompliance: + - transformation: FIRMCompliance + FirstFloorHeight: + - transformation: FirstFloorHeight + FirstFloorHeightUnit: + - transformation: | + replace( + FirstFloorHeightUnit, + 'SQFT','11', + 'SQM','12', + 'AC','13', + 'HA','14', + 'FT','1', + 'M','2', + 'KM','3', + 'MI','4', + 'None','' + ) + when: FirstFloorHeightUnit is not in [Null, 'NULL'] + - transformation: "''" + FlexiLocAdjacentBuildingHeight: + - transformation: AdjacentBuildingHeight + FlexiLocConstructionOther: + - transformation: | + replace( + ConstructionOther, + '2286','5662', + '2285','5661', + '2284','5660', + '2283','5659', + '2282','5658', + '2281','5657', + '2276','5656', + '2275','5655', + '2274','5654', + '2273','5653', + '2272','5652', + '2271','5651', + '2270','5650', + '2263','5614', + '2262','5613', + '2261','5612', + '2253','5611', + '2252','5610', + '2251','5609', + '2243','5608', + '2242','5607', + '2241','5606', + '2233','5605', + '2232','5604', + '2231','5603', + '2221','5602', + '2211','5601', + '2210','5600', + '2152','5555', + '2151','5554', + '2150','5550', + '2142','5557', + '2141','5552', + '2132','5556', + '2131','5551', + '2031','5403', + '2022','5410', + '2021','5409', + '2016','5408', + '2015','5407', + '2013','5406', + '2012','5405', + '2011','5404', + '2010','5400', + '813','7013', + '812','7012', + '811','7011', + '810','7010', + '809','7009', + '808','7008', + '807','7007', + '806','7006', + '805','7005', + '804','7004', + '803','7003', + '802','7002', + '801','7001', + '800','7000', + '296','6150', + '295','6156', + '294','6155', + '293','6154', + '292','6153', + '291','6152', + '290','6151', + '286','6100', + '285','6106', + '284','6105', + '283','6104', + '282','6103', + '281','6102', + '280','6101', + '276','6000', + '275','6056', + '274','6055', + '273','6054', + '272','6053', + '271','6052', + '270','6051', + '267','5902', + '266','5901', + '265','5900', + '263','5854', + '262','5853', + '261','5850', + '260','5960', + '259','5959', + '258','7000', + '257','5958', + '256','5957', + '255','5956', + '254','5955', + '253','5954', + '252','5953', + '251','5952', + '250','5951', + '247','5807', + '246','5806', + '245','5805', + '244','5804', + '243','5803', + '242','5802', + '241','5801', + '238','5755', + '237','5754', + '236','5753', + '235','5752', + '234','5751', + '233','5703', + '232','5702', + '231','5701', + '228','5657', + '227','5651', + '226','5612', + '225','5609', + '224','5606', + '223','5603', + '222','5602', + '221','5601', + '215','5553', + '214','5552', + '213','5551', + '212','5502', + '211','5501', + '206','5453', + '205','5452', + '204','5451', + '203','5403', + '202','5402', + '201','5401', + '194','5353', + '193','5352', + '192','5351', + '191','5350', + '187','5306', + '186','5305', + '185','5304', + '183','5303', + '182','5302', + '181','5301', + '179','5265', + '178','5264', + '177','5263', + '176','5262', + '175','5261', + '174','5260', + '173','5259', + '172','5258', + '171','5257', + '166','5256', + '165','5255', + '164','5254', + '163','5253', + '162','5252', + '161','5251', + '160','5209', + '159','5208', + '158','5207', + '157','5206', + '156','5205', + '155','5204', + '154','5203', + '153','5202', + '152','5201', + '151','5200', + '140','5159', + '139','5158', + '138','5157', + '137','5156', + '136','5155', + '135','5154', + '134','5153', + '133','5152', + '132','5151', + '131','5150', + '121','5110', + '120','5109', + '119','5108', + '^118$','5107', + '117','5106', + '116','5105', + '115','5104', + '114','5103', + '113','5102', + '112','5101', + '111','5100', + '108','5057', + '^107$','5056', + '106','5055', + '105','5054', + '104','5053', + '103','5052', + '102','5051', + '101','5050', + '100','5000' + ) + FlexiLocColdFormedTubeCode: + - transformation: ColdFormedTube + FlexiLocColumnBasementCode: + - transformation: ColumnBasement + FlexiLocContentDamageabilityCode: + - transformation: ContentDamageability + FlexiLocCustomFloodSOPType: + - transformation: CustomFloodSOPType + FlexiLocDefensibleSpace: + - transformation: DefensibleSpace + FlexiLocEnhancedGeoMatchLevelCode: + - transformation: EnhancedGeoMatchLevelCode + FlexiLocFirewiseCommunityParticipation: + - transformation: FirewiseCommunityParticipation + FlexiLocFloorOfInterest: + - transformation: FloorOfInterest + FlexiLocGeocoderAccountId: + - transformation: GeocoderAccountId + FlexiLocGlassPercentCode: + - transformation: GlassPercent + FlexiLocGrossArea: + - transformation: GrossArea + FlexiLocGrossAreaUnit: + - transformation: | + replace( + GrossAreaUnit, + 'SQFT','11', + 'SQM','12', + 'AC','13', + 'HA','14', + 'FT','1', + 'M','2', + 'KM','3', + 'MI','4', + 'None','' + ) + when: GrossAreaUnit is not in [Null, 'NULL'] + - transformation: "''" + FlexiLocIsFireSprinklerAvailable: + - transformation: IsFireSprinklerAvailable + FlexiLocISOBIN: + - transformation: ISOBIN + FlexiLocISOConstructionCode: + - transformation: ISOConstructionCode + FlexiLocISOOccupancyCode: + - transformation: ISOOccupancyCode + FlexiLocLargeMissileCode: + - transformation: LargeMissile + FlexiLocParticipation2: + - transformation: Participation2 + FlexiLocPPCCode: + - transformation: PPCCode + FlexiLocProjectPhaseCode: + - transformation: ProjectPhaseCode + FlexiLocRoofHailImpactResistanceCode: + - transformation: RoofHailImpactResistance + FlexiLocSealOfApprovalCode: + - transformation: SealOfApproval + FlexiLocSubareaName: + - transformation: SubArea + FlexiLocSubarea2Name: + - transformation: SubArea2 + FlexiLocTerritory: + - transformation: Territory + FlexiLocTransitionInSRCCode: + - transformation: TransitionInSRC + FlexiLocUserGeocodeMatchLevel: + - transformation: UserGeocodeMatchLevel + FlexiLocWallCode: + - transformation: WallType + FlexiLocWallSidingCode: + - transformation: WallSiding + FlexiLocWaterHeaterCode: + - transformation: WaterHeater + FlexiLocWeldingCode: + - transformation: Welding + FloodDefenseHeight: + - transformation: | + replace( + WetFloodProofing, + '0','0', + '1','0', + '2','1', + '3','3', + '4','4' + ) + FloorArea: + - transformation: FloorArea + FloorAreaUnit: + - transformation: | + replace( + FloorAreaUnitCode, + 'SQFT','11', + 'SQM','12', + 'AC','13', + 'HA','14', + 'FT','1', + 'M','2', + 'KM','3', + 'MI','4', + 'None','' + ) + when: FloorAreaUnitCode is not in [Null, 'NULL'] + - transformation: "''" + FloorsOccupied: + - transformation: FloorsOccupied + FoundationConnection: + - transformation: FoundationConnection + FoundationType: + - transformation: FoundationType + Geocoder: + - transformation: GeocoderCode + GeogScheme1: + - transformation: CRESTA + GlassType: + - transformation: GlassType + GroundElevation: + - transformation: CustomElevation + GroundElevationUnit: + - transformation: | + replace( + CustomElevationUnit, + 'SQFT','11', + 'SQM','12', + 'AC','13', + 'HA','14', + 'FT','1', + 'M','2', + 'KM','3', + 'MI','4', + 'None','' + ) + when: CustomElevationUnit is not in [Null, 'NULL'] + - transformation: "''" + InternalPartition: + - transformation: InternalPartition + IsPrimary: + - transformation: IsPrimary + IsTenant: + - transformation: IsTenant + Latitude: + - transformation: Latitude + LatticeType: + - transformation: LatticeType + LocCurrency: + - transformation: Currency + LocDed1Building: + - transformation: DeductBldg + when: DeductType is 'C' + LocDed2Other: + - transformation: DeductOther + when: DeductType is 'C' + LocDed3Contents: + - transformation: DeductContent + when: DeductType is 'C' + LocDed4BI: + - transformation: DeductTime + when: DeductType is 'C' + LocDed5PD: + - transformation: DeductBldg + when: DeductType is 'CB' + LocDed6All: + - transformation: DeductBldg + when: DeductType is 'S' + LocDedCode1Building: + - transformation: 0 + LocDedCode2Other: + - transformation: 0 + LocDedCode3Contents: + - transformation: 0 + LocDedCode4BI: + - transformation: 0 + LocDedCode5PD: + - transformation: 0 + LocDedCode6All: + - transformation: 0 + LocDedType1Building: + - transformation: 0 + when: DeductBldg gt 1 and DeductType is 'C' + - transformation: 2 + when: DeductBldg lte 1 and DeductType is 'C' + LocDedType2Other: + - transformation: 0 + when: DeductOther gt 1 and DeductType is 'C' + - transformation: 2 + when: DeductOther lte 1 and DeductType is 'C' + LocDedType3Contents: + - transformation: 0 + when: DeductContent gt 1 and DeductType is 'C' + - transformation: 2 + when: DeductContent lte 1 and DeductType is 'C' + LocDedType4BI: + - transformation: 0 + when: DeductTime gt 1 and DeductType is 'C' + - transformation: 2 + when: DeductTime lte 1 and DeductType is 'C' + LocDedType5PD: + - transformation: 0 + when: DeductBldg gt 1 and DeductType is 'CB' + - transformation: 2 + when: DeductBldg lte 1 and DeductType is 'CB' + LocDedType6All: + - transformation: 0 + when: DeductBldg gt 1 and DeductType is 'S' + - transformation: 2 + when: DeductBldg lte 1 and DeductType is 'S' + LocExpiryDate: + - transformation: ExpirationDate + LocNetPremium: + - transformation: Premium + LocGroup: + - transformation: LocationGroup + LocInceptionDate: + - transformation: InceptionDate + LocLimit1Building: + - transformation: LimitBldg + when: LocLimitType is 'C' + LocLimit2Other: + - transformation: LimitOther + when: LocLimitType is 'C' + LocLimit3Contents: + - transformation: LimitContent + when: LocLimitType is 'C' + LocLimit4BI: + - transformation: LimitTime + when: LocLimitType is 'C' + LocLimit5PD: + - transformation: LimitBldg + when: LocLimitType is 'EE' + LocLimit6All: + - transformation: LimitBldg + when: LocLimitType is 'S' + LocLimitCode1Building: + - transformation: 0 + LocLimitCode2Other: + - transformation: 0 + LocLimitCode3Contents: + - transformation: 0 + LocLimitCode4BI: + - transformation: 0 + LocLimitCode5PD: + - transformation: 0 + LocLimitCode6All: + - transformation: 0 + LocLimitType1Building: + - transformation: 0 + LocLimitType2Other: + - transformation: 0 + LocLimitType3Contents: + - transformation: 0 + LocLimitType4BI: + - transformation: 0 + LocLimitType5PD: + - transformation: 0 + LocLimitType6All: + - transformation: 0 + LocMaxDed1Building: + - transformation: MaxDeduct + when: DeductBldg gt 0 and DeductType is 'C' + LocMaxDed2Other: + - transformation: MaxDeduct + when: DeductOther gt 0 and DeductType is 'C' + LocMaxDed3Contents: + - transformation: MaxDeduct + when: DeductContent gt 0 and DeductType is 'C' + LocMaxDed4BI: + - transformation: MaxDeduct + when: DeductTime gt 0 and DeductType is 'C' + LocMaxDed5PD: + - transformation: MaxDeduct + when: DeductBldg gt 0 and DeductType is 'CB' + LocMaxDed6All: + - transformation: MaxDeduct + when: DeductBldg gt 0 and DeductType is 'S' + LocMinDed1Building: + - transformation: MinDeduct + when: DeductBldg gt 0 and DeductType is 'C' + LocMinDed2Other: + - transformation: MinDeduct + when: DeductOther gt 0 and DeductType is 'C' + LocMinDed3Contents: + - transformation: MinDeduct + when: DeductContent gt 0 and DeductType is 'C' + LocMinDed4BI: + - transformation: MinDeduct + when: DeductTime gt 0 and DeductType is 'C' + LocMinDed5PD: + - transformation: MinDeduct + when: DeductBldg gt 0 and DeductType is 'CB' + LocMinDed6All: + - transformation: MinDeduct + when: DeductBldg gt 0 and DeductType is 'S' + LocName: + - transformation: LocationName + LocParticipation: + - transformation: Participation1 + LocPeril: + - transformation: | + replace( + LocPerils, + 'CF','WSS', + 'CH','XCH', + 'EQ','QEQ', + 'FF','QFF', + 'HL','XHL', + 'IF','ORF', + 'LQ','QLF', + 'LS','QLS', + 'NC','BFR', + 'PD','CPD', + 'PF','OSF', + 'PN','PNF', + 'SB','CSB', + 'SL','QSL', + 'ST','XLT', + 'SU','WSS', + 'SW','XSL', + 'TC','WTC', + 'TD','XTD', + 'TR','MTR', + 'TS','QTS', + 'WF','BBF', + 'WS','ZST', + ',', ';' + ) + when: LocPerils is not in [Null, '', 'NULL'] + - transformation: "'AA1'" + LocPerilsCovered: + - transformation: | + replace( + LocPerils, + 'CF','WSS', + 'CH','XCH', + 'EQ','QEQ', + 'FF','QFF', + 'HL','XHL', + 'IF','ORF', + 'LQ','QLF', + 'LS','QLS', + 'NC','BFR', + 'PD','CPD', + 'PF','OSF', + 'PN','PNF', + 'SB','CSB', + 'SL','QSL', + 'ST','XLT', + 'SU','WSS', + 'SW','XSL', + 'TC','WTC', + 'TD','XTD', + 'TR','MTR', + 'TS','QTS', + 'WF','BBF', + 'WS','ZST', + ',', ';' + ) + when: LocPerils is not in [Null, '', 'NULL'] + - transformation: "'AA1'" + LocNumber: + - transformation: LocationID + LocUserDef1: + - transformation: UDF1 + LocUserDef2: + - transformation: UDF2 + LocUserDef3: + - transformation: UDF3 + LocUserDef4: + - transformation: UDF4 + LocUserDef5: + - transformation: UDF5 + Longitude: + - transformation: Longitude + MultiStoryHall: + - transformation: MultiStoryHallType + NonCATGroundUpLoss: + - transformation: NonCATGroundUpLoss + NumberOfBuildings: + - transformation: RiskCount + NumberOfStoreys: + - transformation: NumberOfStories + OccupancyCode: + - transformation: + replace( + OccupancyCode, + '300','1000', + '301','1050', + '302','1051', + '303','1052', + '304','1053', + '305','1054', + '306','1055', + '307','1056', + '311','1100', + '312','1101', + '313','1102', + '314','1103', + '315','1104', + '316','1105', + '317','1108', + '318','1113', + '319','1114', + '321','1150', + '322','1151', + '323','1152', + '324','1153', + '325','1154', + '326','1155', + '327','1156', + '328','1157', + '329','1158', + '330','1159', + '331','1119', + '335','1120', + '336','1121', + '341','1200', + '342','1201', + '343','1210', + '344','1220', + '345','1230', + '346','1231', + '351','1250', + '352','1251', + '353','1252', + '354','1253', + '355','1254', + '356','1255', + '361','1300', + '362','1301', + '363','1302', + '364','1303', + '365','1304', + '366','1122', + '371','1123', + '372','1350', + '373','1351', + '374','1352', + '375','1353', + '400','2000', + '401','2050', + '402','2051', + '403','2052', + '404','2053', + '405','2054', + '406','2055', + '407','2056', + '408','2057', + '409','2058', + '414','2100', + '415','2101', + '416','2102', + '417','2103', + '418','2104', + '419','2105', + '420','2106', + '421','2107', + '422','2108', + '423','2109', + '424','2110', + '425','2111', + '429','2150', + '430','2151', + '431','2152', + '432','2153', + '433','2154', + '434','2155', + '438','2200', + '439','2201', + '440','2202', + '441','2203', + '442','2204', + '443','2205', + '444','2206', + '445','2207', + '446','2208', + '449','2250', + '450','2251', + '451','2252', + '452','2253', + '455','2300', + '456','2301', + '457','2302', + '458','2303', + '459','2304', + '460','2305', + '463','2350', + '464','2351', + '465','2352', + '470','2400', + '471','2401', + '472','2402', + '473','2403', + '474','2404', + '475','2450', + '476','2500', + '477','2510', + '478','2520', + '479','2530', + '480','2550', + '481','2560', + '482','2600', + '483','2650', + '484','2700', + '485','2750', + '486','2760', + '487','2770', + '488','2780', + '900','3000', + '901','3001', + '902','3002', + '903','3003', + '904','3004', + '905','3005', + '906','3006', + '907','3007', + '908','3008', + '909','3009' + ) + #OrgConstructionCode: + #- transformation: UserConstructionCodeA + #OrgConstructionScheme: + #- transformation: UserConstructionSchemeCode + #OrgOccupancyCode: + #- transformation: UserOccupancyCode + #OrgOccupancyScheme: + #- transformation: UserOccupancySchemeCode + OEDVersion: + - transformation: "302" + Ornamentation: + - transformation: Ornamentation + OtherTIV: + - transformation: OtherValue + PercentComplete: + - transformation: ProjectCompletion + #PortNumber: + #- transformation: ExposureSetName + PostalCode: + - transformation: PostalCode + Pounding: + - transformation: Pounding + Redundancy: + - transformation: Redundancy + Retrofit: + - transformation: Retrofit + RoofAnchorage: + - transformation: RoofAnchorage + RoofAttachedStructures: + - transformation: RoofAttachedStructure + RoofCover: + - transformation: RoofCover + RoofCoverAttachment: + - transformation: RoofCoverAttachment + RoofDeck: + - transformation: RoofDeck + RoofDeckAttachment: + - transformation: RoofDeckAttachment + RoofGeometry: + - transformation: RoofGeometry + RoofPitch: + - transformation: RoofPitch + RoofYearBuilt: + - transformation: RoofYearBuilt + SalvageProtection: + - transformation: | + replace( + SalvagePotential, + '0','0', + '1','1', + '2','1', + '3','2', + '4','3', + '5','3' + ) + ServiceEquipmentProtection: + - transformation: | + replace( + ServiceEquipmentProtection, + '0','0', + '1','1', + '2','2', + '3','1', + '4','1' + ) + ShapeIrregularity: + - transformation: ShapeIrregularity + ShortColumn: + - transformation: ShortColumn + SmallDebris: + - transformation: SmallDebris + SoftStory: + - transformation: SoftStory + #SoilValue: + #- transformation: ISValueType + SpecialEQConstruction: + - transformation: SpecialConstruction + ValuablesStorage: + - transformation: | + replace( + SpecieStorage, + '0','0', + '1','1', + '2','0', + '3','0' + ) + SprinklerType: + - transformation: | + replace( + SprinklerType, + '0','0', + '1','5', + '2','3' + ) + StreetAddress: + - transformation: Street + TallOneStory: + - transformation: TallOneStory + Tank: + - transformation: Tank + TerrainRoughness: + - transformation: TerrainRoughness + Torsion: + - transformation: Torsion + TreeExposure: + - transformation: TreeExposure + VulnerabilitySetID: + - transformation: LocationDFID + #WallAttachedStructure: + #- transformation: WallAttachedStructureCode + WindowProtection: + - transformation: WindowProtection + YearBuilt: + - transformation: YearBuilt +reverse: + types: + AccNumber: + type: string + AppurtenantStructure: + type: int + AreaCode: + type: string + AreaName: + type: string + BaseFloodElevation: + type: float + BaseFloodElevationUnit: + type: int + Basement: + type: int + BasementLevelCount: + type: int + BIPOI: + type: float + BITIV: + type: float + BrickVeneer: + type: int + BuildingCondition: + type: int + BuildingExteriorOpening: + type: int + BuildingHeight: + type: float + BuildingHeightUnit: + type: int + BuildingShape: + type: int + BuildingTIV: + type: float + Chimney: + type: int + City: + type: string + CondTag: + type: string + ConstructionQuality: + type: int + ConstructionCode: + type: int + ContentsFloodVuln: + type: int + ContentsTIV: + type: float + ContentsWindVuln: + type: int + CountryCode: + type: string + CustomFloodSOP: + type: int + CustomFloodZone: + type: string + DeductibleTypeCode: + type: string + EquipmentBracing: + type: int + ExternalDoors: + type: int + FEMACompliance: + type: int + FirstFloorHeight: + type: float + FirstFloorHeightUnit: + type: int + FlexiLocAdjacentBuildingHeight: + type: string + FlexiLocConstructionOther: + type: string + FlexiLocColdFormedTubeCode: + type: string + FlexiLocColumnBasementCode: + type: string + FlexiLocContentDamageabilityCode: + type: string + FlexiLocCustomFloodSOPType: + type: string + FlexiLocDefensibleSpace: + type: string + FlexiLocEnhancedGeoMatchLevelCode: + type: string + FlexiLocFirewiseCommunityParticipation: + type: string + FlexiLocFloorOfInterest: + type: string + FlexiLocGeocoderAccountId: + type: string + FlexiLocGlassPercentCode: + type: string + FlexiLocGrossArea: + type: string + FlexiLocGrossAreaUnit: + type: string + FlexiLocIsFireSprinklerAvailable: + type: string + FlexiLocISOBIN: + type: string + FlexiLocISOConstructionCode: + type: string + FlexiLocISOOccupancyCode: + type: string + FlexiLocLargeMissileCode: + type: string + FlexiLocParticipation2: + type: string + FlexiLocPPCCode: + type: string + FlexiLocProjectPhaseCode: + type: string + FlexiLocRoofHailImpactResistanceCode: + type: string + FlexiLocSealOfApprovalCode: + type: string + FlexiLocSubareaName: + type: string + FlexiLocSubarea2Name: + type: string + FlexiLocTerritory: + type: string + FlexiLocTransitionInSRCCode: + type: string + FlexiLocUserGeocodeMatchLevel: + type: string + FlexiLocWallCode: + type: string + FlexiLocWallSidingCode: + type: string + FlexiLocWaterHeaterCode: + type: string + FlexiLocWeldingCode: + type: string + FloodDefenseHeight: + type: int + FloorArea: + type: float + FloorAreaUnit: + type: int + FloorsOccupied: + type: string + FoundationConnection: + type: int + FoundationType: + type: int + Geocoder: + type: string + GeogScheme1: + type: string + GlassType: + type: int + GroundElevation: + type: float + GroundElevationUnit: + type: int + InternalPartition: + type: int + IsPrimary: + type: int + IsTenant: + type: int + Latitude: + type: float + LatticeType: + type: int + LimitTypeCode: + type: string + LocCurrency: + type: string + LocDed1Building: + type: float + LocDed2Other: + type: float + LocDed3Contents: + type: float + LocDed4BI: + type: float + LocDed5PD: + type: float + LocDed6All: + type: float + LocDedCode1Building: + type: int + LocDedCode2Other: + type: int + LocDedCode3Contents: + type: int + LocDedCode4BI: + type: int + LocDedCode5PD: + type: int + LocDedCode6All: + type: int + LocDedType1Building: + type: int + LocDedType2Other: + type: int + LocDedType3Contents: + type: int + LocDedType4BI: + type: int + LocDedType5PD: + type: int + LocDedType6All: + type: int + LocExpiryDate: + type: string + LocGrossPremium: + type: float + LocGroup: + type: string + LocInceptionDate: + type: string + LocLimit1Building: + type: float + LocLimit2Other: + type: float + LocLimit3Contents: + type: float + LocLimit4BI: + type: float + LocLimit5PD: + type: float + LocLimit6All: + type: float + LocLimitCode1Building: + type: int + LocLimitCode2Other: + type: int + LocLimitCode3Contents: + type: int + LocLimitCode4BI: + type: int + LocLimitCode5PD: + type: int + LocLimitCode6All: + type: int + LocLimitType1Building: + type: int + LocLimitType2Other: + type: int + LocLimitType3Contents: + type: int + LocLimitType4BI: + type: int + LocLimitType5PD: + type: int + LocLimitType6All: + type: int + LocMaxDed1Building: + type: float + LocMaxDed2Other: + type: float + LocMaxDed3Contents: + type: float + LocMaxDed4BI: + type: float + LocMaxDed5PD: + type: float + LocMaxDed6All: + type: float + LocMinDed1Building: + type: float + LocMinDed2Other: + type: float + LocMinDed3Contents: + type: float + LocMinDed4BI: + type: float + LocMinDed5PD: + type: float + LocMinDed6All: + type: float + LocName: + type: string + LocParticipation: + type: float + LocPeril: + type: string + LocPerilsCovered: + type: string + LocNumber: + type: string + LocUserDef1: + type: string + LocUserDef2: + type: string + LocUserDef3: + type: string + LocUserDef4: + type: string + LocUserDef5: + type: string + Longitude: + type: float + MultiStoryHal: + type: int + NonCATGroundUpLoss: + type: float + NumberOfBuildings: + type: int + NumberOfStoreys: + type: int + OccupancyCode: + type: int + Ornamentation: + type: int + OtherTIV: + type: float + Packaging: + type: int + PercentComplete: + type: float + PostalCode: + type: string + Pounding: + type: int + Protection: + type: int + Redundancy: + type: int + Retrofit: + type: int + RoofAnchorage: + type: int + RoofAttachedStructures: + type: int + RoofCover: + type: int + RoofCoverAttachment: + type: int + RoofDeck: + type: int + RoofDeckAttachment: + type: int + RoofGeometry: + type: int + RoofPitch: + type: int + RoofYearBuilt: + type: int + SalvageProtection: + type: int + ServiceEquipmentProtection: + type: int + ShapeIrregularity: + type: int + ShortColumn: + type: int + SmallDebris: + type: int + SoftStory: + type: int + SpecialEQConstruction: + type: int + SprinklerType: + type: int + StreetAddress: + type: string + TallOneStory: + type: int + Tank: + type: int + TerrainRoughness: + type: int + Torsion: + type: int + TreeExposure: + type: int + ValuablesStorage: + type: int + VulnerabilitySetID: + type: int + WindowProtection: + type: int + YearBuilt: + type: int + null_values: + - "''" + - Null + - NULL + transform: + Address: + - transformation: StreetAddress + AdjacentBuildingHeight: + - transformation: FlexiLocAdjacentBuildingHeight + AIRConstructionCodeA: + - transformation: | + replace( + ConstructionCode, + '5000','100', + '5050','101', + '5051','102', + '5052','103', + '5053','104', + '5054','105', + '5055','106', + '5056','107', + '5057','108', + '5100','111', + '5101','112', + '5102','113', + '5103','114', + '5104','115', + '5105','116', + '5106','117', + '5107','118', + '5108','119', + '5109','120', + '5110','121', + '5150','131', + '5151','132', + '5152','133', + '5153','134', + '5154','135', + '5155','136', + '5156','137', + '5157','138', + '5158','139', + '5159','140', + '5200','151', + '5201','152', + '5202','153', + '5203','154', + '5204','155', + '5205','156', + '5206','157', + '5207','158', + '5208','159', + '5209','160', + '5251','161', + '5252','162', + '5253','163', + '5254','164', + '5255','165', + '5256','166', + '5257','171', + '5258','172', + '5259','173', + '5260','174', + '5261','175', + '5262','176', + '5263','177', + '5264','178', + '5265','179', + '5301','181', + '5302','182', + '5303','183', + '5304','185', + '5305','186', + '5306','187', + '5309','100', + '5310','100', + '5350','191', + '5351','192', + '5352','193', + '5353','194', + '5354','100', + '5401','201', + '5402','202', + '5451','204', + '5452','205', + '5453','206', + '5501','211', + '5502','212', + '5553','215', + '5701','231', + '5702','232', + '5703','233', + '5751','234', + '5752','235', + '5753','236', + '5754','237', + '5755','238', + '5801','241', + '5802','242', + '5803','243', + '5804','244', + '5805','245', + '5806','246', + '5807','247', + '5951','250', + '5952','251', + '5953','252', + '5954','253', + '5955','254', + '5956','255', + '5957','256', + '5958','257', + '5959','259', + '5960','260', + '5850','261', + '5853','262', + '5854','263', + '5900','265', + '5901','266', + '5902','267', + '6051','270', + '6052','271', + '6053','272', + '6054','273', + '6055','274', + '6056','275', + '6000','276', + '6101','280', + '6102','281', + '6103','282', + '6104','283', + '6105','284', + '6106','285', + '6100','286', + '6151','290', + '6152','291', + '6153','292', + '6154','293', + '6155','294', + '6156','295', + '6150','296', + '7001','801', + '7002','802', + '7003','803', + '7004','804', + '7005','805', + '7006','806', + '7007','807', + '7008','808', + '7009','809', + '7010','810', + '7011','811', + '7012','812', + '7013','813', + '5400','2010', + '5404','2011', + '5405','2012', + '5406','2013', + '5407','2015', + '5408','2016', + '5409','2021', + '5410','2022', + '5556','2132', + '5557','2142', + '5550','2150', + '5554','2151', + '5555','2152', + '5600','2210', + '5604','2232', + '5605','2233', + '5607','2242', + '5608','2243', + '5610','2252', + '5611','2253', + '5613','2262', + '5614','2263', + '5650','2270', + '5652','2272', + '5653','2273', + '5654','2274', + '5655','2275', + '5656','2276', + '5658','2282', + '5659','2283', + '5660','2284', + '5661','2285', + '5662','2286', + '5403','203', + '5551','213', + '5552','214', + '5601','221', + '5602','222', + '5603','223', + '5606','224', + '5609','225', + '5612','226', + '5651','227', + '5657','228', + '7000','258', + '5403','2031', + '5551','2131', + '5552','2141', + '5601','2211', + '5602','2221', + '5603','2231', + '5606','2241', + '5609','2251', + '5612','2261', + '5651','2271', + '5657','2281', + '7000','800', + '5451','100', + '5452','100', + '5454','100', + '5455','100', + '5456','100', + '5457','100', + '5458','100', + '5459','100', + '5460','100', + '5461','100', + '5463','100', + '5464','100', + '5465','100', + '5466','100', + '5467','100', + '5503','100', + '5756','100', + '5851','100', + '5852','100', + '5855','100', + '5856','100', + '5857','100', + '5858','100', + '5859','100', + '5860','100', + '5861','100', + '5862','100', + '5863','100', + '5864','100', + '5865','100', + '5866','100', + '5867','100', + '5868','100', + '5869','100', + '5870','100', + '5871','100', + '5872','100', + '5873','100', + '5874','100', + '5875','100', + '5961','100', + '5862','100', + '5863','100', + '5864','100', + '5865','100', + '5866','100', + '5867','100', + '5868','100', + '5869','100', + '5870','100', + '5871','100', + '5872','100', + '5873','100', + '5874','100', + '5875','100', + '5961','100', + '7014','100', + '7015','100', + '7016','100', + '7017','100', + '7018','100', + '7019','100', + '7020','100', + '7021','100', + '7022','100', + '7023','100', + '8000','100', + '8010','100', + '8011','100', + '8012','100', + '8013','100', + '8014','100', + '8015','100', + '8016','100', + '8017','100', + '8018','100', + '8019','100', + '8030','100', + '8031','100', + '8032','100', + '8033','100', + '8034','100', + '8035','100', + '8050','100', + '8051','100', + '8052','100', + '8053','100', + '8054','100', + '8055','100', + '8056','100', + '8057','100', + '8070','100', + '8071','100', + '8072','100', + '8073','100', + '8090','100', + '8091','100', + '8092','100', + '8093','100', + '8094','100', + '8100','100', + '8101','100', + '8102','100', + '8103','100', + '8110','100', + '8111','100', + '8112','100', + '8113','100', + '8114','100', + '8115','100', + '8116','100', + '8117','100', + '8118','100', + '8119','100', + '8120','100', + '8130','100', + '8131','100', + '8132','100', + '8133','100', + '8134','100', + '8140','100', + '8141','100', + '8142','100', + '8143','100', + '8144','100', + '8145','100', + '8146','100', + '8300','100', + '8301','100', + '8302','100', + '8303','100', + '8304','100', + '8305','100', + '8306','100', + '8307','100', + '8308','100', + '8309','100', + '8310','100', + '8311','100', + '8312','100', + '8313','100', + '8314','100', + '8315','100', + '8316','100', + '8317','100', + '8318','100', + '8319','100', + '8320','100', + '8321','100', + '8322','100', + '8323','100', + '8324','100', + '8325','100', + '8326','100', + '8327','100', + '8400','100', + '8401','100', + '8402','100', + '8403','100', + '8404','100', + '8405','100', + '8406','100', + '8407','100', + '8408','100', + '8409','100', + '8410','100', + '8411','100', + '8412','100', + '8413','100', + '8414','100', + '8415','100', + '8416','100', + '8417','100', + '8418','100', + '8419','100', + '8420','100', + '8421','100', + '8422','100' + ) + AIROccupancyCode: + - transformation: | + replace( + OccupancyCode, + '1000','300', + '1050','301', + '1051','302', + '1052','303', + '1053','304', + '1054','305', + '1055','306', + '1056','307', + '1100','311', + '1101','312', + '1102','313', + '1103','314', + '1104','315', + '1105','316', + '1108','317', + '1113','318', + '1114','319', + '1150','321', + '1151','322', + '1152','323', + '1153','324', + '1154','325', + '1155','326', + '1156','327', + '1157','328', + '1158','329', + '1159','330', + '1119','331', + '1120','335', + '1121','336', + '1200','341', + '1201','342', + '1210','343', + '1220','344', + '1230','345', + '1231','346', + '1250','351', + '1251','352', + '1252','353', + '1253','354', + '1254','355', + '1255','356', + '1300','361', + '1301','362', + '1302','363', + '1303','364', + '1304','365', + '1122','366', + '1123','371', + '1350','372', + '1351','373', + '1352','374', + '1353','375', + '2000','400', + '2050','401', + '2051','402', + '2052','403', + '2053','404', + '2054','405', + '2055','406', + '2056','407', + '2057','408', + '2058','409', + '2100','414', + '2101','415', + '2102','416', + '2103','417', + '2104','418', + '2105','419', + '2106','420', + '2107','421', + '2108','422', + '2109','423', + '2110','424', + '2111','425', + '2150','429', + '2151','430', + '2152','431', + '2153','432', + '2154','433', + '2155','434', + '2200','438', + '2201','439', + '2202','440', + '2203','441', + '2204','442', + '2205','443', + '2206','444', + '2207','445', + '2208','446', + '2250','449', + '2251','450', + '2252','451', + '2253','452', + '2300','455', + '2301','456', + '2302','457', + '2303','458', + '2304','459', + '2305','460', + '2350','463', + '2351','464', + '2352','465', + '2400','470', + '2401','471', + '2402','472', + '2403','473', + '2404','474', + '2450','475', + '2500','476', + '2510','477', + '2520','478', + '2530','479', + '2550','480', + '2560','481', + '2600','482', + '2650','483', + '2700','484', + '2750','485', + '2760','486', + '2770','487', + '2780','488', + '3000','900', + '3001','901', + '3002','902', + '3003','903', + '3004','904', + '3005','905', + '3006','906', + '3007','907', + '3008','908', + '3009','909', + '1057','300', + '1058','300', + '1070','300', + '1071','300', + '1072','300', + '1073','300', + '1106','300', + '1107','300', + '1109','300', + '1110','300', + '1111','300', + '1112','300', + '1115','300', + '1116','300', + '1117','300', + '1118','300', + '1124','300', + '1211','300', + '1212','300', + '1213','300', + '1214','300', + '1215','300', + '1256','300', + '1360','300', + '1370','300', + '2460','300', + '2461','300', + '2470','300', + '2505','300', + '2515','300', + '2521','300', + '2531','300', + '2541','300', + '2542','300', + '2543','300', + '2610','300', + '2611','300', + '2612','300', + '2613','300', + '2620','300', + '2651','300', + '3010','300', + '3011','300', + '3012','300', + '3013','300', + '3014','300', + '3015','300', + '3016','300', + '3017','300', + '3018','300', + '3019','300', + '3020','300', + '3021','300', + '3022','300', + '3023','300', + '3024','300', + '3025','300', + '3026','300', + '3027','300', + '3028','300', + '3029','300', + '3030','300', + '3031','300', + '3032','300', + '3033','300', + '3034','300', + '3035','300', + '3036','300' + ) + AppliesToTag: + - transformation: CondTag + AppurtenantStructures: + - transformation: | + replace( + AppurtenantStructure, + '10','0', + '11','0', + '12','0', + '0','0', + '1','1', + '2','2', + '3','3', + '4','4', + '5','5', + '6','6', + '7','7', + '8','0', + '9','0' + ) + Area: + - transformation: AreaCode + AreaName: + - transformation: AreaName + BaseFloodElevation: + - transformation: BaseFloodElevation + BaseFloodElevationUnitCode: + - transformation: | + replace( + BaseFloodElevationUnit, + '11','SQFT', + '12','SQM', + '13','AC', + '14','HA', + '1','FT', + '2','M', + '3','KM', + '4','MI', + 'None','' + ) + when: BaseFloodElevationUnit is not in [Null, 'NULL'] + - transformation: "''" + BasementFinishType: + - transformation: | + replace( + Basement, + '0','0', + '1','1', + '2','2', + '3','2', + '4','2', + '5','2', + '6','0' + ) + BasementLevelCount: + - transformation: BasementLevelCount + BrickVeneerCode: + - transformation: BrickVeneer + BuildingConditionCode: + - transformation: BuildingCondition + BuildingExteriorOpeningCode: + - transformation: BuildingExteriorOpening + BuildingHeight: + - transformation: BuildingHeight + BuildingHeightUnitCode: + - transformation: | + replace( + BuildingHeightUnit, + '11','SQFT', + '12','SQM', + '13','AC', + '14','HA', + '1','FT', + '2','M', + '3','KM', + '4','MI', + 'None','' + ) + when: BuildingHeightUnit is not in [Null, 'NULL', ''] + - transformation: "''" + BuildingValue: + - transformation: BuildingTIV + BuildingShapeCode: + - transformation: | + replace( + BuildingShape, + '0','0', + '1','1', + '2','2', + '3','2', + '4','2', + '5','2', + '6','6', + '7','7', + '8','8', + '9','0' + ) + CargoPackingCode: + - transformation: | + replace( + Packaging, + '0','0', + '1','3', + '2','2', + '3','1' + ) + CargoProtectionCode: + - transformation: | + replace( + Protection, + '0','0', + '1','3', + '2','2', + '3','1' + ) + ChimneyCode: + - transformation: Chimney + City: + - transformation: City + ColdFormedTubeCode: + - transformation: FlexiLocColdFormedTubeCode + ColumnBasementCode: + - transformation: FlexiLocColumnBasementCode + ConstructionOther: + - transformation: | + replace( + FlexiLocConstructionOther, + '5000','100', + '5050','101', + '5051','102', + '5052','103', + '5053','104', + '5054','105', + '5055','106', + '5056','107', + '5057','108', + '5100','111', + '5101','112', + '5102','113', + '5103','114', + '5104','115', + '5105','116', + '5106','117', + '5107','118', + '5108','119', + '5109','120', + '5110','121', + '5150','131', + '5151','132', + '5152','133', + '5153','134', + '5154','135', + '5155','136', + '5156','137', + '5157','138', + '5158','139', + '5159','140', + '5200','151', + '5201','152', + '5202','153', + '5203','154', + '5204','155', + '5205','156', + '5206','157', + '5207','158', + '5208','159', + '5209','160', + '5251','161', + '5252','162', + '5253','163', + '5254','164', + '5255','165', + '5256','166', + '5257','171', + '5258','172', + '5259','173', + '5260','174', + '5261','175', + '5262','176', + '5263','177', + '5264','178', + '5265','179', + '5301','181', + '5302','182', + '5303','183', + '5304','185', + '5305','186', + '5306','187', + '5309','100', + '5310','100', + '5350','191', + '5351','192', + '5352','193', + '5353','194', + '5354','100', + '5401','201', + '5402','202', + '5451','204', + '5452','205', + '5453','206', + '5501','211', + '5502','212', + '5553','215', + '5701','231', + '5702','232', + '5703','233', + '5751','234', + '5752','235', + '5753','236', + '5754','237', + '5755','238', + '5801','241', + '5802','242', + '5803','243', + '5804','244', + '5805','245', + '5806','246', + '5807','247', + '5951','250', + '5952','251', + '5953','252', + '5954','253', + '5955','254', + '5956','255', + '5957','256', + '5958','257', + '5959','259', + '5960','260', + '5850','261', + '5853','262', + '5854','263', + '5900','265', + '5901','266', + '5902','267', + '6051','270', + '6052','271', + '6053','272', + '6054','273', + '6055','274', + '6056','275', + '6000','276', + '6101','280', + '6102','281', + '6103','282', + '6104','283', + '6105','284', + '6106','285', + '6100','286', + '6151','290', + '6152','291', + '6153','292', + '6154','293', + '6155','294', + '6156','295', + '6150','296', + '7001','801', + '7002','802', + '7003','803', + '7004','804', + '7005','805', + '7006','806', + '7007','807', + '7008','808', + '7009','809', + '7010','810', + '7011','811', + '7012','812', + '7013','813', + '5400','2010', + '5404','2011', + '5405','2012', + '5406','2013', + '5407','2015', + '5408','2016', + '5409','2021', + '5410','2022', + '5556','2132', + '5557','2142', + '5550','2150', + '5554','2151', + '5555','2152', + '5600','2210', + '5604','2232', + '5605','2233', + '5607','2242', + '5608','2243', + '5610','2252', + '5611','2253', + '5613','2262', + '5614','2263', + '5650','2270', + '5652','2272', + '5653','2273', + '5654','2274', + '5655','2275', + '5656','2276', + '5658','2282', + '5659','2283', + '5660','2284', + '5661','2285', + '5662','2286', + '5403','203', + '5551','213', + '5552','214', + '5601','221', + '5602','222', + '5603','223', + '5606','224', + '5609','225', + '5612','226', + '5651','227', + '5657','228', + '7000','258', + '5403','2031', + '5551','2131', + '5552','2141', + '5601','2211', + '5602','2221', + '5603','2231', + '5606','2241', + '5609','2251', + '5612','2261', + '5651','2271', + '5657','2281', + '7000','800', + '5451','100', + '5452','100', + '5454','100', + '5455','100', + '5456','100', + '5457','100', + '5458','100', + '5459','100', + '5460','100', + '5461','100', + '5463','100', + '5464','100', + '5465','100', + '5466','100', + '5467','100', + '5503','100', + '5756','100', + '5851','100', + '5852','100', + '5855','100', + '5856','100', + '5857','100', + '5858','100', + '5859','100', + '5860','100', + '5861','100', + '5862','100', + '5863','100', + '5864','100', + '5865','100', + '5866','100', + '5867','100', + '5868','100', + '5869','100', + '5870','100', + '5871','100', + '5872','100', + '5873','100', + '5874','100', + '5875','100', + '5961','100', + '7014','100', + '7015','100', + '7016','100', + '7017','100', + '7018','100', + '7019','100', + '7020','100', + '7021','100', + '7022','100', + '7023','100', + '8000','100', + '8010','100', + '8011','100', + '8012','100', + '8013','100', + '8014','100', + '8015','100', + '8016','100', + '8017','100', + '8018','100', + '8019','100', + '8030','100', + '8031','100', + '8032','100', + '8033','100', + '8034','100', + '8035','100', + '8050','100', + '8051','100', + '8052','100', + '8053','100', + '8054','100', + '8055','100', + '8056','100', + '8057','100', + '8070','100', + '8071','100', + '8072','100', + '8073','100', + '8090','100', + '8091','100', + '8092','100', + '8093','100', + '8094','100', + '8100','100', + '8101','100', + '8102','100', + '8103','100', + '8110','100', + '8111','100', + '8112','100', + '8113','100', + '8114','100', + '8115','100', + '8116','100', + '8117','100', + '8118','100', + '8119','100', + '8120','100', + '8130','100', + '8131','100', + '8132','100', + '8133','100', + '8134','100', + '8140','100', + '8141','100', + '8142','100', + '8143','100', + '8144','100', + '8145','100', + '8146','100', + '8300','100', + '8301','100', + '8302','100', + '8303','100', + '8304','100', + '8305','100', + '8306','100', + '8307','100', + '8308','100', + '8309','100', + '8310','100', + '8311','100', + '8312','100', + '8313','100', + '8314','100', + '8315','100', + '8316','100', + '8317','100', + '8318','100', + '8319','100', + '8320','100', + '8321','100', + '8322','100', + '8323','100', + '8324','100', + '8325','100', + '8326','100', + '8327','100', + '8400','100', + '8401','100', + '8402','100', + '8403','100', + '8404','100', + '8405','100', + '8406','100', + '8407','100', + '8408','100', + '8409','100', + '8410','100', + '8411','100', + '8412','100', + '8413','100', + '8414','100', + '8415','100', + '8416','100', + '8417','100', + '8418','100', + '8419','100', + '8420','100', + '8421','100', + '8422','100' + ) + ContentDamageabilityCode: + - transformation: FlexiLocContentDamageabilityCode + ContentVulnerabilityCode: + - transformation: | + replace( + ContentsFloodVuln, + '0','0', + '1','1', + '2','1', + '3','1', + '4','2', + '5','3', + '6','4', + '7','4' + ) + ContentsValue: + - transformation: ContentsTIV + ContractID: + - transformation: AccNumber + CountryCode: + - transformation: CountryCode + CRESTAName: + - transformation: GeogScheme1 + CurrencyCode: + - transformation: LocCurrency + CustomElevation: + - transformation: GroundElevation + CustomElevationUnitCode: + - transformation: | + replace( + GroundElevationUnit, + '11','SQFT', + '12','SQM', + '13','AC', + '14','HA', + '1','FT', + '2','M', + '3','KM', + '4','MI', + 'None','' + ) + when: GroundElevationUnit is not in [Null, 'NULL'] + - transformation: "''" + CustomFloodStandardOfProtection: + - transformation: CustomFloodSOP + CustomFloodSOPType: + - transformation: FlexiLocCustomFloodSOPType + CustomFloodZoneCode: + - transformation: CustomFloodZone + DamageFunctionID: + - transformation: VulnerabilitySetID + Deductible1: + #- transformation: LocDed1Building + #when: LocDed1Building gt 0 and LocDed5PD lte 0 and LocDed6All lte 0 + - transformation: LocDed1Building + when: LocDed1Building gt 0 + #- transformation: LocDed5PD + #when: LocDed5PD gt 0 and LocDed1Building lte 0 and LocDed6All lte 0 + - transformation: LocDed5PD + when: LocDed5PD gt 0 + #- transformation: LocDed6All + #when: LocDed6All gt 0 and LocDed1Building lte 0 and LocDed5PD lte 0 + - transformation: LocDed6All + when: LocDed6All gt 0 + Deductible2: + - transformation: LocDed2Other + Deductible3: + - transformation: LocDed3Contents + Deductible4: + - transformation: LocDed4BI + DeductibleTypeCode: + - transformation: "'C'" + when: LocDed1Building gt 0 and LocDed2Other lte 0 and LocDed3Contents lte 0 and LocDed4BI lte 0 and LocDed5PD lte 0 and LocDed6All lte 0 + - transformation: "'C'" + when: LocDed2Other gt 0 and LocDed1Building lte 0 and LocDed3Contents lte 0 and LocDed4BI lte 0 and LocDed5PD lte 0 and LocDed6All lte 0 + - transformation: "'C'" + when: LocDecdContents gt 0 and LocDed1Building lte 0 and LocDed2Other lte 0 and LocDed4BI lte 0 and LocDed5PD lte 0 and LocDed6All lte 0 + - transformation: "'C'" + when: LocDed4BI gt 0 and LocDed1Building lte 0 and LocDed2Other lte 0 and LocDed3Contents lte 0 and LocDed5PD lte 0 and LocDed6All lte 0 + - transformation: "'CB'" + when: LocDed5PD gt 0 and LocDed1Building lte 0 and LocDed2Other lte 0 and LocDed3Contents lte 0 and LocDed4BI lte 0 and LocDed6All lte 0 + - transformation: "'S'" + when: LocDed6All gt 0 and LocDed1Building lte 0 and LocDed2Other lte 0 and LocDed3Contents lte 0 and LocDed4BI lte 0 and LocDed5PD lte 0 + DefensibleSpace: + - transformation: FlexiLocDefensibleSpace + EnhancedGeoMatchLevelCode: + - transformation: FlexiLocEnhancedGeoMatchLevelCode + EquipmentCode: + - transformation: EquipmentBracing + ExpirationDate: + - transformation: LocExpiryDate + ExternalDoorCode: + - transformation: ExternalDoors + FirewiseCommunityParticipation: + - transformation: FlexiLocFirewiseCommunityParticipation + FIRMComplianceCode: + - transformation: FEMACompliance + FirstFloorHeight: + - transformation: FirstFloorHeight + FirstFloorHeightUnitCode: + - transformation: | + replace( + FirstFloorHeightUnit, + '11','SQFT', + '12','SQM', + '13','AC', + '14','HA', + '1','FT', + '2','M', + '3','KM', + '4','MI', + 'None','' + ) + when: FirstFloorHeightUnit is not in [Null, 'NULL'] + - transformation: "''" + FloorArea: + - transformation: FloorArea + FloorAreaUnitCode: + - transformation: | + replace( + FloorAreaUnit, + '11','SQFT', + '12','SQM', + '13','AC', + '14','HA', + '1','FT', + '2','M', + '3','KM', + '4','MI', + 'None','' + ) + when: FloorAreaUnit is not in [Null, 'NULL'] + - transformation: "''" + FloorOfInterest: + - transformation: FlexiLocFloorOfInterest + FloorsOccupied: + - transformation: FloorsOccupied + FoundationType: + - transformation: | + replace( + FoundationType, + '10','10', + '11','11', + '12','12', + '13','0', + '14','0', + '15','0', + '16','0', + '17','0', + '18','0', + '19','0', + '0','0', + '1','1', + '2','2', + '3','2', + '4','2', + '5','2', + '6','6', + '7','7', + '8','8', + '9','9' + ) + FoundationConnectionCode: + - transformation: FoundationConnection + #GeoMatchLevelCode: + #- transformation: + GeocoderCode: + - transformation: Geocoder + GeocoderAccountId: + - transformation: FlexiLocGeocoderAccountId + GlassPercentCode: + - transformation: FlexiLocGlassPercentCode + GlassTypeCode: + - transformation: GlassType + GrossArea: + - transformation: FlexiLocGrossArea + GrossAreaUnitCode: + - transformation: | + replace( + FlexiLocGrossAreaUnit, + '11','SQFT', + '12','SQM', + '13','AC', + '14','HA', + '1','FT', + '2','M', + '3','KM', + '4','MI', + 'None','' + ) + when: FlexiLocGrossAreaUnit is not in [Null, 'NULL'] + - transformation: "''" + IBHSFortifiedCode: + - transformation: | + replace( + ConstructionQuality, + '10','1', + '0','0', + '1','1', + '2','2', + '3','2', + '4','2', + '5','2', + '6','6', + '7','7', + '8','5', + '9','3' + ) + InceptionDate: + - transformation: LocInceptionDate + InternalPartitionCode: + - transformation: InternalPartition + IsFireSprinklerAvailable: + - transformation: FlexiLocIsFireSprinklerAvailable + IsPrimaryLocation: + - transformation: IsPrimary + ISOBIN: + - transformation: FlexiLocISOBIN + ISOConstructionCode: + - transformation: FlexiLocISOConstructionCode + ISOOccupancyCode: + - transformation: FlexiLocISOOccupancyCode + IsTenant: + - transformation: IsTenant + LargeMissileCode: + - transformation: FlexiLocLargeMissileCode + Latitude: + - transformation: Latitude + LatticeCode: + - transformation: LatticeType + Limit1: + #- transformation: LocLimit1Building + #when: LocLimit1Building gt 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + #- transformation: LocLimit1Building + #when: LocLimit1Building gt 0 and LocLimit5PD is in [''] and LocLimit6All is in [''] + - transformation: LocLimit1Building + when: LocLimit1Building gt 0 + #- transformation: LocLimit5PD + #when: LocLimit5PD gt 0 and LocLimit1Building lte 0 and LocLimit6All lte 0 + - transformation: LocLimit5PD + when: LocLimit5PD gt 0 + #- transformation: LocLimit6All + #when: LocLimit6All gt 0 and LocLimit1Building lte 0 and LocLimit5PD lte 0 + - transformation: LocLimit6All + when: LocLimit6All gt 0 + Limit2: + - transformation: LocLimit2Other + Limit3: + - transformation: LocLimit3Contents + Limit4: + - transformation: LocLimit4BI + LimitTypeCode: + - transformation: "'C'" + when: LocLimit1Building gt 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: "'C'" + when: LocLimit2Other gt 0 and LocLimit1Building lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: "'C'" + when: LocLimit3Contents gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: "'C'" + when: LocLimit4BI gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: "'EE'" + when: LocLimit5PD gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit6All lte 0 + - transformation: "'S'" + when: LocLimit6All gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 + LocationGroup: + - transformation: LocGroup + LocationID: + - transformation: LocNumber + LocationName: + - transformation: LocName + LocPerils: + - transformation: | + replace( + LocPeril, + 'WSS','CF', + 'XCH','CH', + 'QEQ','EQ', + 'QFF','FF', + 'XHL','HL', + 'ORF','IF', + 'QLF','LQ', + 'QLS','LS', + 'BFR','NC', + 'CPD','PD', + 'OSF','PF', + 'PNF','PN', + 'CSB','SB', + 'QSL','SL', + 'XLT','ST', + 'XSL','SW', + 'WTC','TC', + 'XTD','TD', + 'MTR','TR', + 'QTS','TS', + 'BBF','WF', + 'ZST','WS', + ';',',' + ) + PerilSetCode: + - transformation: | + replace( + LocPeril, + 'AA1','PAL', + 'QQ1','PEA', + 'BBF;QFF','PEF', + 'QEQ','PES', + 'QFF','PFF', + 'ORF','PFL', + 'QLF','PLQ', + 'QLS','PLS', + 'BFR','PNC', + 'OSF','PPH', + 'WSS','PSH', + 'QSL','PSL', + 'MTR','PTR', + 'QTS','PTS', + 'WW1','PWA', + 'BBF','PWB', + 'WW2;QFF;BBF','PWF', + 'WTC','PWH', + 'XSL;XTD;XHL','PWT', + 'ZZ1','PWW', + 'XZ1','PWX', + ';','+' + ) + Longitude: + - transformation: Longitude + MaximumDeductible: + #- transformation: LocMaxDed1Building + #when: LocLimit1Building gt 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: LocMaxDed1Building + when: LocLimit1Building gt 0 + #- transformation: LocMaxDed2Other + #when: LocLimit2Other gt 0 and LocLimit1Building lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: LocMaxDed2Other + when: LocLimit2Other gt 0 + #- transformation: LocMaxDed3Contents + #when: LocLimit3Contents gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: LocMaxDed3Contents + when: LocLimit3Contents gt 0 + #- transformation: LocMaxDed4BI + #when: LocLimit4BI gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: LocMaxDed4BI + when: LocLimit4BI gt 0 + #- transformation: LocMaxDed5PD + #when: LocLimit5PD gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit6All lte 0 + - transformation: LocMaxDed5PD + when: LocLimit5PD gt 0 + #- transformation: LocMaxDed6All + #when: LocLimit6All gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 + - transformation: LocMaxDed6All + when: LocLimit6All gt 0 + MinimumDeductible: + #- transformation: LocMinDed1Building + #when: LocLimit1Building gt 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: LocMinDed1Building + when: LocLimit1Building gt 0 + #- transformation: LocMinDed2Other + #when: LocLimit2Other gt 0 and LocLimit1Building lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: LocMinDed2Other + when: LocLimit2Other gt 0 + #- transformation: LocMinDed3Contents + #when: LocLimit3Contents gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: LocMinDed3Contents + when: LocLimit3Contents gt 0 + #- transformation: LocMinDed4BI + #when: LocLimit4BI gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit5PD lte 0 and LocLimit6All lte 0 + - transformation: LocMinDed4BI + when: LocLimit4BI gt 0 + #- transformation: LocMinDed5PD + #when: LocLimit5PD gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit6All lte 0 + - transformation: LocMinDed5PD + when: LocLimit5PD gt 0 + #- transformation: LocMinDed6All + #when: LocLimit6All gt 0 and LocLimit1Building lte 0 and LocLimit2Other lte 0 and LocLimit3Contents lte 0 and LocLimit4BI lte 0 and LocLimit5PD lte 0 + - transformation: LocMinDed6All + when: LocLimit6All gt 0 + MinMaxDeductibleTypeCode: + - transformation: "'MA'" + when: LocMaxDed1Building gt 0 and LocMinDed1Building is 0 + - transformation: "'MI'" + when: LocMaxDed1Building is 0 and LocMinDed1Building gt 0 + - transformation: "'MM'" + when: LocMaxDed1Building gt 0 and LocMinDed1Building gt 0 + - transformation: "'N'" + when: LocMaxDed1Building is 0 and LocMinDed1Building is 0 + - transformation: "'TEST'" + MultiStoryHallCode: + - transformation: MultiStoryHall + NonCATGroundUpLoss: + - transformation: NonCATGroundUpLoss + OrnamentationCode: + - transformation: Ornamentation + Participation1: + - transformation: LocParticipation + Participation2: + - transformation: FlexiLocParticipation2 + PostalCode: + - transformation: PostalCode + PoundingCode: + - transformation: Pounding + PPCCode: + - transformation: FlexiLocPPCCode + Premium: + - transformation: LocNetPremium + ProjectCompletion: + - transformation: PercentComplete + ProjectPhaseCode: + - transformation: FlexiLocProjectPhaseCode + RedundancyCode: + - transformation: Redundancy + ReplacementValueA: + - transformation: BuildingTIV + ReplacementValueB: + - transformation: OtherTIV + ReplacementValueC: + - transformation: ContentsTIV + ReplacementValueD: + - transformation: BITIV + ReplacementValueDaysCovered: + - transformation: BIPOI + RetrofitCode: + - transformation: Retrofit + RiskCount: + - transformation: NumberOfBuildings + RoofAnchorageCode: + - transformation: | + replace( + RoofAnchorage, + '0','0', + '1','1', + '2','2', + '3','3', + '4','4', + '5','5', + '6','6', + '7','7', + '8','0', + '9','0' + ) + RoofAttachedStructureCode: + - transformation: | + replace( + RoofAttachedStructures, + '10','10', + '11','11', + '12','12', + '13','13', + '14','0', + '15','0', + '0','0', + '1','1', + '2','2', + '3','3', + '4','4', + '5','5', + '6','6', + '7','7', + '8','8', + '9','9' + ) + RoofCoverAttachCode: + - transformation: RoofCoverAttachment + RoofCoverCode: + - transformation: | + replace( + RoofCover, + '10','10', + '11','11', + '12','0', + '13','0', + '14','0', + '15','0', + '16','0', + '17','0', + '18','0', + '19','0', + '20','0', + '21','0', + '22','0', + '23','0', + '24','0', + '25','0', + '26','0', + '27','0', + '28','0', + '0','0', + '1','1', + '2','2', + '3','3', + '4','4', + '5','5', + '6','6', + '7','7', + '8','8', + '9','9' + ) + RoofDeckAttachcode: + - transformation: RoofDeckAttachment + RoofDeckCode: + - transformation: RoofDeck + RoofGeometryCode: + - transformation: | + replace( + RoofGeometry, + '10','10', + '11','0', + '12','0', + '0','0', + '1','1', + '2','2', + '3','3', + '4','4', + '5','5', + '6','6', + '7','7', + '8','8', + '9','9' + ) + RoofHailImpactResistanceCode: + - transformation: FlexiLocRoofHailImpactResistanceCode + RoofPitchCode: + - transformation: RoofPitch + RoofYearBuilt: + - transformation: RoofYearBuilt + SalvagePotentialCode: + - transformation: | + replace( + SalvageProtection, + '0','0', + '1','2', + '2','3', + '3','4' + ) + ServiceEquipmentProtectionCode: + - transformation: ServiceEquipmentProtection + ShapeIrregularityCode: + - transformation: ShapeIrregularity + ShortColumnCode: + - transformation: ShortColumn + SmallDebrisCode: + - transformation: SmallDebris + SoftStoryCode: + - transformation: SoftStory + SpecialConstructionCode: + - transformation: SpecialEQConstruction + SprinklerTypeCode: + - transformation: | + replace( + SprinklerType, + '0','0', + '1','0', + '2','0', + '3','2', + '4','0', + '5','1' + ) + Stories: + - transformation: NumberOfStoreys + TallOneStoryCode: + - transformation: TallOneStory + TankCode: + - transformation: Tank + Territory: + - transformation: FlexiLocTerritory + TerrainRoughnessCode: + - transformation: TerrainRoughness + TorsionCode: + - transformation: Torsion + TransitionInSRCCode: + - transformation: FlexiLocTransitionInSRCCode + TreeExposureCode: + - transformation: TreeExposure + UserDefined1: + - transformation: LocUserDef1 + UserDefined2: + - transformation: LocUserDef2 + UserDefined3: + - transformation: LocUserDef3 + UserDefined4: + - transformation: LocUserDef4 + UserDefined5: + - transformation: LocUserDef5 + UserGeoMatchLevel: + - transformation: FlexiLocUserGeocodeMatchLevel + SealOfApproval: + - transformation: FlexiLocSealOfApprovalCode + SpecieStorageCode: + - transformation: | + replace( + ValuablesStorage, + '0','0', + '1','1', + '2','0', + '3','0', + '4','0', + '5','0', + '6','0', + '7','0' + ) + SubareaName: + - transformation: FlexiLocSubareaName + Subarea2Name: + - transformation: FlexiLocSubarea2Name + WindowProtectionCode: + - transformation: WindowProtection + WallCode: + - transformation: FlexiLocWallCode + WallSidingCode: + - transformation: FlexiLocWallSidingCode + WaterHeaterCode: + - transformation: FlexiLocWaterHeaterCode + WeldingCode: + - transformation: FlexiLocWeldingCode + WetFloodProofingCode: + - transformation: 1 + when: FloodDefenseHeight lte 0 + - transformation: 2 + when: FloodDefenseHeight lte 1 + - transformation: 3 + when: FloodDefenseHeight lte 3 + - transformation: 4 + when: FloodDefenseHeight gt 3 + YearBuilt: + - transformation: YearBuilt diff --git a/ods_tools/odtf/data/mappings/validation_Cede_Location_loc.yaml b/ods_tools/odtf/data/mappings/validation_Cede_Location_loc.yaml new file mode 100644 index 00000000..d1c79d24 --- /dev/null +++ b/ods_tools/odtf/data/mappings/validation_Cede_Location_loc.yaml @@ -0,0 +1,14 @@ +entries: + Total: + fields: + - BuildingValue + - ContentsValue + operator: sum + TotalByPeril: + fields: + - BuildingValue + operator: sum + group_by: + - LocPerils + NumRows: + operator: count diff --git a/ods_tools/odtf/data/mappings/validation_OED_Location_loc.yaml b/ods_tools/odtf/data/mappings/validation_OED_Location_loc.yaml new file mode 100644 index 00000000..95be199f --- /dev/null +++ b/ods_tools/odtf/data/mappings/validation_OED_Location_loc.yaml @@ -0,0 +1,14 @@ +entries: + Total: + fields: + - BuildingTIV + - ContentsTIV + operator: sum + TotalByPeril: + fields: + - BuildingTIV + operator: sum + group_by: + - LocPeril + NumRows: + operator: count diff --git a/ods_tools/odtf/data/validators/validation_Cede_Location_loc.yaml b/ods_tools/odtf/data/validators/validation_Cede_Location_loc.yaml new file mode 100644 index 00000000..d1c79d24 --- /dev/null +++ b/ods_tools/odtf/data/validators/validation_Cede_Location_loc.yaml @@ -0,0 +1,14 @@ +entries: + Total: + fields: + - BuildingValue + - ContentsValue + operator: sum + TotalByPeril: + fields: + - BuildingValue + operator: sum + group_by: + - LocPerils + NumRows: + operator: count diff --git a/ods_tools/odtf/data/validators/validation_OED_Location_loc.yaml b/ods_tools/odtf/data/validators/validation_OED_Location_loc.yaml new file mode 100644 index 00000000..95be199f --- /dev/null +++ b/ods_tools/odtf/data/validators/validation_OED_Location_loc.yaml @@ -0,0 +1,14 @@ +entries: + Total: + fields: + - BuildingTIV + - ContentsTIV + operator: sum + TotalByPeril: + fields: + - BuildingTIV + operator: sum + group_by: + - LocPeril + NumRows: + operator: count diff --git a/ods_tools/odtf/errors.py b/ods_tools/odtf/errors.py new file mode 100644 index 00000000..6ecdb224 --- /dev/null +++ b/ods_tools/odtf/errors.py @@ -0,0 +1,10 @@ +class ConverterError(Exception): + pass + + +class ConfigurationError(ConverterError): + """ + Raised if there are any configuration errors. + """ + + pass diff --git a/ods_tools/odtf/examples/cede_contract_1000.csv b/ods_tools/odtf/examples/cede_contract_1000.csv new file mode 100644 index 00000000..9aa6453a --- /dev/null +++ b/ods_tools/odtf/examples/cede_contract_1000.csv @@ -0,0 +1,553 @@ +ContractID,InsuredName,Producer,Underwriter,Branch,ExpiringContract,Status,InceptionDate,ExpirationDate,Perils,LOB,Form,Currency,UDF1,UDF2,UDF3,UDF4,UDF5,LayerID,LayerPerils,LimitType,Limit1,LimitA,LimitB,LimitC,LimitD,Limit2,DedAmt1,DedAmt2,DedAmt3,DedAmt4,AttachmentAmt,AttachmentPtA,AttachmentPtB,AttachmentPtC,AttachmentPtD,DedType,Premium,AggregateLimitType,AggregateLimit,AggregateAttachmentPt,AggregateDedType,AggregateDedAmt,SublimitPerils,SublimitArea,SubLimitLimitType,SublimitDedType,SubLimitOcc,SublimitPart,SublimitAttachAmt,SublimitLimitA,SublimitLimitB,SublimitLimitC,SublimitLimitD,SublimitAttachA,SublimitAttachB,SublimitAttachC,SublimitAttachD,SublimitDedAmt1,SublimitDedAmt2,SublimitDedAmt3,SublimitDedAmt4,SublimitName,ParentSublimitName,SublimitAggregateLimitType,SublimitAggregateLimit,SublimitAggregateAttachmentPt,SublimitAggregateDedType,SublimitAggregateDedAmt +1253900,,,,,,A,2021-11-29,2022-11-28,4334220,GC1,Unknown,USD,,,,,,2349611,4334220,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,CA LOCATION,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,25000,0,0,0,,,N,0,0,N,0 +1253900,,,,,,A,2021-11-29,2022-11-28,4334220,GC1,Unknown,USD,,,,,,2349611,4334220,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,ALL OTHER LOCATIONS,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,4334220,GC1,Unknown,USD,,,,,,2349615,4334220,E,,,,,,,500000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,4334220,ZONE2,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,4334220,GC1,Unknown,USD,,,,,,2349615,4334220,E,,,,,,,500000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,4334220,ZONE1,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,4334220,GC1,Unknown,USD,,,,,,2349615,4334220,E,,,,,,,500000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,4334220,PR,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,4334220,GC1,Unknown,USD,,,,,,2349615,4334220,E,,,,,,,500000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,4334220,PNW,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,4334220,GC1,Unknown,USD,,,,,,2349615,4334220,E,,,,,,,500000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,4334220,PH,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,4334220,GC1,Unknown,USD,,,,,,2349615,4334220,E,,,,,,,500000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,4334220,NM,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,4334220,GC1,Unknown,USD,,,,,,2349615,4334220,E,,,,,,,500000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,4334220,CA,B,B,20000000,0,0,20000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1253931,,,,,,A,2021-12-01,2022-11-30,4334220,GC1,Unknown,USD,,,,,,2349714,4334220,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,EQUD1,B,B,210000000,0,0,210000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253931,,,,,,A,2021-12-01,2022-11-30,4334220,GC1,Unknown,USD,,,,,,2349714,4334220,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,EQNW,B,B,70000000,0,0,70000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253931,,,,,,A,2021-12-01,2022-11-30,4334220,GC1,Unknown,USD,,,,,,2349714,4334220,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,EQNM,B,B,70000000,0,0,70000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253931,,,,,,A,2021-12-01,2022-11-30,4334220,GC1,Unknown,USD,,,,,,2349714,4334220,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,CALIFORNIA,B,B,70000000,0,0,70000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253931,,,,,,A,2021-12-01,2022-11-30,4334220,GC1,Unknown,USD,,,,,,2349714,4334220,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,AOP,B,B,210000000,0,0,210000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253976,,,,,,A,2021-12-31,2022-12-30,4334220,GC1,Unknown,USD,,,,,,2349873,4334220,E,,,,,,,0,0,0,0,75000000,75000000,,,,N,,N,0,0,N,0,4334220,REST ALL OTHER LOCATIONS,B,MI,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1253976,,,,,,A,2021-12-31,2022-12-30,4334220,GC1,Unknown,USD,,,,,,2349873,4334220,E,,,,,,,0,0,0,0,75000000,75000000,,,,N,,N,0,0,N,0,4334220,PNW ZONE,B,MI,30000000,0,0,30000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1253976,,,,,,A,2021-12-31,2022-12-30,4334220,GC1,Unknown,USD,,,,,,2349873,4334220,E,,,,,,,0,0,0,0,75000000,75000000,,,,N,,N,0,0,N,0,4334220,NM ZONES,B,MI,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1253976,,,,,,A,2021-12-31,2022-12-30,4334220,GC1,Unknown,USD,,,,,,2349873,4334220,E,,,,,,,0,0,0,0,75000000,75000000,,,,N,,N,0,0,N,0,4334220,CALIFORNIA LOCATION,B,MI,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1253987,,,,,,A,2021-12-14,2022-12-13,4334220,GC1,Unknown,USD,,,,,,2349906,4334220,E,,,,,,,0,0,0,0,80000000,80000000,,,,N,,N,0,0,N,0,4334220,NM,B,MI,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1253987,,,,,,A,2021-12-14,2022-12-13,4334220,GC1,Unknown,USD,,,,,,2349906,4334220,E,,,,,,,0,0,0,0,80000000,80000000,,,,N,,N,0,0,N,0,4334220,CA,B,MI,80000000,0,0,80000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1253987,,,,,,A,2021-12-14,2022-12-13,4334220,GC1,Unknown,USD,,,,,,2349906,4334220,E,,,,,,,0,0,0,0,80000000,80000000,,,,N,,N,0,0,N,0,4334220,AOP,B,MI,200000000,0,0,200000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254036,,,,,,A,2022-03-15,2023-03-14,4334220,GC1,Unknown,USD,,,,,,2350098,4334220,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,4334220,CALIFORNIA,B,MI,150000000,0,0,150000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +1254036,,,,,,A,2022-03-15,2023-03-14,4334220,GC1,Unknown,USD,,,,,,2350098,4334220,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,4334220,AOP,B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,2000000,0,0,0,,,N,0,0,N,0 +1254043,,,,,,A,2022-03-01,2023-02-28,4334220,GC1,Unknown,USD,,,,,,2350121,4334220,E,,,,,,,25000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,PNW,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254043,,,,,,A,2022-03-01,2023-02-28,4334220,GC1,Unknown,USD,,,,,,2350121,4334220,E,,,,,,,25000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,CA,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254043,,,,,,A,2022-03-01,2023-02-28,4334220,GC1,Unknown,USD,,,,,,2350125,4334220,E,,,,,,,25000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,4334220,PNW,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254043,,,,,,A,2022-03-01,2023-02-28,4334220,GC1,Unknown,USD,,,,,,2350125,4334220,E,,,,,,,25000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,4334220,CA,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254043,,,,,,A,2022-03-01,2023-02-28,4334220,GC1,Unknown,USD,,,,,,2350125,4334220,E,,,,,,,25000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,4334220,AOP,B,B,750000000,0,0,750000000,1,0,0,0,0,0,0,25000,0,0,0,,,N,0,0,N,0 +1254074,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350228,4334220,E,,,,,,,500000,1000000,0,0,75000000,75000000,,,,MM,,N,0,0,N,0,4334220,CALIFORNIA STATE,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254094,,,,,,A,2022-03-25,2023-03-25,4334220,GC1,Unknown,USD,,,,,,2350281,4334220,E,,,,,,,250000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,WA,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254094,,,,,,A,2022-03-25,2023-03-25,4334220,GC1,Unknown,USD,,,,,,2350281,4334220,E,,,,,,,250000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,CA,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254155,,,,,,A,2022-05-01,2023-04-30,4334220,GC1,Unknown,USD,,,,,,2350445,4334220,E,,,,,,,2500000,15000000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,4334220,SPE 1 LOCATION,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254155,,,,,,A,2022-05-01,2023-04-30,4334220,GC1,Unknown,USD,,,,,,2350445,4334220,E,,,,,,,2500000,15000000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,4334220,REAL ESTATE SPE 2 LOCATIONS,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254155,,,,,,A,2022-05-01,2023-04-30,4334220,GC1,Unknown,USD,,,,,,2350445,4334220,E,,,,,,,2500000,15000000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,4334220,NEW HOPE POWER SPE 4 LOCATION,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +1254155,,,,,,A,2022-05-01,2023-04-30,4334220,GC1,Unknown,USD,,,,,,2350445,4334220,E,,,,,,,2500000,15000000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,4334220,DOMINICAN REPUBLIC SUB-LIMITS,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +1254155,,,,,,A,2022-05-01,2023-04-30,4334220,GC1,Unknown,USD,,,,,,2350445,4334220,E,,,,,,,2500000,15000000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,4334220,CALIFORNIA SUB-LIMITS,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +1254177,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350512,4334220,E,,,,,,,0,15000000,0,0,10000000,10000000,,,,MA,,N,0,0,N,0,4334220,HIGH HAZARD EQ ZONES,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254177,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350512,4334220,E,,,,,,,0,15000000,0,0,10000000,10000000,,,,MA,,N,0,0,N,0,4334220,EQ SPE 1 LOCATIONS,B,B,20000000,0,0,20000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254177,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350512,4334220,E,,,,,,,0,15000000,0,0,10000000,10000000,,,,MA,,N,0,0,N,0,4334220,EQ ALL OTHER LOCATIONS,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254545,,,,,,A,2021-07-01,2022-10-01,4334220,GC1,Unknown,USD,,,,,,2351806,4334220,E,,,,,,,100000,0,0,0,550000000,550000000,,,,MI,,N,0,0,N,0,4334220,UTAH,B,B,900000000,0,0,900000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254545,,,,,,A,2021-07-01,2022-10-01,4334220,GC1,Unknown,USD,,,,,,2351809,4334220,E,,,,,,,100000,0,0,0,900000000,900000000,,,,MI,,N,0,0,N,0,4334220,UTAH,B,B,1000000000,0,0,1000000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,MOOLOOLAH - EUDLO TUNNEL,B,MI,24924600.000578996,0,0,24924600.000578996,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,MERIVALE BRIDGE,B,MI,214628500.0049858,0,0,214628500.0049858,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,MACROSSAN BRIDGE,B,MI,148855250.0034579,0,0,148855250.0034579,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,INNER CITY TUNNELS,B,MI,207705000.00482497,0,0,207705000.00482497,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,INDOOROOPILLY BRIDGES,B,MI,83082000.00193,0,0,83082000.00193,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,TOOWOOMBA BRIDGE/TUNNEL,B,MI,42925700.00099716,0,0,42925700.00099716,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,OTHER BRIDGES TUNNELS,B,MI,24232250.000562914,0,0,24232250.000562914,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,NORTH PINE RIVER,B,MI,122545950.00284673,0,0,122545950.00284673,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,ELLIOTT RIVER BRIDGE,B,MI,38079250.00088458,0,0,38079250.00088458,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,DUTTON PARK FLYOVER,B,MI,41541000.000965,0,0,41541000.000965,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,CURRA CREEK (SOUTH) BRIDGE,B,MI,35309850.00082025,0,0,35309850.00082025,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,CRYSTAL CREEK BRIDGE,B,MI,34617500.00080416,0,0,34617500.00080416,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,COOMERA RIVER,B,MI,162009900.0037635,0,0,162009900.0037635,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,CHINAMAN CK BRIDGE,B,MI,37386900.0008685,0,0,37386900.0008685,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,BURDEKIN RIVER BRIDGE,B,MI,108698950.00252508,0,0,108698950.00252508,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,4334220,GC1,Unknown,USD,,,,,,2352172,4334220,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,4334220,BALD HILLS BRIDGES,B,MI,193165650.00448722,0,0,193165650.00448722,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920814,,,,,,A,2022-03-15,2023-03-15,4334220,GC2,Unknown,USD,,,,,,2003202,4334220,E,,,,,,,2000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EXCL CA,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +920814,,,,,,A,2022-03-15,2023-03-15,4334220,GC2,Unknown,USD,,,,,,2003203,4334220,E,,,,,,,2000000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,4334220,EXCL CA,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920814,,,,,,A,2022-03-15,2023-03-15,4334220,GC2,Unknown,USD,,,,,,2003204,4334220,E,,,,,,,2000000,0,0,0,350000000,350000000,,,,MI,,N,0,0,N,0,4334220,EXCL CA,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920819,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003229,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA 250K D,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920822,,,,,,A,2022-03-15,2023-03-15,4334220,GC2,Unknown,USD,,,,,,2003238,4334220,E,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,1M DED AOL,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920827,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003252,4334220,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_40MLIM,B,B,40000000,0,0,40000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254273,,,,,,A,2022-05-01,2023-04-30,4334220,GC1,Unknown,USD,,,,,,2350795,4334220,E,,,,,,,100000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,NEW MADRID EQ ZONES,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254273,,,,,,A,2022-05-01,2023-04-30,4334220,GC1,Unknown,USD,,,,,,2350795,4334220,E,,,,,,,100000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,CALIFORNIA SUBLIMITS,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254276,,,,,,A,2022-05-01,2023-05-01,4334220,GC1,Unknown,USD,,,,,,2350803,4334220,E,,,,,,,0,0,0,0,125000000,125000000,,,,N,,N,0,0,N,0,4334220,OTH,B,MI,175000000,0,0,175000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254276,,,,,,A,2022-05-01,2023-05-01,4334220,GC1,Unknown,USD,,,,,,2350803,4334220,E,,,,,,,0,0,0,0,125000000,125000000,,,,N,,N,0,0,N,0,4334220,CA,B,MI,85000000,0,0,85000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350880,4334220,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,EQDE2 LOCATIONS,B,B,275000000,0,0,275000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350880,4334220,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,EQDE1 LOCATIONS,B,B,275000000,0,0,275000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350880,4334220,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,4334220,CALEQ1,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350884,4334220,E,,,,,,,100000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,4334220,EQDE2 LOCATIONS,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350884,4334220,E,,,,,,,100000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,4334220,EQDE1 LOCATIONS,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2350884,4334220,E,,,,,,,100000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,4334220,CALEQ1,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,AOZEQNM,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,AOZEQCA,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,AOZEQAK,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,AOZ,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,UMVEQPNW,B,MI,15000000,0,0,15000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,UMVEQNM,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,UMVEQHI LOC,B,MI,2500000,0,0,2500000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,UMVEQCA,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,UMVEQAK,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,4334220,GC1,Unknown,USD,,,,,,2350981,4334220,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,4334220,UMV,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254357,,,,,,A,2022-07-01,2023-06-30,4334220,GC1,Unknown,USD,,,,,,2351115,4334220,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,4334220,REST OF US,B,MI,700000000,0,0,700000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254357,,,,,,A,2022-07-01,2023-06-30,4334220,GC1,Unknown,USD,,,,,,2351115,4334220,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,4334220,OUTSIDE US,B,MI,700000000,0,0,700000000,1,0,0,0,0,0,0,15000,0,0,0,,,N,0,0,N,0 +1254357,,,,,,A,2022-07-01,2023-06-30,4334220,GC1,Unknown,USD,,,,,,2351115,4334220,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,4334220,NETHERLANDS,B,MI,700000000,0,0,700000000,1,0,0,0,0,0,0,2500,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,4334220,GC1,Unknown,USD,,,,,,2353434,4334220,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,4334220,MEXICO,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,4334220,GC1,Unknown,USD,,,,,,2353434,4334220,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,4334220,CHINA,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,4334220,GC1,Unknown,USD,,,,,,2353434,4334220,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,4334220,CALIFORNIA,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,4334220,GC1,Unknown,USD,,,,,,2353436,4334220,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,4334220,MEXICO,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,4334220,GC1,Unknown,USD,,,,,,2353436,4334220,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,4334220,CHINA,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,4334220,GC1,Unknown,USD,,,,,,2353436,4334220,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,4334220,CALIFORNIA,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254433,,,,,,A,2022-07-01,2023-06-30,4334220,GC1,Unknown,USD,,,,,,2351341,4334220,E,,,,,,,0,0,0,0,250000000,250000000,,,,N,,N,0,0,N,0,4334220,EQ SUB-LIMIT,B,MI,300000000,0,0,300000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1255092,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2353515,4334220,E,,,,,,,0,0,0,0,150000000,150000000,,,,N,,N,0,0,N,0,4334220,OVERALL EQ,B,MI,200000000,0,0,200000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1255092,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2353515,4334220,E,,,,,,,0,0,0,0,150000000,150000000,,,,N,,N,0,0,N,0,4334220,HAWAII,B,MI,50000000,0,0,50000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1255092,,,,,,A,2022-04-01,2023-03-31,4334220,GC1,Unknown,USD,,,,,,2353515,4334220,E,,,,,,,0,0,0,0,150000000,150000000,,,,N,,N,0,0,N,0,4334220,CALIFORNIA,B,MI,75000000,0,0,75000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,4334220,GC1,Unknown,USD,,,,,,2353517,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQUD3,B,MI,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,4334220,GC1,Unknown,USD,,,,,,2353517,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQUD2,B,MI,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,4334220,GC1,Unknown,USD,,,,,,2353517,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQUD1,B,MI,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,4334220,GC1,Unknown,USD,,,,,,2353517,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQNW,B,MI,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,4334220,GC1,Unknown,USD,,,,,,2353517,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQNM,B,MI,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,4334220,GC1,Unknown,USD,,,,,,2353517,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,CALIFORNIA,B,MI,100000000,0,0,100000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,4334220,GC1,Unknown,USD,,,,,,2353517,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,AOL,B,MI,150000000,0,0,150000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920853,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2003357,4334220,E,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_NM_LIM_25M_DED_100K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920853,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2003357,4334220,E,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_CA_PNW_DED_100K,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920882,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003470,4334220,E,,,,,,,1000000,15000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,EQCAUD1_2.5M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +920901,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003541,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,NEW MADRID 50M LIM 1M DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920901,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003541,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD4 10M LIM 100K DED,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920901,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003541,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD3 25M LIM 100K DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920901,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003541,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD2 50M LIM 100K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920901,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003541,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1 7.5M LIM 1M DED,B,B,7500000,0,0,7500000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920901,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003541,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA PNW 25M LIM 1M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920901,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003541,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ JAPAN 7.5M LIM 100K DED,B,B,7500000,0,0,7500000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920901,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003541,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ AOZ 100M LIM 1M DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920913,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003594,4334220,B,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,UD2 LIM5M DED 100K,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920913,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003594,4334220,B,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,UD1 LIM 10M DED 25K,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,25000,0,0,0,,,N,0,0,N,0 +920913,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003594,4334220,B,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,CA LIM 5M DED 100K,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920913,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003594,4334220,B,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,AU LIM 5M DED 25K,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,25000,0,0,0,,,N,0,0,N,0 +920913,,,,,,A,2022-05-01,2023-05-01,4334220,GC2,Unknown,USD,,,,,,2003594,4334220,B,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,AK 100KDED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920922,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003621,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQNMEQAOZ_STP,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,600000000,0,0,0,,,N,0,0,N,0 +920922,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003621,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCAAKHIPNW_STP,B,B,40000000,0,0,40000000,1,0,0,0,0,0,0,600000000,0,0,0,,,N,0,0,N,0 +920922,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003621,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCAAKHIPNW,B,B,40000000,0,0,40000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920976,,,,,,A,2022-06-01,2023-06-01,4334220,GC2,Unknown,USD,,,,,,2003826,4334220,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQNM UD123 25M L,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920977,,,,,,A,2022-05-30,2023-05-30,4334220,GC2,Unknown,USD,,,,,,2003831,4334220,E,,,,,,,100000,0,0,0,25000000,25000000,,,,MI,,N,0,0,N,0,4334220,EQ_CA_EXCL,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920980,,,,,,A,2022-06-01,2023-06-01,4334220,GC2,Unknown,USD,,,,,,2003841,4334220,B,,,,,,,500000,2500000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,EQ_USER DEFINED 1_25M LIM,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920985,,,,,,A,2022-06-01,2023-06-01,4334220,GC2,Unknown,USD,,,,,,2003860,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_NMPMW_100K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920985,,,,,,A,2022-06-01,2023-06-01,4334220,GC2,Unknown,USD,,,,,,2003860,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_CALIFORNIA_100K DED,B,B,35000000,0,0,35000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920995,,,,,,A,2022-05-31,2023-05-31,4334220,GC2,Unknown,USD,,,,,,2003902,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_LOC_TIVG25M,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920995,,,,,,A,2022-05-31,2023-05-31,4334220,GC2,Unknown,USD,,,,,,2003902,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_LOC_TIVL=25MEBR,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921004,,,,,,A,2022-05-31,2023-05-31,4334220,GC2,Unknown,USD,,,,,,2003955,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQMX LIM 10M,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921004,,,,,,A,2022-05-31,2023-05-31,4334220,GC2,Unknown,USD,,,,,,2003955,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQJP LIM 1M,B,B,1000000,0,0,1000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921011,,,,,,A,2022-06-01,2023-06-01,4334220,GC2,Unknown,USD,,,,,,2003974,4334220,E,,,,,,,1000000,5000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,TURKEY_100M LIM 1M DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921011,,,,,,A,2022-06-01,2023-06-01,4334220,GC2,Unknown,USD,,,,,,2003974,4334220,E,,,,,,,1000000,5000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,MEXICO_25M LIM 1M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921011,,,,,,A,2022-06-01,2023-06-01,4334220,GC2,Unknown,USD,,,,,,2003974,4334220,E,,,,,,,1000000,5000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,JAPAN_50M LIM 1M DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921011,,,,,,A,2022-06-01,2023-06-01,4334220,GC2,Unknown,USD,,,,,,2003974,4334220,E,,,,,,,1000000,5000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,CALIFORNIA_10M LIM 1M DED,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921015,,,,,,A,2021-07-01,2022-08-01,4334220,GC2,Unknown,USD,,,,,,2003989,4334220,E,,,,,,,500000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EXCL EQCA,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +921015,,,,,,A,2021-07-01,2022-08-01,4334220,GC2,Unknown,USD,,,,,,2003990,4334220,E,,,,,,,500000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,EXCL EQCA,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +921016,,,,,,A,2021-07-01,2022-08-01,4334220,GC2,Unknown,USD,,,,,,2003997,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_2.5M LIM,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921024,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004033,4334220,E,,,,,,,150000000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,EXCL EQCA,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,150000000,0,0,0,,,N,0,0,N,0 +921024,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004034,4334220,E,,,,,,,150000000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,4334220,EXCL EQCA,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +921025,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004045,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD2_25M LIM_100K DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921025,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004045,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1_25M LIM_1M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921025,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004045,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_60M LIM_1M DED,B,B,60000000,0,0,60000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921025,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004045,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQAOL_250M LIMIT 1M DED,B,B,240000000,0,0,240000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921025,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004048,4334220,E,,,,,,,100000,0,0,0,240000000,240000000,,,,MI,,N,0,0,N,0,4334220,EQUD2_25M LIM_100K DED,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +921025,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004048,4334220,E,,,,,,,100000,0,0,0,240000000,240000000,,,,MI,,N,0,0,N,0,4334220,EQAOL_250M LIMIT 1M DED,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921031,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004076,4334220,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1_5M LIMIT 250K DED,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +921031,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004076,4334220,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQJP_10M LIMIT 250K DED,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +921032,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004080,4334220,E,,,,,,,3050000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA AND PNW_25M LIM 3.1M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,3100000,0,0,0,,,N,0,0,N,0 +921046,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004132,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD4_5M LIMIT,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921046,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004132,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD3_50M LIMIT,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921046,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004132,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD2_30M LIMIT,B,B,30000000,0,0,30000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921055,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004179,4334220,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQPNW LIM 2.5M,B,B,2500000,0,0,2500000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921055,,,,,,A,2022-07-01,2023-07-01,4334220,GC2,Unknown,USD,,,,,,2004179,4334220,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA UD1 LIM 5M,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921095,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004336,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,UMV_EQ_NMPNW_SUBLIMIT,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921095,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004336,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,UMV_EQ_CALIFORNIA_SUBLIMIT,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +921095,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004336,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,UMV_EQ_ALASKAHAWAI_SUBLIMIT,B,B,2500000,0,0,2500000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921095,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004336,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,UMV_1M DED,B,B,175000000,0,0,175000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921095,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004336,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_NMPNW_SUBLIMIT,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921095,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004336,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_CALIFORNIA_SUBLIMIT,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921095,,,,,,A,2022-06-15,2023-06-15,4334220,GC2,Unknown,USD,,,,,,2004336,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_ALASKAHAWAI_SUBLIMIT,B,B,2500000,0,0,2500000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921101,,,,,,A,2022-06-09,2023-06-09,4334220,GC2,Unknown,USD,,,,,,2004366,4334220,E,,,,,,,3500000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EX_JP_MX_UD1_EQCA_CONRAD,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +921101,,,,,,A,2022-06-09,2023-06-09,4334220,GC2,Unknown,USD,,,,,,2004367,4334220,E,,,,,,,3500000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,4334220,EX_JP_MX_UD1_EQCA_CONRAD,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +921109,,,,,,A,2022-06-30,2023-06-30,4334220,GC2,Unknown,USD,,,,,,2004398,4334220,E,,,,,,,100000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,4334220,EQUD1_7.5M LIM,B,B,175000000,0,0,175000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921115,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2004424,4334220,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,EQPNW_100M LIM,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921115,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2004424,4334220,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,EQPNWNMUD1 LIM 25M DED 100K,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +921115,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2004430,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQPNWNMUD1 LIM 25M DED 100K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920560,,,,,,A,2021-11-01,2022-11-01,4334220,GC2,Unknown,USD,,,,,,2002111,4334220,E,,,,,,,1000000,0,0,0,4000000,4000000,,,,MI,,N,0,0,N,0,4334220,EQUD1_675K LIM,B,B,19000000,0,0,19000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920560,,,,,,A,2021-11-01,2022-11-01,4334220,GC2,Unknown,USD,,,,,,2002111,4334220,E,,,,,,,1000000,0,0,0,4000000,4000000,,,,MI,,N,0,0,N,0,4334220,EQTW_3.1M LIM,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920560,,,,,,A,2021-11-01,2022-11-01,4334220,GC2,Unknown,USD,,,,,,2002111,4334220,E,,,,,,,1000000,0,0,0,4000000,4000000,,,,MI,,N,0,0,N,0,4334220,EQJP_450K LIM,B,B,14000000,0,0,14000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920560,,,,,,A,2021-11-01,2022-11-01,4334220,GC2,Unknown,USD,,,,,,2002111,4334220,E,,,,,,,1000000,0,0,0,4000000,4000000,,,,MI,,N,0,0,N,0,4334220,EQCA_2M LIM,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920573,,,,,,A,2021-10-15,2022-10-15,4334220,GC2,Unknown,USD,,,,,,2002162,4334220,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQNMUD2AOL_1M DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920573,,,,,,A,2021-10-15,2022-10-15,4334220,GC2,Unknown,USD,,,,,,2002162,4334220,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA UD1_25M LIM 1M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920588,,,,,,A,2021-10-27,2022-10-27,4334220,GC2,Unknown,USD,,,,,,2002226,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,NMEQ PNWEQ EQUD2UD3 250K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920588,,,,,,A,2021-10-27,2022-10-27,4334220,GC2,Unknown,USD,,,,,,2002226,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,JPEQ 250K LIM,B,B,1000000,0,0,1000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920588,,,,,,A,2021-10-27,2022-10-27,4334220,GC2,Unknown,USD,,,,,,2002226,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1 1.2M LIM 250K DED,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920588,,,,,,A,2021-10-27,2022-10-27,4334220,GC2,Unknown,USD,,,,,,2002226,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,CAEQ 2.5M LIM 250K DED,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920589,,,,,,A,2021-10-01,2022-10-01,4334220,GC2,Unknown,USD,,,,,,2002230,4334220,E,,,,,,,2500000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD2_5MLIM,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +920589,,,,,,A,2021-10-01,2022-10-01,4334220,GC2,Unknown,USD,,,,,,2002230,4334220,E,,,,,,,2500000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_JP_UD1_EQNM_MX_EXCL,B,B,20000000,0,0,20000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +920589,,,,,,A,2021-10-01,2022-10-01,4334220,GC2,Unknown,USD,,,,,,2002234,4334220,E,,,,,,,2500000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,4334220,EQUD2_5MLIM,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920598,,,,,,A,2021-12-01,2022-12-01,4334220,GC2,Unknown,USD,,,,,,2002278,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_PNW LIM 5M DED 100K,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920598,,,,,,A,2021-12-01,2022-12-01,4334220,GC2,Unknown,USD,,,,,,2002278,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_CA LIM 15M DED 100K,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920603,,,,,,A,2021-12-01,2022-12-01,4334220,GC2,Unknown,USD,,,,,,2002301,4334220,E,,,,,,,200000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,250K DED AOZ,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920620,,,,,,A,2021-11-01,2022-11-01,4334220,GC2,Unknown,USD,,,,,,2002378,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD2_25M LIMIT,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920620,,,,,,A,2021-11-01,2022-11-01,4334220,GC2,Unknown,USD,,,,,,2002378,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQPNW_50M LIMIT,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920620,,,,,,A,2021-11-01,2022-11-01,4334220,GC2,Unknown,USD,,,,,,2002378,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_20M LIMIT,B,B,20000000,0,0,20000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,4334220,GC2,Unknown,USD,,,,,,2002396,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EXCLEQCA,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,4334220,GC2,Unknown,USD,,,,,,2002396,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQAOZ_1M DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,4334220,GC2,Unknown,USD,,,,,,2002397,4334220,E,,,,,,,25000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,4334220,EXCLEQCA,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,4334220,GC2,Unknown,USD,,,,,,2002397,4334220,E,,,,,,,25000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,4334220,EQAOZ_1M DED,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920647,,,,,,A,2021-12-23,2022-12-23,4334220,GC2,Unknown,USD,,,,,,2002500,4334220,E,,,,,,,150000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQNM_50M LIM 250K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920648,,,,,,A,2021-12-31,2022-12-31,4334220,GC2,Unknown,USD,,,,,,2002504,4334220,E,,,,,,,1000000,0,0,0,25000000,25000000,,,,B,,N,0,0,N,0,4334220,EQ_CALIFORNIA_EXCLUDED,B,MI,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920648,,,,,,A,2021-12-31,2022-12-31,4334220,GC2,Unknown,USD,,,,,,2002516,4334220,E,,,,,,,1000000,0,0,0,25000000,25000000,,,,B,,N,0,0,N,0,4334220,EQ_CALIFORNIA_EXCLUDED,B,MI,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920653,,,,,,A,2021-12-31,2022-12-31,4334220,GC2,Unknown,USD,,,,,,2002542,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,PACIFIC NORTHWEST_LIM_30M,B,B,30000000,0,0,30000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920653,,,,,,A,2021-12-31,2022-12-31,4334220,GC2,Unknown,USD,,,,,,2002542,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,CA_DED_250K,B,B,35000000,0,0,35000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920656,,,,,,A,2021-12-31,2022-12-31,4334220,GC2,Unknown,USD,,,,,,2002552,4334220,E,,,,,,,50000,25000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,EQCA PNW MIN100K,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920656,,,,,,A,2021-12-31,2022-12-31,4334220,GC2,Unknown,USD,,,,,,2002553,4334220,E,,,,,,,50000,25000000,0,0,10000000,10000000,,,,MM,,N,0,0,N,0,4334220,EQCA PNW MIN100K,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920659,,,,,,A,2021-12-30,2022-12-30,4334220,GC2,Unknown,USD,,,,,,2002568,4334220,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQPH_10MLIM,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920659,,,,,,A,2021-12-30,2022-12-30,4334220,GC2,Unknown,USD,,,,,,2002568,4334220,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQMX_5.45MLIM,B,B,5450000,0,0,5450000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920659,,,,,,A,2021-12-30,2022-12-30,4334220,GC2,Unknown,USD,,,,,,2002568,4334220,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQJP_3MLIM_250KDED,B,B,3000000,0,0,3000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920659,,,,,,A,2021-12-30,2022-12-30,4334220,GC2,Unknown,USD,,,,,,2002568,4334220,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_1MLIM,B,B,1000000,0,0,1000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920662,,,,,,A,2022-01-01,2023-01-01,4334220,GC2,Unknown,USD,,,,,,2002580,4334220,E,,,,,,,5000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1_20M LIM,B,B,20000000,0,0,20000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +920663,,,,,,A,2021-12-31,2022-12-31,4334220,GC2,Unknown,USD,,,,,,2002585,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_250K DED,B,B,55000000,0,0,55000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920663,,,,,,A,2021-12-31,2022-12-31,4334220,GC2,Unknown,USD,,,,,,2002585,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_UD1_15M LIM 250K DED,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920663,,,,,,A,2021-12-31,2022-12-31,4334220,GC2,Unknown,USD,,,,,,2002585,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_AOZPNW_50M LIM,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920667,,,,,,A,2022-01-01,2023-01-01,4334220,GC2,Unknown,USD,,,,,,2002601,4334220,B,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EXCL_EQCA_EQJP_HI_UD1,B,B,2500000,0,0,2500000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920667,,,,,,A,2022-01-01,2023-01-01,4334220,GC2,Unknown,USD,,,,,,2002602,4334220,E,,,,,,,50000,0,0,0,30000000,30000000,,,,MI,,N,0,0,N,0,4334220,EXCL_EQCA_EQJP_HI_UD1,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920687,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002701,4334220,E,,,,,,,5000000,10000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,EQ_TR_UD3_LIM_75M,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +920687,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002701,4334220,E,,,,,,,5000000,10000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,EQ_JP_LIM_1M,B,B,1000000,0,0,1000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +920687,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002701,4334220,E,,,,,,,5000000,10000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,EQ_GR_IT_MX_LIM_50M,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +920687,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002701,4334220,E,,,,,,,5000000,10000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,EQ_CA_UD2_LIM_25M,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +920689,,,,,,A,2022-01-28,2023-01-28,4334220,GC2,Unknown,USD,,,,,,2002708,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_2.5M LIM_1M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920689,,,,,,A,2022-01-28,2023-01-28,4334220,GC2,Unknown,USD,,,,,,2002708,4334220,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQAOZ_5M LIM_2.5M DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +920690,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002712,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD5_125M LIM,B,B,125000000,0,0,125000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920690,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002712,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD4_2M LIM,B,B,2000000,0,0,2000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920690,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002712,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD3_50M LIM,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920690,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002712,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD2_500K LIM,B,B,500000,0,0,500000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920690,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002712,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_100M LIM,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920693,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002725,4334220,E,,,,,,,250000,0,0,0,0,0,,,,B,,N,0,0,N,0,4334220,1 LOC DED 100K,B,MI,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920695,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002735,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_CALIFORNIA_250K DED,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920709,,,,,,A,2022-02-10,2023-02-10,4334220,GC2,Unknown,USD,,,,,,2002805,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EXCLCA,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920709,,,,,,A,2022-02-10,2023-02-10,4334220,GC2,Unknown,USD,,,,,,2002805,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1 LIM 10M DED 100K,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920710,,,,,,A,2022-01-31,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002809,4334220,B,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1NM DED 100K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920710,,,,,,A,2022-01-31,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002809,4334220,B,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA DED 250K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920714,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002821,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQUD2_15M LIM,B,MI,115000000,0,0,115000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920714,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002821,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQUD1_50M LIM,B,MI,150000000,0,0,150000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920714,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002821,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQTW_200M LIM,B,MI,300000000,0,0,300000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920714,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002821,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQJP_150M LIM,B,MI,250000000,0,0,250000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920714,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002821,4334220,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,4334220,EQCA_30M LIM,B,MI,130000000,0,0,130000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920716,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002826,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_PACIFIC NORTHWEST_100K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920716,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002826,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_CALIFORNIA_100K DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920723,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002852,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD2 DED 250K,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920723,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002852,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1 LIM 50M DED 250K,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920723,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002852,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQNW LIM 10M,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920723,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002852,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQNM LIM 25M DED 250K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920723,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002852,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQJP LIM 15M DED 1M,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920723,,,,,,A,2022-02-01,2023-02-01,4334220,GC2,Unknown,USD,,,,,,2002852,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,AOZ DED 1M,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920729,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002881,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,500K-1M_50K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,50000,0,0,0,,,N,0,0,N,0 +920729,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002881,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,1M-2.5M_75K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,75000,0,0,0,,,N,0,0,N,0 +920729,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002881,4334220,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,G2.5M_100K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920740,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002925,4334220,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1 10M L 250K D,B,B,40000000,0,0,40000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920740,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002925,4334220,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQJP 2.5M L 500K D,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920740,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002925,4334220,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA 6.2M L 500K D,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920743,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002936,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD2_5MLIM_250KDED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920743,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002936,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1_3.75MLIM_250KDED,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920749,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002951,4334220,E,,,,,,,5000000,0,0,0,57000000,57000000,,,,MI,,N,0,0,N,0,4334220,EQUD1 NM NW 1.5M L,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +920751,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002956,4334220,E,,,,,,,10000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,CA PNW UD1 UD4_100K DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920752,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002961,4334220,E,,,,,,,150000000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,4334220,EQCA EQJP_EXCLUDED,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920752,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002962,4334220,E,,,,,,,150000000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,4334220,EQCA EQJP_EXCLUDED,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920752,,,,,,A,2022-03-01,2023-03-01,4334220,GC2,Unknown,USD,,,,,,2002963,4334220,E,,,,,,,150000000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,4334220,EQCA EQJP_EXCLUDED,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920756,,,,,,A,2022-01-31,2023-01-31,4334220,GC2,Unknown,USD,,,,,,2002988,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUDF1 LIM 15M DED 100K,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920756,,,,,,A,2022-01-31,2023-01-31,4334220,GC2,Unknown,USD,,,,,,2002988,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQNM LIM 15M DED 100K,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920756,,,,,,A,2022-01-31,2023-01-31,4334220,GC2,Unknown,USD,,,,,,2002988,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQJP MX LIM 2.5M DED 100K,B,B,2500000,0,0,2500000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920756,,,,,,A,2022-01-31,2023-01-31,4334220,GC2,Unknown,USD,,,,,,2002988,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA LIM 15M DED 250K,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920769,,,,,,A,2022-03-31,2023-03-31,4334220,GC2,Unknown,USD,,,,,,2003030,4334220,E,,,,,,,500000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA LIM 1.875M,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920781,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003079,4334220,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_5M LIM 100K DED,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920795,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003136,4334220,E,,,,,,,1000000,15000000,0,0,0,0,,,,MM,,N,0,0,N,0,4334220,EQUD1_20M LIMIT,B,B,20000000,0,0,20000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920801,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003161,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQ_USER DEFINED 12_INCLUDED,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920812,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003192,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,NM_EQUD3_20MLIM_250KDED,B,B,20000000,0,0,20000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920812,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003192,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQUD1_10MLIM_250KDED,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920812,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003192,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQPNW,B,B,30000000,0,0,30000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920812,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003192,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQMX_15MLIM_250KDED,B,B,15000000,0,0,15000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920812,,,,,,A,2022-04-01,2023-04-01,4334220,GC2,Unknown,USD,,,,,,2003192,4334220,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,4334220,EQCA_JP_5MLIM,B,B,5000000,0,0,5000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254223,,,,,,A,2022-05-09,2023-05-08,11534403,GC1,Unknown,USD,,,,,,2350654,11534403,E,,,,,,,50000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,FL STATE,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920853,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2003359,11534403,E,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS_TIER1_TIER2_DED_100K,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254244,,,,,,A,2022-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2350713,11534403,E,,,,,,,50000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,WS TIER 1,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254250,,,,,,A,2022-06-01,2023-05-03,11534403,GC1,Unknown,USD,,,,,,2350738,11534403,E,,,,,,,100000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,WSUD1,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254250,,,,,,A,2022-06-01,2023-05-03,11534403,GC1,Unknown,USD,,,,,,2350738,11534403,E,,,,,,,100000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,WSFL,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254250,,,,,,A,2022-06-01,2023-05-03,11534403,GC1,Unknown,USD,,,,,,2350738,11534403,E,,,,,,,100000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,TIER 1,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254250,,,,,,A,2022-06-01,2023-05-03,11534403,GC1,Unknown,USD,,,,,,2350740,11534403,E,,,,,,,100000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,11534403,WSUD1,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254250,,,,,,A,2022-06-01,2023-05-03,11534403,GC1,Unknown,USD,,,,,,2350740,11534403,E,,,,,,,100000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,11534403,WSFL,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254250,,,,,,A,2022-06-01,2023-05-03,11534403,GC1,Unknown,USD,,,,,,2350740,11534403,E,,,,,,,100000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,11534403,TIER 1,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920882,,,,,,A,2022-05-01,2023-05-01,11534403,GC2,Unknown,USD,,,,,,2003471,11534403,E,,,,,,,100000,15000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,WST1_2.5M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +920882,,,,,,A,2022-05-01,2023-05-01,11534403,GC2,Unknown,USD,,,,,,2003471,11534403,E,,,,,,,100000,15000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,WSAOZ_1M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920901,,,,,,A,2022-05-01,2023-05-01,11534403,GC2,Unknown,USD,,,,,,2003542,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,AOZ TIER 1 300M LIM 1M DED,B,B,300000000,0,0,300000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254273,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2350796,11534403,E,,,,,,,100000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,TIER 1 LOCATIONS,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254276,,,,,,A,2022-05-01,2023-05-01,11534403,GC1,Unknown,USD,,,,,,2350804,11534403,E,,,,,,,500000,0,0,0,125000000,125000000,,,,MI,,N,0,0,N,0,11534403,SPEC_WS,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254276,,,,,,A,2022-05-01,2023-05-01,11534403,GC1,Unknown,USD,,,,,,2350804,11534403,E,,,,,,,500000,0,0,0,125000000,125000000,,,,MI,,N,0,0,N,0,11534403,OTH,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254276,,,,,,A,2022-05-01,2023-05-01,11534403,GC1,Unknown,USD,,,,,,2350804,11534403,E,,,,,,,500000,0,0,0,125000000,125000000,,,,MI,,N,0,0,N,0,11534403,FLORIDA_WS,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920913,,,,,,A,2022-05-01,2023-05-01,11534403,GC2,Unknown,USD,,,,,,2003593,11534403,B,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,UD1 LIM10M DED 100K,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920913,,,,,,A,2022-05-01,2023-05-01,11534403,GC2,Unknown,USD,,,,,,2003593,11534403,B,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,TIER1 LIM100M DED 100K,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920913,,,,,,A,2022-05-01,2023-05-01,11534403,GC2,Unknown,USD,,,,,,2003596,11534403,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,EXCL UD2 UD1 AOZ,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920922,,,,,,A,2022-04-01,2023-04-01,11534403,GC2,Unknown,USD,,,,,,2003622,11534403,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSAOZTIER1 STP,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,600000000,0,0,0,,,N,0,0,N,0 +920934,,,,,,A,2022-05-01,2023-05-01,11534403,GC2,Unknown,USD,,,,,,2003660,11534403,E,,,,,,,500000,50000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,WST1_50M LIMIT,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920935,,,,,,A,2022-05-15,2023-05-15,11534403,GC2,Unknown,USD,,,,,,2003664,11534403,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS_TIER 1_100K DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350881,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,WSDE4 LOCATIONS,B,B,275000000,0,0,275000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350881,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,WSDE3 LOCATIONS,B,B,275000000,0,0,275000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350881,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,WSDE2 LOCATIONS,B,B,275000000,0,0,275000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350881,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,WSDE1 LOCATIONS,B,B,275000000,0,0,275000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350881,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,NWS SUB-LIMITS,B,B,275000000,0,0,275000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350885,11534403,E,,,,,,,100000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,11534403,WSDE3 LOCATIONS,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350885,11534403,E,,,,,,,100000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,11534403,WSDE2 LOCATIONS,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350885,11534403,E,,,,,,,100000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,11534403,WSDE4 LOCATIONS,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350885,11534403,E,,,,,,,100000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,11534403,WSDE1 LOCATIONS,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254300,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350885,11534403,E,,,,,,,100000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,11534403,NWS SUB-LIMITS,B,B,275000000,0,0,275000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920961,,,,,,A,2022-05-30,2023-05-30,11534403,GC2,Unknown,USD,,,,,,2003761,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS_TIER 1_250K DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920977,,,,,,A,2022-05-30,2023-05-30,11534403,GC2,Unknown,USD,,,,,,2003832,11534403,E,,,,,,,100000,0,0,0,25000000,25000000,,,,MI,,N,0,0,N,0,11534403,WS_FL_UD1_DED_250K,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920985,,,,,,A,2022-06-01,2023-06-01,11534403,GC2,Unknown,USD,,,,,,2003862,11534403,E,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS_TIER 1_50K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254324,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2350970,11534403,E,,,,,,,100000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254324,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2351382,11534403,E,,,,,,,100000,0,0,0,175000000,175000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,11534403,GC1,Unknown,USD,,,,,,2350982,11534403,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,11534403,UMVWST1,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,11534403,GC1,Unknown,USD,,,,,,2350982,11534403,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,11534403,UMV,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,11534403,GC1,Unknown,USD,,,,,,2350982,11534403,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,11534403,AOZWST1,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,11534403,GC1,Unknown,USD,,,,,,2350982,11534403,E,,,,,,,0,0,0,0,175000000,175000000,,,,N,,N,0,0,N,0,11534403,AOZ,B,MI,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,11534403,GC1,Unknown,USD,,,,,,2350985,11534403,E,,,,,,,0,0,0,0,400000000,400000000,,,,N,,N,0,0,N,0,11534403,UMVWST1,B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,11534403,GC1,Unknown,USD,,,,,,2350985,11534403,E,,,,,,,0,0,0,0,400000000,400000000,,,,N,,N,0,0,N,0,11534403,UMV,B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,11534403,GC1,Unknown,USD,,,,,,2350985,11534403,E,,,,,,,0,0,0,0,400000000,400000000,,,,N,,N,0,0,N,0,11534403,AOZWST1,B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254327,,,,,,A,2022-06-15,2023-06-14,11534403,GC1,Unknown,USD,,,,,,2350985,11534403,E,,,,,,,0,0,0,0,400000000,400000000,,,,N,,N,0,0,N,0,11534403,AOZ,B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254329,,,,,,A,2022-05-31,2023-05-30,11534403,GC1,Unknown,USD,,,,,,2350993,11534403,E,,,,,,,1000000,0,0,0,400000000,400000000,,,,MI,,N,0,0,N,0,11534403,NWS HIGH HAZARD ZONES,B,B,450000000,0,0,450000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254330,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2350989,11534403,E,,,,,,,500000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,TIER 1,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254330,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2350989,11534403,E,,,,,,,500000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,FLORIDA,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254330,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2350991,11534403,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,TIER 1,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254330,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2350991,11534403,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,FLORIDA,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920995,,,,,,A,2022-05-31,2023-05-31,11534403,GC2,Unknown,USD,,,,,,2003903,11534403,E,,,,,,,50000,50000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,WS_TIVG25M_250K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920995,,,,,,A,2022-05-31,2023-05-31,11534403,GC2,Unknown,USD,,,,,,2003903,11534403,E,,,,,,,50000,50000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,WS_TIVL25M_100K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254359,,,,,,A,2022-07-01,2023-06-30,11534403,GC1,Unknown,USD,,,,,,2351121,11534403,E,,,,,,,2000000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,CRITICAL WINDSTORM AREAS,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,2000000,0,0,0,,,N,0,0,N,0 +1254360,,,,,,A,2022-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2351126,11534403,E,,,,,,,250000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,WS SPEC3,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254360,,,,,,A,2022-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2351126,11534403,E,,,,,,,250000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,WS SPEC2,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254360,,,,,,A,2022-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2351126,11534403,E,,,,,,,250000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,WS SPEC,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +921003,,,,,,A,2022-05-30,2023-05-30,11534403,GC2,Unknown,USD,,,,,,2003952,11534403,E,,,,,,,100000,0,0,0,25000000,25000000,,,,MI,,N,0,0,N,0,11534403,50M LIM TIER 1,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921015,,,,,,A,2021-07-01,2022-08-01,11534403,GC2,Unknown,USD,,,,,,2003991,11534403,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WST1 DED 500K,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +921015,,,,,,A,2021-07-01,2022-08-01,11534403,GC2,Unknown,USD,,,,,,2003992,11534403,E,,,,,,,250000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,WST1 DED 500K,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254379,,,,,,A,2022-05-05,2023-05-05,11534403,GC1,Unknown,USD,,,,,,2351181,11534403,E,,,,,,,25000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,11534403,T1,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254379,,,,,,A,2022-05-05,2023-05-05,11534403,GC1,Unknown,USD,,,,,,2351181,11534403,E,,,,,,,25000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,11534403,FLORIDA,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254379,,,,,,A,2022-05-05,2023-05-05,11534403,GC1,Unknown,USD,,,,,,2351182,11534403,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,T1,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254379,,,,,,A,2022-05-05,2023-05-05,11534403,GC1,Unknown,USD,,,,,,2351182,11534403,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,FLORIDA,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254379,,,,,,A,2022-05-05,2023-05-05,11534403,GC1,Unknown,USD,,,,,,2351184,11534403,E,,,,,,,25000,0,0,0,75000000,75000000,,,,MI,,N,0,0,N,0,11534403,T1,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254379,,,,,,A,2022-05-05,2023-05-05,11534403,GC1,Unknown,USD,,,,,,2351184,11534403,E,,,,,,,25000,0,0,0,75000000,75000000,,,,MI,,N,0,0,N,0,11534403,FLORIDA,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254380,,,,,,A,2022-07-01,2023-06-30,11534403,GC1,Unknown,USD,,,,,,2351188,11534403,E,,,,,,,250000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,NWS TIER 1 LOC,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254380,,,,,,A,2022-07-01,2023-06-30,11534403,GC1,Unknown,USD,,,,,,2351188,11534403,E,,,,,,,250000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,NWS FLORIDA LOC,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254380,,,,,,A,2022-07-01,2023-06-30,11534403,GC1,Unknown,USD,,,,,,2351188,11534403,E,,,,,,,250000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,SPECIFIED LOCATION,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,10000,0,0,0,,,N,0,0,N,0 +921025,,,,,,A,2022-07-01,2023-07-01,11534403,GC2,Unknown,USD,,,,,,2004047,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSAOL UD1 UD3_1M DED,B,B,240000000,0,0,240000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921025,,,,,,A,2022-07-01,2023-07-01,11534403,GC2,Unknown,USD,,,,,,2004050,11534403,E,,,,,,,100000,0,0,0,240000000,240000000,,,,MI,,N,0,0,N,0,11534403,WSAOL UD1 UD3_1M DED,B,B,750000000,0,0,750000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921031,,,,,,A,2022-07-01,2023-07-01,11534403,GC2,Unknown,USD,,,,,,2004077,11534403,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WST1_250K DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +921032,,,,,,A,2022-06-15,2023-06-15,11534403,GC2,Unknown,USD,,,,,,2004081,11534403,E,,,,,,,3025000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,TIER 1_25M LIM 3.1M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,3100000,0,0,0,,,N,0,0,N,0 +1254401,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2351265,11534403,E,,,,,,,100000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,NWS TIER 1 LOC EX-FL STATE,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254401,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2351265,11534403,E,,,,,,,100000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,NWS SENIOR LIVING PROPERTIES,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254401,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2351265,11534403,E,,,,,,,100000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,NWS FL STATE,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254409,,,,,,A,2022-07-01,2023-06-30,11534403,GC1,Unknown,USD,,,,,,2351290,11534403,E,,,,,,,75000000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,75000000,0,0,0,,,N,0,0,N,0 +1254417,,,,,,A,2022-07-01,2023-07-01,11534403,GC1,Unknown,USD,,,,,,2351310,11534403,E,,,,,,,500000,0,0,0,30000000,30000000,,,,MI,,N,0,0,N,0,11534403,OTHER T1,B,B,120000000,0,0,120000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254417,,,,,,A,2022-07-01,2023-07-01,11534403,GC1,Unknown,USD,,,,,,2351310,11534403,E,,,,,,,500000,0,0,0,30000000,30000000,,,,MI,,N,0,0,N,0,11534403,FL,B,B,120000000,0,0,120000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +921053,,,,,,A,2022-06-29,2023-06-29,11534403,GC2,Unknown,USD,,,,,,2004172,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1_250K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1253781,,,,,,A,2020-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2349287,11534403,E,,,,,,,0,0,0,0,1000000000,1000000000,,,,N,,N,0,0,N,0,11534403,AOL,B,MI,1500000000,0,0,1500000000,1,0,0,0,0,0,0,50000,0,0,0,,,N,0,0,N,0 +1253781,,,,,,A,2020-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2349287,11534403,E,,,,,,,0,0,0,0,1000000000,1000000000,,,,N,,N,0,0,N,0,11534403,$100K,B,MI,1500000000,0,0,1500000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254440,,,,,,A,2022-06-20,2023-06-19,11534403,GC1,Unknown,USD,,,,,,2351357,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,TX,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921055,,,,,,A,2022-07-01,2023-07-01,11534403,GC2,Unknown,USD,,,,,,2004180,11534403,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WST1 LIM 10M,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921067,,,,,,A,2022-07-01,2023-07-01,11534403,GC2,Unknown,USD,,,,,,2004223,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSFL DED 2M,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,2000000,0,0,0,,,N,0,0,N,0 +921067,,,,,,A,2022-07-01,2023-07-01,11534403,GC2,Unknown,USD,,,,,,2004223,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,TIER 1 250K DED,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1253829,,,,,,A,2021-08-01,2022-08-01,11534403,GC1,Unknown,USD,,,,,,2349408,11534403,E,,,,,,,25000,250000,0,0,250000000,250000000,,,,MM,,N,0,0,N,0,11534403,SPEC,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921095,,,,,,A,2022-06-15,2023-06-15,11534403,GC2,Unknown,USD,,,,,,2004338,11534403,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WST1_UMV_2.5M DED,B,B,175000000,0,0,175000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +921101,,,,,,A,2022-06-09,2023-06-09,11534403,GC2,Unknown,USD,,,,,,2004368,11534403,E,,,,,,,500000,1000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,1M_DED_CONRAD_HOTEL,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921101,,,,,,A,2022-06-09,2023-06-09,11534403,GC2,Unknown,USD,,,,,,2004369,11534403,E,,,,,,,500000,1000000,0,0,100000000,100000000,,,,MM,,N,0,0,N,0,11534403,1M_DED_CONRAD_HOTEL,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +921115,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2004426,11534403,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,WS TIER 1 LIM 25M DED 100K,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +921115,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2004432,11534403,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS TIER 1 LIM 25M DED 100K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920535,,,,,,A,2021-09-01,2022-09-01,11534403,GC2,Unknown,USD,,,,,,2002002,11534403,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,STP 350M DED,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,350000000,0,0,0,,,N,0,0,N,0 +1253899,,,,,,A,2021-10-01,2022-10-01,11534403,GC1,Unknown,USD,,,,,,2349609,11534403,E,,,,,,,250000,0,0,0,400000000,400000000,,,,MI,,N,0,0,N,0,11534403,SPEC2,B,B,1000000000,0,0,1000000000,1,0,0,0,0,0,0,50000,0,0,0,,,N,0,0,N,0 +1253899,,,,,,A,2021-10-01,2022-10-01,11534403,GC1,Unknown,USD,,,,,,2349609,11534403,E,,,,,,,250000,0,0,0,400000000,400000000,,,,MI,,N,0,0,N,0,11534403,SPEC,B,B,1000000000,0,0,1000000000,1,0,0,0,0,0,0,50000,0,0,0,,,N,0,0,N,0 +1253900,,,,,,A,2021-11-29,2022-11-28,11534403,GC1,Unknown,USD,,,,,,2349612,11534403,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,TIER 1,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1253900,,,,,,A,2021-11-29,2022-11-28,11534403,GC1,Unknown,USD,,,,,,2349612,11534403,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,FL LOCATION,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1253900,,,,,,A,2021-11-29,2022-11-28,11534403,GC1,Unknown,USD,,,,,,2349612,11534403,E,,,,,,,25000,0,0,0,50000000,50000000,,,,MI,,N,0,0,N,0,11534403,AOP,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,25000,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,11534403,GC1,Unknown,USD,,,,,,2349616,11534403,E,,,,,,,500000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,11534403,ZONE2,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,11534403,GC1,Unknown,USD,,,,,,2349616,11534403,E,,,,,,,500000,0,0,0,225000000,225000000,,,,MI,,N,0,0,N,0,11534403,ZONE1,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,11534403,GC1,Unknown,USD,,,,,,2349619,11534403,E,,,,,,,500000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,ZONE2,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253901,,,,,,A,2021-11-01,2022-10-31,11534403,GC1,Unknown,USD,,,,,,2349619,11534403,E,,,,,,,500000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,ZONE1,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253931,,,,,,A,2021-12-01,2022-11-30,11534403,GC1,Unknown,USD,,,,,,2349715,11534403,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,WSUD1,B,B,300000000,0,0,300000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253931,,,,,,A,2021-12-01,2022-11-30,11534403,GC1,Unknown,USD,,,,,,2349715,11534403,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,TIER 1 ND 2,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920573,,,,,,A,2021-10-15,2022-10-15,11534403,GC2,Unknown,USD,,,,,,2002163,11534403,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1_25M LIM 1M DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920573,,,,,,A,2021-10-15,2022-10-15,11534403,GC2,Unknown,USD,,,,,,2002163,11534403,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,1M DED EXCP UD5,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920588,,,,,,A,2021-10-27,2022-10-27,11534403,GC2,Unknown,USD,,,,,,2002227,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD2TIER12 250K DED,B,B,145000000,0,0,145000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920588,,,,,,A,2021-10-27,2022-10-27,11534403,GC2,Unknown,USD,,,,,,2002227,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1 6.2M LIM 250K DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920598,,,,,,A,2021-12-01,2022-12-01,11534403,GC2,Unknown,USD,,,,,,2002279,11534403,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS UDF1 DED 500K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1253957,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349806,11534403,E,,,,,,,1000000,5000000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,11534403,SPEC,B,B,700000000,0,0,700000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253957,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349808,11534403,E,,,,,,,1000000,5000000,0,0,700000000,700000000,,,,MM,,N,0,0,N,0,11534403,SPEC,B,B,800000000,0,0,800000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253960,,,,,,A,2021-12-01,2022-12-01,11534403,GC1,Unknown,USD,,,,,,2349818,11534403,E,,,,,,,25000,0,0,0,75000000,75000000,,,,MI,,N,0,0,N,0,11534403,T1 AND FL OTHERS,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,50000,0,0,0,,,N,0,0,N,0 +1253960,,,,,,A,2021-12-01,2022-12-01,11534403,GC1,Unknown,USD,,,,,,2349818,11534403,E,,,,,,,25000,0,0,0,75000000,75000000,,,,MI,,N,0,0,N,0,11534403,FL_SPEC,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,50000,0,0,0,,,N,0,0,N,0 +1253965,,,,,,A,2021-12-01,2022-11-30,11534403,GC1,Unknown,USD,,,,,,2349837,11534403,E,,,,,,,0,0,0,0,400000000,400000000,,,,N,,N,0,0,N,0,11534403,TIER 1 ZONES,B,MI,800000000,0,0,800000000,1,0,0,0,0,0,0,50000,0,0,0,,,N,0,0,N,0 +1253965,,,,,,A,2021-12-01,2022-11-30,11534403,GC1,Unknown,USD,,,,,,2349837,11534403,E,,,,,,,0,0,0,0,400000000,400000000,,,,N,,N,0,0,N,0,11534403,ALL OTHER LOCATIONS,B,MI,800000000,0,0,800000000,1,0,0,0,0,0,0,50000,0,0,0,,,N,0,0,N,0 +1253969,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349849,11534403,E,,,,,,,2500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,LAPLACE LA,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253969,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349849,11534403,E,,,,,,,2500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,GEORGETOWN SC,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253969,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349851,11534403,E,,,,,,,2500000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,11534403,LAPLACE LA,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253969,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349851,11534403,E,,,,,,,2500000,0,0,0,275000000,275000000,,,,MI,,N,0,0,N,0,11534403,GEORGETOWN SC,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253969,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349853,11534403,E,,,,,,,2500000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,LAPLACE LA,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253969,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349853,11534403,E,,,,,,,2500000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,GEORGETOWN SC,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253969,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349984,11534403,E,,,,,,,2500000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,LAPLACE LA,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253969,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2349984,11534403,E,,,,,,,2500000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,GEORGETOWN SC,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1253978,,,,,,A,2022-01-01,2023-01-01,11534403,GC1,Unknown,USD,,,,,,2349883,11534403,E,,,,,,,0,0,0,0,500000000,500000000,,,,N,,N,0,0,N,0,11534403,OTHER LOCS,B,MI,750000000,0,0,750000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1253978,,,,,,A,2022-01-01,2023-01-01,11534403,GC1,Unknown,USD,,,,,,2349883,11534403,E,,,,,,,0,0,0,0,500000000,500000000,,,,N,,N,0,0,N,0,11534403,KEY LOCS,B,MI,750000000,0,0,750000000,1,0,0,0,0,0,0,25000000,0,0,0,,,N,0,0,N,0 +1253983,,,,,,A,2021-12-01,2022-11-30,11534403,GC1,Unknown,USD,,,,,,2349897,11534403,E,,,,,,,5000,0,0,0,25000000,25000000,,,,MI,,N,0,0,N,0,11534403,WS 3% 100K,B,B,45000000,0,0,45000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1253983,,,,,,A,2021-12-01,2022-11-30,11534403,GC1,Unknown,USD,,,,,,2349897,11534403,E,,,,,,,5000,0,0,0,25000000,25000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,45000000,0,0,45000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1253987,,,,,,A,2021-12-14,2022-12-13,11534403,GC1,Unknown,USD,,,,,,2349907,11534403,E,,,,,,,100000,0,0,0,80000000,80000000,,,,MI,,N,0,0,N,0,11534403,FL,B,B,80000000,0,0,80000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1253987,,,,,,A,2021-12-14,2022-12-13,11534403,GC1,Unknown,USD,,,,,,2349907,11534403,E,,,,,,,100000,0,0,0,80000000,80000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,80000000,0,0,80000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920620,,,,,,A,2021-11-01,2022-11-01,11534403,GC2,Unknown,USD,,,,,,2002379,11534403,E,,,,,,,1000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSAOZ_20M LIMIT,B,B,20000000,0,0,20000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,11534403,GC2,Unknown,USD,,,,,,2002398,11534403,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1AOZ_1M DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,11534403,GC2,Unknown,USD,,,,,,2002398,11534403,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WST2_15M DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,15000000,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,11534403,GC2,Unknown,USD,,,,,,2002398,11534403,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WST1_25M DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,25000000,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,11534403,GC2,Unknown,USD,,,,,,2002399,11534403,E,,,,,,,25000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,WSUD1AOZ_1M DED,B,B,300000000,0,0,300000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,11534403,GC2,Unknown,USD,,,,,,2002399,11534403,E,,,,,,,25000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,WST2_15M DED,B,B,300000000,0,0,300000000,1,0,0,0,0,0,0,15000000,0,0,0,,,N,0,0,N,0 +920625,,,,,,A,2021-12-07,2022-12-07,11534403,GC2,Unknown,USD,,,,,,2002399,11534403,E,,,,,,,25000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,WST1_25M DED,B,B,300000000,0,0,300000000,1,0,0,0,0,0,0,25000000,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,11534403,GC1,Unknown,USD,,,,,,2353430,11534403,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,B,,N,0,0,N,0,11534403,NWS USA,B,MI,350000000,0,0,350000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,11534403,GC1,Unknown,USD,,,,,,2353430,11534403,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,B,,N,0,0,N,0,11534403,NWS FLORIDA US,B,MI,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,11534403,GC1,Unknown,USD,,,,,,2353430,11534403,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,B,,N,0,0,N,0,11534403,NWS CHINA,B,MI,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,11534403,GC1,Unknown,USD,,,,,,2353430,11534403,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,B,,N,0,0,N,0,11534403,AOP SPEC,B,MI,1000000000,0,0,1000000000,1,0,0,0,0,0,0,6838000,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,11534403,GC1,Unknown,USD,,,,,,2353432,11534403,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,B,,N,0,0,N,0,11534403,NWS USA,B,MI,350000000,0,0,350000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,11534403,GC1,Unknown,USD,,,,,,2353432,11534403,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,B,,N,0,0,N,0,11534403,NWS FLORIDA US,B,MI,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,11534403,GC1,Unknown,USD,,,,,,2353432,11534403,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,B,,N,0,0,N,0,11534403,NWS CHINA,B,MI,50000000,0,0,50000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255069,,,,,,A,2022-04-30,2023-04-29,11534403,GC1,Unknown,USD,,,,,,2353432,11534403,E,,,,,,,7000000,0,0,0,500000000,500000000,,,,B,,N,0,0,N,0,11534403,AOP SPEC,B,MI,1000000000,0,0,1000000000,1,0,0,0,0,0,0,6838000,0,0,0,,,N,0,0,N,0 +920647,,,,,,A,2021-12-23,2022-12-23,11534403,GC2,Unknown,USD,,,,,,2002501,11534403,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1_25M LIM 250K DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920647,,,,,,A,2021-12-23,2022-12-23,11534403,GC2,Unknown,USD,,,,,,2002501,11534403,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS_TIER 2_250M LIM 250K DED,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920653,,,,,,A,2021-12-31,2022-12-31,11534403,GC2,Unknown,USD,,,,,,2002544,11534403,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,TIER1_DED_100K,B,B,35000000,0,0,35000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920653,,,,,,A,2021-12-31,2022-12-31,11534403,GC2,Unknown,USD,,,,,,2002544,11534403,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,FL_DED_250K,B,B,35000000,0,0,35000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920656,,,,,,A,2021-12-31,2022-12-31,11534403,GC2,Unknown,USD,,,,,,2002555,11534403,E,,,,,,,50000,25000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,WS TIER 1UD1 2DED 100K,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920656,,,,,,A,2021-12-31,2022-12-31,11534403,GC2,Unknown,USD,,,,,,2002556,11534403,E,,,,,,,50000,25000000,0,0,10000000,10000000,,,,MM,,N,0,0,N,0,11534403,WS TIER 1UD1 2DED 100K,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920659,,,,,,A,2021-12-30,2022-12-30,11534403,GC2,Unknown,USD,,,,,,2002569,11534403,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD2_250KDED,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920659,,,,,,A,2021-12-30,2022-12-30,11534403,GC2,Unknown,USD,,,,,,2002569,11534403,B,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1_T1_25MLIM_250KDED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255078,,,,,,A,2022-02-01,2023-01-31,11534403,GC1,Unknown,USD,,,,,,2353466,11534403,E,,,,,,,100000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,TIER 1,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1255078,,,,,,A,2022-02-01,2023-01-31,11534403,GC1,Unknown,USD,,,,,,2353466,11534403,E,,,,,,,100000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,2 SPECIFIC LOCS,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,25000,0,0,0,,,N,0,0,N,0 +1255078,,,,,,A,2022-02-01,2023-01-31,11534403,GC1,Unknown,USD,,,,,,2353466,11534403,E,,,,,,,100000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,PALM BEACH,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255078,,,,,,A,2022-02-01,2023-01-31,11534403,GC1,Unknown,USD,,,,,,2353466,11534403,E,,,,,,,100000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,HILLSBOROUGH,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1255078,,,,,,A,2022-02-01,2023-01-31,11534403,GC1,Unknown,USD,,,,,,2353466,11534403,E,,,,,,,100000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,CO TX,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1255082,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2353473,11534403,E,,,,,,,250000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,WS TIER1,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1255082,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2353473,11534403,E,,,,,,,250000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,SWITZERLAND,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,54088.55,0,0,0,,,N,0,0,N,0 +1255082,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2353473,11534403,E,,,,,,,250000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,JAPAN,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255082,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2353476,11534403,E,,,,,,,250000,0,0,0,400000000,400000000,,,,MI,,N,0,0,N,0,11534403,WS TIER1,B,B,1000000000,0,0,1000000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1255082,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2353476,11534403,E,,,,,,,250000,0,0,0,400000000,400000000,,,,MI,,N,0,0,N,0,11534403,SWITZERLAND,B,B,1000000000,0,0,1000000000,1,0,0,0,0,0,0,54088.55,0,0,0,,,N,0,0,N,0 +1255082,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2353476,11534403,E,,,,,,,250000,0,0,0,400000000,400000000,,,,MI,,N,0,0,N,0,11534403,JAPAN,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920663,,,,,,A,2021-12-31,2022-12-31,11534403,GC2,Unknown,USD,,,,,,2002587,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS_TIER 1_250K DED,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255084,,,,,,A,2022-05-30,2023-05-29,11534403,GC1,Unknown,USD,,,,,,2353480,11534403,E,,,,,,,100000,0,0,0,250000000,250000000,,,,B,,N,0,0,N,0,11534403,TIER 1,B,MI,250000000,0,0,250000000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1255091,,,,,,A,2021-06-17,2022-07-31,11534403,GC1,Unknown,USD,,,,,,2353507,11534403,E,,,,,,,1000000,0,0,0,75000000,75000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1255091,,,,,,A,2021-06-17,2022-07-31,11534403,GC1,Unknown,USD,,,,,,2353509,11534403,E,,,,,,,1000000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1255091,,,,,,A,2021-06-17,2022-07-31,11534403,GC1,Unknown,USD,,,,,,2353511,11534403,E,,,,,,,1000000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1255092,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2353513,11534403,E,,,,,,,250000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,WS SPEC,B,B,300000000,0,0,300000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2353518,11534403,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,11534403,WST1,B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2353518,11534403,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,11534403,AOL,B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2353521,11534403,E,,,,,,,0,0,0,0,500000000,500000000,,,,N,,N,0,0,N,0,11534403,WST1,B,MI,750000000,0,0,750000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1255093,,,,,,A,2022-06-01,2023-05-31,11534403,GC1,Unknown,USD,,,,,,2353521,11534403,E,,,,,,,0,0,0,0,500000000,500000000,,,,N,,N,0,0,N,0,11534403,AOL,B,MI,750000000,0,0,750000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254028,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2350072,11534403,E,,,,,,,0,0,0,0,250000000,250000000,,,,N,,N,0,0,N,0,11534403,ZONE2,B,MI,850000000,0,0,850000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254028,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2350072,11534403,E,,,,,,,0,0,0,0,250000000,250000000,,,,N,,N,0,0,N,0,11534403,ZONE1,B,MI,850000000,0,0,850000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254028,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2350072,11534403,E,,,,,,,0,0,0,0,250000000,250000000,,,,N,,N,0,0,N,0,11534403,SPEC2,B,MI,850000000,0,0,850000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254028,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2350072,11534403,E,,,,,,,0,0,0,0,250000000,250000000,,,,N,,N,0,0,N,0,11534403,SPEC,B,MI,850000000,0,0,850000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254028,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2350072,11534403,E,,,,,,,0,0,0,0,250000000,250000000,,,,N,,N,0,0,N,0,11534403,OTHER,B,MI,850000000,0,0,850000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254031,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2350079,11534403,E,,,,,,,500000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,750000000,0,0,750000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254031,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2350080,11534403,E,,,,,,,500000,0,0,0,750000000,750000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,1000000000,0,0,1000000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254031,,,,,,A,2021-12-31,2022-12-30,11534403,GC1,Unknown,USD,,,,,,2350081,11534403,E,,,,,,,500000,0,0,0,1000000000,1000000000,,,,MI,,N,0,0,N,0,11534403,TIER1,B,B,1200000000,0,0,1200000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254032,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2350085,11534403,E,,,,,,,5000000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,ZONE 2,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1254036,,,,,,A,2022-03-15,2023-03-14,11534403,GC1,Unknown,USD,,,,,,2350099,11534403,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,11534403,SPL LOCA,B,MI,700000000,0,0,700000000,1,0,0,0,0,0,0,25000000,0,0,0,,,N,0,0,N,0 +1254036,,,,,,A,2022-03-15,2023-03-14,11534403,GC1,Unknown,USD,,,,,,2350099,11534403,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,11534403,AOP,B,MI,700000000,0,0,700000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1254047,,,,,,A,2022-03-31,2023-03-30,11534403,GC1,Unknown,USD,,,,,,2350134,11534403,E,,,,,,,500000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,TIER 1 LOCATIONS,B,B,300000000,0,0,300000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920686,,,,,,A,2022-02-01,2023-02-01,11534403,GC2,Unknown,USD,,,,,,2002697,11534403,B,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1_100K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920686,,,,,,A,2022-02-01,2023-02-01,11534403,GC2,Unknown,USD,,,,,,2002697,11534403,B,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS_TIER 1_10M LIM 75K DED,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,75000,0,0,0,,,N,0,0,N,0 +920689,,,,,,A,2022-01-28,2023-01-28,11534403,GC2,Unknown,USD,,,,,,2002709,11534403,E,,,,,,,2500000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,EXCL TIER 1,B,B,9,0,0,9,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +920690,,,,,,A,2022-02-01,2023-02-01,11534403,GC2,Unknown,USD,,,,,,2002713,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD3_5M DED,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +920693,,,,,,A,2022-02-01,2023-02-01,11534403,GC2,Unknown,USD,,,,,,2002726,11534403,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,1 LOC DED 100K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254964,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2353022,11534403,E,,,,,,,25000,500000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,11534403,SPEC1,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,50000,0,0,0,,,N,0,0,N,0 +1254964,,,,,,A,2022-06-30,2023-06-29,11534403,GC1,Unknown,USD,,,,,,2353022,11534403,E,,,,,,,25000,500000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,11534403,SPEC,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,25000,0,0,0,,,N,0,0,N,0 +1254074,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350229,11534403,E,,,,,,,500000,1000000,0,0,75000000,75000000,,,,MM,,N,0,0,N,0,11534403,FL STATE AND TIER 1 LOC.,B,B,125000000,0,0,125000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920710,,,,,,A,2022-01-31,2023-02-01,11534403,GC2,Unknown,USD,,,,,,2002810,11534403,B,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1 DED 100K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920710,,,,,,A,2022-01-31,2023-02-01,11534403,GC2,Unknown,USD,,,,,,2002810,11534403,B,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WST1 DED 250K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920729,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2002882,11534403,E,,,,,,,100000,25000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,5M-10M_500K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920729,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2002882,11534403,E,,,,,,,100000,25000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,2.5M-5M_250K DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920729,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2002882,11534403,E,,,,,,,100000,25000000,0,0,0,0,,,,MM,,N,0,0,N,0,11534403,G10M_1M DED,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920740,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2002926,11534403,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WST1 50K D,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920740,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2002926,11534403,E,,,,,,,250000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,EQJP 37.5M L 250K D,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920743,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2002937,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD3_500KDED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920743,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2002937,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1_WSUD2_250KDED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920751,,,,,,A,2022-03-01,2023-03-01,11534403,GC2,Unknown,USD,,,,,,2002957,11534403,E,,,,,,,10000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WST1 WST2_100K DED,B,B,100000000,0,0,100000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +920756,,,,,,A,2022-01-31,2023-01-31,11534403,GC2,Unknown,USD,,,,,,2002986,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUDF1 LIM 10M DED 500K,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920756,,,,,,A,2022-01-31,2023-01-31,11534403,GC2,Unknown,USD,,,,,,2002986,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSTIER 1 LIM 25M DED 500K,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +920801,,,,,,A,2022-04-01,2023-04-01,11534403,GC2,Unknown,USD,,,,,,2003162,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1_1M DED,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +920801,,,,,,A,2022-04-01,2023-04-01,11534403,GC2,Unknown,USD,,,,,,2003162,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WS_USER DEFINED 234_INCLUDED,B,B,75000000,0,0,75000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920808,,,,,,A,2022-04-01,2023-04-01,11534403,GC2,Unknown,USD,,,,,,2003183,11534403,E,,,,,,,25000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD_123_250K DED,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920812,,,,,,A,2022-04-01,2023-04-01,11534403,GC2,Unknown,USD,,,,,,2003193,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSUD1_WSUD2_250KDED,B,B,115000000,0,0,115000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920812,,,,,,A,2022-04-01,2023-04-01,11534403,GC2,Unknown,USD,,,,,,2003194,11534403,E,,,,,,,100000,0,0,0,115000000,115000000,,,,MI,,N,0,0,N,0,11534403,WSUD1_WSUD2_250KDED,B,B,300000000,0,0,300000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920814,,,,,,A,2022-03-15,2023-03-15,11534403,GC2,Unknown,USD,,,,,,2003208,11534403,E,,,,,,,2000000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,UD1 LIM 650M DED 25M,B,B,200000000,0,0,200000000,1,0,0,0,0,0,0,25000000,0,0,0,,,N,0,0,N,0 +920814,,,,,,A,2022-03-15,2023-03-15,11534403,GC2,Unknown,USD,,,,,,2003209,11534403,E,,,,,,,2000000,0,0,0,250000000,250000000,,,,MI,,N,0,0,N,0,11534403,UD1 LIM 650M DED 25M,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,25000000,0,0,0,,,N,0,0,N,0 +920814,,,,,,A,2022-03-15,2023-03-15,11534403,GC2,Unknown,USD,,,,,,2003210,11534403,E,,,,,,,2000000,0,0,0,350000000,350000000,,,,MI,,N,0,0,N,0,11534403,UD1 LIM 650M DED 25M,B,B,550000000,0,0,550000000,1,0,0,0,0,0,0,25000000,0,0,0,,,N,0,0,N,0 +920814,,,,,,A,2022-03-15,2023-03-15,11534403,GC2,Unknown,USD,,,,,,2003211,11534403,E,,,,,,,2000000,0,0,0,550000000,550000000,,,,MI,,N,0,0,N,0,11534403,UD1 LIM 650M DED 25M,B,B,650000000,0,0,650000000,1,0,0,0,0,0,0,25000000,0,0,0,,,N,0,0,N,0 +920819,,,,,,A,2022-04-01,2023-04-01,11534403,GC2,Unknown,USD,,,,,,2003230,11534403,E,,,,,,,100000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,WSFLT1 250K,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +920822,,,,,,A,2022-03-15,2023-03-15,11534403,GC2,Unknown,USD,,,,,,2003239,11534403,E,,,,,,,50000,0,0,0,0,0,,,,MI,,N,0,0,N,0,11534403,1M DED AOL,B,B,10000000,0,0,10000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254085,,,,,,A,2022-04-01,2023-04-01,11534403,GC1,Unknown,USD,,,,,,2350258,11534403,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,11534403,T1,B,MI,125000000,0,0,125000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254085,,,,,,A,2022-04-01,2023-04-01,11534403,GC1,Unknown,USD,,,,,,2350258,11534403,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,11534403,OTH,B,MI,125000000,0,0,125000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254101,,,,,,A,2022-05-15,2023-05-15,11534403,GC1,Unknown,USD,,,,,,2350301,11534403,E,,,,,,,100000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,T1,B,B,225000000,0,0,225000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254117,,,,,,A,2022-04-01,2023-04-01,11534403,GC1,Unknown,USD,,,,,,2350342,11534403,E,,,,,,,250000,0,0,0,1000000000,1000000000,,,,MI,,N,0,0,N,0,11534403,T2,B,B,1500000000,0,0,1500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254117,,,,,,A,2022-04-01,2023-04-01,11534403,GC1,Unknown,USD,,,,,,2350342,11534403,E,,,,,,,250000,0,0,0,1000000000,1000000000,,,,MI,,N,0,0,N,0,11534403,T1,B,B,1500000000,0,0,1500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254117,,,,,,A,2022-04-01,2023-04-01,11534403,GC1,Unknown,USD,,,,,,2350342,11534403,E,,,,,,,250000,0,0,0,1000000000,1000000000,,,,MI,,N,0,0,N,0,11534403,HI,B,B,1500000000,0,0,1500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254155,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2350446,11534403,E,,,,,,,2500000,15000000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,11534403,NWS T1 AND DO,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,2500000,0,0,0,,,N,0,0,N,0 +1254157,,,,,,A,2022-03-15,2023-03-14,11534403,GC1,Unknown,USD,,,,,,2350453,11534403,E,,,,,,,1000000,0,0,0,600000000,600000000,,,,MI,,N,0,0,N,0,11534403,SPE 1 LOCATIONS,B,B,1000000000,0,0,1000000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254161,,,,,,A,2022-03-01,2023-03-01,11534403,GC1,Unknown,USD,,,,,,2350462,11534403,E,,,,,,,500000,15000000,0,0,300000000,300000000,,,,MM,,N,0,0,N,0,11534403,SPEC,B,B,700000000,0,0,700000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254161,,,,,,A,2022-03-01,2023-03-01,11534403,GC1,Unknown,USD,,,,,,2350464,11534403,E,,,,,,,500000,15000000,0,0,400000000,400000000,,,,MM,,N,0,0,N,0,11534403,SPEC,B,B,700000000,0,0,700000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254177,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350513,11534403,E,,,,,,,1000000,15000000,0,0,10000000,10000000,,,,MM,,N,0,0,N,0,11534403,HIGH HAZARD WIND ZONES,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254177,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350524,11534403,E,,,,,,,1000000,15000000,0,0,200000000,200000000,,,,MM,,N,0,0,N,0,11534403,HIGH HAZARD WIND ZONES,B,B,25000000,0,0,25000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254182,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350522,11534403,E,,,,,,,100000,0,0,0,1000000000,1000000000,,,,MI,,N,0,0,N,0,11534403,TIER 1 COUNTIES EX FL,B,B,1200000000,0,0,1200000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254182,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350522,11534403,E,,,,,,,100000,0,0,0,1000000000,1000000000,,,,MI,,N,0,0,N,0,11534403,FL TRI COUNTIES,B,B,1200000000,0,0,1200000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254182,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350522,11534403,E,,,,,,,100000,0,0,0,1000000000,1000000000,,,,MI,,N,0,0,N,0,11534403,FL ALL OTHER COUNTIES,B,B,1200000000,0,0,1200000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254187,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350541,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,TIER 1,B,B,125000000,0,0,125000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254187,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350541,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,THE FALLS,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254187,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2350541,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,FL AND TX HARRIS,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254566,,,,,,A,2021-09-01,2022-08-31,11534403,GC1,Unknown,USD,,,,,,2351871,11534403,E,,,,,,,5000000,25000000,0,0,1000000000,1000000000,,,,MM,,N,0,0,N,0,11534403,T1,B,B,1500000000,0,0,1500000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1254566,,,,,,A,2021-09-01,2022-08-31,11534403,GC1,Unknown,USD,,,,,,2351871,11534403,E,,,,,,,5000000,25000000,0,0,1000000000,1000000000,,,,MM,,N,0,0,N,0,11534403,T2,B,B,1500000000,0,0,1500000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1254566,,,,,,A,2021-09-01,2022-08-31,11534403,GC1,Unknown,USD,,,,,,2351932,11534403,E,,,,,,,5000000,25000000,0,0,1500000000,1500000000,,,,MM,,N,0,0,N,0,11534403,T2,B,B,2000000000,0,0,2000000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1254566,,,,,,A,2021-09-01,2022-08-31,11534403,GC1,Unknown,USD,,,,,,2351932,11534403,E,,,,,,,5000000,25000000,0,0,1500000000,1500000000,,,,MM,,N,0,0,N,0,11534403,T1,B,B,2000000000,0,0,2000000000,1,0,0,0,0,0,0,5000000,0,0,0,,,N,0,0,N,0 +1254612,,,,,,A,2021-10-01,2022-09-30,11534403,GC1,Unknown,USD,,,,,,2352005,11534403,E,,,,,,,0,0,0,0,100000000,100000000,,,,N,,N,0,0,N,0,11534403,WS_T1,B,MI,300000000,0,0,300000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254638,,,,,,A,2021-11-01,2023-03-01,11534403,GC1,Unknown,USD,,,,,,2352105,11534403,E,,,,,,,10000000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,EXCLUDE ROW,B,B,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254638,,,,,,A,2021-11-01,2023-03-01,11534403,GC1,Unknown,USD,,,,,,2352105,11534403,E,,,,,,,10000000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,TIER 1,B,B,350000000,0,0,350000000,1,0,0,0,0,0,0,10000000,0,0,0,,,N,0,0,N,0 +1254645,,,,,,A,2021-11-15,2022-11-14,11534403,GC1,Unknown,USD,,,,,,2352124,11534403,E,,,,,,,250000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,T1,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254645,,,,,,A,2021-11-15,2022-11-14,11534403,GC1,Unknown,USD,,,,,,2352124,11534403,E,,,,,,,250000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,OTHER THAN TIER ZONES,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254645,,,,,,A,2021-11-15,2022-11-14,11534403,GC1,Unknown,USD,,,,,,2352124,11534403,E,,,,,,,250000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,FLORIDA,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,BALD HILLS BRIDGES,B,MI,193165650.00448722,0,0,193165650.00448722,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,MACROSSAN BRIDGE,B,MI,148855250.0034579,0,0,148855250.0034579,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,INNER CITY TUNNELS,B,MI,207705000.00482497,0,0,207705000.00482497,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,INDOOROOPILLY BRIDGES,B,MI,83082000.00193,0,0,83082000.00193,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,ELLIOTT RIVER BRIDGE,B,MI,38079250.00088458,0,0,38079250.00088458,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,DUTTON PARK FLYOVER,B,MI,41541000.000965,0,0,41541000.000965,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,CURRA CREEK (SOUTH) BRIDGE,B,MI,35309850.00082025,0,0,35309850.00082025,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,MOOLOOLAH - EUDLO TUNNEL,B,MI,24924600.000578996,0,0,24924600.000578996,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,MERIVALE BRIDGE,B,MI,214628500.0049858,0,0,214628500.0049858,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,TOOWOOMBA BRIDGE/TUNNEL,B,MI,42925700.00099716,0,0,42925700.00099716,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,OTHER BRIDGES TUNNELS,B,MI,24232250.000562914,0,0,24232250.000562914,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,NORTH PINE RIVER,B,MI,122545950.00284673,0,0,122545950.00284673,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,CHINAMAN CK BRIDGE,B,MI,37386900.0008685,0,0,37386900.0008685,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,BURDEKIN RIVER BRIDGE,B,MI,108698950.00252508,0,0,108698950.00252508,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,CRYSTAL CREEK BRIDGE,B,MI,34617500.00080416,0,0,34617500.00080416,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254659,,,,,,A,2021-11-30,2022-11-29,11534403,GC1,Unknown,USD,,,,,,2352173,11534403,E,,,,,,,5192625.000120625,0,0,0,311557500.0072375,311557500.0072375,,,,B,,N,0,0,N,0,11534403,COOMERA RIVER,B,MI,162009900.0037635,0,0,162009900.0037635,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254671,,,,,,A,2021-11-20,2022-11-19,11534403,GC1,Unknown,USD,,,,,,2352219,11534403,E,,,,,,,100000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,TIER 2- SECONDARY CRITICAL WS,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254671,,,,,,A,2021-11-20,2022-11-19,11534403,GC1,Unknown,USD,,,,,,2352219,11534403,E,,,,,,,100000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,TIER 1- CRITICAL WS,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254678,,,,,,A,2021-12-01,2022-11-30,11534403,GC1,Unknown,USD,,,,,,2352238,11534403,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,11534403,MF OTHER LOCATIONS (EX TX),B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254678,,,,,,A,2021-12-01,2022-11-30,11534403,GC1,Unknown,USD,,,,,,2352238,11534403,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,11534403,SINGLE FAMILY,B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254678,,,,,,A,2021-12-01,2022-11-30,11534403,GC1,Unknown,USD,,,,,,2352238,11534403,E,,,,,,,0,0,0,0,200000000,200000000,,,,N,,N,0,0,N,0,11534403,MF OTHER TX LOCATIONS,B,MI,500000000,0,0,500000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254715,,,,,,A,2022-01-01,2022-12-31,11534403,GC1,Unknown,USD,,,,,,2352329,11534403,E,,,,,,,500000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,SCHA,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254715,,,,,,A,2022-01-01,2022-12-31,11534403,GC1,Unknown,USD,,,,,,2352329,11534403,E,,,,,,,500000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,COLORADO KANSAS,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254715,,,,,,A,2022-01-01,2022-12-31,11534403,GC1,Unknown,USD,,,,,,2352331,11534403,E,,,,,,,500000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,SCHA,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254715,,,,,,A,2022-01-01,2022-12-31,11534403,GC1,Unknown,USD,,,,,,2352331,11534403,E,,,,,,,500000,0,0,0,100000000,100000000,,,,MI,,N,0,0,N,0,11534403,COLORADO KANSAS,B,B,150000000,0,0,150000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,5M - 10M,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,50MG,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,500K - 1M,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,25M - 50M,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,250K - 500K,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,2.5M - 5M,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,1M - 2.5M,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,10M - 25M,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,100K - 250K,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254724,,,,,,A,2022-03-01,2023-02-28,11534403,GC1,Unknown,USD,,,,,,2352366,11534403,E,,,,,,,0,25000000,0,0,350000000,350000000,,,,MA,,N,0,0,N,0,11534403,L100K,B,B,400000000,0,0,400000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254802,,,,,,A,2022-04-01,2023-03-31,11534403,GC1,Unknown,USD,,,,,,2352558,11534403,E,,,,,,,100000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,FLORIDA,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,100000,0,0,0,,,N,0,0,N,0 +1254806,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2352564,11534403,E,,,,,,,500000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,WS TIER 1,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254806,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2352564,11534403,E,,,,,,,500000,0,0,0,300000000,300000000,,,,MI,,N,0,0,N,0,11534403,AUSTRALIA,B,B,145802000,0,0,145802000,1,0,0,0,0,0,0,0,0,0,0,,,N,0,0,N,0 +1254820,,,,,,A,2022-04-15,2023-04-14,11534403,GC1,Unknown,USD,,,,,,2352602,11534403,E,,,,,,,100000,0,0,0,200000000,200000000,,,,MI,,N,0,0,N,0,11534403,UTILITIES LOCATIONS,B,B,500000000,0,0,500000000,1,0,0,0,0,0,0,500000,0,0,0,,,N,0,0,N,0 +1254864,,,,,,A,2022-05-30,2023-05-29,11534403,GC1,Unknown,USD,,,,,,2352724,11534403,E,,,,,,,100000,0,0,0,150000000,150000000,,,,MI,,N,0,0,N,0,11534403,TIER 1,B,B,250000000,0,0,250000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254883,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2352775,11534403,E,,,,,,,250000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,11534403,TDPR,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254883,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2352775,11534403,E,,,,,,,250000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,11534403,AOP,B,B,4500000000,0,0,4500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254883,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2352783,11534403,E,,,,,,,250000,0,0,0,2000000000,2000000000,,,,MI,,N,0,0,N,0,11534403,TDPR,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254883,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2352783,11534403,E,,,,,,,250000,0,0,0,2000000000,2000000000,,,,MI,,N,0,0,N,0,11534403,AOP,B,B,4500000000,0,0,4500000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 +1254883,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2352785,11534403,E,,,,,,,250000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,11534403,TDPR,B,B,50000000,0,0,50000000,1,0,0,0,0,0,0,250000,0,0,0,,,N,0,0,N,0 +1254883,,,,,,A,2022-05-01,2023-04-30,11534403,GC1,Unknown,USD,,,,,,2352785,11534403,E,,,,,,,250000,0,0,0,500000000,500000000,,,,MI,,N,0,0,N,0,11534403,AOP,B,B,2000000000,0,0,2000000000,1,0,0,0,0,0,0,1000000,0,0,0,,,N,0,0,N,0 diff --git a/ods_tools/odtf/examples/cede_location_1000.csv b/ods_tools/odtf/examples/cede_location_1000.csv new file mode 100644 index 00000000..25ea97ba --- /dev/null +++ b/ods_tools/odtf/examples/cede_location_1000.csv @@ -0,0 +1,101 @@ +ContractID,LocationID,LocationName,ISOBIN,LocationGroup,IsPrimary,IsTenant,InceptionDate,ExpirationDate,Street,City,SubArea2,SubArea,Area,CRESTA,PostalCode,CountryISO,Latitude,Longitude,UserGeocodeMatchLevel,GeocoderCode,EnhancedGeoMatchLevelCode,GeocoderAccountId,BuildingValue,OtherValue,ContentsValue,TimeElementValue,DaysCovered,Currency,RiskCount,Premium,ConstructionCodeType,ConstructionCode,ConstructionOther,OccupancyCodeType,OccupancyCode,YearBuilt,NumberOfStories,GrossArea,GrossAreaUnit,BuildingHeight,BuildingHeightUnitCode,Territory,NonCATGroundUpLoss,UDF1,UDF2,UDF3,UDF4,UDF5,LocationDFID,SubareaName,ISOConstructionCode,ISOOccupancyCode,FloorArea,FloorAreaUnitCode,FloorsOccupied,CustomFloodSOP,CustomFloodSOPType,CustomFloodZone,DefensibleSpace,FirewiseCommunityParticipation,FloorOfInterest,BuildingCondition,BuildingShape,Torsion,SoftStory,ShapeIrregularity,SpecialConstruction,Retrofit,ShortColumn,Ornamentation,WaterHeater,Redundancy,TallOneStory,Equipment,SealOfApproval,RoofGeometry,RoofPitch,RoofCover,RoofDeck,RoofCoverAttachment,RoofDeckAttachment,RoofAnchorage,RoofAttachedStructure,RoofYearBuilt,Tank,RoofHailImpactResistance,,WallType,WallSiding,GlassType,GlassPercent,WindowProtection,ExternalDoors,BuildingExteriorOpening,BrickVeneer,FoundationConnection,FoundationType,InternalPartition,Welding,TransitionInSRC,MultiStoryHallType,LatticeType,IsValueType,ColumnBasement,ColdFormedTube,AttachedStructures,AppurtenantStructures,Pounding,TreeExposure,SmallDebris,LargeMissile,TerrainRoughness,AdjacentBuildingHeight,ProjectCompletion,ProjectPhaseCode,BasementLevelCount,BasementFinishType,CustomElevation,CustomElevationUnit,BaseFloodElevation,BaseFloodElevationUnit,FirstFloorHeight,FirstFloorHeightUnit,ServiceEquipmentProtection,WetFloodProofing,FIRMCompliance,ContentVulnerability,CertifiedStructuresIBHS,PPCCode,IsFireSprinklerAvailable,ContentDamageability,CargoPacking,CargoProtection,SpecieStorage,SprinklerType,SalvagePotential,LocPerils,LocLimitType,LimitBldg,LimitOther,LimitContent,LimitTime,Participation1,Participation2,DeductType,DeductBldg,DeductOther,DeductContent,DeductTime,AggregateLimitType,AggregateLimit,MinMaxDeductType,MinDeduct,MaxDeduct,AggregateDeductType,AggregateDeduct +1254209,11358392,1,,,0,0,2022-05-01,2023-04-30,,,,,,BEL_3,3001,BE,50.86549,4.67937,,UN,USER,,0,0,4502825,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358401,10,,,0,0,2022-05-01,2023-04-30,,,,Hefei - Xishi Qu,Anhui,,,CN,31.86141,117.27562,,UN,,,206141,0,409903,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,5412.9274,SQFT,0,,,0,,,,,,,Hefei - Xishi Qu,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CH,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358491,100,,,0,0,2022-05-01,2023-04-30,,,,Queenstown,,Singapore,117556,SG,1.29865,103.77548,,UN,,,0,0,5980828,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Queenstown,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,EQ,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358492,101,,,0,0,2022-05-01,2023-04-30,,,,Queenstown,,Singapore,117684,SG,1.28847,103.779518,,UN,,,0,0,5219727,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Queenstown,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,FF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358493,102,,,0,0,2022-05-01,2023-04-30,,,,Downtown Core,,Singapore,178880,SG,1.289436,103.84998,,UN,,,4557206,0,220941,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,574.9994,SQFT,0,,,0,,,,,,,Downtown Core,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,HL,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358494,103,,,0,0,2022-05-01,2023-04-30,,,,Queenstown,,Singapore,138542,SG,1.29916,103.789726,,UN,,,2012640,0,980397,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,5142.0407,SQFT,0,,,0,,,,,,,Queenstown,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,IF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358495,104,,,0,0,2022-05-01,2023-04-30,,,,Queenstown,,Singapore,117528,SG,1.28967,103.778549,,UN,,,0,0,1688952,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Queenstown,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LQ,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358496,105,,,0,0,2022-05-01,2023-04-30,,,,Woodlands,,Singapore,757178,SG,1.45156,103.79807,,UN,,,535222,0,34133,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,938.9996,SQFT,0,,,0,,,,,,,Woodlands,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358497,106,,,0,0,2022-05-01,2023-04-30,,,,Pioneer,,Singapore,627751,SG,1.31963,103.69475,,UN,,,0,0,51475,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,Pioneer,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,NC,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358498,107,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,456,KR,37.082703,127.26171,,UN,,,0,0,5750862,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PD,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358499,108,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,463,KR,37.367679,127.141626,,UN,,,121392,0,5842869,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,30384.9321,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358500,109,,,0,0,2022-05-01,2023-04-30,,,,,,Chungcheongbuk-do,361,KR,36.624512,127.428482,,UN,,,0,0,1223843,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PN,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358402,11,,,0,0,2022-05-01,2023-04-30,,,,Fuyang - Taihe Xian,Anhui,,,CN,33.477863,115.47539,,UN,,,0,0,70321,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Fuyang - Taihe Xian,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SB,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358501,110,,,0,0,2022-05-01,2023-04-30,,,,,,Chungcheongnam-do,330,KR,36.813519,127.107323,,UN,,,0,0,1625450,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SL,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358502,111,,,0,0,2022-05-01,2023-04-30,,,,,,Gyeingsangbuk-do,730,KR,36.15088,128.414016,,UN,,,0,0,49947,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,1327.8991,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,ST,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358503,112,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,467,KR,37.28442,127.429489,,UN,,,0,0,3333489,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,14721.0689,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SU,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358504,113,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,451,KR,37.033743,126.930652,,UN,,,0,0,6624062,0,365,USD,1,0,AIR,100,100,AIR,327,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SW,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358505,114,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,447,KR,37.21331,127.094727,,UN,,,0,0,5045722,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TC,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358506,115,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,426,KR,37.23894,126.88228,,UN,,,0,0,1451128,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,11633.7786,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TD,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358507,116,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,445,KR,37.199268,126.985329,,UN,,,0,0,957708,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TR,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358508,117,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,404,KR,37.480901,126.675951,,UN,,,0,0,0,28500000,365,USD,1,0,AIR,100,100,AIR,327,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358509,118,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,406,KR,37.374853,126.644578,,UN,,,0,0,811698,59600000,365,USD,1,0,AIR,100,100,AIR,327,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,WF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358510,119,,,0,0,2022-05-01,2023-04-30,,,,,,Jeollanam-do,534,KR,35.03716,126.35163,,UN,,,0,0,1002653,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,WS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358403,12,,,0,0,2022-05-01,2023-04-30,,,,Kunming - Shilin Yi Zizhixian,Yunnan,,,CN,24.759212,103.2255,,UN,,,0,0,235587,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,3691.1568,SQFT,0,,,0,,,,,,,Kunming - Shilin Yi Zizhixian,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358511,120,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,413,KR,37.721841,126.72235,,UN,,,0,0,303573,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,3461.7577,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CH,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358512,121,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,450,KR,37.03909,127.072212,,UN,,,5026113,0,5529768,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,60045.9464,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,EQ,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358513,122,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,451,KR,37.034213,126.941794,,UN,,,0,0,9485880,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,FF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358514,123,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,450,KR,36.99073,127.08236,,UN,,,0,0,0,7900000,365,USD,1,0,AIR,100,100,AIR,327,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,HL,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358515,124,,,0,0,2022-05-01,2023-04-30,,,,,,GyeongGi-do,446,KR,37.29103,127.09969,,UN,,,0,0,48099720,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,IF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358516,125,,,0,0,2022-05-01,2023-04-30,,,,,,Hsinchu,300,TW,24.780339,121.001506,,UN,,,316116,0,17299650,0,365,USD,1,0,AIR,100,100,AIR,318,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LQ,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358517,126,,,0,0,2022-05-01,2023-04-30,,,,,,Hsinchu,300,TW,24.78082,121.001639,,UN,,,10299431,0,5112107,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,107308.5962,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358518,127,,,0,0,2022-05-01,2023-04-30,,,,,,Hsinchu,300,TW,24.780595,120.997244,,UN,,,0,0,2571120,0,365,USD,1,0,AIR,100,100,AIR,323,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,NC,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358519,128,,,0,0,2022-05-01,2023-04-30,,,,,,Hsinchu,300,TW,24.775079,121.010309,,UN,,,0,0,88411,0,365,USD,1,0,AIR,100,100,AIR,323,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PD,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358520,129,,,0,0,2022-05-01,2023-04-30,,,,,,Kaohsiung Pingtung,814,TW,22.7012,120.325779,,UN,,,0,0,99338,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358404,13,,,0,0,2022-05-01,2023-04-30,,,,Nanjing - Qixia Qu,Jiangsu,,,CN,32.108707,118.96286,,UN,,,0,0,110478,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,1472.6484,SQFT,0,,,0,,,,,,,Nanjing - Qixia Qu,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PN,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358521,130,,,0,0,2022-05-01,2023-04-30,,,,,,Taoyuan,333,TW,25.055689,121.361299,,UN,,,0,0,1234484,0,365,USD,1,0,AIR,100,100,AIR,318,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SB,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358522,131,,,0,0,2022-05-01,2023-04-30,,,,,,Taoyuan,333,TW,25.055689,121.361299,,UN,,,27745,0,1027394,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,10651.9059,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SL,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358523,132,,,0,0,2022-05-01,2023-04-30,,,,,,Taichung,428,TW,24.224969,120.629899,,UN,,,0,0,1558616,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,19327.404,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,ST,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358524,133,,,0,0,2022-05-01,2023-04-30,,,,,,Taichung,421,TW,24.315292,120.730042,,UN,,,0,0,486872,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SU,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358525,134,,,0,0,2022-05-01,2023-04-30,,,,,,Chiai Tainan Penghu Islands,741,TW,23.12496,120.26218,,UN,,,123885891,0,80706952,590000000,365,USD,1,0,AIR,100,100,AIR,456,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SW,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358526,135,,,0,0,2022-05-01,2023-04-30,,,,,,Chiai Tainan Penghu Islands,741,TW,23.10952,120.27952,,UN,,,20177381,0,13396900,125900000,365,USD,1,0,AIR,100,100,AIR,456,0,0,41593.2468,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TC,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358527,136,,,0,0,2022-05-01,2023-04-30,,,,,,Chiai Tainan Penghu Islands,741,TW,23.111128,120.27713,,UN,,,17213302,0,3880526,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,112934.0078,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TD,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358528,137,,,0,0,2022-05-01,2023-04-30,,,,,,Chiai Tainan Penghu Islands,741,TW,23.111128,120.27713,,UN,,,7762162,0,6066681,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,29351.2787,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TR,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358529,138,,,0,0,2022-05-01,2023-04-30,,,,,,Chiai Tainan Penghu Islands,741,TW,23.101962,120.26578,,UN,,,0,0,16270332,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358530,139,,,0,0,2022-05-01,2023-04-30,,,,,,Taoyuan,338,TW,25.0527,121.27627,,UN,,,0,0,311153131,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,WF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358405,14,,,0,0,2022-05-01,2023-04-30,,,,Shanghai - Jinshan Qu,Shanghai,,,CN,30.869814,121.32217,,UN,,,0,0,0,13100000,365,USD,1,0,AIR,100,100,AIR,456,0,0,0,SQFT,0,,,0,,,,,,,Shanghai - Jinshan Qu,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,WS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358531,140,,,0,0,2022-05-01,2023-04-30,,,,,,Taoyuan,326,TW,24.937262,121.141655,,UN,,,0,0,166494,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358532,141,,,0,0,2022-05-01,2023-04-30,,,,,,Hsinchu,302,TW,24.84242,121.01757,,UN,,,0,0,0,3000000,365,USD,1,0,AIR,100,100,AIR,323,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CH,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358533,142,,,0,0,2022-05-01,2023-04-30,,,,RG2 6,Reading,,RG2 6UB,GB,51.42468,-0.98652,,UN,USER,,0,0,128487,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,1229.6195,SQFT,0,,,0,,,,,,,RG2 6,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,EQ,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358534,143,,,0,0,2022-05-01,2023-04-30,FULLER ROAD CAMPUS,ALBANY,,Albany,New York,,12203,US,42.691151,-73.833755,,UN,USER,,0,0,34618013,0,365,USD,1,0,AIR,100,100,AIR,456,0,0,0,SQFT,0,,,0,,,,,,,Albany,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,FF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358535,144,,,0,0,2022-05-01,2023-04-30,FULLER ROAD CAMPUS,ALBANY,,Albany,New York,,12203,US,42.691151,-73.833755,,UN,USER,,0,0,15000000,0,365,USD,1,0,AIR,100,100,AIR,456,0,0,0,SQFT,0,,,0,,,,,,,Albany,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,HL,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358536,145,,,0,0,2022-05-01,2023-04-30,255 257 FULLER RD,ALBANY,,Albany,New York,,12203,US,42.690495,-73.830791,,UN,USER,,59208,0,4879575,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,2576.2297,SQFT,0,,,0,,,,,,,Albany,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,IF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358537,146,,,0,0,2022-05-01,2023-04-30,10801 GILES RD,AUSTIN,,Travis,Texas,,78754,US,30.339393,-97.61385,,UN,USER,,80357851,0,129614084,3216400000,365,USD,1,0,AIR,100,100,AIR,456,0,0,344904.8614,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LQ,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358538,147,,,0,0,2022-05-01,2023-04-30,9700 US 290E,AUSTIN,,Travis,Texas,,78754,US,30.334965,-97.614345,,UN,USER,,71090002,0,45707099,883115000,365,USD,1,0,AIR,100,100,AIR,456,0,0,374757.1564,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358539,148,,,0,0,2022-05-01,2023-04-30,9700 US 290E,AUSTIN,,Travis,Texas,,78754,US,30.335433,-97.616201,,UN,USER,,44849393,0,16277057,892800000,365,USD,1,0,AIR,100,100,AIR,456,0,0,198810.5495,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,NC,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358540,149,,,0,0,2022-05-01,2023-04-30,9700 US 290E,AUSTIN,,Travis,Texas,,78754,US,30.337378,-97.617714,,UN,USER,,35389301,0,15046171,450200000,365,USD,1,0,AIR,100,100,AIR,456,0,0,180565.188,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PD,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358406,15,,,0,0,2022-05-01,2023-04-30,,,,Shanghai - Pudong Xinqu,Shanghai,,,CN,31.216642,121.62899,,UN,,,52700,0,5403323,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Shanghai - Pudong Xinqu,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358541,150,,,0,0,2022-05-01,2023-04-30,9700 US 290E,AUSTIN,,Travis,Texas,,78754,US,30.334803,-97.61894,,UN,USER,,84000000,0,185779165,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,723500,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PN,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358542,151,,,0,0,2022-05-01,2023-04-30,9700 US 290E,AUSTIN,,Travis,Texas,,78754,US,30.341347,-97.614558,,UN,USER,,41646241,0,149800184,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,244666.2036,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SB,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358543,152,,,0,0,2022-05-01,2023-04-30,9700 US 290E,AUSTIN,,Travis,Texas,,78754,US,30.336313,-97.617349,,UN,USER,,35783903,0,27135537,105000000,365,USD,1,0,AIR,100,100,AIR,456,0,0,169430.0877,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SL,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358544,153,,,0,0,2022-05-01,2023-04-30,10000 SPECTRUM,AUSTIN,,Williamson,Texas,,78717,US,30.481878,-97.779006,,UN,USER,,30845654,0,87227136,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,163734.5605,SQFT,0,,,0,,,,,,,Williamson,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,ST,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358545,154,,,0,0,2022-05-01,2023-04-30,905 W HOWARD LANE,AUSTIN,,Travis,Texas,,78753,US,30.41761,-97.66532,,UN,USER,,0,0,52336284,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SU,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358546,155,,,0,0,2022-05-01,2023-04-30,810 W HOWARD LN,AUSTIN,,Travis,Texas,,78660,US,30.42378,-97.66241,,UN,USER,,0,0,49484273,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,144597.6185,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SW,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358547,156,,,0,0,2022-05-01,2023-04-30,710 W HOWARD LANE,AUSTIN,,Travis,Texas,,78660,US,30.421236,-97.661857,,UN,USER,,0,0,16822162,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,86389.4186,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TC,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358548,157,,,0,0,2022-05-01,2023-04-30,710 W HOWARD LANE,AUSTIN,,Travis,Texas,,78660,US,30.421494,-97.661688,,UN,USER,,0,0,0,1151000,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,Travis,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TD,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358549,158,,,0,0,2022-05-01,2023-04-30,8000 S FEDERAL WAY,BOISE,,Ada,Idaho,,83716,US,43.529258,-116.146979,,UN,USER,,0,0,5279330,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,Ada,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TR,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358550,159,,,0,0,2022-05-01,2023-04-30,4095 S GAKELER LANE,BOISE,,Ada,Idaho,,83705,US,43.565256,-116.184107,,UN,USER,,0,0,3522440,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,Ada,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358407,16,,,0,0,2022-05-01,2023-04-30,,,,Shanghai - Pudong Xinqu,Shanghai,,,CN,31.216642,121.62899,,UN,,,52700,0,5403323,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Shanghai - Pudong Xinqu,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,WF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358551,160,,,0,0,2022-05-01,2023-04-30,6675 S EISENMANN,BOISE,,Ada,Idaho,,83716,US,43.541198,-116.167906,,UN,USER,,0,0,2321352,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,7284.8852,SQFT,0,,,0,,,,,,,Ada,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,WS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358552,161,,,0,0,2022-05-01,2023-04-30,6401 S EISENMAN ROAD,BOISE,,Ada,Idaho,,83716,US,43.543644,-116.166362,,UN,USER,,0,0,1896874,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Ada,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358553,162,,,0,0,2022-05-01,2023-04-30,5101 CASS AVENUE,DETROIT,,Wayne,Michigan,,48202,US,42.356637,-83.067183,,UN,USER,,0,0,205443,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,1173,SQFT,0,,,0,,,,,,,Wayne,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CH,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358554,163,,,0,0,2022-05-01,2023-04-30,2531 ROUTE 52,FISHKILL,,Dutchess,New York,,12533,US,41.554797,-73.78894,,UN,USER,,0,0,471878,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,13098.7154,SQFT,0,,,0,,,,,,,Dutchess,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,EQ,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358555,164,,,0,0,2022-05-01,2023-04-30,49235 MILMONT DR,FREMONT,,Alameda,California,,94538,US,37.457358,-121.919639,,UN,USER,,0,0,5726931,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,Alameda,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,FF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358556,165,,,0,0,2022-05-01,2023-04-30,35 DORY ROAD,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.6274,-70.65173,,UN,USER,,71368000,0,72614500,698247000,365,USD,1,0,AIR,100,100,AIR,456,0,0,227473.6045,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,HL,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358557,166,,,0,0,2022-05-01,2023-04-30,14 20 BLACKBURN CENTER,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.62561,-70.652339,,UN,USER,,9751063,0,40806700,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,44009.5381,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,IF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358558,167,,,0,0,2022-05-01,2023-04-30,80 BLACKBURN CENTER,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.623862,-70.652808,,UN,USER,,487268,0,31973466,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,41302.6666,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LQ,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358559,168,,,0,0,2022-05-01,2023-04-30,14 BLACKBURN DRIVE,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.626755,-70.6537,,UN,USER,,9167245,0,5017975,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,43969.4295,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358560,169,,,0,0,2022-05-01,2023-04-30,30 31 BLACKBURN CENTER,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.62588,-70.650872,,UN,USER,,3897827,0,1295897,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,12202.2454,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,NC,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358408,17,,,0,0,2022-05-01,2023-04-30,,,,Shanghai - Baoshan Qu,Shanghai,,,CN,31.35071,121.38715,,UN,,,0,0,2141333,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,3367.2463,SQFT,0,,,0,,,,,,,Shanghai - Baoshan Qu,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PD,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358561,170,,,0,0,2022-05-01,2023-04-30,35 DORY ROAD,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.628002,-70.651166,,UN,USER,,438809,0,3870328,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,5584.0555,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358562,171,,,0,0,2022-05-01,2023-04-30,52R BLACKBURN CENTER,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.624819,-70.651789,,UN,USER,,351553,0,2752653,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,4647.5118,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,PN,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358563,172,,,0,0,2022-05-01,2023-04-30,21 POND RD,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.626819,-70.642721,,UN,USER,,0,0,1187652,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,22327.5618,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SB,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358564,173,,,0,0,2022-05-01,2023-04-30,35 DORY ROAD,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.628002,-70.651166,,UN,USER,,632294,0,73665,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,3693.1513,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SL,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358565,174,,,0,0,2022-05-01,2023-04-30,79 BLACKBURN CENTER,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.623321,-70.651613,,UN,USER,,313719,0,379308,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,8611.513,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,ST,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358566,175,,,0,0,2022-05-01,2023-04-30,45 BLACKBURN CENTER,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.624503,-70.652773,,UN,USER,,0,0,477407,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,6150.434,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SU,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358567,176,,,0,0,2022-05-01,2023-04-30,35 DORY ROAD,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.628002,-70.651166,,UN,USER,,251690,0,51157,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,1342.2083,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,SW,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358568,177,,,0,0,2022-05-01,2023-04-30,70 BLACKBURN CENTER,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.623321,-70.651613,,UN,USER,,30529,0,208103,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TC,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358569,178,,,0,0,2022-05-01,2023-04-30,77 BLACKBURN CENTER,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.623321,-70.651613,,UN,USER,,0,0,128480,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,8191.5729,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TD,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358570,179,,,0,0,2022-05-01,2023-04-30,78 BLACKBURN CENTER,GLOUCESTER,,Essex,Massachusetts,,1930,US,42.623321,-70.651613,,UN,USER,,0,0,26235,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,8648.3299,SQFT,0,,,0,,,,,,,Essex,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TR,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358409,18,,,0,0,2022-05-01,2023-04-30,,,,Shanghai - Pudong Xinqu,Shanghai,,,CN,31.216642,121.62899,,UN,,,0,0,2023126,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Shanghai - Pudong Xinqu,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,TS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358571,180,,,0,0,2022-05-01,2023-04-30,3030 NE ALOCLEK DRIVE,HILLSBORO,,Washington,Oregon,,97124,US,45.541545,-122.892396,,UN,USER,,0,0,7297582,0,365,USD,1,0,AIR,100,100,AIR,456,0,0,0,SQFT,0,,,0,,,,,,,Washington,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,WF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358572,181,,,0,0,2022-05-01,2023-04-30,3085 NE BROOKWOOD PARKWAY,HILLSBORO,,Washington,Oregon,,97124,US,45.546526,-122.935222,,UN,USER,,0,0,7297582,0,365,USD,1,0,AIR,100,100,AIR,456,0,0,0,SQFT,0,,,0,,,,,,,Washington,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,WS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358573,182,,,0,0,2022-05-01,2023-04-30,8875 NE VON NEUMANN DRIVE,HILLSBORO,,Washington,Oregon,,97006,US,45.532103,-122.887909,,UN,USER,,0,0,7004718,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,22246.0662,SQFT,0,,,0,,,,,,,Washington,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358574,183,,,0,0,2022-05-01,2023-04-30,21421 NW JACOBSON RD,HILLSBORO,,Washington,Oregon,,97124,US,45.56506,-122.897037,,UN,USER,,5172019,0,18546,0,365,USD,1,0,AIR,100,100,AIR,313,0,0,0,SQFT,0,,,0,,,,,,,Washington,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,CH,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358575,184,,,0,0,2022-05-01,2023-04-30,7395 N E EVERGREEN PARKWAY,HILLSBORO,,Washington,Oregon,,97124,US,45.547901,-122.902542,,UN,USER,,0,0,3919359,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,28124.0856,SQFT,0,,,0,,,,,,,Washington,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,EQ,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358576,185,,,0,0,2022-05-01,2023-04-30,8875 NE VON NEUMANN DRIVE,HILLSBORO,,Washington,Oregon,,97006,US,45.532103,-122.887909,,UN,USER,,0,0,2440415,0,365,USD,1,0,AIR,100,100,AIR,323,0,0,0,SQFT,0,,,0,,,,,,,Washington,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,FF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358577,186,,,0,0,2022-05-01,2023-04-30,21515 NW EVERGREEN PARKWAY,HILLSBORO,,Washington,Oregon,,97124,US,45.547238,-122.898753,,UN,USER,,0,0,2264564,0,365,USD,1,0,AIR,100,100,AIR,323,0,0,0,SQFT,0,,,0,,,,,,,Washington,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,HL,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358578,187,,,0,0,2022-05-01,2023-04-30,7245 NW EVERGREEN PARKWAY,HILLSBORO,,Washington,Oregon,,97124,US,45.547031,-122.903526,,UN,USER,,0,0,1896874,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Washington,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,IF,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358579,188,,,0,0,2022-05-01,2023-04-30,655 W RESERVE DR,KALISPELL,,Flathead,Montana,,59901,US,48.24273,-114.31472,,UN,USER,,41576700,0,92729900,60200000,365,USD,1,0,AIR,100,100,AIR,456,0,0,165422.9775,SQFT,0,,,0,,,,,,,Flathead,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LO,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358580,189,,,0,0,2022-05-01,2023-04-30,3850 US HWY 2,KALISPELL,,Flathead,Montana,,59901,US,48.293002,-114.257584,,UN,USER,,4003164,0,15125000,16000000,365,USD,1,0,AIR,100,100,AIR,456,0,0,79453.4019,SQFT,0,,,0,,,,,,,Flathead,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,LS,C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 diff --git a/ods_tools/odtf/examples/example_config.yaml b/ods_tools/odtf/examples/example_config.yaml new file mode 100644 index 00000000..ca34d2b2 --- /dev/null +++ b/ods_tools/odtf/examples/example_config.yaml @@ -0,0 +1,35 @@ +transformations: + loc: # Transformation name + input_format: + name: Cede_Location + version: 10.0.0 + output_format: + name: OED_Location + version: 3.0.2 + runner: + batch_size: 150000 # Number of rows to process in a single batch + extractor: + options: + path: ./cede_location_1000.csv # Path to the input file + quoting: minimal + loader: + options: + path: ./oed_location_1000.csv # Path to the output file + quoting: minimal + acc: # Transformation name + input_format: + name: Cede_Contract + version: 10.0.0 + output_format: + name: OED_Contract + version: 3.0.2 + runner: + batch_size: 10000 + extractor: + options: + path: ./cede_contract_1000.csv + quoting: minimal + loader: + options: + path: ./oed_contract_1000.csv + quoting: minimal diff --git a/ods_tools/odtf/files/__init__.py b/ods_tools/odtf/files/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/ods_tools/odtf/files/csv.py b/ods_tools/odtf/files/csv.py new file mode 100644 index 00000000..d08df727 --- /dev/null +++ b/ods_tools/odtf/files/csv.py @@ -0,0 +1,43 @@ +import csv +from io import StringIO, TextIOBase +from typing import Dict, Iterable + + +class BufferedCsvReader(TextIOBase): + """ + Provides the source as a csv file like object. This helps some data + processors as they are happier reading files rather than working on + iterables. + + :param source: The iterable to build the csv from + :param buffer: The current stored data + """ + + def __init__(self, source): + self.source: Iterable[Dict[str, any]] = iter(source) + self.buffer: str = "" + self._first: bool = True + + def read(self, size=None): + csv_file = StringIO(self.buffer) + + while len(csv_file.getvalue()) < size: + try: + entry = next(self.source) + writer = csv.DictWriter( + csv_file, + fieldnames=entry.keys(), + ) + + if self._first: + self._first = False + writer.writeheader() + + writer.writerow(entry) + except StopIteration: + break + + csv_content = csv_file.getvalue() + response, self.buffer = csv_content[:size], csv_content[size:] + + return response diff --git a/ods_tools/odtf/files/yaml.py b/ods_tools/odtf/files/yaml.py new file mode 100644 index 00000000..0f75a733 --- /dev/null +++ b/ods_tools/odtf/files/yaml.py @@ -0,0 +1,26 @@ +from typing import Dict, List, Union + +import yaml + + +def write_yaml(path: str, content: Union[Dict, List]): + """ + Writes the provided content to the provided path + + :param path: The path to write the data to + :param content: The data to write + """ + with open(path, "w") as f: + yaml.safe_dump(content, f) + + +def read_yaml(path): + """ + Reads the yaml data from the provided path + + :param path: The path to read the data from + + :return: The loaded data + """ + with open(path, encoding="utf8") as f: + return yaml.load(f, yaml.SafeLoader) diff --git a/ods_tools/odtf/log.py b/ods_tools/odtf/log.py new file mode 100644 index 00000000..827f4ae7 --- /dev/null +++ b/ods_tools/odtf/log.py @@ -0,0 +1,40 @@ +import logging +from datetime import datetime + +import yaml + +from .config import TransformationConfig +from .mapping import BaseMapping + + +def get_logger(): + return logging.getLogger(__name__) + + +def log_metadata(config: TransformationConfig, mapping: BaseMapping): + get_logger().info( + yaml.safe_dump( + [ + { + "file_type": mapping.file_type, + "input_format": mapping.input_format._asdict(), + "output_format": mapping.output_format._asdict(), + "transformation_path": [ + { + "input_format": edge[ + "spec" + ].input_format._asdict(), + "output_format": edge[ + "spec" + ].output_format._asdict(), + **edge["spec"].metadata, + } + for edge in mapping.path_edges + ], + "date_of_conversion": datetime.now().isoformat(), + **config.root_config.get("metadata", {}), + **config.get("metadata", {}), + } + ] + ) + ) diff --git a/ods_tools/odtf/mapping/__init__.py b/ods_tools/odtf/mapping/__init__.py new file mode 100644 index 00000000..80566a2e --- /dev/null +++ b/ods_tools/odtf/mapping/__init__.py @@ -0,0 +1,10 @@ +from .base import BaseMapping, MappingSpec +from .file import FileMapping, FileMappingSpec + + +__all__ = [ + "BaseMapping", + "MappingSpec", + "FileMapping", + "FileMappingSpec", +] diff --git a/ods_tools/odtf/mapping/base.py b/ods_tools/odtf/mapping/base.py new file mode 100644 index 00000000..64d8162f --- /dev/null +++ b/ods_tools/odtf/mapping/base.py @@ -0,0 +1,256 @@ +import logging +from typing import ( + Dict, + Iterable, + List, + NamedTuple, + Optional, + Reversible, + Set, + Union, +) + +import networkx as nx +from lark import Tree + +from ..config import TransformationConfig +from .errors import NoConversionPathError +from ..transformers.transform import parse + + +logger = logging.getLogger(__name__) + + +class TransformationEntry: + def __init__( + self, + transformation: str, + transformation_tree: Union[Tree, None] = None, + when: str = "True", + when_tree: Union[Tree, None] = None, + ): + self.transformation = transformation + self.transformation_tree = transformation_tree + self.when = when + self.when_tree = when_tree + + def __eq__(self, other): + return ( + self.transformation == other.transformation + and self.when == other.when + ) + + def parse(self): + self.when_tree = parse(self.when) + self.transformation_tree = parse(self.transformation) + + +TransformationSet = Dict[str, List[TransformationEntry]] + + +class ColumnConversion(NamedTuple): + type: str + nullable: bool = True + null_values: Set = set() + + +ColumnConversions = Dict[str, ColumnConversion] + + +class MappingFormat(NamedTuple): + name: str + version: str + + +class DirectionalMapping(NamedTuple): + input_format: MappingFormat + output_format: MappingFormat + transformation_set: TransformationSet + types: Dict[str, ColumnConversion] = dict() + null_values: Set = set() + + +class MappingSpec: + """ + Class holding information about a given mapping + """ + + def __init__( + self, + file_type: str, + input_format: MappingFormat, + output_format: MappingFormat, + forward: DirectionalMapping = None, + reverse: DirectionalMapping = None, + metadata: Dict = None, + ): + self.file_type = file_type + self.input_format = input_format + self.output_format = output_format + self.forward = forward + self.reverse = reverse + self.metadata = metadata or {} + + @property + def can_run_forwards(self): + """ + Flag whether the mapping file can be applied forwards. + + :return: True is the mapping can be applied forwards, False otherwise + """ + return ( + self.forward is not None + and len(self.forward.transformation_set) > 0 + ) + + @property + def can_run_in_reverse(self): + """ + Flag whether the mapping file can be applied in reverse. + + :return: True is the mapping can be applied in reverse, False otherwise + """ + return ( + self.reverse is not None + and len(self.reverse.transformation_set) > 0 + ) + + +class BaseMapping: + """ + Class describing the mapping from the input to the + output formats. + + :param config: The global config for the system + :param input: The start of the conversion path + :param output: The end of the conversion path + """ + + def __init__( + self, + config: TransformationConfig, + file_type: str, + **options, + ): + self._mapping_graph: Optional[Dict[str, nx.DiGraph]] = None + self._path = None + + self.config = config + default_format_dict = {"name": None, "version": None} + self.input_format = MappingFormat( + **self.config.get("input_format", default_format_dict) + ) + self.output_format = MappingFormat( + **self.config.get("output_format", default_format_dict) + ) + + self._options = { + "file_type": file_type, + "input_format": self.input_format, + "output_format": self.output_format, + **options, + } + + self.file_type = file_type + + @property + def mapping_specs(self) -> Reversible[MappingSpec]: + """ + Returns a list of ``MappingSpec`` objects described by the mapping + """ + raise NotImplementedError() + + def _build_mapping_graph(self) -> nx.DiGraph: + """ + Creates a networkx graph to represent the relationships between + formats in the system. + + :return: The built graph + """ + g = nx.DiGraph() + + # the mapping config is in order from first search path to last + # if we build it in reverse order we will store the most preferable + # mapping on each edge + if self.file_type: + specs: Iterable[MappingSpec] = filter( + lambda s: s.file_type.lower() == self.file_type.lower(), + reversed(self.mapping_specs), + ) + else: + specs = reversed(self.mapping_specs) + + for mapping in specs: + if mapping.can_run_forwards: + g.add_edge( + mapping.input_format, + mapping.output_format, + transform=mapping.forward, + spec=mapping, + ) + + if mapping.can_run_in_reverse: + g.add_edge( + mapping.output_format, + mapping.input_format, + transform=mapping.reverse, + spec=mapping, + ) + + return g + + @property + def mapping_graph(self) -> nx.DiGraph: + """ + Creates the graph to represent the relationships between formats in + the system. It it has not already been generated it is generated here. + """ + if self._mapping_graph is None: + self._mapping_graph = self._build_mapping_graph() + + return self._mapping_graph + + @property + def path(self): + if self._path: + return self._path + + try: + self._path = nx.shortest_path( + self.mapping_graph, + self.input_format, + self.output_format, + ) + return self._path + except (nx.NetworkXNoPath, nx.NodeNotFound): + raise NoConversionPathError(self.input_format, self.output_format) + + @property + def path_edges(self): + return list( + map( + lambda in_out: self.mapping_graph[in_out[0]][in_out[1]], + zip(self.path[:-1], self.path[1:]), + ) + ) + + def get_transformations(self) -> List[DirectionalMapping]: + """ + Gets a column transformations and full transformation set for the + provided input and output paths. + + :return: The mappings along the conversion path. + """ + path = self.path + logger.info( + f"Path found {' -> '.join(f'{n.name} v{n.version}' for n in path)}" + ) + # parse the trees of the path so that is doesnt need + # to be done for every row + transformations = [edge["transform"] for edge in self.path_edges] + for mapping in transformations: + for transform in mapping.transformation_set.values(): + for case in transform: + case.parse() + + return transformations diff --git a/ods_tools/odtf/mapping/errors.py b/ods_tools/odtf/mapping/errors.py new file mode 100644 index 00000000..a8fb4759 --- /dev/null +++ b/ods_tools/odtf/mapping/errors.py @@ -0,0 +1,28 @@ +from typing import TYPE_CHECKING + +from ..errors import ConverterError + + +if TYPE_CHECKING: + from .base import MappingFormat + + +class NoConversionPathError(ConverterError): + """ + Error raised there is no valid format map between 2 formats + + :param input_format: The start path in the requested path. + :param output_format: The end path in the requested path. + """ + + def __init__( + self, input_format: "MappingFormat", output_format: "MappingFormat" + ): + self.input_format = input_format + self.output_format = output_format + + super().__init__( + f"No conversion path from {input_format.name} " + f"v{input_format.version} to {output_format.name} " + f"v{output_format.version}." + ) diff --git a/ods_tools/odtf/mapping/file.py b/ods_tools/odtf/mapping/file.py new file mode 100644 index 00000000..ef592fe9 --- /dev/null +++ b/ods_tools/odtf/mapping/file.py @@ -0,0 +1,572 @@ +import glob +import logging +import os +from collections import OrderedDict +from functools import reduce +from itertools import chain, product +from typing import Any, Dict, Iterable, List, Reversible, Set, TypedDict, Union + +from ..data import get_data_path, hide_system_data_path +from ..errors import ConverterError +from ..files.yaml import read_yaml +from ..transformers import run +from .base import ( + BaseMapping, + ColumnConversion, + ColumnConversions, + DirectionalMapping, + MappingFormat, + MappingSpec, + TransformationEntry, + TransformationSet, +) + + +logger = logging.getLogger(__name__) + + +RawTransformConfig = TypedDict( + "RawTransformConfig", {"transformation": str, "when": str}, total=False +) + + +RawColumnConversionConfig = TypedDict( + "RawColumnConversionConfig", + {"type": str, "nullable": bool, "null_values": List}, + total=False, +) + + +RawDirectionalConfig = TypedDict( + "RawDirectionalConfig", + { + "transform": Dict[str, List[RawTransformConfig]], + "types": Dict[str, RawColumnConversionConfig], + "null_values": List, + }, + total=False, +) + + +RawMappingFormat = TypedDict( + "RawMappingFormat", + { + "name": str, + "version": str, + }, +) + + +RawMappingConfig = TypedDict( + "RawMappingConfig", + { + "bases": List[str], + "file_type": str, + "input_format": MappingFormat, + "output_format": MappingFormat, + "forward": RawDirectionalConfig, + "reverse": RawDirectionalConfig, + }, + total=False, +) + + +class InvalidMappingFile(ConverterError): + """ + Error raised when a mapping file fails validation + + :param reason: String representing the reason for the failure. + :param path: Path to the failing file. + """ + + def __init__(self, reason: str, path: str): + self.path: str = path + self.reason: str = reason + + super().__init__(f"{path}: {reason}.") + + +class FileMappingSpec(MappingSpec): + """ + A file representing a conversion mapping between 2 formats. + + This class will also load any base configs represented by the config. + + The final result is added to `all_found_configs` so that further mappings + can use this to lookup parents rather than processing the raw config again. + + :param path: Absolute path to the mapping file. + :param raw_config: The raw config data from the mapping file. + :param bases: A list of `MappingFile` objects to use as the base files + :param input_format: The input format resolved from the parent and current + configs. + :param output_format: The output format resolved from the parent and + current configs. + :param forward: The configuration for changing from the input format to + output format (the current config is merged with the parents) + :param reverse: The configuration for changing from the output format to + input format (the current config is merged with the parents) + """ + + def __init__( + self, + path: str, + config: RawMappingConfig, + all_found_configs: Dict[ + str, Union["FileMappingSpec", RawMappingConfig] + ], + search_paths: List[str], + ): + """ + :param path: Absolute path to the mapping file. + :param config: The raw config for read from the mapping file. + :param all_found_configs: A dictionary mapping absolute paths to raw + configs and hydrated `MappingFile` objects. + :param search_paths: The paths used to search for parents (these files + aren't read here but the search paths are used to find parents + in `all_found_configs`). Parents in the former search paths will + be used in preference to the later. + """ + self.path = path + self.raw_config = config + + # load all the bases + self.bases: List[FileMappingSpec] = [ + self._load_base(base_name, all_found_configs, search_paths) + for base_name in config.get("bases", []) + ] + + # get the file_type from the bases if not set on the current config + file_type: Union[str, None] = self._resolve_property( + *(b.file_type for b in self.bases), + config.get("file_type"), + ) + + if not file_type: + raise InvalidMappingFile( + "file_type not found in the config file or its bases", + self.path, + ) + + # get the input format from the bases if not set on the current config + raw_input_format: Union[ + RawMappingFormat, MappingFormat, None + ] = self._resolve_property( + *(b.input_format for b in self.bases), + config.get("input_format"), + ) + + if not raw_input_format: + raise InvalidMappingFile( + "input_format not found in the config file or its bases", + self.path, + ) + elif not isinstance(raw_input_format, MappingFormat): + input_format = MappingFormat(**raw_input_format) + else: + input_format = raw_input_format + + # get the output format from the bases if not set on the current config + raw_output_format: Union[ + RawMappingFormat, MappingFormat, None + ] = self._resolve_property( + *(b.output_format for b in self.bases), + config.get("output_format"), + ) + + if not raw_output_format: + raise InvalidMappingFile( + "output_format not found in the config file or its bases", + self.path, + ) + elif not isinstance(raw_output_format, MappingFormat): + output_format = MappingFormat(**raw_output_format) + else: + output_format = raw_output_format + + # merge the transforms from all the parents and the current config + forward_transform: TransformationSet = self._reduce_transforms( + *(b.forward.transformation_set for b in self.bases if b.forward), + config.get("forward", {}).get("transform", {}), + ) + + reverse_transform: TransformationSet = self._reduce_transforms( + *(b.reverse.transformation_set for b in self.bases if b.reverse), + config.get("reverse", {}).get("transform", {}), + ) + + # merge all null values from format specific entries + forward_null_values = self._parse_null_values( + *chain( + config.get("forward", {}).get("null_values", set()), + *(b.forward.null_values for b in self.bases if b.forward), + ) + ) + + reverse_null_values = self._parse_null_values( + *chain( + config.get("reverse", {}).get("null_values", set()), + *(b.reverse.null_values for b in self.bases if b.reverse), + ) + ) + + # merge the column conversions from all the parents and the current + # config + forward_types = self._reduce_types( + *(b.forward.types for b in self.bases if b.forward), + self._process_raw_types( + config.get("forward", {}).get("types", {}), + forward_null_values, + ), + ) + + reverse_types = self._reduce_types( + *(b.reverse.types for b in self.bases if b.reverse), + self._process_raw_types( + config.get("reverse", {}).get("types", {}), + reverse_null_values, + ), + ) + + super().__init__( + file_type, + input_format, + output_format, + forward=DirectionalMapping( + input_format=input_format, + output_format=output_format, + transformation_set=forward_transform, + types=forward_types, + null_values=forward_null_values, + ), + reverse=DirectionalMapping( + input_format=output_format, + output_format=input_format, + transformation_set=reverse_transform, + types=reverse_types, + null_values=reverse_null_values, + ), + metadata={ + "path": hide_system_data_path(path), + }, + ) + + all_found_configs[self.path] = self + + @classmethod + def _parse_null_values(cls, *raw) -> Set: + return {run({}, v) for v in raw} + + @classmethod + def _process_raw_types(cls, types, null_values): + return { + k: { + **v, + "null_values": cls._parse_null_values( + *v.get("null_values", []) + ) + or null_values, + } + for k, v in types.items() + } + + @classmethod + def _resolve_property(cls, *values: Union[None, Any]) -> Union[None, Any]: + """ + Finds the first non None value + + :param values: An iterable of all the values to test + + :return: THe first found non None value + """ + return next(reversed([v for v in values if v]), None) + + @classmethod + def _reduce_transforms( + cls, + *transform_configs: Union[ + TransformationSet, Dict[str, List[RawTransformConfig]] + ], + ) -> TransformationSet: + """ + Merges the current configs transforms with all the parents. + + :param transform_configs: An iterable containing the transforms to + merge + + :return: The merged transformation set + """ + return reduce( + lambda transforms, current: { + **transforms, + **{ + k: [ + TransformationEntry(**t) if isinstance(t, dict) else t + for t in v + ] + for k, v in current.items() + }, + }, + transform_configs, + {}, + ) + + @classmethod + def _reduce_types( + cls, + *transform_types: Union[ + ColumnConversions, Dict[str, RawColumnConversionConfig] + ], + ): + return reduce( + lambda types, current: { + **types, + **{ + k: ( + ColumnConversion(**v) # type: ignore + if isinstance(v, dict) + else v + ) + for k, v in current.items() + }, + }, + transform_types, + {}, + ) + + def _load_base( + self, + base_name: str, + all_found_configs: Dict[ + str, Union["FileMappingSpec", RawMappingConfig] + ], + search_paths: List[str], + ): + """ + Processes the base hydrating it if it has not yet been hydrated. + + :param base_name: + :param all_found_configs: + :param search_paths: + + :return: The hydrated `MappingFile` object for the base + """ + if os.path.splitext(base_name)[1] in [".yml", ".yaml"]: + # if the base has a yaml extension treat it as an relative + # path so we dont need to lookup the parents + config_path = os.path.join(os.path.dirname(self.path), base_name) + config = all_found_configs.get(config_path) + else: + # if we aren't dealing with a relative path find the config in + # the search paths + + # get all paths matching the name in each search path for + # yml and yaml extansions + possible_paths = map( + lambda tpl: os.path.join(tpl[0], f"{base_name}.{tpl[1]}"), + product(search_paths, ("yml", "yaml")), + ) + + # get the config path and config for the first match + config_path, config = next( + ( + (p, all_found_configs.get(p)) + for p in possible_paths + if p in all_found_configs + ), + ("", None), + ) + + if not config: + raise InvalidMappingFile( + f"Could not find base mapping file ({base_name})", + self.path, + ) + + if not isinstance(config, FileMappingSpec): + # if the found config is not yet hydrated store a hydrated version + config = FileMappingSpec( + config_path, config, all_found_configs, search_paths + ) + all_found_configs[config_path] = config + + return config + + +class FileMapping(BaseMapping): + """ + A mapping of all file mapping on the system in the search directories. + + :param config: The global config for the system + :param search_paths: All the paths in the system to check for configs + """ + + def __init__( + self, + config, + file_type: str, + search_paths: List[str] = None, + standard_search_path: str = get_data_path("mappings"), + search_working_dir=True, + **options, + ): + """ + :param search_paths: All the paths in the system to check for + mapping configs. If set the path of the conversion config is + prepended to this list. + :param standard_search_path: The path to the standard library of + mappings + :param options: Ignored options + """ + if config.path: + search_paths = [os.path.dirname(config.path)] + ( + search_paths or [] + ) + + super().__init__( + config, + file_type, + search_paths=search_paths, + standard_search_path=standard_search_path, + search_working_dir=search_working_dir, + **options, + ) + + self._raw_configs: Union[None, Dict[str, RawMappingConfig]] = None + self._hydrated_configs: Union[None, Dict[str, FileMappingSpec]] = None + self.search_paths = [ + *(os.path.abspath(p) for p in (search_paths or [])), + os.path.abspath(standard_search_path), + ] + + if search_working_dir: + self.search_paths.insert(0, os.path.abspath(".")) + + def _load_raw_configs(self) -> Dict[str, RawMappingConfig]: + """ + Loads all the mappings in the search paths + + :return: The raw mapping configs keyed by their absolute paths. + """ + candidate_paths = chain( + *( + self._get_candidate_paths_from_search_path(p) + for p in self.search_paths + ) + ) + + path_wth_config = ((p, self._load_yaml(p)) for p in candidate_paths) + + # exclude any configs that dont pass the basic validation + return OrderedDict( + (p, config) + for p, config in path_wth_config + if self._validate_raw_config(config) + ) + + @property + def raw_configs(self) -> Dict[str, RawMappingConfig]: + """ + Gets the raw configs from teh system. If they have not yet been loaded + they are loaded here. + """ + if self._raw_configs is None: + self._raw_configs = self._load_raw_configs() + + return self._raw_configs + + @classmethod + def _load_yaml(cls, path) -> RawMappingConfig: + """ + Gets the yaml content from a file. + + :param path: Path to the yaml file. + + :return: The parsed yaml content + """ + return read_yaml(path) + + @classmethod + def _get_candidate_paths_from_search_path( + cls, + search_path: str, + ) -> Iterable[str]: + """ + Gets all the possible yaml files from the search path. + + :param search_path: + :return: + """ + yield from glob.glob( + os.path.abspath(os.path.join(search_path, "*.yml")) + ) + yield from glob.glob( + os.path.abspath(os.path.join(search_path, "*.yaml")) + ) + + @classmethod + def _conf_has_unexpected_fields(cls, conf: RawMappingConfig) -> bool: + """ + Checks if the config has any unexpected fields + + :param conf: The conf to check + + :return: True if there are any extra fields or if its not a dict, + otherwise False + """ + return ( + len( + conf.keys() + & ( + conf.keys() + ^ { + "bases", + "file_type", + "input_format", + "output_format", + "forward", + "reverse", + } + ) + ) + != 0 + ) + + @classmethod + def _validate_raw_config(cls, raw_config: RawMappingConfig) -> bool: + """ + Performs a small validation to make sure the candidate config is a + dictionary and doesn't have any unexpected keys. + + :param raw_config: The config to check + + :return: True if the config is valid, otherwise False + """ + return isinstance( + raw_config, dict + ) and not cls._conf_has_unexpected_fields(raw_config) + + def _hydrate_raw_configs(self): + """ + Converts all raw configs to `MappingFile` objects. + + :return: The hydrated configs keyed by their absolute paths. + """ + for k, v in self.raw_configs.items(): + try: + yield k, FileMappingSpec( + k, v, self.raw_configs, self.search_paths + ) + except InvalidMappingFile as e: + logger.warning(str(e)) + + @property + def mapping_specs(self) -> Reversible[FileMappingSpec]: + """ + Gets all the hydrated mapping configs keyed by their absolute paths. + If they have not already been loaded they are loaded here. + """ + if self._hydrated_configs is None: + self._hydrated_configs = OrderedDict(self._hydrate_raw_configs()) + + return self._hydrated_configs.values() diff --git a/ods_tools/odtf/notset.py b/ods_tools/odtf/notset.py new file mode 100644 index 00000000..636f0d2e --- /dev/null +++ b/ods_tools/odtf/notset.py @@ -0,0 +1,14 @@ +class NotSetType: + """ + Value used when a transformation has not been applied due to fix + ambiguity with ``None`` being a valid value + """ + + def __bool__(self): + return False + + def __eq__(self, other): + return isinstance(other, NotSetType) + + +NotSet = NotSetType() diff --git a/ods_tools/odtf/runner/__init__.py b/ods_tools/odtf/runner/__init__.py new file mode 100644 index 00000000..2599936c --- /dev/null +++ b/ods_tools/odtf/runner/__init__.py @@ -0,0 +1,8 @@ +from .base import BaseRunner +from .pandas import PandasRunner + + +__all__ = [ + "BaseRunner", + "PandasRunner", +] diff --git a/ods_tools/odtf/runner/base.py b/ods_tools/odtf/runner/base.py new file mode 100644 index 00000000..ad9e7fed --- /dev/null +++ b/ods_tools/odtf/runner/base.py @@ -0,0 +1,310 @@ +import asyncio +import json +import logging +from functools import reduce +from typing import ( + Any, + AsyncIterable, + Callable, + Dict, + Iterable, + List, + TypedDict, + Union, + Set +) + +from ..config import TransformationConfig +from ..connector.base import BaseConnector +from ..mapping.base import ( + BaseMapping, + ColumnConversions, + DirectionalMapping, + TransformationEntry, +) +from ..log import log_metadata +from ..transformers.transform import run +from ..notset import NotSet, NotSetType + + +RowType = Any +logger = logging.getLogger(__name__) + + +class Converters(TypedDict): + int: Callable[[Any, bool, List], Union[int, None]] + float: Callable[[Any, bool, List], Union[float, None]] + string: Callable[[Any, bool, List], Union[str, None]] + + +def build_converter(t) -> Callable[[Any, bool, List], Any]: + def _converter(value, nullable, null_values): + if nullable and (value in null_values or value is None): + return None + return t(value) + + return _converter + + +class _BaseRunner: + row_value_conversions: Converters = { + "int": build_converter(int), + "float": build_converter(float), + "string": build_converter(str), + } + name = "Base Runner" + options_schema = {"type": "object", "properties": {}} + + def __init__(self, config: TransformationConfig, **options): + self.config = config + self._options = options + + @classmethod + def log_type_coercion_error(cls, row, column, value, to_type, reason): + """ + Logs a failure of a row type coercion + + :param row: The input row that failed + :param column: The name of the column in which the error occurred + :param value: The value of the failing column + :param to_type: The type the coercion was attempting + :param reason: The error message + """ + logger.warning( + f"Cannot coerce {column} ({value}) to {to_type}. " + f"Reason: {reason}. Row: {json.dumps(row)}." + ) + + def coerce_row_types(self, row, conversions: ColumnConversions): + """ + Changes data types of each input column. If a cast fails a warning + will be written to the logs and the row will be ignored. + + :param row: The input row. + :param conversions: The set of conversions to run + + :return: The updated input row if there are no errors, ``None`` if + any updates fail. + """ + coerced_row = {} + for column, value in row.items(): + conversion = conversions.get(column) + if not conversion: + coerced_row[column] = value + else: + try: + coerced_row[column] = self.row_value_conversions[ + conversion.type # type: ignore + ](value, conversion.nullable, conversion.null_values) + except Exception as e: + self.log_type_coercion_error( + row, column, row[column], conversion.type, e + ) + return None + + return coerced_row + + def combine_column( + self, + row, + current_column_value: Union[Any, NotSetType], + entry: TransformationEntry, + ): + """ + Combines the current column value with the result of the + transformation. If the current value is ``NotSet`` the value of the + current transformation will be calculated and applied. + + :param row: The row loaded from the extractor + :param current_column_value: The current transformed value + :param entry: The transformation to apply + + :return: The combined column value + """ + if current_column_value is not NotSet: + return current_column_value + + return self.apply_transformation_entry(row, entry) + + def assign( + self, + input_row: RowType, + output_row: Union[RowType, NotSetType], + **assignments, + ) -> RowType: + """ + Helper function for assigning a values to the output row. + + :param input_row: The row loaded from the extractor + :param output_row: The row object to assign to or None + :param assignments: The assignments to apply to the row + + :return: The updated row + """ + return { + **(output_row or {}), # type: ignore + **assignments, + } + + def apply_transformation_entry( + self, + row: RowType, + entry: TransformationEntry, + ) -> RowType: + """ + Applies a single transformation to the row returning the result + as a column value. + + :param row: The row loaded from the extractor + :param entry: The transformation to apply + + :return: The transformation result + """ + + # process the when clause to get a filter series + if run(row, entry.when_tree or entry.when): + return run(row, entry.transformation_tree or entry.transformation) + else: + return NotSet + + def apply_column_transformation( + self, + row: RowType, + entry_list: List[TransformationEntry], + missing_columns: Set[str] = None, + ): + """ + Applies all the transformations for a single output column + + :param row: The current input row + :param entry_list: A list of all the transformations to apply to + generate the output series + + :return: The transformation result + """ + if entry_list[0].transformation in missing_columns: + return NotSet + else: + result = reduce( + lambda current_column_value, entry: self.combine_column( + row, + current_column_value, + entry, + ), + entry_list, + NotSet, + ) + return result + + def apply_transformation_set( + self, + row: RowType, + transformations: DirectionalMapping, + missing_columns: Set[str] = None, + ) -> RowType: + """ + Applies all the transformations to produce the output row + + :param row: The current input row + :param transformations: The full set of column conversions and + transformation sets to apply to the ``row`` row. + + :return: The transformed row + """ + coerced_row = self.coerce_row_types(row, transformations.types) + if coerced_row is None: + return NotSet + + return reduce( + lambda target, col_transforms: self.assign( + row, + target, + **{ + col_transforms[0]: self.apply_column_transformation( + coerced_row, col_transforms[1], missing_columns=missing_columns + ) + }, + ), + transformations.transformation_set.items(), + NotSet, + ) + + +class BaseRunner(_BaseRunner): + """ + Runs the transformations on the extracted data and writes + it to the data loader + + :param config: The global config for the system + """ + + name = "Base" + + def run( + self, + extractor: BaseConnector, + mapping: BaseMapping, + loader: BaseConnector, + ): + """ + Runs the transformation process and sends the data to the data loader + + :param extractor: The data connection to extract data from + :param mapping: Mapping object describing the transformations to apply + :param loader: The data connection to load data to + """ + log_metadata(self.config, mapping) + loader.load(self.transform(extractor, mapping)) + + def transform( + self, extractor: BaseConnector, mapping: BaseMapping + ) -> Iterable[Dict[str, Any]]: + """ + Performs the transformation + + :param extractor: The data connection to extract data from + :param mapping: Mapping object describing the transformations to apply + + :return: An iterable containing the transformed data + """ + raise NotImplementedError() + + +class BaseAsyncRunner(_BaseRunner): + """ + Runs the transformations on the extracted data and writes it to the data + loader. The connectors and transformation are all async objects allowing + for async data providers such as websockets or polled apis to be used as + a data connection. + + The connectors and transformations should be done in an eager way so that + each row is processed and passed to the loader as it's received or cached + for processing later. After each row if processed the next should be + awaited so that new data can be extracted. + + :param config: The global config for the system + """ + + def run( + self, + extractor: BaseConnector, + mapping: BaseMapping, + loader: BaseConnector, + ): + log_metadata(self.config, mapping) + asyncio.run(loader.aload(self.transform(extractor, mapping))) + + async def transform( + self, extractor: BaseConnector, mapping: BaseMapping + ) -> AsyncIterable[Dict[str, Any]]: + """ + Performs the transformation + + :param extractor: The data connection to extract data from + :param mapping: Mapping object describing the transformations to apply + + :return: An iterable containing the transformed data + """ + raise NotImplementedError() + # This is here so that mypy knows its an async iterable + yield {} # pragma: no cover diff --git a/ods_tools/odtf/runner/pandas.py b/ods_tools/odtf/runner/pandas.py new file mode 100644 index 00000000..09aa7bce --- /dev/null +++ b/ods_tools/odtf/runner/pandas.py @@ -0,0 +1,460 @@ +import logging +import math +import os +import re +from functools import reduce +from operator import and_, or_ +from typing import Any, Dict, Iterable, Union + +import pandas as pd +from numpy import nan + +from ..connector.base import BaseConnector +from ..mapping.base import ( + BaseMapping, + DirectionalMapping, + ColumnConversions, + TransformationEntry +) +from ..transformers import run +from ..transformers.transform import ( + GroupWrapper, + RowType, + TransformerMapping, + default_match, + default_search, + transform_loc_perils +) +from ..notset import NotSet, NotSetType +from ..validator_pandas import PandasValidator +from .base import BaseRunner +# +# Group Wrappers +# +if tuple(map(int, pd.__version__.split('.'))) >= (2, 1, 9): + pd.set_option('future.no_silent_downcasting', True) +logger = logging.getLogger(__name__) + + +class PandasGroupWrapper(GroupWrapper): + """ + Base class for the pandas implementation for any and all groups + """ + + def in_operator(self, x, y): + return reduce(or_, (x == c for c in y), False) + + def not_in_operator(self, x, y): + return reduce(and_, (x != c for c in y), True) + + +class PandasAnyWrapper(PandasGroupWrapper): + """ + Pandas specific implementation of the ``any`` expression + """ + + def check_fn(self, values): + return reduce(or_, values, False) + + +class PandasAllWrapper(PandasGroupWrapper): + """ + Pandas specific implementation of the ``all`` expression + """ + + def check_fn(self, values): + return reduce(and_, values, True) + + +# +# Transformer overrides +# + + +def logical_and_transformer(row, lhs, rhs): + return lhs & rhs + + +def logical_or_transformer(row, lhs, rhs): + return lhs | rhs + + +def logical_not_transformer(row, value): + try: + return not bool(value) + except ValueError: + # assume we are dealing with series or + # dataframe is we get a value error + return value.apply(lambda v: not bool(v)) + + +def in_transformer(row, lhs, rhs): + if hasattr(lhs, "is_in"): + return lhs.is_in(rhs) + else: + return reduce(or_, map(lambda s: lhs == s, rhs)) + + +def not_in_transformer(row, lhs, rhs): + if hasattr(lhs, "is_not_in"): + return lhs.is_not_in(rhs) + else: + return reduce(and_, map(lambda s: lhs != s, rhs)) + + +# +# String Manipulations +# + + +class StrReplace: + def __init__(self, series_type): + self.series_type = series_type + + def __call__(self, row: RowType, target, *pattern_repl): + result = target + patterns = (re.compile(f'^{re.escape(p)}$') for i, p in enumerate(pattern_repl) if i % 2 == 0) + repls = (r for i, r in enumerate(pattern_repl) if i % 2 != 0) + + if isinstance(result, self.series_type): + result = result.astype(str) + for pattern, repl in zip(patterns, repls): + result = result.str.replace(pattern, repl, regex=True) + else: + for pattern, repl in zip(patterns, repls): + result = pattern.sub(repl, str(result)) + + return result + + +class StrMatch: + def __init__(self, series_type): + self.series_type = series_type + + def __call__(self, row: RowType, target, pattern: re.Pattern): + if isinstance(target, self.series_type): + return target.astype(str).str.match(pattern) + else: + return default_match(row, target, pattern) + + +class StrSearch: + def __init__(self, series_type): + self.series_type = series_type + + def __call__(self, row: RowType, target, pattern: re.Pattern): + if isinstance(target, self.series_type): + return target.astype(str).str.contains(pattern) + else: + return default_search(row, target, pattern) + + +class StrJoin: + def __init__(self, series_type): + self.series_type = series_type + + def to_str(self, obj): + return ( + obj.astype(str) if isinstance(obj, self.series_type) else str(obj) + ) + + def concat(self, left, right): + left_is_series = isinstance(left, self.series_type) + right_is_series = isinstance(right, self.series_type) + + if left_is_series or not right_is_series: + # if the left it already a series or if the right isn't a series + # the strings will be concatenated in the correct order + return self.to_str(left) + self.to_str(right) + else: + # if right is a series and left isnt force the join to prepend left + return self.to_str(right).apply(lambda x: self.to_str(left) + x) + + def join(self, left, join, right): + return self.concat(self.concat(left, join), right) + + def __call__(self, row: RowType, join, *elements): + if not elements: + return "" + elif len(elements) == 1: + return self.to_str(elements[0]) + else: + return reduce( + lambda reduced, element: self.join(reduced, join, element), + elements[1:], + elements[0], + ) + + +class ConversionError: + def __init__(self, value=None, reason=None): + self.reason = reason + self.value = value + + +def type_converter(to_type, nullable, null_values): + def _converter(value): + try: + if nullable and ( + value in null_values + or (isinstance(value, float) and math.isnan(value)) + or value is None + ): + return None + return to_type(value) + except Exception as e: + return ConversionError(value, e) + + return _converter + + +class PandasRunner(BaseRunner): + """ + Default implementation for a pandas like runner + """ + + name = "Pandas" + + row_value_conversions = { + "int": lambda col, nullable, null_values: col.astype(object).apply( + type_converter((lambda v: int(float(v))), nullable, null_values), + ), + "float": lambda col, nullable, null_values: col.astype(object).apply( + type_converter(float, nullable, null_values), + ), + "string": lambda col, nullable, null_values: col.astype(object).apply( + type_converter(str, nullable, null_values), + ), + } + + dataframe_type = pd.DataFrame + series_type = pd.Series + + def coerce_row_types(self, row, conversions: ColumnConversions): + coerced_row = NotSet + + for column in row.columns: + conversion = conversions.get(column) + if not conversion: + coerced_column = row[column] + bad_rows = None + else: + coerced_column = self.row_value_conversions[conversion.type]( + row[column], + conversion.nullable, + conversion.null_values, + ) + bad_rows = coerced_column.apply( + lambda v: isinstance(v, ConversionError), + ) + + for error, (idx, entry) in zip( + coerced_column[bad_rows], row[bad_rows].iterrows() + ): + self.log_type_coercion_error( + entry.to_dict(), + column, + error.value, + conversion.type, + error.reason, + ) + + coerced_column = coerced_column[~bad_rows] + + if isinstance(coerced_row, NotSetType): + coerced_row = coerced_column.to_frame(column) + else: + coerced_row[column] = coerced_column + + # remove the bad rows from the input row and the coerced row + # so that no bad rows arent processed anymore and bad rows + # arent included in the final coerced value + if bad_rows is not None and len(bad_rows): + row = row[~bad_rows] + coerced_row = coerced_row[~bad_rows] # type: ignore + + return coerced_row + + def create_series(self, index, value): + return self.series_type(value, index=index) + + def get_dataframe(self, extractor: BaseConnector) -> pd.DataFrame: + """ + Builds a dataframe from the extractors data + + :param extractor: The extractor providing the input data + + :return: The created dataframe + """ + return pd.DataFrame(extractor.extract(), dtype="object") + + def combine_column( + self, + row, + current_column_value: Union[pd.Series, NotSetType], + entry: TransformationEntry, + ): + """ + Combines the current column value with the result of the + transformation. If the current value is ``NotSet`` the value of the + current transformation will be calculated and applied. + + :param row: The row loaded from the extractor + :param current_column_value: Series representing the current + transformed value + :param entry: The transformation to apply + + :return: The combined column value + """ + if not isinstance(current_column_value, NotSetType): + # remove any entries that have already been processed + row = row[ + self.create_series( + current_column_value.index, False + ).combine_first(self.create_series(row.index, True)) + ] + + if isinstance(row, NotSetType) or len(row) == 0: + return current_column_value + + new_column_value = self.apply_transformation_entry(row, entry) + + if isinstance(current_column_value, NotSetType): + return new_column_value + elif isinstance(new_column_value, NotSetType): + return current_column_value + else: + return current_column_value.combine_first(new_column_value) + + def assign( + self, + input_row: pd.DataFrame, + output_row: Union[pd.DataFrame, NotSetType], + **assignments, + ): + """ + Helper function for assigning a series to a dataframe. Some + implementations of pandas are less efficient if we start with an empty + dataframe so here we allow for `None` to be passed and create the + initial dataframe from the first assigned series. + + :param input_row: The row loaded from the extractor + :param output_row: The data frame to assign to or None + :param assignments: The assignments to apply to the dataframe + + :return: The updated dataframe + """ + for name, series in assignments.items(): + if isinstance(series, NotSetType): + series = self.create_series(input_row.index, nan) + + if isinstance(output_row, NotSetType): + output_row = series.to_frame(name=name) + else: + series.name = name + output_row, series = output_row.align( + series, axis=0, fill_value=NotSet + ) + output_row = output_row.infer_objects(copy=False) + output_row = output_row.assign(**{name: series}) + + return output_row + + def apply_transformation_entry( + self, + input_df: pd.DataFrame, + entry: TransformationEntry, + ) -> Union[pd.Series, NotSetType]: + """ + Applies a single transformation to the dataset returning the result + as a series. + + :param input_df: The dataframe loaded from the extractor + :param entry: The transformation to apply + + :return: The transformation result + """ + transformer_mapping: TransformerMapping = { + "logical_and": logical_and_transformer, + "logical_or": logical_or_transformer, + "logical_not": logical_not_transformer, + "is_in": in_transformer, + "not_in": not_in_transformer, + "any": lambda r, values: PandasAnyWrapper(values), + "all": lambda r, values: PandasAllWrapper(values), + "str_replace": StrReplace(self.series_type), + "str_match": StrMatch(self.series_type), + "str_search": StrSearch(self.series_type), + "str_join": StrJoin(self.series_type), + "transform_loc_perils": transform_loc_perils, + } + + # process the when clause to get a filter series + filter_series = run( + input_df, entry.when_tree or entry.when, transformer_mapping + ) + + if isinstance(filter_series, self.series_type): + # if we have a series treat it as a row mapping + filtered_input = input_df[filter_series] + elif filter_series: + # if the filter series is normal value that resolves to true + # return all rows + filtered_input = input_df + else: + # if the filter series is normal value that resolves to false + # return no rows, this should never happen so raise a warning. + logger.warning( + f"A transformer when clause resolves to false in all cases " + f"({entry.when})." + ) + return NotSet + + result = run( + filtered_input, + entry.transformation_tree or entry.transformation, + transformer_mapping, + ) + if isinstance(result, self.series_type): + return result + else: + return self.create_series(input_df.index, result) + + def transform( + self, extractor: BaseConnector, mapping: BaseMapping + ) -> Iterable[Dict[str, Any]]: + transformations = mapping.get_transformations() + + validator = PandasValidator(search_paths=([os.path.dirname(self.config.path)] if self.config.path else [])) + + logger.info(f"Running transformation set {transformations[0].input_format} -> {transformations[-1].output_format}") + total_rows = 0 + runner_config = self.config.config.get('runner', None) + batch_size = runner_config.get('batch_size', 10000) + + for batch in pd.read_csv(extractor.file_path, chunksize=batch_size, low_memory=False): + # Check if all the columns necessary for the transformations are present. If not, drop the transformations we can't run + missing_columns = set(transformations[0].types.keys()) - set(batch.columns) + updated_transformations = [ + DirectionalMapping( + input_format=t.input_format, + output_format=t.output_format, + transformation_set={k: v for k, v in t.transformation_set.items() if k not in missing_columns}, + types=t.types, + null_values=t.null_values, + ) + for t in transformations + ] + + validator.run(self.coerce_row_types(batch, updated_transformations[0].types), + mapping.input_format.name, mapping.input_format.version, mapping.file_type) + + transformed = batch + for transformation in updated_transformations: + transformed = self.apply_transformation_set(transformed, transformation, missing_columns) + + validator.run(transformed, mapping.output_format.name, mapping.output_format.version, mapping.file_type) + total_rows += len(batch) + logger.info(f"Processed {len(batch)} rows in the current batch (total: {total_rows})") + + yield from (r.to_dict() for idx, r in transformed.iterrows()) diff --git a/ods_tools/odtf/transformers/__init__.py b/ods_tools/odtf/transformers/__init__.py new file mode 100644 index 00000000..7d16a942 --- /dev/null +++ b/ods_tools/odtf/transformers/__init__.py @@ -0,0 +1,6 @@ +from .transform import run + + +__all__ = [ + "run", +] diff --git a/ods_tools/odtf/transformers/errors.py b/ods_tools/odtf/transformers/errors.py new file mode 100644 index 00000000..2ee803a2 --- /dev/null +++ b/ods_tools/odtf/transformers/errors.py @@ -0,0 +1,21 @@ +from ..errors import ConverterError + + +class ParserError(ConverterError): + """ + Error raised whenever there's an error in the transformation. + """ + + pass + + +class UnexpectedCharacters(ParserError): + """ + Error raised when there's an unexpected character in the transformation. + """ + + def __init__(self, expression, char, position): + super().__init__( + f"Unexpected character in '{expression}':" + f" '{char}' at position {position}" + ) diff --git a/ods_tools/odtf/transformers/grammar.py b/ods_tools/odtf/transformers/grammar.py new file mode 100644 index 00000000..71983401 --- /dev/null +++ b/ods_tools/odtf/transformers/grammar.py @@ -0,0 +1,78 @@ +from lark import lark + + +_grammar = r""" +?start: expression + +?expression: product + | comparison + | "not" comparison -> logical_not + | expression "or" comparison -> logical_or + | expression "and" comparison -> logical_and + | expression "+" product -> add + | expression "-" product -> subtract + +?product: atom + | product "*" atom -> multiply + | product "/" atom -> divide + +?comparison: comparison_lhs + | comparison_lhs "is" atom -> eq + | comparison_lhs "is not" atom -> not_eq + | comparison_lhs "is in" array -> is_in + | comparison_lhs "is not in" array -> not_in + | comparison_lhs "gt" atom -> gt + | comparison_lhs "gte" atom -> gte + | comparison_lhs "lt" atom -> lt + | comparison_lhs "lte" atom -> lte + +?comparison_lhs: group + | atom + +?group: "any" array -> any + | "all" array -> all + +?atom: lookup + | string + | array + | BOOL -> boolean + | NULL -> null + | SIGNED_NUMBER -> number + | "(" expression ")" + | string_manip + | regex + +array: "[" [expression ("," expression)*] "]" + +?lookup: "lookup(" string ")" -> lookup + | IDENT -> lookup + +?string_manip: "join(" string [("," expression)*] ")" -> str_join + | "replace(" expression [("," pattern "," expression)+] ")" -> str_replace + | "transform_loc_perils(" expression [("," STRING)*] ")" -> transform_loc_perils + | "match(" expression "," pattern ")" -> str_match + | "search(" expression "," pattern ")" -> str_search + +?pattern: string + | regex + +?regex: "re" string -> regex + | "ire" string -> iregex + +?string: "'" STRING "'" -> string + | "''" -> string + +IDENT: /[a-zA-Z][a-zA-Z0-9_]*/ +STRING: /((`['`])|([^']))+/ +BOOL: /True|False/ +NULL: /Null/ + +%import common.SIGNED_NUMBER +%import common.WS +%ignore WS +""" # noqa: E501 +# ignore line length in this file as its not always possible to break lines +# on the grammar + +#: Object for parsing the transformer strings and producing a tree +parser = lark.Lark(_grammar) diff --git a/ods_tools/odtf/transformers/transform.py b/ods_tools/odtf/transformers/transform.py new file mode 100644 index 00000000..e1ce484d --- /dev/null +++ b/ods_tools/odtf/transformers/transform.py @@ -0,0 +1,625 @@ +import re +from functools import partial +from operator import add, mul, sub +from operator import truediv as div +from typing import Any, Callable, Iterable, List, Pattern, TypedDict, Union + +from lark import Transformer as _LarkTransformer +from lark import Tree +from lark import exceptions as lark_exceptions +from lark import v_args + +from .errors import UnexpectedCharacters +from .grammar import parser + + +RowType = Any + + +class TransformerMapping(TypedDict, total=False): + lookup: Callable[[RowType, str], Any] + + # math operators + add: Callable[[RowType, Any, Any], Any] + subtract: Callable[[RowType, Any, Any], Any] + multiply: Callable[[RowType, Any, Any], Any] + divide: Callable[[RowType, Any, Any], Any] + + # comparison operators + eq: Callable[[RowType, Any, Any], Any] + not_eq: Callable[[RowType, Any, Any], Any] + is_in: Callable[[RowType, Any, Any], Any] + not_in: Callable[[RowType, Any, Any], Any] + gt: Callable[[RowType, Any, Any], Any] + gte: Callable[[RowType, Any, Any], Any] + lt: Callable[[RowType, Any, Any], Any] + lte: Callable[[RowType, Any, Any], Any] + logical_and: Callable[[RowType, Any, Any], Any] + logical_or: Callable[[RowType, Any, Any], Any] + logical_not: Callable[[RowType, Any], Any] + + # groupings + all: Callable[[RowType, List[Any]], Any] + any: Callable[[RowType, List[Any]], Any] + + # string manipulations + str_join: Callable[..., Any] + str_replace: Callable[[RowType, Any, Pattern, str], Any] + str_match: Callable[[RowType, Any, Pattern], Any] + str_search: Callable[[RowType, Any, Pattern], Any] + + +class GroupWrapper: + """ + Group operations preformed on a list of elements + + :param values: A list of the grouped values + """ + + def __init__(self, values): + self.values = values + + def check_fn(self, checks: Iterable[Any]): + """ + Checks the results of the operator. This should be a reduction of each + result in the values list into a single value. + + :param checks: The results from the operator comparison + + :return: The reduced result + """ + raise NotImplementedError() + + def eq_operator(self, lhs, rhs): + """ + Checks the equality of elements + + :param lhs: The left hand side of the operator + :param rhs: The right hand side of the operator + + :return: True if the elements are equal, False otherwise + """ + return lhs == rhs + + def __eq__(self, other): + """ + Checks if the group equals the other based on the `check_fn` and + `eq_operator` + + :param other: The value to check each element against + + :return: The reduced result + """ + return self.check_fn(self.eq_operator(v, other) for v in self.values) + + def __ne__(self, other): + """ + Checks if the group does not equal the other based on the `check_fn` + and the inverse of the `eq_operator` + + :param other: The value to check each element against + + :return: The reduced result + """ + return self.check_fn( + not self.eq_operator(v, other) for v in self.values + ) + + def gt_operator(self, lhs, rhs): + """ + Checks the left hand side of the operator is greater than the right + hand side + + :param lhs: The left hand side of the operator + :param rhs: The right hand side of the operator + + :return: True if lhs > rhs, False otherwise + """ + return lhs > rhs + + def __gt__(self, other): + """ + Checks if the group is greater than the other based on the `check_fn` + and the `gt_operator` + + :param other: The value to check each element against + + :return: The reduced result + """ + return self.check_fn(self.gt_operator(v, other) for v in self.values) + + def gte_operator(self, lhs, rhs): + """ + Checks the left hand side of the operator is greater than or equal to + the right hand side + + :param lhs: The left hand side of the operator + :param rhs: The right hand side of the operator + + :return: True if lhs >= rhs, False otherwise + """ + return lhs >= rhs + + def __ge__(self, other): + """ + Checks if the group is greater than or equal to the other based on the + `check_fn` and the `gte_operator` + + :param other: The value to check each element against + + :return: The reduced result + """ + return self.check_fn(self.gte_operator(v, other) for v in self.values) + + def lt_operator(self, lhs, rhs): + """ + Checks the left hand side of the operator is less than the right + hand side + + :param lhs: The left hand side of the operator + :param rhs: The right hand side of the operator + + :return: True if lhs < rhs, False otherwise + """ + return lhs < rhs + + def __lt__(self, other): + """ + Checks if the group is less than the other based on the `check_fn` + and the `lt_operator` + + :param other: The value to check each element against + + :return: The reduced result + """ + return self.check_fn(self.lt_operator(v, other) for v in self.values) + + def lte_operator(self, lhs, rhs): + """ + Checks the left hand side of the operator is less than or equal to the + right hand side + + :param lhs: The left hand side of the operator + :param rhs: The right hand side of the operator + + :return: True if lhs > rhs, False otherwise + """ + return lhs <= rhs + + def __le__(self, other): + """ + Checks if the group is less than or equal to the other based on the ` + check_fn` and the `le_operator` + + :param other: The value to check each element against + + :return: The reduced result + """ + return self.check_fn(self.lte_operator(v, other) for v in self.values) + + def in_operator(self, lhs, rhs): + """ + Checks the left hand side of the operator is contained in the right + hand side + + :param lhs: The left hand side of the operator + :param rhs: The right hand side of the operator + + :return: True if lhs in rhs, False otherwise + """ + return lhs in rhs + + def is_in(self, other): + """ + Checks if the group is in the other based on the `check_fn` and the + `in_operator` + + :param other: The value to check each element against + + :return: The reduced result + """ + return self.check_fn(self.in_operator(v, other) for v in self.values) + + def not_in_operator(self, lhs, rhs): + """ + Checks the left hand side of the operator is not contained in the right + hand side + + :param lhs: The left hand side of the operator + :param rhs: The right hand side of the operator + + :return: True if lhs not in rhs, False otherwise + """ + return lhs not in rhs + + def is_not_in(self, other): + """ + Checks if the group is not in the other based on the `check_fn` and the + `not_in_operator` + + :param other: The value to check each element against + + :return: The reduced result + """ + return self.check_fn( + self.not_in_operator(v, other) for v in self.values + ) + + +class AnyWrapper(GroupWrapper): + """ + Wraps the values and checks if any of their values return true when tested + """ + + def check_fn(self, checks): + return any(checks) + + +class AllWrapper(GroupWrapper): + """ + Wraps the values and checks if all of their values return true when tested + """ + + def check_fn(self, checks): + return all(checks) + + +def default_in_transformer(row, lhs, rhs): + """ + Performs the in check of the lhs in in the rhs. If the lhs has an `is_in` + method this is used, if not the `in` operator is used. + + :param row: The row being checked (not used) + :param lhs: The left hand side of the operator + :param rhs: The right hand side of the operator + + :return: True if lhs is in right, False otherwise + """ + if hasattr(lhs, "is_in"): + return lhs.is_in(rhs) + else: + return lhs in rhs + + +def default_not_in_transformer(row, lhs, rhs): + """ + Performs the in check of the lhs is not in the rhs. If the lhs has an + `is_not_in` method this is used, if not the `not in` operator is used. + + :param row: The row being checked (not used) + :param lhs: The left hand side of the operator + :param rhs: The right hand side of the operator + + :return: True if lhs is not in right, False otherwise + """ + if hasattr(lhs, "is_not_in"): + return lhs.is_not_in(rhs) + else: + return lhs not in rhs + + +def default_replace(row, target, *pattern_repl): + """ + Replaces the pattern in the target string with a given string. The pattern + can be either a string or regular expression, if a regular expression is + used groups can be used in the replacement string. + + :param row: The row being transformed (not used) + :param target: The value to perform the replacement on + :param pattern_repl: Any number of parameters that have pattern and + replacement strings, there should be an even number of elements + with the 1st, 3rd, 5th etc representing the patterns and teh 2nd, + 4th, 6th ets representing the corresponding replacements + + :return: The transformed object + """ + result = target + patterns = (p for i, p in enumerate(pattern_repl) if i % 2 == 0) + repls = (r for i, r in enumerate(pattern_repl) if i % 2 != 0) + + for pattern, repl in zip(patterns, repls): + if isinstance(pattern, str): + result = str(result).replace(pattern, repl) + else: + result = pattern.sub(repl, str(result)) + + return result + + +def default_match(row, target, pattern: Pattern): + """ + Checks if a pattern matches the target. The pattern can be either a string + or regular expression, if a string is used it is the same as + `pattern == target`. + + :param row: The row being checked (not used) + :param target: The value to perform the check on + :param pattern: The pattern to find match the target + + :return: True if the pattern matches the pattern, False otherwise + """ + if isinstance(pattern, str): + return str(target) == pattern + else: + return bool(pattern.fullmatch(str(target))) + + +def default_search(row, target, pattern: Pattern): + """ + Checks if a pattern is in the target. The pattern can be either a string + or regular expression, if a string is used it is the same as + `pattern in target`. + + :param row: The row being checked (not used) + :param target: The value to perform the check on + :param pattern: The pattern to find in the target + + :return: True if the pattern matches the pattern, False otherwise + """ + if isinstance(pattern, str): + return pattern in target + else: + return bool(pattern.search(target)) + + +def default_join(row, join, *elements): + """ + Joins a set of objects as strings + + :param row: The row being transformed (not used) + :param join: The string used to join the elements + :param elements: The elements to join + + :return: The joined string + """ + return str(join).join(map(str, elements)) + + +def transform_loc_perils(row: RowType, target, *pattern_repl): + if isinstance(target, str): + perils = [p.strip() for p in target.split(',')] + transformed_perils = [] + + # Convert the pattern_repl tuple to a list of pairs + pattern_repl_list = list(zip(pattern_repl[::2], pattern_repl[1::2])) + + for peril in perils: + for pattern, repl in pattern_repl_list: + if peril == pattern.strip("'"): + transformed_perils.append(repl.strip("'")) + break + else: + transformed_perils.append(peril) + + # Join the transformed perils using a comma and space + return ', '.join(transformed_perils) + else: + return target + + +@v_args(inline=True) +class BaseTreeTransformer(_LarkTransformer): + """ + Abstract implementation of the Tree transformer class + """ + + lookup: Callable[[RowType, str], Any] + add: Callable[[RowType, Any, Any], Any] + subtract: Callable[[RowType, Any, Any], Any] + multiply: Callable[[RowType, Any, Any], Any] + divide: Callable[[RowType, Any, Any], Any] + eq: Callable[[RowType, Any, Any], Any] + not_eq: Callable[[RowType, Any, Any], Any] + is_in: Callable[[RowType, Any, Any], Any] + not_in: Callable[[RowType, Any, Any], Any] + gt: Callable[[RowType, Any, Any], Any] + gte: Callable[[RowType, Any, Any], Any] + lt: Callable[[RowType, Any, Any], Any] + lte: Callable[[RowType, Any, Any], Any] + logical_not: Callable[[RowType, Any, Any], Any] + logical_or: Callable[[RowType, Any, Any], Any] + logical_and: Callable[[RowType, Any, Any], Any] + any: Callable[[RowType, List[Any]], GroupWrapper] + all: Callable[[RowType, List[Any]], GroupWrapper] + str_join: Callable[..., Any] + str_replace: Callable[[RowType, Any, Pattern, Any], Any] + str_match: Callable[[RowType, Any, Pattern, Any], Any] + str_search: Callable[[RowType, Any, Pattern, Any], Any] + + array = v_args(inline=False)(list) + string_escape_re = re.compile(r"`([`'])") + + def string(self, value=""): + """ + Parses a string from the transformer language and performs any + necessary escaping. `value` has a default value to account for the + empty string case. + + :param value: The value to parse + + :return: The parsed value + """ + # process any escape characters + return self.string_escape_re.sub(r"\1", value) + + def regex(self, value=""): + """ + Generates a regex from teh provided string + + :param value: The pattern + + :return: The regex object + """ + return re.compile(self.string(value)) + + def iregex(self, value=""): + """ + Generates a case insensitive regex from teh provided string + + :param value: The pattern + + :return: The regex object + """ + return re.compile(self.string(value), flags=re.IGNORECASE) + + def boolean(self, value): + """ + Pareses a boolean from the transformer language. + + :param value: The value to parse + + :return: True if the value is "True", False otherwise + """ + return value == "True" + + def null(self, value): + """ + Pareses a null from the transformer language. + + :param value: The value to parse (ignored as its always Null) + + :return: None + """ + return None + + def number(self, value): + """ + Parses a number from the transformer language. First tries to parse an + integer but on failure parses as a float. + + :param value: The value to parse + + :return: The parsed value + """ + try: + return int(value) + except ValueError: + return float(value) + + +def create_transformer_class(row, transformer_mapping): + """ + Creates a transformer class from the provided mapping overrides. + + :param row: The row to transform + :param transformer_mapping: The overrides for the transform functions + + :return: The new transformer class + """ + transformer_mapping = { + "lookup": lambda r, name: r[name], + "add": lambda r, lhs, rhs: add(lhs, rhs), + "subtract": lambda r, lhs, rhs: sub(lhs, rhs), + "multiply": lambda r, lhs, rhs: mul(lhs, rhs), + "divide": lambda r, lhs, rhs: div(lhs, rhs), + "eq": lambda r, lhs, rhs: lhs == rhs, + "not_eq": lambda r, lhs, rhs: lhs != rhs, + "is_in": default_in_transformer, + "not_in": default_not_in_transformer, + "gt": lambda r, lhs, rhs: lhs > rhs, + "gte": lambda r, lhs, rhs: lhs >= rhs, + "lt": lambda r, lhs, rhs: lhs < rhs, + "lte": lambda r, lhs, rhs: lhs <= rhs, + "logical_or": lambda r, lhs, rhs: lhs or rhs, + "logical_and": lambda r, lhs, rhs: lhs and rhs, + "logical_not": lambda r, v: not v, + "any": lambda r, v: AnyWrapper(v), + "all": lambda r, v: AllWrapper(v), + "str_join": default_join, + "str_replace": default_replace, + "str_match": default_match, + "str_search": default_search, + "transform_loc_perils": transform_loc_perils, + **(transformer_mapping or {}), + } + + def mapped_function(name, *args, **kwargs): + return transformer_mapping[name](row, *args, **kwargs) + + @v_args(inline=True) + class TreeTransformer(BaseTreeTransformer): + lookup = partial(mapped_function, "lookup") + add = partial(mapped_function, "add") + subtract = partial(mapped_function, "subtract") + multiply = partial(mapped_function, "multiply") + divide = partial(mapped_function, "divide") + eq = partial(mapped_function, "eq") + not_eq = partial(mapped_function, "not_eq") + is_in = partial(mapped_function, "is_in") + not_in = partial(mapped_function, "not_in") + gt = partial(mapped_function, "gt") + gte = partial(mapped_function, "gte") + lt = partial(mapped_function, "lt") + lte = partial(mapped_function, "lte") + logical_not = partial(mapped_function, "logical_not") + logical_or = partial(mapped_function, "logical_or") + logical_and = partial(mapped_function, "logical_and") + any = partial(mapped_function, "any") + all = partial(mapped_function, "all") + str_join = partial(mapped_function, "str_join") + str_replace = partial(mapped_function, "str_replace") + str_match = partial(mapped_function, "str_match") + str_search = partial(mapped_function, "str_search") + + return TreeTransformer + + +def parse(expression: Union[str, Tree]) -> Tree: + """ + Parse an expression from the transformation language + + :param expression: The expression to pass + + :return: The parsd expression tree + """ + if not isinstance(expression, str): + return expression + + try: + return parser.parse(expression) + except lark_exceptions.UnexpectedCharacters as e: + raise UnexpectedCharacters( + expression, expression[e.pos_in_stream], e.column + ) + + +def transform( + row, + tree: Tree, + transformer_mapping: TransformerMapping = None, +): + """ + Performs the transformation on the row + + :param row: The row to transform + :param tree: The parsed tree for the expression + :param transformer_mapping: Overrides for the transformer operations + + :return: The transformation result + """ + transformer_class = create_transformer_class(row, transformer_mapping) + transformer = transformer_class() + + return transformer.transform(tree) + + +def run( + row, + expression: Union[str, Tree], + transformer_mapping: TransformerMapping = None, +): + """ + Runs a transformation expression on a row + + :param row: The row to transform + :param expression: The transformation to perform + :param transformer_mapping: Overrides for the transformer operations + + :return: The transformed result + """ + if not isinstance(expression, (str, Tree)): + return expression + + return transform( + row, parse(expression), transformer_mapping=transformer_mapping + ) diff --git a/ods_tools/odtf/validator_base.py b/ods_tools/odtf/validator_base.py new file mode 100644 index 00000000..0a3eda2e --- /dev/null +++ b/ods_tools/odtf/validator_base.py @@ -0,0 +1,198 @@ +import logging +import os +from functools import reduce +from typing import ( + Any, + Dict, + Generic, + List, + Optional, + TypedDict, + TypeVar, + Union, +) + +import yaml + +from .data import get_data_path + +logger = logging.getLogger(__name__) + +DataType = TypeVar("DataType") +GroupedDataType = TypeVar("GroupedDataType") +GroupedDataType_cov = TypeVar("GroupedDataType_cov", covariant=True) + + +class ValidationResultEntry(TypedDict, total=False): + field: Optional[str] + groups: Optional[Dict[str, Any]] + value: Optional[Any] + error: Optional[str] + + +class ValidationResult(TypedDict): + name: str + operator: str + entries: List[ValidationResultEntry] + + +class ValidationLogEntry(TypedDict): + file_type: str + format: str + validation_file: Optional[str] + validations: List[ValidationResult] + + +class ValidatorConfigEntry: + def __init__(self, validator_name, config): + self.validator_name = validator_name + self.fields = config.get("fields", []) + self.operator = config.get("operator", "sum") + self.group_by = config.get("group_by", None) + + def __eq__(self, other): + return all( + [ + self.validator_name == other.validator_name, + self.fields == other.fields, + self.operator == other.operator, + self.group_by == other.group_by, + ] + ) + + +class ValidatorConfig: + def __init__(self, path=None, raw_config=None): + if raw_config: + self.raw_config = raw_config + else: + self.path = path + + with open(self.path) as f: + self.raw_config = yaml.load(f, yaml.Loader) + + self.entries = [ + ValidatorConfigEntry(k, v) + for k, v in self.raw_config.get("entries", {}).items() + ] + + def __eq__(self, other): + return self.entries == other.entries + + +class BaseValidator(Generic[DataType, GroupedDataType]): + def __init__( + self, + search_paths: List[str] = None, + standard_search_path: str = get_data_path("validators"), + search_working_dir=True, + ): + self.search_paths = [ + *(search_paths or []), + *([os.getcwd()] if search_working_dir else []), + standard_search_path, + ] + + def load_config( + self, fmt, version, file_type + ) -> Union[None, ValidatorConfig]: + # Build the candidate paths with and without the version preferring + # with the version if its available + candidate_paths = [ + os.path.join(p, f"validation_{fmt}_v{version}_{file_type}.yaml") + for p in self.search_paths + ] + [ + os.path.join(p, f"validation_{fmt}_{file_type}.yaml") + for p in self.search_paths + ] + + # find the first validation config path that matches the format + config_path = reduce( + lambda found, current: found + or (current if os.path.exists(current) else None), + candidate_paths, + None, + ) + + if not config_path: + logger.warning( + f"Could not find validator config for {fmt}. " + f"Tried paths {', '.join(candidate_paths)}" + ) + return None + + return ValidatorConfig(config_path) + + def run(self, data: DataType, fmt: str, version: str, file_type: str, enable_logging: bool = False): + config = self.load_config(fmt, version, file_type) + + result: ValidationLogEntry = { + "file_type": file_type, + "format": fmt, + "validation_file": config.path if config else None, + "validations": [], + } + if config: + for entry in config.entries: + result["validations"].append(self.run_entry(data, entry)) + + if enable_logging: + logger.info(yaml.safe_dump([result])) + return result + + def group_data( + self, data: DataType, group_by: List[str], entry: ValidatorConfigEntry + ) -> GroupedDataType_cov: # pragma: no cover + raise NotImplementedError() + + def sum( + self, + data: Union[DataType, GroupedDataType], + entry: ValidatorConfigEntry, + ) -> List[ValidationResultEntry]: # pragma: no cover + raise NotImplementedError() + + def count( + self, + data: Union[DataType, GroupedDataType], + entry: ValidatorConfigEntry, + ) -> List[ValidationResultEntry]: # pragma: no cover + raise NotImplementedError() + + def count_unique( + self, + data: Union[DataType, GroupedDataType], + entry: ValidatorConfigEntry, + ) -> List[ValidationResultEntry]: # pragma: no cover + raise NotImplementedError() + + def run_entry( + self, data: DataType, entry: ValidatorConfigEntry + ) -> ValidationResult: + if entry.group_by is not None: + data = self.group_data(data, entry.group_by, entry) + + if entry.operator == "sum": + return ValidationResult( + name=entry.validator_name, + operator=entry.operator, + entries=self.sum(data, entry), # types: ignore + ) + elif entry.operator == "count": + return ValidationResult( + name=entry.validator_name, + operator=entry.operator, + entries=self.count(data, entry), # types: ignore + ) + elif entry.operator == "count-unique": + return ValidationResult( + name=entry.validator_name, + operator=entry.operator, + entries=self.count_unique(data, entry), # types: ignore + ) + else: + return ValidationResult( + name=entry.validator_name, + operator=entry.operator, + entries=[{"error": "Unknown operator"}], + ) diff --git a/ods_tools/odtf/validator_pandas.py b/ods_tools/odtf/validator_pandas.py new file mode 100644 index 00000000..0f8e58c6 --- /dev/null +++ b/ods_tools/odtf/validator_pandas.py @@ -0,0 +1,106 @@ +from itertools import product +from typing import List, Union +from uuid import uuid4 + +import pandas as pd +from pandas.core.groupby.generic import DataFrameGroupBy + +from .validator_base import ( + BaseValidator, + ValidationResult, + ValidationResultEntry, + ValidatorConfigEntry, +) + + +class PandasValidator(BaseValidator): + def run_entry( + self, data: pd.DataFrame, entry: ValidatorConfigEntry + ) -> ValidationResult: + fields = set(entry.fields + (entry.group_by or [])) + + if not entry.fields: + # if no fields are selected copy the index into a temp column + # so that counts can still be performed + field_name = uuid4().hex + data[field_name] = 1 + fields.add(field_name) + + res = super().run_entry(data[list(fields)], entry) + + data.drop(columns=[field_name], inplace=True) + return res + else: + return super().run_entry(data[list(fields)], entry) + + def group_data( + self, + data: pd.DataFrame, + group_by: List[str], + entry: ValidatorConfigEntry, + ) -> DataFrameGroupBy: + return data.groupby(group_by) + + def sum( + self, + data: Union[pd.DataFrame, DataFrameGroupBy], + entry: ValidatorConfigEntry, + ) -> List[ValidationResultEntry]: + sum_res = data.sum() + + if hasattr(sum_res, "to_frame"): + sum_res = sum_res.to_frame().transpose() + + return self._generate_result(sum_res, entry) + + def count( + self, + data: Union[pd.DataFrame, DataFrameGroupBy], + entry: ValidatorConfigEntry, + ) -> List[ValidationResultEntry]: + count_res = data.count() + + if hasattr(count_res, "to_frame"): + count_res = count_res.to_frame().transpose() + + return self._generate_result(count_res, entry) + + def count_unique( + self, + data: Union[pd.DataFrame, DataFrameGroupBy], + entry: ValidatorConfigEntry, + ) -> List[ValidationResultEntry]: + count_res = data.nunique() + + if hasattr(count_res, "to_frame"): + count_res = count_res.to_frame().transpose() + + return self._generate_result(count_res, entry) + + def _generate_result( + self, + data: Union[pd.DataFrame, DataFrameGroupBy], + config_entry: ValidatorConfigEntry, + ) -> List[ValidationResultEntry]: + results = [] + + fields = config_entry.fields or data.columns + for (index, row), field in product(data.iterrows(), fields): + res_entry = ValidationResultEntry(value=str(row[field])) + + if config_entry.fields: + res_entry["field"] = field + + if config_entry.group_by: + if len(config_entry.group_by) == 1: + res_entry["groups"] = { + config_entry.group_by[0]: str(index) + } + else: + res_entry["groups"] = dict( + zip(config_entry.group_by, map(str, index)) + ) + + results.append(res_entry) + + return results diff --git a/ods_tools/oed/oed_schema.py b/ods_tools/oed/oed_schema.py index eba6cb87..7d2ac6da 100644 --- a/ods_tools/oed/oed_schema.py +++ b/ods_tools/oed/oed_schema.py @@ -101,6 +101,7 @@ def from_json(cls, oed_json): @cached_property def nb_perils_dict(self): + """dict peril group to sub_peril""" nb_perils_dict = nb.typed.Dict.empty( key_type=nb.types.UnicodeCharSeq(3), value_type=nb.types.UnicodeCharSeq(3)[:], @@ -110,16 +111,33 @@ def nb_perils_dict(self): return nb_perils_dict - def peril_filtering(self, peril_ids, peril_filters): + @cached_property + def nb_peril_groups_dict(self): + """ dict peril group to all included peril group """ + nb_peril_groups_dict = nb.typed.Dict.empty( + key_type=nb.types.UnicodeCharSeq(3), + value_type=nb.types.UnicodeCharSeq(3)[:], + ) + for peril_group_key, perils in self.schema['perils']['covered'].items(): + peril_groups = [] + for peril_group_include, perils_include in self.schema['perils']['covered'].items(): + if not set(perils_include).difference(set(perils)): + peril_groups.append(peril_group_include) + nb_peril_groups_dict[peril_group_key] = np.array(peril_groups, dtype='U3') + return nb_peril_groups_dict + + def peril_filtering(self, peril_ids, peril_filters, include_sub_group=True): """ check if peril_ids are part of the peril groups in peril_filters, both array need to match size Args: peril_ids (pd.Series): peril that are checked peril_filters (pd.Series): peril groups to check against + include_sub_group (bool): if True condiders peril group as valid (WW1 is valid for AA1) :return: np.array of True and False """ - return jit_peril_filtering(peril_ids.to_numpy().astype('str'), peril_filters.to_numpy().astype('str'), self.nb_perils_dict) + return jit_peril_filtering(peril_ids.to_numpy().astype('str'), peril_filters.to_numpy().astype('str'), + self.nb_peril_groups_dict if include_sub_group else self.nb_perils_dict) @staticmethod def to_universal_field_name(column: str): diff --git a/requirements.in b/requirements.in index 5a16a0f4..35aa4b0b 100644 --- a/requirements.in +++ b/requirements.in @@ -5,3 +5,6 @@ jsonschema jsonref oasis-data-manager packaging +PyYAML +lark +networkx diff --git a/setup.py b/setup.py index b4923815..b79298a0 100644 --- a/setup.py +++ b/setup.py @@ -96,7 +96,7 @@ def run(self): include_package_data=True, package_data={ "": ["*.md"], # Copy in readme - "ods_tools": ["data/*"] # Copy spec JSON/CSV + "ods_tools": ["data/*", "odtf/data/mappings/*"] # Copy spec JSON/CSV and YAML mappings }, entry_points={ 'console_scripts': [ diff --git a/tests/loctest_transform_input.csv b/tests/loctest_transform_input.csv new file mode 100644 index 00000000..2843e97b --- /dev/null +++ b/tests/loctest_transform_input.csv @@ -0,0 +1,5 @@ +ContractID,LocationID,LocationName,ISOBIN,LocationGroup,IsPrimary,IsTenant,InceptionDate,ExpirationDate,Street,City,SubArea2,SubArea,Area,CRESTA,PostalCode,CountryISO,Latitude,Longitude,UserGeocodeMatchLevel,GeocoderCode,EnhancedGeoMatchLevelCode,GeocoderAccountId,BuildingValue,OtherValue,ContentsValue,TimeElementValue,DaysCovered,Currency,RiskCount,Premium,ConstructionCodeType,ConstructionCode,ConstructionOther,OccupancyCodeType,OccupancyCode,YearBuilt,NumberOfStories,GrossArea,GrossAreaUnit,BuildingHeight,BuildingHeightUnitCode,Territory,NonCATGroundUpLoss,UDF1,UDF2,UDF3,UDF4,UDF5,LocationDFID,SubareaName,ISOConstructionCode,ISOOccupancyCode,FloorArea,FloorAreaUnitCode,FloorsOccupied,CustomFloodSOP,CustomFloodSOPType,CustomFloodZone,DefensibleSpace,FirewiseCommunityParticipation,FloorOfInterest,BuildingCondition,BuildingShape,Torsion,SoftStory,ShapeIrregularity,SpecialConstruction,Retrofit,ShortColumn,Ornamentation,WaterHeater,Redundancy,TallOneStory,Equipment,SealOfApproval,RoofGeometry,RoofPitch,RoofCover,RoofDeck,RoofCoverAttachment,RoofDeckAttachment,RoofAnchorage,RoofAttachedStructure,RoofYearBuilt,Tank,RoofHailImpactResistance,,WallType,WallSiding,GlassType,GlassPercent,WindowProtection,ExternalDoors,BuildingExteriorOpening,BrickVeneer,FoundationConnection,FoundationType,InternalPartition,Welding,TransitionInSRC,MultiStoryHallType,LatticeType,IsValueType,ColumnBasement,ColdFormedTube,AttachedStructures,AppurtenantStructures,Pounding,TreeExposure,SmallDebris,LargeMissile,TerrainRoughness,AdjacentBuildingHeight,ProjectCompletion,ProjectPhaseCode,BasementLevelCount,BasementFinishType,CustomElevation,CustomElevationUnit,BaseFloodElevation,BaseFloodElevationUnit,FirstFloorHeight,FirstFloorHeightUnit,ServiceEquipmentProtection,WetFloodProofing,FIRMCompliance,ContentVulnerability,CertifiedStructuresIBHS,PPCCode,IsFireSprinklerAvailable,ContentDamageability,CargoPacking,CargoProtection,SpecieStorage,SprinklerType,SalvagePotential,LocPerils,LocLimitType,LimitBldg,LimitOther,LimitContent,LimitTime,Participation1,Participation2,DeductType,DeductBldg,DeductOther,DeductContent,DeductTime,AggregateLimitType,AggregateLimit,MinMaxDeductType,MinDeduct,MaxDeduct,AggregateDeductType,AggregateDeduct +1254209,11358392,1,,,0,0,2022-05-01,2023-04-30,,,,,,BEL_3,3001,BE,50.86549,4.67937,,UN,USER,,0,0,4502825,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,"HL, ST, SW, TC, TD, WS",C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358401,10,,,0,0,2022-05-01,2023-04-30,,,,Hefei - Xishi Qu,Anhui,,,CN,31.86141,117.27562,,UN,,,206141,0,409903,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,5412.9274,SQFT,0,,,0,,,,,,,Hefei - Xishi Qu,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,"HL, ST, SW, TC, TD, WS",C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358491,100,,,0,0,2022-05-01,2023-04-30,,,,Queenstown,,Singapore,117556,SG,1.29865,103.77548,,UN,,,0,0,5980828,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Queenstown,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,"HL, ST, SW, TC, TD, WS",C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 +1254209,11358492,101,,,0,0,2022-05-01,2023-04-30,,,,Queenstown,,Singapore,117684,SG,1.28847,103.779518,,UN,,,0,0,5219727,0,365,USD,1,0,AIR,100,100,AIR,315,0,0,0,SQFT,0,,,0,,,,,,,Queenstown,,,0,SQFT,,-999,H,0,-999,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-999,,-999,,-999,,0,0,0,0,0,,0,0,0,0,0,0,0,"HL, ST, SW, TC, TD, WS",C,0,0,0,0,1,1,C,0,0,0,0,N,0,N,0,0,N,0 \ No newline at end of file diff --git a/tests/loctest_transform_output.csv b/tests/loctest_transform_output.csv new file mode 100644 index 00000000..9d943f30 --- /dev/null +++ b/tests/loctest_transform_output.csv @@ -0,0 +1,5 @@ +AccNumber,AppurtenantStructure,AreaCode,BaseFloodElevation,BaseFloodElevationUnit,Basement,BasementLevelCount,BIPOI,BITIV,BrickVeneer,BuildingCondition,BuildingExteriorOpening,BuildingHeight,BuildingHeightUnit,BuildingShape,BuildingTIV,Packaging,Protection,City,CondTag,ConstructionQuality,ConstructionCode,ContentsFloodVuln,ContentsTIV,CountryCode,CustomFloodSOP,CustomFloodZone,EquipmentBracing,ExternalDoors,FEMACompliance,FirstFloorHeight,FirstFloorHeightUnit,FlexiLocAdjacentBuildingHeight,FlexiLocConstructionOther,FlexiLocColdFormedTubeCode,FlexiLocColumnBasementCode,FlexiLocContentDamageabilityCode,FlexiLocCustomFloodSOPType,FlexiLocDefensibleSpace,FlexiLocEnhancedGeoMatchLevelCode,FlexiLocFirewiseCommunityParticipation,FlexiLocFloorOfInterest,FlexiLocGeocoderAccountId,FlexiLocGlassPercentCode,FlexiLocGrossArea,FlexiLocGrossAreaUnit,FlexiLocIsFireSprinklerAvailable,FlexiLocISOBIN,FlexiLocISOConstructionCode,FlexiLocISOOccupancyCode,FlexiLocLargeMissileCode,FlexiLocParticipation2,FlexiLocPPCCode,FlexiLocProjectPhaseCode,FlexiLocRoofHailImpactResistanceCode,FlexiLocSealOfApprovalCode,FlexiLocSubareaName,FlexiLocSubarea2Name,FlexiLocTerritory,FlexiLocTransitionInSRCCode,FlexiLocUserGeocodeMatchLevel,FlexiLocWallCode,FlexiLocWallSidingCode,FlexiLocWaterHeaterCode,FlexiLocWeldingCode,FloodDefenseHeight,FloorArea,FloorAreaUnit,FloorsOccupied,FoundationConnection,FoundationType,Geocoder,GeogScheme1,GlassType,GroundElevation,GroundElevationUnit,InternalPartition,IsPrimary,IsTenant,Latitude,LatticeType,LocCurrency,LocDed1Building,LocDed2Other,LocDed3Contents,LocDed4BI,LocDed5PD,LocDed6All,LocDedCode1Building,LocDedCode2Other,LocDedCode3Contents,LocDedCode4BI,LocDedCode5PD,LocDedCode6All,LocDedType1Building,LocDedType2Other,LocDedType3Contents,LocDedType4BI,LocDedType5PD,LocDedType6All,LocExpiryDate,LocNetPremium,LocGroup,LocInceptionDate,LocLimit1Building,LocLimit2Other,LocLimit3Contents,LocLimit4BI,LocLimit5PD,LocLimit6All,LocLimitCode1Building,LocLimitCode2Other,LocLimitCode3Contents,LocLimitCode4BI,LocLimitCode5PD,LocLimitCode6All,LocLimitType1Building,LocLimitType2Other,LocLimitType3Contents,LocLimitType4BI,LocLimitType5PD,LocLimitType6All,LocMaxDed1Building,LocMaxDed2Other,LocMaxDed3Contents,LocMaxDed4BI,LocMaxDed5PD,LocMaxDed6All,LocMinDed1Building,LocMinDed2Other,LocMinDed3Contents,LocMinDed4BI,LocMinDed5PD,LocMinDed6All,LocName,LocParticipation,LocPeril,LocPerilsCovered,LocNumber,LocUserDef1,LocUserDef2,LocUserDef3,LocUserDef4,LocUserDef5,Longitude,MultiStoryHall,NonCATGroundUpLoss,NumberOfBuildings,NumberOfStoreys,OccupancyCode,Ornamentation,OtherTIV,PercentComplete,PostalCode,Pounding,Redundancy,Retrofit,RoofAnchorage,RoofAttachedStructures,RoofCover,RoofCoverAttachment,RoofDeck,RoofDeckAttachment,RoofGeometry,RoofPitch,RoofYearBuilt,SalvageProtection,ServiceEquipmentProtection,ShapeIrregularity,ShortColumn,SmallDebris,SoftStory,SpecialEQConstruction,ValuablesStorage,SprinklerType,StreetAddress,TallOneStory,Tank,TerrainRoughness,Torsion,TreeExposure,VulnerabilitySetID,WindowProtection,YearBuilt +1254209,0,,-999.0,,0,0,365,0.0,0,0,0,0,,0,0.0,0,0,,,0,5000,0,4502825.0,BE,-999.0,0,0,0,0,-999.0,,0,5000,0,0,0,H,-999,USER,0,0,,0,0.0,11,0,,,,0,1.0,,0,0,0,,,,0,,0,0,0,0,0,0,11,,0,0,UN,BEL_3,0,-999.0,,0,0,0,50.86549,0,USD,0.0,0.0,0.0,0.0,,,0,0,0,0,0,0,0,0,0,0,0,0,2023-04-30,0.0,,2022-05-01,0.0,0.0,0.0,0.0,,,0,0,0,0,0,0,0,0,0,0,0,0,,,,,,,,,,,,,1,1.0,"HL, ST, SW, TC, TD, WS","HL, ST, SW, TC, TD, WS",11358392,,,,,,4.67937,0,0.0,1,0,1104,0,0.0,0.0,3001.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,,0,0 +1254209,0,Anhui,-999.0,,0,0,365,0.0,0,0,0,0,,0,206141.0,0,0,,,0,5000,0,409903.0,CN,-999.0,0,0,0,0,-999.0,,0,5000,0,0,0,H,-999,,0,0,,0,5412.9274,11,0,,,,0,1.0,,0,0,0,Hefei - Xishi Qu,,,0,,0,0,0,0,0,0,11,,0,0,UN,,0,-999.0,,0,0,0,31.86141,0,USD,0.0,0.0,0.0,0.0,,,0,0,0,0,0,0,0,0,0,0,0,0,2023-04-30,0.0,,2022-05-01,0.0,0.0,0.0,0.0,,,0,0,0,0,0,0,0,0,0,0,0,0,,,,,,,,,,,,,10,1.0,"HL, ST, SW, TC, TD, WS","HL, ST, SW, TC, TD, WS",11358401,,,,,,117.27562,0,0.0,1,0,1104,0,0.0,0.0,,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,,0,0 +1254209,0,,-999.0,,0,0,365,0.0,0,0,0,0,,0,0.0,0,0,,,0,5000,0,5980828.0,SG,-999.0,0,0,0,0,-999.0,,0,5000,0,0,0,H,-999,,0,0,,0,0.0,11,0,,,,0,1.0,,0,0,0,Queenstown,,,0,,0,0,0,0,0,0,11,,0,0,UN,Singapore,0,-999.0,,0,0,0,1.29865,0,USD,0.0,0.0,0.0,0.0,,,0,0,0,0,0,0,0,0,0,0,0,0,2023-04-30,0.0,,2022-05-01,0.0,0.0,0.0,0.0,,,0,0,0,0,0,0,0,0,0,0,0,0,,,,,,,,,,,,,100,1.0,"HL, ST, SW, TC, TD, WS","HL, ST, SW, TC, TD, WS",11358491,,,,,,103.77548,0,0.0,1,0,1104,0,0.0,0.0,117556.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,,0,0 +1254209,0,,-999.0,,0,0,365,0.0,0,0,0,0,,0,0.0,0,0,,,0,5000,0,5219727.0,SG,-999.0,0,0,0,0,-999.0,,0,5000,0,0,0,H,-999,,0,0,,0,0.0,11,0,,,,0,1.0,,0,0,0,Queenstown,,,0,,0,0,0,0,0,0,11,,0,0,UN,Singapore,0,-999.0,,0,0,0,1.28847,0,USD,0.0,0.0,0.0,0.0,,,0,0,0,0,0,0,0,0,0,0,0,0,2023-04-30,0.0,,2022-05-01,0.0,0.0,0.0,0.0,,,0,0,0,0,0,0,0,0,0,0,0,0,,,,,,,,,,,,,101,1.0,"HL, ST, SW, TC, TD, WS","HL, ST, SW, TC, TD, WS",11358492,,,,,,103.779518,0,0.0,1,0,1104,0,0.0,0.0,117684.0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,,0,0,0,0,0,,0,0 diff --git a/tests/test_ods_package.py b/tests/test_ods_package.py index 35d739c7..cebdcabb 100644 --- a/tests/test_ods_package.py +++ b/tests/test_ods_package.py @@ -7,6 +7,7 @@ import urllib import sys +import yaml import pandas as pd import numpy as np @@ -19,6 +20,7 @@ from ods_tools.main import convert from ods_tools.oed import OedExposure, OedSchema, OdsException, ModelSettingSchema, AnalysisSettingSchema, OED_TYPE_TO_NAME, UnknownColumnSaveOption +from ods_tools.odtf.controller import transform_format logger = logging.getLogger(__file__) @@ -650,7 +652,7 @@ def test_versioning_fallback(self): # Convert oed_exposure.to_version("1.9") - # # Assert the OccupancyCode is as expected + # Assert the OccupancyCode is as expected assert oed_exposure.location.dataframe.loc[0, "OccupancyCode"] == 9998 def test_versioning_fallback_not_exact(self): @@ -850,3 +852,114 @@ def test_all_analysis_options__in_valid_metrics(self): self.assertEqual(expected_list, global__valid_output_metrics) self.assertEqual(expected_list, event_set__valid_metrics) + + def test_transformation_as_expected_loc(self): + with tempfile.TemporaryDirectory() as tmp_dir: + + # Prepare the necessary files for the test + config_file_path = pathlib.Path(tmp_dir, 'config.yaml') + with open(config_file_path, 'w') as config_file: + yaml.dump({ + 'transformations': { + 'loc': { + 'input_format': { + 'name': 'Cede_Location', + 'version': '10.0.0' + }, + 'output_format': { + 'name': 'OED_Location', + 'version': '3.0.2' + }, + 'runner': { + 'batch_size': 10000 + }, + 'extractor': { + 'options': { + 'path': str(pathlib.Path(base_test_path, 'loctest_transform_input.csv')), + 'quoting': 'minimal' + } + }, + 'loader': { + 'options': { + 'path': str(pathlib.Path(tmp_dir, 'oed_location_output.csv')), + 'quoting': 'minimal' + } + } + } + } + }, config_file) + + # Run the transformation + transform_result = transform_format(str(config_file_path)) + + # Assert the transformation result + assert len(transform_result) == 1 + assert transform_result[0][0] == str(pathlib.Path(tmp_dir, 'oed_location_output.csv')) + assert transform_result[0][1] == 'location' + + output_df = pd.read_csv(transform_result[0][0]) + expected_output = pd.read_csv(str(pathlib.Path(base_test_path, 'loctest_transform_output.csv'))) + pd.testing.assert_frame_equal(output_df, expected_output) + + def test_transformation_as_expected_acc(self): + with tempfile.TemporaryDirectory() as tmp_dir: + # Create a temporary CSV file with the input data for 'acc' + input_acc_path = pathlib.Path(tmp_dir, 'input_acc.csv') + with open(input_acc_path, 'w') as input_acc_file: + input_acc_file.write( + "ContractID,InceptionDate,ExpirationDate,Perils,LayerID,LayerPerils,DedAmt1,AttachmentAmt,SublimitPerils\n" + "1253900,2021-11-29,2022-11-28,4334220,2349611,4334220,25000,50000000,CF\n" + "1253900,2021-11-29,2022-11-28,4334220,2349611,4334220,25000,50000000,CH\n" + "1253901,2021-11-01,2022-10-31,4334220,2349615,4334220,500000,225000000,EQ\n" + ) + + # Prepare the necessary files for the test + config_file_path = pathlib.Path(tmp_dir, 'config.yaml') + with open(config_file_path, 'w') as config_file: + yaml.dump({ + 'transformations': { + 'acc': { + 'input_format': { + 'name': 'Cede_Contract', + 'version': '10.0.0' + }, + 'output_format': { + 'name': 'OED_Contract', + 'version': '3.0.2' + }, + 'runner': { + 'batch_size': 10000 + }, + 'extractor': { + 'options': { + 'path': str(input_acc_path), + 'quoting': 'minimal' + } + }, + 'loader': { + 'options': { + 'path': str(pathlib.Path(tmp_dir, 'oed_account_output.csv')), + 'quoting': 'minimal' + } + } + } + } + }, config_file) + + # Run the transformation + transform_result = transform_format(str(config_file_path)) + + # Assert the transformation result + assert len(transform_result) == 1 + assert transform_result[0][0] == str(pathlib.Path(tmp_dir, 'oed_account_output.csv')) + assert transform_result[0][1] == 'account' + + # Perform assertions on specific columns in the output file + output_df = pd.read_csv(transform_result[0][0]) + expected_output = pd.DataFrame({ + 'AccNumber': ['1253900', '1253900', '1253901'], + 'AccPeril': ['4334220', '4334220', '4334220'], + 'CondPeril': ['WSS', 'XCH', 'QEQ'], + 'LayerAttachment': ['50000000.0', '50000000.0', '225000000.0'] + }) + pd.testing.assert_frame_equal(output_df[expected_output.columns].astype(str), expected_output.astype(str))