Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 21 additions & 4 deletions cda-etl/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,22 @@ If `SOURCE_CDA_URL` is not configured, the pipeline skips the download phase and

## What It Does

The ETL process currently handles three CWMS resource types:
The ETL process handles these CWMS resource types:

- Locations
- Projects
- Timeseries data
- Clobs
- Location levels
- Ratings
- Properties (office- and project-level)
- Outlets
- Turbines, and turbine changes
- Locks (physical lock structures)
- Gate changes
- Water users, water contracts (including pump associations and water supply accounting)
- Location groups (with assigned locations), office-level
- Timeseries groups (with assigned timeseries), office-level

The data is organized by office, project, and resource type, then written to a filesystem staging area before being posted to the destination CDA API.

Expand Down Expand Up @@ -54,15 +65,21 @@ offices:
### YAML Fields

- `version`: Config version. Must be `1`.
- `settings.startTime`: Default start time used for timeseries downloads when a timeseries does not define its own download window.
- `settings.endTime`: Default end time used for timeseries downloads when a timeseries does not define its own download window.
- `settings.startTime`: Default start time used for timeseries/window-based downloads when an item does not define its own download window.
- `settings.endTime`: Default end time used for timeseries/window-based downloads when an item does not define its own download window.
- `settings.maxThreads`: Maximum number of worker threads used for staging and publishing.
- `settings.logLevel`: Logging level for the application.
- `settings.path`: Filesystem root used for staged JSON files.
- `offices`: List of office definitions.
- `offices`: List of office definitions. Each office may also declare `properties`, `locationGroups`, and `timeseriesGroups` (office-wide, not tied to one project).
- `projects`: Projects under each office.
- `locations`: Locations under each project.
- `timeseries`: Timeseries under each project.
- `clobs`, `locationLevels`, `ratings`, `properties`: Under each project, same shape as the office-level `properties`.
- `outlets`, `turbines`, `locks`: Flat lists of `{id, enabled}` under each project - literal ids, no time window.
- `gateChanges`, `turbineChanges`: A single `{enabled, download: {startTime, endTime}}` mapping per project (not a list) - one time-windowed feed for the whole project.
- An outlet's effective rating spec is not stored on the outlet itself - CDA derives it from a `Rating`-category location group: the outlet carries a `rating-group-id`, and that group's `shared-loc-alias-id` is the rating spec id. Storing gate changes requires both to already exist on the destination, so neither needs to be hand-listed in `outlets`/`locationGroups`/`ratings` - staging/publishing outlets automatically discovers and stages/publishes the associated `Rating` location group and rating alongside them.
- `waterUsers`: Under each project - a list of `{id, enabled, contracts: [...]}`. Each contract is `{id, enabled, pumps: [...], accounting: {enabled, startTime, endTime}}`. A pump is `{id, type, enabled}` (`type` is `IN`, `OUT`, or `OUT BELOW`); a pump with `enabled: false` is disassociated from the destination contract during publish rather than skipped. `accounting.enabled` defaults to `false` when the `accounting` block is omitted entirely.
- `locationGroups`, `timeseriesGroups`: Under each office - `{categoryId, id, enabled}` entries, or `{categoryId, all: true}` for every group in a category, mirroring how `properties` categories work.

### Enabled Flags

Expand Down
6 changes: 6 additions & 0 deletions cda-etl/data/sample-data/SWT/Clobs/FLOW.EUFA.CONTROLLED.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.CONTROLLED",
"description": "all controlled discharges (gates and turbines)",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Controlled\" attribute=\"8\" is_default=\"false\"><description>all controlled discharges (gates and turbines)</description><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.Controlled\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.EUFA TURBINE_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"EUFA Turbine_Total\" attribute=\"7\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.EUFA Turbine_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /></flow_group>"
}
5 changes: 5 additions & 0 deletions cda-etl/data/sample-data/SWT/Clobs/FLOW.EUFA.GATED_TOTAL.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.GATED_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Gated_Total\" attribute=\"0\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.Gated_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set><time_series_id save_to_database=\"true\" attribute=\"0\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Controlled</parameter><parameter_type>Ave</parameter_type><interval>1Hour</interval><duration>1Hour</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id><time_series_id save_to_database=\"true\" attribute=\"1\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Controlled</parameter><parameter_type>Inst</parameter_type><interval>1Hour</interval><duration>0</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id></time_series_set></flow_group>"
}
5 changes: 5 additions & 0 deletions cda-etl/data/sample-data/SWT/Clobs/FLOW.EUFA.LOCK_TOTAL.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.LOCK_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Lock_Total\" attribute=\"10\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.Lock_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.PROJECT_TOTAL"
"id": "FLOW.EUFA.PROJECT_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Project_Total\" attribute=\"3\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.Project_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set><time_series_id save_to_database=\"true\" attribute=\"0\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Res Out</parameter><parameter_type>Ave</parameter_type><interval>~1Day</interval><duration>1Day</duration><version>Rev-Regi-Flowgroup</version><utc_offset>6h0m</utc_offset><incoming_time_series_ids /></time_series_id><time_series_id save_to_database=\"true\" attribute=\"1\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Res Out</parameter><parameter_type>Ave</parameter_type><interval>1Hour</interval><duration>1Hour</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id><time_series_id save_to_database=\"true\" attribute=\"2\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Res Out</parameter><parameter_type>Inst</parameter_type><interval>1Hour</interval><duration>0</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id></time_series_set></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.PUMP_IN_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Pump_In_Total\" attribute=\"2\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.Pump_In_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.PUMP_OUT_BELOW_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Pump_Out_Below_Total\" attribute=\"11\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.Pump_Out_Below_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.PUMP_OUT_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Pump_Out_Total\" attribute=\"1\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.Pump_Out_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.SLUICEGATE_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"SluiceGate_Total\" attribute=\"4\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.SluiceGate_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set><time_series_id save_to_database=\"true\" attribute=\"0\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-SluiceGates</parameter><parameter_type>Inst</parameter_type><interval>1Hour</interval><duration>0</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id></time_series_set></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.TAINTERGATE_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"TainterGate_Total\" attribute=\"5\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.TainterGate_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set><time_series_id save_to_database=\"true\" attribute=\"0\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-TainterGates</parameter><parameter_type>Inst</parameter_type><interval>1Hour</interval><duration>0</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id></time_series_set></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.TURBINE_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Turbine_Total\" attribute=\"6\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.Turbine_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set><time_series_id save_to_database=\"true\" attribute=\"2\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Power</parameter><parameter_type>Ave</parameter_type><interval>~1Day</interval><duration>1Day</duration><version>Rev-Regi-Flowgroup</version><utc_offset>6h0m</utc_offset><incoming_time_series_ids /></time_series_id><time_series_id save_to_database=\"true\" attribute=\"0\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Power</parameter><parameter_type>Ave</parameter_type><interval>1Hour</interval><duration>1Hour</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id><time_series_id save_to_database=\"true\" attribute=\"1\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Power</parameter><parameter_type>Inst</parameter_type><interval>1Hour</interval><duration>0</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id></time_series_set></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.EUFA.UNCONTROLLED_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Uncontrolled_Total\" attribute=\"9\" is_default=\"true\"><loc_ref base_location_id=\"EUFA\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.EUFA.Uncontrolled_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /></flow_group>"
}
5 changes: 5 additions & 0 deletions cda-etl/data/sample-data/SWT/Clobs/FLOW.KEYS.GATED_TOTAL.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.KEYS.GATED_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Gated_Total\" attribute=\"0\" is_default=\"true\"><description></description><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.KEYS.Gated_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set><time_series_id save_to_database=\"true\" attribute=\"1\"><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Controlled</parameter><parameter_type>Ave</parameter_type><interval>1Hour</interval><duration>1Hour</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0m</utc_offset><incoming_time_series_ids /></time_series_id><time_series_id save_to_database=\"true\" attribute=\"2\"><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Controlled</parameter><parameter_type>Inst</parameter_type><interval>1Hour</interval><duration>0</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0m</utc_offset><incoming_time_series_ids /></time_series_id></time_series_set><flow_group_set /></flow_group>"
}
5 changes: 5 additions & 0 deletions cda-etl/data/sample-data/SWT/Clobs/FLOW.KEYS.LOCK_TOTAL.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.KEYS.LOCK_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Lock_Total\" attribute=\"7\" is_default=\"true\"><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.KEYS.Lock_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /><flow_group_set /></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.KEYS.LOW FLOW_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"LOW Flow_Total\" attribute=\"9\" is_default=\"true\"><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.KEYS.LOW Flow_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /><flow_group_set /></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.KEYS.PROJECT_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Project_Total\" attribute=\"2\" is_default=\"true\"><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.KEYS.Project_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set><time_series_id save_to_database=\"true\" attribute=\"0\"><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Res Out</parameter><parameter_type>Ave</parameter_type><interval>~1Day</interval><duration>1Day</duration><version>Rev-Regi-Flowgroup</version><utc_offset>6h0m</utc_offset><incoming_time_series_ids /></time_series_id><time_series_id save_to_database=\"true\" attribute=\"1\"><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Res Out</parameter><parameter_type>Ave</parameter_type><interval>1Hour</interval><duration>1Hour</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id><time_series_id save_to_database=\"true\" attribute=\"2\"><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><parameter>Flow-Res Out</parameter><parameter_type>Inst</parameter_type><interval>1Hour</interval><duration>0</duration><version>Rev-Regi-Flowgroup</version><utc_offset>0s</utc_offset><incoming_time_series_ids /></time_series_id></time_series_set><flow_group_set /></flow_group>"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"office-id": "SWT",
"id": "FLOW.KEYS.PUMP_IN_TOTAL",
"value": "<flow_group override_protection=\"false\" store_rule=\"Replace All\" suffix=\"Pump_In_Total\" attribute=\"8\" is_default=\"true\"><loc_ref base_location_id=\"KEYS\" sub_location_id=\"\"><db_office_id id=\"SWT\" /></loc_ref><loc_group_ref id=\"Flow.KEYS.Pump_In_Total\"><loc_category_ref version=\"1.0\" id=\"Flow\"><db_office_id id=\"SWT\" /></loc_category_ref><db_office_id id=\"SWT\" /></loc_group_ref><output_parameter>Flow</output_parameter><time_series_set /><flow_group_set /></flow_group>"
}
Loading
Loading