From ddec112d88151683420197720eab82cb4e51d641 Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Fri, 27 Mar 2026 12:26:42 +0530 Subject: [PATCH 01/12] CDF CDM extension DM --- .../containers/Activity.Container.yaml | 13 ++ .../containers/Asset.Container.yaml | 13 ++ .../containers/Equipment.Container.yaml | 13 ++ .../containers/File.Container.yaml | 13 ++ .../containers/TimeSeries.Container.yaml | 13 ++ .../data_models/enterprise.datamodel.yaml | 54 +++++ .../data_models/schema.space.yaml | 1 + .../data_models/views/Activity.view.yaml | 69 +++++++ .../data_models/views/Asset.view.yaml | 186 +++++++++++++++++ .../data_models/views/Equipment.view.yaml | 100 +++++++++ .../data_models/views/File.view.yaml | 72 +++++++ .../data_models/views/TimeSeries.view.yaml | 85 ++++++++ .../cdf_cdm_extension/default.config.yaml | 2 + modules/models/cdf_cdm_extension/module.toml | 4 + .../containers/360Image.Container.yaml | 13 ++ .../360ImageAnnotation.Container.yaml | 13 ++ .../360ImageCollection.Container.yaml | 13 ++ .../containers/360ImageModel.Container.yaml | 13 ++ .../containers/360ImageStation.Container.yaml | 13 ++ .../containers/3DModel.Container.yaml | 13 ++ .../containers/3DObject.Container.yaml | 13 ++ .../containers/3DRevision.Container.yaml | 13 ++ .../3DTransformation.Container.yaml | 13 ++ .../containers/Activity.Container.yaml | 13 ++ .../containers/Annotation.Container.yaml | 14 ++ .../containers/Asset.Container.yaml | 13 ++ .../containers/AssetClass.Container.yaml | 13 ++ .../containers/AssetType.Container.yaml | 13 ++ .../containers/CADModel.Container.yaml | 13 ++ .../containers/CADNode.Container.yaml | 13 ++ .../containers/CADRevision.Container.yaml | 13 ++ .../containers/CubeMap.Container.yaml | 13 ++ .../containers/Describable.Container.yaml | 13 ++ .../DiagramAnnotation.Container.yaml | 13 ++ .../containers/Equipment.Container.yaml | 13 ++ .../containers/EquipmentType.Container.yaml | 13 ++ .../containers/File.Container.yaml | 13 ++ .../containers/FileCategory.Container.yaml | 13 ++ .../containers/PointCloudModel.Container.yaml | 13 ++ .../PointCloudRevision.Container.yaml | 13 ++ .../PointCloudVolume.Container.yaml | 13 ++ .../containers/Schedulable.Container.yaml | 13 ++ .../containers/SourceSystem.Container.yaml | 13 ++ .../containers/Sourceable.Container.yaml | 13 ++ .../containers/TimeSeries.Container.yaml | 13 ++ .../containers/Unit.Container.yaml | 13 ++ .../containers/Visualizable.Container.yaml | 13 ++ .../data_models/enterprise.datamodel.yaml | 138 +++++++++++++ .../data_models/schema.space.yaml | 1 + .../data_models/views/360Image.view.yaml | 119 +++++++++++ .../views/360ImageAnnotation.view.yaml | 28 +++ .../views/360ImageCollection.view.yaml | 39 ++++ .../data_models/views/360ImageModel.view.yaml | 55 +++++ .../views/360ImageStation.view.yaml | 29 +++ .../data_models/views/3DModel.view.yaml | 29 +++ .../data_models/views/3DObject.view.yaml | 81 ++++++++ .../data_models/views/3DRevision.view.yaml | 30 +++ .../views/3DTransformation.view.yaml | 23 +++ .../data_models/views/Activity.view.yaml | 69 +++++++ .../data_models/views/Annotation.view.yaml | 28 +++ .../data_models/views/Asset.view.yaml | 191 ++++++++++++++++++ .../data_models/views/AssetClass.view.yaml | 17 ++ .../data_models/views/AssetType.view.yaml | 31 +++ .../data_models/views/CADModel.view.yaml | 55 +++++ .../data_models/views/CADNode.view.yaml | 53 +++++ .../data_models/views/CADRevision.view.yaml | 39 ++++ .../data_models/views/CubeMap.view.yaml | 97 +++++++++ .../data_models/views/Describable.view.yaml | 19 ++ .../views/DiagramAnnotation.view.yaml | 28 +++ .../data_models/views/Equipment.view.yaml | 100 +++++++++ .../data_models/views/EquipmentType.view.yaml | 17 ++ .../data_models/views/File.view.yaml | 72 +++++++ .../data_models/views/FileCategory.view.yaml | 18 ++ .../views/PointCloudModel.view.yaml | 55 +++++ .../views/PointCloudRevision.view.yaml | 39 ++++ .../views/PointCloudVolume.view.yaml | 52 +++++ .../data_models/views/Schedulable.view.yaml | 17 ++ .../data_models/views/SourceSystem.view.yaml | 17 ++ .../data_models/views/Sourceable.view.yaml | 27 +++ .../data_models/views/TimeSeries.view.yaml | 85 ++++++++ .../data_models/views/Unit.view.yaml | 16 ++ .../data_models/views/Visualizable.view.yaml | 29 +++ .../default.config.yaml | 2 + .../models/cdf_cdm_extension_full/module.toml | 4 + 84 files changed, 2817 insertions(+) create mode 100644 modules/models/cdf_cdm_extension/data_models/containers/Activity.Container.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/containers/Asset.Container.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/containers/Equipment.Container.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/containers/File.Container.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/containers/TimeSeries.Container.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/enterprise.datamodel.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/schema.space.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/views/Activity.view.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/views/Asset.view.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/views/Equipment.view.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/views/File.view.yaml create mode 100644 modules/models/cdf_cdm_extension/data_models/views/TimeSeries.view.yaml create mode 100644 modules/models/cdf_cdm_extension/default.config.yaml create mode 100644 modules/models/cdf_cdm_extension/module.toml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360Image.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360ImageAnnotation.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360ImageCollection.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360ImageModel.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360ImageStation.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/3DModel.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/3DObject.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/3DRevision.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/3DTransformation.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Activity.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Annotation.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Asset.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/AssetClass.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/AssetType.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/CADModel.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/CADNode.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/CADRevision.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/CubeMap.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Describable.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/DiagramAnnotation.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Equipment.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/EquipmentType.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/File.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/FileCategory.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudModel.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudRevision.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudVolume.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Schedulable.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/SourceSystem.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Sourceable.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/TimeSeries.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Unit.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Visualizable.Container.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/enterprise.datamodel.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/schema.space.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360Image.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360ImageAnnotation.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360ImageCollection.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360ImageModel.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360ImageStation.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/3DModel.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/3DObject.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/3DRevision.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/3DTransformation.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Activity.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Annotation.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Asset.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/AssetClass.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/AssetType.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/CADModel.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/CADNode.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/CADRevision.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/CubeMap.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Describable.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/DiagramAnnotation.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Equipment.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/EquipmentType.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/File.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/FileCategory.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/PointCloudModel.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/PointCloudRevision.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/PointCloudVolume.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Schedulable.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/SourceSystem.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Sourceable.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/TimeSeries.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Unit.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Visualizable.view.yaml create mode 100644 modules/models/cdf_cdm_extension_full/default.config.yaml create mode 100644 modules/models/cdf_cdm_extension_full/module.toml diff --git a/modules/models/cdf_cdm_extension/data_models/containers/Activity.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/Activity.Container.yaml new file mode 100644 index 00000000..687be160 --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/containers/Activity.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Activity +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/containers/Asset.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/Asset.Container.yaml new file mode 100644 index 00000000..55a355e6 --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/containers/Asset.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Asset +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/containers/Equipment.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/Equipment.Container.yaml new file mode 100644 index 00000000..9949cb8f --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/containers/Equipment.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Equipment +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/containers/File.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/File.Container.yaml new file mode 100644 index 00000000..92724eb4 --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/containers/File.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}File +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/containers/TimeSeries.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/TimeSeries.Container.yaml new file mode 100644 index 00000000..40f6c1aa --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/containers/TimeSeries.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}TimeSeries +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/enterprise.datamodel.yaml b/modules/models/cdf_cdm_extension/data_models/enterprise.datamodel.yaml new file mode 100644 index 00000000..495c181d --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/enterprise.datamodel.yaml @@ -0,0 +1,54 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Enterprise +name: {{ organization }} enterprise model +description: {{ organization }} enterprise model +version: v1 +views: +- space: cdf_cdm + externalId: CogniteSourceSystem + version: v1 + type: view +- space: cdf_cdm + externalId: CogniteSourceable + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view +- space: cdf_cdm + externalId: CogniteAssetClass + version: v1 + type: view +- space: cdf_cdm + externalId: CogniteAssetType + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view +- space: cdf_cdm + externalId: CogniteEquipmentType + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view +- space: cdf_cdm + externalId: CogniteFileCategory + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view +- space: cdf_cdm + externalId: CogniteUnit + version: v1 + type: view diff --git a/modules/models/cdf_cdm_extension/data_models/schema.space.yaml b/modules/models/cdf_cdm_extension/data_models/schema.space.yaml new file mode 100644 index 00000000..2ac976a5 --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/schema.space.yaml @@ -0,0 +1 @@ +space: {{ schemaSpace }} diff --git a/modules/models/cdf_cdm_extension/data_models/views/Activity.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/Activity.view.yaml new file mode 100644 index 00000000..2db42466 --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/views/Activity.view.yaml @@ -0,0 +1,69 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Activity +name: Activity +description: Represents activities. Activities typically happen over a period and + have a start and end time. +implements: +- space: cdf_cdm + externalId: CogniteActivity + version: v1 + type: view +version: v1 +properties: + assets: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipment: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: equipment + name: Equipment + description: A list of equipment the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + timeSeries: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: timeSeries + name: Time series + description: A list of time series the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: cdf_cdm + externalId: CogniteSourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/data_models/views/Asset.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/Asset.view.yaml new file mode 100644 index 00000000..54618479 --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/views/Asset.view.yaml @@ -0,0 +1,186 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Asset +name: Asset +description: Assets represent systems that support industrial functions or processes. + Assets are often called 'functional location'. +implements: +- space: cdf_cdm + externalId: CogniteAsset + version: v1 + type: view +version: v1 +properties: + parent: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetHierarchy_parent + name: Parent + description: The parent of the asset. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + root: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetHierarchy_root + name: Root + description: An automatically updated reference to the top-level asset of the + hierarchy. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + path: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetHierarchy_path + name: Path + description: An automatically updated ordered list of this asset's ancestors, + starting with the root asset. Enables subtree filtering to find all assets under + a parent. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + assetClass: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetClass + name: Asset class + description: Specifies the class of the asset. It's a direct relation to CogniteAssetClass. + source: + space: cdf_cdm + externalId: CogniteAssetClass + version: v1 + type: view + type: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: type + name: Asset type + description: Specifies the type of the asset. It's a direct relation to CogniteAssetType. + source: + space: cdf_cdm + externalId: CogniteAssetType + version: v1 + type: view + files: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + identifier: assets + name: Files + description: An automatically updated list of files related to the asset. + connectionType: multi_reverse_direct_relation + children: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + identifier: parent + name: Children + description: An automatically updated list of assets with this asset as their + parent. + connectionType: multi_reverse_direct_relation + equipment: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + identifier: asset + name: Equipment + description: An automatically updated list of equipment related to the asset. + connectionType: multi_reverse_direct_relation + activities: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + identifier: assets + name: Activities + description: An automatically updated list of activities related to the asset. + connectionType: multi_reverse_direct_relation + timeSeries: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + identifier: assets + name: Time series + description: An automatically updated list of time series related to the asset. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: cdf_cdm + externalId: CogniteSourceSystem + version: v1 + type: view + object3D: + container: + space: cdf_cdm + externalId: CogniteVisualizable + type: container + containerPropertyIdentifier: object3D + description: Direct relation to an Object3D instance representing the 3D resource + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/data_models/views/Equipment.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/Equipment.view.yaml new file mode 100644 index 00000000..c99319f3 --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/views/Equipment.view.yaml @@ -0,0 +1,100 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Equipment +name: Equipment +description: Equipment represents physical supplies or devices. +implements: +- space: cdf_cdm + externalId: CogniteEquipment + version: v1 + type: view +version: v1 +properties: + asset: + container: + space: cdf_cdm + externalId: CogniteEquipment + type: container + containerPropertyIdentifier: asset + name: Asset + description: The asset the equipment is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipmentType: + container: + space: cdf_cdm + externalId: CogniteEquipment + type: container + containerPropertyIdentifier: equipmentType + name: Equipment type + description: Specifies the type of the equipment. It's a direct relation to CogniteEquipmentType. + source: + space: cdf_cdm + externalId: CogniteEquipmentType + version: v1 + type: view + files: + container: + space: cdf_cdm + externalId: CogniteEquipment + type: container + containerPropertyIdentifier: files + name: Files + description: A list of files the equipment relates to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + activities: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + identifier: equipment + name: Activities + description: An automatically updated list of activities related to the equipment. + connectionType: multi_reverse_direct_relation + timeSeries: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + identifier: equipment + name: Time series + description: An automatically updated list of time series related to the equipment. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: cdf_cdm + externalId: CogniteSourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/data_models/views/File.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/File.view.yaml new file mode 100644 index 00000000..5520859f --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/views/File.view.yaml @@ -0,0 +1,72 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}File +name: File +description: Represents files. +implements: +- space: cdf_cdm + externalId: CogniteFile + version: v1 + type: view +version: v1 +properties: + assets: + container: + space: cdf_cdm + externalId: CogniteFile + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets this file is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + category: + container: + space: cdf_cdm + externalId: CogniteFile + type: container + containerPropertyIdentifier: category + name: Category + description: Specifies the detected category the file belongs to. It's a direct + relation to an instance of CogniteFileCategory. + source: + space: cdf_cdm + externalId: CogniteFileCategory + version: v1 + type: view + equipment: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + identifier: files + name: Equipment + description: An automatically updated list of equipment this file is related to. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: cdf_cdm + externalId: CogniteSourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}File + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/data_models/views/TimeSeries.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/TimeSeries.view.yaml new file mode 100644 index 00000000..a539e9ae --- /dev/null +++ b/modules/models/cdf_cdm_extension/data_models/views/TimeSeries.view.yaml @@ -0,0 +1,85 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}TimeSeries +name: Time series +description: Represents a series of data points in time order." +implements: +- space: cdf_cdm + externalId: CogniteTimeSeries + version: v1 + type: view +version: v1 +properties: + unit: + container: + space: cdf_cdm + externalId: CogniteTimeSeries + type: container + containerPropertyIdentifier: unit + name: Unit + description: The unit of the time series. + source: + space: cdf_cdm + externalId: CogniteUnit + version: v1 + type: view + assets: + container: + space: cdf_cdm + externalId: CogniteTimeSeries + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets the time series is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipment: + container: + space: cdf_cdm + externalId: CogniteTimeSeries + type: container + containerPropertyIdentifier: equipment + name: Equipment + description: A list of equipment the time series is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + activities: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + identifier: timeSeries + name: Activities + description: An automatically updated list of activities the time series is related + to. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: cdf_cdm + externalId: CogniteSourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/default.config.yaml b/modules/models/cdf_cdm_extension/default.config.yaml new file mode 100644 index 00000000..c9d87123 --- /dev/null +++ b/modules/models/cdf_cdm_extension/default.config.yaml @@ -0,0 +1,2 @@ +organization: ORG +schemaSpace: sp_enterprise_min_schema diff --git a/modules/models/cdf_cdm_extension/module.toml b/modules/models/cdf_cdm_extension/module.toml new file mode 100644 index 00000000..e4739ca7 --- /dev/null +++ b/modules/models/cdf_cdm_extension/module.toml @@ -0,0 +1,4 @@ +[module] +title = "Example of Minimum Extension of the Cognite Core Model" +id = "cdf_cdm_extension" +package_id = "dp:models" \ No newline at end of file diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360Image.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360Image.Container.yaml new file mode 100644 index 00000000..744242ba --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/360Image.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360Image +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageAnnotation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageAnnotation.Container.yaml new file mode 100644 index 00000000..b825459a --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageAnnotation.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageAnnotation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageCollection.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageCollection.Container.yaml new file mode 100644 index 00000000..91889488 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageCollection.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageCollection +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageModel.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageModel.Container.yaml new file mode 100644 index 00000000..740ae41a --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageModel.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageModel +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageStation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageStation.Container.yaml new file mode 100644 index 00000000..75dfb43a --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageStation.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageStation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/3DModel.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/3DModel.Container.yaml new file mode 100644 index 00000000..dbd56ea9 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/3DModel.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DModel +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/3DObject.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/3DObject.Container.yaml new file mode 100644 index 00000000..5cc12702 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/3DObject.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DObject +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/3DRevision.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/3DRevision.Container.yaml new file mode 100644 index 00000000..5b72a014 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/3DRevision.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DRevision +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/3DTransformation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/3DTransformation.Container.yaml new file mode 100644 index 00000000..9e276c14 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/3DTransformation.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DTransformation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Activity.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Activity.Container.yaml new file mode 100644 index 00000000..687be160 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/Activity.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Activity +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Annotation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Annotation.Container.yaml new file mode 100644 index 00000000..34bc6fa6 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/Annotation.Container.yaml @@ -0,0 +1,14 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Annotation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} +usedFor: edge \ No newline at end of file diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Asset.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Asset.Container.yaml new file mode 100644 index 00000000..55a355e6 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/Asset.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Asset +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/AssetClass.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/AssetClass.Container.yaml new file mode 100644 index 00000000..11def737 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/AssetClass.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}AssetClass +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/AssetType.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/AssetType.Container.yaml new file mode 100644 index 00000000..0b8a28d3 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/AssetType.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}AssetType +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/CADModel.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/CADModel.Container.yaml new file mode 100644 index 00000000..dc2f8ab0 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/CADModel.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADModel +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/CADNode.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/CADNode.Container.yaml new file mode 100644 index 00000000..a7bd7621 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/CADNode.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADNode +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/CADRevision.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/CADRevision.Container.yaml new file mode 100644 index 00000000..0565dcc2 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/CADRevision.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADRevision +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/CubeMap.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/CubeMap.Container.yaml new file mode 100644 index 00000000..fad774b1 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/CubeMap.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CubeMap +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Describable.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Describable.Container.yaml new file mode 100644 index 00000000..62651fff --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/Describable.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Describable +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/DiagramAnnotation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/DiagramAnnotation.Container.yaml new file mode 100644 index 00000000..26eda717 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/DiagramAnnotation.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}DiagramAnnotation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Equipment.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Equipment.Container.yaml new file mode 100644 index 00000000..9949cb8f --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/Equipment.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Equipment +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/EquipmentType.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/EquipmentType.Container.yaml new file mode 100644 index 00000000..76a87ca3 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/EquipmentType.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}EquipmentType +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/File.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/File.Container.yaml new file mode 100644 index 00000000..92724eb4 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/File.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}File +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/FileCategory.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/FileCategory.Container.yaml new file mode 100644 index 00000000..c356b613 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/FileCategory.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}FileCategory +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudModel.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudModel.Container.yaml new file mode 100644 index 00000000..a7b64ce6 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudModel.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudModel +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudRevision.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudRevision.Container.yaml new file mode 100644 index 00000000..38edad78 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudRevision.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudRevision +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudVolume.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudVolume.Container.yaml new file mode 100644 index 00000000..9015db1b --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudVolume.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudVolume +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Schedulable.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Schedulable.Container.yaml new file mode 100644 index 00000000..2eea9167 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/Schedulable.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Schedulable +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/SourceSystem.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/SourceSystem.Container.yaml new file mode 100644 index 00000000..18e97311 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/SourceSystem.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}SourceSystem +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Sourceable.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Sourceable.Container.yaml new file mode 100644 index 00000000..32adf0d2 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/Sourceable.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Sourceable +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/TimeSeries.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/TimeSeries.Container.yaml new file mode 100644 index 00000000..40f6c1aa --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/TimeSeries.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}TimeSeries +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Unit.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Unit.Container.yaml new file mode 100644 index 00000000..ebed2b84 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/Unit.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Unit +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Visualizable.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Visualizable.Container.yaml new file mode 100644 index 00000000..0c441584 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/containers/Visualizable.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Visualizable +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/enterprise.datamodel.yaml b/modules/models/cdf_cdm_extension_full/data_models/enterprise.datamodel.yaml new file mode 100644 index 00000000..da08d813 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/enterprise.datamodel.yaml @@ -0,0 +1,138 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Enterprise +name: {{ organization }} enterprise model +description: {{ organization }} enterprise model +version: v1 +views: +- space: {{ schemaSpace }} + externalId: {{ organization }}Describable + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Sourceable + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Schedulable + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Visualizable + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}3DTransformation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}CubeMap + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}CADModel + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudModel + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360ImageModel + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudRevision + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360ImageCollection + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}CADNode + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudVolume + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360Image + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360ImageStation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360ImageAnnotation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}AssetClass + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}AssetType + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}EquipmentType + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}FileCategory + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Annotation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}DiagramAnnotation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Unit + version: v1 + type: view diff --git a/modules/models/cdf_cdm_extension_full/data_models/schema.space.yaml b/modules/models/cdf_cdm_extension_full/data_models/schema.space.yaml new file mode 100644 index 00000000..2ac976a5 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/schema.space.yaml @@ -0,0 +1 @@ +space: {{ schemaSpace }} diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360Image.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360Image.view.yaml new file mode 100644 index 00000000..733b5992 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/360Image.view.yaml @@ -0,0 +1,119 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360Image +description: '' +implements: +- space: cdf_cdm + externalId: Cognite360Image + version: v1 + type: view +version: v1 +properties: + collection360: + container: + space: cdf_cdm_3d + externalId: Cognite360Image + type: container + containerPropertyIdentifier: collection360 + description: Direct relation to Cognite360ImageCollection + source: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageCollection + version: v1 + type: view + station360: + container: + space: cdf_cdm_3d + externalId: Cognite360Image + type: container + containerPropertyIdentifier: group3d + description: Direct relation to Cognite3DGroup instance that groups different + Cognite360Image instances to the same station + source: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageStation + version: v1 + type: view + front: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: front + description: Direct relation to a file holding the front projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + back: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: back + description: Direct relation to a file holding the back projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + left: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: left + description: Direct relation to a file holding the left projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + right: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: right + description: Direct relation to a file holding the right projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + top: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: top + description: Direct relation to a file holding the top projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + bottom: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: bottom + description: Direct relation to a file holding the bottom projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360Image + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageAnnotation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageAnnotation.view.yaml new file mode 100644 index 00000000..19715b96 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageAnnotation.view.yaml @@ -0,0 +1,28 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageAnnotation +description: '' +implements: +- space: cdf_cdm + externalId: Cognite360ImageAnnotation + version: v1 + type: view +version: v1 +properties: + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageAnnotation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageCollection.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageCollection.view.yaml new file mode 100644 index 00000000..fa68daf6 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageCollection.view.yaml @@ -0,0 +1,39 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageCollection +description: Represents a logical collection of Cognite360Image instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DRevision + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: Image360 +implements: +- space: cdf_cdm + externalId: Cognite360ImageCollection + version: v1 + type: view +version: v1 +properties: + model3D: + container: + space: cdf_cdm_3d + externalId: Cognite3DRevision + type: container + containerPropertyIdentifier: model3D + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageCollection + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageModel.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageModel.view.yaml new file mode 100644 index 00000000..fbb0e1d8 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageModel.view.yaml @@ -0,0 +1,55 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageModel +description: Navigational aid for traversing Cognite360ImageModel instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DModel + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: Image360 +implements: +- space: cdf_cdm + externalId: Cognite360ImageModel + version: v1 + type: view +version: v1 +properties: + collections: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageCollection + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + version: v1 + type: view + identifier: model3D + description: List Cognite360Image collections for this instance + connectionType: multi_reverse_direct_relation + thumbnail: + container: + space: cdf_cdm_3d + externalId: Cognite3DModel + type: container + containerPropertyIdentifier: thumbnail + description: Thumbnail of the 3D model + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageModel + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageStation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageStation.view.yaml new file mode 100644 index 00000000..2635cf4e --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageStation.view.yaml @@ -0,0 +1,29 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageStation +description: A way to group images across collections. Used for creating visual scan + history +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DGroup + - equals: + property: + - cdf_cdm_3d + - Cognite3DGroup + - groupType + value: Station360 +implements: +- space: cdf_cdm + externalId: Cognite360ImageStation + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageStation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/3DModel.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/3DModel.view.yaml new file mode 100644 index 00000000..bcd301ea --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/3DModel.view.yaml @@ -0,0 +1,29 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DModel +description: Groups revisions of 3D data of various kinds together (CAD, PointCloud, + Image360) +implements: +- space: cdf_cdm + externalId: Cognite3DModel + version: v1 + type: view +version: v1 +properties: + thumbnail: + container: + space: cdf_cdm_3d + externalId: Cognite3DModel + type: container + containerPropertyIdentifier: thumbnail + description: Thumbnail of the 3D model + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/3DObject.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/3DObject.view.yaml new file mode 100644 index 00000000..81a1c69b --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/3DObject.view.yaml @@ -0,0 +1,81 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DObject +description: This is the virtual position representation of an object in the physical + world, connecting an asset to one or more 3D resources +implements: +- space: cdf_cdm + externalId: Cognite3DObject + version: v1 + type: view +version: v1 +properties: + asset: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + identifier: object3D + description: Asset that is tied to this 3D object + connectionType: single_reverse_direct_relation + cadNodes: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADNode + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADNode + version: v1 + type: view + identifier: object3D + description: List of up to 1000 CADNodes that represents the connected CogniteAsset + connectionType: multi_reverse_direct_relation + images360: + type: + space: cdf_cdm + externalId: image-360-annotation + source: + space: {{ schemaSpace }} + externalId: {{ organization }}360Image + version: v1 + type: view + direction: outwards + description: Edge connection to Cognite360Image annotations that represents the + connected CogniteAsset + edgeSource: + space: cdf_cdm + externalId: Cognite360ImageAnnotation + version: v1 + type: view + connectionType: multi_edge_connection + pointCloudVolumes: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudVolume + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudVolume + version: v1 + type: view + identifier: object3D + description: List of up to 1000 PointCloudVolumes that represents the connected + CogniteAsset + connectionType: multi_reverse_direct_relation + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/3DRevision.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/3DRevision.view.yaml new file mode 100644 index 00000000..9de88a0b --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/3DRevision.view.yaml @@ -0,0 +1,30 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DRevision +description: 'Shared revision information for various 3D data types. Normally not + used directly, but through CognitePointCloudRevision, Image360Collection or CogniteCADRevision + + ' +implements: +- space: cdf_cdm + externalId: Cognite3DRevision + version: v1 + type: view +version: v1 +properties: + model3D: + container: + space: cdf_cdm_3d + externalId: Cognite3DRevision + type: container + containerPropertyIdentifier: model3D + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/3DTransformation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/3DTransformation.view.yaml new file mode 100644 index 00000000..33807376 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/3DTransformation.view.yaml @@ -0,0 +1,23 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DTransformation +description: 'The Cognite3DTransformation object defines a comprehensive 3D transformation, + enabling precise adjustments to an object''s position, orientation, and size in + the 3D coordinate system. It allows for the translation of objects along the three + spatial axes, rotation around these axes using Euler angles, and scaling along each + axis to modify the object''s dimensions. The object''s transformation is defined + in "CDF space", a coordinate system where the positive Z axis is the up direction + + ' +implements: +- space: cdf_cdm + externalId: Cognite3DTransformation + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}3DTransformation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Activity.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Activity.view.yaml new file mode 100644 index 00000000..dda1d5f5 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/Activity.view.yaml @@ -0,0 +1,69 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Activity +name: Activity +description: Represents activities. Activities typically happen over a period and + have a start and end time. +implements: +- space: cdf_cdm + externalId: CogniteActivity + version: v1 + type: view +version: v1 +properties: + assets: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipment: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: equipment + name: Equipment + description: A list of equipment the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + timeSeries: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: timeSeries + name: Time series + description: A list of time series the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Annotation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Annotation.view.yaml new file mode 100644 index 00000000..ac6d3ebc --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/Annotation.view.yaml @@ -0,0 +1,28 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Annotation +description: Annotation represents contextualization results or links +implements: +- space: cdf_cdm + externalId: CogniteAnnotation + version: v1 + type: view +version: v1 +properties: + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Annotation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Asset.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Asset.view.yaml new file mode 100644 index 00000000..7cd8b352 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/Asset.view.yaml @@ -0,0 +1,191 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Asset +name: Asset +description: Assets represent systems that support industrial functions or processes. + Assets are often called 'functional location'. +implements: +- space: cdf_cdm + externalId: CogniteAsset + version: v1 + type: view +version: v1 +properties: + parent: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetHierarchy_parent + name: Parent + description: The parent of the asset. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + root: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetHierarchy_root + name: Root + description: An automatically updated reference to the top-level asset of the + hierarchy. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + path: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetHierarchy_path + name: Path + description: An automatically updated ordered list of this asset's ancestors, + starting with the root asset. Enables subtree filtering to find all assets under + a parent. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + assetClass: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetClass + name: Asset class + description: Specifies the class of the asset. It's a direct relation to CogniteAssetClass. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetClass + version: v1 + type: view + type: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: type + name: Asset type + description: Specifies the type of the asset. It's a direct relation to CogniteAssetType. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetType + version: v1 + type: view + files: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + identifier: assets + name: Files + description: An automatically updated list of files related to the asset. + connectionType: multi_reverse_direct_relation + children: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + identifier: parent + name: Children + description: An automatically updated list of assets with this asset as their + parent. + connectionType: multi_reverse_direct_relation + equipment: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + identifier: asset + name: Equipment + description: An automatically updated list of equipment related to the asset. + connectionType: multi_reverse_direct_relation + activities: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + identifier: assets + name: Activities + description: An automatically updated list of activities related to the asset. + connectionType: multi_reverse_direct_relation + timeSeries: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + identifier: assets + name: Time series + description: An automatically updated list of time series related to the asset. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + object3D: + container: + space: cdf_cdm + externalId: CogniteVisualizable + type: container + containerPropertyIdentifier: object3D + description: Direct relation to an Object3D instance representing the 3D resource + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/AssetClass.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/AssetClass.view.yaml new file mode 100644 index 00000000..c825285a --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/AssetClass.view.yaml @@ -0,0 +1,17 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}AssetClass +name: Asset class +description: Represents the class of an asset. +implements: +- space: cdf_cdm + externalId: CogniteAssetClass + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetClass + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/AssetType.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/AssetType.view.yaml new file mode 100644 index 00000000..9ed9566e --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/AssetType.view.yaml @@ -0,0 +1,31 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}AssetType +name: Asset type +description: Represents the type of an asset. +implements: +- space: cdf_cdm + externalId: CogniteAssetType + version: v1 + type: view +version: v1 +properties: + assetClass: + container: + space: cdf_cdm + externalId: CogniteAssetType + type: container + containerPropertyIdentifier: assetClass + name: Asset class + description: Specifies the class the type belongs to. It's a direct relation to + CogniteAssetClass. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetClass + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetType + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/CADModel.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/CADModel.view.yaml new file mode 100644 index 00000000..bf921d46 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/CADModel.view.yaml @@ -0,0 +1,55 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADModel +description: Navigational aid for traversing CogniteCADModel instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DModel + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: CAD +implements: +- space: cdf_cdm + externalId: CogniteCADModel + version: v1 + type: view +version: v1 +properties: + revisions: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + version: v1 + type: view + identifier: model3D + description: List of revisions for this CAD model + connectionType: multi_reverse_direct_relation + thumbnail: + container: + space: cdf_cdm_3d + externalId: Cognite3DModel + type: container + containerPropertyIdentifier: thumbnail + description: Thumbnail of the 3D model + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}CADModel + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/CADNode.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/CADNode.view.yaml new file mode 100644 index 00000000..a80d6c7c --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/CADNode.view.yaml @@ -0,0 +1,53 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADNode +description: Represents nodes from the 3D model that have been contextualized +implements: +- space: cdf_cdm + externalId: CogniteCADNode + version: v1 + type: view +version: v1 +properties: + object3D: + container: + space: cdf_cdm_3d + externalId: CogniteCADNode + type: container + containerPropertyIdentifier: object3D + description: Direct relation to object3D grouping for this node + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view + model3D: + container: + space: cdf_cdm_3d + externalId: CogniteCADNode + type: container + containerPropertyIdentifier: model3D + description: Direct relation to Cognite3DModel + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADModel + version: v1 + type: view + revisions: + container: + space: cdf_cdm_3d + externalId: CogniteCADNode + type: container + containerPropertyIdentifier: revisions + description: List of direct relations to instances of Cognite3DRevision which + this CogniteCADNode exists in. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}CADNode + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/CADRevision.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/CADRevision.view.yaml new file mode 100644 index 00000000..d180d745 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/CADRevision.view.yaml @@ -0,0 +1,39 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADRevision +description: '' +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DRevision + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: CAD +implements: +- space: cdf_cdm + externalId: CogniteCADRevision + version: v1 + type: view +version: v1 +properties: + model3D: + container: + space: cdf_cdm_3d + externalId: Cognite3DRevision + type: container + containerPropertyIdentifier: model3D + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/CubeMap.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/CubeMap.view.yaml new file mode 100644 index 00000000..a57ea610 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/CubeMap.view.yaml @@ -0,0 +1,97 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CubeMap +description: 'The cube map holds references to 6 images in used to visually represent + the surrounding environment + + ' +implements: +- space: cdf_cdm + externalId: CogniteCubeMap + version: v1 + type: view +version: v1 +properties: + front: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: front + description: Direct relation to a file holding the front projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + back: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: back + description: Direct relation to a file holding the back projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + left: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: left + description: Direct relation to a file holding the left projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + right: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: right + description: Direct relation to a file holding the right projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + top: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: top + description: Direct relation to a file holding the top projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + bottom: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: bottom + description: Direct relation to a file holding the bottom projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}CubeMap + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Describable.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Describable.view.yaml new file mode 100644 index 00000000..04f867a8 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/Describable.view.yaml @@ -0,0 +1,19 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Describable +description: 'The describable core concept is used as a standard way of holding the + bare minimum of information about the instance + + ' +implements: +- space: cdf_cdm + externalId: CogniteDescribable + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Describable + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/DiagramAnnotation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/DiagramAnnotation.view.yaml new file mode 100644 index 00000000..426b60b4 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/DiagramAnnotation.view.yaml @@ -0,0 +1,28 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}DiagramAnnotation +description: Annotation for diagrams +implements: +- space: cdf_cdm + externalId: CogniteDiagramAnnotation + version: v1 + type: view +version: v1 +properties: + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}DiagramAnnotation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Equipment.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Equipment.view.yaml new file mode 100644 index 00000000..cb78865a --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/Equipment.view.yaml @@ -0,0 +1,100 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Equipment +name: Equipment +description: Equipment represents physical supplies or devices. +implements: +- space: cdf_cdm + externalId: CogniteEquipment + version: v1 + type: view +version: v1 +properties: + asset: + container: + space: cdf_cdm + externalId: CogniteEquipment + type: container + containerPropertyIdentifier: asset + name: Asset + description: The asset the equipment is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipmentType: + container: + space: cdf_cdm + externalId: CogniteEquipment + type: container + containerPropertyIdentifier: equipmentType + name: Equipment type + description: Specifies the type of the equipment. It's a direct relation to CogniteEquipmentType. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}EquipmentType + version: v1 + type: view + files: + container: + space: cdf_cdm + externalId: CogniteEquipment + type: container + containerPropertyIdentifier: files + name: Files + description: A list of files the equipment relates to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + activities: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + identifier: equipment + name: Activities + description: An automatically updated list of activities related to the equipment. + connectionType: multi_reverse_direct_relation + timeSeries: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + identifier: equipment + name: Time series + description: An automatically updated list of time series related to the equipment. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/EquipmentType.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/EquipmentType.view.yaml new file mode 100644 index 00000000..f66966e8 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/EquipmentType.view.yaml @@ -0,0 +1,17 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}EquipmentType +name: Equipment type +description: Represents the type of equipment. +implements: +- space: cdf_cdm + externalId: CogniteEquipmentType + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}EquipmentType + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/File.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/File.view.yaml new file mode 100644 index 00000000..481c9e95 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/File.view.yaml @@ -0,0 +1,72 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}File +name: File +description: Represents files. +implements: +- space: cdf_cdm + externalId: CogniteFile + version: v1 + type: view +version: v1 +properties: + assets: + container: + space: cdf_cdm + externalId: CogniteFile + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets this file is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + category: + container: + space: cdf_cdm + externalId: CogniteFile + type: container + containerPropertyIdentifier: category + name: Category + description: Specifies the detected category the file belongs to. It's a direct + relation to an instance of CogniteFileCategory. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}FileCategory + version: v1 + type: view + equipment: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + identifier: files + name: Equipment + description: An automatically updated list of equipment this file is related to. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}File + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/FileCategory.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/FileCategory.view.yaml new file mode 100644 index 00000000..d1458355 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/FileCategory.view.yaml @@ -0,0 +1,18 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}FileCategory +name: File category +description: Represents the categories of files as determined by contextualization + or categorization. +implements: +- space: cdf_cdm + externalId: CogniteFileCategory + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}FileCategory + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudModel.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudModel.view.yaml new file mode 100644 index 00000000..c32a8dc2 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudModel.view.yaml @@ -0,0 +1,55 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudModel +description: Navigational aid for traversing CognitePointCloudModel instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DModel + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: PointCloud +implements: +- space: cdf_cdm + externalId: CognitePointCloudModel + version: v1 + type: view +version: v1 +properties: + revisions: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudRevision + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + version: v1 + type: view + identifier: model3D + description: List of revisions for this PointCloud model + connectionType: multi_reverse_direct_relation + thumbnail: + container: + space: cdf_cdm_3d + externalId: Cognite3DModel + type: container + containerPropertyIdentifier: thumbnail + description: Thumbnail of the 3D model + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudModel + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudRevision.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudRevision.view.yaml new file mode 100644 index 00000000..f0821928 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudRevision.view.yaml @@ -0,0 +1,39 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudRevision +description: Navigational aid for traversing CognitePointCloudRevision instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DRevision + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: PointCloud +implements: +- space: cdf_cdm + externalId: CognitePointCloudRevision + version: v1 + type: view +version: v1 +properties: + model3D: + container: + space: cdf_cdm_3d + externalId: Cognite3DRevision + type: container + containerPropertyIdentifier: model3D + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudRevision + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudVolume.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudVolume.view.yaml new file mode 100644 index 00000000..ac40a2ac --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudVolume.view.yaml @@ -0,0 +1,52 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudVolume +description: PointCloud volume definition +implements: +- space: cdf_cdm + externalId: CognitePointCloudVolume + version: v1 + type: view +version: v1 +properties: + object3D: + container: + space: cdf_cdm_3d + externalId: CognitePointCloudVolume + type: container + containerPropertyIdentifier: object3D + description: Direct relation to object3D grouping for this node + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view + model3D: + container: + space: cdf_cdm_3d + externalId: CognitePointCloudVolume + type: container + containerPropertyIdentifier: model3D + description: Direct relation to Cognite3DModel instance + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADModel + version: v1 + type: view + revisions: + container: + space: cdf_cdm_3d + externalId: CognitePointCloudVolume + type: container + containerPropertyIdentifier: revisions + description: List of direct relations to revision information + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudVolume + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Schedulable.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Schedulable.view.yaml new file mode 100644 index 00000000..892c180a --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/Schedulable.view.yaml @@ -0,0 +1,17 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Schedulable +description: CogniteSchedulable represents the metadata about when an activity (or + similar) starts and ends. +implements: +- space: cdf_cdm + externalId: CogniteSchedulable + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Schedulable + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/SourceSystem.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/SourceSystem.view.yaml new file mode 100644 index 00000000..67f97972 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/SourceSystem.view.yaml @@ -0,0 +1,17 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}SourceSystem +description: The CogniteSourceSystem core concept is used to standardize the way source + system is stored. +implements: +- space: cdf_cdm + externalId: CogniteSourceSystem + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Sourceable.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Sourceable.view.yaml new file mode 100644 index 00000000..37e8559b --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/Sourceable.view.yaml @@ -0,0 +1,27 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Sourceable +implements: +- space: cdf_cdm + externalId: CogniteSourceable + version: v1 + type: view +version: v1 +properties: + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Sourceable + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/TimeSeries.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/TimeSeries.view.yaml new file mode 100644 index 00000000..fdc8f8b8 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/TimeSeries.view.yaml @@ -0,0 +1,85 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}TimeSeries +name: Time series +description: Represents a series of data points in time order." +implements: +- space: cdf_cdm + externalId: CogniteTimeSeries + version: v1 + type: view +version: v1 +properties: + unit: + container: + space: cdf_cdm + externalId: CogniteTimeSeries + type: container + containerPropertyIdentifier: unit + name: Unit + description: The unit of the time series. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Unit + version: v1 + type: view + assets: + container: + space: cdf_cdm + externalId: CogniteTimeSeries + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets the time series is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipment: + container: + space: cdf_cdm + externalId: CogniteTimeSeries + type: container + containerPropertyIdentifier: equipment + name: Equipment + description: A list of equipment the time series is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + activities: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + identifier: timeSeries + name: Activities + description: An automatically updated list of activities the time series is related + to. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Unit.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Unit.view.yaml new file mode 100644 index 00000000..16651e68 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/Unit.view.yaml @@ -0,0 +1,16 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Unit +description: Represents a single unit of measurement +implements: +- space: cdf_cdm + externalId: CogniteUnit + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Unit + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Visualizable.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Visualizable.view.yaml new file mode 100644 index 00000000..e4d94a39 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/data_models/views/Visualizable.view.yaml @@ -0,0 +1,29 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Visualizable +description: CogniteVisualizable defines the standard way to reference a related 3D + resource +implements: +- space: cdf_cdm + externalId: CogniteVisualizable + version: v1 + type: view +version: v1 +properties: + object3D: + container: + space: cdf_cdm + externalId: CogniteVisualizable + type: container + containerPropertyIdentifier: object3D + description: Direct relation to an Object3D instance representing the 3D resource + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Visualizable + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/default.config.yaml b/modules/models/cdf_cdm_extension_full/default.config.yaml new file mode 100644 index 00000000..57be3d66 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/default.config.yaml @@ -0,0 +1,2 @@ +organization: ORG +schemaSpace: sp_enterprise_schema diff --git a/modules/models/cdf_cdm_extension_full/module.toml b/modules/models/cdf_cdm_extension_full/module.toml new file mode 100644 index 00000000..3b1c1d63 --- /dev/null +++ b/modules/models/cdf_cdm_extension_full/module.toml @@ -0,0 +1,4 @@ +[module] +title = "Example of CogniteCore Extension Model" +id = "cdf_cdm_extension_full" +package_id = "dp:models" \ No newline at end of file From 6e078399247fc97cd2ae1de63894643aa88750d5 Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Fri, 27 Mar 2026 12:27:27 +0530 Subject: [PATCH 02/12] Process Industry Extension full DM --- .../containers/360Image.Container.yaml | 13 ++ .../360ImageAnnotation.Container.yaml | 14 ++ .../360ImageCollection.Container.yaml | 13 ++ .../containers/360ImageModel.Container.yaml | 13 ++ .../containers/360ImageStation.Container.yaml | 13 ++ .../containers/3DModel.Container.yaml | 13 ++ .../containers/3DObject.Container.yaml | 13 ++ .../containers/3DRevision.Container.yaml | 13 ++ .../3DTransformation.Container.yaml | 13 ++ .../containers/Activity.Container.yaml | 13 ++ .../containers/Annotation.Container.yaml | 14 ++ .../containers/Asset.Container.yaml | 13 ++ .../containers/AssetClass.Container.yaml | 13 ++ .../containers/AssetType.Container.yaml | 13 ++ .../containers/CADModel.Container.yaml | 13 ++ .../containers/CADNode.Container.yaml | 13 ++ .../containers/CADRevision.Container.yaml | 13 ++ .../containers/CubeMap.Container.yaml | 13 ++ .../containers/Describable.Container.yaml | 13 ++ .../DiagramAnnotation.Container.yaml | 14 ++ .../containers/Equipment.Container.yaml | 13 ++ .../containers/EquipmentType.Container.yaml | 13 ++ .../containers/File.Container.yaml | 13 ++ .../containers/FileCategory.Container.yaml | 13 ++ .../MaintenanceOrder.Container.yaml | 13 ++ .../containers/Notification.Container.yaml | 13 ++ .../containers/Operation.Container.yaml | 13 ++ .../containers/PointCloudModel.Container.yaml | 13 ++ .../PointCloudRevision.Container.yaml | 13 ++ .../PointCloudVolume.Container.yaml | 13 ++ .../containers/Schedulable.Container.yaml | 13 ++ .../containers/SourceSystem.Container.yaml | 13 ++ .../containers/Sourceable.Container.yaml | 13 ++ .../containers/TimeSeries.Container.yaml | 13 ++ .../containers/Unit.Container.yaml | 13 ++ .../containers/Visualizable.Container.yaml | 13 ++ .../data_models/enterprise.datamodel.yaml | 150 ++++++++++++++ .../data_models/schema.space.yaml | 1 + .../data_models/views/360Image.view.yaml | 119 +++++++++++ .../views/360ImageAnnotation.view.yaml | 28 +++ .../views/360ImageCollection.view.yaml | 39 ++++ .../data_models/views/360ImageModel.view.yaml | 55 +++++ .../views/360ImageStation.view.yaml | 29 +++ .../data_models/views/3DModel.view.yaml | 29 +++ .../data_models/views/3DObject.view.yaml | 81 ++++++++ .../data_models/views/3DRevision.view.yaml | 30 +++ .../views/3DTransformation.view.yaml | 23 +++ .../data_models/views/Activity.view.yaml | 69 +++++++ .../data_models/views/Annotation.view.yaml | 28 +++ .../data_models/views/Asset.view.yaml | 191 ++++++++++++++++++ .../data_models/views/AssetClass.view.yaml | 17 ++ .../data_models/views/AssetType.view.yaml | 31 +++ .../data_models/views/CADModel.view.yaml | 55 +++++ .../data_models/views/CADNode.view.yaml | 53 +++++ .../data_models/views/CADRevision.view.yaml | 39 ++++ .../data_models/views/CubeMap.view.yaml | 97 +++++++++ .../data_models/views/Describable.view.yaml | 19 ++ .../views/DiagramAnnotation.view.yaml | 28 +++ .../data_models/views/Equipment.view.yaml | 100 +++++++++ .../data_models/views/EquipmentType.view.yaml | 17 ++ .../data_models/views/File.view.yaml | 72 +++++++ .../data_models/views/FileCategory.view.yaml | 18 ++ .../views/MaintenanceOrder.view.yaml | 100 +++++++++ .../data_models/views/Notification.view.yaml | 56 +++++ .../data_models/views/Operation.view.yaml | 96 +++++++++ .../views/PointCloudModel.view.yaml | 55 +++++ .../views/PointCloudRevision.view.yaml | 39 ++++ .../views/PointCloudVolume.view.yaml | 52 +++++ .../data_models/views/Schedulable.view.yaml | 17 ++ .../data_models/views/SourceSystem.view.yaml | 17 ++ .../data_models/views/Sourceable.view.yaml | 27 +++ .../data_models/views/TimeSeries.view.yaml | 85 ++++++++ .../data_models/views/Unit.view.yaml | 16 ++ .../data_models/views/Visualizable.view.yaml | 29 +++ .../default.config.yaml | 2 + .../module.toml | 4 + 76 files changed, 2484 insertions(+) create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/360Image.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageAnnotation.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageCollection.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageModel.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageStation.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/3DModel.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/3DObject.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/3DRevision.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/3DTransformation.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Activity.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Annotation.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Asset.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/AssetClass.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/AssetType.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/CADModel.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/CADNode.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/CADRevision.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/CubeMap.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Describable.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/DiagramAnnotation.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Equipment.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/EquipmentType.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/File.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/FileCategory.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/MaintenanceOrder.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Notification.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Operation.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudModel.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudRevision.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudVolume.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Schedulable.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/SourceSystem.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Sourceable.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/TimeSeries.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Unit.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/containers/Visualizable.Container.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/enterprise.datamodel.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/schema.space.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/360Image.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/360ImageAnnotation.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/360ImageCollection.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/360ImageModel.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/360ImageStation.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/3DModel.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/3DObject.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/3DRevision.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/3DTransformation.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Activity.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Annotation.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Asset.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/AssetClass.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/AssetType.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/CADModel.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/CADNode.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/CADRevision.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/CubeMap.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Describable.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/DiagramAnnotation.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Equipment.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/EquipmentType.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/File.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/FileCategory.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/MaintenanceOrder.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Notification.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Operation.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudModel.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudRevision.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudVolume.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Schedulable.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/SourceSystem.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Sourceable.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/TimeSeries.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Unit.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/data_models/views/Visualizable.view.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/default.config.yaml create mode 100644 modules/models/cdf_process_industry_extension_full/module.toml diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/360Image.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/360Image.Container.yaml new file mode 100644 index 00000000..744242ba --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/360Image.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360Image +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageAnnotation.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageAnnotation.Container.yaml new file mode 100644 index 00000000..ce56d752 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageAnnotation.Container.yaml @@ -0,0 +1,14 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageAnnotation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} +usedFor: edge \ No newline at end of file diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageCollection.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageCollection.Container.yaml new file mode 100644 index 00000000..91889488 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageCollection.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageCollection +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageModel.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageModel.Container.yaml new file mode 100644 index 00000000..740ae41a --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageModel.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageModel +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageStation.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageStation.Container.yaml new file mode 100644 index 00000000..75dfb43a --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/360ImageStation.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageStation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/3DModel.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/3DModel.Container.yaml new file mode 100644 index 00000000..dbd56ea9 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/3DModel.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DModel +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/3DObject.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/3DObject.Container.yaml new file mode 100644 index 00000000..5cc12702 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/3DObject.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DObject +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/3DRevision.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/3DRevision.Container.yaml new file mode 100644 index 00000000..5b72a014 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/3DRevision.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DRevision +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/3DTransformation.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/3DTransformation.Container.yaml new file mode 100644 index 00000000..9e276c14 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/3DTransformation.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DTransformation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Activity.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Activity.Container.yaml new file mode 100644 index 00000000..687be160 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Activity.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Activity +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Annotation.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Annotation.Container.yaml new file mode 100644 index 00000000..34bc6fa6 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Annotation.Container.yaml @@ -0,0 +1,14 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Annotation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} +usedFor: edge \ No newline at end of file diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Asset.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Asset.Container.yaml new file mode 100644 index 00000000..55a355e6 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Asset.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Asset +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/AssetClass.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/AssetClass.Container.yaml new file mode 100644 index 00000000..11def737 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/AssetClass.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}AssetClass +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/AssetType.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/AssetType.Container.yaml new file mode 100644 index 00000000..0b8a28d3 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/AssetType.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}AssetType +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/CADModel.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/CADModel.Container.yaml new file mode 100644 index 00000000..dc2f8ab0 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/CADModel.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADModel +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/CADNode.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/CADNode.Container.yaml new file mode 100644 index 00000000..a7bd7621 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/CADNode.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADNode +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/CADRevision.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/CADRevision.Container.yaml new file mode 100644 index 00000000..0565dcc2 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/CADRevision.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADRevision +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/CubeMap.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/CubeMap.Container.yaml new file mode 100644 index 00000000..fad774b1 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/CubeMap.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CubeMap +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Describable.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Describable.Container.yaml new file mode 100644 index 00000000..62651fff --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Describable.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Describable +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/DiagramAnnotation.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/DiagramAnnotation.Container.yaml new file mode 100644 index 00000000..eeb8f926 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/DiagramAnnotation.Container.yaml @@ -0,0 +1,14 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}DiagramAnnotation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} +usedFor: edge diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Equipment.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Equipment.Container.yaml new file mode 100644 index 00000000..9949cb8f --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Equipment.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Equipment +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/EquipmentType.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/EquipmentType.Container.yaml new file mode 100644 index 00000000..76a87ca3 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/EquipmentType.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}EquipmentType +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/File.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/File.Container.yaml new file mode 100644 index 00000000..92724eb4 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/File.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}File +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/FileCategory.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/FileCategory.Container.yaml new file mode 100644 index 00000000..c356b613 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/FileCategory.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}FileCategory +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/MaintenanceOrder.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/MaintenanceOrder.Container.yaml new file mode 100644 index 00000000..8ef7862c --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/MaintenanceOrder.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}MaintenanceOrder +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Notification.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Notification.Container.yaml new file mode 100644 index 00000000..a1b9ebe2 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Notification.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Notification +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Operation.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Operation.Container.yaml new file mode 100644 index 00000000..4132a340 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Operation.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Operation +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudModel.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudModel.Container.yaml new file mode 100644 index 00000000..a7b64ce6 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudModel.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudModel +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudRevision.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudRevision.Container.yaml new file mode 100644 index 00000000..38edad78 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudRevision.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudRevision +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudVolume.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudVolume.Container.yaml new file mode 100644 index 00000000..9015db1b --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/PointCloudVolume.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudVolume +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Schedulable.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Schedulable.Container.yaml new file mode 100644 index 00000000..2eea9167 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Schedulable.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Schedulable +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/SourceSystem.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/SourceSystem.Container.yaml new file mode 100644 index 00000000..18e97311 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/SourceSystem.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}SourceSystem +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Sourceable.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Sourceable.Container.yaml new file mode 100644 index 00000000..32adf0d2 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Sourceable.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Sourceable +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/TimeSeries.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/TimeSeries.Container.yaml new file mode 100644 index 00000000..40f6c1aa --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/TimeSeries.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}TimeSeries +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Unit.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Unit.Container.yaml new file mode 100644 index 00000000..ebed2b84 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Unit.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Unit +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/containers/Visualizable.Container.yaml b/modules/models/cdf_process_industry_extension_full/data_models/containers/Visualizable.Container.yaml new file mode 100644 index 00000000..0c441584 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/containers/Visualizable.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Visualizable +properties: + UUID: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false +constraints: {} +indexes: {} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/enterprise.datamodel.yaml b/modules/models/cdf_process_industry_extension_full/data_models/enterprise.datamodel.yaml new file mode 100644 index 00000000..4b8b9ed2 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/enterprise.datamodel.yaml @@ -0,0 +1,150 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}ProcessIndustries +name: {{ organization }} enterprise model +description: {{ organization }} enterprise model +version: v1 +views: +- space: {{ schemaSpace }} + externalId: {{ organization }}MaintenanceOrder + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Operation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Notification + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Describable + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Sourceable + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Schedulable + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Visualizable + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}3DTransformation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}CubeMap + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}CADModel + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudModel + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360ImageModel + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudRevision + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360ImageCollection + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}CADNode + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudVolume + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360Image + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360ImageStation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}360ImageAnnotation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}AssetClass + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}AssetType + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}EquipmentType + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}FileCategory + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Annotation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}DiagramAnnotation + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: {{ organization }}Unit + version: v1 + type: view diff --git a/modules/models/cdf_process_industry_extension_full/data_models/schema.space.yaml b/modules/models/cdf_process_industry_extension_full/data_models/schema.space.yaml new file mode 100644 index 00000000..2ac976a5 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/schema.space.yaml @@ -0,0 +1 @@ +space: {{ schemaSpace }} diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360Image.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360Image.view.yaml new file mode 100644 index 00000000..733b5992 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360Image.view.yaml @@ -0,0 +1,119 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360Image +description: '' +implements: +- space: cdf_cdm + externalId: Cognite360Image + version: v1 + type: view +version: v1 +properties: + collection360: + container: + space: cdf_cdm_3d + externalId: Cognite360Image + type: container + containerPropertyIdentifier: collection360 + description: Direct relation to Cognite360ImageCollection + source: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageCollection + version: v1 + type: view + station360: + container: + space: cdf_cdm_3d + externalId: Cognite360Image + type: container + containerPropertyIdentifier: group3d + description: Direct relation to Cognite3DGroup instance that groups different + Cognite360Image instances to the same station + source: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageStation + version: v1 + type: view + front: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: front + description: Direct relation to a file holding the front projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + back: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: back + description: Direct relation to a file holding the back projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + left: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: left + description: Direct relation to a file holding the left projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + right: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: right + description: Direct relation to a file holding the right projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + top: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: top + description: Direct relation to a file holding the top projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + bottom: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: bottom + description: Direct relation to a file holding the bottom projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360Image + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageAnnotation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageAnnotation.view.yaml new file mode 100644 index 00000000..19715b96 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageAnnotation.view.yaml @@ -0,0 +1,28 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageAnnotation +description: '' +implements: +- space: cdf_cdm + externalId: Cognite360ImageAnnotation + version: v1 + type: view +version: v1 +properties: + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageAnnotation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageCollection.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageCollection.view.yaml new file mode 100644 index 00000000..fa68daf6 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageCollection.view.yaml @@ -0,0 +1,39 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageCollection +description: Represents a logical collection of Cognite360Image instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DRevision + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: Image360 +implements: +- space: cdf_cdm + externalId: Cognite360ImageCollection + version: v1 + type: view +version: v1 +properties: + model3D: + container: + space: cdf_cdm_3d + externalId: Cognite3DRevision + type: container + containerPropertyIdentifier: model3D + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageCollection + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageModel.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageModel.view.yaml new file mode 100644 index 00000000..fbb0e1d8 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageModel.view.yaml @@ -0,0 +1,55 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageModel +description: Navigational aid for traversing Cognite360ImageModel instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DModel + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: Image360 +implements: +- space: cdf_cdm + externalId: Cognite360ImageModel + version: v1 + type: view +version: v1 +properties: + collections: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageCollection + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + version: v1 + type: view + identifier: model3D + description: List Cognite360Image collections for this instance + connectionType: multi_reverse_direct_relation + thumbnail: + container: + space: cdf_cdm_3d + externalId: Cognite3DModel + type: container + containerPropertyIdentifier: thumbnail + description: Thumbnail of the 3D model + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageModel + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageStation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageStation.view.yaml new file mode 100644 index 00000000..2635cf4e --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageStation.view.yaml @@ -0,0 +1,29 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}360ImageStation +description: A way to group images across collections. Used for creating visual scan + history +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DGroup + - equals: + property: + - cdf_cdm_3d + - Cognite3DGroup + - groupType + value: Station360 +implements: +- space: cdf_cdm + externalId: Cognite360ImageStation + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}360ImageStation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/3DModel.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/3DModel.view.yaml new file mode 100644 index 00000000..bcd301ea --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/3DModel.view.yaml @@ -0,0 +1,29 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DModel +description: Groups revisions of 3D data of various kinds together (CAD, PointCloud, + Image360) +implements: +- space: cdf_cdm + externalId: Cognite3DModel + version: v1 + type: view +version: v1 +properties: + thumbnail: + container: + space: cdf_cdm_3d + externalId: Cognite3DModel + type: container + containerPropertyIdentifier: thumbnail + description: Thumbnail of the 3D model + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/3DObject.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/3DObject.view.yaml new file mode 100644 index 00000000..81a1c69b --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/3DObject.view.yaml @@ -0,0 +1,81 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DObject +description: This is the virtual position representation of an object in the physical + world, connecting an asset to one or more 3D resources +implements: +- space: cdf_cdm + externalId: Cognite3DObject + version: v1 + type: view +version: v1 +properties: + asset: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + identifier: object3D + description: Asset that is tied to this 3D object + connectionType: single_reverse_direct_relation + cadNodes: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADNode + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADNode + version: v1 + type: view + identifier: object3D + description: List of up to 1000 CADNodes that represents the connected CogniteAsset + connectionType: multi_reverse_direct_relation + images360: + type: + space: cdf_cdm + externalId: image-360-annotation + source: + space: {{ schemaSpace }} + externalId: {{ organization }}360Image + version: v1 + type: view + direction: outwards + description: Edge connection to Cognite360Image annotations that represents the + connected CogniteAsset + edgeSource: + space: cdf_cdm + externalId: Cognite360ImageAnnotation + version: v1 + type: view + connectionType: multi_edge_connection + pointCloudVolumes: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudVolume + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudVolume + version: v1 + type: view + identifier: object3D + description: List of up to 1000 PointCloudVolumes that represents the connected + CogniteAsset + connectionType: multi_reverse_direct_relation + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/3DRevision.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/3DRevision.view.yaml new file mode 100644 index 00000000..9de88a0b --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/3DRevision.view.yaml @@ -0,0 +1,30 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DRevision +description: 'Shared revision information for various 3D data types. Normally not + used directly, but through CognitePointCloudRevision, Image360Collection or CogniteCADRevision + + ' +implements: +- space: cdf_cdm + externalId: Cognite3DRevision + version: v1 + type: view +version: v1 +properties: + model3D: + container: + space: cdf_cdm_3d + externalId: Cognite3DRevision + type: container + containerPropertyIdentifier: model3D + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/3DTransformation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/3DTransformation.view.yaml new file mode 100644 index 00000000..33807376 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/3DTransformation.view.yaml @@ -0,0 +1,23 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}3DTransformation +description: 'The Cognite3DTransformation object defines a comprehensive 3D transformation, + enabling precise adjustments to an object''s position, orientation, and size in + the 3D coordinate system. It allows for the translation of objects along the three + spatial axes, rotation around these axes using Euler angles, and scaling along each + axis to modify the object''s dimensions. The object''s transformation is defined + in "CDF space", a coordinate system where the positive Z axis is the up direction + + ' +implements: +- space: cdf_cdm + externalId: Cognite3DTransformation + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}3DTransformation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Activity.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Activity.view.yaml new file mode 100644 index 00000000..dda1d5f5 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Activity.view.yaml @@ -0,0 +1,69 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Activity +name: Activity +description: Represents activities. Activities typically happen over a period and + have a start and end time. +implements: +- space: cdf_cdm + externalId: CogniteActivity + version: v1 + type: view +version: v1 +properties: + assets: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipment: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: equipment + name: Equipment + description: A list of equipment the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + timeSeries: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: timeSeries + name: Time series + description: A list of time series the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Annotation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Annotation.view.yaml new file mode 100644 index 00000000..ac6d3ebc --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Annotation.view.yaml @@ -0,0 +1,28 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Annotation +description: Annotation represents contextualization results or links +implements: +- space: cdf_cdm + externalId: CogniteAnnotation + version: v1 + type: view +version: v1 +properties: + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Annotation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Asset.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Asset.view.yaml new file mode 100644 index 00000000..7cd8b352 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Asset.view.yaml @@ -0,0 +1,191 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Asset +name: Asset +description: Assets represent systems that support industrial functions or processes. + Assets are often called 'functional location'. +implements: +- space: cdf_cdm + externalId: CogniteAsset + version: v1 + type: view +version: v1 +properties: + parent: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetHierarchy_parent + name: Parent + description: The parent of the asset. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + root: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetHierarchy_root + name: Root + description: An automatically updated reference to the top-level asset of the + hierarchy. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + path: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetHierarchy_path + name: Path + description: An automatically updated ordered list of this asset's ancestors, + starting with the root asset. Enables subtree filtering to find all assets under + a parent. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + assetClass: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: assetClass + name: Asset class + description: Specifies the class of the asset. It's a direct relation to CogniteAssetClass. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetClass + version: v1 + type: view + type: + container: + space: cdf_cdm + externalId: CogniteAsset + type: container + containerPropertyIdentifier: type + name: Asset type + description: Specifies the type of the asset. It's a direct relation to CogniteAssetType. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetType + version: v1 + type: view + files: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + identifier: assets + name: Files + description: An automatically updated list of files related to the asset. + connectionType: multi_reverse_direct_relation + children: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + identifier: parent + name: Children + description: An automatically updated list of assets with this asset as their + parent. + connectionType: multi_reverse_direct_relation + equipment: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + identifier: asset + name: Equipment + description: An automatically updated list of equipment related to the asset. + connectionType: multi_reverse_direct_relation + activities: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + identifier: assets + name: Activities + description: An automatically updated list of activities related to the asset. + connectionType: multi_reverse_direct_relation + timeSeries: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + identifier: assets + name: Time series + description: An automatically updated list of time series related to the asset. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + object3D: + container: + space: cdf_cdm + externalId: CogniteVisualizable + type: container + containerPropertyIdentifier: object3D + description: Direct relation to an Object3D instance representing the 3D resource + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/AssetClass.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/AssetClass.view.yaml new file mode 100644 index 00000000..c825285a --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/AssetClass.view.yaml @@ -0,0 +1,17 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}AssetClass +name: Asset class +description: Represents the class of an asset. +implements: +- space: cdf_cdm + externalId: CogniteAssetClass + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetClass + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/AssetType.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/AssetType.view.yaml new file mode 100644 index 00000000..9ed9566e --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/AssetType.view.yaml @@ -0,0 +1,31 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}AssetType +name: Asset type +description: Represents the type of an asset. +implements: +- space: cdf_cdm + externalId: CogniteAssetType + version: v1 + type: view +version: v1 +properties: + assetClass: + container: + space: cdf_cdm + externalId: CogniteAssetType + type: container + containerPropertyIdentifier: assetClass + name: Asset class + description: Specifies the class the type belongs to. It's a direct relation to + CogniteAssetClass. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetClass + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}AssetType + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/CADModel.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/CADModel.view.yaml new file mode 100644 index 00000000..bf921d46 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/CADModel.view.yaml @@ -0,0 +1,55 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADModel +description: Navigational aid for traversing CogniteCADModel instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DModel + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: CAD +implements: +- space: cdf_cdm + externalId: CogniteCADModel + version: v1 + type: view +version: v1 +properties: + revisions: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + version: v1 + type: view + identifier: model3D + description: List of revisions for this CAD model + connectionType: multi_reverse_direct_relation + thumbnail: + container: + space: cdf_cdm_3d + externalId: Cognite3DModel + type: container + containerPropertyIdentifier: thumbnail + description: Thumbnail of the 3D model + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}CADModel + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/CADNode.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/CADNode.view.yaml new file mode 100644 index 00000000..a80d6c7c --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/CADNode.view.yaml @@ -0,0 +1,53 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADNode +description: Represents nodes from the 3D model that have been contextualized +implements: +- space: cdf_cdm + externalId: CogniteCADNode + version: v1 + type: view +version: v1 +properties: + object3D: + container: + space: cdf_cdm_3d + externalId: CogniteCADNode + type: container + containerPropertyIdentifier: object3D + description: Direct relation to object3D grouping for this node + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view + model3D: + container: + space: cdf_cdm_3d + externalId: CogniteCADNode + type: container + containerPropertyIdentifier: model3D + description: Direct relation to Cognite3DModel + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADModel + version: v1 + type: view + revisions: + container: + space: cdf_cdm_3d + externalId: CogniteCADNode + type: container + containerPropertyIdentifier: revisions + description: List of direct relations to instances of Cognite3DRevision which + this CogniteCADNode exists in. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}CADNode + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/CADRevision.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/CADRevision.view.yaml new file mode 100644 index 00000000..d180d745 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/CADRevision.view.yaml @@ -0,0 +1,39 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CADRevision +description: '' +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DRevision + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: CAD +implements: +- space: cdf_cdm + externalId: CogniteCADRevision + version: v1 + type: view +version: v1 +properties: + model3D: + container: + space: cdf_cdm_3d + externalId: Cognite3DRevision + type: container + containerPropertyIdentifier: model3D + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/CubeMap.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/CubeMap.view.yaml new file mode 100644 index 00000000..a57ea610 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/CubeMap.view.yaml @@ -0,0 +1,97 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}CubeMap +description: 'The cube map holds references to 6 images in used to visually represent + the surrounding environment + + ' +implements: +- space: cdf_cdm + externalId: CogniteCubeMap + version: v1 + type: view +version: v1 +properties: + front: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: front + description: Direct relation to a file holding the front projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + back: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: back + description: Direct relation to a file holding the back projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + left: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: left + description: Direct relation to a file holding the left projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + right: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: right + description: Direct relation to a file holding the right projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + top: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: top + description: Direct relation to a file holding the top projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + bottom: + container: + space: cdf_cdm_3d + externalId: CogniteCubeMap + type: container + containerPropertyIdentifier: bottom + description: Direct relation to a file holding the bottom projection of the cube + map + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}CubeMap + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Describable.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Describable.view.yaml new file mode 100644 index 00000000..04f867a8 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Describable.view.yaml @@ -0,0 +1,19 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Describable +description: 'The describable core concept is used as a standard way of holding the + bare minimum of information about the instance + + ' +implements: +- space: cdf_cdm + externalId: CogniteDescribable + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Describable + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/DiagramAnnotation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/DiagramAnnotation.view.yaml new file mode 100644 index 00000000..426b60b4 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/DiagramAnnotation.view.yaml @@ -0,0 +1,28 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}DiagramAnnotation +description: Annotation for diagrams +implements: +- space: cdf_cdm + externalId: CogniteDiagramAnnotation + version: v1 + type: view +version: v1 +properties: + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}DiagramAnnotation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Equipment.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Equipment.view.yaml new file mode 100644 index 00000000..cb78865a --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Equipment.view.yaml @@ -0,0 +1,100 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Equipment +name: Equipment +description: Equipment represents physical supplies or devices. +implements: +- space: cdf_cdm + externalId: CogniteEquipment + version: v1 + type: view +version: v1 +properties: + asset: + container: + space: cdf_cdm + externalId: CogniteEquipment + type: container + containerPropertyIdentifier: asset + name: Asset + description: The asset the equipment is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipmentType: + container: + space: cdf_cdm + externalId: CogniteEquipment + type: container + containerPropertyIdentifier: equipmentType + name: Equipment type + description: Specifies the type of the equipment. It's a direct relation to CogniteEquipmentType. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}EquipmentType + version: v1 + type: view + files: + container: + space: cdf_cdm + externalId: CogniteEquipment + type: container + containerPropertyIdentifier: files + name: Files + description: A list of files the equipment relates to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + activities: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + identifier: equipment + name: Activities + description: An automatically updated list of activities related to the equipment. + connectionType: multi_reverse_direct_relation + timeSeries: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + identifier: equipment + name: Time series + description: An automatically updated list of time series related to the equipment. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/EquipmentType.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/EquipmentType.view.yaml new file mode 100644 index 00000000..f66966e8 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/EquipmentType.view.yaml @@ -0,0 +1,17 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}EquipmentType +name: Equipment type +description: Represents the type of equipment. +implements: +- space: cdf_cdm + externalId: CogniteEquipmentType + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}EquipmentType + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/File.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/File.view.yaml new file mode 100644 index 00000000..481c9e95 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/File.view.yaml @@ -0,0 +1,72 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}File +name: File +description: Represents files. +implements: +- space: cdf_cdm + externalId: CogniteFile + version: v1 + type: view +version: v1 +properties: + assets: + container: + space: cdf_cdm + externalId: CogniteFile + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets this file is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + category: + container: + space: cdf_cdm + externalId: CogniteFile + type: container + containerPropertyIdentifier: category + name: Category + description: Specifies the detected category the file belongs to. It's a direct + relation to an instance of CogniteFileCategory. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}FileCategory + version: v1 + type: view + equipment: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + identifier: files + name: Equipment + description: An automatically updated list of equipment this file is related to. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}File + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/FileCategory.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/FileCategory.view.yaml new file mode 100644 index 00000000..d1458355 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/FileCategory.view.yaml @@ -0,0 +1,18 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}FileCategory +name: File category +description: Represents the categories of files as determined by contextualization + or categorization. +implements: +- space: cdf_cdm + externalId: CogniteFileCategory + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}FileCategory + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/MaintenanceOrder.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/MaintenanceOrder.view.yaml new file mode 100644 index 00000000..a8c66f3f --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/MaintenanceOrder.view.yaml @@ -0,0 +1,100 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}MaintenanceOrder +name: Maintenance order +description: A formal request or directive to perform maintenance tasks such as repair, + inspection, or servicing of equipment or assets. It's often called a 'work order'. +implements: +- space: cdf_idm + externalId: CogniteMaintenanceOrder + version: v1 + type: view +version: v1 +properties: + mainAsset: + container: + space: cdf_idm + externalId: CogniteMaintenanceOrder + type: container + containerPropertyIdentifier: mainAsset + name: Main asset + description: The primary asset (functional location) the maintenance order refers + to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + operations: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Operation + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Operation + version: v1 + type: view + identifier: maintenanceOrder + name: Operations + description: Lists the individual work items on the maintenance order. An automatically + populated list of operations related to the maintenance order. + connectionType: multi_reverse_direct_relation + assets: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipment: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: equipment + name: Equipment + description: A list of equipment the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + timeSeries: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: timeSeries + name: Time series + description: A list of time series the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}MaintenanceOrder + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Notification.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Notification.view.yaml new file mode 100644 index 00000000..ed4eb07a --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Notification.view.yaml @@ -0,0 +1,56 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Notification +name: Notification``` +description: A formal record to report maintenance issues, defects, or requests, starting + the process for planning and running maintenance activities. +implements: +- space: cdf_idm + externalId: CogniteNotification + version: v1 + type: view +version: v1 +properties: + maintenanceOrder: + container: + space: cdf_idm + externalId: CogniteNotification + type: container + containerPropertyIdentifier: maintenanceOrder + name: Maintenance order + description: The maintenance order that was created from the notification. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}MaintenanceOrder + version: v1 + type: view + asset: + container: + space: cdf_idm + externalId: CogniteNotification + type: container + containerPropertyIdentifier: asset + name: Asset + description: The asset (functional location) the notification is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Notification + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Operation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Operation.view.yaml new file mode 100644 index 00000000..10c7e865 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Operation.view.yaml @@ -0,0 +1,96 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Operation +name: Operation +description: Operations represent a specific part of the work included in a maintenance + order. Often called a 'work order item'. +implements: +- space: cdf_idm + externalId: CogniteOperation + version: v1 + type: view +version: v1 +properties: + maintenanceOrder: + container: + space: cdf_idm + externalId: CogniteOperation + type: container + containerPropertyIdentifier: maintenanceOrder + name: Maintenance order + description: The maintenance order the operation is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}MaintenanceOrder + version: v1 + type: view + mainAsset: + container: + space: cdf_idm + externalId: CogniteOperation + type: container + containerPropertyIdentifier: mainAsset + name: Main asset + description: The primary asset (functional location) the operation is related + to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + assets: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipment: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: equipment + name: Equipment + description: A list of equipment the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + timeSeries: + container: + space: cdf_cdm + externalId: CogniteActivity + type: container + containerPropertyIdentifier: timeSeries + name: Time series + description: A list of time series the activity is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + version: v1 + type: view + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Operation + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudModel.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudModel.view.yaml new file mode 100644 index 00000000..c32a8dc2 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudModel.view.yaml @@ -0,0 +1,55 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudModel +description: Navigational aid for traversing CognitePointCloudModel instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DModel + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: PointCloud +implements: +- space: cdf_cdm + externalId: CognitePointCloudModel + version: v1 + type: view +version: v1 +properties: + revisions: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudRevision + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DRevision + version: v1 + type: view + identifier: model3D + description: List of revisions for this PointCloud model + connectionType: multi_reverse_direct_relation + thumbnail: + container: + space: cdf_cdm_3d + externalId: Cognite3DModel + type: container + containerPropertyIdentifier: thumbnail + description: Thumbnail of the 3D model + source: + space: {{ schemaSpace }} + externalId: {{ organization }}File + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudModel + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudRevision.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudRevision.view.yaml new file mode 100644 index 00000000..f0821928 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudRevision.view.yaml @@ -0,0 +1,39 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudRevision +description: Navigational aid for traversing CognitePointCloudRevision instances +filter: + and: + - hasData: + - type: container + space: cdf_cdm_3d + externalId: Cognite3DRevision + - equals: + property: + - cdf_cdm_3d + - Cognite3DModel + - type + value: PointCloud +implements: +- space: cdf_cdm + externalId: CognitePointCloudRevision + version: v1 + type: view +version: v1 +properties: + model3D: + container: + space: cdf_cdm_3d + externalId: Cognite3DRevision + type: container + containerPropertyIdentifier: model3D + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DModel + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudRevision + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudVolume.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudVolume.view.yaml new file mode 100644 index 00000000..ac40a2ac --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudVolume.view.yaml @@ -0,0 +1,52 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}PointCloudVolume +description: PointCloud volume definition +implements: +- space: cdf_cdm + externalId: CognitePointCloudVolume + version: v1 + type: view +version: v1 +properties: + object3D: + container: + space: cdf_cdm_3d + externalId: CognitePointCloudVolume + type: container + containerPropertyIdentifier: object3D + description: Direct relation to object3D grouping for this node + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view + model3D: + container: + space: cdf_cdm_3d + externalId: CognitePointCloudVolume + type: container + containerPropertyIdentifier: model3D + description: Direct relation to Cognite3DModel instance + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADModel + version: v1 + type: view + revisions: + container: + space: cdf_cdm_3d + externalId: CognitePointCloudVolume + type: container + containerPropertyIdentifier: revisions + description: List of direct relations to revision information + source: + space: {{ schemaSpace }} + externalId: {{ organization }}CADRevision + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}PointCloudVolume + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Schedulable.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Schedulable.view.yaml new file mode 100644 index 00000000..892c180a --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Schedulable.view.yaml @@ -0,0 +1,17 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Schedulable +description: CogniteSchedulable represents the metadata about when an activity (or + similar) starts and ends. +implements: +- space: cdf_cdm + externalId: CogniteSchedulable + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Schedulable + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/SourceSystem.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/SourceSystem.view.yaml new file mode 100644 index 00000000..67f97972 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/SourceSystem.view.yaml @@ -0,0 +1,17 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}SourceSystem +description: The CogniteSourceSystem core concept is used to standardize the way source + system is stored. +implements: +- space: cdf_cdm + externalId: CogniteSourceSystem + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Sourceable.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Sourceable.view.yaml new file mode 100644 index 00000000..37e8559b --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Sourceable.view.yaml @@ -0,0 +1,27 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Sourceable +implements: +- space: cdf_cdm + externalId: CogniteSourceable + version: v1 + type: view +version: v1 +properties: + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Sourceable + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/TimeSeries.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/TimeSeries.view.yaml new file mode 100644 index 00000000..fdc8f8b8 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/TimeSeries.view.yaml @@ -0,0 +1,85 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}TimeSeries +name: Time series +description: Represents a series of data points in time order." +implements: +- space: cdf_cdm + externalId: CogniteTimeSeries + version: v1 + type: view +version: v1 +properties: + unit: + container: + space: cdf_cdm + externalId: CogniteTimeSeries + type: container + containerPropertyIdentifier: unit + name: Unit + description: The unit of the time series. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Unit + version: v1 + type: view + assets: + container: + space: cdf_cdm + externalId: CogniteTimeSeries + type: container + containerPropertyIdentifier: assets + name: Assets + description: A list of assets the time series is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Asset + version: v1 + type: view + equipment: + container: + space: cdf_cdm + externalId: CogniteTimeSeries + type: container + containerPropertyIdentifier: equipment + name: Equipment + description: A list of equipment the time series is related to. + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Equipment + version: v1 + type: view + activities: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + through: + source: + space: {{ schemaSpace }} + externalId: {{ organization }}Activity + version: v1 + type: view + identifier: timeSeries + name: Activities + description: An automatically updated list of activities the time series is related + to. + connectionType: multi_reverse_direct_relation + source: + container: + space: cdf_cdm + externalId: CogniteSourceable + type: container + containerPropertyIdentifier: source + description: Direct relation to a source system + source: + space: {{ schemaSpace }} + externalId: {{ organization }}SourceSystem + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}TimeSeries + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Unit.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Unit.view.yaml new file mode 100644 index 00000000..16651e68 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Unit.view.yaml @@ -0,0 +1,16 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Unit +description: Represents a single unit of measurement +implements: +- space: cdf_cdm + externalId: CogniteUnit + version: v1 + type: view +version: v1 +properties: + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Unit + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Visualizable.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Visualizable.view.yaml new file mode 100644 index 00000000..e4d94a39 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Visualizable.view.yaml @@ -0,0 +1,29 @@ +space: {{ schemaSpace }} +externalId: {{ organization }}Visualizable +description: CogniteVisualizable defines the standard way to reference a related 3D + resource +implements: +- space: cdf_cdm + externalId: CogniteVisualizable + version: v1 + type: view +version: v1 +properties: + object3D: + container: + space: cdf_cdm + externalId: CogniteVisualizable + type: container + containerPropertyIdentifier: object3D + description: Direct relation to an Object3D instance representing the 3D resource + source: + space: {{ schemaSpace }} + externalId: {{ organization }}3DObject + version: v1 + type: view + UUID: + container: + space: {{ schemaSpace }} + externalId: {{ organization }}Visualizable + type: container + containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension_full/default.config.yaml b/modules/models/cdf_process_industry_extension_full/default.config.yaml new file mode 100644 index 00000000..20d2f4f0 --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/default.config.yaml @@ -0,0 +1,2 @@ +organization: ORG +schemaSpace: sp_enterprise_process_industry_full diff --git a/modules/models/cdf_process_industry_extension_full/module.toml b/modules/models/cdf_process_industry_extension_full/module.toml new file mode 100644 index 00000000..ce59fd9b --- /dev/null +++ b/modules/models/cdf_process_industry_extension_full/module.toml @@ -0,0 +1,4 @@ +[module] +title = "Example of CogniteProcessIndustry Extension Model" +id = "cdf_process_industry_extension_full" +package_id = "dp:models" \ No newline at end of file From b34742e2f67805dd4bc511c335eba7bf84c67bb8 Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Fri, 27 Mar 2026 12:28:38 +0530 Subject: [PATCH 03/12] CDF scene DM --- ...ene_Cdf3dRevisionProperties.Container.yaml | 13 ++ .../scene_EnvironmentMap.Container.yaml | 12 ++ ...mage360CollectionProperties.Container.yaml | 23 +++ ...ene_Image360CollectionScene.Container.yaml | 12 ++ .../scene_SceneConfiguration.Container.yaml | 152 ++++++++++++++++ .../scene_TexturedMap.Container.yaml | 21 +++ .../scene_TexturedPlane.Container.yaml | 29 +++ .../cdf_scene/data_models/scene.Space.yaml | 3 + .../scene_data_model.DataModel.yaml | 66 +++++++ .../views/EnvironmentMap.View.yaml | 28 +++ .../Image360CollectionProperties.View.yaml | 22 +++ .../views/Image360CollectionScene.View.yaml | 20 +++ .../views/RevisionProperties.View.yaml | 16 ++ .../views/SceneConfiguration.View.yaml | 166 ++++++++++++++++++ .../data_models/views/TexturedMap.View.yaml | 17 ++ .../data_models/views/TexturedPlane.View.yaml | 40 +++++ modules/models/cdf_scene/default.config.yaml | 1 + modules/models/cdf_scene/module.toml | 4 + 18 files changed, 645 insertions(+) create mode 100644 modules/models/cdf_scene/data_models/containers/scene_Cdf3dRevisionProperties.Container.yaml create mode 100644 modules/models/cdf_scene/data_models/containers/scene_EnvironmentMap.Container.yaml create mode 100644 modules/models/cdf_scene/data_models/containers/scene_Image360CollectionProperties.Container.yaml create mode 100644 modules/models/cdf_scene/data_models/containers/scene_Image360CollectionScene.Container.yaml create mode 100644 modules/models/cdf_scene/data_models/containers/scene_SceneConfiguration.Container.yaml create mode 100644 modules/models/cdf_scene/data_models/containers/scene_TexturedMap.Container.yaml create mode 100644 modules/models/cdf_scene/data_models/containers/scene_TexturedPlane.Container.yaml create mode 100644 modules/models/cdf_scene/data_models/scene.Space.yaml create mode 100644 modules/models/cdf_scene/data_models/scene_data_model.DataModel.yaml create mode 100644 modules/models/cdf_scene/data_models/views/EnvironmentMap.View.yaml create mode 100644 modules/models/cdf_scene/data_models/views/Image360CollectionProperties.View.yaml create mode 100644 modules/models/cdf_scene/data_models/views/Image360CollectionScene.View.yaml create mode 100644 modules/models/cdf_scene/data_models/views/RevisionProperties.View.yaml create mode 100644 modules/models/cdf_scene/data_models/views/SceneConfiguration.View.yaml create mode 100644 modules/models/cdf_scene/data_models/views/TexturedMap.View.yaml create mode 100644 modules/models/cdf_scene/data_models/views/TexturedPlane.View.yaml create mode 100644 modules/models/cdf_scene/default.config.yaml create mode 100644 modules/models/cdf_scene/module.toml diff --git a/modules/models/cdf_scene/data_models/containers/scene_Cdf3dRevisionProperties.Container.yaml b/modules/models/cdf_scene/data_models/containers/scene_Cdf3dRevisionProperties.Container.yaml new file mode 100644 index 00000000..fe004bd2 --- /dev/null +++ b/modules/models/cdf_scene/data_models/containers/scene_Cdf3dRevisionProperties.Container.yaml @@ -0,0 +1,13 @@ +space: {{ schemaSpace }} +externalId: Cdf3dRevisionProperties +name: Cdf3dRevisionProperties +usedFor: edge +properties: + revisionId: + type: + list: false + type: int64 + immutable: false + nullable: false + autoIncrement: false + name: revisionId diff --git a/modules/models/cdf_scene/data_models/containers/scene_EnvironmentMap.Container.yaml b/modules/models/cdf_scene/data_models/containers/scene_EnvironmentMap.Container.yaml new file mode 100644 index 00000000..65242bda --- /dev/null +++ b/modules/models/cdf_scene/data_models/containers/scene_EnvironmentMap.Container.yaml @@ -0,0 +1,12 @@ +space: {{ schemaSpace }} +externalId: EnvironmentMap +name: EnvironmentMap +properties: + isSpherical: + type: + list: false + type: boolean + immutable: false + nullable: false + autoIncrement: false + name: isSpherical diff --git a/modules/models/cdf_scene/data_models/containers/scene_Image360CollectionProperties.Container.yaml b/modules/models/cdf_scene/data_models/containers/scene_Image360CollectionProperties.Container.yaml new file mode 100644 index 00000000..5ec14c37 --- /dev/null +++ b/modules/models/cdf_scene/data_models/containers/scene_Image360CollectionProperties.Container.yaml @@ -0,0 +1,23 @@ +space: {{ schemaSpace }} +externalId: Image360CollectionProperties +name: Image360CollectionProperties +usedFor: edge +properties: + image360CollectionExternalId: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: false + autoIncrement: false + name: image360CollectionExternalId + image360CollectionSpace: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: false + autoIncrement: false + name: image360CollectionSpace diff --git a/modules/models/cdf_scene/data_models/containers/scene_Image360CollectionScene.Container.yaml b/modules/models/cdf_scene/data_models/containers/scene_Image360CollectionScene.Container.yaml new file mode 100644 index 00000000..bde8fab3 --- /dev/null +++ b/modules/models/cdf_scene/data_models/containers/scene_Image360CollectionScene.Container.yaml @@ -0,0 +1,12 @@ +space: {{ schemaSpace }} +externalId: Image360CollectionScene +name: Image360CollectionScene +properties: + model3d: + type: + list: false + type: direct + immutable: false + nullable: true + autoIncrement: false + name: model3d diff --git a/modules/models/cdf_scene/data_models/containers/scene_SceneConfiguration.Container.yaml b/modules/models/cdf_scene/data_models/containers/scene_SceneConfiguration.Container.yaml new file mode 100644 index 00000000..3e3ca35e --- /dev/null +++ b/modules/models/cdf_scene/data_models/containers/scene_SceneConfiguration.Container.yaml @@ -0,0 +1,152 @@ +space: {{ schemaSpace }} +externalId: SceneConfiguration +name: SceneConfiguration +properties: + name: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: false + autoIncrement: false + name: name + description: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false + name: description + cameraTranslationX: + type: + list: false + type: float64 + immutable: false + nullable: false + autoIncrement: false + name: cameraTranslationX + cameraTranslationY: + type: + list: false + type: float64 + immutable: false + nullable: false + autoIncrement: false + name: cameraTranslationY + cameraTranslationZ: + type: + list: false + type: float64 + immutable: false + nullable: false + autoIncrement: false + name: cameraTranslationZ + cameraEulerRotationX: + type: + list: false + type: float64 + immutable: false + nullable: true + autoIncrement: false + name: cameraEulerRotationX + cameraEulerRotationY: + type: + list: false + type: float64 + immutable: false + nullable: false + autoIncrement: false + name: cameraEulerRotationY + cameraEulerRotationZ: + type: + list: false + type: float64 + immutable: false + nullable: false + autoIncrement: false + name: cameraEulerRotationZ + cameraTargetX: + type: + list: false + type: float64 + immutable: false + nullable: true + autoIncrement: false + name: cameraTargetX + cameraTargetY: + type: + list: false + type: float64 + immutable: false + nullable: true + autoIncrement: false + name: cameraTargetY + cameraTargetZ: + type: + list: false + type: float64 + immutable: false + nullable: true + autoIncrement: false + name: cameraTargetZ + latitude: + type: + list: false + type: float64 + immutable: false + nullable: true + autoIncrement: false + name: latitude + longitude: + type: + list: false + type: float64 + immutable: false + nullable: true + autoIncrement: false + name: longitude + createdBy: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false + name: createdBy + updatedAt: + type: + list: false + type: timestamp + immutable: false + nullable: true + autoIncrement: false + name: updatedAt + updatedBy: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false + name: updatedBy + thumbnailFile: + type: + list: false + type: file + immutable: false + nullable: true + autoIncrement: false + name: file + skybox: + type: + list: false + type: direct + immutable: false + nullable: true + autoIncrement: false + name: skybox diff --git a/modules/models/cdf_scene/data_models/containers/scene_TexturedMap.Container.yaml b/modules/models/cdf_scene/data_models/containers/scene_TexturedMap.Container.yaml new file mode 100644 index 00000000..9008c8cc --- /dev/null +++ b/modules/models/cdf_scene/data_models/containers/scene_TexturedMap.Container.yaml @@ -0,0 +1,21 @@ +space: {{ schemaSpace }} +externalId: TexturedMap +name: TexturedMap +properties: + label: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: false + autoIncrement: false + name: label + file: + type: + list: false + type: file + immutable: false + nullable: true + autoIncrement: false + name: file diff --git a/modules/models/cdf_scene/data_models/containers/scene_TexturedPlane.Container.yaml b/modules/models/cdf_scene/data_models/containers/scene_TexturedPlane.Container.yaml new file mode 100644 index 00000000..c7b0b205 --- /dev/null +++ b/modules/models/cdf_scene/data_models/containers/scene_TexturedPlane.Container.yaml @@ -0,0 +1,29 @@ +space: {{ schemaSpace }} +externalId: TexturedPlane +name: TexturedPlane +properties: + wrapping: + type: + list: false + collation: ucs_basic + type: text + immutable: false + nullable: true + autoIncrement: false + name: wrapping + repeatU: + type: + list: false + type: int64 + immutable: false + nullable: true + autoIncrement: false + name: repeatU + repeatV: + type: + list: false + type: int64 + immutable: false + nullable: true + autoIncrement: false + name: repeatV diff --git a/modules/models/cdf_scene/data_models/scene.Space.yaml b/modules/models/cdf_scene/data_models/scene.Space.yaml new file mode 100644 index 00000000..3d642bd7 --- /dev/null +++ b/modules/models/cdf_scene/data_models/scene.Space.yaml @@ -0,0 +1,3 @@ +space: {{ schemaSpace }} +description: Space for storing 3D scene data model and instances +name: {{ schemaSpace }} diff --git a/modules/models/cdf_scene/data_models/scene_data_model.DataModel.yaml b/modules/models/cdf_scene/data_models/scene_data_model.DataModel.yaml new file mode 100644 index 00000000..18c64a61 --- /dev/null +++ b/modules/models/cdf_scene/data_models/scene_data_model.DataModel.yaml @@ -0,0 +1,66 @@ +space: {{ schemaSpace }} +externalId: scene_data_model +name: SceneConfiguration +description: This is the data model used for storing 3D scenes +version: '1' +views: +- space: {{ schemaSpace }} + externalId: SceneConfiguration + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: Image360CollectionProperties + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: RevisionProperties + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: EnvironmentMap + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: TexturedMap + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: TexturedPlane + version: v1 + type: view +- space: {{ schemaSpace }} + externalId: Image360CollectionScene + version: v1 + type: view +- space: cdf_3d_schema + externalId: Cdf3dModel + version: '1' + type: view +- space: cdf_3d_schema + externalId: Cdf3dEntity + version: '1' + type: view +- space: cdf_3d_schema + externalId: Cdf3dConnectionProperties + version: '1' + type: view +- space: cdf_360_image_schema + externalId: Image360 + version: v1 + type: view +- space: cdf_360_image_schema + externalId: Image360Collection + version: v1 + type: view +- space: cdf_360_image_schema + externalId: Station360 + version: v1 + type: view +- space: cdf_3d_schema + externalId: Transformation3d + version: v1 + type: view +- space: cdf_3d_schema + externalId: CubeMap + version: v1 + type: view diff --git a/modules/models/cdf_scene/data_models/views/EnvironmentMap.View.yaml b/modules/models/cdf_scene/data_models/views/EnvironmentMap.View.yaml new file mode 100644 index 00000000..e1fab19a --- /dev/null +++ b/modules/models/cdf_scene/data_models/views/EnvironmentMap.View.yaml @@ -0,0 +1,28 @@ +space: {{ schemaSpace }} +externalId: EnvironmentMap +name: EnvironmentMap +implements: +- space: {{ schemaSpace }} + externalId: TexturedMap + version: v1 + type: view +version: v1 +properties: + label: + container: + space: {{ schemaSpace }} + externalId: TexturedMap + type: container + containerPropertyIdentifier: label + file: + container: + space: {{ schemaSpace }} + externalId: TexturedMap + type: container + containerPropertyIdentifier: file + isSpherical: + container: + space: {{ schemaSpace }} + externalId: EnvironmentMap + type: container + containerPropertyIdentifier: isSpherical diff --git a/modules/models/cdf_scene/data_models/views/Image360CollectionProperties.View.yaml b/modules/models/cdf_scene/data_models/views/Image360CollectionProperties.View.yaml new file mode 100644 index 00000000..ecde3f7d --- /dev/null +++ b/modules/models/cdf_scene/data_models/views/Image360CollectionProperties.View.yaml @@ -0,0 +1,22 @@ +space: {{ schemaSpace }} +externalId: Image360CollectionProperties +name: Image360CollectionProperties +implements: +- space: cdf_3d_schema + externalId: Transformation3d + version: v1 + type: view +version: v1 +properties: + image360CollectionExternalId: + container: + space: {{ schemaSpace }} + externalId: Image360CollectionProperties + type: container + containerPropertyIdentifier: image360CollectionExternalId + image360CollectionSpace: + container: + space: {{ schemaSpace }} + externalId: Image360CollectionProperties + type: container + containerPropertyIdentifier: image360CollectionSpace diff --git a/modules/models/cdf_scene/data_models/views/Image360CollectionScene.View.yaml b/modules/models/cdf_scene/data_models/views/Image360CollectionScene.View.yaml new file mode 100644 index 00000000..97aa2e82 --- /dev/null +++ b/modules/models/cdf_scene/data_models/views/Image360CollectionScene.View.yaml @@ -0,0 +1,20 @@ +space: {{ schemaSpace }} +externalId: Image360CollectionScene +implements: +- space: cdf_360_image_schema + externalId: Image360Collection + version: v1 + type: view +version: v1 +properties: + model3d: + container: + space: {{ schemaSpace }} + externalId: Image360CollectionScene + type: container + containerPropertyIdentifier: model3d + source: + space: cdf_3d_schema + externalId: Cdf3dModel + version: '1' + type: view diff --git a/modules/models/cdf_scene/data_models/views/RevisionProperties.View.yaml b/modules/models/cdf_scene/data_models/views/RevisionProperties.View.yaml new file mode 100644 index 00000000..f08c006a --- /dev/null +++ b/modules/models/cdf_scene/data_models/views/RevisionProperties.View.yaml @@ -0,0 +1,16 @@ +space: {{ schemaSpace }} +externalId: RevisionProperties +name: Cdf3dRevisionProperties +implements: +- space: cdf_3d_schema + externalId: Transformation3d + version: v1 + type: view +version: v1 +properties: + revisionId: + container: + space: {{ schemaSpace }} + externalId: Cdf3dRevisionProperties + type: container + containerPropertyIdentifier: revisionId diff --git a/modules/models/cdf_scene/data_models/views/SceneConfiguration.View.yaml b/modules/models/cdf_scene/data_models/views/SceneConfiguration.View.yaml new file mode 100644 index 00000000..e7a1d2ee --- /dev/null +++ b/modules/models/cdf_scene/data_models/views/SceneConfiguration.View.yaml @@ -0,0 +1,166 @@ +space: {{ schemaSpace }} +externalId: SceneConfiguration +name: SceneConfiguration +version: v1 +properties: + name: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: name + description: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: description + cameraTranslationX: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: cameraTranslationX + cameraTranslationY: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: cameraTranslationY + cameraTranslationZ: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: cameraTranslationZ + cameraEulerRotationX: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: cameraEulerRotationX + cameraEulerRotationY: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: cameraEulerRotationY + cameraEulerRotationZ: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: cameraEulerRotationZ + cameraTargetX: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: cameraTargetX + cameraTargetY: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: cameraTargetY + cameraTargetZ: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: cameraTargetZ + latitude: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: latitude + longitude: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: longitude + thumbnailFile: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: thumbnailFile + createdBy: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: createdBy + updatedAt: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: updatedAt + updatedBy: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: updatedBy + skybox: + container: + space: {{ schemaSpace }} + externalId: SceneConfiguration + type: container + containerPropertyIdentifier: skybox + source: + space: {{ schemaSpace }} + externalId: EnvironmentMap + version: v1 + type: view + model3ds: + type: + space: {{ schemaSpace }} + externalId: SceneConfiguration.model3ds + source: + space: cdf_3d_schema + externalId: Cdf3dModel + version: '1' + type: view + direction: outwards + edgeSource: + space: {{ schemaSpace }} + externalId: RevisionProperties + version: v1 + type: view + connectionType: multi_edge_connection + images360Collections: + type: + space: {{ schemaSpace }} + externalId: SceneConfiguration.images360Collections + source: + space: cdf_3d_schema + externalId: Cdf3dModel + version: '1' + type: view + direction: outwards + edgeSource: + space: {{ schemaSpace }} + externalId: Image360CollectionProperties + version: v1 + type: view + connectionType: multi_edge_connection + texturedGroundPlanes: + type: + space: {{ schemaSpace }} + externalId: SceneConfiguration.texturedGroundPlanes + source: + space: {{ schemaSpace }} + externalId: TexturedPlane + version: v1 + type: view + direction: outwards + edgeSource: + space: cdf_3d_schema + externalId: Transformation3d + version: v1 + type: view + connectionType: multi_edge_connection diff --git a/modules/models/cdf_scene/data_models/views/TexturedMap.View.yaml b/modules/models/cdf_scene/data_models/views/TexturedMap.View.yaml new file mode 100644 index 00000000..be3c428a --- /dev/null +++ b/modules/models/cdf_scene/data_models/views/TexturedMap.View.yaml @@ -0,0 +1,17 @@ +space: {{ schemaSpace }} +externalId: TexturedMap +name: TexturedMap +version: v1 +properties: + label: + container: + space: {{ schemaSpace }} + externalId: TexturedMap + type: container + containerPropertyIdentifier: label + file: + container: + space: {{ schemaSpace }} + externalId: TexturedMap + type: container + containerPropertyIdentifier: file diff --git a/modules/models/cdf_scene/data_models/views/TexturedPlane.View.yaml b/modules/models/cdf_scene/data_models/views/TexturedPlane.View.yaml new file mode 100644 index 00000000..6f4fc696 --- /dev/null +++ b/modules/models/cdf_scene/data_models/views/TexturedPlane.View.yaml @@ -0,0 +1,40 @@ +space: {{ schemaSpace }} +externalId: TexturedPlane +name: TexturedPlane +implements: +- space: {{ schemaSpace }} + externalId: TexturedMap + version: v1 + type: view +version: v1 +properties: + label: + container: + space: {{ schemaSpace }} + externalId: TexturedMap + type: container + containerPropertyIdentifier: label + file: + container: + space: {{ schemaSpace }} + externalId: TexturedMap + type: container + containerPropertyIdentifier: file + wrapping: + container: + space: {{ schemaSpace }} + externalId: TexturedPlane + type: container + containerPropertyIdentifier: wrapping + repeatU: + container: + space: {{ schemaSpace }} + externalId: TexturedPlane + type: container + containerPropertyIdentifier: repeatU + repeatV: + container: + space: {{ schemaSpace }} + externalId: TexturedPlane + type: container + containerPropertyIdentifier: repeatV diff --git a/modules/models/cdf_scene/default.config.yaml b/modules/models/cdf_scene/default.config.yaml new file mode 100644 index 00000000..6c346212 --- /dev/null +++ b/modules/models/cdf_scene/default.config.yaml @@ -0,0 +1 @@ +schemaSpace: scene diff --git a/modules/models/cdf_scene/module.toml b/modules/models/cdf_scene/module.toml new file mode 100644 index 00000000..47423c66 --- /dev/null +++ b/modules/models/cdf_scene/module.toml @@ -0,0 +1,4 @@ +[module] +title = "(Alpha) Scene Data Model" +id = "cdf_scene" +package_id = "dp:models" \ No newline at end of file From 84ef2892132664839be96b6b5a40ad15d513015c Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Fri, 27 Mar 2026 12:37:30 +0530 Subject: [PATCH 04/12] Empty module for TK --- modules/custom/my_module/auth/.gitkeep | 0 modules/custom/my_module/default.config.yaml | 1 + modules/custom/my_module/module.toml | 4 ++++ 3 files changed, 5 insertions(+) create mode 100644 modules/custom/my_module/auth/.gitkeep create mode 100644 modules/custom/my_module/default.config.yaml create mode 100644 modules/custom/my_module/module.toml diff --git a/modules/custom/my_module/auth/.gitkeep b/modules/custom/my_module/auth/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/modules/custom/my_module/default.config.yaml b/modules/custom/my_module/default.config.yaml new file mode 100644 index 00000000..30f5d73e --- /dev/null +++ b/modules/custom/my_module/default.config.yaml @@ -0,0 +1 @@ +my_var: my_value \ No newline at end of file diff --git a/modules/custom/my_module/module.toml b/modules/custom/my_module/module.toml new file mode 100644 index 00000000..378157ad --- /dev/null +++ b/modules/custom/my_module/module.toml @@ -0,0 +1,4 @@ +[module] +title = "Empty module" +id = "my_module" +package_id = "dp:custom" \ No newline at end of file From 33a074f19174741706b5d6ed723ea35287980116 Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Fri, 27 Mar 2026 12:38:27 +0530 Subject: [PATCH 05/12] Module for Auth group --- .../common/cdf_auth_readwrite_all/README.md | 23 ++ .../auth/admin.readonly.group.yaml | 265 ++++++++++++++ .../auth/admin.readwrite.group.yaml | 329 ++++++++++++++++++ .../default.config.yaml | 2 + .../common/cdf_auth_readwrite_all/module.toml | 4 + 5 files changed, 623 insertions(+) create mode 100644 modules/common/cdf_auth_readwrite_all/README.md create mode 100644 modules/common/cdf_auth_readwrite_all/auth/admin.readonly.group.yaml create mode 100644 modules/common/cdf_auth_readwrite_all/auth/admin.readwrite.group.yaml create mode 100644 modules/common/cdf_auth_readwrite_all/default.config.yaml create mode 100644 modules/common/cdf_auth_readwrite_all/module.toml diff --git a/modules/common/cdf_auth_readwrite_all/README.md b/modules/common/cdf_auth_readwrite_all/README.md new file mode 100644 index 00000000..16091fc1 --- /dev/null +++ b/modules/common/cdf_auth_readwrite_all/README.md @@ -0,0 +1,23 @@ +# Module: cdf_auth_readwrite_all + +This module contains two groups that are used to grant access to all resources in a CDF project. This +should **never** be used for production projects, as it grants read-write access to all resources in the project. +However, it is useful for sandbox projects to allow members of the `gp_admin_read_write` group to have full access. +It can also be used for demo projects where you want to give full read access `gp_admin_readonly` access to +all resources to a group of users. + +## Managed resources + +This module manages the following resources: + +1. a group with read-write access (`gp_admin_read_write`) to everything in a CDF project. +2. a group with read-only access `gp_admin_readonly` (for viewing configurations from UI). + +## Variables + +The following variables are required and defined in this module: + +| Variable | Description | +|---------------------|------------------------------------------------------------------------------------------------------| +| readwrite_source_id | The source ID of the group that should be granted read-write access to all resources in the project. | +| readonly_source_id | The source ID of the group that should be granted read-only access to all resources in the project. | diff --git a/modules/common/cdf_auth_readwrite_all/auth/admin.readonly.group.yaml b/modules/common/cdf_auth_readwrite_all/auth/admin.readonly.group.yaml new file mode 100644 index 00000000..94de3b5f --- /dev/null +++ b/modules/common/cdf_auth_readwrite_all/auth/admin.readonly.group.yaml @@ -0,0 +1,265 @@ +name: 'gp_admin_readonly' +sourceId: '{{readonly_source_id}}' +metadata: + origin: "cognite-toolkit" +capabilities: + - projectsAcl: + actions: + - LIST + - READ + scope: + all: {} + - analyticsAcl: + actions: + - READ + - LIST + scope: + all: {} + - annotationsAcl: + actions: + - READ + scope: + all: {} + - appConfigAcl: + actions: + - READ + scope: + all: {} + - assetsAcl: + actions: + - READ + scope: + all: {} + - auditlogAcl: + actions: + - READ + scope: + all: {} + - dataModelInstancesAcl: + actions: + - READ + scope: + all: {} + - dataModelsAcl: + actions: + - READ + scope: + all: {} + - datasetsAcl: + actions: + - READ + scope: + all: {} + - diagramParsingAcl: + actions: + - READ + scope: + all: {} + - digitalTwinAcl: + actions: + - READ + scope: + all: {} + - documentFeedbackAcl: + actions: + - READ + scope: + all: {} + - documentPipelinesAcl: + actions: + - READ + scope: + all: {} + - entitymatchingAcl: + actions: + - READ + scope: + all: {} + - eventsAcl: + actions: + - READ + scope: + all: {} + - extractionConfigsAcl: + actions: + - READ + scope: + all: {} + - extractionPipelinesAcl: + actions: + - READ + scope: + all: {} + - extractionRunsAcl: + actions: + - READ + scope: + all: {} + - filePipelinesAcl: + actions: + - READ + scope: + all: {} + - filesAcl: + actions: + - READ + scope: + all: {} + - functionsAcl: + actions: + - READ + scope: + all: {} + - geospatialAcl: + actions: + - READ + scope: + all: {} + - geospatialCrsAcl: + actions: + - READ + scope: + all: {} + - groupsAcl: + actions: + - READ + - LIST + scope: + all: {} + - hostedExtractorsAcl: + actions: + - READ + scope: + all: {} + - labelsAcl: + actions: + - READ + scope: + all: {} + - locationFiltersAcl: + actions: + - READ + scope: + all: {} + - monitoringTasksAcl: + actions: + - READ + scope: + all: {} + - notificationsAcl: + actions: + - READ + scope: + all: {} + - pipelinesAcl: + actions: + - READ + scope: + all: {} + - postgresGatewayAcl: + actions: + - READ + scope: + all: {} + - rawAcl: + actions: + - READ + - LIST + scope: + all: {} + - relationshipsAcl: + actions: + - READ + scope: + all: {} + - roboticsAcl: + actions: + - READ + scope: + all: {} + - sapWritebackAcl: + actions: + - READ + scope: + all: {} + - sapWritebackRequestsAcl: + actions: + - LIST + scope: + all: {} + - scheduledCalculationsAcl: + actions: + - READ + scope: + all: {} + - securityCategoriesAcl: + actions: + - LIST + - MEMBEROF + scope: + all: {} + - seismicAcl: + actions: + - READ + scope: + all: {} + - sequencesAcl: + actions: + - READ + scope: + all: {} + - sessionsAcl: + actions: + - LIST + scope: + all: {} + - templateGroupsAcl: + actions: + - READ + scope: + all: {} + - templateInstancesAcl: + actions: + - READ + scope: + all: {} + - threedAcl: + actions: + - READ + scope: + all: {} + - timeSeriesAcl: + actions: + - READ + scope: + all: {} + - timeSeriesSubscriptionsAcl: + actions: + - READ + scope: + all: {} + - transformationsAcl: + actions: + - READ + scope: + all: {} + - typesAcl: + actions: + - READ + scope: + all: {} + - visionModelAcl: + actions: + - READ + scope: + all: {} + - wellsAcl: + actions: + - READ + scope: + all: {} + - workflowOrchestrationAcl: + actions: + - READ + scope: + all: {} diff --git a/modules/common/cdf_auth_readwrite_all/auth/admin.readwrite.group.yaml b/modules/common/cdf_auth_readwrite_all/auth/admin.readwrite.group.yaml new file mode 100644 index 00000000..b189417e --- /dev/null +++ b/modules/common/cdf_auth_readwrite_all/auth/admin.readwrite.group.yaml @@ -0,0 +1,329 @@ +name: 'gp_admin_read_write' +sourceId: '{{readwrite_source_id}}' +metadata: + origin: "cognite-toolkit" +capabilities: + - projectsAcl: + actions: + - LIST + - READ + - UPDATE + scope: + all: {} + - analyticsAcl: + actions: + - READ + - EXECUTE + - LIST + scope: + all: {} + - annotationsAcl: + actions: + - WRITE + - REVIEW + - READ + - SUGGEST + scope: + all: {} + - appConfigAcl: + actions: + - WRITE + - READ + scope: + all: {} + - assetsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - auditlogAcl: + actions: + - READ + scope: + all: {} + - dataModelInstancesAcl: + actions: + - WRITE_PROPERTIES + - WRITE + - READ + scope: + all: {} + - dataModelsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - datasetsAcl: + actions: + - WRITE + - OWNER + - READ + scope: + all: {} + - diagramParsingAcl: + actions: + - WRITE + - READ + scope: + all: { } + - digitalTwinAcl: + actions: + - WRITE + - READ + scope: + all: {} + - documentFeedbackAcl: + actions: + - CREATE + - READ + - DELETE + scope: + all: {} + - documentPipelinesAcl: + actions: + - WRITE + - READ + scope: + all: {} + - entitymatchingAcl: + actions: + - WRITE + - READ + scope: + all: {} + - eventsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - extractionConfigsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - extractionPipelinesAcl: + actions: + - WRITE + - READ + scope: + all: {} + - extractionRunsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - filePipelinesAcl: + actions: + - WRITE + - READ + scope: + all: {} + - filesAcl: + actions: + - WRITE + - READ + scope: + all: {} + - functionsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - geospatialAcl: + actions: + - WRITE + - READ + scope: + all: {} + - geospatialCrsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - groupsAcl: + actions: + - CREATE + - UPDATE + - READ + - LIST + - DELETE + scope: + all: {} + - hostedExtractorsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - labelsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - locationFiltersAcl: + actions: + - WRITE + - READ + scope: + all: {} + - monitoringTasksAcl: + actions: + - WRITE + - READ + scope: + all: {} + - notificationsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - pipelinesAcl: + actions: + - WRITE + - READ + scope: + all: {} + - postgresGatewayAcl: + actions: + - WRITE + - READ + scope: + all: {} + - rawAcl: + actions: + - LIST + - WRITE + - READ + scope: + all: {} + - relationshipsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - roboticsAcl: + actions: + - CREATE + - UPDATE + - READ + - DELETE + scope: + all: {} + - sapWritebackAcl: + actions: + - WRITE + - READ + scope: + all: {} + - sapWritebackRequestsAcl: + actions: + - WRITE + - LIST + scope: + all: {} + - scheduledCalculationsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - securityCategoriesAcl: + actions: + - CREATE + - MEMBEROF + - UPDATE + - LIST + - DELETE + scope: + all: {} + - seismicAcl: + actions: + - WRITE + - READ + scope: + all: {} + - sequencesAcl: + actions: + - WRITE + - READ + scope: + all: {} + - sessionsAcl: + actions: + - CREATE + - LIST + - DELETE + scope: + all: {} + - templateGroupsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - templateInstancesAcl: + actions: + - WRITE + - READ + scope: + all: {} + - threedAcl: + actions: + - CREATE + - UPDATE + - READ + - DELETE + scope: + all: {} + - timeSeriesAcl: + actions: + - WRITE + - READ + scope: + all: {} + - timeSeriesSubscriptionsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - transformationsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - typesAcl: + actions: + - WRITE + - READ + scope: + all: {} + - visionModelAcl: + actions: + - WRITE + - READ + scope: + all: {} + - wellsAcl: + actions: + - WRITE + - READ + scope: + all: {} + - workflowOrchestrationAcl: + actions: + - WRITE + - READ + scope: + all: {} diff --git a/modules/common/cdf_auth_readwrite_all/default.config.yaml b/modules/common/cdf_auth_readwrite_all/default.config.yaml new file mode 100644 index 00000000..a5bf9eb8 --- /dev/null +++ b/modules/common/cdf_auth_readwrite_all/default.config.yaml @@ -0,0 +1,2 @@ +readwrite_source_id: +readonly_source_id: \ No newline at end of file diff --git a/modules/common/cdf_auth_readwrite_all/module.toml b/modules/common/cdf_auth_readwrite_all/module.toml new file mode 100644 index 00000000..a1768ff7 --- /dev/null +++ b/modules/common/cdf_auth_readwrite_all/module.toml @@ -0,0 +1,4 @@ +[module] +title = "Admin group for CI/CD" +id = "cdf_auth_readwrite_all" +package_id = "dp:common" \ No newline at end of file From d29f5df5f650f782ebceb2a6277a120bfcaefa00 Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Fri, 27 Mar 2026 12:40:42 +0530 Subject: [PATCH 06/12] Bootcamp modules --- modules/bootcamp/README.md | 5 + .../ice_cream_api/default.config.yaml | 9 + .../icapi_datapoints_extractor/handler.py | 168 +++++++++++++ .../ice_cream_factory_api.py | 61 +++++ .../requirements.txt | 3 + modules/bootcamp/ice_cream_api/module.toml | 5 + modules/bootcamp/module.toml | 5 + .../use_cases/oee/default.config.yaml | 6 + .../oee/functions/oee_timeseries/handler.py | 229 ++++++++++++++++++ .../functions/oee_timeseries/requirements.txt | 2 + modules/bootcamp/use_cases/oee/module.toml | 5 + 11 files changed, 498 insertions(+) create mode 100644 modules/bootcamp/README.md create mode 100644 modules/bootcamp/ice_cream_api/default.config.yaml create mode 100644 modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/handler.py create mode 100644 modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/ice_cream_factory_api.py create mode 100644 modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/requirements.txt create mode 100644 modules/bootcamp/ice_cream_api/module.toml create mode 100644 modules/bootcamp/module.toml create mode 100644 modules/bootcamp/use_cases/oee/default.config.yaml create mode 100644 modules/bootcamp/use_cases/oee/functions/oee_timeseries/handler.py create mode 100644 modules/bootcamp/use_cases/oee/functions/oee_timeseries/requirements.txt create mode 100644 modules/bootcamp/use_cases/oee/module.toml diff --git a/modules/bootcamp/README.md b/modules/bootcamp/README.md new file mode 100644 index 00000000..5cd6027c --- /dev/null +++ b/modules/bootcamp/README.md @@ -0,0 +1,5 @@ +# Bootcamp module + +These are the initial configs and python functions used for the bootcamp. +[Docs](https://docs.cdf-bootcamp.cogniteapp.com/) +[Repo](https://github.com/cognitedata/cognite-data-fusion-bootcamp) diff --git a/modules/bootcamp/ice_cream_api/default.config.yaml b/modules/bootcamp/ice_cream_api/default.config.yaml new file mode 100644 index 00000000..980b05f0 --- /dev/null +++ b/modules/bootcamp/ice_cream_api/default.config.yaml @@ -0,0 +1,9 @@ +icapi_extractors_source_id: + +tokenUri: ${IDP_TOKEN_URL} +cdfProjectName: ${CDF_PROJECT} +scopes: ${IDP_SCOPES} +icapi_trigger_client_id: ${ICAPI_EXTRACTORS_CLIENT_ID} +icapi_trigger_client_secret: ${ICAPI_EXTRACTORS_CLIENT_SECRET} +icapi_extractors_client_id: ${ICAPI_EXTRACTORS_CLIENT_ID} +icapi_extractors_client_secret: ${ICAPI_EXTRACTORS_CLIENT_SECRET} \ No newline at end of file diff --git a/modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/handler.py b/modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/handler.py new file mode 100644 index 00000000..9d90b771 --- /dev/null +++ b/modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/handler.py @@ -0,0 +1,168 @@ +from datetime import datetime, timedelta, timezone +from itertools import islice +from timeit import default_timer + +from cognite.client import CogniteClient +from cognite.client.data_classes import ExtractionPipelineRun +from cognite.client.data_classes.data_modeling import NodeId, ViewId +from cognite.client.data_classes.data_modeling.cdm.v1 import CogniteAsset, CogniteTimeSeries +from cognite.client.data_classes.filters import Prefix, ContainsAny + +from ice_cream_factory_api import IceCreamFactoryAPI + +from cognite.client.config import global_config +global_config.disable_pypi_version_check = True + +from itertools import islice + + +def batcher(iterable, batch_size): + iterator = iter(iterable) + while batch := list(islice(iterator, batch_size)): + yield batch + + +def get_time_series_for_site(client: CogniteClient, site): + this_site = site.lower() + sub_tree_root = client.data_modeling.instances.retrieve_nodes( + NodeId("icapi_dm_space", this_site), + node_cls=CogniteAsset + ) + + if not sub_tree_root: + print( + f"----No CogniteAssets in CDF for {site}!----\n" + f" Run the 'Create Cognite Asset Hierarchy' transformation!" + ) + return [] + + sub_tree_nodes = client.data_modeling.instances.list( + instance_type=CogniteAsset, + filter=Prefix(property=["cdf_cdm", "CogniteAsset/v1", "path"], value=sub_tree_root.path), + limit=None + ) + + if not sub_tree_nodes: + print( + f"----No CogniteTimeSeries in CDF for {site}!----\n" + f" Run the 'Contextualize Timeseries and Assets' transformation!" + ) + return [] + + value_list = [{"space": node.space, "externalId": node.external_id} for node in sub_tree_nodes] + + time_series = [ + client.data_modeling.instances.search( + view=ViewId("cdf_cdm", "CogniteTimeSeries", "v1"), + instance_type=CogniteTimeSeries, + filter=ContainsAny(property=["cdf_cdm", "CogniteTimeSeries/v1", "assets"], values=batch), + limit=None + ) + for batch in batcher(value_list, 20) + ] + + # Combine list of batch results into a single NodeList + time_series = [node for nodelist in time_series for node in nodelist] + + if not time_series: + print("No CogniteTimeSeries in the CogniteCore Data Model (cdf_cdm Space)") + + time_series = [ + item for item in time_series + if any(substring in item.external_id for substring in ["planned_status", "good"]) + ] + + return time_series + + +def report_ext_pipe(client: CogniteClient, status, message=None): + ext_pipe_run = ExtractionPipelineRun( + extpipe_external_id="ep_icapi_datapoints", + status=status, + message=message + ) + + client.extraction_pipelines.runs.create(run=ext_pipe_run) + +def handle(client: CogniteClient = None, data=None): + report_ext_pipe(client, "seen") + + sites = None + backfill = None + hours = None + max_hours = 336 + + if data: + sites = data.get("sites") + backfill = data.get("backfill") + hours = data.get("hours") + + if hours and hours > max_hours: + print(f"{hours} > {max_hours}! The Ice Cream API can't serve more than {max_hours} hours of datapoints, setting hours to max") + hours = max_hours + + all_sites = [ + "Houston", + "Oslo", + "Kuala_Lumpur", + "Hannover", + "Nuremberg", + "Marseille", + "Sao_Paulo", + "Chicago", + "Rotterdam", + "London", + ] + + sites = sites or all_sites + backfill = backfill or True + hours = hours or max_hours + + now = datetime.now(timezone.utc).timestamp() * 1000 + increment = timedelta(hours=hours).total_seconds() * 1000 + + ice_cream_api = IceCreamFactoryAPI(base_url="https://ice-cream-factory.inso-internal.cognite.ai") + + try: + for site in sites: + print(f"Getting Data Points for {site}") + big_start = default_timer() + + time_series = get_time_series_for_site(client, site) + + latest_dps = { + dp.external_id: dp.timestamp + for dp in client.time_series.data.retrieve_latest( + external_id=[ts.external_id for ts in time_series], + ignore_unknown_ids=True + ) + } if not backfill else None + + to_insert = [] + for ts in time_series: + # figure out the window of datapoints to pull for this Time Series + latest = latest_dps[ts.external_id][0] if not backfill and latest_dps.get(ts.external_id) else None + + start = latest if latest else now - increment + end = now + + dps_list = ice_cream_api.get_datapoints(timeseries_ext_id=ts.external_id, start=start, end=end) + + for dp_dict in dps_list: + dp_dict["instance_id"] = NodeId(space="icapi_dm_space", external_id=dp_dict["instance_id"]) + + to_insert.extend(dps_list) + + if len(to_insert) > 50: + client.time_series.data.insert_multiple(datapoints=to_insert) + to_insert = [] + + if to_insert: + client.time_series.data.insert_multiple(datapoints=to_insert) + print(f" {hours}h of Datapoints took {default_timer() - big_start:.2f} seconds") + else: + print(f" No TimeSeries, for {hours}h of Datapoints took {default_timer() - big_start:.2f} seconds") + + report_ext_pipe(client, "success") + except Exception as e: + report_ext_pipe(client, "fail", e) \ No newline at end of file diff --git a/modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/ice_cream_factory_api.py b/modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/ice_cream_factory_api.py new file mode 100644 index 00000000..f0607754 --- /dev/null +++ b/modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/ice_cream_factory_api.py @@ -0,0 +1,61 @@ +from typing import Dict, Union + +import orjson +from requests import Response, Session, adapters + + +class IceCreamFactoryAPI: + """Class for Ice Cream Factory API.""" + + def __init__(self, base_url: str): + self.base_url = base_url + self.adapter = adapters.HTTPAdapter(max_retries=3) + self.session = Session() + self.session.mount("https://", self.adapter) + + def get_response( + self, headers: Dict[str, str], url_suffix: str, params: Dict[str, Union[str, int, float]] = {} + ) -> Response: + """ + Get response from API. + + Args: + headers: request header + url_suffix: string to add to base url + params: query parameters + """ + + response = self.session.get(f"{self.base_url}/{url_suffix}", headers=headers, timeout=40, params=params) + response.raise_for_status() + return response + + def get_datapoints(self, timeseries_ext_id: str, start: Union[str, int, float], end: Union[str, int, float]): + """ + Get datapoints for a timeseries external id. This will also return datapoints for an associated timeseries + + (e.g. request for external id "HPM2C561:planned_status" will return datapoints for "HPM2C561:planned_status" AND + "HPM2C561:status". Similar, request for timeseries with external id "HPM2C561:count" will return datapoints for + "HPM2C561:count" AND ""HPM2C561:good"). + + Args: + timeseries_ext_id: external id of timeseries to get datapoints for + start: start for datapoints (UNIX timestamp (int, float) or string with format 'YYYY-MM-DD HH:MM') + end: end for datapoints (UNIX timestamp (int, float) or string with format 'YYYY-MM-DD HH:MM') + """ + params = {"start": start, "end": end, "external_id": timeseries_ext_id} + response = self.get_response(headers={}, url_suffix="datapoints/oee", params=params) + + response_dict = orjson.loads(response.content) + + response_dict = [ + { + "instance_id": ts, + "datapoints": [ + # convert timestamp to ms (*1000) for CDF uploads + {"timestamp": dp[0] * 1000, "value": dp[1]} + for dp in dps + ] + } for ts, dps in response_dict.items() if len(dps) > 1 + ] + + return response_dict \ No newline at end of file diff --git a/modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/requirements.txt b/modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/requirements.txt new file mode 100644 index 00000000..636ad284 --- /dev/null +++ b/modules/bootcamp/ice_cream_api/functions/icapi_datapoints_extractor/requirements.txt @@ -0,0 +1,3 @@ +cognite-sdk +orjson >= 3.10.5 +guppy3 \ No newline at end of file diff --git a/modules/bootcamp/ice_cream_api/module.toml b/modules/bootcamp/ice_cream_api/module.toml new file mode 100644 index 00000000..0ddd40a6 --- /dev/null +++ b/modules/bootcamp/ice_cream_api/module.toml @@ -0,0 +1,5 @@ +[module] +title = "Bootcamp" +is_selected_by_default = true +id = "bootcamp_ice_cream_api" +package_id = "dp:bootcamp" \ No newline at end of file diff --git a/modules/bootcamp/module.toml b/modules/bootcamp/module.toml new file mode 100644 index 00000000..80065199 --- /dev/null +++ b/modules/bootcamp/module.toml @@ -0,0 +1,5 @@ +[module] +title = "Bootcamp" +is_selected_by_default = false +id = "bootcamp" +package_id = "dp:bootcamp" \ No newline at end of file diff --git a/modules/bootcamp/use_cases/oee/default.config.yaml b/modules/bootcamp/use_cases/oee/default.config.yaml new file mode 100644 index 00000000..fc053715 --- /dev/null +++ b/modules/bootcamp/use_cases/oee/default.config.yaml @@ -0,0 +1,6 @@ +data_pipeline_oee_source_id: + +uc_oee_ds_external_id: ds_uc_oee +oee_space_name: oee_ts_space +data_pipeline_oee_client_id: ${DATA_PIPELINE_OEE_CLIENT_ID} +data_pipeline_oee_client_secret: ${DATA_PIPELINE_OEE_CLIENT_SECRET} \ No newline at end of file diff --git a/modules/bootcamp/use_cases/oee/functions/oee_timeseries/handler.py b/modules/bootcamp/use_cases/oee/functions/oee_timeseries/handler.py new file mode 100644 index 00000000..1eae5308 --- /dev/null +++ b/modules/bootcamp/use_cases/oee/functions/oee_timeseries/handler.py @@ -0,0 +1,229 @@ +from concurrent.futures import ThreadPoolExecutor +from itertools import islice +from datetime import timedelta +from typing import Any, Dict + +from cognite.client import CogniteClient +from cognite.client.data_classes.data_modeling import NodeId, ViewId +from cognite.client.data_classes.data_modeling.cdm.v1 import CogniteAsset, CogniteTimeSeries, CogniteTimeSeriesApply +from cognite.client.data_classes.filters import Prefix, ContainsAny +from cognite.client.exceptions import CogniteNotFoundError + +import numpy as np + +from cognite.client.config import global_config +global_config.disable_pypi_version_check = True + + +def batcher(iterable, batch_size): + iterator = iter(iterable) + while batch := list(islice(iterator, batch_size)): + yield batch + + +def get_time_series_for_site(client: CogniteClient, site, space): + this_site = site.lower() + sub_tree_root = client.data_modeling.instances.retrieve_nodes( + NodeId(space, this_site), + node_cls=CogniteAsset + ) + + if not sub_tree_root: + print( + f"----No CogniteAssets in CDF for {site}!----\n" + f" Run the 'Create Cognite Asset Hierarchy' transformation!" + ) + return + + sub_tree_nodes = client.data_modeling.instances.list( + instance_type=CogniteAsset, + filter=Prefix(property=["cdf_cdm", "CogniteAsset/v1", "path"], value=sub_tree_root.path), + limit=None + ) + + if not sub_tree_nodes: + print( + f"----No CogniteTimeSeries in CDF for {site}!----\n" + f" Run the 'Contextualize Timeseries and Assets' transformation!" + ) + return + + value_list = [{"space": node.space, "externalId": node.external_id} for node in sub_tree_nodes] + + time_series = [ + client.data_modeling.instances.search( + view=ViewId("cdf_cdm", "CogniteTimeSeries", "v1"), + instance_type=CogniteTimeSeries, + space=space, + filter=ContainsAny(property=["cdf_cdm", "CogniteTimeSeries/v1", "assets"], values=batch), + limit=None + ) + for batch in batcher(value_list, 20) + ] + + # Combine list of batch results into a single NodeList + time_series = [node for nodelist in time_series for node in nodelist] + + if not time_series: + print("No CogniteTimeSeries in the CogniteCore Data Model (cdf_cdm Space)") + + return time_series + +def handle(client: CogniteClient, data: Dict[str, Any] = {}) -> None: + lookback_minutes = None + sites = None + + if data: + lookback_minutes = timedelta(minutes=data.get("lookback_minutes", 60)).total_seconds() * 1000 + sites = data.get("sites") + + all_sites = [ + "Houston", + "Oslo", + "Kuala_Lumpur", + "Hannover", + "Nuremberg", + "Marseille", + "Sao_Paulo", + "Chicago", + "Rotterdam", + "London", + ] + + lookback_minutes = lookback_minutes or timedelta(minutes=60).total_seconds() * 1000 + sites = sites or all_sites + + print(f"Processing datapoints for these sites: {sites}") + with ThreadPoolExecutor(max_workers=10) as executor: + futures = [executor.submit(process_site, client, lookback_minutes, site) for site in sites] + for f in futures: + f.result() + +def process_site(client, lookback_minutes, site): + oee_space = "oee_ts_space" + source_space = "icapi_dm_space" + + timeseries = get_time_series_for_site(client, site, source_space) + asset_eids = list(set([item.external_id.split(sep=":")[0] for item in timeseries])) + instance_ids = [NodeId(space=source_space, external_id=ts.external_id) for ts in timeseries] + all_latest_dps = client.time_series.data.retrieve_latest(instance_id=instance_ids) + + # Organize latest datapoints by equipment for alignment + assets_dps = { + external_id: [latest_dp for latest_dp in all_latest_dps if external_id in latest_dp.instance_id.external_id] + for external_id in asset_eids + } + + for asset, latest_dps in assets_dps.items(): + print(f"Calculating OEE for {asset}") + count_node = f"NodeId({source_space}, {asset}:count)" + good_node = f"NodeId({source_space}, {asset}:good)" + status_node = f"NodeId({source_space}, {asset}:status)" + planned_status_node = f"NodeId({source_space}, {asset}:planned_status)" + + end = min([dp.timestamp[0] for dp in latest_dps if latest_dps and dp.timestamp], default=None) + + if end: + dps_df = client.time_series.data.retrieve_dataframe( + instance_id=[dp.instance_id for dp in latest_dps], + start=end - lookback_minutes, + end=end, + aggregates=["sum"], + granularity="1m", + include_aggregate_name=False, + limit=None + ) + + # Frontfill because "planned_status" and "status" only have datapoints when the value changes + dps_df = dps_df.ffill() + + # Fill the rest with the opposite + try: + first_valid_value = dps_df[planned_status_node].loc[dps_df[planned_status_node].first_valid_index()] + except Exception as e: + print(f"Failed to find datapoints for {planned_status_node}, {e}") + continue + + backfill_value = 1.0 if first_valid_value == 0.0 else 0.0 + dps_df[planned_status_node] = dps_df[planned_status_node].fillna(value=backfill_value) + + # Same for status + first_valid_value = dps_df[status_node].loc[dps_df[status_node].first_valid_index()] + backfill_value = 1.0 if first_valid_value == 0.0 else 0.0 + dps_df[status_node] = dps_df[status_node].fillna(value=backfill_value) + + count_dps = dps_df[count_node] + good_dps = dps_df[good_node] + status_dps = dps_df[status_node] + planned_status_dps = dps_df[planned_status_node] + + total_items = len(count_dps) + + if ( + total_items != len(good_dps) + or total_items != len(status_dps) + or total_items != len(planned_status_dps) + ): + # We expect ALL dependent timeseries to have the exact same number of datapoints + # for the specified time range for the calculation to execute. + print( + f"""{asset}: Unable to retrieve datapoints for all required OEE timeseries (count, good, status, planned_status) + between {end - lookback_minutes} and {end}. Ensure that data is available for the time range specified.""" + ) + + # Calculate the components of OEE + off_spec_node = f"{asset}:off_spec" + quality_node = f"{asset}:quality" + performance_node = f"{asset}:performance" + availability_node = f"{asset}:availability" + oee_node = f"{asset}:oee" + + dps_df[off_spec_node] = count_dps - good_dps + dps_df[quality_node] = good_dps / count_dps + dps_df[performance_node] = (count_dps / status_dps) / (60.0 / 3.0) + dps_df[availability_node] = status_dps / planned_status_dps + + dps_df[oee_node] = dps_df[quality_node] * dps_df[performance_node] * dps_df[availability_node] + + # Fill in the divide by zeros + dps_df = dps_df.fillna(value=0.0) + dps_df = dps_df.replace([np.inf, -np.inf], 0.0) + + # Drop input timeseries + dps_df = dps_df.drop(columns=[count_node, good_node, status_node, planned_status_node]) + + to_insert = [ + { + "instance_id": NodeId(space="oee_ts_space", external_id=external_id), + "datapoints": list(zip(dps_df[external_id].index, dps_df[external_id])) + } + for external_id in dps_df.columns + ] + + try: + client.time_series.data.insert_multiple(to_insert) + except CogniteNotFoundError as e: + # Create the missing oee timeseries since they don't exist + ts_to_create = [] + for node_id in e.not_found: + print(f"Creating CogniteTimeSeries {node_id}") + + external_id = node_id["instanceId"]["externalId"] + + # change external_id to a readable name + # Ex: "OSLPROFILTRASYS185:off_spec" to "OSLPROFILTRASYS185 Off Spec" + name = external_id.split(":") + name[-1] = name[-1].replace("_", " ").title() + + ts_to_create.append( + CogniteTimeSeriesApply( + space=oee_space, + external_id=external_id, + name=" ".join(name), + is_step=False, + time_series_type="numeric", + ) + ) + + client.data_modeling.instances.apply(ts_to_create) + client.time_series.data.insert_multiple(to_insert) diff --git a/modules/bootcamp/use_cases/oee/functions/oee_timeseries/requirements.txt b/modules/bootcamp/use_cases/oee/functions/oee_timeseries/requirements.txt new file mode 100644 index 00000000..a75330a0 --- /dev/null +++ b/modules/bootcamp/use_cases/oee/functions/oee_timeseries/requirements.txt @@ -0,0 +1,2 @@ +pandas +cognite-sdk \ No newline at end of file diff --git a/modules/bootcamp/use_cases/oee/module.toml b/modules/bootcamp/use_cases/oee/module.toml new file mode 100644 index 00000000..4dc7df4a --- /dev/null +++ b/modules/bootcamp/use_cases/oee/module.toml @@ -0,0 +1,5 @@ +[module] +title = "Bootcamp" +is_selected_by_default = true +id = "bootcamp_oee" +package_id = "dp:bootcamp" \ No newline at end of file From 7c2b88ab9491ac34dcdcf0701616753329f0c95f Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Fri, 27 Mar 2026 12:43:15 +0530 Subject: [PATCH 07/12] Industrial tool modules --- .../classic/root.Asset.yaml | 9 +++++++++ .../data_sets/data_sets.DataSet.yaml | 3 +++ .../default.config.yaml | 4 ++++ .../individualFilters.LocationFilter.yaml | 19 +++++++++++++++++++ .../locations/oneFilter.LocationFilter.yaml | 12 ++++++++++++ .../module.toml | 4 ++++ .../data_models/instance.Space.yaml | 2 ++ .../default.config.yaml | 2 ++ .../locations/dataModel.LocationFilter.yaml | 17 +++++++++++++++++ .../module.toml | 4 ++++ 10 files changed, 76 insertions(+) create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/classic/root.Asset.yaml create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/data_sets/data_sets.DataSet.yaml create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/default.config.yaml create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/locations/individualFilters.LocationFilter.yaml create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/locations/oneFilter.LocationFilter.yaml create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/module.toml create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/data_models/instance.Space.yaml create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/default.config.yaml create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/locations/dataModel.LocationFilter.yaml create mode 100644 modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/module.toml diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/classic/root.Asset.yaml b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/classic/root.Asset.yaml new file mode 100644 index 00000000..dc522f28 --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/classic/root.Asset.yaml @@ -0,0 +1,9 @@ +- externalId: {{ root_asset }} + name: Asset Centric Location Filter Example + description: This is an example of an asset centric location filter + dataSetExternalId: {{ ds_asset }} +- externalId: {{ root_asset2 }} + name: Asset Centric Location Filter Example 2 + description: This is an example of an asset centric location filter 2 + dataSetExternalId: {{ ds_asset }} + diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/data_sets/data_sets.DataSet.yaml b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/data_sets/data_sets.DataSet.yaml new file mode 100644 index 00000000..09e288ef --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/data_sets/data_sets.DataSet.yaml @@ -0,0 +1,3 @@ +- externalId: {{ ds_asset }} + name: LocationFilter Asset DataSet + description: This is an example of a location filter asset centric data set diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/default.config.yaml b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/default.config.yaml new file mode 100644 index 00000000..167bcd32 --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/default.config.yaml @@ -0,0 +1,4 @@ +ds_asset: ds_asset_location_filter +root_asset: my_root_asset +root_asset2: my_root_asset2 +ts_prefix: sensor diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/locations/individualFilters.LocationFilter.yaml b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/locations/individualFilters.LocationFilter.yaml new file mode 100644 index 00000000..836d251d --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/locations/individualFilters.LocationFilter.yaml @@ -0,0 +1,19 @@ +externalId: asset_centric_individual_filter_location_filter +name: Asset Centric Individual Filter Location Example +description: This is an example of an asset centric individual filter location +assetCentric: + assets: + # Typically, you would use either dataSetExternalIds, assetSubtreeIds, or externalIdPrefix + # not all of them. They are shown in this example for demonstration purposes. + dataSetExternalIds: + - '{{ ds_asset }}' + assetSubtreeIds: + - externalId: '{{ root_asset }}' + externalIdPrefix: pump_ + timeseries: + dataSetExternalIds: + - '{{ ds_asset }}' + assetSubtreeIds: + - externalId: '{{ root_asset2 }}' + externalIdPrefix: '{{ ts_prefix }}' +# events, sequences, and files are also supported. \ No newline at end of file diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/locations/oneFilter.LocationFilter.yaml b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/locations/oneFilter.LocationFilter.yaml new file mode 100644 index 00000000..107a187d --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/locations/oneFilter.LocationFilter.yaml @@ -0,0 +1,12 @@ +externalId: asset_centric_shared_location_filter +name: Asset Centric Shared Location Example +description: This is an example of an asset centric shared location +assetCentric: + # Typically, you would use either dataSetExternalIds, assetSubtreeIds, or externalIdPrefix + # not all of them. They are shown in this example for demonstration purposes. + dataSetExternalIds: + - '{{ ds_asset }}' + assetSubtreeIds: + - externalId: '{{ root_asset }}' + - externalId: '{{ root_asset2 }}' + externalIdPrefix: pump_ diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/module.toml b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/module.toml new file mode 100644 index 00000000..fd23807f --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/module.toml @@ -0,0 +1,4 @@ +[module] +title = "Example location filter asset centric" +id = "CDF Location Filter Asset Centric" +package_id = "dp:accelerators" \ No newline at end of file diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/data_models/instance.Space.yaml b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/data_models/instance.Space.yaml new file mode 100644 index 00000000..9a264494 --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/data_models/instance.Space.yaml @@ -0,0 +1,2 @@ +- space: {{ instance_space1 }} +- space: {{ instance_space2 }} diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/default.config.yaml b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/default.config.yaml new file mode 100644 index 00000000..d9206305 --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/default.config.yaml @@ -0,0 +1,2 @@ +instance_space1: my_instance_space1 +instance_space2: my_instance_space2 diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/locations/dataModel.LocationFilter.yaml b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/locations/dataModel.LocationFilter.yaml new file mode 100644 index 00000000..6fac3abe --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/locations/dataModel.LocationFilter.yaml @@ -0,0 +1,17 @@ +externalId: view_based_location_filter +name: Data Model Based Location Filter Example +description: This is an example of a data model based location filter +dataModels: + - externalId: CogniteProcessIndustries + space: cdf_idm + version: v1 +instanceSpaces: + - {{ instance_space1 }} + - {{ instance_space2 }} +# If you have your own data model, with your own views, you can +# specify what the views are representing. This is used by Cognite Applications. +#views: +# - externalId: CogniteAsset +# space: cdf_cdm +# version: v1 +# representsEntity: ASSET # Can be MAINTENANCE_ORDER, OPERATION, NOTIFICATION, ASSET \ No newline at end of file diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/module.toml b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/module.toml new file mode 100644 index 00000000..06d57a46 --- /dev/null +++ b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/module.toml @@ -0,0 +1,4 @@ +[module] +title = "Example location filter datamodel based" +id = "cdf_location_filter_datamodel_based" +package_id = "dp:accelerators" \ No newline at end of file From 493cef17a36a55e8cc382c3d067461cadfb00d80 Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Fri, 27 Mar 2026 12:44:56 +0530 Subject: [PATCH 08/12] Modules for InRobot --- modules/accelerators/inrobot/README.md | 41 ++ .../inrobot/cdf_inrobot_common/README.md | 53 +++ .../auth/run-function-user.Group.yaml | 89 ++++ .../classic/robot.Label.yaml | 6 + .../data_models/cogniteAppData.space.yaml | 3 + .../data_models/inrobotApmConfig.node.yaml | 17 + .../data_sets/robot_1.dataset.yaml | 2 + .../cdf_inrobot_common/default.config.yaml | 3 + .../cdf_inrobot_common/functions/.gitkeep | 0 .../fn_contextualize_robot_data/README.md | 30 ++ .../fn_contextualize_robot_data/__init__.py | 1 + .../common/README.md | 58 +++ .../common/__init__.py | 0 .../common/apm_helpers.py | 269 ++++++++++++ .../common/cdf_helpers.py | 112 +++++ .../common/dataclass/__init__.py | 0 .../common/dataclass/common.py | 16 + .../common/dataclass/vision.py | 66 +++ .../common/utils.py | 17 + .../fn_contextualize_robot_data/handler.py | 269 ++++++++++++ .../requirements.txt | 22 + .../functions/fn_gauge_reading/README.md | 56 +++ .../functions/fn_gauge_reading/__init__.py | 1 + .../fn_gauge_reading/common/README.md | 58 +++ .../fn_gauge_reading/common/__init__.py | 0 .../fn_gauge_reading/common/apm_helpers.py | 269 ++++++++++++ .../fn_gauge_reading/common/cdf_helpers.py | 112 +++++ .../common/dataclass/__init__.py | 0 .../common/dataclass/common.py | 16 + .../common/dataclass/vision.py | 66 +++ .../fn_gauge_reading/common/utils.py | 17 + .../functions/fn_gauge_reading/handler.py | 396 ++++++++++++++++++ .../fn_gauge_reading/requirements.txt | 22 + .../fn_get_ir_data_from_ir_raw/README.md | 18 + .../fn_get_ir_data_from_ir_raw/__init__.py | 1 + .../common/README.md | 58 +++ .../common/__init__.py | 0 .../common/apm_helpers.py | 269 ++++++++++++ .../common/cdf_helpers.py | 112 +++++ .../common/dataclass/__init__.py | 0 .../common/dataclass/common.py | 16 + .../common/dataclass/vision.py | 66 +++ .../common/utils.py | 17 + .../fn_get_ir_data_from_ir_raw/handler.py | 195 +++++++++ .../requirements.txt | 23 + .../functions/fn_threesixty/README.md | 14 + .../functions/fn_threesixty/__init__.py | 1 + .../cognite_threesixty_images.py | 284 +++++++++++++ .../functions/fn_threesixty/handler.py | 257 ++++++++++++ .../functions/fn_threesixty/requirements.txt | 7 + .../functions/robots.functions.Function.yaml | 51 +++ .../functions/schedules.Schedule.yaml | 94 +++++ .../inrobot/cdf_inrobot_common/module.toml | 5 + .../acoustic_video.RobotCapability.yaml | 72 ++++ ...process_threesixty.DataPostProcessing.yaml | 23 + .../robotics/pt_ir_video.RobotCapability.yaml | 64 +++ .../robotics/ptz.RobotCapability.yaml | 63 +++ .../robotics/ptz_ir.RobotCapability.yaml | 80 ++++ .../robotics/ptz_video.RobotCapability.yaml | 68 +++ .../read_dial_gauge.DataPostProcessing.yaml | 31 ++ ...read_digital_gauge.DataPostProcessing.yaml | 35 ++ .../read_level_gauge.DataPostProcessing.yaml | 29 ++ .../read_valve.DataPostProcessing.yaml | 23 + .../robotics/threesixty.RobotCapability.yaml | 47 +++ .../threesixty_video.RobotCapability.yaml | 47 +++ .../inrobot/cdf_inrobot_location/README.md | 33 ++ .../auth/inrobot-admin.Group.yaml | 107 +++++ .../auth/inrobot-users.Group.yaml | 94 +++++ .../auth/robot-1.Group.yaml | 77 ++++ .../data_models/locationAppData.space.yaml | 3 + .../data_models/locationSourceData.space.yaml | 3 + .../cdf_inrobot_location/default.config.yaml | 7 + .../inrobot/cdf_inrobot_location/module.toml | 5 + .../robotics/root.Frame.yaml | 15 + .../robotics/root.Location.yaml | 3 + .../robotics/root.Map.yaml | 10 + 76 files changed, 4514 insertions(+) create mode 100644 modules/accelerators/inrobot/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/auth/run-function-user.Group.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/classic/robot.Label.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/data_models/cogniteAppData.space.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/data_models/inrobotApmConfig.node.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/data_sets/robot_1.dataset.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/default.config.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/.gitkeep create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/apm_helpers.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/cdf_helpers.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/common.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/vision.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/utils.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/handler.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/requirements.txt create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/apm_helpers.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/cdf_helpers.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/common.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/vision.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/utils.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/handler.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/requirements.txt create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/apm_helpers.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/cdf_helpers.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/common.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/vision.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/utils.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/handler.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/requirements.txt create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/__init__.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/cognite_threesixty_images.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/handler.py create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/requirements.txt create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/robots.functions.Function.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/functions/schedules.Schedule.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/module.toml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/acoustic_video.RobotCapability.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/process_threesixty.DataPostProcessing.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/pt_ir_video.RobotCapability.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz.RobotCapability.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz_ir.RobotCapability.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz_video.RobotCapability.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_dial_gauge.DataPostProcessing.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_digital_gauge.DataPostProcessing.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_level_gauge.DataPostProcessing.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_valve.DataPostProcessing.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/threesixty.RobotCapability.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_common/robotics/threesixty_video.RobotCapability.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/README.md create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/auth/inrobot-admin.Group.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/auth/inrobot-users.Group.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/auth/robot-1.Group.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/data_models/locationAppData.space.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/data_models/locationSourceData.space.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/default.config.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/module.toml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Frame.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Location.yaml create mode 100644 modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Map.yaml diff --git a/modules/accelerators/inrobot/README.md b/modules/accelerators/inrobot/README.md new file mode 100644 index 00000000..692251c1 --- /dev/null +++ b/modules/accelerators/inrobot/README.md @@ -0,0 +1,41 @@ +# InRobot Module + +This module allows you to quickly set up an InRobot project. There are a few pre-requisites: + +- You must have an asset heirarchy already set up. Specifically you will need the external id of the root asset for + your location. +- You must have a 3D model already uploaded in Fusion. Note its model id, its revision id, and its name. +- You must have created 4 groups in your source system: Users*, Admin*, Robot*1*, + Run_Function_User. The naming does not matter specifically, but you may need to add more locations and/or robots in + the future, so it would be ideal to name the groups accordingly. +- You must have created an app registration for the robot, and added the app registration to the robot user group. Note + the client id and the secret for the robot app registration. +- You must have already activated the functions service for your project. This can be done in Fusion, and can take up + to 2 hours to become activated. + +This module is meant to be used in conjunction with the toolkit common module and the cdf_apm_base module. + +For now, until the next version release of toolkit, you must also enable the following toolkit feature flags: + +cdf features set fun-schedule --enable +cdf features set robotics --enable + +## Configuration Variables + +Specific inrobot variables you will need to define in your config YAML file: + +| Variable Name | Description | +|-------------------------------------------|------------------------------------------------------------------------------------------------------------------------------| +| `first_root_asset_external_id` | This is the asset external ID for your root asset. | +| `first_location` | A human readable name that will be included as part of different location-specific spaces and groups. | +| `inrobot_admin_first_location_source_id` | The ID for the admin group for the location. | +| `inrobot_users_first_location_source_id` | The ID for the users group for the location. | +| `robot_1_first_location_source_id` | The ID for the robot group for the location. | +| `run_function_user_group_source_id` | The ID for the run function group. | +| `run_function_client_id` | The run function client ID (app registration in Azure). | +| `run_function_secret` | The secret for the run function app registration. This will be stored in your env file and should be referenced securely. | +| `robot_1_dataset_ext_id` | This is the data set for your robot. You can give this whatever value you want. | +| `three_d_model_name` | The name of the 3D model as named in Fusion. | +| `three_d_type` | The type of 3D model. This will be either `THREEDMODEL` or `POINTCLOUD`. | +| `three_d_model_id` | The model ID of your 3D model. | +| `three_d_revision_id` | The revision ID of your 3D model. | diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/README.md b/modules/accelerators/inrobot/cdf_inrobot_common/README.md new file mode 100644 index 00000000..4b60de22 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/README.md @@ -0,0 +1,53 @@ +# cdf_inrobot_common + +This module contains shared configurations across multiple locations for InRobot. + +## Auth + +The module creates one group that needs one matching group in the identity provider that the CDF +project is configured with. The group is: + +- Run Function User. This role is used by our functions when they need to interact with CDF, for example, to add + annotations to images, to create timeseries, etc. This makes reference to the robot's data set, so each new robot + requires a new run function user. + +## Data models + +There is one space created in this module called cognite_app_data. This is the space where user and user profile +data is stored. We also populate the APM_Config node with our default config, including the information about the +location. If new locations are added, this node must be updated to include the new locations. + +## Data sets + +This module creates a new data set for the robot. All the robot data in CDF will be stored in this data set. The +external id is specified in the config.yaml file, and this data_set is referred to in many other modules. Any new +robots must have a new data set. + +## Functions + +This module contains four (4) functions that we deploy: Contextualize Robot Data, Gauge Reading, Get IR Data from +IR Raw, and ThreeSixty. These are functions that run every minute on files with certain labels that +the robot uploads to CDF. + +Because the function itself must be stored in a dataset and we use the dataset of the robot, a new function must be +defined for each robot in the robots.functions.yaml file. Additionally, most schedules use the robot data set id as a +data parameters - this means that a new schedule must be created for every new robot. + +## Labels + +This module creates two labels that are needed for InRobot to work: robot_gauge and read_ir. These are scoped to +the robot's data set. This means that new labels must be created for each additional robot. + +## Robotics + +This module creates some robotics specific resources: RobotCapability and DataPostProcessing. + +Currently we support the following RobotCapability resources: acoustic_video, pt_ir_video, ptz_ir, ptz_video, +ptz, threesixty, and threesixty_video. + +Currently we support the following DataPostProcessing resources: +process_threesixty, read_dial_gauge, read_digital_gauge, read_level_gauge, read_valve. + +If there are any of these robot capabilities you do not want, you can remove the YAML file. Note that the +process_threesixty data post processing requires the threesixty capability to be present. Similarly, +the various gauge data post processing options require the ptz robot capability. diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/auth/run-function-user.Group.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/auth/run-function-user.Group.yaml new file mode 100644 index 00000000..9bdd694e --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/auth/run-function-user.Group.yaml @@ -0,0 +1,89 @@ +name: "gp_Run_Function_User" +sourceId: "{{run_function_user_group_source_id}}" +metadata: + origin: "cdf-project-templates" +capabilities: + - datasetsAcl: + actions: + - READ + scope: + all: {} + - groupsAcl: + actions: + - LIST + scope: + all: {} + - sessionsAcl: + actions: + - CREATE + - LIST + scope: + all: {} + - projectsAcl: + actions: + - LIST + scope: + all: {} + - functionsAcl: + actions: + - READ + - WRITE + scope: + all: {} + - labelsAcl: + actions: + - READ + - WRITE + scope: + all: {} + - assetsAcl: + actions: + - READ + scope: + all: {} + - timeSeriesAcl: + actions: + - READ + - WRITE + scope: + all: {} + - filesAcl: + actions: + - READ + - WRITE + scope: + all: {} + - visionModelAcl: + actions: + - READ + scope: + all: {} + - dataModelsAcl: + actions: + - READ + scope: + all: {} + - dataModelInstancesAcl: + actions: + - READ + - WRITE + scope: + all: {} + - eventsAcl: + actions: + - READ + - WRITE + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - roboticsAcl: + actions: + - READ + scope: + all: {} + - annotationsAcl: + actions: + - WRITE + scope: + all: {} diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/classic/robot.Label.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/classic/robot.Label.yaml new file mode 100644 index 00000000..a09b116d --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/classic/robot.Label.yaml @@ -0,0 +1,6 @@ +- name: robot_gauge + externalId: robot_gauge + dataSetExternalId: "{{ robot_1_dataset_ext_id }}" +- name: read_ir + externalId: read_ir + dataSetExternalId: "{{ robot_1_dataset_ext_id }}" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/data_models/cogniteAppData.space.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/data_models/cogniteAppData.space.yaml new file mode 100644 index 00000000..5534ace2 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/data_models/cogniteAppData.space.yaml @@ -0,0 +1,3 @@ +space: cognite_app_data +name: cognite_app_data +description: Space for User and User Preferences Data diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/data_models/inrobotApmConfig.node.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/data_models/inrobotApmConfig.node.yaml new file mode 100644 index 00000000..9859ce77 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/data_models/inrobotApmConfig.node.yaml @@ -0,0 +1,17 @@ +- space: "APM_Config" + externalId: "default-config" + sources: + - source: + space: APM_Config + externalId: APM_Config + version: "1" + type: view + properties: + featureConfiguration: + rootLocationConfigurations: + - assetExternalId: "{{ first_root_asset_external_id }}" + appDataInstanceSpace: sp_{{ first_location }}_app_data + sourceDataInstanceSpace: sp_{{ first_location }}_source_data + customerDataSpaceId: APM_SourceData + customerDataSpaceVersion: "1" + name: InRobot APM App Config diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/data_sets/robot_1.dataset.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/data_sets/robot_1.dataset.yaml new file mode 100644 index 00000000..3c69b050 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/data_sets/robot_1.dataset.yaml @@ -0,0 +1,2 @@ +- externalId: "{{ robot_1_dataset_ext_id }}" + name: "Robot 1 Dataset" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/default.config.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/default.config.yaml new file mode 100644 index 00000000..ac70e621 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/default.config.yaml @@ -0,0 +1,3 @@ +run_function_user_group_source_id: +run_function_client_id: +run_function_secret: diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/.gitkeep b/modules/accelerators/inrobot/cdf_inrobot_common/functions/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/README.md b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/README.md new file mode 100644 index 00000000..bb8b7add --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/README.md @@ -0,0 +1,30 @@ +# Contextualize robot files + +Function for contextualizing files that are uploaded from a robot to CDF. The function connects the file to +the correct asset, and connects the correct time series to the file. If no time series exist, they are created. +The function also assigns the correct action label to the file, indicating what action should be taken on the file, +e.g., read dial gauge, read valve. + +List all files with metadata field `{"processed":"false"}` in input data set. If the image has an asset id in the +"asset_id" metadata field, check that the asset exists and add that as "assetId" to the file. + +If the image is a gauge reading image, check if the asset has a time series with label "GAUGE_TIME_SERIES". If it does, +add metadata field "ts_external_id" to the image. +If not, create the timeseries. + +In this case we could write metadata to the time series if we are able to read it in the gauge reader service. So the +gauge reader would check if the TS has metadata or the file has metadata. + +1. If the TS has metadata, use ts metadata. +2. If the TS does not have metadata and the file has metadata, use file metadata and write that metadata to TS. +3. If the TS does not have metadata and the file does not have metadata complete metadata, use incomplete metadata set +4. and read remainig metadata and write metadata to TS if successful + +(Assume always complete or no metadata on timeseries) + +With this we could instruct the user to take a very close and good picture of the gauge initially and that would work +in some cases. Optionally, the user could take en image of the gauge, add correct metadata in the vision app and +that metadata will be written to the timeseries. + +It will not be easy to change the metadata if we read wrong metadata initially. An option could be to not not write +metadata to timeseries in case 3 (when metadata is read from image). diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/__init__.py new file mode 100644 index 00000000..eee45ff1 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/__init__.py @@ -0,0 +1 @@ +"""Contextualize robot data.""" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/README.md b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/README.md new file mode 100644 index 00000000..f44fc406 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/README.md @@ -0,0 +1,58 @@ +# Shared-code folder: `common` + +## TL;DR + +> This entire folder hierarchy of `common` is copied into all functions automatically. + +## No, I wan't to read the long story + +A common use case when you deal with the deployment of multiple functions simultaneously, is that you do not want to +replicate shared code between all the function folders. In order to accomodate this, as part of the workflow +`function-action` this template relies on, we copy all the contents in this folder (can be specified by `common_folder` +in the workflow files, see below) the functions we upload to Cognite Functions. If this is not specified, we check if +`common/` exists in the root folder and if so, _**we use it automatically**_ :rocket: + +### Handling imports + +A typical setup looks like this: + +```bash +├── common +│ └── utils.py +└── my_function + └── handler.py +``` + +The code we zip and send off to the FilesAPI will look like this: + +```bash +├── common +│ └── utils.py +└── handler.py +``` + +This means your `handler.py`-file should do imports from `common/utils.py` like this: + +```python +from common.utils import my_helper1, my_helper2 +import common.utils as utils # alternative +``` + +## No, I want `common` to be named `snowflake_utilities` + +No problem mate, locate `.github/workflow` and open the following files: + +- `deploy-pr.yaml` +- `deploy-push.yaml` + +Then, in each file, scroll down until you see: + +```yaml + +- name: Deploy and schedule ${{ matrix.function }} + uses: cognitedata/function-action@v2 + with: + function_name: ... + common_folder: snowflake_utilities # <-- add it here + ... +``` diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/apm_helpers.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/apm_helpers.py new file mode 100644 index 00000000..620abc88 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/apm_helpers.py @@ -0,0 +1,269 @@ +from __future__ import annotations + +import json +import logging +from datetime import datetime +from typing import Any, Optional + +import pytz # type: ignore +from cognite.client import CogniteClient +from common.dataclass.common import Vec3f + +logger = logging.getLogger(__name__) + + +def create_apm_observation_from_reading( + client: CogniteClient, + file_external_id: str, + timeseries_external_id: str, + value: float, + timestamp: int, + pose: Vec3f, + message: str, + apm_checklistitem_external_id: Optional[str] = None, +): + """Create an APM observation from a gauge reading. + + NOTE: this is a preliminary implementation, where we're not yet using the + gql pygen SDK made by Cognite (which will make this a lot cleaner) + + """ + apm_config = _get_apm_config(client=client, config_external_id="inrobot") + if apm_config is None: + logger.error("Could not find APM config") + return + + space_id = str(apm_config.get("appDataSpaceId")) + appdata_space_version = str(apm_config.get("appDataSpaceVersion")) + + views = _get_views( + client=client, + space=space_id, + datamodel_id=space_id, + datamodel_version=appdata_space_version, + view_ids=["APM_Measurement", "Vec3f", "APM_Observation"], + ) + + def _get_view_version(views: list[dict[str, Any]], view_id: str) -> Optional[str]: + view = next((item for item in views if item["externalId"] == view_id), None) + if view is None: + raise ValueError(f"Could not find view {view_id}") + return view.get("version") + + # create the APM measurement + if isinstance(timestamp, int): + timestamp_s = round(timestamp / 1000) + timestamp_dt = datetime.fromtimestamp(float(timestamp_s), pytz.UTC) + elif isinstance(timestamp, datetime): + timestamp_dt = timestamp + else: + raise ValueError(f"Timestamp is of type {type(timestamp)}, needs to be either `int` or `datetime`.") + + apm_measurement_external_id = f"measurement_{timeseries_external_id}_{timestamp}" + apm_measurement = { + "timeSeries": timeseries_external_id, + "measuredAt": timestamp_dt.isoformat(), + "numericValue": value, + } + + vec3f_external_id = f"position_{timeseries_external_id}_{timestamp}" + vec3f = {"x": pose.x, "y": pose.y, "z": pose.z} + + apm_observation_external_id = f"observation_{timeseries_external_id}_{timestamp}" + apm_observation = { + "fileIds": [file_external_id], + "position": {"externalId": vec3f_external_id, "space": space_id}, + "description": "Gauge reading", + "note": message, + "createdById": "CDF Gauge Reader Function", + "updatedById": "CDF Gauge Reader Function", + } + + # edge apm_observation -> apm_measurement + edge_apm_observation_apm_measurement = { + "instanceType": "edge", + "space": space_id, + "externalId": f"{apm_observation_external_id}.measurements_{apm_measurement_external_id}", + "startNode": {"externalId": apm_observation_external_id, "space": space_id}, + "endNode": {"externalId": apm_measurement_external_id, "space": space_id}, + "type": {"externalId": "APM_Observation.measurements", "space": space_id}, + } + + # assemble all instances (nodes and edges) + instances = [ + { + "instanceType": "node", + "space": space_id, + "externalId": apm_measurement_external_id, + "sources": [ + { + "source": { + "type": "view", + "space": space_id, + "externalId": "APM_Measurement", + "version": _get_view_version(views, "APM_Measurement"), + }, + "properties": apm_measurement, + } + ], + }, + { + "instanceType": "node", + "space": space_id, + "externalId": vec3f_external_id, + "sources": [ + { + "source": { + "type": "view", + "space": space_id, + "externalId": "Vec3f", + "version": _get_view_version(views, "Vec3f"), + }, + "properties": vec3f, + } + ], + }, + { + "instanceType": "node", + "space": space_id, + "externalId": apm_observation_external_id, + "sources": [ + { + "source": { + "type": "view", + "space": space_id, + "externalId": "APM_Observation", + "version": _get_view_version(views, "APM_Observation"), + }, + "properties": apm_observation, + } + ], + }, + edge_apm_observation_apm_measurement, + ] + + if apm_checklistitem_external_id is not None: + edge_apm_checklist_apm_observation = { + "instanceType": "edge", + "space": space_id, + "externalId": f"{apm_checklistitem_external_id}.observations_{apm_observation_external_id}", + "startNode": {"externalId": apm_checklistitem_external_id, "space": space_id}, + "endNode": {"externalId": apm_observation_external_id, "space": space_id}, + "type": {"externalId": "APM_ChecklistItem.observations", "space": space_id}, + } + instances.append(edge_apm_checklist_apm_observation) + + logger.debug(f"Creating instances request: {json.dumps(instances, indent=2)}") + + response = client.post( + f"/api/v1/projects/{client.config.project}/models/instances", json={"items": instances} + ).json() + + logger.debug(f"Creating instances response: {json.dumps(response, indent=2)}") + + +def _get_views( + client: CogniteClient, space: str, datamodel_id: str, datamodel_version: Optional[str] = None, view_ids=list[str] +) -> list[dict[str, Any]]: + response = client.post( + f"/api/v1/projects/{client.config.project}/models/datamodels/byids", + json={ + "items": [{"space": space, "externalId": datamodel_id, "version": datamodel_version}], + }, + ).json() + + # get latest datamodel, if no version is specified + datamodel = max(response["items"], key=lambda item: item["createdTime"], default=None) + if datamodel is None: + raise ValueError(f"No datamodels with id {datamodel_id} found with version {datamodel_version}.") + + views = datamodel.get("views") + if views is None or views == []: + raise ValueError(f"Datamodel {datamodel_id} has no views.") + + available_views = {view.get("externalId"): view.get("version") for view in views} + + items = [ + {"space": space, "externalId": requested_view_id, "version": available_views.get(requested_view_id)} + for requested_view_id in view_ids + if available_views.get(requested_view_id) is not None + ] + + if len(items) != len(view_ids): + missing_views = set(view_ids) - set([item["externalId"] for item in items]) + raise ValueError(f"Views {', '.join(missing_views)} not found in datamodel {datamodel_id}.") + + views = client.post( + f"/api/v1/projects/{client.config.project}/models/views/byids", + json={ + "items": items, + }, + ).json() + + return views["items"] + + +def _get_apm_config(client: CogniteClient, config_external_id: str) -> Optional[dict[str, Any]]: + space = "APM_Config" + datamodel_id = "APM_Config" + view_id = "APM_Config" + instance_external_ids = [config_external_id, "default-config"] + + views = _get_views(client=client, space=space, datamodel_id=datamodel_id, view_ids=[view_id]) + + if len(views) != 1: + raise ValueError(f"Expected to find exactly one view for {view_id}, found {len(views)}.") + + view = views[0] + + response = client.post( + f"/api/v1/projects/{client.config.project}/models/instances/byids", + json={ + "items": [ + {"instanceType": "node", "externalId": external_id, "space": space} + for external_id in instance_external_ids + ], + "sources": [ + { + "source": { + "type": "view", + "space": space, + "externalId": view.get("externalId"), + "version": view.get("version"), + } + } + ], + }, + ).json() + + if response.get("items") == []: + logger.error("Could not find APM config, not upserting any APM_Observations now.") + return None + + # Try to find the first item with "externalId" == config_external_id + apm_config = next((item for item in response["items"] if item["externalId"] == config_external_id), None) + + # If no such item is found, try to find the first item with "externalId" == "default" + if apm_config is None: + apm_config = next((item for item in response["items"] if item["externalId"] == "default-config"), None) + if apm_config is None: + raise ValueError(f"Could not find APM config with externalId {config_external_id} or `default-config`.") + + apm_config = apm_config.get("properties").get(space).get(f"{view.get('externalId')}/{view.get('version')}") + + return apm_config + + +def _get_position_from_metadata_to_vec3f(metadata: dict[str, Any]) -> Vec3f: + """Get position from metadata.""" + x = metadata.get("waypoint_tform_body_x") + y = metadata.get("waypoint_tform_body_x") + z = metadata.get("waypoint_tform_body_x") + + if not x or not y or not z: + raise ValueError( + f"Missing metadata field. Required metadata fields \ + are waypoint_tform_body_x, waypoint_tform_body_x, waypoint_tform_body_x. File metadata keys: {metadata.keys()}" + ) + + return Vec3f(x=float(x), y=float(y), z=float(z)) diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/cdf_helpers.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/cdf_helpers.py new file mode 100644 index 00000000..d9cfa076 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/cdf_helpers.py @@ -0,0 +1,112 @@ +from __future__ import annotations + +import logging +import time +from typing import Any, Optional + +from cognite.client import CogniteClient +from cognite.client.data_classes import Annotation, LabelDefinition + +logger = logging.getLogger(__name__) + + +def call_vision_api_endpoint( + client: CogniteClient, + url: str, + input_data: dict, + max_get_job_attempts: int = 20, + headers: Optional[dict[str, Any]] = None, +): + """Post to an API endpoint, wait for response and return response.""" + # TODO: Use this function in people detector function (https://cognitedata.atlassian.net/browse/DMVP-855) + res = client.post(url=url, json=input_data, headers=headers).json() + + job_id = res.get("jobId") + for i in range(max_get_job_attempts): + logger.info(f"Attempt nr. {i} to get job status.") + res = client.get(url=f"{url}/{job_id}").json() + if res.get("status") in ["Queued", "Running"]: + logger.info(f"API job status: {res.get('status')}") + time.sleep(10) + elif res.get("status") == "Completed": + logger.info("API job completed") + break + else: # Use for/else in case of failed job or timeout + logger.info(f"API job failed or timed out: {res}") + return None + + return res + + +def create_missing_labels(client: CogniteClient, label_ids: list[str]): + """Create missing labels from a list of label IDs.""" + for label_id in label_ids: + if not check_label_exists(client, label_id): + client.labels.create([LabelDefinition(external_id=label_id, name=label_id)]) + + +def check_label_exists(client: CogniteClient, label_id: str): + """Check if a label exists in CDF given its external_id (label_id).""" + labels = client.labels.list(external_id_prefix=label_id) + return any(label.external_id == label_id for label in labels) + + +def create_annotations( + client: CogniteClient, + gauge_reading_result: dict, + file_id: int, + gauge_type: str, + bounding_box_label: str, + keypoint_label: str, +): + annotations = gauge_reading_result["items"][0]["predictions"][gauge_type + "GaugePredictions"] + annotations_list = [] + + for annotation in annotations: + print(f"ANNOTATION TYPE: {annotation}") + if gauge_type == "digital": + bounding_box = annotation["boundingBox"] + else: + keypoints = annotation["keypointCollection"]["keypoints"] + bounding_box = annotation["objectDetection"]["boundingBox"] + # Create bounding box annotation + bounding_box_annotation = Annotation( + annotation_type="images.ObjectDetection", + status="suggested", + creating_user="cognite-functions", + creating_app="sdk", + creating_app_version="4.5.2", + annotated_resource_type="file", + annotated_resource_id=file_id, + data={ + "label": bounding_box_label, + "boundingBox": bounding_box, + }, + ) + annotations_list.append(bounding_box_annotation) + + if gauge_type in ["level", "dial"]: + # Create keypoint annotation + keypoint_names = list(keypoints.keys()) + keypoint_data = {} + for i in range(len(keypoint_names)): + keypoint_name = keypoint_names[i] + print(keypoint_name) + point = keypoints[keypoint_name]["point"] + print(point) + keypoint_data[keypoint_name] = {"point": point} + print(keypoint_data) + + keypoint_annotation = Annotation( + annotation_type="images.KeypointCollection", + status="suggested", + creating_user="cognite-functions", + creating_app="sdk", + creating_app_version="4.5.2", + annotated_resource_type="file", + annotated_resource_id=file_id, + data={"label": keypoint_label, "keypoints": keypoint_data}, + ) + annotations_list.append(keypoint_annotation) + + client.annotations.create(annotations_list) diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/common.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/common.py new file mode 100644 index 00000000..b07197dc --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/common.py @@ -0,0 +1,16 @@ +from dataclasses import asdict, dataclass + + +@dataclass +class Dataclass: + def to_dict(self, ignore_none=False): + if ignore_none: + return asdict(self, dict_factory=lambda x: {k: v for (k, v) in x if v}) + return asdict(self) + + +@dataclass +class Vec3f(Dataclass): + x: float + y: float + z: float diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/vision.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/vision.py new file mode 100644 index 00000000..570d0a2d --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/dataclass/vision.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Optional + +from common.dataclass.common import Dataclass + + +@dataclass +class File(Dataclass): + fileId: int + fileExternalId: Optional[str] = None + + +@dataclass +class RequestCustomModelPrediction(Dataclass): + items: list[File] + modelFile: File + threshold: float + + +@dataclass +class Vertex(Dataclass): + x: float + y: float + + +@dataclass +class Region(Dataclass): + shape: str # points, rectangle, polyline, polygon + vertices: list[Vertex] + + +@dataclass +class VisionAnnotation(Dataclass): + text: str + confidence: Optional[float] = None + region: Optional[Region] = None + + +@dataclass +class Item(Dataclass): + fileId: int + annotations: Optional[list[VisionAnnotation]] = None + fileExternalId: Optional[str] = None + width: Optional[float] = None + height: Optional[float] = None + + +@dataclass +class FailedBatchSchema(Dataclass): + errorMessage: Optional[str] = None + items: Optional[list[File]] = None + + +@dataclass +class ResponseCustomModelPrediction(Dataclass): + status: str # "Queued" "Running" "Completed" "Failed" + createdTime: int + startTime: int + statusTime: int + jobId: int + items: list[Item] + modelFile: File + threshold: Optional[float] = None + failedItems: Optional[list[FailedBatchSchema]] = None diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/utils.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/utils.py new file mode 100644 index 00000000..c3ce1ce9 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/common/utils.py @@ -0,0 +1,17 @@ +import io + +from PIL import Image + + +def batch(iterable, n=1): + """Batch iterable.""" + len_iterable = len(iterable) + for ndx in range(0, len_iterable, n): + yield iterable[ndx : min(ndx + n, len_iterable)] + + +def image_to_byte_array(image: Image) -> bytes: + """Convert PIL image to byte array.""" + img_byte_arr = io.BytesIO() + image.save(img_byte_arr, format=image.format) + return img_byte_arr.getvalue() diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/handler.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/handler.py new file mode 100644 index 00000000..ce69385b --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/handler.py @@ -0,0 +1,269 @@ +"""Contextualize handler.""" + +import logging +import sys + +from cognite.client.data_classes import FileMetadataUpdate, TimeSeries +from common.cdf_helpers import create_missing_labels + +MAX_GET_JOB_ATTEMPTS = 10 +logger = logging.getLogger(__name__) + + +def get_time_series_label(camera_type): + if camera_type == "ir": + time_series_label = "IR_TIME_SERIES" + else: + time_series_label = "ANALOG_GAUGE_TIME_SERIES" + return time_series_label + + +def has_label(label_list, label_external_id): + """Check if the label_external_id is in a list of labels.""" + for label in label_list: + if label.external_id == label_external_id: + return True + return False + + +def create_timeseries( + client, + asset, + data_set_external_id, + time_series_label, + gauge_number=1, + total_number_of_gauges=1, + time_series_naming_tag="", +): + """Create time series on the correct format.""" + if time_series_label == "IR_TIME_SERIES": + ts_external_id = ( + f"{time_series_label}_{asset.external_id}_{time_series_naming_tag}" + if asset.external_id is not None + else f"{asset.id}_{time_series_label}_{time_series_naming_tag}" + ) + ts_name = f"{asset.name}_ir_{time_series_naming_tag}" + + elif gauge_number <= 1 and total_number_of_gauges <= 1: + ts_external_id = ( + f"{time_series_label}_{asset.external_id}_0" + if asset.external_id is not None + else f"{asset.id}_{time_series_label}_0" + ) + ts_name = f"{asset.name}_gauge_values" + else: + ts_external_id = ( + f"{time_series_label}_{asset.external_id}_{gauge_number}" + if asset.external_id is not None + else f"{asset.id}_{time_series_label}_{gauge_number}" + ) + ts_name = f"{asset.name}_gauge_values_{gauge_number}" + + logger.info(f"Creates timeseries with name: {ts_name}") + data_set_id = client.data_sets.retrieve(external_id=data_set_external_id).id + return client.time_series.create( + TimeSeries( + metadata={"TYPE": time_series_label}, + asset_id=asset.id, + external_id=ts_external_id, + data_set_id=data_set_id, + name=ts_name, + ) + ) + + +def get_asset(client, file): + """Get asset from metadata field.""" + if file.metadata.get("asset_id") not in [None, "0", "None"]: + try: + asset_id = int(file.metadata["asset_id"]) + asset = client.assets.retrieve(asset_id) + except Exception as e: + logger.exception(e) + return None + return asset + + +def get_timeseries_external_id(client, asset, data_set_external_id, time_series_label, number_of_gauges=1): + """Get time series external id.""" + ts = client.time_series.list(metadata={"TYPE": time_series_label}, asset_ids=[asset.id]) + number_of_timeseries = len(ts) + ts_external_ids = [] + logger.info(f"{ts}") + + # Create one timeseries for min temperature and one for max temperature for IR images + if time_series_label == "IR_TIME_SERIES": + if number_of_timeseries == 0: + print("CREATE IR TIMESERIES") + ir_ts_naming_tags = ["min", "max"] + for naming_tag in ir_ts_naming_tags: + ts = create_timeseries( + client, + asset, + data_set_external_id, + time_series_label, + time_series_naming_tag=naming_tag, + ) + ts_external_ids.append(ts.external_id) + else: + ts_external_ids = [ts[i].external_id for i in range(number_of_timeseries)] + + # Logic for creating gauge timeseries + elif number_of_timeseries >= 1 and number_of_gauges == number_of_timeseries: + ts_external_ids = [ts[i].external_id for i in range(number_of_timeseries)] + elif number_of_timeseries >= 1 and number_of_gauges > number_of_timeseries: + ts_external_ids.append(ts[0].external_id) + diff = number_of_gauges - number_of_timeseries + for gauge_number in range(diff): + logger.info("CREATE GAUGE TIMESERIES") + new_gauge_number = gauge_number + number_of_timeseries + ts = create_timeseries( + client, asset, data_set_external_id, time_series_label, new_gauge_number, number_of_gauges + ) + ts_external_ids.append(ts.external_id) + elif number_of_timeseries == 0: + logger.info("CREATE GAUGE TIMESERIES") + if number_of_gauges <= 1: + ts = create_timeseries(client, asset, data_set_external_id, time_series_label) + ts_external_ids.append(ts.external_id) + else: + for gauge_number in range(number_of_gauges): + ts = create_timeseries( + client, asset, data_set_external_id, time_series_label, gauge_number, number_of_gauges + ) + ts_external_ids.append(ts.external_id) + + return ts_external_ids + + +def get_number_of_gauges(client, asset): + """Get the total number of gauges associated with an asset.""" + try: + asset_data = client.assets.retrieve(id=asset.id) + asset_metadata = asset_data.metadata + if "number_of_gauges" in asset_metadata: + return int(asset_metadata["number_of_gauges"]) + else: + return 1 + except Exception as e: + logger.exception(e) + return 1 + + +def handle(data, client): + """Contextualize robot data.""" + print("Start gauge reading.") + required_input_data_fields = { + "data_set_external_id", + "read_dial_gauge_label", + "read_multiple_dial_gauges_label", + "read_digital_gauge_label", + "read_level_gauge_label", + "read_valve_label", + "read_ir_raw_label", + "spill_detection_label", + "gauge_context_label", + } + if not required_input_data_fields <= data.keys(): + raise RuntimeError(f"Data should contain all keys: {required_input_data_fields}. Current data: {data}") + + logging.basicConfig(stream=sys.stdout, level=logging.INFO, format=logging.BASIC_FORMAT) + create_missing_labels( + client, + [ + data["read_dial_gauge_label"], + data["read_multiple_dial_gauges_label"], + data["read_digital_gauge_label"], + data["read_level_gauge_label"], + data["read_valve_label"], + data["read_ir_raw_label"], + data["spill_detection_label"], + "threesixty", + ], + ) + files = client.files.list( + data_set_external_ids=[data["data_set_external_id"]], + metadata={"processed": "false"}, + limit=-1, + uploaded=True, + ) + + logger.info(f"Number of files to process in dataset {data['data_set_external_id']}: {len(files)}") + print(f"Number of files to process in dataset {data['data_set_external_id']}: {len(files)}") + + for file in files: + number_of_gauges = 1 # Default is one gauge per image + metadata = file.metadata + logger.info(f"Processing file with external id: {file.external_id}, id: {file.id}") + + update = FileMetadataUpdate(file.id) + asset = get_asset(client, file) + update.asset_ids.add([asset.id]) if asset else None + + print(f"The labels on this file are: {file.labels}") + if file.labels and has_label(file.labels, data["gauge_context_label"]): + gauge_type = metadata.get("gauge_type", "dial") # Default gauge type from robot is dial + print(f"This file has gauge type: {gauge_type}") + + camera_type = metadata.get("camera", None) + time_series_label = get_time_series_label(camera_type) + + if gauge_type == "valve": + current_action_label = "read_valve_label" + elif gauge_type == "dial": + if asset: + number_of_gauges = get_number_of_gauges(client, asset) + if number_of_gauges <= 1: + current_action_label = "read_dial_gauge_label" + else: + current_action_label = "read_multiple_dial_gauges_label" + else: + current_action_label = f"read_{gauge_type}_gauge_label" + + logger.info(f"Setting action label to {data[current_action_label]}") + print(f"Setting action label to {data[current_action_label]}") + + update.labels.add(data[current_action_label]) + update.labels.remove(data["gauge_context_label"]) + + if asset and gauge_type != "spill": + logger.info(f"Number of gauges: {number_of_gauges}.") + ts_eid = get_timeseries_external_id( + client, asset, data["data_set_external_id"], time_series_label, number_of_gauges + ) + logger.info(f"Time series linked to asset: {ts_eid}.") + if ts_eid: + if time_series_label == "IR_TIME_SERIES": + for i in range(len(ts_eid)): + metadata[f"ts_external_id_{i}"] = ts_eid[i] + elif number_of_gauges <= 1: + metadata["ts_external_id"] = ts_eid[0] + else: + for gauge_number in range(number_of_gauges): + if metadata.get("ts_external_id", None): + if gauge_number == 0: + continue + else: + metadata[f"ts_external_id_{gauge_number}"] = ts_eid[gauge_number] + else: + metadata[f"ts_external_id_{gauge_number}"] = ts_eid[gauge_number] + elif "threesixty" in file.external_id: + print("This is a 360 image, adding threesixty label.") + update.labels.add(["threesixty"]) + + elif asset and metadata.get("method") == "process_ir_raw": + current_action_label = "read_ir_raw_label" + time_series_label = "IR_TIME_SERIES" + print(f"this is the asset: {asset}") + + ts_eid = get_timeseries_external_id( + client, asset, data["data_set_external_id"], time_series_label, number_of_gauges + ) + if time_series_label == "IR_TIME_SERIES": + for i in range(len(ts_eid)): + metadata[f"ts_external_id_{i}"] = ts_eid[i] + + metadata["processed"] = "true" + update.metadata.add(metadata) + client.files.update(update) + return {} diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/requirements.txt b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/requirements.txt new file mode 100644 index 00000000..a15d8762 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_contextualize_robot_data/requirements.txt @@ -0,0 +1,22 @@ +arrow==1.0.3 +certifi==2023.11.17 +chardet==4.0.0 +cognite-extractor-utils==1.4.2 +cognite-sdk==2.56.1 +dacite==1.8.1 +decorator==4.4.2 +idna==3.7 +numpy==1.20.1 +oauthlib==3.1.0 +pandas==1.2.3 +prometheus-client==0.9.0 +psutil==5.8.0 +py==1.10.0 +python-dateutil==2.8.1 +pytz==2021.1 +PyYAML==5.4.1 +requests==2.32.0 +requests-oauthlib==1.3.1 +retry==0.9.2 +six==1.15.0 +urllib3==2.6.3 diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/README.md b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/README.md new file mode 100644 index 00000000..39bb574e --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/README.md @@ -0,0 +1,56 @@ +# Gauge reading + +Uses the API endpoint. +Takes all files with the specified label and reads an analog gauge in the image. + +## Input parameters + +- *gauge_type*: The gauge type to use in the API call +- *input_label*: Label to list files by +- *output_label*: Label for processed files. +- *success_label*: The label added to files where the gauge reading was successful. +- *failed_label*: The label added to files where the gauge reading has failed. + +## Gauge reading + +- The function performs gauge reading on all files with the input label defined in the schedule file. +- Each input file can contain none, some of or all the metadata fields: + + - min_level + - max_level + - unit + - dead_angle + - ts_external_id + +- If the file has the ts_external_id metadata field, we first try to use the metadata from the time series as input + metadata (min_level, max_level, unit, dead_angle). If the ts do not contain all these fields and the file contains + a complete metadata set (min_level, max_level, unit, dead_angle), the timeseries is updated with the correct metadata. +- If the file does not have the ts_external_id metadata field or no complete metadata set is found, the existing file + metadata fields are used as input metadata to the API. For exmaple if the file has a metadata field "unit", + but not "min_level" etc, only unit is given as input to the API. +- If the reading returns a complete metadata reading and the timeseries did not have metadata, the time series is + updated with metadata. +- After the file is read the input_label is removed and the output_label is added. +- If the reading fails, the failed_label is added to the image. +- If the reading succeeds, the success_label is added to the image and value and metadata is added til file metadata. +- If the file contains the ts_external_id field in metadata, the value is written to the timeseries. +- If the reading fails, all attributes that are read are still written to the image. If for example unit and min_level +- is read from the image, unit and min_level are added in the file metadata. + +## Lables + +- The function checks that all labels exist, and creates the fields that do not exist. +- The funtion removes the input label from the image and adds the output label for processed files to the file + as well as the success or fail label. + +## Timestamp + +Timestamp is found from + +1. Metadata field called timestamp +2. Source created time +3. Uploaded time + +## Example request and response from the gauge reading endpoint + +[cognitedata/context-api-workers/pull/981](https://github.com/cognitedata/context-api-workers/pull/981) diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/__init__.py new file mode 100644 index 00000000..9e8f6ee9 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/__init__.py @@ -0,0 +1 @@ +"""Gauge reader.""" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/README.md b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/README.md new file mode 100644 index 00000000..f44fc406 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/README.md @@ -0,0 +1,58 @@ +# Shared-code folder: `common` + +## TL;DR + +> This entire folder hierarchy of `common` is copied into all functions automatically. + +## No, I wan't to read the long story + +A common use case when you deal with the deployment of multiple functions simultaneously, is that you do not want to +replicate shared code between all the function folders. In order to accomodate this, as part of the workflow +`function-action` this template relies on, we copy all the contents in this folder (can be specified by `common_folder` +in the workflow files, see below) the functions we upload to Cognite Functions. If this is not specified, we check if +`common/` exists in the root folder and if so, _**we use it automatically**_ :rocket: + +### Handling imports + +A typical setup looks like this: + +```bash +├── common +│ └── utils.py +└── my_function + └── handler.py +``` + +The code we zip and send off to the FilesAPI will look like this: + +```bash +├── common +│ └── utils.py +└── handler.py +``` + +This means your `handler.py`-file should do imports from `common/utils.py` like this: + +```python +from common.utils import my_helper1, my_helper2 +import common.utils as utils # alternative +``` + +## No, I want `common` to be named `snowflake_utilities` + +No problem mate, locate `.github/workflow` and open the following files: + +- `deploy-pr.yaml` +- `deploy-push.yaml` + +Then, in each file, scroll down until you see: + +```yaml + +- name: Deploy and schedule ${{ matrix.function }} + uses: cognitedata/function-action@v2 + with: + function_name: ... + common_folder: snowflake_utilities # <-- add it here + ... +``` diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/apm_helpers.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/apm_helpers.py new file mode 100644 index 00000000..620abc88 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/apm_helpers.py @@ -0,0 +1,269 @@ +from __future__ import annotations + +import json +import logging +from datetime import datetime +from typing import Any, Optional + +import pytz # type: ignore +from cognite.client import CogniteClient +from common.dataclass.common import Vec3f + +logger = logging.getLogger(__name__) + + +def create_apm_observation_from_reading( + client: CogniteClient, + file_external_id: str, + timeseries_external_id: str, + value: float, + timestamp: int, + pose: Vec3f, + message: str, + apm_checklistitem_external_id: Optional[str] = None, +): + """Create an APM observation from a gauge reading. + + NOTE: this is a preliminary implementation, where we're not yet using the + gql pygen SDK made by Cognite (which will make this a lot cleaner) + + """ + apm_config = _get_apm_config(client=client, config_external_id="inrobot") + if apm_config is None: + logger.error("Could not find APM config") + return + + space_id = str(apm_config.get("appDataSpaceId")) + appdata_space_version = str(apm_config.get("appDataSpaceVersion")) + + views = _get_views( + client=client, + space=space_id, + datamodel_id=space_id, + datamodel_version=appdata_space_version, + view_ids=["APM_Measurement", "Vec3f", "APM_Observation"], + ) + + def _get_view_version(views: list[dict[str, Any]], view_id: str) -> Optional[str]: + view = next((item for item in views if item["externalId"] == view_id), None) + if view is None: + raise ValueError(f"Could not find view {view_id}") + return view.get("version") + + # create the APM measurement + if isinstance(timestamp, int): + timestamp_s = round(timestamp / 1000) + timestamp_dt = datetime.fromtimestamp(float(timestamp_s), pytz.UTC) + elif isinstance(timestamp, datetime): + timestamp_dt = timestamp + else: + raise ValueError(f"Timestamp is of type {type(timestamp)}, needs to be either `int` or `datetime`.") + + apm_measurement_external_id = f"measurement_{timeseries_external_id}_{timestamp}" + apm_measurement = { + "timeSeries": timeseries_external_id, + "measuredAt": timestamp_dt.isoformat(), + "numericValue": value, + } + + vec3f_external_id = f"position_{timeseries_external_id}_{timestamp}" + vec3f = {"x": pose.x, "y": pose.y, "z": pose.z} + + apm_observation_external_id = f"observation_{timeseries_external_id}_{timestamp}" + apm_observation = { + "fileIds": [file_external_id], + "position": {"externalId": vec3f_external_id, "space": space_id}, + "description": "Gauge reading", + "note": message, + "createdById": "CDF Gauge Reader Function", + "updatedById": "CDF Gauge Reader Function", + } + + # edge apm_observation -> apm_measurement + edge_apm_observation_apm_measurement = { + "instanceType": "edge", + "space": space_id, + "externalId": f"{apm_observation_external_id}.measurements_{apm_measurement_external_id}", + "startNode": {"externalId": apm_observation_external_id, "space": space_id}, + "endNode": {"externalId": apm_measurement_external_id, "space": space_id}, + "type": {"externalId": "APM_Observation.measurements", "space": space_id}, + } + + # assemble all instances (nodes and edges) + instances = [ + { + "instanceType": "node", + "space": space_id, + "externalId": apm_measurement_external_id, + "sources": [ + { + "source": { + "type": "view", + "space": space_id, + "externalId": "APM_Measurement", + "version": _get_view_version(views, "APM_Measurement"), + }, + "properties": apm_measurement, + } + ], + }, + { + "instanceType": "node", + "space": space_id, + "externalId": vec3f_external_id, + "sources": [ + { + "source": { + "type": "view", + "space": space_id, + "externalId": "Vec3f", + "version": _get_view_version(views, "Vec3f"), + }, + "properties": vec3f, + } + ], + }, + { + "instanceType": "node", + "space": space_id, + "externalId": apm_observation_external_id, + "sources": [ + { + "source": { + "type": "view", + "space": space_id, + "externalId": "APM_Observation", + "version": _get_view_version(views, "APM_Observation"), + }, + "properties": apm_observation, + } + ], + }, + edge_apm_observation_apm_measurement, + ] + + if apm_checklistitem_external_id is not None: + edge_apm_checklist_apm_observation = { + "instanceType": "edge", + "space": space_id, + "externalId": f"{apm_checklistitem_external_id}.observations_{apm_observation_external_id}", + "startNode": {"externalId": apm_checklistitem_external_id, "space": space_id}, + "endNode": {"externalId": apm_observation_external_id, "space": space_id}, + "type": {"externalId": "APM_ChecklistItem.observations", "space": space_id}, + } + instances.append(edge_apm_checklist_apm_observation) + + logger.debug(f"Creating instances request: {json.dumps(instances, indent=2)}") + + response = client.post( + f"/api/v1/projects/{client.config.project}/models/instances", json={"items": instances} + ).json() + + logger.debug(f"Creating instances response: {json.dumps(response, indent=2)}") + + +def _get_views( + client: CogniteClient, space: str, datamodel_id: str, datamodel_version: Optional[str] = None, view_ids=list[str] +) -> list[dict[str, Any]]: + response = client.post( + f"/api/v1/projects/{client.config.project}/models/datamodels/byids", + json={ + "items": [{"space": space, "externalId": datamodel_id, "version": datamodel_version}], + }, + ).json() + + # get latest datamodel, if no version is specified + datamodel = max(response["items"], key=lambda item: item["createdTime"], default=None) + if datamodel is None: + raise ValueError(f"No datamodels with id {datamodel_id} found with version {datamodel_version}.") + + views = datamodel.get("views") + if views is None or views == []: + raise ValueError(f"Datamodel {datamodel_id} has no views.") + + available_views = {view.get("externalId"): view.get("version") for view in views} + + items = [ + {"space": space, "externalId": requested_view_id, "version": available_views.get(requested_view_id)} + for requested_view_id in view_ids + if available_views.get(requested_view_id) is not None + ] + + if len(items) != len(view_ids): + missing_views = set(view_ids) - set([item["externalId"] for item in items]) + raise ValueError(f"Views {', '.join(missing_views)} not found in datamodel {datamodel_id}.") + + views = client.post( + f"/api/v1/projects/{client.config.project}/models/views/byids", + json={ + "items": items, + }, + ).json() + + return views["items"] + + +def _get_apm_config(client: CogniteClient, config_external_id: str) -> Optional[dict[str, Any]]: + space = "APM_Config" + datamodel_id = "APM_Config" + view_id = "APM_Config" + instance_external_ids = [config_external_id, "default-config"] + + views = _get_views(client=client, space=space, datamodel_id=datamodel_id, view_ids=[view_id]) + + if len(views) != 1: + raise ValueError(f"Expected to find exactly one view for {view_id}, found {len(views)}.") + + view = views[0] + + response = client.post( + f"/api/v1/projects/{client.config.project}/models/instances/byids", + json={ + "items": [ + {"instanceType": "node", "externalId": external_id, "space": space} + for external_id in instance_external_ids + ], + "sources": [ + { + "source": { + "type": "view", + "space": space, + "externalId": view.get("externalId"), + "version": view.get("version"), + } + } + ], + }, + ).json() + + if response.get("items") == []: + logger.error("Could not find APM config, not upserting any APM_Observations now.") + return None + + # Try to find the first item with "externalId" == config_external_id + apm_config = next((item for item in response["items"] if item["externalId"] == config_external_id), None) + + # If no such item is found, try to find the first item with "externalId" == "default" + if apm_config is None: + apm_config = next((item for item in response["items"] if item["externalId"] == "default-config"), None) + if apm_config is None: + raise ValueError(f"Could not find APM config with externalId {config_external_id} or `default-config`.") + + apm_config = apm_config.get("properties").get(space).get(f"{view.get('externalId')}/{view.get('version')}") + + return apm_config + + +def _get_position_from_metadata_to_vec3f(metadata: dict[str, Any]) -> Vec3f: + """Get position from metadata.""" + x = metadata.get("waypoint_tform_body_x") + y = metadata.get("waypoint_tform_body_x") + z = metadata.get("waypoint_tform_body_x") + + if not x or not y or not z: + raise ValueError( + f"Missing metadata field. Required metadata fields \ + are waypoint_tform_body_x, waypoint_tform_body_x, waypoint_tform_body_x. File metadata keys: {metadata.keys()}" + ) + + return Vec3f(x=float(x), y=float(y), z=float(z)) diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/cdf_helpers.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/cdf_helpers.py new file mode 100644 index 00000000..d9cfa076 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/cdf_helpers.py @@ -0,0 +1,112 @@ +from __future__ import annotations + +import logging +import time +from typing import Any, Optional + +from cognite.client import CogniteClient +from cognite.client.data_classes import Annotation, LabelDefinition + +logger = logging.getLogger(__name__) + + +def call_vision_api_endpoint( + client: CogniteClient, + url: str, + input_data: dict, + max_get_job_attempts: int = 20, + headers: Optional[dict[str, Any]] = None, +): + """Post to an API endpoint, wait for response and return response.""" + # TODO: Use this function in people detector function (https://cognitedata.atlassian.net/browse/DMVP-855) + res = client.post(url=url, json=input_data, headers=headers).json() + + job_id = res.get("jobId") + for i in range(max_get_job_attempts): + logger.info(f"Attempt nr. {i} to get job status.") + res = client.get(url=f"{url}/{job_id}").json() + if res.get("status") in ["Queued", "Running"]: + logger.info(f"API job status: {res.get('status')}") + time.sleep(10) + elif res.get("status") == "Completed": + logger.info("API job completed") + break + else: # Use for/else in case of failed job or timeout + logger.info(f"API job failed or timed out: {res}") + return None + + return res + + +def create_missing_labels(client: CogniteClient, label_ids: list[str]): + """Create missing labels from a list of label IDs.""" + for label_id in label_ids: + if not check_label_exists(client, label_id): + client.labels.create([LabelDefinition(external_id=label_id, name=label_id)]) + + +def check_label_exists(client: CogniteClient, label_id: str): + """Check if a label exists in CDF given its external_id (label_id).""" + labels = client.labels.list(external_id_prefix=label_id) + return any(label.external_id == label_id for label in labels) + + +def create_annotations( + client: CogniteClient, + gauge_reading_result: dict, + file_id: int, + gauge_type: str, + bounding_box_label: str, + keypoint_label: str, +): + annotations = gauge_reading_result["items"][0]["predictions"][gauge_type + "GaugePredictions"] + annotations_list = [] + + for annotation in annotations: + print(f"ANNOTATION TYPE: {annotation}") + if gauge_type == "digital": + bounding_box = annotation["boundingBox"] + else: + keypoints = annotation["keypointCollection"]["keypoints"] + bounding_box = annotation["objectDetection"]["boundingBox"] + # Create bounding box annotation + bounding_box_annotation = Annotation( + annotation_type="images.ObjectDetection", + status="suggested", + creating_user="cognite-functions", + creating_app="sdk", + creating_app_version="4.5.2", + annotated_resource_type="file", + annotated_resource_id=file_id, + data={ + "label": bounding_box_label, + "boundingBox": bounding_box, + }, + ) + annotations_list.append(bounding_box_annotation) + + if gauge_type in ["level", "dial"]: + # Create keypoint annotation + keypoint_names = list(keypoints.keys()) + keypoint_data = {} + for i in range(len(keypoint_names)): + keypoint_name = keypoint_names[i] + print(keypoint_name) + point = keypoints[keypoint_name]["point"] + print(point) + keypoint_data[keypoint_name] = {"point": point} + print(keypoint_data) + + keypoint_annotation = Annotation( + annotation_type="images.KeypointCollection", + status="suggested", + creating_user="cognite-functions", + creating_app="sdk", + creating_app_version="4.5.2", + annotated_resource_type="file", + annotated_resource_id=file_id, + data={"label": keypoint_label, "keypoints": keypoint_data}, + ) + annotations_list.append(keypoint_annotation) + + client.annotations.create(annotations_list) diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/common.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/common.py new file mode 100644 index 00000000..b07197dc --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/common.py @@ -0,0 +1,16 @@ +from dataclasses import asdict, dataclass + + +@dataclass +class Dataclass: + def to_dict(self, ignore_none=False): + if ignore_none: + return asdict(self, dict_factory=lambda x: {k: v for (k, v) in x if v}) + return asdict(self) + + +@dataclass +class Vec3f(Dataclass): + x: float + y: float + z: float diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/vision.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/vision.py new file mode 100644 index 00000000..570d0a2d --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/dataclass/vision.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Optional + +from common.dataclass.common import Dataclass + + +@dataclass +class File(Dataclass): + fileId: int + fileExternalId: Optional[str] = None + + +@dataclass +class RequestCustomModelPrediction(Dataclass): + items: list[File] + modelFile: File + threshold: float + + +@dataclass +class Vertex(Dataclass): + x: float + y: float + + +@dataclass +class Region(Dataclass): + shape: str # points, rectangle, polyline, polygon + vertices: list[Vertex] + + +@dataclass +class VisionAnnotation(Dataclass): + text: str + confidence: Optional[float] = None + region: Optional[Region] = None + + +@dataclass +class Item(Dataclass): + fileId: int + annotations: Optional[list[VisionAnnotation]] = None + fileExternalId: Optional[str] = None + width: Optional[float] = None + height: Optional[float] = None + + +@dataclass +class FailedBatchSchema(Dataclass): + errorMessage: Optional[str] = None + items: Optional[list[File]] = None + + +@dataclass +class ResponseCustomModelPrediction(Dataclass): + status: str # "Queued" "Running" "Completed" "Failed" + createdTime: int + startTime: int + statusTime: int + jobId: int + items: list[Item] + modelFile: File + threshold: Optional[float] = None + failedItems: Optional[list[FailedBatchSchema]] = None diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/utils.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/utils.py new file mode 100644 index 00000000..c3ce1ce9 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/common/utils.py @@ -0,0 +1,17 @@ +import io + +from PIL import Image + + +def batch(iterable, n=1): + """Batch iterable.""" + len_iterable = len(iterable) + for ndx in range(0, len_iterable, n): + yield iterable[ndx : min(ndx + n, len_iterable)] + + +def image_to_byte_array(image: Image) -> bytes: + """Convert PIL image to byte array.""" + img_byte_arr = io.BytesIO() + image.save(img_byte_arr, format=image.format) + return img_byte_arr.getvalue() diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/handler.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/handler.py new file mode 100644 index 00000000..370cf6af --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/handler.py @@ -0,0 +1,396 @@ +"""Gauge reader handler.""" + +from __future__ import annotations + +import logging +import sys +from typing import Optional + +from cognite.client import CogniteClient +from cognite.client.data_classes import FileMetadataUpdate, LabelFilter, TimeSeriesUpdate +from cognite.extractorutils.uploader import TimeSeriesUploadQueue +from common.apm_helpers import _get_position_from_metadata_to_vec3f, create_apm_observation_from_reading +from common.cdf_helpers import call_vision_api_endpoint, create_annotations, create_missing_labels + +MAX_GET_JOB_ATTEMPTS = 20 + +METADATA = { + "dial": {"required": [], "all": ["min_level", "max_level", "dead_angle"]}, + "digital": { + "required": ["comma_pos"], + "all": ["comma_pos", "min_num_digits", "max_num_digits"], + }, + "level": {"required": [], "all": ["min_level", "max_level"]}, + "valve": {"required": [], "all": []}, +} +SUPPORTED_GAUGES = ["dial", "digital", "level", "valve"] +GAUGE_FEATURE_TYPES = { + "dial": "DialGaugeDetection", + "digital": "DigitalGaugeDetection", + "level": "LevelGaugeDetection", + "valve": "ValveDetection", +} + +GAUGE_PARAMETERS_TYPES = { + "dial": "dialGaugeDetectionParameters", + "digital": "digitalGaugeDetectionParameters", + "level": "levelGaugeDetectionParameters", + "valve": "valveDetectionParameters", +} + +logger = logging.getLogger(__name__) + +BOUNDING_BOX_LABELS = {"dial": "dial-gauge", "digital": "digital-gauge", "level": "level-gauge", "valve": "valve"} +KEYPOINT_LABELS = { + "dial": "dial-gauge-keypoints", + "digital": "digital-gauge-keypoints", + "level": "level-gauge-keypoints", + "valve": "valve-keypoints", +} + + +def update_ts_metadata(client, file_metadata, metadata_keys): + """Update a timeseries with gauge reading metadata.""" + metadata = {key: file_metadata.get(key) for key in metadata_keys} + logger.info(f"Timeseries {file_metadata['ts_external_id']} updated with metadata {metadata}") + client.time_series.update(TimeSeriesUpdate(external_id=file_metadata["ts_external_id"]).metadata.add(metadata)) + + +def gauge_reading_attributes_from_response(res: dict, gauge_type: str) -> Optional[dict]: + """Return the gauge reading annotations from the API response.""" + if not res: + logger.error("API call failed. Did not get a response.") + return None + if not res["items"]: + logger.error(f"No items in result: {res}") + return None + + if gauge_type == "valve": + valve_readings = [annotation for annotation in res["items"][0]["predictions"]["valvePredictions"]] + if not valve_readings: + logger.error(f"No annotation of type {gauge_type} in result.") + return None + for reading in valve_readings: + if reading.get("keypointCollection", None): + data = reading["keypointCollection"] + else: + gauge_readings = [annotation for annotation in res["items"][0]["predictions"][gauge_type + "GaugePredictions"]] + gauge_attributes = [] + + for gauge_reading in gauge_readings: + if gauge_type == "digital": + if gauge_reading.get("attributes", None): + gauge_attributes.append(gauge_reading) + else: + if gauge_reading.get("keypointCollection", None): + gauge_attributes.append(gauge_reading["keypointCollection"]) + + if not gauge_attributes: + logger.error(f"No annotation of type {gauge_type} in result.") + return None + + if "attributes" not in gauge_attributes[0]: + logger.error("No attributes in result.") + return None + data = gauge_attributes[0]["attributes"] + + return data + + +def handle_failed_upload(client: CogniteClient, id: int, error_message: str, data: dict, metadata: dict | None = None): + """Log error message and update a file that has failed.""" + logger.error(error_message) + + if data["gauge_type"] == "valve": + client.files.update( + FileMetadataUpdate(id=id) + .labels.remove(data["input_label"]) + .labels.add([data["output_label"], data["failed_label"]]) + .metadata.add({"error_message": error_message}) + ) + else: + client.files.update( + FileMetadataUpdate(id=id) + .labels.remove(data["input_label"]) + .labels.add([data["output_label"], data["failed_label"]]) + .metadata.add( + {"error_message": error_message, **metadata} + if metadata is not None + else {"error_message": error_message} + ) + ) + + +def to_input_metadata(keys: list[str], metadata: dict): + return {to_camel_case(key): metadata.get(key) for key in keys} + + +def get_timestamp(file): + """Get timestamp from file.""" + timestamp = file.metadata.get("timestamp") + if not timestamp: + timestamp = file.source_created_time + if not timestamp: + # This definitely exists + timestamp = file.uploaded_time + return timestamp + + +def to_camel_case(snake): + """Convert from snake case to camel case.""" + components = snake.split("_") + return components[0] + "".join(x.title() for x in components[1:]) if len(components) > 1 else components[0] + + +def handle(data, client): + """Gauge reader handle. Only analog, digital and level gauges supported at the moment.""" + if not {"gauge_type", "input_label", "output_label", "success_label", "failed_label"} <= data.keys(): + raise RuntimeError( + "Data should contain all keys: 'gauge_type', 'input_label', 'output_label', 'success_label', 'failed_label'" + ) + + if data["gauge_type"] not in SUPPORTED_GAUGES: + raise NotImplementedError(f"Only {SUPPORTED_GAUGES} gauge reading supported, not {data['gauge_type']}") + + logging.basicConfig(stream=sys.stdout, level=logging.INFO, format=logging.BASIC_FORMAT) + + files = client.files.list( + labels=LabelFilter(contains_all=[data["input_label"]]), + limit=15, + uploaded=True, + ) + logger.info(f"Number of files to process with label {data['input_label']}: {len(files)}") + + create_missing_labels(client, [data["output_label"], data["success_label"], data["failed_label"]]) + upload_queue = TimeSeriesUploadQueue( + client, + max_upload_interval=1, + create_missing=True, + max_queue_size=100, + ) + project = client.config.project + for file in files: + ts_metadata = False + logger.info(f"Processing file with external id {file.external_id}, id {file.id}") + file.metadata = {} if file.metadata is None else file.metadata + + # If the file has a timeseries external id, try to get a complete metadata set from the timeseries. + # If the timeseries does not have all metadata, try to get a complete metadata set from the file. + if "ts_external_id" in file.metadata: + ts = client.time_series.retrieve(external_id=file.metadata.get("ts_external_id")) + logger.info(f"Retrieve timeseries {file.metadata.get('ts_external_id')}") + if not ts: + handle_failed_upload( + client=client, + id=file.id, + error_message=f"Time series with metadata {file.metadata.get('ts_external_id')} does not exist", + data=data, + ) + continue + if ts.metadata and all(key in ts.metadata for key in METADATA[data["gauge_type"]]["all"]): + metadata = to_input_metadata(METADATA[data["gauge_type"]]["all"], ts.metadata) + ts_metadata = True + logger.info(f"Metadata from timeseries: {metadata}") + for key in METADATA[data["gauge_type"]]["all"]: + file.metadata[key] = str(ts.metadata[key]) + if "unit" in ts.metadata: + file.metadata["unit"] = ts.metadata["unit"] + + elif all(key in file.metadata for key in METADATA[data["gauge_type"]]["all"]): + metadata = to_input_metadata(METADATA[data["gauge_type"]]["all"], file.metadata) + logger.info(f"Metadata from file: {metadata}") + update_ts_metadata(client, file.metadata, METADATA[data["gauge_type"]]["all"]) + logger.info(f"Complete metadata from image: {metadata}") + ts_metadata = True + + if not ts_metadata: + if not all(key in file.metadata for key in METADATA[data["gauge_type"]]["required"]): + handle_failed_upload( + client=client, + id=file.id, + error_message=f"Some required metadata fields missing. Required metadata is: {METADATA[data['gauge_type']]['required']}. Cannot process image.", + data=data, + ) + continue + + # If we did not find complete metadata from time series or file, use (possibly incomplete) metadata from file. + metadata = {} + for key in METADATA[data["gauge_type"]]["all"]: + if key in file.metadata: + metadata[to_camel_case(key)] = file.metadata[key] + logger.info(f"Not complete metadata from image: {metadata}") + + # Check gauge_type and make api-call based on the gauge_type + if data["gauge_type"] == "valve": + res = call_vision_api_endpoint( + client=client, + url=f"/api/v1/projects/{project}/context/vision/extract", + input_data={"items": [{"fileId": file.id}], "features": ["ValveDetection"]}, + max_get_job_attempts=MAX_GET_JOB_ATTEMPTS, + headers={"cdf-version": "beta"}, + ) + else: + res = call_vision_api_endpoint( + client=client, + url=f"/api/v1/projects/{project}/context/vision/extract", + input_data={ + "items": [{"fileId": file.id}], + "features": [GAUGE_FEATURE_TYPES[data["gauge_type"]]], + "parameters": {GAUGE_PARAMETERS_TYPES[data["gauge_type"]]: metadata}, + }, + max_get_job_attempts=MAX_GET_JOB_ATTEMPTS, + headers={"cdf-version": "beta"}, + ) + + print(f"RES: {res}") + if not res: + handle_failed_upload( + client=client, id=file.id, error_message="API call failed. Did not get a response", data=data + ) + continue + + gauge_reading_attributes = gauge_reading_attributes_from_response(res, data["gauge_type"]) + logger.info("-----------------------------GAUGE READING-------------------------------") + logger.info(f"External id: {file.external_id}, Reading: {gauge_reading_attributes}") + logger.info("-------------------------------------------------------------------------") + if gauge_reading_attributes is None: + handle_failed_upload( + client=client, + id=file.id, + error_message=f"Failed to read gauge {file.external_id}. No gauge found in image.", + data=data, + ) + continue + read_value = ( + gauge_reading_attributes["attributes"]["valveState"]["value"] + if data["gauge_type"] == "valve" + else gauge_reading_attributes[data["gauge_type"] + "GaugeValue"]["value"] + ) + if read_value is None: + handle_failed_upload( + client=client, + id=file.id, + error_message=f"Failed to read gauge {file.external_id}. Could not read value.", + data=data, + metadata=gauge_reading_attributes.get("metadata", None), + ) + continue + + # If the reading was successful + if data["gauge_type"] == "valve": + file.metadata["state"] = read_value + logger.info(f"Predicted state: {file.metadata['state'] }") + + else: + # If the readings were successful, draw the annotations on the image + create_annotations( + client=client, + gauge_reading_result=res, + file_id=file.id, + gauge_type=data["gauge_type"], + bounding_box_label=BOUNDING_BOX_LABELS[data["gauge_type"]], + keypoint_label=KEYPOINT_LABELS[data["gauge_type"]], + ) + + if data["gauge_type"] == "digital": + file.metadata["value"] = read_value + else: + file.metadata["value"] = f"{read_value:.2f}" + + for key in METADATA[data["gauge_type"]]["all"]: + key_attribute = to_camel_case(key) + if gauge_reading_attributes is not None: + key_object = gauge_reading_attributes.get(key_attribute, None) + if key_object is not None: + key_val = key_object.get("value", None) + if key_val is not None: + file.metadata[key] = str(key_val) + elif key_object is None and key == "dead_angle": + file.metadata[key] = "90" # Dead angle is not returned when it is 90 (default) + logger.info(f"Predicted value: {file.metadata['value']}") + + if "ts_external_id" in file.metadata and not ts_metadata: + # If the reading was successful and timeseries metadata does not exist, add ts metadata from the reading. + metadata = to_input_metadata(METADATA[data["gauge_type"]]["all"], file.metadata) + update_ts_metadata(client, file.metadata, METADATA[data["gauge_type"]]["all"]) + + if "ts_external_id" in file.metadata: + # Upload datapoint to timeseries if the file has ts_external_id. + timestamp = int(get_timestamp(file)) + if data["gauge_type"] == "valve": + timeseries_value = 1.0 if read_value == "on" else 0.0 if read_value == "off" else -1.0 + else: + timeseries_value = float(read_value) + + upload_queue.add_to_upload_queue( + datapoints=[(timestamp, timeseries_value)], + external_id=file.metadata.get("ts_external_id"), + ) + + try: + position = _get_position_from_metadata_to_vec3f(file.metadata) + if data["gauge_type"] in ["dial", "digital", "level"]: + # create a observation if value is above or below threshold + _value_threshold_max = float(ts.metadata.get("observation_threshold_max", "inf")) + _value_threshold_min = float(ts.metadata.get("observation_threshold_min", "-inf")) + + if timeseries_value < _value_threshold_min: + create_apm_observation_from_reading( + client=client, + file_external_id=file.external_id, + timeseries_external_id=file.metadata.get("ts_external_id"), + value=timeseries_value, + timestamp=timestamp, + pose=position, + message="WARNING: Value below threshold", + apm_checklistitem_external_id=file.metadata.get("action_run_id"), + ) + elif timeseries_value > _value_threshold_max: + create_apm_observation_from_reading( + client=client, + file_external_id=file.external_id, + timeseries_external_id=file.metadata.get("ts_external_id"), + value=timeseries_value, + timestamp=timestamp, + pose=position, + message="WARNING: Value over threshold", + apm_checklistitem_external_id=file.metadata.get("action_run_id"), + ) + elif data["gauge_type"] == "valve": + _expected_state = ts.metadata.get("expected_valve_state", "no_state_specified") + if (_expected_state == "on" or _expected_state == "1.0") and timeseries_value == 0.0: + create_apm_observation_from_reading( + client=client, + file_external_id=file.external_id, + timeseries_external_id=file.metadata.get("ts_external_id"), + value=timeseries_value, + timestamp=timestamp, + pose=position, + message="WARNING: Valve is off", + apm_checklistitem_external_id=file.metadata.get("action_run_id"), + ) + elif (_expected_state == "off" or _expected_state == "0.0") and timeseries_value == 1.0: + create_apm_observation_from_reading( + client=client, + file_external_id=file.external_id, + timeseries_external_id=file.metadata.get("ts_external_id"), + value=timeseries_value, + timestamp=timestamp, + pose=position, + message="WARNING: Valve is on", + apm_checklistitem_external_id=file.metadata.get("action_run_id"), + ) + + except Exception as e: + logger.error(f"Failed to create APM observation: {e}") + + client.files.update( + FileMetadataUpdate(id=file.id) + .labels.remove(data["input_label"]) + .labels.add([data["output_label"], data["success_label"]]) + .metadata.add(file.metadata) + ) + logger.info(f"Gauge reading completed successfully for file {file.external_id}, id: {file.id}.") + + upload_queue.upload() + return {} diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/requirements.txt b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/requirements.txt new file mode 100644 index 00000000..04e0d2f8 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_gauge_reading/requirements.txt @@ -0,0 +1,22 @@ +arrow==1.0.3 +certifi==2023.11.17 +chardet==4.0.0 +cognite-extractor-utils==1.4.2 +cognite-sdk==2.56.1 +dacite==1.8.1 +decorator==4.4.2 +idna==3.7 +numpy==1.20.3 +oauthlib==3.1.0 +pandas==1.5.3 +prometheus-client==0.9.0 +psutil==5.8.0 +py==1.10.0 +python-dateutil==2.8.1 +pytz==2021.1 +PyYAML==5.4.1 +requests==2.32.0 +requests-oauthlib==1.3.1 +retry==0.9.2 +six==1.15.0 +urllib3==2.6.3 diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/README.md b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/README.md new file mode 100644 index 00000000..8a68f2a0 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/README.md @@ -0,0 +1,18 @@ +# Get IR data from IR raw files + +Function for converting the raw IR files that are uploaded from Spot into IR images (RGB images with colour based on +temperature) and temperature files (CSV files where one cell corresponds to one pixel value, and contains the +temperature of that pixel value). + +The raw IR files are read from CDF, and after conversion, the IR images and temperature files are uploaded to CDF. +The raw IR files are kept in CDF after conversion. + +## Required parameters + +- `input_label`: the raw IR files get this label when they are uploaded from Spot. The label is used to list the raw + IR files. By default, this label is set to `read_ir`. +- `output_label`: the raw IR files get this label when the conversion into IR images and temperature files are finished. + By default, this label is set to `ir_finished`. +- `success_label`: the raw IR files get this label if the conversion was successful. +- `failed_label`: the raw IR files get this label if the conversion failed. +- `data_set_id`: the ID of the dataset that the function reads the files from. diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/__init__.py new file mode 100644 index 00000000..07e1fbcb --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/__init__.py @@ -0,0 +1 @@ +"""Extract ir image data and ir temperature data from the ir raw file.""" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/README.md b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/README.md new file mode 100644 index 00000000..f44fc406 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/README.md @@ -0,0 +1,58 @@ +# Shared-code folder: `common` + +## TL;DR + +> This entire folder hierarchy of `common` is copied into all functions automatically. + +## No, I wan't to read the long story + +A common use case when you deal with the deployment of multiple functions simultaneously, is that you do not want to +replicate shared code between all the function folders. In order to accomodate this, as part of the workflow +`function-action` this template relies on, we copy all the contents in this folder (can be specified by `common_folder` +in the workflow files, see below) the functions we upload to Cognite Functions. If this is not specified, we check if +`common/` exists in the root folder and if so, _**we use it automatically**_ :rocket: + +### Handling imports + +A typical setup looks like this: + +```bash +├── common +│ └── utils.py +└── my_function + └── handler.py +``` + +The code we zip and send off to the FilesAPI will look like this: + +```bash +├── common +│ └── utils.py +└── handler.py +``` + +This means your `handler.py`-file should do imports from `common/utils.py` like this: + +```python +from common.utils import my_helper1, my_helper2 +import common.utils as utils # alternative +``` + +## No, I want `common` to be named `snowflake_utilities` + +No problem mate, locate `.github/workflow` and open the following files: + +- `deploy-pr.yaml` +- `deploy-push.yaml` + +Then, in each file, scroll down until you see: + +```yaml + +- name: Deploy and schedule ${{ matrix.function }} + uses: cognitedata/function-action@v2 + with: + function_name: ... + common_folder: snowflake_utilities # <-- add it here + ... +``` diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/apm_helpers.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/apm_helpers.py new file mode 100644 index 00000000..620abc88 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/apm_helpers.py @@ -0,0 +1,269 @@ +from __future__ import annotations + +import json +import logging +from datetime import datetime +from typing import Any, Optional + +import pytz # type: ignore +from cognite.client import CogniteClient +from common.dataclass.common import Vec3f + +logger = logging.getLogger(__name__) + + +def create_apm_observation_from_reading( + client: CogniteClient, + file_external_id: str, + timeseries_external_id: str, + value: float, + timestamp: int, + pose: Vec3f, + message: str, + apm_checklistitem_external_id: Optional[str] = None, +): + """Create an APM observation from a gauge reading. + + NOTE: this is a preliminary implementation, where we're not yet using the + gql pygen SDK made by Cognite (which will make this a lot cleaner) + + """ + apm_config = _get_apm_config(client=client, config_external_id="inrobot") + if apm_config is None: + logger.error("Could not find APM config") + return + + space_id = str(apm_config.get("appDataSpaceId")) + appdata_space_version = str(apm_config.get("appDataSpaceVersion")) + + views = _get_views( + client=client, + space=space_id, + datamodel_id=space_id, + datamodel_version=appdata_space_version, + view_ids=["APM_Measurement", "Vec3f", "APM_Observation"], + ) + + def _get_view_version(views: list[dict[str, Any]], view_id: str) -> Optional[str]: + view = next((item for item in views if item["externalId"] == view_id), None) + if view is None: + raise ValueError(f"Could not find view {view_id}") + return view.get("version") + + # create the APM measurement + if isinstance(timestamp, int): + timestamp_s = round(timestamp / 1000) + timestamp_dt = datetime.fromtimestamp(float(timestamp_s), pytz.UTC) + elif isinstance(timestamp, datetime): + timestamp_dt = timestamp + else: + raise ValueError(f"Timestamp is of type {type(timestamp)}, needs to be either `int` or `datetime`.") + + apm_measurement_external_id = f"measurement_{timeseries_external_id}_{timestamp}" + apm_measurement = { + "timeSeries": timeseries_external_id, + "measuredAt": timestamp_dt.isoformat(), + "numericValue": value, + } + + vec3f_external_id = f"position_{timeseries_external_id}_{timestamp}" + vec3f = {"x": pose.x, "y": pose.y, "z": pose.z} + + apm_observation_external_id = f"observation_{timeseries_external_id}_{timestamp}" + apm_observation = { + "fileIds": [file_external_id], + "position": {"externalId": vec3f_external_id, "space": space_id}, + "description": "Gauge reading", + "note": message, + "createdById": "CDF Gauge Reader Function", + "updatedById": "CDF Gauge Reader Function", + } + + # edge apm_observation -> apm_measurement + edge_apm_observation_apm_measurement = { + "instanceType": "edge", + "space": space_id, + "externalId": f"{apm_observation_external_id}.measurements_{apm_measurement_external_id}", + "startNode": {"externalId": apm_observation_external_id, "space": space_id}, + "endNode": {"externalId": apm_measurement_external_id, "space": space_id}, + "type": {"externalId": "APM_Observation.measurements", "space": space_id}, + } + + # assemble all instances (nodes and edges) + instances = [ + { + "instanceType": "node", + "space": space_id, + "externalId": apm_measurement_external_id, + "sources": [ + { + "source": { + "type": "view", + "space": space_id, + "externalId": "APM_Measurement", + "version": _get_view_version(views, "APM_Measurement"), + }, + "properties": apm_measurement, + } + ], + }, + { + "instanceType": "node", + "space": space_id, + "externalId": vec3f_external_id, + "sources": [ + { + "source": { + "type": "view", + "space": space_id, + "externalId": "Vec3f", + "version": _get_view_version(views, "Vec3f"), + }, + "properties": vec3f, + } + ], + }, + { + "instanceType": "node", + "space": space_id, + "externalId": apm_observation_external_id, + "sources": [ + { + "source": { + "type": "view", + "space": space_id, + "externalId": "APM_Observation", + "version": _get_view_version(views, "APM_Observation"), + }, + "properties": apm_observation, + } + ], + }, + edge_apm_observation_apm_measurement, + ] + + if apm_checklistitem_external_id is not None: + edge_apm_checklist_apm_observation = { + "instanceType": "edge", + "space": space_id, + "externalId": f"{apm_checklistitem_external_id}.observations_{apm_observation_external_id}", + "startNode": {"externalId": apm_checklistitem_external_id, "space": space_id}, + "endNode": {"externalId": apm_observation_external_id, "space": space_id}, + "type": {"externalId": "APM_ChecklistItem.observations", "space": space_id}, + } + instances.append(edge_apm_checklist_apm_observation) + + logger.debug(f"Creating instances request: {json.dumps(instances, indent=2)}") + + response = client.post( + f"/api/v1/projects/{client.config.project}/models/instances", json={"items": instances} + ).json() + + logger.debug(f"Creating instances response: {json.dumps(response, indent=2)}") + + +def _get_views( + client: CogniteClient, space: str, datamodel_id: str, datamodel_version: Optional[str] = None, view_ids=list[str] +) -> list[dict[str, Any]]: + response = client.post( + f"/api/v1/projects/{client.config.project}/models/datamodels/byids", + json={ + "items": [{"space": space, "externalId": datamodel_id, "version": datamodel_version}], + }, + ).json() + + # get latest datamodel, if no version is specified + datamodel = max(response["items"], key=lambda item: item["createdTime"], default=None) + if datamodel is None: + raise ValueError(f"No datamodels with id {datamodel_id} found with version {datamodel_version}.") + + views = datamodel.get("views") + if views is None or views == []: + raise ValueError(f"Datamodel {datamodel_id} has no views.") + + available_views = {view.get("externalId"): view.get("version") for view in views} + + items = [ + {"space": space, "externalId": requested_view_id, "version": available_views.get(requested_view_id)} + for requested_view_id in view_ids + if available_views.get(requested_view_id) is not None + ] + + if len(items) != len(view_ids): + missing_views = set(view_ids) - set([item["externalId"] for item in items]) + raise ValueError(f"Views {', '.join(missing_views)} not found in datamodel {datamodel_id}.") + + views = client.post( + f"/api/v1/projects/{client.config.project}/models/views/byids", + json={ + "items": items, + }, + ).json() + + return views["items"] + + +def _get_apm_config(client: CogniteClient, config_external_id: str) -> Optional[dict[str, Any]]: + space = "APM_Config" + datamodel_id = "APM_Config" + view_id = "APM_Config" + instance_external_ids = [config_external_id, "default-config"] + + views = _get_views(client=client, space=space, datamodel_id=datamodel_id, view_ids=[view_id]) + + if len(views) != 1: + raise ValueError(f"Expected to find exactly one view for {view_id}, found {len(views)}.") + + view = views[0] + + response = client.post( + f"/api/v1/projects/{client.config.project}/models/instances/byids", + json={ + "items": [ + {"instanceType": "node", "externalId": external_id, "space": space} + for external_id in instance_external_ids + ], + "sources": [ + { + "source": { + "type": "view", + "space": space, + "externalId": view.get("externalId"), + "version": view.get("version"), + } + } + ], + }, + ).json() + + if response.get("items") == []: + logger.error("Could not find APM config, not upserting any APM_Observations now.") + return None + + # Try to find the first item with "externalId" == config_external_id + apm_config = next((item for item in response["items"] if item["externalId"] == config_external_id), None) + + # If no such item is found, try to find the first item with "externalId" == "default" + if apm_config is None: + apm_config = next((item for item in response["items"] if item["externalId"] == "default-config"), None) + if apm_config is None: + raise ValueError(f"Could not find APM config with externalId {config_external_id} or `default-config`.") + + apm_config = apm_config.get("properties").get(space).get(f"{view.get('externalId')}/{view.get('version')}") + + return apm_config + + +def _get_position_from_metadata_to_vec3f(metadata: dict[str, Any]) -> Vec3f: + """Get position from metadata.""" + x = metadata.get("waypoint_tform_body_x") + y = metadata.get("waypoint_tform_body_x") + z = metadata.get("waypoint_tform_body_x") + + if not x or not y or not z: + raise ValueError( + f"Missing metadata field. Required metadata fields \ + are waypoint_tform_body_x, waypoint_tform_body_x, waypoint_tform_body_x. File metadata keys: {metadata.keys()}" + ) + + return Vec3f(x=float(x), y=float(y), z=float(z)) diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/cdf_helpers.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/cdf_helpers.py new file mode 100644 index 00000000..d9cfa076 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/cdf_helpers.py @@ -0,0 +1,112 @@ +from __future__ import annotations + +import logging +import time +from typing import Any, Optional + +from cognite.client import CogniteClient +from cognite.client.data_classes import Annotation, LabelDefinition + +logger = logging.getLogger(__name__) + + +def call_vision_api_endpoint( + client: CogniteClient, + url: str, + input_data: dict, + max_get_job_attempts: int = 20, + headers: Optional[dict[str, Any]] = None, +): + """Post to an API endpoint, wait for response and return response.""" + # TODO: Use this function in people detector function (https://cognitedata.atlassian.net/browse/DMVP-855) + res = client.post(url=url, json=input_data, headers=headers).json() + + job_id = res.get("jobId") + for i in range(max_get_job_attempts): + logger.info(f"Attempt nr. {i} to get job status.") + res = client.get(url=f"{url}/{job_id}").json() + if res.get("status") in ["Queued", "Running"]: + logger.info(f"API job status: {res.get('status')}") + time.sleep(10) + elif res.get("status") == "Completed": + logger.info("API job completed") + break + else: # Use for/else in case of failed job or timeout + logger.info(f"API job failed or timed out: {res}") + return None + + return res + + +def create_missing_labels(client: CogniteClient, label_ids: list[str]): + """Create missing labels from a list of label IDs.""" + for label_id in label_ids: + if not check_label_exists(client, label_id): + client.labels.create([LabelDefinition(external_id=label_id, name=label_id)]) + + +def check_label_exists(client: CogniteClient, label_id: str): + """Check if a label exists in CDF given its external_id (label_id).""" + labels = client.labels.list(external_id_prefix=label_id) + return any(label.external_id == label_id for label in labels) + + +def create_annotations( + client: CogniteClient, + gauge_reading_result: dict, + file_id: int, + gauge_type: str, + bounding_box_label: str, + keypoint_label: str, +): + annotations = gauge_reading_result["items"][0]["predictions"][gauge_type + "GaugePredictions"] + annotations_list = [] + + for annotation in annotations: + print(f"ANNOTATION TYPE: {annotation}") + if gauge_type == "digital": + bounding_box = annotation["boundingBox"] + else: + keypoints = annotation["keypointCollection"]["keypoints"] + bounding_box = annotation["objectDetection"]["boundingBox"] + # Create bounding box annotation + bounding_box_annotation = Annotation( + annotation_type="images.ObjectDetection", + status="suggested", + creating_user="cognite-functions", + creating_app="sdk", + creating_app_version="4.5.2", + annotated_resource_type="file", + annotated_resource_id=file_id, + data={ + "label": bounding_box_label, + "boundingBox": bounding_box, + }, + ) + annotations_list.append(bounding_box_annotation) + + if gauge_type in ["level", "dial"]: + # Create keypoint annotation + keypoint_names = list(keypoints.keys()) + keypoint_data = {} + for i in range(len(keypoint_names)): + keypoint_name = keypoint_names[i] + print(keypoint_name) + point = keypoints[keypoint_name]["point"] + print(point) + keypoint_data[keypoint_name] = {"point": point} + print(keypoint_data) + + keypoint_annotation = Annotation( + annotation_type="images.KeypointCollection", + status="suggested", + creating_user="cognite-functions", + creating_app="sdk", + creating_app_version="4.5.2", + annotated_resource_type="file", + annotated_resource_id=file_id, + data={"label": keypoint_label, "keypoints": keypoint_data}, + ) + annotations_list.append(keypoint_annotation) + + client.annotations.create(annotations_list) diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/common.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/common.py new file mode 100644 index 00000000..b07197dc --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/common.py @@ -0,0 +1,16 @@ +from dataclasses import asdict, dataclass + + +@dataclass +class Dataclass: + def to_dict(self, ignore_none=False): + if ignore_none: + return asdict(self, dict_factory=lambda x: {k: v for (k, v) in x if v}) + return asdict(self) + + +@dataclass +class Vec3f(Dataclass): + x: float + y: float + z: float diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/vision.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/vision.py new file mode 100644 index 00000000..570d0a2d --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/dataclass/vision.py @@ -0,0 +1,66 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Optional + +from common.dataclass.common import Dataclass + + +@dataclass +class File(Dataclass): + fileId: int + fileExternalId: Optional[str] = None + + +@dataclass +class RequestCustomModelPrediction(Dataclass): + items: list[File] + modelFile: File + threshold: float + + +@dataclass +class Vertex(Dataclass): + x: float + y: float + + +@dataclass +class Region(Dataclass): + shape: str # points, rectangle, polyline, polygon + vertices: list[Vertex] + + +@dataclass +class VisionAnnotation(Dataclass): + text: str + confidence: Optional[float] = None + region: Optional[Region] = None + + +@dataclass +class Item(Dataclass): + fileId: int + annotations: Optional[list[VisionAnnotation]] = None + fileExternalId: Optional[str] = None + width: Optional[float] = None + height: Optional[float] = None + + +@dataclass +class FailedBatchSchema(Dataclass): + errorMessage: Optional[str] = None + items: Optional[list[File]] = None + + +@dataclass +class ResponseCustomModelPrediction(Dataclass): + status: str # "Queued" "Running" "Completed" "Failed" + createdTime: int + startTime: int + statusTime: int + jobId: int + items: list[Item] + modelFile: File + threshold: Optional[float] = None + failedItems: Optional[list[FailedBatchSchema]] = None diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/utils.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/utils.py new file mode 100644 index 00000000..c3ce1ce9 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/common/utils.py @@ -0,0 +1,17 @@ +import io + +from PIL import Image + + +def batch(iterable, n=1): + """Batch iterable.""" + len_iterable = len(iterable) + for ndx in range(0, len_iterable, n): + yield iterable[ndx : min(ndx + n, len_iterable)] + + +def image_to_byte_array(image: Image) -> bytes: + """Convert PIL image to byte array.""" + img_byte_arr = io.BytesIO() + image.save(img_byte_arr, format=image.format) + return img_byte_arr.getvalue() diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/handler.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/handler.py new file mode 100644 index 00000000..83a7ab72 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/handler.py @@ -0,0 +1,195 @@ +from __future__ import annotations + +import logging +import tempfile +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np +from cognite.client import CogniteClient +from cognite.client.data_classes import FileMetadataUpdate, LabelFilter +from cognite.extractorutils.uploader import TimeSeriesUploadQueue +from common.cdf_helpers import create_missing_labels + +IMAGE_HEIGHT = 512 +IMAGE_WIDTH = 640 + +logger = logging.getLogger(__name__) + + +def get_timestamp(file): + """Get timestamp from file.""" + timestamp = file.metadata.get("timestamp") + if not timestamp: + timestamp = file.source_created_time + if not timestamp: + # This definitely exists + timestamp = file.uploaded_time + return timestamp + + +def get_asset(client, file): + """Get asset from metadata field.""" + if file.metadata.get("asset_id", None) not in [None, "0", "None"]: + try: + asset_id = int(file.metadata["asset_id"]) + except Exception as e: + logger.exception(e) + return None + return client.assets.retrieve(asset_id) + + +def handle_failed_upload(client: CogniteClient, id: int, error_message: str, data: dict, metadata: dict | None = None): + """Log error message and update a file that has failed.""" + print(error_message) + + client.files.update( + FileMetadataUpdate(id=id) + .labels.remove(data["input_label"]) + .labels.add([data["output_label"], data["failed_label"]]) + .metadata.add( + {"error_message": error_message, **metadata} if metadata is not None else {"error_message": error_message} + ) + ) + + +def handle(data, client): + print("Start extracting data from the IR raw file.") + + if not {"input_label", "output_label", "success_label", "failed_label", "data_set_external_id"} <= data.keys(): + raise RuntimeError( + "Data should contain all keys: 'input_label', 'output_label', 'success_label', 'failed_label', 'data_set_external_id'." + ) + + data_set_id = client.data_sets.retrieve(external_id=data["data_set_external_id"]).id + + files = client.files.list( + labels=LabelFilter(contains_all=[data["input_label"]]), + limit=-1, + uploaded=True, + ) + + print(f"Number of files to process with label: {data['input_label']}: {len(files)}.") + + create_missing_labels(client=client, label_ids=[data["output_label"], data["success_label"], data["failed_label"]]) + + upload_queue = TimeSeriesUploadQueue( + client, + max_upload_interval=1, + create_missing=True, + max_queue_size=100, + ) + + for file in files: + if file.metadata.get("processed") == "false": + print(f"File with external id: {file.external_id} not processed. Skipping.") + continue + + ir_image_filename = "ir_image.jpg" + ir_temperature_filename = "ir_temperatures.csv" + ir_raw_filename = "ir_raw.raw" + + asset = get_asset(client, file) + + with tempfile.TemporaryDirectory(dir="/tmp") as directory: + ir_image_path = str(Path.cwd() / directory / ir_image_filename) + ir_temperature_path = str(Path.cwd() / directory / ir_temperature_filename) + ir_raw_path = str(Path.cwd() / directory / ir_raw_filename) + + # Download raw file to tmp path + client.files.download_to_path(path=ir_raw_path, id=file.id) + + # Extract temperatures from the raw file + temperatures_decikelvin = np.fromfile(file=ir_raw_path, dtype=np.uint16).byteswap() + + # Reshape the raw temperature array + temperatures_decikelvin = temperatures_decikelvin.reshape((IMAGE_HEIGHT, IMAGE_WIDTH)) + + # Convert degrees decikelvin to degrees celsius + temperatures_celsius = ((temperatures_decikelvin) / 10) - 273.15 + + # Save the temperatures to a temp csv file + np.savetxt(ir_temperature_path, temperatures_celsius, delimiter=",") + + # Save the image to the temp path + plt.imsave(ir_image_path, temperatures_celsius) + + # Upload image and temperature data to CDF + try: + res_image = client.files.upload( + path=ir_image_path, + external_id=f"ir_image_{file.name}_{file.external_id}_{file.uploaded_time}", + name=f"ir_image_{file.external_id}.jpg", + data_set_id=data_set_id, + mime_type="image/jpeg", + asset_ids=[asset.id], + metadata={ + "asset_id": file.metadata.get("asset_id", None), + "raw_file_id": file.id, + "raw_file_name": file.name, + }, + ) + file_update = FileMetadataUpdate(id=file.id).metadata.add({"ir_image_id": res_image.id}) + client.files.update(file_update) + + except Exception as e: + handle_failed_upload(client=client, id=file.id, error_message=str(e), data=data, metadata=file.metadata) + continue + + print(f"Uploaded IR image with ID: {res_image.id}.") + + try: + res_csv = client.files.upload( + path=ir_temperature_path, + external_id=f"temperatures_{file.name}_{file.external_id}_{file.uploaded_time}", + name=f"temperatures_{file.external_id}.csv", + data_set_id=data_set_id, + mime_type="text/csv", + asset_ids=[asset.id], + metadata={ + "asset_id": file.metadata.get("asset_id", None), + "raw_file_id": file.id, + "raw_file_name": file.name, + }, + ) + file_update = FileMetadataUpdate(id=file.id).metadata.add({"ir_temp_csv_id": res_csv.id}) + client.files.update(file_update) + + except Exception as e: + handle_failed_upload(client=client, id=file.id, error_message=str(e), data=data, metadata=file.metadata) + continue + + print(f"Uploaded temperature file with ID: {res_csv.id}.") + + # Write the minimum and maximum temperature to the corresponding timeseries + minimum_temperature = np.amin(temperatures_celsius) + maximum_temperature = np.amax(temperatures_celsius) + + # if "ts_external_id" in file.metadata: + if any("ts_external_id" in key for key in file.metadata): + ts_external_ids = list(value for key, value in file.metadata.items() if "ts_external_id" in key) + ts_external_ids = sorted(ts_external_ids) + + timestamp = int(get_timestamp(file)) + + for ts_eid in ts_external_ids: + temp = maximum_temperature if ts_eid.endswith("max") else minimum_temperature + eid = ts_eid + + print(f"Datapoint {temp} at timestamp {timestamp} written to timeseries {ts_eid}.") + + upload_queue.add_to_upload_queue( + datapoints=[(timestamp, temp)], + external_id=eid, + ) + + client.files.update( + FileMetadataUpdate(id=file.id) + .labels.remove(data["input_label"]) + .labels.add([data["output_label"], data["success_label"]]) + ) + + print(f"IR reading completed successfully for file with external id: {file.external_id}, and id: {file.id}.") + + upload_queue.upload() + return {} diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/requirements.txt b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/requirements.txt new file mode 100644 index 00000000..46238a8e --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_get_ir_data_from_ir_raw/requirements.txt @@ -0,0 +1,23 @@ +arrow==1.0.3 +certifi==2023.11.17 +chardet==4.0.0 +cognite-extractor-utils==1.4.2 +cognite-sdk==2.56.1 +dacite==1.8.1 +decorator==4.4.2 +idna==3.7 +matplotlib==3.5.3 +numpy==1.26.4 +oauthlib==3.1.0 +pandas==1.2.3 +prometheus-client==0.9.0 +psutil==5.8.0 +py==1.10.0 +python-dateutil==2.8.1 +pytz==2021.1 +PyYAML==5.4.1 +requests==2.32.0 +requests-oauthlib==1.3.1 +retry==0.9.2 +six==1.15.0 +urllib3==2.6.3 diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/README.md b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/README.md new file mode 100644 index 00000000..f0628da2 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/README.md @@ -0,0 +1,14 @@ +# Three sixty reading + +Set up capabilities for thressixty. + +| Capability type | Action | Scope | Description | +|-----------------|-------------------------------------|----------------|------------------------------------------------------------------------| +| Assets | `assets:read` | Data sets, All | Find asset tags of equipment the robot works with and view asset data. | +| Events | `events:read`, `events:write` | Data sets, All | View events in the canvas. | +| Files | `files:read`, `files:write` | Data sets, All | Allow users to upload images. | +| Projects | `projects:read`, `projects:list` | Data sets, All | Extract the projects the user has access to. | +| Labels | `label:read`, `label:write` | Data sets, All | Extract the projects the user has access to. | +| Robotics | `robotics:read` | Data sets, All | Get 3D alignment of robot. | +| Functions | `functions:write`, `functions:read` | Data sets, All | Create, call and schedule functions. | +| Sessions | `sessions:create` | Data sets, All | Call and schedule functions. | diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/__init__.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/__init__.py new file mode 100644 index 00000000..0dedd18f --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/__init__.py @@ -0,0 +1 @@ +"""Three sixty image processing.""" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/cognite_threesixty_images.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/cognite_threesixty_images.py new file mode 100644 index 00000000..6111c1c7 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/cognite_threesixty_images.py @@ -0,0 +1,284 @@ +"""360 image extractor base class.""" + +import io +import logging +import time +from dataclasses import asdict, dataclass +from enum import Enum +from typing import Any, Union + +import numpy as np +import py360convert +from cognite.client.data_classes import Event, FileMetadata, Label +from PIL import Image + +logger = logging.getLogger(__name__) + +EVENT_TYPE = "scan" +EVENT_SUB_TYPE = "terrestial" +CUBEMAP_RESOLUTION = 2048 + + +@dataclass +class VectorXYZ: + """Vector of floats: (x,y,z).""" + + x: float = 0 + y: float = 0 + z: float = 0 + + def to_string(self) -> str: + """Convert vector so string.""" + return f"{self.x:.4f}, {self.y:.4f}, {self.z:.4f}" + + +def translation_to_mm_str_with_offset(translation: VectorXYZ, translation_offset_mm: VectorXYZ, translation_unit: str): + """Transfrom translation to string in to mm with offset.""" + unit_clean = translation_unit.lower().replace(" ", "") + if unit_clean == "m": + scale = 1000 + elif unit_clean == "cm": + scale = 10 + elif unit_clean == "mm": + scale = 1 + else: + raise ValueError( + f"Translaiton unit not recognized: {translation_unit}. " 'Translation unit should be "m", "cm" or "mm".' + ) + + return VectorXYZ( + x=(translation.x * scale - translation_offset_mm.x), + y=(translation.y * scale - translation_offset_mm.y), + z=(translation.z * scale - translation_offset_mm.z), + ).to_string() + + +def convert_rotation_angle(rotation_angle: str, rotation_angle_unit: str) -> str: + """Check rotation angle unit and convert to radians.""" + if rotation_angle_unit == "deg": + return rotation_angle + elif rotation_angle_unit == "rad": + return str(np.rad2deg(float(rotation_angle))) + else: + raise ValueError( + f"Rotation angle unit not recognized: {rotation_angle_unit}. " + 'Rotation angle unit should be "rad" or "deg".' + ) + + +@dataclass +class ThreesixtyImageMetadata: + """ThreesixtyImage metadata. The metadata of the 360 events.""" + + station_id: str + station_name: str + rotation_angle: str # Format: "14.837" + rotation_axis: str # Format: "0.0990, 0.0113, 0.9950" + translation: str # Format: "343109.0000, 83408.0000, 30860.0000" + timestamp: int # Format: milliseconds since epoch + site_id: str = "" + site_name: str = "" + + +@dataclass +class ThreesixtyImage: + """All information about the station.""" + + station_number: str + tran_unit: str + rot_angle_unit: str + images: dict[str, Union[str, np.ndarray]] + threesixty_image_metadata: ThreesixtyImageMetadata + + +@dataclass +class ImageWithFileMetadata: + """Image with file metadata.""" + + file_metadata: FileMetadata + content: bytes + + +class CogniteThreeSixtyImageExtractor: + """Base class for 360 image extractors. + + 360 images are represented by ThreesixtyImage objects. The extractor use the station objects + to create 360 files and events in CDF. + """ + + def __init__(self, data_set_id: int, mime_type: str = "image/jpeg"): + """Initialize ThreeSixtyImageExtractor.""" + self.data_set_id: int = data_set_id + self.mime_type = mime_type + self.labels: list[Label] = [] + + class Faces(Enum): + left = 0 + front = 1 + right = 2 + back = 3 + top = 4 + bottom = 5 + + def create_threesixty_image( + self, + content: np.ndarray, + site_id: str, + site_name: str, + station_number: Any, + rotation_angle: str, + rotation_axis: VectorXYZ, + rotation_angle_unit: str, + translation: VectorXYZ, + translation_unit: str, + translation_offset_mm: VectorXYZ, + timestamp: int = 0, + ) -> tuple[Event, list[ImageWithFileMetadata]]: + """Append station measurement to station list for truview.""" + if timestamp == 0 or timestamp is None: + timestamp = int(time.time() * 1000) + if not isinstance(timestamp, int): + timestamp = int(timestamp) + station = ThreesixtyImage( + station_number=station_number, + rot_angle_unit="deg", + tran_unit="mm", + images=self._get_cubemap_images(content), + threesixty_image_metadata=ThreesixtyImageMetadata( + site_id=site_id, + site_name=site_name, + station_name=site_name + " " + station_number, + rotation_angle=convert_rotation_angle(rotation_angle, rotation_angle_unit), + rotation_axis=rotation_axis.to_string(), + translation=translation_to_mm_str_with_offset(translation, translation_offset_mm, translation_unit), + station_id=site_id + "-" + station_number, + timestamp=timestamp, + ), + ) + + event = self._create_cdf_events(station) + files = self._create_cdf_files(station) + return event, files + + def _create_cdf_events(self, three_sixty_image: ThreesixtyImage) -> Event: + """Create 360 image eventfrom + + One event per 360 image is created. + """ + logger.info("Create events.") + event = Event( + three_sixty_image.threesixty_image_metadata.station_id + + str(three_sixty_image.threesixty_image_metadata.timestamp) + ) + event.metadata = asdict(three_sixty_image.threesixty_image_metadata) + event.data_set_id = self.data_set_id + event.description = "Scan position " + three_sixty_image.threesixty_image_metadata.station_name + event.type = EVENT_TYPE + event.subtype = EVENT_SUB_TYPE + event.start_time = three_sixty_image.threesixty_image_metadata.timestamp + return event + + def _image_to_byte_array(self, image: Image): + img_bytes = io.BytesIO() + image.save(img_bytes, format="PNG") + img_bytes = img_bytes.getvalue() # type: ignore + return img_bytes + + def _create_cdf_files( + self, three_sixty_image: ThreesixtyImage, resolution: int = 2048 + ) -> list[ImageWithFileMetadata]: + """Create 360 image files from three sixty image. + + Six files per 360 image is created, one file per face. + """ + logger.info("Create 360 files.") + files = [] + if three_sixty_image.threesixty_image_metadata.station_id: + for i, face in enumerate(self.Faces): + file_metadata = FileMetadata( + three_sixty_image.threesixty_image_metadata.station_id + + str(three_sixty_image.threesixty_image_metadata.timestamp) + + "-" + + str(resolution) + + "-" + + face.name + ) + file_metadata.labels = self.labels + metadata = {} + metadata["site_id"] = three_sixty_image.threesixty_image_metadata.site_id + metadata["site_name"] = three_sixty_image.threesixty_image_metadata.site_name + metadata["station_id"] = three_sixty_image.threesixty_image_metadata.station_id + metadata["station_name"] = three_sixty_image.threesixty_image_metadata.station_name + metadata["timestamp"] = str(three_sixty_image.threesixty_image_metadata.timestamp) + metadata["image_type"] = "cubemap" + metadata["image_resolution"] = str(resolution) + metadata["face"] = face.name + metadata["processed"] = "false" + file_metadata.metadata = metadata + file_metadata.name = ( + three_sixty_image.threesixty_image_metadata.station_name + + "-" + + str(three_sixty_image.threesixty_image_metadata.timestamp) # For avoiding duplicate filenames + + "-" + + face.name + + ".jpg" + ) + file_metadata.mime_type = self.mime_type + file_metadata.data_set_id = self.data_set_id + cubemap_img = three_sixty_image.images[face.name] + content = self._image_to_byte_array(Image.fromarray(cubemap_img)) + files.append(ImageWithFileMetadata(content=content, file_metadata=file_metadata)) + else: + logger.error("No station ID found.") + return files + + def _cube_dice2h(self, cube_dice): + w = cube_dice.shape[0] // 3 + assert cube_dice.shape[0] == w * 3 and cube_dice.shape[1] == w * 4 + cube_h = np.zeros((w, w * 6, cube_dice.shape[2]), dtype=cube_dice.dtype) + # Order: F R B L U D + sxy = [(1, 1), (2, 1), (3, 1), (0, 1), (1, 0), (1, 2)] + for i, (sx, sy) in enumerate(sxy): + face = cube_dice[(sy * w) : (sy + 1) * w, (sx * w) : (sx + 1) * w] + cube_h[:, (i * w) : (i + 1) * w] = face + return cube_h + + def _get_cubemap_images(self, content: Union[str, np.ndarray]) -> Union[dict[str, str], dict[str, np.ndarray]]: + """Create cubemap dict from equirectangular image. + + Args: + content: equirectangular + Returns: + cubemaps (dict[str,np.ndarray]: {: image}) + """ + if not isinstance(content, np.ndarray): + logger.error( + f"Unsupported input type: Equirectangular extractor" + f"only supports np.ndarray images. Got type {type(content)}" + ) + raise TypeError( + f"Unsupported input type: Equirectangular extractor " + f"only supports np.ndarray images. Got type {type(content)}" + ) + + cubemaps: dict[str, np.ndarray] = {} + try: + logger.info("Creating cubemap images from equirectangular image.") + im = py360convert.e2c(content, face_w=CUBEMAP_RESOLUTION) + cube_h = self._cube_dice2h(im) + cube_dict = py360convert.cube_h2dict(cube_h) + + # Translate keys from py360convert to TruView naming convention. + dice_map = { + "F": "front", + "R": "right", + "B": "back", + "L": "left", + "U": "top", + "D": "bottom", + } + for key, im in cube_dict.items(): + cubemaps[dice_map[key]] = cube_dict[key] + except Exception as e: + raise Exception(f"Failed to create cubemap image from equirectangular image: {e}.") + return cubemaps diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/handler.py b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/handler.py new file mode 100644 index 00000000..e0e14298 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/handler.py @@ -0,0 +1,257 @@ +"""Gauge reader handler.""" + +import io +import json +import logging +import sys +from typing import Any, Optional + +import numpy as np +from bosdyn.client.math_helpers import Quat, SE3Pose +from cognite.client import CogniteClient, global_config +from cognite.client.data_classes import FileMetadata, FileMetadataList, FileMetadataUpdate, LabelFilter +from cognite.client.exceptions import CogniteDuplicatedError +from cognite_threesixty_images import CogniteThreeSixtyImageExtractor, VectorXYZ +from PIL import Image +from scipy.spatial.transform import Rotation + +logging.basicConfig(stream=sys.stdout, level=logging.INFO, format=logging.BASIC_FORMAT) +logger = logging.getLogger(__name__) +CUBEMAP_RESOLUTION = 1024 +global_config.disable_gzip = True + + +def get_map_transform_from_map(client: CogniteClient, map_external_id: str) -> Optional[dict]: + """Get the transform of a map in the current project based on mission. We asume the frame has the root frame as parent.""" + project = client._config.project + map_request = {"items": [{"externalId": map_external_id}]} + + res = client.post(url=f"/api/v1/projects/{project}/robotics/maps/byids", json=map_request).json() + for map in res["items"]: + frame_external_id = map.get("frameExternalId") + assert frame_external_id, f"Map {map_external_id} does not have a frame associated with it." + # Create mapping + frame_request = {"items": [{"externalId": frame_external_id}]} + + res = client.post( + url=f"/api/v1/projects/{project}/robotics/frames/byids", + json=frame_request, + ).json() + + print(f"going to get frame {frame_external_id} from map {map_external_id}") + + for item in res["items"]: + if item.get("transform"): + print(f"found translation {item.get('transform').get('orientation').get('w')}") + return SE3Pose( + x=item.get("transform").get("translation").get("x"), + y=item.get("transform").get("translation").get("y"), + z=item.get("transform").get("translation").get("z"), + rot=Quat( + w=item.get("transform").get("orientation").get("w"), + x=item.get("transform").get("orientation").get("x"), + y=item.get("transform").get("orientation").get("y"), + z=item.get("transform").get("orientation").get("z"), + ), + ) + return None + + +def convert_metadata_to_se3_pose(external_id: str, metadata: dict[str, Any]) -> Optional[SE3Pose]: + """Convert metadata to SE3Pose.""" + x = metadata.get("waypoint_tform_body_x") + y = metadata.get("waypoint_tform_body_x") + z = metadata.get("waypoint_tform_body_x") + qx = metadata.get("waypoint_tform_body_qx") + qy = metadata.get("waypoint_tform_body_qy") + qz = metadata.get("waypoint_tform_body_qz") + qw = metadata.get("waypoint_tform_body_qw") + if not x or not y or not z or not qx or not qy or not qz or not qw: + logger.error( + f"Failed to process file {external_id}. Missing metadata field. Required metadata fields \ + are waypoint_tform_body_x, waypoint_tform_body_x, waypoint_tform_body_x, waypoint_tform_body_qx, \ + waypoint_tform_body_qy, waypoint_tform_body_qz, waypoint_tform_body_qw. File metadata keys: {metadata.keys()}" + ) + return None + waypoint_tform_body = SE3Pose( + x=float(x), y=float(y), z=float(z), rot=Quat(w=float(qw), x=float(qx), y=float(qy), z=float(qz)) + ) + return waypoint_tform_body + + +def get_waypoint_and_pose( + waypoint_id: str, client: CogniteClient +) -> tuple[Optional[dict[str, Any]], Optional[SE3Pose]]: + """Get a waypoint from the robotics api and return the waypoint and pose.""" + get_waypoints_body = {"items": [{"externalId": waypoint_id}]} + get_waypoints_response = client.post( + f"/api/v1/projects/{client.config.project}/robotics/waypoints/byids", json=get_waypoints_body + ) + waypoint = json.loads(get_waypoints_response.content)["items"] + if len(waypoint) != 1: + logger.error( + f"Failed to process threesixty image. Did not get exactly 1 waypoint with external id {waypoint_id}." + ) + return None, None + waypoint_pos = waypoint[0].get("position") + waypoint_ori = waypoint[0].get("orientation") + ko_tform_waypoint = SE3Pose( + x=waypoint_pos["x"], + y=waypoint_pos["y"], + z=waypoint_pos["z"], + rot=Quat(w=waypoint_ori["w"], x=waypoint_ori["x"], y=waypoint_ori["y"], z=waypoint_ori["z"]), + ) + return waypoint[0], ko_tform_waypoint + + +def create_and_upload_360_files( + cognite_client: CogniteClient, + cognite_threesixty_image_extractor: CogniteThreeSixtyImageExtractor, + robot_pose: SE3Pose, + image: Image, + waypoint: dict[str, Any], + timestamp: int, +): + """Create Cogntie three sixty images.""" + rot = Rotation.from_quat( + [ + robot_pose.rotation.x, + robot_pose.rotation.y, + robot_pose.rotation.z, + robot_pose.rotation.w, + ] + ) + rot_vec = rot.as_rotvec() + rot_angle = np.linalg.norm(rot_vec) + rot_vec = rot_vec / rot_angle + + event, files = cognite_threesixty_image_extractor.create_threesixty_image( + content=np.array(image), + site_id=waypoint.get("mapExternalId", "default_location"), + site_name=waypoint.get("mapExternalId", "default_location"), + station_number=waypoint.get("externalId"), # TODO: make station id more readable + rotation_angle=str(rot_angle), + rotation_axis=VectorXYZ(float(rot_vec[0]), float(rot_vec[1]), float(rot_vec[2])), + rotation_angle_unit="rad", + translation=VectorXYZ(robot_pose.x, robot_pose.y, robot_pose.z), + translation_unit="m", + translation_offset_mm=VectorXYZ(0, 0, 0), + timestamp=timestamp, + ) + logger.info("Created event and files") + + # Upload event + try: + cognite_client.events.create([event]) + except CogniteDuplicatedError: + logger.warning(f"Event with external id {event.external_id} already exists. will update event.") + cognite_client.events.update([event]) + + logger.info(f"Created event in CDF with external id {event.external_id}") + # Upload files + for file in files: + cognite_client.files.upload_bytes( + content=file.content, + name=file.file_metadata.name, + data_set_id=file.file_metadata.data_set_id, + external_id=file.file_metadata.external_id, + source=file.file_metadata.source, + mime_type=file.file_metadata.mime_type, + metadata=file.file_metadata.metadata, + asset_ids=file.file_metadata.asset_ids, + labels=file.file_metadata.labels, + overwrite=True, + ) + logger.info(f"Created file in CDF with external id {file.file_metadata.external_id}") + logger.info("Completed uploading 360 image to CDF.") + + +def process_threesixty_files(files: FileMetadataList, client: CogniteClient, data_set_id: int): + """Process three sixty images.""" + cognite_threesixty_image_extractor = CogniteThreeSixtyImageExtractor(data_set_id=data_set_id) + + file: FileMetadata + for file in files: + try: + # Updating the file immediately so that the same file will not be processed again + client.files.update(FileMetadataUpdate(id=file.id).labels.remove("threesixty")) + + logger.info(f"Processing file with external id {file.external_id}, id {file.id}") + if not file.uploaded: + logger.error(f"file not upload not completed {file.external_id}") + continue + + # Get waypoint id from metadata + waypoint_id = file.metadata.get("waypoint_id") + print(f"Waypoint id: {waypoint_id}") + if not waypoint_id: + client.files.update(FileMetadataUpdate(id=file.id).labels.remove("threesixty")) + logger.error(f"Failed to process file {file.external_id}. No waypoint id in the metadata.") + continue + + # Calculate robot pose + waypoint_tform_body = convert_metadata_to_se3_pose(file.external_id, file.metadata) + if waypoint_tform_body is None: + continue + waypoint, ko_tform_waypoint = get_waypoint_and_pose(waypoint_id=waypoint_id, client=client) + if waypoint_tform_body is None or waypoint is None: + continue + robot_pose = ko_tform_waypoint * waypoint_tform_body + + print(f"waypoint : {waypoint}") + + site_alignement = get_map_transform_from_map( + client=client, map_external_id=str(waypoint.get("mapExternalId")) + ) + + site_pose = site_alignement * robot_pose + + # Download file + image_data = client.files.download_bytes(id=file.id) + try: + image = Image.open(io.BytesIO(image_data)) + except Exception: + logger.error(f"This CDF File does not seem to be an image. File ID: {file.id}") + continue + + # If images don't have a timestamp metadata field, default to the created time of the image file + image_timestamp = file.metadata.get("timestamp") + if image_timestamp is None: + image_timestamp = file.created_time + + # Create and upload 360 files + create_and_upload_360_files( + cognite_client=client, + cognite_threesixty_image_extractor=cognite_threesixty_image_extractor, + robot_pose=site_pose, + image=image, + waypoint=waypoint, + timestamp=image_timestamp, + ) + except Exception as e: + client.files.update(FileMetadataUpdate(id=file.id).labels.add("threesixty")) + logger.error(f"Failed to process file {file}. Error: {e}") + + +def handle(data, client): + """Three sixty image handle. .""" + logger.info("Start three sixty processing.") + + # Check that input contains data_set_id + if "data_set_external_id" not in data.keys(): + raise RuntimeError("Data should contain all keys: data_set_id") + data_set_id = client.data_sets.retrieve(external_id=data["data_set_external_id"]).id + + # Get all 360 images in the data set id with the label "threesixty" + # Changed default limit to 1 to process 1 file at a time as the upload_queue in cognite_threesixty_image uploads the whole queue + # on every file but after the first cycle fails as the first event is duplicated and the whole queue upload fails + files: FileMetadataList = client.files.list( + labels=LabelFilter(contains_all=["threesixty"]), + limit=25, + data_set_ids=[data_set_id], + uploaded=True, + ) + logger.info(f"Processing {len(files)} threesixty files.") + # Process three sixty files + process_threesixty_files(files=files, client=client, data_set_id=data_set_id) + return {} diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/requirements.txt b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/requirements.txt new file mode 100644 index 00000000..373de041 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/fn_threesixty/requirements.txt @@ -0,0 +1,7 @@ +bosdyn-client==3.3.2 +cognite-sdk==5.* +Pillow==12.1.1 +py360convert==0.1.0 +scipy==1.10.0 +six==1.16.0 +numpy==1.26.4 diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/robots.functions.Function.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/functions/robots.functions.Function.yaml new file mode 100644 index 00000000..6f53a76b --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/robots.functions.Function.yaml @@ -0,0 +1,51 @@ +- name: "Contextualize robot data" + externalId: "fn_contextualize_robot_data" + owner: "Robotics team" + description: "Contextualize data uploaded to CDF from robots." + envVars: + # The two environment variables below are set by the Toolkit + ENV_TYPE: "${CDF_BUILD_TYPE}" + CDF_ENV: "${CDF_ENVIRON}" + runtime: "py39" + functionPath: "./handler.py" + # Data set id for the zip file with the code that is uploaded. + dataSetExternalId: "{{ robot_1_dataset_ext_id }}" + +- name: Gauge reading + externalId: "fn_gauge_reading" + owner: "Robotics team" + description: "Reads the gauge data from the robot." + envVars: + # The two environment variables below are set by the Toolkit + ENV_TYPE: "${CDF_BUILD_TYPE}" + CDF_ENV: "${CDF_ENVIRON}" + runtime: "py39" + functionPath: "./handler.py" + # Data set id for the zip file with the code that is uploaded. + dataSetExternalId: "{{ robot_1_dataset_ext_id }}" + +- name: Get IR data From IR raw + externalId: "fn_get_ir_data_from_ir_raw" + owner: "Robotics team" + description: "Extracts the IR data from the raw IR info." + envVars: + # The two environment variables below are set by the Toolkit + ENV_TYPE: "${CDF_BUILD_TYPE}" + CDF_ENV: "${CDF_ENVIRON}" + runtime: "py39" + functionPath: "./handler.py" + # Data set id for the zip file with the code that is uploaded. + dataSetExternalId: "{{ robot_1_dataset_ext_id }}" + +- name: Process 360 + externalId: "fn_threesixty" + owner: "Robotics team" + description: "Process 360 images into streetview" + envVars: + # The two environment variables below are set by the Toolkit + ENV_TYPE: "${CDF_BUILD_TYPE}" + CDF_ENV: "${CDF_ENVIRON}" + runtime: "py39" + functionPath: "./handler.py" + # Data set id for the zip file with the code that is uploaded. + dataSetExternalId: "{{ robot_1_dataset_ext_id }}" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/functions/schedules.Schedule.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/functions/schedules.Schedule.yaml new file mode 100644 index 00000000..a783a348 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/functions/schedules.Schedule.yaml @@ -0,0 +1,94 @@ +- name: "contextualize_robot_data" + functionExternalId: "fn_contextualize_robot_data" + description: "Contextualizes the robot data and adds appropriate labels" + cronExpression: "* * * * *" + data: + gauge_context_label: robot_gauge + read_dial_gauge_label: read_dial_gauge + read_multiple_dial_gauges_label: read_multiple_dial_gauges + read_digital_gauge_label: read_digital_gauge + read_level_gauge_label: read_level_gauge + read_valve_label: read_valve + read_ir_raw_label: read_ir + spill_detection_label: unprocessed_spill_detection + data_set_external_id: "{{robot_1_dataset_ext_id}}" + authentication: + clientId: "{{ run_function_client_id }}" + clientSecret: "{{ run_function_secret }}" + +- name: "read_dial_gauge" + functionExternalId: "fn_gauge_reading" + description: "Reads the dial gauge data from the robot" + cronExpression: "* * * * *" + data: + gauge_type: dial # The gauge type to use in the API call. Currently, "analog", "digital" and "level" is supported. + input_label: read_dial_gauge # Label to list files by + output_label: gauge_reading # Label that is added to all files that the function has run on. + success_label: SUCCESS + failed_label: FAILED + authentication: + clientId: "{{ run_function_client_id }}" + clientSecret: "{{ run_function_secret }}" + +- name: read_level_gauge + functionExternalId: "fn_gauge_reading" + description: "Reads the level gauge data from the robot" + cronExpression: "* * * * *" + data: + gauge_type: level # The gauge type to use in the API call. Currently, "analog", "digital" and "level" is supported. + input_label: read_level_gauge # Label to list files by + output_label: gauge_reading # Label that is added to all files that the function has run on. + success_label: SUCCESS + failed_label: FAILED + authentication: + clientId: "{{ run_function_client_id }}" + clientSecret: "{{ run_function_secret }}" + +- name: read_digital_gauge + functionExternalId: "fn_gauge_reading" + cronExpression: "* * * * *" + data: + gauge_type: digital # The gauge type to use in the API call. Currently, "analog", "digital" and "level" is supported. + input_label: read_digital_gauge # Label to list files by + output_label: gauge_reading # Label that is added to all files that the function has run on. + success_label: SUCCESS + failed_label: FAILED + authentication: + clientId: "{{ run_function_client_id }}" + clientSecret: "{{ run_function_secret }}" + +- name: read_valve + functionExternalId: "fn_gauge_reading" + description: "Reads the valve data from the robot" + cronExpression: "* * * * *" + data: + gauge_type: valve # The gauge type to use in the API call. Currently, "analog", "digital" and "level" is supported. + input_label: read_valve # Label to list files by + output_label: gauge_reading # Label that is added to all files that the function has run on. + success_label: SUCCESS + failed_label: FAILED + authentication: + clientId: "{{ run_function_client_id }}" + clientSecret: "{{ run_function_secret }}" + +- name: get_ir_data + functionExternalId: "fn_get_ir_data_from_ir_raw" + cronExpression: "* * * * *" + data: + input_label: read_ir # Label to list files by + output_label: ir_finished # Label that is added to all files that the function has run on + success_label: SUCCESS_IR + failed_label: FAILED_IR + data_set_external_id: "{{robot_1_dataset_ext_id}}" + authentication: + clientId: "{{ run_function_client_id }}" + clientSecret: "{{ run_function_secret }}" + +- name: threesixty + functionExternalId: "fn_threesixty" + cronExpression: "* * * * *" + data: + data_set_external_id: "{{robot_1_dataset_ext_id}}" + authentication: + clientId: "{{ run_function_client_id }}" + clientSecret: "{{ run_function_secret }}" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/module.toml b/modules/accelerators/inrobot/cdf_inrobot_common/module.toml new file mode 100644 index 00000000..c8c87811 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/module.toml @@ -0,0 +1,5 @@ +[module] +title = "InRobot Common" +is_selected_by_default = true +id = "CDF InRobot Common" +package_id = "dp:inrobot" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/acoustic_video.RobotCapability.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/acoustic_video.RobotCapability.yaml new file mode 100644 index 00000000..099e1e9f --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/acoustic_video.RobotCapability.yaml @@ -0,0 +1,72 @@ +name: Acoustic video recording +externalId: acoustic_video +method: acoustic_video +description: Acoustic video recording +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/capabilities/acoustic_video + title: Acoustic video recording input + type: object + additionalProperties: false + properties: + method: + type: string + parameters: + type: object + properties: + duration: + type: number + maximum: 120.0 + minimum: 0.0 + frequencyFrom: + type: number + maximum: 42000.0 + minimum: 0.0 + frequencyRange: + type: number + maximum: 8000.0 + minimum: 2000.0 + opacity: + type: number + maximum: 100.0 + minimum: 0.0 + threshold: + type: number + maximum: 100.0 + minimum: 0.0 + required: + - duration + - frequencyFrom + - frequencyRange + required: + - method + - parameters +dataHandlingSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_handling/acoustic_video + type: object + properties: + uploadInstructions: + type: object + properties: + video: + type: object + properties: + method: + const: uploadFile + type: string + parameters: + type: object + properties: + filenamePrefix: + type: string + required: + - filenamePrefix + required: + - method + - parameters + required: + - video + required: + - uploadInstructions + additionalProperties: false diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/process_threesixty.DataPostProcessing.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/process_threesixty.DataPostProcessing.yaml new file mode 100644 index 00000000..04816464 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/process_threesixty.DataPostProcessing.yaml @@ -0,0 +1,23 @@ +method: process_threesixty +name: Process a 360 image +externalId: process_threesixty +description: Process a 360 image into a panoramic view +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_postprocessing/process_threesixty + title: Process threesixty input + type: object + properties: + image: + type: object + properties: + method: + type: string + parameters: + type: object + properties: {} + required: + - method + - parameters + additionalProperties: false + additionalProperties: false diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/pt_ir_video.RobotCapability.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/pt_ir_video.RobotCapability.yaml new file mode 100644 index 00000000..1bcc1d82 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/pt_ir_video.RobotCapability.yaml @@ -0,0 +1,64 @@ +name: PT ir video recording +externalId: pt_ir_video +method: pt_ir_video +description: Pan, tilt, thermal camera for video recording +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: false + id: robotics/schemas/0.1.0/capabilities/pt_ir_video + properties: + method: + type: string + parameters: + properties: + duration: + maximum: 120.0 + minimum: 0.0 + type: number + pan: + maximum: 180.0 + minimum: -180.0 + type: number + tilt: + maximum: 90.0 + minimum: -90.0 + type: number + zoom: + maximum: 100.0 + minimum: 0.0 + type: number + required: + - pan + - tilt + - duration + type: object + required: + - method + - parameters + title: Pan tilt thermal video recording input + type: object +dataHandlingSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_handling/pt_ir_video + properties: + uploadInstructions: + type: object + additionalProperties: false + properties: + video: + type: object + additionalProperties: false + properties: + method: + const: uploadFile + type: string + parameters: + type: object + properties: + filenamePrefix: + type: string + required: + - filenamePrefix + required: + - uploadInstructions + type: object diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz.RobotCapability.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz.RobotCapability.yaml new file mode 100644 index 00000000..1c4e8012 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz.RobotCapability.yaml @@ -0,0 +1,63 @@ +name: PTZ camera +externalId: ptz +method: ptz +description: Pan, tilt, zoom camera for image capture. +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: false + id: robotics/schemas/0.1.0/capabilities/ptz + properties: + method: + type: string + parameters: + type: object + properties: + pan: + maximum: 180.0 + minimum: -180.0 + type: number + tilt: + maximum: 90.0 + minimum: -90.0 + type: number + zoom: + maximum: 100.0 + minimum: 0.0 + type: number + required: + - pan + - tilt + - zoom + required: + - method + - parameters + title: PTZ camera input + type: object +dataHandlingSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_handling/ptz + properties: + uploadInstructions: + type: object + additionalProperties: false + properties: + image: + type: object + additionalProperties: false + properties: + method: + const: uploadFile + type: string + parameters: + type: object + properties: + filenamePrefix: + type: string + required: + - filenamePrefix + required: + - method + - parameters + required: + - uploadInstructions + type: object diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz_ir.RobotCapability.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz_ir.RobotCapability.yaml new file mode 100644 index 00000000..624975db --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz_ir.RobotCapability.yaml @@ -0,0 +1,80 @@ +name: PTZ thermal camera +externalId: ptz_ir +method: ptz_ir +description: Pan, tilt, zoom camera for thermal image capture. +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: false + id: robotics/schemas/0.1.0/capabilities/ptz_ir + properties: + method: + type: string + parameters: + type: object + properties: + pan: + maximum: 180.0 + minimum: -180.0 + type: number + tilt: + maximum: 90.0 + minimum: -90.0 + type: number + zoom: + maximum: 100.0 + minimum: 0.0 + type: number + required: + - pan + - tilt + - zoom + required: + - method + - parameters + title: PTZ thermal camera input + type: object +dataHandlingSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_handling/ptz_ir + properties: + uploadInstructions: + type: object + additionalProperties: false + properties: + image: + type: object + additionalProperties: false + properties: + method: + const: uploadFile + type: string + parameters: + type: object + properties: + filenamePrefix: + type: string + required: + - filenamePrefix + required: + - method + - parameters + raw: + type: object + additionalProperties: false + properties: + method: + const: uploadFile + type: string + parameters: + type: object + properties: + filenamePrefix: + type: string + required: + - filenamePrefix + required: + - method + - parameters + required: + - uploadInstructions + type: object diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz_video.RobotCapability.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz_video.RobotCapability.yaml new file mode 100644 index 00000000..6eecc7bc --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/ptz_video.RobotCapability.yaml @@ -0,0 +1,68 @@ +name: PTZ video recording +externalId: ptz_video +method: ptz_video +description: Pan, tilt, zoom camera for video recording +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: false + id: robotics/schemas/0.1.0/capabilities/ptz_video + properties: + method: + type: string + parameters: + type: object + properties: + duration: + maximum: 120.0 + minimum: 0.0 + type: number + pan: + maximum: 180.0 + minimum: -180.0 + type: number + tilt: + maximum: 90.0 + minimum: -90.0 + type: number + zoom: + maximum: 100.0 + minimum: 0.0 + type: number + required: + - pan + - tilt + - zoom + - duration + required: + - method + - parameters + title: PTZ video recording input + type: object +dataHandlingSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_handling/ptz_video + properties: + uploadInstructions: + type: object + additionalProperties: false + properties: + video: + type: object + additionalProperties: false + properties: + method: + const: uploadFile + type: string + parameters: + type: object + properties: + filenamePrefix: + type: string + required: + - filenamePrefix + required: + - method + - parameters + required: + - uploadInstructions + type: object diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_dial_gauge.DataPostProcessing.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_dial_gauge.DataPostProcessing.yaml new file mode 100644 index 00000000..74a2c8c0 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_dial_gauge.DataPostProcessing.yaml @@ -0,0 +1,31 @@ +method: read_dial_gauge +name: Read dial gauge +externalId: read_dial_gauge +description: Read dial gauge from an image using Cognite Vision gauge reader +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_postprocessing/read_dial_gauge + title: Read dial gauge input + type: object + properties: + image: + type: object + properties: + method: + type: string + parameters: + type: object + properties: + unit: + type: string + deadAngle: + type: number + minLevel: + type: number + maxLevel: + type: number + required: + - method + - parameters + additionalProperties: false + additionalProperties: false diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_digital_gauge.DataPostProcessing.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_digital_gauge.DataPostProcessing.yaml new file mode 100644 index 00000000..d104e392 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_digital_gauge.DataPostProcessing.yaml @@ -0,0 +1,35 @@ +method: read_digital_gauge +name: Read digital gauge +externalId: read_digital_gauge +description: Read digital gauge from an image using Cognite Vision gauge reader +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_postprocessing/read_digital_gauge + title: Read digital gauge input + type: object + properties: + image: + type: object + properties: + method: + type: string + parameters: + type: object + properties: + unit: + type: string + minLevel: + type: number + maxLevel: + type: number + minNumDigits: + type: integer + maxNumDigits: + type: integer + commaPos: + type: integer + required: + - method + - parameters + additionalProperties: false + additionalProperties: false diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_level_gauge.DataPostProcessing.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_level_gauge.DataPostProcessing.yaml new file mode 100644 index 00000000..9f25b660 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_level_gauge.DataPostProcessing.yaml @@ -0,0 +1,29 @@ +method: read_level_gauge +name: Read level gauge +externalId: read_level_gauge +description: Read level gauge from an image using Cognite Vision gauge reader +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_postprocessing/read_level_gauge + title: Read level gauge input + type: object + properties: + image: + type: object + properties: + method: + type: string + parameters: + type: object + properties: + unit: + type: string + minLevel: + type: number + maxLevel: + type: number + required: + - method + - parameters + additionalProperties: false + additionalProperties: false diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_valve.DataPostProcessing.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_valve.DataPostProcessing.yaml new file mode 100644 index 00000000..bf8aa761 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/read_valve.DataPostProcessing.yaml @@ -0,0 +1,23 @@ +method: read_valve +name: Read valve state +externalId: read_valve +description: Read valve state from an image using Cognite Vision valve reader +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_postprocessing/read_valve + title: Read valve state input + type: object + properties: + image: + type: object + properties: + method: + type: string + parameters: + type: object + properties: {} + required: + - method + - parameters + additionalProperties: false + additionalProperties: false diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/threesixty.RobotCapability.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/threesixty.RobotCapability.yaml new file mode 100644 index 00000000..95c34657 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/threesixty.RobotCapability.yaml @@ -0,0 +1,47 @@ +name: 360 degree camera +externalId: threesixty +method: threesixty +description: Panoramic 360 degree image capture. +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: false + id: robotics/schemas/0.1.0/capabilities/threesixty + properties: + method: + type: string + parameters: + type: object + properties: {} + required: + - method + - parameters + title: 360 camera input + type: object +dataHandlingSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_handling/threesixty + properties: + uploadInstructions: + type: object + additionalProperties: false + properties: + image: + type: object + additionalProperties: false + properties: + method: + const: uploadFile + type: string + parameters: + type: object + properties: + filenamePrefix: + type: string + required: + - filenamePrefix + required: + - method + - parameters + required: + - uploadInstructions + type: object diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/robotics/threesixty_video.RobotCapability.yaml b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/threesixty_video.RobotCapability.yaml new file mode 100644 index 00000000..94b2be71 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_common/robotics/threesixty_video.RobotCapability.yaml @@ -0,0 +1,47 @@ +name: 360 degree video +externalId: threesixty_video +method: threesixty_video +description: Panoramic 360 degree video recording. +inputSchema: + $schema: http://json-schema.org/draft-07/schema# + additionalProperties: false + id: robotics/schemas/0.1.0/capabilities/threesixty_video + properties: + method: + type: string + parameters: + type: object + properties: {} + required: + - method + - parameters + title: 360 video input + type: object +dataHandlingSchema: + $schema: http://json-schema.org/draft-07/schema# + id: robotics/schemas/0.1.0/data_handling/threesixty_video + properties: + uploadInstructions: + type: object + additionalProperties: false + properties: + video: + type: object + additionalProperties: false + properties: + method: + const: uploadFile + type: string + parameters: + type: object + properties: + filenamePrefix: + type: string + required: + - filenamePrefix + required: + - method + - parameters + required: + - uploadInstructions + type: object diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/README.md b/modules/accelerators/inrobot/cdf_inrobot_location/README.md new file mode 100644 index 00000000..734f6231 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/README.md @@ -0,0 +1,33 @@ +# cdf_inrobot_location + +This module contains location specific configurations for InRobot. This is the default location. +To support multiple locations, copy this module and modify the configurations. Remember to +rename the module name to e.g. `inrobot_location_`. + +## Auth + +The module creates three groups that need three matching groups in the identity provider that the CDF +project is configured with. The groups are: + +- Admin role. This role has access to create 3D models, create assets, create new video rooms, etc. +- User role. This is the standard role for most users. These users can interact with the robot and see all data + associated with the robot. +- A robot user role - this is given to the robot and includes the ability to create labels, write to files, write to + FDM (checklists, checklist items). Any new robot in a given location must have a new user group. Similarly, + the same robot in a new location must have a new user group. + +All the users read from robot-specific data sets. This means that when a new robot is added, the dataset scopes +for the users must be updated as well. + +The source ids from the groups in the identity provider should be set in [./default.config.yaml](default.config.yaml). + +## Data models + +There are two spaces created in this module: one space for InRobot to store app data and one space for +data from source systems, like assets, activities/work orders etc. + +## Robotics + +Each location must have three associated robotics-specific resources created: a Map, a Frame, and a Location. These are +robotics-api specific concepts and are required for the robot to understand its environment. These require a threeD +model name, type (THREEDMODEL or POINTCLOUD) revisionId, and modelId in addition to the root asset external id. diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/auth/inrobot-admin.Group.yaml b/modules/accelerators/inrobot/cdf_inrobot_location/auth/inrobot-admin.Group.yaml new file mode 100644 index 00000000..21cf6730 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/auth/inrobot-admin.Group.yaml @@ -0,0 +1,107 @@ +name: "gp_InRobot_Admin_{{first_location}}" +sourceId: "{{inrobot_admin_first_location_source_id}}" +metadata: + origin: "cdf-project-templates" +capabilities: + - assetsAcl: + actions: + - READ + - WRITE + scope: + all: {} + - dataModelsAcl: + actions: + - READ + - WRITE + scope: + spaceIdScope: + spaceIds: + - "APM_Config" + - "cdf_core" + - "cdf_apm" + - "cdf_infield" + - "cdf_apps_shared" + - dataModelInstancesAcl: + actions: + - READ + - WRITE + - WRITE_PROPERTIES + scope: + spaceIdScope: + spaceIds: + - "cdf_apm" + - "cognite_app_data" + - "sp_{{first_location}}_source_data" + - "sp_{{first_location}}_app_data" + - eventsAcl: + actions: + - READ + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - filesAcl: + actions: + - WRITE + - READ + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - groupsAcl: + actions: + - CREATE + - READ + - UPDATE + - LIST + - DELETE + scope: + all: {} + - threedAcl: + actions: + - READ + - CREATE + - UPDATE + - DELETE + scope: + all: {} + - projectsAcl: + actions: + - READ + - LIST + scope: + all: {} + - roboticsAcl: + actions: + - READ + - CREATE + - UPDATE + - DELETE + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - timeSeriesAcl: + actions: + - READ + scope: + all: {} + - functionsAcl: + actions: + - READ + - WRITE + scope: + all: {} + - videoStreamingAcl: + actions: + - READ + - SUBSCRIBE + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - videoStreamingAcl: + actions: + - WRITE + scope: + all: {} diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/auth/inrobot-users.Group.yaml b/modules/accelerators/inrobot/cdf_inrobot_location/auth/inrobot-users.Group.yaml new file mode 100644 index 00000000..765c9b48 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/auth/inrobot-users.Group.yaml @@ -0,0 +1,94 @@ +name: "gp_InRobot_Users_{{first_location}}" +sourceId: "{{inrobot_users_first_location_source_id}}" +metadata: + origin: "cdf-project-templates" +capabilities: + - assetsAcl: + actions: + - READ + scope: + all: {} + - dataModelsAcl: + actions: + - READ + scope: + spaceIdScope: + spaceIds: + - "APM_Config" + - "cdf_apm" + - "cdf_infield" # for user info + - "cdf_core" + - "cdf_apps_shared" + + - dataModelInstancesAcl: + actions: + - READ + scope: + spaceIdScope: + spaceIds: + - "APM_Config" + - "cdf_apm" + - "cognite_app_data" + - "sp_{{first_location}}_source_data" + - "sp_{{first_location}}_app_data" + - dataModelInstancesAcl: + actions: + - WRITE + scope: + spaceIdScope: + spaceIds: + - "cognite_app_data" # This space stores user profile info + - eventsAcl: + actions: + - READ + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - filesAcl: + actions: + - WRITE + - READ + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - groupsAcl: + actions: + - READ + scope: + all: {} + - threedAcl: + actions: + - READ + scope: + all: {} + - projectsAcl: + actions: + - READ + - LIST + scope: + all: {} + - roboticsAcl: + actions: + - READ + - CREATE + - UPDATE + - DELETE + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - timeSeriesAcl: + actions: + - READ + scope: + all: {} + - videoStreamingAcl: + actions: + - READ + - SUBSCRIBE + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/auth/robot-1.Group.yaml b/modules/accelerators/inrobot/cdf_inrobot_location/auth/robot-1.Group.yaml new file mode 100644 index 00000000..74613b60 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/auth/robot-1.Group.yaml @@ -0,0 +1,77 @@ +name: "gp_Robot_{{first_location}}" +sourceId: "{{robot_1_first_location_source_id}}" +metadata: + origin: "cdf-project-templates" +capabilities: + - assetsAcl: + actions: + - READ + scope: + all: {} + - dataModelsAcl: + actions: + - READ + - WRITE + scope: + spaceIdScope: + spaceIds: + - "APM_Config" + - "cdf_core" + - "cdf_apm" + - "cdf_apps_shared" + - dataModelInstancesAcl: + actions: + - READ + scope: + spaceIdScope: + spaceIds: + - "APM_Config" + - "cognite_app_data" + - "cdf_apm" + - "sp_{{first_location}}_source_data" + - "sp_{{first_location}}_app_data" + - dataModelInstancesAcl: + actions: + - WRITE + scope: + spaceIdScope: + spaceIds: + - "cognite_app_data" + - "cdf_apm" + - "sp_{{first_location}}_source_data" + - "sp_{{first_location}}_app_data" + - filesAcl: + actions: + - READ + scope: + all: {} + - filesAcl: + actions: + - WRITE + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - labelsAcl: + actions: + - READ + - WRITE + scope: + all: {} + - roboticsAcl: + actions: + - READ + - CREATE + - UPDATE + - DELETE + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" + - videoStreamingAcl: + actions: + - PUBLISH + scope: + datasetScope: + ids: + - "{{ robot_1_dataset_ext_id }}" diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/data_models/locationAppData.space.yaml b/modules/accelerators/inrobot/cdf_inrobot_location/data_models/locationAppData.space.yaml new file mode 100644 index 00000000..bbeb5b92 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/data_models/locationAppData.space.yaml @@ -0,0 +1,3 @@ +space: sp_{{first_location}}_app_data +name: sp:inrobot:{{first_location}}:app_data +description: Space for {{first_location}} App Data diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/data_models/locationSourceData.space.yaml b/modules/accelerators/inrobot/cdf_inrobot_location/data_models/locationSourceData.space.yaml new file mode 100644 index 00000000..ac188818 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/data_models/locationSourceData.space.yaml @@ -0,0 +1,3 @@ +space: sp_{{ first_location}}_source_data +name: sp:inrobot:{{ first_location}}:source +description: Space for InRobot {{first_location}} Source Data diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/default.config.yaml b/modules/accelerators/inrobot/cdf_inrobot_location/default.config.yaml new file mode 100644 index 00000000..d2417086 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/default.config.yaml @@ -0,0 +1,7 @@ +inrobot_admin_first_location_source_id: +inrobot_users_first_location_source_id: +robot_1_first_location_source_id: +three_d_model_name: +three_d_type: +three_d_model_id: +three_d_revision_id: diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/module.toml b/modules/accelerators/inrobot/cdf_inrobot_location/module.toml new file mode 100644 index 00000000..4c9d9c3e --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/module.toml @@ -0,0 +1,5 @@ +[module] +title = "InRobot Location" +is_selected_by_default = true +id = "CDF InRobot Location" +package_id = "dp:inrobot" \ No newline at end of file diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Frame.yaml b/modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Frame.yaml new file mode 100644 index 00000000..81a335c1 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Frame.yaml @@ -0,0 +1,15 @@ +- name: Root frame at the origin of location {{ first_root_asset_external_id }} + externalId: {{ first_root_asset_external_id }} +- name: Frame {{ three_d_model_name }} + externalId: frame_{{ three_d_model_name }} + transform: + parentFrameExternalId: {{ first_root_asset_external_id }} + translation: + x: 0.0 + y: 0.0 + z: 0.0 + orientation: + x: 0.0 + y: 0.0 + z: 0.0 + w: 1.0 diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Location.yaml b/modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Location.yaml new file mode 100644 index 00000000..95bbd229 --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Location.yaml @@ -0,0 +1,3 @@ +name: {{ first_root_asset_external_id }} +externalId: {{ first_root_asset_external_id }} +description: Robot location diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Map.yaml b/modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Map.yaml new file mode 100644 index 00000000..4b287e9b --- /dev/null +++ b/modules/accelerators/inrobot/cdf_inrobot_location/robotics/root.Map.yaml @@ -0,0 +1,10 @@ +name: {{ three_d_model_name }} +externalId: {{ three_d_model_name }} +description: {{ three_d_type }} {{ three_d_model_name }} +mapType: {{ three_d_type }} +frameExternalId: frame_{{ three_d_model_name }} +data: + modelId: {{ three_d_model_id }} + revisionId: {{ three_d_revision_id }} +locationExternalId: "{{ first_root_asset_external_id }}" +scale: 1.0 From 3d8ab30557fe48e8f3ac146cc8e1a5c6e09a456c Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Fri, 27 Mar 2026 12:50:46 +0530 Subject: [PATCH 09/12] updated package.toml file --- .../module.toml | 4 +- .../module.toml | 4 +- .../industrial_tools/cdf_search/module.toml | 2 +- .../inrobot/cdf_inrobot_common/module.toml | 2 +- .../inrobot/cdf_inrobot_location/module.toml | 2 +- modules/bootcamp/ice_cream_api/module.toml | 2 +- modules/bootcamp/module.toml | 5 -- modules/bootcamp/use_cases/oee/module.toml | 2 +- .../common/cdf_auth_readwrite_all/module.toml | 2 +- modules/custom/my_module/module.toml | 2 +- modules/packages.toml | 53 +++++++++++++++++++ 11 files changed, 64 insertions(+), 16 deletions(-) delete mode 100644 modules/bootcamp/module.toml diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/module.toml b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/module.toml index fd23807f..6e9e7069 100644 --- a/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/module.toml +++ b/modules/accelerators/industrial_tools/cdf_location_filter_asset_centric/module.toml @@ -1,4 +1,4 @@ [module] title = "Example location filter asset centric" -id = "CDF Location Filter Asset Centric" -package_id = "dp:accelerators" \ No newline at end of file +id = "dp:acc:industrial_tools:cdf_location_filter_asset_centric" +package_id = "dp:industrial_tools" \ No newline at end of file diff --git a/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/module.toml b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/module.toml index 06d57a46..376c0642 100644 --- a/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/module.toml +++ b/modules/accelerators/industrial_tools/cdf_location_filter_datamodel_based/module.toml @@ -1,4 +1,4 @@ [module] title = "Example location filter datamodel based" -id = "cdf_location_filter_datamodel_based" -package_id = "dp:accelerators" \ No newline at end of file +id = "dp:acc:industrial_tools:cdf_location_filter_datamodel_based" +package_id = "dp:industrial_tools" \ No newline at end of file diff --git a/modules/accelerators/industrial_tools/cdf_search/module.toml b/modules/accelerators/industrial_tools/cdf_search/module.toml index 0a97e7de..9f4b8398 100644 --- a/modules/accelerators/industrial_tools/cdf_search/module.toml +++ b/modules/accelerators/industrial_tools/cdf_search/module.toml @@ -2,4 +2,4 @@ title = "Search configuration with location filter" is_selected_by_default = false id = "dp:acc:industrial_tools:cdf_search" -package_id = "dp:accelerators" +package_id = "dp:industrial_tools" diff --git a/modules/accelerators/inrobot/cdf_inrobot_common/module.toml b/modules/accelerators/inrobot/cdf_inrobot_common/module.toml index c8c87811..73f25310 100644 --- a/modules/accelerators/inrobot/cdf_inrobot_common/module.toml +++ b/modules/accelerators/inrobot/cdf_inrobot_common/module.toml @@ -1,5 +1,5 @@ [module] title = "InRobot Common" is_selected_by_default = true -id = "CDF InRobot Common" +id = "dp:acc:inrobot:cdf_inrobot_common" package_id = "dp:inrobot" diff --git a/modules/accelerators/inrobot/cdf_inrobot_location/module.toml b/modules/accelerators/inrobot/cdf_inrobot_location/module.toml index 4c9d9c3e..ee31fb5f 100644 --- a/modules/accelerators/inrobot/cdf_inrobot_location/module.toml +++ b/modules/accelerators/inrobot/cdf_inrobot_location/module.toml @@ -1,5 +1,5 @@ [module] title = "InRobot Location" is_selected_by_default = true -id = "CDF InRobot Location" +id = "dp:acc:inrobot:cdf_inrobot_location" package_id = "dp:inrobot" \ No newline at end of file diff --git a/modules/bootcamp/ice_cream_api/module.toml b/modules/bootcamp/ice_cream_api/module.toml index 0ddd40a6..6a8c107e 100644 --- a/modules/bootcamp/ice_cream_api/module.toml +++ b/modules/bootcamp/ice_cream_api/module.toml @@ -1,5 +1,5 @@ [module] title = "Bootcamp" is_selected_by_default = true -id = "bootcamp_ice_cream_api" +id = "dp:bootcamp:ice_cream_api" package_id = "dp:bootcamp" \ No newline at end of file diff --git a/modules/bootcamp/module.toml b/modules/bootcamp/module.toml deleted file mode 100644 index 80065199..00000000 --- a/modules/bootcamp/module.toml +++ /dev/null @@ -1,5 +0,0 @@ -[module] -title = "Bootcamp" -is_selected_by_default = false -id = "bootcamp" -package_id = "dp:bootcamp" \ No newline at end of file diff --git a/modules/bootcamp/use_cases/oee/module.toml b/modules/bootcamp/use_cases/oee/module.toml index 4dc7df4a..13dfd008 100644 --- a/modules/bootcamp/use_cases/oee/module.toml +++ b/modules/bootcamp/use_cases/oee/module.toml @@ -1,5 +1,5 @@ [module] title = "Bootcamp" is_selected_by_default = true -id = "bootcamp_oee" +id = "dp:bootcamp:use_cases:oee" package_id = "dp:bootcamp" \ No newline at end of file diff --git a/modules/common/cdf_auth_readwrite_all/module.toml b/modules/common/cdf_auth_readwrite_all/module.toml index a1768ff7..eef82339 100644 --- a/modules/common/cdf_auth_readwrite_all/module.toml +++ b/modules/common/cdf_auth_readwrite_all/module.toml @@ -1,4 +1,4 @@ [module] title = "Admin group for CI/CD" -id = "cdf_auth_readwrite_all" +id = "dp:common:cdf_auth_readwrite_all" package_id = "dp:common" \ No newline at end of file diff --git a/modules/custom/my_module/module.toml b/modules/custom/my_module/module.toml index 378157ad..5ce057e6 100644 --- a/modules/custom/my_module/module.toml +++ b/modules/custom/my_module/module.toml @@ -1,4 +1,4 @@ [module] title = "Empty module" -id = "my_module" +id = "dp:custom:my_module" package_id = "dp:custom" \ No newline at end of file diff --git a/modules/packages.toml b/modules/packages.toml index 468e741e..f9e86e67 100644 --- a/modules/packages.toml +++ b/modules/packages.toml @@ -35,8 +35,12 @@ modules = [ "models/rmdm_v1", "models/isa_manufacturing_extension", "models/cdf_process_industry_extension", + "models/cdf_process_industry_extension_full", "models/qs_enterprise_dm", "models/cfihos_oil_and_gas_extension", + "models/cdf_cdm_extension", + "models/cdf_cdm_extension_full", + "models/cdf_scene", ] [packages.atlas_ai] @@ -117,3 +121,52 @@ modules = [ "tools/apps/qualitizer" ] +[packages.industrial_tools] +id = "dp:industrial_tools" +title = "Industrial Tools" +description = "Data exploration and analytics tools" +canCherryPick = true +modules = [ + "accelerators/industrial_tools/cdf_search", + "accelerators/industrial_tools/cdf_location_filter_datamodel_based", + "accelerators/industrial_tools/cdf_location_filter_asset_centric", +] + +[packages.inrobot] +id = "dp:inrobot" +title = "InRobot" +description = "Robotics inspection data integration" +canCherryPick = true +modules = [ + "accelerators/inrobot/cdf_inrobot_common", + "accelerators/inrobot/cdf_inrobot_location", +] + +[packages.bootcamp] +id = "dp:bootcamp" +title = "Bootcamp" +description = "Initial configurations for the Cognite Data Fusion Bootcamp" +canCherryPick = false +modules = [ + "bootcamp/ice_cream_api", + "bootcamp/use_cases/oee", +] + +[packages.custom] +id = "dp:custom" +title = "Custom" +description = "Start with an empty module" +canCherryPick = false +modules = [ + "custom/my_module", +] + +[packages.auth_readwrite_all] +id = "dp:common" +title = "Admin group for CI/CD with read-write and read-only access" +description = "Admin group for CI/CD with read-write and read-only access" +canCherryPick = false +modules = [ + "common/cdf_auth_readwrite_all", +] + From 466d7faf875bec4ea25d368db19b48dd63f94601 Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Mon, 30 Mar 2026 14:07:18 +0530 Subject: [PATCH 10/12] changes --- .../data_models/enterprise.datamodel.yaml | 74 +++++++++---------- .../data_models/views/360Image.view.yaml | 18 ++--- .../views/360ImageAnnotation.view.yaml | 4 +- .../views/360ImageCollection.view.yaml | 4 +- .../data_models/views/360ImageModel.view.yaml | 8 +- .../views/360ImageStation.view.yaml | 2 +- .../data_models/views/3DModel.view.yaml | 4 +- .../data_models/views/3DObject.view.yaml | 16 ++-- .../data_models/views/3DRevision.view.yaml | 4 +- .../views/3DTransformation.view.yaml | 2 +- .../data_models/views/Activity.view.yaml | 10 +-- .../data_models/views/Annotation.view.yaml | 4 +- .../data_models/views/Asset.view.yaml | 36 ++++----- .../data_models/views/AssetClass.view.yaml | 2 +- .../data_models/views/AssetType.view.yaml | 4 +- .../data_models/views/CADModel.view.yaml | 8 +- .../data_models/views/CADNode.view.yaml | 8 +- .../data_models/views/CADRevision.view.yaml | 4 +- .../data_models/views/CubeMap.view.yaml | 14 ++-- .../data_models/views/Describable.view.yaml | 2 +- .../views/DiagramAnnotation.view.yaml | 4 +- .../data_models/views/Equipment.view.yaml | 18 ++--- .../data_models/views/EquipmentType.view.yaml | 2 +- .../data_models/views/File.view.yaml | 12 +-- .../data_models/views/FileCategory.view.yaml | 2 +- .../views/MaintenanceOrder.view.yaml | 16 ++-- .../data_models/views/Notification.view.yaml | 8 +- .../data_models/views/Operation.view.yaml | 14 ++-- .../views/PointCloudModel.view.yaml | 8 +- .../views/PointCloudRevision.view.yaml | 4 +- .../views/PointCloudVolume.view.yaml | 8 +- .../data_models/views/Schedulable.view.yaml | 2 +- .../data_models/views/SourceSystem.view.yaml | 2 +- .../data_models/views/Sourceable.view.yaml | 6 +- .../data_models/views/TimeSeries.view.yaml | 14 ++-- .../data_models/views/Unit.view.yaml | 2 +- .../data_models/views/Visualizable.view.yaml | 4 +- .../default.config.yaml | 1 + .../module.toml | 3 +- 39 files changed, 180 insertions(+), 178 deletions(-) diff --git a/modules/models/cdf_process_industry_extension_full/data_models/enterprise.datamodel.yaml b/modules/models/cdf_process_industry_extension_full/data_models/enterprise.datamodel.yaml index 4b8b9ed2..82fc7a74 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/enterprise.datamodel.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/enterprise.datamodel.yaml @@ -2,149 +2,149 @@ space: {{ schemaSpace }} externalId: {{ organization }}ProcessIndustries name: {{ organization }} enterprise model description: {{ organization }} enterprise model -version: v1 +version: {{ datamodelVersion }} views: - space: {{ schemaSpace }} externalId: {{ organization }}MaintenanceOrder - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Operation - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Notification - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Describable - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Sourceable - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Schedulable - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Visualizable - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}3DTransformation - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}CubeMap - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}3DObject - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}3DModel - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}CADModel - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}3DRevision - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}PointCloudModel - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}360ImageModel - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}CADRevision - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}PointCloudRevision - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}360ImageCollection - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}CADNode - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}PointCloudVolume - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}360Image - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}360ImageStation - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}360ImageAnnotation - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}AssetClass - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}AssetType - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Equipment - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}EquipmentType - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}FileCategory - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Activity - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}TimeSeries - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Annotation - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}DiagramAnnotation - version: v1 + version: {{ datamodelVersion }} type: view - space: {{ schemaSpace }} externalId: {{ organization }}Unit - version: v1 + version: {{ datamodelVersion }} type: view diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360Image.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360Image.view.yaml index 733b5992..f25852a6 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/360Image.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360Image.view.yaml @@ -6,7 +6,7 @@ implements: externalId: Cognite360Image version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: collection360: container: @@ -18,7 +18,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}360ImageCollection - version: v1 + version: {{ datamodelVersion }} type: view station360: container: @@ -31,7 +31,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}360ImageStation - version: v1 + version: {{ datamodelVersion }} type: view front: container: @@ -44,7 +44,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view back: container: @@ -57,7 +57,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view left: container: @@ -70,7 +70,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view right: container: @@ -83,7 +83,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view top: container: @@ -96,7 +96,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view bottom: container: @@ -109,7 +109,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageAnnotation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageAnnotation.view.yaml index 19715b96..065db262 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageAnnotation.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageAnnotation.view.yaml @@ -6,7 +6,7 @@ implements: externalId: Cognite360ImageAnnotation version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: source: container: @@ -18,7 +18,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageCollection.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageCollection.view.yaml index fa68daf6..3cd7c6e5 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageCollection.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageCollection.view.yaml @@ -18,7 +18,7 @@ implements: externalId: Cognite360ImageCollection version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: model3D: container: @@ -29,7 +29,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}3DModel - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageModel.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageModel.view.yaml index fbb0e1d8..0797189a 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageModel.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageModel.view.yaml @@ -18,19 +18,19 @@ implements: externalId: Cognite360ImageModel version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: collections: source: space: {{ schemaSpace }} externalId: {{ organization }}360ImageCollection - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}3DRevision - version: v1 + version: {{ datamodelVersion }} type: view identifier: model3D description: List Cognite360Image collections for this instance @@ -45,7 +45,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageStation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageStation.view.yaml index 2635cf4e..4e38ee2a 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageStation.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/360ImageStation.view.yaml @@ -19,7 +19,7 @@ implements: externalId: Cognite360ImageStation version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/3DModel.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/3DModel.view.yaml index bcd301ea..7562d795 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/3DModel.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/3DModel.view.yaml @@ -7,7 +7,7 @@ implements: externalId: Cognite3DModel version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: thumbnail: container: @@ -19,7 +19,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/3DObject.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/3DObject.view.yaml index 81a1c69b..31f70a61 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/3DObject.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/3DObject.view.yaml @@ -7,19 +7,19 @@ implements: externalId: Cognite3DObject version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: asset: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view identifier: object3D description: Asset that is tied to this 3D object @@ -28,13 +28,13 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}CADNode - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}CADNode - version: v1 + version: {{ datamodelVersion }} type: view identifier: object3D description: List of up to 1000 CADNodes that represents the connected CogniteAsset @@ -46,7 +46,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}360Image - version: v1 + version: {{ datamodelVersion }} type: view direction: outwards description: Edge connection to Cognite360Image annotations that represents the @@ -61,13 +61,13 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}PointCloudVolume - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}PointCloudVolume - version: v1 + version: {{ datamodelVersion }} type: view identifier: object3D description: List of up to 1000 PointCloudVolumes that represents the connected diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/3DRevision.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/3DRevision.view.yaml index 9de88a0b..00f4c882 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/3DRevision.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/3DRevision.view.yaml @@ -9,7 +9,7 @@ implements: externalId: Cognite3DRevision version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: model3D: container: @@ -20,7 +20,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}3DModel - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/3DTransformation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/3DTransformation.view.yaml index 33807376..cccdb044 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/3DTransformation.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/3DTransformation.view.yaml @@ -13,7 +13,7 @@ implements: externalId: Cognite3DTransformation version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Activity.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Activity.view.yaml index dda1d5f5..f110b7a7 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Activity.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Activity.view.yaml @@ -8,7 +8,7 @@ implements: externalId: CogniteActivity version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: assets: container: @@ -21,7 +21,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view equipment: container: @@ -34,7 +34,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Equipment - version: v1 + version: {{ datamodelVersion }} type: view timeSeries: container: @@ -47,7 +47,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}TimeSeries - version: v1 + version: {{ datamodelVersion }} type: view source: container: @@ -59,7 +59,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Annotation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Annotation.view.yaml index ac6d3ebc..e71c9b5d 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Annotation.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Annotation.view.yaml @@ -6,7 +6,7 @@ implements: externalId: CogniteAnnotation version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: source: container: @@ -18,7 +18,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Asset.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Asset.view.yaml index 7cd8b352..a54a9648 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Asset.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Asset.view.yaml @@ -8,7 +8,7 @@ implements: externalId: CogniteAsset version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: parent: container: @@ -21,7 +21,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view root: container: @@ -35,7 +35,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view path: container: @@ -50,7 +50,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view assetClass: container: @@ -63,7 +63,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}AssetClass - version: v1 + version: {{ datamodelVersion }} type: view type: container: @@ -76,19 +76,19 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}AssetType - version: v1 + version: {{ datamodelVersion }} type: view files: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view identifier: assets name: Files @@ -98,13 +98,13 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view identifier: parent name: Children @@ -115,13 +115,13 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Equipment - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}Equipment - version: v1 + version: {{ datamodelVersion }} type: view identifier: asset name: Equipment @@ -131,13 +131,13 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Activity - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}Activity - version: v1 + version: {{ datamodelVersion }} type: view identifier: assets name: Activities @@ -147,13 +147,13 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}TimeSeries - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}TimeSeries - version: v1 + version: {{ datamodelVersion }} type: view identifier: assets name: Time series @@ -169,7 +169,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view object3D: container: @@ -181,7 +181,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}3DObject - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/AssetClass.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/AssetClass.view.yaml index c825285a..1d44b1a8 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/AssetClass.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/AssetClass.view.yaml @@ -7,7 +7,7 @@ implements: externalId: CogniteAssetClass version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/AssetType.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/AssetType.view.yaml index 9ed9566e..edbe08a2 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/AssetType.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/AssetType.view.yaml @@ -7,7 +7,7 @@ implements: externalId: CogniteAssetType version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: assetClass: container: @@ -21,7 +21,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}AssetClass - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/CADModel.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/CADModel.view.yaml index bf921d46..b4109d7e 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/CADModel.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/CADModel.view.yaml @@ -18,19 +18,19 @@ implements: externalId: CogniteCADModel version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: revisions: source: space: {{ schemaSpace }} externalId: {{ organization }}CADRevision - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}3DRevision - version: v1 + version: {{ datamodelVersion }} type: view identifier: model3D description: List of revisions for this CAD model @@ -45,7 +45,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/CADNode.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/CADNode.view.yaml index a80d6c7c..41a03344 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/CADNode.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/CADNode.view.yaml @@ -6,7 +6,7 @@ implements: externalId: CogniteCADNode version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: object3D: container: @@ -18,7 +18,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}3DObject - version: v1 + version: {{ datamodelVersion }} type: view model3D: container: @@ -30,7 +30,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}CADModel - version: v1 + version: {{ datamodelVersion }} type: view revisions: container: @@ -43,7 +43,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}CADRevision - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/CADRevision.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/CADRevision.view.yaml index d180d745..c8f6657a 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/CADRevision.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/CADRevision.view.yaml @@ -18,7 +18,7 @@ implements: externalId: CogniteCADRevision version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: model3D: container: @@ -29,7 +29,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}3DModel - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/CubeMap.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/CubeMap.view.yaml index a57ea610..92b6b6a0 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/CubeMap.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/CubeMap.view.yaml @@ -9,7 +9,7 @@ implements: externalId: CogniteCubeMap version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: front: container: @@ -22,7 +22,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view back: container: @@ -35,7 +35,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view left: container: @@ -48,7 +48,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view right: container: @@ -61,7 +61,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view top: container: @@ -74,7 +74,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view bottom: container: @@ -87,7 +87,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Describable.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Describable.view.yaml index 04f867a8..948f5acb 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Describable.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Describable.view.yaml @@ -9,7 +9,7 @@ implements: externalId: CogniteDescribable version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/DiagramAnnotation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/DiagramAnnotation.view.yaml index 426b60b4..5f3874a8 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/DiagramAnnotation.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/DiagramAnnotation.view.yaml @@ -6,7 +6,7 @@ implements: externalId: CogniteDiagramAnnotation version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: source: container: @@ -18,7 +18,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Equipment.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Equipment.view.yaml index cb78865a..1026dc70 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Equipment.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Equipment.view.yaml @@ -7,7 +7,7 @@ implements: externalId: CogniteEquipment version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: asset: container: @@ -20,7 +20,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view equipmentType: container: @@ -33,7 +33,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}EquipmentType - version: v1 + version: {{ datamodelVersion }} type: view files: container: @@ -46,19 +46,19 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view activities: source: space: {{ schemaSpace }} externalId: {{ organization }}Activity - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}Activity - version: v1 + version: {{ datamodelVersion }} type: view identifier: equipment name: Activities @@ -68,13 +68,13 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}TimeSeries - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}TimeSeries - version: v1 + version: {{ datamodelVersion }} type: view identifier: equipment name: Time series @@ -90,7 +90,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/EquipmentType.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/EquipmentType.view.yaml index f66966e8..27e5f345 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/EquipmentType.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/EquipmentType.view.yaml @@ -7,7 +7,7 @@ implements: externalId: CogniteEquipmentType version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/File.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/File.view.yaml index 481c9e95..4feded92 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/File.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/File.view.yaml @@ -7,7 +7,7 @@ implements: externalId: CogniteFile version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: assets: container: @@ -20,7 +20,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view category: container: @@ -34,19 +34,19 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}FileCategory - version: v1 + version: {{ datamodelVersion }} type: view equipment: source: space: {{ schemaSpace }} externalId: {{ organization }}Equipment - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}Equipment - version: v1 + version: {{ datamodelVersion }} type: view identifier: files name: Equipment @@ -62,7 +62,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/FileCategory.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/FileCategory.view.yaml index d1458355..3ed0a964 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/FileCategory.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/FileCategory.view.yaml @@ -8,7 +8,7 @@ implements: externalId: CogniteFileCategory version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/MaintenanceOrder.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/MaintenanceOrder.view.yaml index a8c66f3f..5033fb4b 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/MaintenanceOrder.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/MaintenanceOrder.view.yaml @@ -8,7 +8,7 @@ implements: externalId: CogniteMaintenanceOrder version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: mainAsset: container: @@ -22,19 +22,19 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view operations: source: space: {{ schemaSpace }} externalId: {{ organization }}Operation - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}Operation - version: v1 + version: {{ datamodelVersion }} type: view identifier: maintenanceOrder name: Operations @@ -52,7 +52,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view equipment: container: @@ -65,7 +65,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Equipment - version: v1 + version: {{ datamodelVersion }} type: view timeSeries: container: @@ -78,7 +78,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}TimeSeries - version: v1 + version: {{ datamodelVersion }} type: view source: container: @@ -90,7 +90,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Notification.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Notification.view.yaml index ed4eb07a..ddf9f49f 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Notification.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Notification.view.yaml @@ -8,7 +8,7 @@ implements: externalId: CogniteNotification version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: maintenanceOrder: container: @@ -21,7 +21,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}MaintenanceOrder - version: v1 + version: {{ datamodelVersion }} type: view asset: container: @@ -34,7 +34,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view source: container: @@ -46,7 +46,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Operation.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Operation.view.yaml index 10c7e865..3b4bb1b5 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Operation.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Operation.view.yaml @@ -8,7 +8,7 @@ implements: externalId: CogniteOperation version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: maintenanceOrder: container: @@ -21,7 +21,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}MaintenanceOrder - version: v1 + version: {{ datamodelVersion }} type: view mainAsset: container: @@ -35,7 +35,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view assets: container: @@ -48,7 +48,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view equipment: container: @@ -61,7 +61,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Equipment - version: v1 + version: {{ datamodelVersion }} type: view timeSeries: container: @@ -74,7 +74,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}TimeSeries - version: v1 + version: {{ datamodelVersion }} type: view source: container: @@ -86,7 +86,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudModel.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudModel.view.yaml index c32a8dc2..5195c96d 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudModel.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudModel.view.yaml @@ -18,19 +18,19 @@ implements: externalId: CognitePointCloudModel version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: revisions: source: space: {{ schemaSpace }} externalId: {{ organization }}PointCloudRevision - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}3DRevision - version: v1 + version: {{ datamodelVersion }} type: view identifier: model3D description: List of revisions for this PointCloud model @@ -45,7 +45,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}File - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudRevision.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudRevision.view.yaml index f0821928..af813ba2 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudRevision.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudRevision.view.yaml @@ -18,7 +18,7 @@ implements: externalId: CognitePointCloudRevision version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: model3D: container: @@ -29,7 +29,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}3DModel - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudVolume.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudVolume.view.yaml index ac40a2ac..0fb8d614 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudVolume.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/PointCloudVolume.view.yaml @@ -6,7 +6,7 @@ implements: externalId: CognitePointCloudVolume version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: object3D: container: @@ -18,7 +18,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}3DObject - version: v1 + version: {{ datamodelVersion }} type: view model3D: container: @@ -30,7 +30,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}CADModel - version: v1 + version: {{ datamodelVersion }} type: view revisions: container: @@ -42,7 +42,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}CADRevision - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Schedulable.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Schedulable.view.yaml index 892c180a..196f407d 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Schedulable.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Schedulable.view.yaml @@ -7,7 +7,7 @@ implements: externalId: CogniteSchedulable version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/SourceSystem.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/SourceSystem.view.yaml index 67f97972..55b90ada 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/SourceSystem.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/SourceSystem.view.yaml @@ -7,7 +7,7 @@ implements: externalId: CogniteSourceSystem version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Sourceable.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Sourceable.view.yaml index 37e8559b..45d93817 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Sourceable.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Sourceable.view.yaml @@ -3,9 +3,9 @@ externalId: {{ organization }}Sourceable implements: - space: cdf_cdm externalId: CogniteSourceable - version: v1 + version: {{ datamodelVersion }} type: view -version: v1 +version: {{ datamodelVersion }} properties: source: container: @@ -17,7 +17,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/TimeSeries.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/TimeSeries.view.yaml index fdc8f8b8..3f7f7235 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/TimeSeries.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/TimeSeries.view.yaml @@ -7,7 +7,7 @@ implements: externalId: CogniteTimeSeries version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: unit: container: @@ -20,7 +20,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Unit - version: v1 + version: {{ datamodelVersion }} type: view assets: container: @@ -33,7 +33,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Asset - version: v1 + version: {{ datamodelVersion }} type: view equipment: container: @@ -46,19 +46,19 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}Equipment - version: v1 + version: {{ datamodelVersion }} type: view activities: source: space: {{ schemaSpace }} externalId: {{ organization }}Activity - version: v1 + version: {{ datamodelVersion }} type: view through: source: space: {{ schemaSpace }} externalId: {{ organization }}Activity - version: v1 + version: {{ datamodelVersion }} type: view identifier: timeSeries name: Activities @@ -75,7 +75,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}SourceSystem - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Unit.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Unit.view.yaml index 16651e68..a388001b 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Unit.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Unit.view.yaml @@ -6,7 +6,7 @@ implements: externalId: CogniteUnit version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/data_models/views/Visualizable.view.yaml b/modules/models/cdf_process_industry_extension_full/data_models/views/Visualizable.view.yaml index e4d94a39..12cc9956 100644 --- a/modules/models/cdf_process_industry_extension_full/data_models/views/Visualizable.view.yaml +++ b/modules/models/cdf_process_industry_extension_full/data_models/views/Visualizable.view.yaml @@ -7,7 +7,7 @@ implements: externalId: CogniteVisualizable version: v1 type: view -version: v1 +version: {{ datamodelVersion }} properties: object3D: container: @@ -19,7 +19,7 @@ properties: source: space: {{ schemaSpace }} externalId: {{ organization }}3DObject - version: v1 + version: {{ datamodelVersion }} type: view UUID: container: diff --git a/modules/models/cdf_process_industry_extension_full/default.config.yaml b/modules/models/cdf_process_industry_extension_full/default.config.yaml index 20d2f4f0..87a931da 100644 --- a/modules/models/cdf_process_industry_extension_full/default.config.yaml +++ b/modules/models/cdf_process_industry_extension_full/default.config.yaml @@ -1,2 +1,3 @@ organization: ORG schemaSpace: sp_enterprise_process_industry_full +datamodelVersion: v1.0 diff --git a/modules/models/cdf_process_industry_extension_full/module.toml b/modules/models/cdf_process_industry_extension_full/module.toml index ce59fd9b..6a33fa10 100644 --- a/modules/models/cdf_process_industry_extension_full/module.toml +++ b/modules/models/cdf_process_industry_extension_full/module.toml @@ -1,4 +1,5 @@ [module] title = "Example of CogniteProcessIndustry Extension Model" -id = "cdf_process_industry_extension_full" +is_selected_by_default = false +id = "dp:models:cdf_process_industry_extension_full" package_id = "dp:models" \ No newline at end of file From e5a5801e90c634a754cdbaecf6127281f57206e0 Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Mon, 30 Mar 2026 14:16:54 +0530 Subject: [PATCH 11/12] removed redundant modules --- .../containers/Activity.Container.yaml | 13 -- .../containers/Asset.Container.yaml | 13 -- .../containers/Equipment.Container.yaml | 13 -- .../containers/File.Container.yaml | 13 -- .../containers/TimeSeries.Container.yaml | 13 -- .../data_models/enterprise.datamodel.yaml | 54 ----- .../data_models/schema.space.yaml | 1 - .../data_models/views/Activity.view.yaml | 69 ------ .../data_models/views/Asset.view.yaml | 186 ---------------- .../data_models/views/Equipment.view.yaml | 100 --------- .../data_models/views/File.view.yaml | 72 ------- .../data_models/views/TimeSeries.view.yaml | 85 -------- .../cdf_cdm_extension/default.config.yaml | 2 - modules/models/cdf_cdm_extension/module.toml | 4 - .../containers/360Image.Container.yaml | 13 -- .../360ImageAnnotation.Container.yaml | 13 -- .../360ImageCollection.Container.yaml | 13 -- .../containers/360ImageModel.Container.yaml | 13 -- .../containers/360ImageStation.Container.yaml | 13 -- .../containers/3DModel.Container.yaml | 13 -- .../containers/3DObject.Container.yaml | 13 -- .../containers/3DRevision.Container.yaml | 13 -- .../3DTransformation.Container.yaml | 13 -- .../containers/Activity.Container.yaml | 13 -- .../containers/Annotation.Container.yaml | 14 -- .../containers/Asset.Container.yaml | 13 -- .../containers/AssetClass.Container.yaml | 13 -- .../containers/AssetType.Container.yaml | 13 -- .../containers/CADModel.Container.yaml | 13 -- .../containers/CADNode.Container.yaml | 13 -- .../containers/CADRevision.Container.yaml | 13 -- .../containers/CubeMap.Container.yaml | 13 -- .../containers/Describable.Container.yaml | 13 -- .../DiagramAnnotation.Container.yaml | 13 -- .../containers/Equipment.Container.yaml | 13 -- .../containers/EquipmentType.Container.yaml | 13 -- .../containers/File.Container.yaml | 13 -- .../containers/FileCategory.Container.yaml | 13 -- .../containers/PointCloudModel.Container.yaml | 13 -- .../PointCloudRevision.Container.yaml | 13 -- .../PointCloudVolume.Container.yaml | 13 -- .../containers/Schedulable.Container.yaml | 13 -- .../containers/SourceSystem.Container.yaml | 13 -- .../containers/Sourceable.Container.yaml | 13 -- .../containers/TimeSeries.Container.yaml | 13 -- .../containers/Unit.Container.yaml | 13 -- .../containers/Visualizable.Container.yaml | 13 -- .../data_models/enterprise.datamodel.yaml | 138 ------------ .../data_models/schema.space.yaml | 1 - .../data_models/views/360Image.view.yaml | 119 ---------- .../views/360ImageAnnotation.view.yaml | 28 --- .../views/360ImageCollection.view.yaml | 39 ---- .../data_models/views/360ImageModel.view.yaml | 55 ----- .../views/360ImageStation.view.yaml | 29 --- .../data_models/views/3DModel.view.yaml | 29 --- .../data_models/views/3DObject.view.yaml | 81 ------- .../data_models/views/3DRevision.view.yaml | 30 --- .../views/3DTransformation.view.yaml | 23 -- .../data_models/views/Activity.view.yaml | 69 ------ .../data_models/views/Annotation.view.yaml | 28 --- .../data_models/views/Asset.view.yaml | 191 ---------------- .../data_models/views/AssetClass.view.yaml | 17 -- .../data_models/views/AssetType.view.yaml | 31 --- .../data_models/views/CADModel.view.yaml | 55 ----- .../data_models/views/CADNode.view.yaml | 53 ----- .../data_models/views/CADRevision.view.yaml | 39 ---- .../data_models/views/CubeMap.view.yaml | 97 --------- .../data_models/views/Describable.view.yaml | 19 -- .../views/DiagramAnnotation.view.yaml | 28 --- .../data_models/views/Equipment.view.yaml | 100 --------- .../data_models/views/EquipmentType.view.yaml | 17 -- .../data_models/views/File.view.yaml | 72 ------- .../data_models/views/FileCategory.view.yaml | 18 -- .../views/PointCloudModel.view.yaml | 55 ----- .../views/PointCloudRevision.view.yaml | 39 ---- .../views/PointCloudVolume.view.yaml | 52 ----- .../data_models/views/Schedulable.view.yaml | 17 -- .../data_models/views/SourceSystem.view.yaml | 17 -- .../data_models/views/Sourceable.view.yaml | 27 --- .../data_models/views/TimeSeries.view.yaml | 85 -------- .../data_models/views/Unit.view.yaml | 16 -- .../data_models/views/Visualizable.view.yaml | 29 --- .../default.config.yaml | 2 - .../models/cdf_cdm_extension_full/module.toml | 4 - .../cdf_process_industry_extension/README.md | 203 ------------------ .../containers/Activity.Container.yaml | 13 -- .../containers/Asset.Container.yaml | 13 -- .../containers/Equipment.Container.yaml | 13 -- .../containers/File.Container.yaml | 13 -- .../MaintenanceOrder.Container.yaml | 13 -- .../containers/Notification.Container.yaml | 13 -- .../containers/Operation.Container.yaml | 13 -- .../containers/Reportable.Container.yaml | 42 ---- .../containers/TimeSeries.Container.yaml | 13 -- .../data_modeling/enterprise.datamodel.yaml | 70 ------ .../data_modeling/schema.space.yaml | 1 - .../data_modeling/views/Activity.view.yaml | 101 --------- .../data_modeling/views/Asset.view.yaml | 186 ---------------- .../data_modeling/views/Equipment.view.yaml | 100 --------- .../data_modeling/views/File.view.yaml | 72 ------- .../views/MaintenanceOrder.view.yaml | 132 ------------ .../views/Notification.view.yaml | 56 ----- .../data_modeling/views/Operation.view.yaml | 128 ----------- .../data_modeling/views/Reportable.view.yaml | 72 ------- .../data_modeling/views/TimeSeries.view.yaml | 117 ---------- .../default.config.yaml | 3 - .../module.toml | 5 - modules/packages.toml | 3 - 108 files changed, 4212 deletions(-) delete mode 100644 modules/models/cdf_cdm_extension/data_models/containers/Activity.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/containers/Asset.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/containers/Equipment.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/containers/File.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/containers/TimeSeries.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/enterprise.datamodel.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/schema.space.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/views/Activity.view.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/views/Asset.view.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/views/Equipment.view.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/views/File.view.yaml delete mode 100644 modules/models/cdf_cdm_extension/data_models/views/TimeSeries.view.yaml delete mode 100644 modules/models/cdf_cdm_extension/default.config.yaml delete mode 100644 modules/models/cdf_cdm_extension/module.toml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360Image.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360ImageAnnotation.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360ImageCollection.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360ImageModel.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/360ImageStation.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/3DModel.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/3DObject.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/3DRevision.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/3DTransformation.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Activity.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Annotation.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Asset.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/AssetClass.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/AssetType.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/CADModel.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/CADNode.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/CADRevision.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/CubeMap.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Describable.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/DiagramAnnotation.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Equipment.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/EquipmentType.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/File.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/FileCategory.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudModel.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudRevision.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudVolume.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Schedulable.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/SourceSystem.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Sourceable.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/TimeSeries.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Unit.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/containers/Visualizable.Container.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/enterprise.datamodel.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/schema.space.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360Image.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360ImageAnnotation.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360ImageCollection.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360ImageModel.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/360ImageStation.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/3DModel.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/3DObject.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/3DRevision.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/3DTransformation.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Activity.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Annotation.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Asset.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/AssetClass.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/AssetType.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/CADModel.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/CADNode.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/CADRevision.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/CubeMap.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Describable.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/DiagramAnnotation.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Equipment.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/EquipmentType.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/File.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/FileCategory.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/PointCloudModel.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/PointCloudRevision.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/PointCloudVolume.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Schedulable.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/SourceSystem.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Sourceable.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/TimeSeries.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Unit.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/data_models/views/Visualizable.view.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/default.config.yaml delete mode 100644 modules/models/cdf_cdm_extension_full/module.toml delete mode 100644 modules/models/cdf_process_industry_extension/README.md delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/containers/Activity.Container.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/containers/Asset.Container.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/containers/Equipment.Container.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/containers/File.Container.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/containers/MaintenanceOrder.Container.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/containers/Notification.Container.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/containers/Operation.Container.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/containers/Reportable.Container.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/containers/TimeSeries.Container.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/enterprise.datamodel.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/schema.space.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/views/Activity.view.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/views/Asset.view.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/views/Equipment.view.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/views/File.view.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/views/MaintenanceOrder.view.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/views/Notification.view.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/views/Operation.view.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/views/Reportable.view.yaml delete mode 100644 modules/models/cdf_process_industry_extension/data_modeling/views/TimeSeries.view.yaml delete mode 100644 modules/models/cdf_process_industry_extension/default.config.yaml delete mode 100644 modules/models/cdf_process_industry_extension/module.toml diff --git a/modules/models/cdf_cdm_extension/data_models/containers/Activity.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/Activity.Container.yaml deleted file mode 100644 index 687be160..00000000 --- a/modules/models/cdf_cdm_extension/data_models/containers/Activity.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Activity -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/containers/Asset.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/Asset.Container.yaml deleted file mode 100644 index 55a355e6..00000000 --- a/modules/models/cdf_cdm_extension/data_models/containers/Asset.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Asset -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/containers/Equipment.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/Equipment.Container.yaml deleted file mode 100644 index 9949cb8f..00000000 --- a/modules/models/cdf_cdm_extension/data_models/containers/Equipment.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Equipment -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/containers/File.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/File.Container.yaml deleted file mode 100644 index 92724eb4..00000000 --- a/modules/models/cdf_cdm_extension/data_models/containers/File.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}File -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/containers/TimeSeries.Container.yaml b/modules/models/cdf_cdm_extension/data_models/containers/TimeSeries.Container.yaml deleted file mode 100644 index 40f6c1aa..00000000 --- a/modules/models/cdf_cdm_extension/data_models/containers/TimeSeries.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}TimeSeries -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension/data_models/enterprise.datamodel.yaml b/modules/models/cdf_cdm_extension/data_models/enterprise.datamodel.yaml deleted file mode 100644 index 495c181d..00000000 --- a/modules/models/cdf_cdm_extension/data_models/enterprise.datamodel.yaml +++ /dev/null @@ -1,54 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Enterprise -name: {{ organization }} enterprise model -description: {{ organization }} enterprise model -version: v1 -views: -- space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view -- space: cdf_cdm - externalId: CogniteSourceable - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view -- space: cdf_cdm - externalId: CogniteAssetClass - version: v1 - type: view -- space: cdf_cdm - externalId: CogniteAssetType - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view -- space: cdf_cdm - externalId: CogniteEquipmentType - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view -- space: cdf_cdm - externalId: CogniteFileCategory - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view -- space: cdf_cdm - externalId: CogniteUnit - version: v1 - type: view diff --git a/modules/models/cdf_cdm_extension/data_models/schema.space.yaml b/modules/models/cdf_cdm_extension/data_models/schema.space.yaml deleted file mode 100644 index 2ac976a5..00000000 --- a/modules/models/cdf_cdm_extension/data_models/schema.space.yaml +++ /dev/null @@ -1 +0,0 @@ -space: {{ schemaSpace }} diff --git a/modules/models/cdf_cdm_extension/data_models/views/Activity.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/Activity.view.yaml deleted file mode 100644 index 2db42466..00000000 --- a/modules/models/cdf_cdm_extension/data_models/views/Activity.view.yaml +++ /dev/null @@ -1,69 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Activity -name: Activity -description: Represents activities. Activities typically happen over a period and - have a start and end time. -implements: -- space: cdf_cdm - externalId: CogniteActivity - version: v1 - type: view -version: v1 -properties: - assets: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - equipment: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: equipment - name: Equipment - description: A list of equipment the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - timeSeries: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: timeSeries - name: Time series - description: A list of time series the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/data_models/views/Asset.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/Asset.view.yaml deleted file mode 100644 index 54618479..00000000 --- a/modules/models/cdf_cdm_extension/data_models/views/Asset.view.yaml +++ /dev/null @@ -1,186 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Asset -name: Asset -description: Assets represent systems that support industrial functions or processes. - Assets are often called 'functional location'. -implements: -- space: cdf_cdm - externalId: CogniteAsset - version: v1 - type: view -version: v1 -properties: - parent: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetHierarchy_parent - name: Parent - description: The parent of the asset. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - root: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetHierarchy_root - name: Root - description: An automatically updated reference to the top-level asset of the - hierarchy. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - path: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetHierarchy_path - name: Path - description: An automatically updated ordered list of this asset's ancestors, - starting with the root asset. Enables subtree filtering to find all assets under - a parent. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - assetClass: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetClass - name: Asset class - description: Specifies the class of the asset. It's a direct relation to CogniteAssetClass. - source: - space: cdf_cdm - externalId: CogniteAssetClass - version: v1 - type: view - type: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: type - name: Asset type - description: Specifies the type of the asset. It's a direct relation to CogniteAssetType. - source: - space: cdf_cdm - externalId: CogniteAssetType - version: v1 - type: view - files: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - identifier: assets - name: Files - description: An automatically updated list of files related to the asset. - connectionType: multi_reverse_direct_relation - children: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - identifier: parent - name: Children - description: An automatically updated list of assets with this asset as their - parent. - connectionType: multi_reverse_direct_relation - equipment: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - identifier: asset - name: Equipment - description: An automatically updated list of equipment related to the asset. - connectionType: multi_reverse_direct_relation - activities: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - identifier: assets - name: Activities - description: An automatically updated list of activities related to the asset. - connectionType: multi_reverse_direct_relation - timeSeries: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - identifier: assets - name: Time series - description: An automatically updated list of time series related to the asset. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - object3D: - container: - space: cdf_cdm - externalId: CogniteVisualizable - type: container - containerPropertyIdentifier: object3D - description: Direct relation to an Object3D instance representing the 3D resource - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/data_models/views/Equipment.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/Equipment.view.yaml deleted file mode 100644 index c99319f3..00000000 --- a/modules/models/cdf_cdm_extension/data_models/views/Equipment.view.yaml +++ /dev/null @@ -1,100 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Equipment -name: Equipment -description: Equipment represents physical supplies or devices. -implements: -- space: cdf_cdm - externalId: CogniteEquipment - version: v1 - type: view -version: v1 -properties: - asset: - container: - space: cdf_cdm - externalId: CogniteEquipment - type: container - containerPropertyIdentifier: asset - name: Asset - description: The asset the equipment is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - equipmentType: - container: - space: cdf_cdm - externalId: CogniteEquipment - type: container - containerPropertyIdentifier: equipmentType - name: Equipment type - description: Specifies the type of the equipment. It's a direct relation to CogniteEquipmentType. - source: - space: cdf_cdm - externalId: CogniteEquipmentType - version: v1 - type: view - files: - container: - space: cdf_cdm - externalId: CogniteEquipment - type: container - containerPropertyIdentifier: files - name: Files - description: A list of files the equipment relates to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - activities: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - identifier: equipment - name: Activities - description: An automatically updated list of activities related to the equipment. - connectionType: multi_reverse_direct_relation - timeSeries: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - identifier: equipment - name: Time series - description: An automatically updated list of time series related to the equipment. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/data_models/views/File.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/File.view.yaml deleted file mode 100644 index 5520859f..00000000 --- a/modules/models/cdf_cdm_extension/data_models/views/File.view.yaml +++ /dev/null @@ -1,72 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}File -name: File -description: Represents files. -implements: -- space: cdf_cdm - externalId: CogniteFile - version: v1 - type: view -version: v1 -properties: - assets: - container: - space: cdf_cdm - externalId: CogniteFile - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets this file is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - category: - container: - space: cdf_cdm - externalId: CogniteFile - type: container - containerPropertyIdentifier: category - name: Category - description: Specifies the detected category the file belongs to. It's a direct - relation to an instance of CogniteFileCategory. - source: - space: cdf_cdm - externalId: CogniteFileCategory - version: v1 - type: view - equipment: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - identifier: files - name: Equipment - description: An automatically updated list of equipment this file is related to. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}File - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/data_models/views/TimeSeries.view.yaml b/modules/models/cdf_cdm_extension/data_models/views/TimeSeries.view.yaml deleted file mode 100644 index a539e9ae..00000000 --- a/modules/models/cdf_cdm_extension/data_models/views/TimeSeries.view.yaml +++ /dev/null @@ -1,85 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}TimeSeries -name: Time series -description: Represents a series of data points in time order." -implements: -- space: cdf_cdm - externalId: CogniteTimeSeries - version: v1 - type: view -version: v1 -properties: - unit: - container: - space: cdf_cdm - externalId: CogniteTimeSeries - type: container - containerPropertyIdentifier: unit - name: Unit - description: The unit of the time series. - source: - space: cdf_cdm - externalId: CogniteUnit - version: v1 - type: view - assets: - container: - space: cdf_cdm - externalId: CogniteTimeSeries - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets the time series is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - equipment: - container: - space: cdf_cdm - externalId: CogniteTimeSeries - type: container - containerPropertyIdentifier: equipment - name: Equipment - description: A list of equipment the time series is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - activities: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - identifier: timeSeries - name: Activities - description: An automatically updated list of activities the time series is related - to. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension/default.config.yaml b/modules/models/cdf_cdm_extension/default.config.yaml deleted file mode 100644 index c9d87123..00000000 --- a/modules/models/cdf_cdm_extension/default.config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -organization: ORG -schemaSpace: sp_enterprise_min_schema diff --git a/modules/models/cdf_cdm_extension/module.toml b/modules/models/cdf_cdm_extension/module.toml deleted file mode 100644 index e4739ca7..00000000 --- a/modules/models/cdf_cdm_extension/module.toml +++ /dev/null @@ -1,4 +0,0 @@ -[module] -title = "Example of Minimum Extension of the Cognite Core Model" -id = "cdf_cdm_extension" -package_id = "dp:models" \ No newline at end of file diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360Image.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360Image.Container.yaml deleted file mode 100644 index 744242ba..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/360Image.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360Image -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageAnnotation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageAnnotation.Container.yaml deleted file mode 100644 index b825459a..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageAnnotation.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360ImageAnnotation -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageCollection.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageCollection.Container.yaml deleted file mode 100644 index 91889488..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageCollection.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360ImageCollection -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageModel.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageModel.Container.yaml deleted file mode 100644 index 740ae41a..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageModel.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360ImageModel -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageStation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageStation.Container.yaml deleted file mode 100644 index 75dfb43a..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/360ImageStation.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360ImageStation -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/3DModel.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/3DModel.Container.yaml deleted file mode 100644 index dbd56ea9..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/3DModel.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}3DModel -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/3DObject.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/3DObject.Container.yaml deleted file mode 100644 index 5cc12702..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/3DObject.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}3DObject -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/3DRevision.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/3DRevision.Container.yaml deleted file mode 100644 index 5b72a014..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/3DRevision.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}3DRevision -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/3DTransformation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/3DTransformation.Container.yaml deleted file mode 100644 index 9e276c14..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/3DTransformation.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}3DTransformation -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Activity.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Activity.Container.yaml deleted file mode 100644 index 687be160..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/Activity.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Activity -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Annotation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Annotation.Container.yaml deleted file mode 100644 index 34bc6fa6..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/Annotation.Container.yaml +++ /dev/null @@ -1,14 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Annotation -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} -usedFor: edge \ No newline at end of file diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Asset.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Asset.Container.yaml deleted file mode 100644 index 55a355e6..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/Asset.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Asset -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/AssetClass.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/AssetClass.Container.yaml deleted file mode 100644 index 11def737..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/AssetClass.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}AssetClass -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/AssetType.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/AssetType.Container.yaml deleted file mode 100644 index 0b8a28d3..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/AssetType.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}AssetType -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/CADModel.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/CADModel.Container.yaml deleted file mode 100644 index dc2f8ab0..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/CADModel.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}CADModel -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/CADNode.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/CADNode.Container.yaml deleted file mode 100644 index a7bd7621..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/CADNode.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}CADNode -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/CADRevision.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/CADRevision.Container.yaml deleted file mode 100644 index 0565dcc2..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/CADRevision.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}CADRevision -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/CubeMap.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/CubeMap.Container.yaml deleted file mode 100644 index fad774b1..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/CubeMap.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}CubeMap -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Describable.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Describable.Container.yaml deleted file mode 100644 index 62651fff..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/Describable.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Describable -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/DiagramAnnotation.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/DiagramAnnotation.Container.yaml deleted file mode 100644 index 26eda717..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/DiagramAnnotation.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}DiagramAnnotation -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Equipment.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Equipment.Container.yaml deleted file mode 100644 index 9949cb8f..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/Equipment.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Equipment -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/EquipmentType.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/EquipmentType.Container.yaml deleted file mode 100644 index 76a87ca3..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/EquipmentType.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}EquipmentType -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/File.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/File.Container.yaml deleted file mode 100644 index 92724eb4..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/File.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}File -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/FileCategory.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/FileCategory.Container.yaml deleted file mode 100644 index c356b613..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/FileCategory.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}FileCategory -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudModel.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudModel.Container.yaml deleted file mode 100644 index a7b64ce6..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudModel.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}PointCloudModel -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudRevision.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudRevision.Container.yaml deleted file mode 100644 index 38edad78..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudRevision.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}PointCloudRevision -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudVolume.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudVolume.Container.yaml deleted file mode 100644 index 9015db1b..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/PointCloudVolume.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}PointCloudVolume -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Schedulable.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Schedulable.Container.yaml deleted file mode 100644 index 2eea9167..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/Schedulable.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Schedulable -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/SourceSystem.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/SourceSystem.Container.yaml deleted file mode 100644 index 18e97311..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/SourceSystem.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}SourceSystem -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Sourceable.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Sourceable.Container.yaml deleted file mode 100644 index 32adf0d2..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/Sourceable.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Sourceable -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/TimeSeries.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/TimeSeries.Container.yaml deleted file mode 100644 index 40f6c1aa..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/TimeSeries.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}TimeSeries -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Unit.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Unit.Container.yaml deleted file mode 100644 index ebed2b84..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/Unit.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Unit -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/containers/Visualizable.Container.yaml b/modules/models/cdf_cdm_extension_full/data_models/containers/Visualizable.Container.yaml deleted file mode 100644 index 0c441584..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/containers/Visualizable.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Visualizable -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_cdm_extension_full/data_models/enterprise.datamodel.yaml b/modules/models/cdf_cdm_extension_full/data_models/enterprise.datamodel.yaml deleted file mode 100644 index da08d813..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/enterprise.datamodel.yaml +++ /dev/null @@ -1,138 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Enterprise -name: {{ organization }} enterprise model -description: {{ organization }} enterprise model -version: v1 -views: -- space: {{ schemaSpace }} - externalId: {{ organization }}Describable - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Sourceable - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Schedulable - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Visualizable - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}3DTransformation - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}CubeMap - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}3DObject - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}3DModel - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}CADModel - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}3DRevision - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}PointCloudModel - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}360ImageModel - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}CADRevision - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}PointCloudRevision - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}360ImageCollection - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}CADNode - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}PointCloudVolume - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}360Image - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}360ImageStation - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}360ImageAnnotation - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}AssetClass - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}AssetType - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}EquipmentType - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}FileCategory - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Annotation - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}DiagramAnnotation - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Unit - version: v1 - type: view diff --git a/modules/models/cdf_cdm_extension_full/data_models/schema.space.yaml b/modules/models/cdf_cdm_extension_full/data_models/schema.space.yaml deleted file mode 100644 index 2ac976a5..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/schema.space.yaml +++ /dev/null @@ -1 +0,0 @@ -space: {{ schemaSpace }} diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360Image.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360Image.view.yaml deleted file mode 100644 index 733b5992..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/360Image.view.yaml +++ /dev/null @@ -1,119 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360Image -description: '' -implements: -- space: cdf_cdm - externalId: Cognite360Image - version: v1 - type: view -version: v1 -properties: - collection360: - container: - space: cdf_cdm_3d - externalId: Cognite360Image - type: container - containerPropertyIdentifier: collection360 - description: Direct relation to Cognite360ImageCollection - source: - space: {{ schemaSpace }} - externalId: {{ organization }}360ImageCollection - version: v1 - type: view - station360: - container: - space: cdf_cdm_3d - externalId: Cognite360Image - type: container - containerPropertyIdentifier: group3d - description: Direct relation to Cognite3DGroup instance that groups different - Cognite360Image instances to the same station - source: - space: {{ schemaSpace }} - externalId: {{ organization }}360ImageStation - version: v1 - type: view - front: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: front - description: Direct relation to a file holding the front projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - back: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: back - description: Direct relation to a file holding the back projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - left: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: left - description: Direct relation to a file holding the left projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - right: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: right - description: Direct relation to a file holding the right projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - top: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: top - description: Direct relation to a file holding the top projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - bottom: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: bottom - description: Direct relation to a file holding the bottom projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}360Image - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageAnnotation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageAnnotation.view.yaml deleted file mode 100644 index 19715b96..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageAnnotation.view.yaml +++ /dev/null @@ -1,28 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360ImageAnnotation -description: '' -implements: -- space: cdf_cdm - externalId: Cognite360ImageAnnotation - version: v1 - type: view -version: v1 -properties: - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}360ImageAnnotation - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageCollection.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageCollection.view.yaml deleted file mode 100644 index fa68daf6..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageCollection.view.yaml +++ /dev/null @@ -1,39 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360ImageCollection -description: Represents a logical collection of Cognite360Image instances -filter: - and: - - hasData: - - type: container - space: cdf_cdm_3d - externalId: Cognite3DRevision - - equals: - property: - - cdf_cdm_3d - - Cognite3DModel - - type - value: Image360 -implements: -- space: cdf_cdm - externalId: Cognite360ImageCollection - version: v1 - type: view -version: v1 -properties: - model3D: - container: - space: cdf_cdm_3d - externalId: Cognite3DRevision - type: container - containerPropertyIdentifier: model3D - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DModel - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}360ImageCollection - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageModel.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageModel.view.yaml deleted file mode 100644 index fbb0e1d8..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageModel.view.yaml +++ /dev/null @@ -1,55 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360ImageModel -description: Navigational aid for traversing Cognite360ImageModel instances -filter: - and: - - hasData: - - type: container - space: cdf_cdm_3d - externalId: Cognite3DModel - - equals: - property: - - cdf_cdm_3d - - Cognite3DModel - - type - value: Image360 -implements: -- space: cdf_cdm - externalId: Cognite360ImageModel - version: v1 - type: view -version: v1 -properties: - collections: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}360ImageCollection - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DRevision - version: v1 - type: view - identifier: model3D - description: List Cognite360Image collections for this instance - connectionType: multi_reverse_direct_relation - thumbnail: - container: - space: cdf_cdm_3d - externalId: Cognite3DModel - type: container - containerPropertyIdentifier: thumbnail - description: Thumbnail of the 3D model - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}360ImageModel - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageStation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/360ImageStation.view.yaml deleted file mode 100644 index 2635cf4e..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/360ImageStation.view.yaml +++ /dev/null @@ -1,29 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}360ImageStation -description: A way to group images across collections. Used for creating visual scan - history -filter: - and: - - hasData: - - type: container - space: cdf_cdm_3d - externalId: Cognite3DGroup - - equals: - property: - - cdf_cdm_3d - - Cognite3DGroup - - groupType - value: Station360 -implements: -- space: cdf_cdm - externalId: Cognite360ImageStation - version: v1 - type: view -version: v1 -properties: - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}360ImageStation - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/3DModel.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/3DModel.view.yaml deleted file mode 100644 index bcd301ea..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/3DModel.view.yaml +++ /dev/null @@ -1,29 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}3DModel -description: Groups revisions of 3D data of various kinds together (CAD, PointCloud, - Image360) -implements: -- space: cdf_cdm - externalId: Cognite3DModel - version: v1 - type: view -version: v1 -properties: - thumbnail: - container: - space: cdf_cdm_3d - externalId: Cognite3DModel - type: container - containerPropertyIdentifier: thumbnail - description: Thumbnail of the 3D model - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}3DModel - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/3DObject.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/3DObject.view.yaml deleted file mode 100644 index 81a1c69b..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/3DObject.view.yaml +++ /dev/null @@ -1,81 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}3DObject -description: This is the virtual position representation of an object in the physical - world, connecting an asset to one or more 3D resources -implements: -- space: cdf_cdm - externalId: Cognite3DObject - version: v1 - type: view -version: v1 -properties: - asset: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - identifier: object3D - description: Asset that is tied to this 3D object - connectionType: single_reverse_direct_relation - cadNodes: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}CADNode - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}CADNode - version: v1 - type: view - identifier: object3D - description: List of up to 1000 CADNodes that represents the connected CogniteAsset - connectionType: multi_reverse_direct_relation - images360: - type: - space: cdf_cdm - externalId: image-360-annotation - source: - space: {{ schemaSpace }} - externalId: {{ organization }}360Image - version: v1 - type: view - direction: outwards - description: Edge connection to Cognite360Image annotations that represents the - connected CogniteAsset - edgeSource: - space: cdf_cdm - externalId: Cognite360ImageAnnotation - version: v1 - type: view - connectionType: multi_edge_connection - pointCloudVolumes: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}PointCloudVolume - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}PointCloudVolume - version: v1 - type: view - identifier: object3D - description: List of up to 1000 PointCloudVolumes that represents the connected - CogniteAsset - connectionType: multi_reverse_direct_relation - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}3DObject - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/3DRevision.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/3DRevision.view.yaml deleted file mode 100644 index 9de88a0b..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/3DRevision.view.yaml +++ /dev/null @@ -1,30 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}3DRevision -description: 'Shared revision information for various 3D data types. Normally not - used directly, but through CognitePointCloudRevision, Image360Collection or CogniteCADRevision - - ' -implements: -- space: cdf_cdm - externalId: Cognite3DRevision - version: v1 - type: view -version: v1 -properties: - model3D: - container: - space: cdf_cdm_3d - externalId: Cognite3DRevision - type: container - containerPropertyIdentifier: model3D - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DModel - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}3DRevision - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/3DTransformation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/3DTransformation.view.yaml deleted file mode 100644 index 33807376..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/3DTransformation.view.yaml +++ /dev/null @@ -1,23 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}3DTransformation -description: 'The Cognite3DTransformation object defines a comprehensive 3D transformation, - enabling precise adjustments to an object''s position, orientation, and size in - the 3D coordinate system. It allows for the translation of objects along the three - spatial axes, rotation around these axes using Euler angles, and scaling along each - axis to modify the object''s dimensions. The object''s transformation is defined - in "CDF space", a coordinate system where the positive Z axis is the up direction - - ' -implements: -- space: cdf_cdm - externalId: Cognite3DTransformation - version: v1 - type: view -version: v1 -properties: - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}3DTransformation - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Activity.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Activity.view.yaml deleted file mode 100644 index dda1d5f5..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/Activity.view.yaml +++ /dev/null @@ -1,69 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Activity -name: Activity -description: Represents activities. Activities typically happen over a period and - have a start and end time. -implements: -- space: cdf_cdm - externalId: CogniteActivity - version: v1 - type: view -version: v1 -properties: - assets: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - equipment: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: equipment - name: Equipment - description: A list of equipment the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - timeSeries: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: timeSeries - name: Time series - description: A list of time series the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Annotation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Annotation.view.yaml deleted file mode 100644 index ac6d3ebc..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/Annotation.view.yaml +++ /dev/null @@ -1,28 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Annotation -description: Annotation represents contextualization results or links -implements: -- space: cdf_cdm - externalId: CogniteAnnotation - version: v1 - type: view -version: v1 -properties: - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Annotation - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Asset.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Asset.view.yaml deleted file mode 100644 index 7cd8b352..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/Asset.view.yaml +++ /dev/null @@ -1,191 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Asset -name: Asset -description: Assets represent systems that support industrial functions or processes. - Assets are often called 'functional location'. -implements: -- space: cdf_cdm - externalId: CogniteAsset - version: v1 - type: view -version: v1 -properties: - parent: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetHierarchy_parent - name: Parent - description: The parent of the asset. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - root: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetHierarchy_root - name: Root - description: An automatically updated reference to the top-level asset of the - hierarchy. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - path: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetHierarchy_path - name: Path - description: An automatically updated ordered list of this asset's ancestors, - starting with the root asset. Enables subtree filtering to find all assets under - a parent. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - assetClass: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetClass - name: Asset class - description: Specifies the class of the asset. It's a direct relation to CogniteAssetClass. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}AssetClass - version: v1 - type: view - type: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: type - name: Asset type - description: Specifies the type of the asset. It's a direct relation to CogniteAssetType. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}AssetType - version: v1 - type: view - files: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - identifier: assets - name: Files - description: An automatically updated list of files related to the asset. - connectionType: multi_reverse_direct_relation - children: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - identifier: parent - name: Children - description: An automatically updated list of assets with this asset as their - parent. - connectionType: multi_reverse_direct_relation - equipment: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - identifier: asset - name: Equipment - description: An automatically updated list of equipment related to the asset. - connectionType: multi_reverse_direct_relation - activities: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - identifier: assets - name: Activities - description: An automatically updated list of activities related to the asset. - connectionType: multi_reverse_direct_relation - timeSeries: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - identifier: assets - name: Time series - description: An automatically updated list of time series related to the asset. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view - object3D: - container: - space: cdf_cdm - externalId: CogniteVisualizable - type: container - containerPropertyIdentifier: object3D - description: Direct relation to an Object3D instance representing the 3D resource - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DObject - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/AssetClass.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/AssetClass.view.yaml deleted file mode 100644 index c825285a..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/AssetClass.view.yaml +++ /dev/null @@ -1,17 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}AssetClass -name: Asset class -description: Represents the class of an asset. -implements: -- space: cdf_cdm - externalId: CogniteAssetClass - version: v1 - type: view -version: v1 -properties: - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}AssetClass - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/AssetType.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/AssetType.view.yaml deleted file mode 100644 index 9ed9566e..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/AssetType.view.yaml +++ /dev/null @@ -1,31 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}AssetType -name: Asset type -description: Represents the type of an asset. -implements: -- space: cdf_cdm - externalId: CogniteAssetType - version: v1 - type: view -version: v1 -properties: - assetClass: - container: - space: cdf_cdm - externalId: CogniteAssetType - type: container - containerPropertyIdentifier: assetClass - name: Asset class - description: Specifies the class the type belongs to. It's a direct relation to - CogniteAssetClass. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}AssetClass - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}AssetType - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/CADModel.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/CADModel.view.yaml deleted file mode 100644 index bf921d46..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/CADModel.view.yaml +++ /dev/null @@ -1,55 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}CADModel -description: Navigational aid for traversing CogniteCADModel instances -filter: - and: - - hasData: - - type: container - space: cdf_cdm_3d - externalId: Cognite3DModel - - equals: - property: - - cdf_cdm_3d - - Cognite3DModel - - type - value: CAD -implements: -- space: cdf_cdm - externalId: CogniteCADModel - version: v1 - type: view -version: v1 -properties: - revisions: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}CADRevision - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DRevision - version: v1 - type: view - identifier: model3D - description: List of revisions for this CAD model - connectionType: multi_reverse_direct_relation - thumbnail: - container: - space: cdf_cdm_3d - externalId: Cognite3DModel - type: container - containerPropertyIdentifier: thumbnail - description: Thumbnail of the 3D model - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}CADModel - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/CADNode.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/CADNode.view.yaml deleted file mode 100644 index a80d6c7c..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/CADNode.view.yaml +++ /dev/null @@ -1,53 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}CADNode -description: Represents nodes from the 3D model that have been contextualized -implements: -- space: cdf_cdm - externalId: CogniteCADNode - version: v1 - type: view -version: v1 -properties: - object3D: - container: - space: cdf_cdm_3d - externalId: CogniteCADNode - type: container - containerPropertyIdentifier: object3D - description: Direct relation to object3D grouping for this node - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DObject - version: v1 - type: view - model3D: - container: - space: cdf_cdm_3d - externalId: CogniteCADNode - type: container - containerPropertyIdentifier: model3D - description: Direct relation to Cognite3DModel - source: - space: {{ schemaSpace }} - externalId: {{ organization }}CADModel - version: v1 - type: view - revisions: - container: - space: cdf_cdm_3d - externalId: CogniteCADNode - type: container - containerPropertyIdentifier: revisions - description: List of direct relations to instances of Cognite3DRevision which - this CogniteCADNode exists in. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}CADRevision - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}CADNode - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/CADRevision.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/CADRevision.view.yaml deleted file mode 100644 index d180d745..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/CADRevision.view.yaml +++ /dev/null @@ -1,39 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}CADRevision -description: '' -filter: - and: - - hasData: - - type: container - space: cdf_cdm_3d - externalId: Cognite3DRevision - - equals: - property: - - cdf_cdm_3d - - Cognite3DModel - - type - value: CAD -implements: -- space: cdf_cdm - externalId: CogniteCADRevision - version: v1 - type: view -version: v1 -properties: - model3D: - container: - space: cdf_cdm_3d - externalId: Cognite3DRevision - type: container - containerPropertyIdentifier: model3D - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DModel - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}CADRevision - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/CubeMap.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/CubeMap.view.yaml deleted file mode 100644 index a57ea610..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/CubeMap.view.yaml +++ /dev/null @@ -1,97 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}CubeMap -description: 'The cube map holds references to 6 images in used to visually represent - the surrounding environment - - ' -implements: -- space: cdf_cdm - externalId: CogniteCubeMap - version: v1 - type: view -version: v1 -properties: - front: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: front - description: Direct relation to a file holding the front projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - back: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: back - description: Direct relation to a file holding the back projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - left: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: left - description: Direct relation to a file holding the left projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - right: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: right - description: Direct relation to a file holding the right projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - top: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: top - description: Direct relation to a file holding the top projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - bottom: - container: - space: cdf_cdm_3d - externalId: CogniteCubeMap - type: container - containerPropertyIdentifier: bottom - description: Direct relation to a file holding the bottom projection of the cube - map - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}CubeMap - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Describable.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Describable.view.yaml deleted file mode 100644 index 04f867a8..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/Describable.view.yaml +++ /dev/null @@ -1,19 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Describable -description: 'The describable core concept is used as a standard way of holding the - bare minimum of information about the instance - - ' -implements: -- space: cdf_cdm - externalId: CogniteDescribable - version: v1 - type: view -version: v1 -properties: - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Describable - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/DiagramAnnotation.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/DiagramAnnotation.view.yaml deleted file mode 100644 index 426b60b4..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/DiagramAnnotation.view.yaml +++ /dev/null @@ -1,28 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}DiagramAnnotation -description: Annotation for diagrams -implements: -- space: cdf_cdm - externalId: CogniteDiagramAnnotation - version: v1 - type: view -version: v1 -properties: - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}DiagramAnnotation - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Equipment.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Equipment.view.yaml deleted file mode 100644 index cb78865a..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/Equipment.view.yaml +++ /dev/null @@ -1,100 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Equipment -name: Equipment -description: Equipment represents physical supplies or devices. -implements: -- space: cdf_cdm - externalId: CogniteEquipment - version: v1 - type: view -version: v1 -properties: - asset: - container: - space: cdf_cdm - externalId: CogniteEquipment - type: container - containerPropertyIdentifier: asset - name: Asset - description: The asset the equipment is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - equipmentType: - container: - space: cdf_cdm - externalId: CogniteEquipment - type: container - containerPropertyIdentifier: equipmentType - name: Equipment type - description: Specifies the type of the equipment. It's a direct relation to CogniteEquipmentType. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}EquipmentType - version: v1 - type: view - files: - container: - space: cdf_cdm - externalId: CogniteEquipment - type: container - containerPropertyIdentifier: files - name: Files - description: A list of files the equipment relates to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - activities: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - identifier: equipment - name: Activities - description: An automatically updated list of activities related to the equipment. - connectionType: multi_reverse_direct_relation - timeSeries: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: v1 - type: view - identifier: equipment - name: Time series - description: An automatically updated list of time series related to the equipment. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/EquipmentType.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/EquipmentType.view.yaml deleted file mode 100644 index f66966e8..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/EquipmentType.view.yaml +++ /dev/null @@ -1,17 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}EquipmentType -name: Equipment type -description: Represents the type of equipment. -implements: -- space: cdf_cdm - externalId: CogniteEquipmentType - version: v1 - type: view -version: v1 -properties: - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}EquipmentType - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/File.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/File.view.yaml deleted file mode 100644 index 481c9e95..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/File.view.yaml +++ /dev/null @@ -1,72 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}File -name: File -description: Represents files. -implements: -- space: cdf_cdm - externalId: CogniteFile - version: v1 - type: view -version: v1 -properties: - assets: - container: - space: cdf_cdm - externalId: CogniteFile - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets this file is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - category: - container: - space: cdf_cdm - externalId: CogniteFile - type: container - containerPropertyIdentifier: category - name: Category - description: Specifies the detected category the file belongs to. It's a direct - relation to an instance of CogniteFileCategory. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}FileCategory - version: v1 - type: view - equipment: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - identifier: files - name: Equipment - description: An automatically updated list of equipment this file is related to. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}File - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/FileCategory.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/FileCategory.view.yaml deleted file mode 100644 index d1458355..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/FileCategory.view.yaml +++ /dev/null @@ -1,18 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}FileCategory -name: File category -description: Represents the categories of files as determined by contextualization - or categorization. -implements: -- space: cdf_cdm - externalId: CogniteFileCategory - version: v1 - type: view -version: v1 -properties: - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}FileCategory - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudModel.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudModel.view.yaml deleted file mode 100644 index c32a8dc2..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudModel.view.yaml +++ /dev/null @@ -1,55 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}PointCloudModel -description: Navigational aid for traversing CognitePointCloudModel instances -filter: - and: - - hasData: - - type: container - space: cdf_cdm_3d - externalId: Cognite3DModel - - equals: - property: - - cdf_cdm_3d - - Cognite3DModel - - type - value: PointCloud -implements: -- space: cdf_cdm - externalId: CognitePointCloudModel - version: v1 - type: view -version: v1 -properties: - revisions: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}PointCloudRevision - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DRevision - version: v1 - type: view - identifier: model3D - description: List of revisions for this PointCloud model - connectionType: multi_reverse_direct_relation - thumbnail: - container: - space: cdf_cdm_3d - externalId: Cognite3DModel - type: container - containerPropertyIdentifier: thumbnail - description: Thumbnail of the 3D model - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}PointCloudModel - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudRevision.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudRevision.view.yaml deleted file mode 100644 index f0821928..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudRevision.view.yaml +++ /dev/null @@ -1,39 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}PointCloudRevision -description: Navigational aid for traversing CognitePointCloudRevision instances -filter: - and: - - hasData: - - type: container - space: cdf_cdm_3d - externalId: Cognite3DRevision - - equals: - property: - - cdf_cdm_3d - - Cognite3DModel - - type - value: PointCloud -implements: -- space: cdf_cdm - externalId: CognitePointCloudRevision - version: v1 - type: view -version: v1 -properties: - model3D: - container: - space: cdf_cdm_3d - externalId: Cognite3DRevision - type: container - containerPropertyIdentifier: model3D - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DModel - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}PointCloudRevision - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudVolume.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudVolume.view.yaml deleted file mode 100644 index ac40a2ac..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/PointCloudVolume.view.yaml +++ /dev/null @@ -1,52 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}PointCloudVolume -description: PointCloud volume definition -implements: -- space: cdf_cdm - externalId: CognitePointCloudVolume - version: v1 - type: view -version: v1 -properties: - object3D: - container: - space: cdf_cdm_3d - externalId: CognitePointCloudVolume - type: container - containerPropertyIdentifier: object3D - description: Direct relation to object3D grouping for this node - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DObject - version: v1 - type: view - model3D: - container: - space: cdf_cdm_3d - externalId: CognitePointCloudVolume - type: container - containerPropertyIdentifier: model3D - description: Direct relation to Cognite3DModel instance - source: - space: {{ schemaSpace }} - externalId: {{ organization }}CADModel - version: v1 - type: view - revisions: - container: - space: cdf_cdm_3d - externalId: CognitePointCloudVolume - type: container - containerPropertyIdentifier: revisions - description: List of direct relations to revision information - source: - space: {{ schemaSpace }} - externalId: {{ organization }}CADRevision - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}PointCloudVolume - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Schedulable.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Schedulable.view.yaml deleted file mode 100644 index 892c180a..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/Schedulable.view.yaml +++ /dev/null @@ -1,17 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Schedulable -description: CogniteSchedulable represents the metadata about when an activity (or - similar) starts and ends. -implements: -- space: cdf_cdm - externalId: CogniteSchedulable - version: v1 - type: view -version: v1 -properties: - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Schedulable - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/SourceSystem.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/SourceSystem.view.yaml deleted file mode 100644 index 67f97972..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/SourceSystem.view.yaml +++ /dev/null @@ -1,17 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}SourceSystem -description: The CogniteSourceSystem core concept is used to standardize the way source - system is stored. -implements: -- space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view -version: v1 -properties: - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Sourceable.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Sourceable.view.yaml deleted file mode 100644 index 37e8559b..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/Sourceable.view.yaml +++ /dev/null @@ -1,27 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Sourceable -implements: -- space: cdf_cdm - externalId: CogniteSourceable - version: v1 - type: view -version: v1 -properties: - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Sourceable - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/TimeSeries.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/TimeSeries.view.yaml deleted file mode 100644 index fdc8f8b8..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/TimeSeries.view.yaml +++ /dev/null @@ -1,85 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}TimeSeries -name: Time series -description: Represents a series of data points in time order." -implements: -- space: cdf_cdm - externalId: CogniteTimeSeries - version: v1 - type: view -version: v1 -properties: - unit: - container: - space: cdf_cdm - externalId: CogniteTimeSeries - type: container - containerPropertyIdentifier: unit - name: Unit - description: The unit of the time series. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Unit - version: v1 - type: view - assets: - container: - space: cdf_cdm - externalId: CogniteTimeSeries - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets the time series is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: v1 - type: view - equipment: - container: - space: cdf_cdm - externalId: CogniteTimeSeries - type: container - containerPropertyIdentifier: equipment - name: Equipment - description: A list of equipment the time series is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: v1 - type: view - activities: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: v1 - type: view - identifier: timeSeries - name: Activities - description: An automatically updated list of activities the time series is related - to. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: {{ schemaSpace }} - externalId: {{ organization }}SourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Unit.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Unit.view.yaml deleted file mode 100644 index 16651e68..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/Unit.view.yaml +++ /dev/null @@ -1,16 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Unit -description: Represents a single unit of measurement -implements: -- space: cdf_cdm - externalId: CogniteUnit - version: v1 - type: view -version: v1 -properties: - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Unit - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/data_models/views/Visualizable.view.yaml b/modules/models/cdf_cdm_extension_full/data_models/views/Visualizable.view.yaml deleted file mode 100644 index e4d94a39..00000000 --- a/modules/models/cdf_cdm_extension_full/data_models/views/Visualizable.view.yaml +++ /dev/null @@ -1,29 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Visualizable -description: CogniteVisualizable defines the standard way to reference a related 3D - resource -implements: -- space: cdf_cdm - externalId: CogniteVisualizable - version: v1 - type: view -version: v1 -properties: - object3D: - container: - space: cdf_cdm - externalId: CogniteVisualizable - type: container - containerPropertyIdentifier: object3D - description: Direct relation to an Object3D instance representing the 3D resource - source: - space: {{ schemaSpace }} - externalId: {{ organization }}3DObject - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Visualizable - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_cdm_extension_full/default.config.yaml b/modules/models/cdf_cdm_extension_full/default.config.yaml deleted file mode 100644 index 57be3d66..00000000 --- a/modules/models/cdf_cdm_extension_full/default.config.yaml +++ /dev/null @@ -1,2 +0,0 @@ -organization: ORG -schemaSpace: sp_enterprise_schema diff --git a/modules/models/cdf_cdm_extension_full/module.toml b/modules/models/cdf_cdm_extension_full/module.toml deleted file mode 100644 index 3b1c1d63..00000000 --- a/modules/models/cdf_cdm_extension_full/module.toml +++ /dev/null @@ -1,4 +0,0 @@ -[module] -title = "Example of CogniteCore Extension Model" -id = "cdf_cdm_extension_full" -package_id = "dp:models" \ No newline at end of file diff --git a/modules/models/cdf_process_industry_extension/README.md b/modules/models/cdf_process_industry_extension/README.md deleted file mode 100644 index 61232429..00000000 --- a/modules/models/cdf_process_industry_extension/README.md +++ /dev/null @@ -1,203 +0,0 @@ -# CDF Process Industry Extension Module - -This module provides a minimal extension of the Cognite Process Industry data model, adding organization-specific views and containers that extend the standard CDM (Cognite Data Model) for process industry use cases. - -## Why Use This Module? - -**Extend the Standard Data Model for Your Organization** - -The Cognite CDM provides foundational types, but industrial deployments often need organization-specific extensions. This module delivers **production-ready data model extensions** that follow best practices while allowing customization. - -**Key Benefits:** - -- 🏗️ **CDM Compatible**: Extends standard Cognite Process Industry types -- 🎯 **Organization Prefixed**: Custom views with your organization prefix -- 📊 **Complete Entity Coverage**: Assets, Equipment, TimeSeries, Files, Activities, and more -- 🔧 **Easy Customization**: Add custom properties to containers -- 📈 **Enterprise Ready**: Includes Maintenance Orders, Operations, and Notifications - -**Time & Cost Savings:** - -- **Development Time**: Pre-built containers and views save weeks of data modeling -- **Best Practices**: Follows Cognite's recommended patterns for extensions -- **Consistency**: Standardized naming conventions across all entity types - -## 🎯 Overview - -The CDF Process Industry Extension module provides: -- **Organization-prefixed views** for all major entity types -- **Custom containers** with extension properties -- **Enterprise data model** combining all views -- **Schema space** for model organization - -## 🏗️ Module Architecture - -``` -cdf_process_industry_extension/ -├── 📁 data_modeling/ # Data model definitions -│ ├── 📁 containers/ # Container definitions -│ │ ├── 📄 Activity.Container.yaml -│ │ ├── 📄 Asset.Container.yaml -│ │ ├── 📄 Equipment.Container.yaml -│ │ ├── 📄 File.Container.yaml -│ │ ├── 📄 MaintenanceOrder.Container.yaml -│ │ ├── 📄 Notification.Container.yaml -│ │ ├── 📄 Operation.Container.yaml -│ │ ├── 📄 Reportable.Container.yaml -│ │ └── 📄 TimeSeries.Container.yaml -│ ├── 📁 views/ # View definitions -│ │ ├── 📄 Activity.view.yaml -│ │ ├── 📄 Asset.view.yaml -│ │ ├── 📄 Equipment.view.yaml -│ │ ├── 📄 File.view.yaml -│ │ ├── 📄 MaintenanceOrder.view.yaml -│ │ ├── 📄 Notification.view.yaml -│ │ ├── 📄 Operation.view.yaml -│ │ ├── 📄 Reportable.view.yaml -│ │ └── 📄 TimeSeries.view.yaml -│ ├── 📄 enterprise.datamodel.yaml # Combined data model -│ └── 📄 schema.space.yaml # Schema space definition -├── 📄 default.config.yaml # Module configuration -└── 📄 module.toml # Module metadata -``` - -## 🚀 Core Components - -### Entity Views - -| View | Base CDM Type | Description | -|------|---------------|-------------| -| `{ORG}Asset` | CogniteAsset | Physical assets with custom properties | -| `{ORG}Equipment` | CogniteEquipment | Equipment items with extensions | -| `{ORG}TimeSeries` | CogniteTimeSeries | Time series data with custom metadata | -| `{ORG}File` | CogniteFile | Documents and files with extensions | -| `{ORG}Activity` | CogniteActivity | Activities and work items | -| `{ORG}MaintenanceOrder` | Custom | Maintenance work orders | -| `{ORG}Operation` | Custom | Work order operations | -| `{ORG}Notification` | Custom | Maintenance notifications | -| `{ORG}Reportable` | Custom | Reportable entities | - -### Enterprise Data Model - -The `{ORG}ProcessIndustries` data model combines all views into a single queryable model, including: -- All organization-specific views -- CDM reference types (CogniteSourceSystem, CogniteUnit, etc.) -- Asset/Equipment type classifications - -## 🔧 Configuration - -### Module Configuration (`default.config.yaml`) - -```yaml -schemaSpace: sp_enterprise_process_industry # Space for schema definitions -organization: ORG # Organization prefix for views -datamodelVersion: v1.0 # Data model version -``` - -## 🏃‍♂️ Getting Started - -### 1. Prerequisites - -- CDF project with data modeling capabilities -- Admin permissions to create spaces and data models - -### 2. Configure the Module - -Update your `config..yaml` under the module variables section: - -```yaml -variables: - modules: - cdf_process_industry_extension: - schemaSpace: sp_enterprise_process_industry - organization: YOUR_ORG # Organization prefix for views (e.g., "ACME") - datamodelVersion: v1.0 # Data model version -``` - -### 3. Deploy the Module - -```bash -# Deploy using CDF Toolkit -cdf deploy --env your-environment - -# Verify deployment -cdf data-models list -``` - -### 4. Customize Containers - -Add custom properties to containers as needed: - -```yaml -# Example: Adding custom property to Asset container -properties: - customField: - type: - type: primitive - primitive: string - description: Organization-specific field -``` - -## 📊 Data Model Structure - -```mermaid -graph TD - subgraph "Organization Views" - A[ORGAsset] - B[ORGEquipment] - C[ORGTimeSeries] - D[ORGFile] - E[ORGActivity] - F[ORGMaintenanceOrder] - G[ORGOperation] - H[ORGNotification] - end - - subgraph "CDM Base Types" - I[CogniteAsset] - J[CogniteEquipment] - K[CogniteTimeSeries] - L[CogniteFile] - M[CogniteActivity] - end - - A --> I - B --> J - C --> K - D --> L - E --> M - - subgraph "ORGProcessIndustries Data Model" - N[Combined Model] - end - - A --> N - B --> N - C --> N - D --> N - E --> N - F --> N - G --> N - H --> N -``` - -## 🎯 Use Cases - -### Enterprise Data Modeling -- **Standardization**: Consistent data model across all sites -- **Extensions**: Add organization-specific properties -- **Governance**: Centralized schema management - -### Integration -- **Source Systems**: Map SAP, PI, and other sources to views -- **Applications**: Build apps against the enterprise model -- **Analytics**: Query unified data across entity types - -## 📚 Dependencies - -This module should be deployed **before** source system modules that populate data into these views. - -## 📄 License - -This module is part of the Cognite Templates repository and follows the same licensing terms. - diff --git a/modules/models/cdf_process_industry_extension/data_modeling/containers/Activity.Container.yaml b/modules/models/cdf_process_industry_extension/data_modeling/containers/Activity.Container.yaml deleted file mode 100644 index 687be160..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/containers/Activity.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Activity -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_process_industry_extension/data_modeling/containers/Asset.Container.yaml b/modules/models/cdf_process_industry_extension/data_modeling/containers/Asset.Container.yaml deleted file mode 100644 index 55a355e6..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/containers/Asset.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Asset -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_process_industry_extension/data_modeling/containers/Equipment.Container.yaml b/modules/models/cdf_process_industry_extension/data_modeling/containers/Equipment.Container.yaml deleted file mode 100644 index 9949cb8f..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/containers/Equipment.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Equipment -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_process_industry_extension/data_modeling/containers/File.Container.yaml b/modules/models/cdf_process_industry_extension/data_modeling/containers/File.Container.yaml deleted file mode 100644 index 92724eb4..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/containers/File.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}File -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_process_industry_extension/data_modeling/containers/MaintenanceOrder.Container.yaml b/modules/models/cdf_process_industry_extension/data_modeling/containers/MaintenanceOrder.Container.yaml deleted file mode 100644 index 8ef7862c..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/containers/MaintenanceOrder.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}MaintenanceOrder -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_process_industry_extension/data_modeling/containers/Notification.Container.yaml b/modules/models/cdf_process_industry_extension/data_modeling/containers/Notification.Container.yaml deleted file mode 100644 index a1b9ebe2..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/containers/Notification.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Notification -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_process_industry_extension/data_modeling/containers/Operation.Container.yaml b/modules/models/cdf_process_industry_extension/data_modeling/containers/Operation.Container.yaml deleted file mode 100644 index 4132a340..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/containers/Operation.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Operation -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_process_industry_extension/data_modeling/containers/Reportable.Container.yaml b/modules/models/cdf_process_industry_extension/data_modeling/containers/Reportable.Container.yaml deleted file mode 100644 index 910a4438..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/containers/Reportable.Container.yaml +++ /dev/null @@ -1,42 +0,0 @@ -space: {{ schemaSpace }} -description: Container for common reporting attributes -externalId: {{ organization }}Reportable -constraints: {} -indexes: {} -name: {{ organization }}Reportable -properties: - sysSite: - autoIncrement: false - immutable: false - nullable: true - type: - collation: ucs_basic - list: false - type: text - sysUnit: - autoIncrement: false - immutable: false - nullable: true - type: - collation: ucs_basic - list: false - type: text - sysTagsFound: - autoIncrement: false - immutable: false - nullable: true - type: - collation: ucs_basic - list: true - maxListSize: 1200 - type: text - sysTagsLinked: - autoIncrement: false - immutable: false - nullable: true - type: - collation: ucs_basic - list: true - maxListSize: 1200 - type: text -usedFor: node \ No newline at end of file diff --git a/modules/models/cdf_process_industry_extension/data_modeling/containers/TimeSeries.Container.yaml b/modules/models/cdf_process_industry_extension/data_modeling/containers/TimeSeries.Container.yaml deleted file mode 100644 index 40f6c1aa..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/containers/TimeSeries.Container.yaml +++ /dev/null @@ -1,13 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}TimeSeries -properties: - UUID: - type: - list: false - collation: ucs_basic - type: text - immutable: false - nullable: true - autoIncrement: false -constraints: {} -indexes: {} diff --git a/modules/models/cdf_process_industry_extension/data_modeling/enterprise.datamodel.yaml b/modules/models/cdf_process_industry_extension/data_modeling/enterprise.datamodel.yaml deleted file mode 100644 index 8c52e3a0..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/enterprise.datamodel.yaml +++ /dev/null @@ -1,70 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}ProcessIndustries -name: {{ organization }} enterprise model -description: {{ organization }} enterprise model -version: {{ datamodelVersion }} -views: -- space: {{ schemaSpace }} - externalId: {{ organization }}MaintenanceOrder - version: {{ datamodelVersion }} - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Operation - version: {{ datamodelVersion }} - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Notification - version: {{ datamodelVersion }} - type: view -- space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view -- space: cdf_cdm - externalId: CogniteSourceable - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view -- space: cdf_cdm - externalId: CogniteAssetClass - version: v1 - type: view -- space: cdf_cdm - externalId: CogniteAssetType - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: {{ datamodelVersion }} - type: view -- space: cdf_cdm - externalId: CogniteEquipmentType - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}File - version: {{ datamodelVersion }} - type: view -- space: cdf_cdm - externalId: CogniteFileCategory - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: {{ datamodelVersion }} - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: {{ datamodelVersion }} - type: view -- space: cdf_cdm - externalId: CogniteUnit - version: v1 - type: view -- space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - version: {{ datamodelVersion }} - type: view diff --git a/modules/models/cdf_process_industry_extension/data_modeling/schema.space.yaml b/modules/models/cdf_process_industry_extension/data_modeling/schema.space.yaml deleted file mode 100644 index ffa411e6..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/schema.space.yaml +++ /dev/null @@ -1 +0,0 @@ -space: {{ schemaSpace}} diff --git a/modules/models/cdf_process_industry_extension/data_modeling/views/Activity.view.yaml b/modules/models/cdf_process_industry_extension/data_modeling/views/Activity.view.yaml deleted file mode 100644 index 36348cc0..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/views/Activity.view.yaml +++ /dev/null @@ -1,101 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Activity -name: Activity -description: Represents activities. Activities typically happen over a period and - have a start and end time. -implements: -- space: cdf_cdm - externalId: CogniteActivity - version: v1 - type: view -version: {{ datamodelVersion }} -properties: - assets: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - equipment: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: equipment - name: Equipment - description: A list of equipment the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: {{ datamodelVersion }} - type: view - timeSeries: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: timeSeries - name: Time series - description: A list of time series the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: {{ datamodelVersion }} - type: view - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - type: container - containerPropertyIdentifier: UUID - sysSite: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysSite - description: Site (sys) - name: Site (sys) - sysUnit: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysUnit - description: Unit (sys) - name: Unit (sys) - sysTagsFound: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsFound - description: Tags found (sys) - name: Tags found (sys) - sysTagsLinked: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsLinked - description: Tags linked (sys) - name: Tags linked (sys) \ No newline at end of file diff --git a/modules/models/cdf_process_industry_extension/data_modeling/views/Asset.view.yaml b/modules/models/cdf_process_industry_extension/data_modeling/views/Asset.view.yaml deleted file mode 100644 index dffaa941..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/views/Asset.view.yaml +++ /dev/null @@ -1,186 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Asset -name: Asset -description: Assets represent systems that support industrial functions or processes. - Assets are often called 'functional location'. -implements: -- space: cdf_cdm - externalId: CogniteAsset - version: v1 - type: view -version: {{ datamodelVersion }} -properties: - parent: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetHierarchy_parent - name: Parent - description: The parent of the asset. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - root: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetHierarchy_root - name: Root - description: An automatically updated reference to the top-level asset of the - hierarchy. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - path: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetHierarchy_path - name: Path - description: An automatically updated ordered list of this asset's ancestors, - starting with the root asset. Enables subtree filtering to find all assets under - a parent. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - assetClass: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: assetClass - name: Asset class - description: Specifies the class of the asset. It's a direct relation to CogniteAssetClass. - source: - space: cdf_cdm - externalId: CogniteAssetClass - version: v1 - type: view - type: - container: - space: cdf_cdm - externalId: CogniteAsset - type: container - containerPropertyIdentifier: type - name: Asset type - description: Specifies the type of the asset. It's a direct relation to CogniteAssetType. - source: - space: cdf_cdm - externalId: CogniteAssetType - version: v1 - type: view - files: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: {{ datamodelVersion }} - type: view - identifier: assets - name: Files - description: An automatically updated list of files related to the asset. - connectionType: multi_reverse_direct_relation - children: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - identifier: parent - name: Children - description: An automatically updated list of assets with this asset as their - parent. - connectionType: multi_reverse_direct_relation - equipment: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: {{ datamodelVersion }} - type: view - identifier: asset - name: Equipment - description: An automatically updated list of equipment related to the asset. - connectionType: multi_reverse_direct_relation - activities: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: {{ datamodelVersion }} - type: view - identifier: assets - name: Activities - description: An automatically updated list of activities related to the asset. - connectionType: multi_reverse_direct_relation - timeSeries: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: {{ datamodelVersion }} - type: view - identifier: assets - name: Time series - description: An automatically updated list of time series related to the asset. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - object3D: - container: - space: cdf_cdm - externalId: CogniteVisualizable - type: container - containerPropertyIdentifier: object3D - description: Direct relation to an Object3D instance representing the 3D resource - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension/data_modeling/views/Equipment.view.yaml b/modules/models/cdf_process_industry_extension/data_modeling/views/Equipment.view.yaml deleted file mode 100644 index ec3a05b1..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/views/Equipment.view.yaml +++ /dev/null @@ -1,100 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Equipment -name: Equipment -description: Equipment represents physical supplies or devices. -implements: -- space: cdf_cdm - externalId: CogniteEquipment - version: v1 - type: view -version: {{ datamodelVersion }} -properties: - asset: - container: - space: cdf_cdm - externalId: CogniteEquipment - type: container - containerPropertyIdentifier: asset - name: Asset - description: The asset the equipment is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - equipmentType: - container: - space: cdf_cdm - externalId: CogniteEquipment - type: container - containerPropertyIdentifier: equipmentType - name: Equipment type - description: Specifies the type of the equipment. It's a direct relation to CogniteEquipmentType. - source: - space: cdf_cdm - externalId: CogniteEquipmentType - version: v1 - type: view - files: - container: - space: cdf_cdm - externalId: CogniteEquipment - type: container - containerPropertyIdentifier: files - name: Files - description: A list of files the equipment relates to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}File - version: {{ datamodelVersion }} - type: view - activities: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: {{ datamodelVersion }} - type: view - identifier: equipment - name: Activities - description: An automatically updated list of activities related to the equipment. - connectionType: multi_reverse_direct_relation - timeSeries: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: {{ datamodelVersion }} - type: view - identifier: equipment - name: Time series - description: An automatically updated list of time series related to the equipment. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension/data_modeling/views/File.view.yaml b/modules/models/cdf_process_industry_extension/data_modeling/views/File.view.yaml deleted file mode 100644 index 1f686636..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/views/File.view.yaml +++ /dev/null @@ -1,72 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}File -name: File -description: Represents files. -implements: -- space: cdf_cdm - externalId: CogniteFile - version: v1 - type: view -version: {{ datamodelVersion }} -properties: - assets: - container: - space: cdf_cdm - externalId: CogniteFile - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets this file is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - category: - container: - space: cdf_cdm - externalId: CogniteFile - type: container - containerPropertyIdentifier: category - name: Category - description: Specifies the detected category the file belongs to. It's a direct - relation to an instance of CogniteFileCategory. - source: - space: cdf_cdm - externalId: CogniteFileCategory - version: v1 - type: view - equipment: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: {{ datamodelVersion }} - type: view - identifier: files - name: Equipment - description: An automatically updated list of equipment this file is related to. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}File - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension/data_modeling/views/MaintenanceOrder.view.yaml b/modules/models/cdf_process_industry_extension/data_modeling/views/MaintenanceOrder.view.yaml deleted file mode 100644 index f531e11e..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/views/MaintenanceOrder.view.yaml +++ /dev/null @@ -1,132 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}MaintenanceOrder -name: Maintenance order -description: A formal request or directive to perform maintenance tasks such as repair, - inspection, or servicing of equipment or assets. It's often called a 'work order'. -implements: -- space: cdf_idm - externalId: CogniteMaintenanceOrder - version: v1 - type: view -version: {{ datamodelVersion }} -properties: - mainAsset: - container: - space: cdf_idm - externalId: CogniteMaintenanceOrder - type: container - containerPropertyIdentifier: mainAsset - name: Main asset - description: The primary asset (functional location) the maintenance order refers - to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - operations: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Operation - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Operation - version: {{ datamodelVersion }} - type: view - identifier: maintenanceOrder - name: Operations - description: Lists the individual work items on the maintenance order. An automatically - populated list of operations related to the maintenance order. - connectionType: multi_reverse_direct_relation - assets: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - equipment: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: equipment - name: Equipment - description: A list of equipment the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: {{ datamodelVersion }} - type: view - timeSeries: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: timeSeries - name: Time series - description: A list of time series the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: {{ datamodelVersion }} - type: view - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}MaintenanceOrder - type: container - containerPropertyIdentifier: UUID - sysSite: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysSite - description: Site (sys) - name: Site (sys) - sysUnit: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysUnit - description: Unit (sys) - name: Unit (sys) - sysTagsFound: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsFound - description: Tags found (sys) - name: Tags found (sys) - sysTagsLinked: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsLinked - description: Tags linked (sys) - name: Tags linked (sys) \ No newline at end of file diff --git a/modules/models/cdf_process_industry_extension/data_modeling/views/Notification.view.yaml b/modules/models/cdf_process_industry_extension/data_modeling/views/Notification.view.yaml deleted file mode 100644 index 0241751a..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/views/Notification.view.yaml +++ /dev/null @@ -1,56 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Notification -name: Notification -description: A formal record to report maintenance issues, defects, or requests, starting - the process for planning and running maintenance activities. -implements: -- space: cdf_idm - externalId: CogniteNotification - version: v1 - type: view -version: {{ datamodelVersion }} -properties: - maintenanceOrder: - container: - space: cdf_idm - externalId: CogniteNotification - type: container - containerPropertyIdentifier: maintenanceOrder - name: Maintenance order - description: The maintenance order that was created from the notification. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}MaintenanceOrder - version: {{ datamodelVersion }} - type: view - asset: - container: - space: cdf_idm - externalId: CogniteNotification - type: container - containerPropertyIdentifier: asset - name: Asset - description: The asset (functional location) the notification is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Notification - type: container - containerPropertyIdentifier: UUID diff --git a/modules/models/cdf_process_industry_extension/data_modeling/views/Operation.view.yaml b/modules/models/cdf_process_industry_extension/data_modeling/views/Operation.view.yaml deleted file mode 100644 index 658e026a..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/views/Operation.view.yaml +++ /dev/null @@ -1,128 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Operation -name: Operation -description: Operations represent a specific part of the work included in a maintenance - order. Often called a 'work order item'. -implements: -- space: cdf_idm - externalId: CogniteOperation - version: v1 - type: view -version: {{ datamodelVersion }} -properties: - maintenanceOrder: - container: - space: cdf_idm - externalId: CogniteOperation - type: container - containerPropertyIdentifier: maintenanceOrder - name: Maintenance order - description: The maintenance order the operation is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}MaintenanceOrder - version: {{ datamodelVersion }} - type: view - mainAsset: - container: - space: cdf_idm - externalId: CogniteOperation - type: container - containerPropertyIdentifier: mainAsset - name: Main asset - description: The primary asset (functional location) the operation is related - to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - assets: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - equipment: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: equipment - name: Equipment - description: A list of equipment the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: {{ datamodelVersion }} - type: view - timeSeries: - container: - space: cdf_cdm - externalId: CogniteActivity - type: container - containerPropertyIdentifier: timeSeries - name: Time series - description: A list of time series the activity is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - version: {{ datamodelVersion }} - type: view - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Operation - type: container - containerPropertyIdentifier: UUID - sysSite: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysSite - description: Site (sys) - name: Site (sys) - sysUnit: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysUnit - description: Unit (sys) - name: Unit (sys) - sysTagsFound: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsFound - description: Tags found (sys) - name: Tags found (sys) - sysTagsLinked: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsLinked - description: Tags linked (sys) - name: Tags linked (sys) \ No newline at end of file diff --git a/modules/models/cdf_process_industry_extension/data_modeling/views/Reportable.view.yaml b/modules/models/cdf_process_industry_extension/data_modeling/views/Reportable.view.yaml deleted file mode 100644 index bb3edfd9..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/views/Reportable.view.yaml +++ /dev/null @@ -1,72 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}Reportable -name: Reportable -description: Represents a reportable entity. - -version: {{ datamodelVersion }} -properties: - name: - container: - space: cdf_cdm - externalId: CogniteDescribable - type: container - containerPropertyIdentifier: name - description: Name of the instance - sourceId: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: sourceId - description: Identifier from the source system - sourceContext: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: sourceContext - description: Context of the source id. For systems where the sourceId is globally unique, the sourceContext is expected to not be set. - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - sysSite: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysSite - description: Site (sys) - name: Site (sys) - sysUnit: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysUnit - description: Unit (sys) - name: Unit (sys) - sysTagsFound: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsFound - description: Tags found (sys) - name: Tags found (sys) - sysTagsLinked: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsLinked - description: Tags linked (sys) - name: Tags linked (sys) diff --git a/modules/models/cdf_process_industry_extension/data_modeling/views/TimeSeries.view.yaml b/modules/models/cdf_process_industry_extension/data_modeling/views/TimeSeries.view.yaml deleted file mode 100644 index 8f5e25c6..00000000 --- a/modules/models/cdf_process_industry_extension/data_modeling/views/TimeSeries.view.yaml +++ /dev/null @@ -1,117 +0,0 @@ -space: {{ schemaSpace }} -externalId: {{ organization }}TimeSeries -name: Time series -description: Represents a series of data points in time order. -implements: -- space: cdf_cdm - externalId: CogniteTimeSeries - version: v1 - type: view -version: {{ datamodelVersion }} -properties: - unit: - container: - space: cdf_cdm - externalId: CogniteTimeSeries - type: container - containerPropertyIdentifier: unit - name: Unit - description: The unit of the time series. - source: - space: cdf_cdm - externalId: CogniteUnit - version: v1 - type: view - assets: - container: - space: cdf_cdm - externalId: CogniteTimeSeries - type: container - containerPropertyIdentifier: assets - name: Assets - description: A list of assets the time series is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Asset - version: {{ datamodelVersion }} - type: view - equipment: - container: - space: cdf_cdm - externalId: CogniteTimeSeries - type: container - containerPropertyIdentifier: equipment - name: Equipment - description: A list of equipment the time series is related to. - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Equipment - version: {{ datamodelVersion }} - type: view - activities: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: {{ datamodelVersion }} - type: view - through: - source: - space: {{ schemaSpace }} - externalId: {{ organization }}Activity - version: {{ datamodelVersion }} - type: view - identifier: timeSeries - name: Activities - description: An automatically updated list of activities the time series is related - to. - connectionType: multi_reverse_direct_relation - source: - container: - space: cdf_cdm - externalId: CogniteSourceable - type: container - containerPropertyIdentifier: source - description: Direct relation to a source system - source: - space: cdf_cdm - externalId: CogniteSourceSystem - version: v1 - type: view - UUID: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}TimeSeries - type: container - containerPropertyIdentifier: UUID - sysSite: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysSite - description: Site (sys) - name: Site (sys) - sysUnit: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysUnit - description: Unit (sys) - name: Unit (sys) - sysTagsFound: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsFound - description: Tags found (sys) - name: Tags found (sys) - sysTagsLinked: - container: - space: {{ schemaSpace }} - externalId: {{ organization }}Reportable - type: container - containerPropertyIdentifier: sysTagsLinked - description: Tags linked (sys) - name: Tags linked (sys) diff --git a/modules/models/cdf_process_industry_extension/default.config.yaml b/modules/models/cdf_process_industry_extension/default.config.yaml deleted file mode 100644 index 9054dba0..00000000 --- a/modules/models/cdf_process_industry_extension/default.config.yaml +++ /dev/null @@ -1,3 +0,0 @@ -schemaSpace: sp_enterprise_process_industry -organization: ORG -datamodelVersion: v1.0 diff --git a/modules/models/cdf_process_industry_extension/module.toml b/modules/models/cdf_process_industry_extension/module.toml deleted file mode 100644 index e50be7e6..00000000 --- a/modules/models/cdf_process_industry_extension/module.toml +++ /dev/null @@ -1,5 +0,0 @@ -[module] -title = "Example of Minimum Extension of the Cognite Process Industry Model" -is_selected_by_default = false -id = "dp:models:cdf_process_industry_extension" -package_id = "dp:quickstart" diff --git a/modules/packages.toml b/modules/packages.toml index f9e86e67..5eb963b4 100644 --- a/modules/packages.toml +++ b/modules/packages.toml @@ -34,12 +34,9 @@ canCherryPick = true modules = [ "models/rmdm_v1", "models/isa_manufacturing_extension", - "models/cdf_process_industry_extension", "models/cdf_process_industry_extension_full", "models/qs_enterprise_dm", "models/cfihos_oil_and_gas_extension", - "models/cdf_cdm_extension", - "models/cdf_cdm_extension_full", "models/cdf_scene", ] From b9eeb863767429ef8e93daa1fbe02910c3b881bf Mon Sep 17 00:00:00 2001 From: Aashutosh-cognite Date: Tue, 31 Mar 2026 12:16:23 +0530 Subject: [PATCH 12/12] testing --- packages.zip | Bin 0 -> 18639283 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 packages.zip diff --git a/packages.zip b/packages.zip new file mode 100644 index 0000000000000000000000000000000000000000..aa07f815e13569d07d7dd917b241b79bacdd3025 GIT binary patch literal 18639283 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πJWBZ?=Ci{p{jGk`#wh894u_t zvK=>xK*I1j@Cmw4>tO69_<+IL?zo;)m7E-B8QuGPQ(Z2X#Lbhk*uUJ2;_wuHH4UAq)JSA&j;2OMQ7SRw-K1=NfJK}VIFwi@FHuZ=Zq_hzX4_|#nhzZ^ z*D?(p6V`6FXr(W};N40emWe2b?d7m=EmVHjj=a#hd9_zKJnam;F$oW6N}(Q%(iJZo zG+z@}eC0-VcU+a*n8bsSy*ku+g%i`>$uCFdhBD?%OvEFYn`OL6eedYvKq%8>AUFai z11;WtZdQG3l`;}BEv;26mQxZKoGj?J39-(3tR2O@g{iq00^bUM_DPq-vse8uPv%#! z={1|lGkxEX9p=S46gYZqKiJlK`XQhfCVXMsCK2+^?(_quCdB-ABB;MZ$}WhqvZPS< zkE$fYrAzWfOr@Ynh}n}kRJc|>l4}-yIQ?LJ>y}nyU)JoWv2;@|ub*onP7|!nUij#oQ*EVn&vqXuY z8VWc?T%{;RwR6kS^KH>t&d83zMQggJw~HKd@c1f*Y>ph*IXZkC`%KHxN9H+y__z*= zsQJPMb{|pC^`24h?t2`u?v^{<;h)yjP48m`K*kc+>1wp7=z~`@9V?wB%#I1N*#puK zU|{5Ug0`SVPU?$hfjs*Rz;op@n7!17w;jtsLx38f>59^fc+7jN>;Aevel5Fq^YSzh zAEBt&EET0kHuaDW8M(dS|OI3X^k-zhunN9E3 zxwRFsWO33hS}4;s(zP9pF4yTQDbK(&}hz zZGe$M*WfT*IWJt3kK1OGCV&!yzM1E1o{H?oj-gE3+jL7HGY$Sucd znIlZfY1o>O-ifBcK7sm7Y4}38^jfV&P>FoYLt}1d8}MU zV~%_YvElqRTMhGHSM<1oNwz1V-SV`GcW0tUw~$Q4%?n|@>+2(b+ORiB%F-6yhXXhg zBonI@|8__?;&^$GeD&ojd(B4vyesqwzNoD7Y41wo$ECaOoyW-A=haqQfE_FaWv2=p zclWO1LRdPcsHAq@XWyT+DrsZaxvLOA9a^*oZii-gUBAMUrdx--Q6QZ-fQE9|AMD+^ zI)$tiFXaG#W$er1_{pSx+tCy3^yOz~e*efK&ZOED>8d9>cF2Ut%V}TkK~wbGiOjIh(XrcDO&&IR zpEcW0=Zc?Ilf#+*_muN1-p?GCkK9eyv$qmvI9cq#q zNd{m%;Jf*1w802AJ&$+wxhOlV=Xrm0ly?ugepkSH3M*{Yq?wxbuZ>X=d-FqIDIk}i zw*jUJbwoPqNm6_!?o#CmOdcJPFFwKetisd;%s7TE|VTZ%EW2 z*2`>OpgL!=oBhO-gZseBpyi&?1ZOk8e73b<7^Mrmnd9oDA2^B8y-yQi*FAcTUbHHC z4f8$$ddMk72laqXO6h=z+#Gh@vIxLz=Lv+K;NHASCQhkn(lPDAWmSp{X}sahczI`1 zx0xZ*a@M)a<=5t151E3({t(yW~p;2%bZ;e=N*u7&n8vP%g3 zGNS?T(tUbV3Hm-`yZtHfre1JKLR@#YTzHc;V2?ew_P1H_Z0Ckk1KyzY3BRb1-J^9S zc9wXPM3mH067m;h83iU#zgRI4(csq+t1nLqD+mfgcydsm5iMpr%JX;GM~ zS=70*e~WeLpyg`NFsUN)iUQU*t(cy?5msG!p9bEdz0-`|QoJabK3s84J_2YMmz={z z_}maKldL)#0-1D|nu0AA1#^GoCEiu@Y8aiVKC00AY<50Vch(Sio_G9(h?E2PDX_g8 z(r-CGRJ02l@W7tAdu`-*;H(&!@^bT9ja|1x>!u~kVQ&z(AbHc-bJ+;6uOX-{oG@*n z`B0#?ScK9P3#-w$(#I8n({nOntdjN&yr^L)V0DGr=Ziy283fkr+5HfaK7_}>hUKpz zW7neS)zr$(_%3Fd6LGtey}HKq++BTP(VH`}L=V(#S0<%Bhld8*lKY9kpx$6&Q!J~=lv za?-p_tSp6Bw>?VZwg~&cwhT_bmrI{dEf#j!bux0|8$r7&;;eO%YJ`D<#PG~UDA1N-mX^TStP**nxlrT zRV*PlYrnq4IDKYqpn0(^z?jK}9p-RG22BhQc+nYua~#it)#i^0EA-}>ow3kBZHipn ztSrORT<%x361IGq%eSTnq24oe$EwnKjS4re{k}-;rH?eA3fpW29fr5L7kXR_S5iomQ38=?CW2?jlg~sgC|&1*U>G5Y zKFjmHI(4@LdOv4;xUQ;?d-84kh(GJ!qMENdWbtYa7kzCSxo^^~0oa>jE`Dz=3V*p3 zVXOT?$!J_z_2`cs@dd{y=Zqy!x-;bZZ=9J;JgmtjH1~_`j~g0^ou}frGxA1gRmE|2CE*(E{20tJ(QCl` z@kkp8;_6m?WxrMQGb_4zHhr*L&wqKN(#uaes}>rX+Usg@SXJL-Ntxknyo78C@K(4z z3Aku4ScOjFa!}=2I^gaWmFBIBZ;%zqQIx>oortjo75SuvxD|y$%tyS@ATZQm;QhE% z=$|^l!N0id?%jU5lJ`rXx? zb|HPzDslOvQ{@IDZV9oz6iYp(T?Wb-C!9($ZAn=_B^jz>zQ1!#?eu{j?LU6Mo$vgb z<5OixhpBfWJp9Z*`Q&fuXw7^1z&BE`=67Ry_7eIU^Tsnwg5tEJ!Y4BK(a$i=m=Cm~ zjqQ_Razv^~wbD;d0RCOUtBaALV{wgL|ExT)nVl&_p&@I}4Tk5boZ$^!nGA4;5KbjG) zu$9^hHT!RcofxCjkilX`kHb>QrWUT(dcVdw1DIWWp_}&`F+V?B+Mhl}(q-H3RUv2! zO5*hxf~J>|PcdYDVC%vqf#k%3;mnk|CO-tW0E@Pg!fZEiYQdjo){yp8IP+%vH+Zfq zzUlXCS~;{}7LZ`Z13ue@wBPP~SCBQ+Zx4WL29=Ojige;$IhnFTOU6VrY$nVABYcFH zCmt3jXb3fF^FcfHq33(>u#erB=3dHoxGakpgE;-pXT`>=PVJx&FUXE(@z=Ay)d~D) z;Rt+YVw>}ygOKqhsIW5Pt5uU;O4TM4vSN%qN*kt)Y>uQZf+6=9bFQC;g)pxF(NP-F z@~p2QHDOU2@L%){n+3l|i*^rs@wB8{{T-toy!mq+)w~}$5d@{Z(}Di0F?dnJLv>^k z69I0T^%pnWBKi*Yw1%m!rl)Uvru1rijCd~WQZ^Ava1u6#%?#V5+vs?pAlaT`^%Qq7 zL7nLpZt-aj2Q9ngu?OqEB&HuZ3j2wF9%5NJ`jaY)LUgoZgN?BYhUV03GVmZ7Ls%ij zY|sGRPHVt0>ZFznn64&UR*Vb`tn3fQ`?mPwY+4=u%h!JR3#=bWc2@qY=T~s0&7$eFe)D*bPc}=^1+YZ5N z*Uf{B^%0XH4}Z8)sUS#66a$iTljkpr!xb4gxgOL^;QT!Hns3OW)qOW^GcWGZ{+e9C zD!Li(`op_%+?WtTJbFoujjrRyce2v#mG&o-T1<}P-ClAIki%JF9`iOjI6n-&k|A;3 z2#_BX4`1$^LnJqz%^ma9ufXA%m@nhj*C9i~?*snv6iAz#8EE!-pXOWo#BaqQy`G`% zUh(bEyGX8-Z|g)^;qUjPmhbIA7=8QQ0X)Xt&6xJq?UaxfpLLJeqSz7d55G5o%b2~+ z$Q2HI7bqaD3;&S&ikv{4c92ia>T$_B_*ooK z3Bse1YPzw(z$s7GGCutt{ONd~=Zc}SXN2>)v-Rw=LTzr&6UE+i{)lYX!R_2+2OWc_ zzvVFu4NrrgpC+bo!*RMF#C#u@pn5|eFDd*%PxpkJA4hWs8OL>qc(p`Nq*VN-Whm7@!E*rVF;|m&!b8)` zk&OTpb8GF4J>f59@iw^W#pd?{dTXU&1o}Lmn%Zu~mzCk_q4RE1e{|LrDdwlbb)2R2 zRM~d_QCZ-{e#=F@xf8L?)w~tUac=?jbAh@a0oglx9Ap0up4>al?HRpOk!lxt(v@;2 z^5P^o`s?LR=sJeid!kyG6U(@!n|utDdp9`50;T|Lv0l>^V-Ce{ov@Nh$MGc(d@PDW z5v16b)w(-8lb9|$qCW#cgB%%p@#%#rCw7fa3kKZK7agF7qw)>=K9o24?N#cI^8J2? z&`W=IM^gfbQUDG>lCRr3_${8rl?oK3cwXCxw&v}GjYsr%zKdiY0oj3#jZ+LF0Ld(a zQENj{Oo?WdS-L5Kp_X1W%J>VgV(<9t+p~f{^RJa+AMfa?Zbcp?UWxAyH_uW#F&5h8 zr>%9gz3av;<^u93i?M67{A!J<<)b&-pJbulgpdp84GSowo7XI?S?7t-2TH!w^$Z$v z$`bqJh#Lsdi^fg{{`$_>S?Q@bE>DYaJ&lZ~q$6%fueW1*xuVp^k+Ct_vZdwzBI@6* z-w!>%PYZ|#xR0|{P=@biFK*m{g&sfCj91u;q^PbhtlWv6fDXLa7D}S_MeokNtWWc- zk?cGtk$jmOV!VXrWqYALp77E`gZ}>{jZb~;>cEn%0&>c-WXzN^Quk%fO!Aem_a$|$QwM6eYhd4U;08SW+8-t2Fd~+|puPqUh z8;q;rd8kp!{;AscIkg9Rd%v^|m%C7iAke;SN5bG-2Zd^OM)A;5jBL%0=V`Zfg$QfL zf&H7HCm_L7sGbKd-QEmlIGn2GVDJ{S?m%{Jd7J+AHGkiijs1h?Pk;Ev7vDD>PyC7JVAK?0R{C2J;gK)u8#Ja?nMIqiZ- zo7iJl=4y1ez}6X|!}Q1rm&|vD$)6whx~N0+WSUkTa}>@*C?^cdwnzo|*p-mr<|A zj7Ll2qi%Rh>k}{~lp0J=7RxA`B?+8-dT-`^sN=Z#{DPVl_zHYgxel~Gs`5xJgTCn% z4#48tFivK{Uu}Ub(wm^k*>ba>o69+d6Fb2537aj7-d3C51Bc-E(+}HXAxwgd5dya+ zREw90tx%_=T)Aoi@#=jMfY}ZeAuGYOXc0Wzilo+x558Tkn2I&^bjc*F5@sExrp#0y zEDi|sM7SRmBVU9G_JD7fQ}2-jsPi}sX9-S?j&om`hK{FwqV@AY=knEQ~a}4KqfbSNN*XROY z!oSYmTSs?Y2Q_Z8q0-L2y(E;oqMZQC$++Ux8g(P1Qz;lMY= zH9Xr5+1B#|%(;P=5ilghqH?XYb05X8Kkn~cU`lz~DzBXOeba$CtLhjN)D`2x7r-?RX@$5}QJz@%l zVjl_&s0#yzFv%|6xtQLi*G~iH(sc1VhIqo1_VOzy%2~!!8dse&t5**ziTZ3-hd#k` zi*IW{9MXyF--g`2`wt+GL(ktiwUaj-^7KZQLHhM{28WIJtac=)4F8eH=i!sVW17L+#vwbuG=?O@AgDvH@U z@Dr}o%Xc;xb+((t7H4s-xa(d_I%S0WzYvU^%9>_85)!5HDw0wVEZXnvRytQp z*Lj3{FiSP>=v{t$Eu!v#IbWfhehky`-FX1N?S0snStO+tkZ^MB+6X9EQN*YVs)CAS z?lR%_hc)?e*l3nMsUj35n3slGOPQU4hW8xHT3OU=XX#8skxTNJlQe~ zMcJT<0U0%s_L2fqT5g4hUWB`L-fEEI;3FvHW}I;wABe>EUboQ$zN`YiTnZAdd?M#Q zmu^GaEEUa<%F27AOM^x&M;vvA0gt#5n6Ta0q*QyRl6e`_=Q{uvzucrZZdC zo`V%(^jpU*BxiG?50i%SOT?N~NzyG=Er~JeeBgqq*C^kXb!8^803^^DudWz7U0S*^pJSZOpVh;qSnsOi9*jRudo*sF&%8&koSoUFcU- z9KvjhcQ-~Mw+H&O)6a!PuARJ*G?^(Y2)my%IJB&0%Z-0vgnrQc<-F2*HSz`a~p|8S+H_}iqY`*LH^vpg+|vVy40B!=m?>fxy5dqVmMfb z8F}_c1?aV~q*+Ha&^QMZ%KRpefWQ;IlhyalX4i3O1AZe0fqfy_jfVulixQ2!2H?>J z-(ay8=MuGfvY)@5SaZ9)t@r|g1o>~NPk$$$@QfTiPPI>DjKZd*cE0b-1x#H?i6?P3!X zu~7SZ#XcV!j?1LtM0-E2L4ez`Czu6nlS8kO`s)ZGFXUll|A*^&NH64-?QY0rHq47~ z_X7+zufMrN%xeKmnR{5?n$|5xU-Dyr@UAa&*R33pvF!ky)r=$Dfd+F-F0l z%UlSkmIV1ugHGIF6nCcc&m&V6B@SS4&U z9^V3rOXjQ9E(g-61=hxc?<&=}CQ&P-pl90pg+ty0z#kdqdv+nEV-)_{KSQ`n$Mr6034mIwqXWLNYjxrXM5>l?C5EZ6K(Ut?~ z17lr5sJ#tecQDwzB^l=)L$9JkTK)7 zT0PGchn9(RJN}!%9%at5HrhoJy2Ne(yx@n|vawnw&hE*xnc`0VM=#Qv+qrAs#lkqV zG(IA?%I~~k`1_IFQ{>XJBl4%ejS5h{86(F}d_z>Pd6IXVqR-_5rhiY_I1#?IBLl4# z&vN=b7`x{?i_Yw(OPxuTR)-TgZTd27DBb(rhiUuZawg0J0x35gI*rFpF84Cs_Ckln&Sz(@lM_w| zhkhiW{T70ASssxg>uwL+HBCQdAMU3=V&6%B{oOt<3{s6`tq^kwtb#esIgQJ>r5y5K z8hQ-VCjCLhI4c8>jm3fo6Cj&kfl;xHNyh??LJ(wC60(vcO6Y=nKJ8XMf|a}ijyIfk ze0W}xMoB!1&Q>)>bd|=p&_0f!-o<~4ed7AU%nIF%_h#3JpGvh$(HMZ|gw|7DC>G`% zD3it?h_uLvNsEA}(vg}F&#POi6(syjs~CU)!1c;u;N}QzSZOa>fQ(w28B7oQw&vhH z8^&jKJ_XidVU3IX(jxZh%O~f&W4Rt5XPiOd7U6q^%y7wqLG%% zgj7Y2Tk~p+4Kt5{OpFay=2jUQ6_rhln>C}Uk@(A&$syPUet1#d^79(6 ztGVLzs`{KdVuM+Y(m4H0! zw`Fsnl$nx789Aw!=tg4P+4f%~_Ca&Bq@*Hwpt3+gRB5XP~s9mJukZc1Zk}Z z!vEal@OdUKSix=_%|BFz-IbAB`|%WC2F_+aQtEgoyq!m0TTwyn7~gktzb_E4D7D6p z?F}*4aI0_M5_tmR=edUJxl+0vyd2o^0N8UbU{Z%hXmFbqYTjL%OzdF_GI8 zXTLHJh|QMZ+K7A+m4P)ky;ZB}Y1y3&e@);~@&mp@>PQ=&&=?;YoV{vW^85yvxUw#B z%lei2C|kjtQyT*Bbi2l!g#@@Aqg(IIgXJvb$({i=>x)74_!@T?iB&s{%@#Jrrkx(}C61WAN z^&9^KeeQ737qNNHjJS`zc-He3;y0`7B(|+a))-R#{+Zh(3TxtuoUE9knZZ<^ePmOa z5Cc|%TTu&1B=1=$fz+|xdXCey+OvWEM0YRa*f0$K?pyrfo*LoL_gkrK?G|F3S8PDm zaMah~ceflXkjD_8c06ZL_gHrja*XS+&T61_1*}Km$*$HG1d_WP1Oq8(*S$aP-mBIe zsI55PJg4F{iR{#D=z@+<`KB2@QTuq7X`PG%Md2!yw%oc**7yK==BVp)DKsf^&jQgq z0sE|d(SX?25oR~O&2r;M3Vttj(PMev_V+6qDfe+O*J)5U ze8+)|qI*}_Xh;LeN$A?fDq+Fn+ymNSi-ZVZ8LDl4fVzDZA}}|@BLL^+Visa+ad75De=n;mL^$R;G_&;Ee7DrA z_TO0uXfAukfUQN@Mm(W-+9ZIh66`YqhKyw3yOKPJ~_@!iTdl1DvBAJfMS)tP>TT@^Da$q`g>>O%JgIFd|d5qr-poZx_xBcgU^?Lc?g}vmb($VRy8_!8MUtKeUrTjEWb6&70gd~Y(ibr6Il200>K>Rl%vvk^&GBtOPd+VP2 z&A_4U+Qi#>Pg#OK9WiuZa;RYF_k8)L|5(z1*b!^d#IJpK)0-*V&?*#&D# zKOZaatMGF(%E`kkLYJNEzqVqDgq)@ftVdJSDC+DOE%$5nj=1rb^C{W(v@>;&Ii?PP zal{&yZ$TOnWf##?|D}j`O9J0+eB}pYs^{e1oFdDphNB$wD#EGE zsFE31NzH1RXa$~4h5Z{ztgs*(1@|}CguvCzbgjrgcioaqKq-{17WIGnXmsxhGx(i3 z_p#i}VWMlj^mN-~<0M%PJd5zc4~F4a|E}YpFReT6Kv;0jkQumI zQcaUpPcjgfpe3{&fu5vWp#>(ZgxUf0I8W%n;fof3Yc(PNLcbc%$-G}A`(M(gNqI9t zIE%bHda9k|eO9_fLy!_N0Pn~@&!>`+bYa1kw{$L@#~{-u>;z7JOri_(z#s-kZbqmB z1F?v)P36PB*yArnD=ks2shNVL#;iEx4453X!G(4(6TZvcKH}(jObzhCrN;uj->tp= zKIDy08LUFreJ&{|%$?9j=-&Pu6;${->5Fx9-gc3_IX~i`sl5qzgLFr{=%EWC&8 zVsqqdUd2%#GH;BDADgT@m%4^IP3m(dF2!bDcIkT%xQAU!SC^j!M;M~TEGl;hsfq^u z>$EPFS9WBOUcD2VgrIEAidy2|I-7PXJOY4YT3j=Sv2B3qXEMLT&7 z9U{B*owI@W*SvM#GgAsulQPT=67Bq=PCvLQBR6BHus@=tkV(rWh;nS`o75+st zuiHNV+S!jy<~_|)oP}WgXQ~yuD+W+4E<7=>jGadx4++B8aACz-1`g}NrKLOJkCl!; zTo_WnkzW7lt^0-}v5{R3L)Wsi<$ks0YIelwz*YbM2Sz}-zm8u?y`G2xO$Ty-!GJ#7 z2KzCbdFv9j>iM8jI)`yFMPz8>3qp=pA6+C>ZraBWJrCr}hrr^CW5cc=D0AJkufRAR zc?AD}?wTCBB9q(i<9QlTf1->28iym8PruLer+4(zXFOQ}gHYd35Vim}tSAdRXur() z(A@5&#)lk*!CD%D!^&m?x7{M4<4BCglzYyfVw;7e4$76Nwj{nmcyVfY-Si`e$b16H zTN}B+f_^!QXILHpaUKzDd(W6jGh!v{-f1eC^3Uhd{&A4OK% zhI*KK`VWx!%p&YtHYbO5`a66{_}6H1=?d5hhplUj z4je+-MpkAH%HdX#DL_IpPQP3eG^IQJc6IP=eaWn8uA6xT!!o5P?neiL71o)lM*&O_ z^O=RMgmm@S`jyvT*Vx9ei1oDal1t?G_7gt{$&uQ3Kyo?-Y54H+ABV*9;gvIq)}igQ z3j!UCF)0zIOb*l;(5R$Fgn&>YQ8rCxrZF4q2xc8LAd}q?N%x%5fh&v_$BolWc)bQu zs>6#uylc?*!4qYF()FLv`EQ>C^_|Dgfus*UQjFwsv#kl{s( zE)IC~1HXBsElRz#0jG$boWzY+G4#U5kfEOEdS_IQ^LXs%%YaAZm)ElzA6Dsy?M6p` zbsY7C_HjsNCiz>7?0>hSzs~$g{a-Epgi*A5g)n~0gg!B~Qw=TRnYyA}Wgk`(d*wpf zG^}xB&8;>|of<)VNAjD1gGe;-=H*u6!R_wAwYG>>tj)!e0m!J5ymeOkPe$=hfb=Kt z@>?|X<2rCg~Tdfz96{S^F4s83wWWZt$ zz!oA@Y@uc68&SRz6ityQ`;3Ou$z<0@!crpXI$P4cLush|7lRvVQj|w;@DPJUe!!mr z<OeX zIcdT;iyf_Y)8JUOqJI-QID=I9Q>KC=ztEjAB_uwTgD zkroAAN6XkueYV`FtT7Xdh8OxxRzY4zi|uAnxMC)nA!~TN>w=A2I-s+z>ek)FYsZY+ zvaVf&ADfvX^;#}qzPz@7|H_8fmX)8HeUSV?UbhBUd)M*X9>Fj7uAgOj?4~>|zyojc zA)IUEk1Y%FqU3y5e39x+{4{5CQ^Br}q%XsuC+^T26^5yv7Y|?f)1nN!O^+IKc@6ZZ zv2rTE3mY zVe|v})DgHpGdLfC`+PaPQ2w>28*>(BZjEW-&UCENk#!hM0&I7{(JYy^irkr~Ud*~~ zDR-5}o0bf%;HB4Kd?bU}fH_dJ(i7IQ=kFbnT9~VOHP4DK2n?ULUJb2WcS^vrj{}_C zwuVOsANdc43B8;zzJ4N1T=&6sjBfTWy{K2k$JY0`m;7Rl*xAn>d76)&27JjgsmkXQ zk1yl28)tEvIWo)P*{coh(`fAJt^T5szN3sUPjY^}x&6$Ju3OSq=WT=cZR&#fksI^d zW$DE8hO}+c11({Kmni`b2+4pY!GPyAjOQ&nLq>ox@^LE&m~B0gwwXy%V}8}uT?P7B zmx>nG5NpC+eKx@NT1es-=bs~|Z6ol*`RA`3v3<|%VyahRivlJHSj&y-K7o_`F_#O|0sHpGd!R`z^A!9dS23w_6${$|ecBa1oINd<3agcfz^ z!o&*!!Szv4O1744^m%)zvUNh5YcG&2O;ByO-H%aj0kmHbwY_|#rx)HO%mW^KFCSga z@n@*O(>J`X0>tMn`$GAs0+%1dGqGQ*K)@7aXj%B8=~Gu_c?Vm{vxFAH-jh_lfvL-lt!~Gr?cWJDJb}r48Mk>8=iLlMoYg zJZbDG*>EMy@e-*UxuuPoo>^#=d6*#x3`Z>+g^ZSLYnb`EblMuJP=3mcr#MbWZLLO8`}@bIpB*0F zH3|312=%Q#!e7JaO#KMa`R}=Na0fyPMs8rf+)e9QGjUN{7{xG;LGi8{V}3XdqaN?) zqd1+>>w3Aia2s3fBNs*LdR;EjNSojXEz=loYZaSag44^Au7cmU`X%+_Bq)wwZt3P* z4e;n@LiKLR-H<-7xXX5>74$OJ2qN9QH~apckPhzgL(UOaJ$K)Z zR)L?=uou)%iHRP64=*%-Ev*5#Jp>jzTG6v*Voh>Eu`@lN5?hL|R}#w`jYq2K5|ul@ zaPWPyatlFRF1RGiW~;CoY*#?Jl?!ja#=>Mdj|pX9E$>>Z@K(O!`*)JQC-@{h=)h$> z@z&O^(J;2#@&`nILh_H~Pez@G!y9sUZ18MW)Xv+<)l}DA!bCDaTmUtb*pjd>yrbmj ztA<4;scgWKuN^|psVO%KMq7ra`DmS19H4V9zwX0O4Yw)@3wGUna4i3h@bV-Kt)z*8 z%iRBavv!vc&&|)w*S*H(q{Giw!)Nlp7OLGD2Y3_oeZM7fHVja6pyo8ULveev@cP8U zu#TMObl3~0GopZznmb>pp7vB(dU{ETOKpV`T!zFsoCFuWtNXBsc)1BGc*Xe&-kIv}|&B>Bl= zsm#nkU5D;yHnVj>|9J^SZ)U^np}sQ z&7X2k--Ad#59U{!;}xHuf&7R;S}$NF# z*g{A&%;&RREL0>fn_DtayP})Sx7BVSF8bs6aweIn6~fy;!H3 z04Bj>o?%otOVw^lKx@&T;+u5Vw6S1|HIy2~FAv83FF5}A6VOIg5q>MS&kSD!_qp_L zbQ%A^ZE$_Rq@c=~vm*jCx6+#4Po|DTCx}SQS4g##0WIF6$V3ca%m+!VB9wv7Za2_O zMQnL)bknkvJeEle97C zGpmpt+vyUtQY8fBTv@0K7lf5a3kPn$WtWA|H1QU!_|aPVm%ubklGyz=Gri*W64k4s zyJ2+=Mcx4BeiMK1F;R) z6u*Tkg=C6(Jmy@WRdvZx-|sX%yyia-u-{~^*X-Vc_CqGyZPwDl#>w#@8F4$#5A-70 z1Z6)V$Fyy6sxS`;f>_XFmSMLf4>c2m;~ZhNvN2fl1A}7}Eo;+h4^H~jC}qw+2*~^4 zqJJ7})71PnlYQd#64j@IyCE$aFo8>_JAlvumd5GYvN(*;!7A3!EwjM;WV0yc7!qSk z84qk7j^MQ4(g8 z03BxK3TZbm<@4>K=eC^c6j7-86O>c;J6!8{zMfDxZP}GaY9oDtc-u~ufeAP!jm;9M zv!Y+{3m{cQ<^a%}X(9egV4C}dS$~_EUU7Sg>Q&L*urApBJT26{An3t>#}%vLtLb#n zsv2Mb3&>l8=%Sm#5tLD-0eI6Tg}8`ZRdsH)cDb=)%LzyW+(}V~!v}M@PR48H{g(CN zHUD{l{U&q0X7?7fA2Qi^W*%r_CuLLK0S&K<4ufRc)^n1D%WfH4+LZ8#0gR>qxc9fo zwrG~V1$DFDRdG#Nj>J_RAG|p-#a0>`jb^>k@zlQvwgpU%+HW%1Ctfd6eJZ#c(u5;$ z-i9lRucb9dr%lY%N^jYFCG(+Xj|FRPCr}-jRRvI4Q*O^6(r~}t4Vq*ySu0DV5c|Cq zjln%U$oJ^PL^Nseet_xxl7Bv+?YDX0_I2;ue$ey6)HEtr8IY!nN-0v23Tuj(mb1<{ zuugcGS2Gb|mkExuPU)=;9NZEJU?THyC#Zg_^+=Uh{1mBleT4H_LLDX;;`|wb;J*yy zH+kIl4R70i)YC$WGsy&mlt8YSVYAfgx7^B1n>y~Skv|ZDt=v>V0>r!UPYDQK ziRI(qHhv64k1^Jwek*<7@4@yZvu9{umfVf(7NxOhf=l^i)5NX5Pa?4 z|NACLpLo4Q^r_%(KoyajPnXr4T#tO(cAH-0kZ!~v0$C9ZHXjQvSE(D?&gTbwERfKI z+j4u_ku+VN%qonL9Gq*@)gtp2GGZdWsVuYheLzny`RC*L9bMZSPA{?iXxBE>>BByh zWiW9LDR&TLlms15eVamQ%K?E;S5YX@-|6mz<81!v+Qn^~*o9JcN}9vjVw z&0GrTd9C^zv$fwx^1Is7zYOFz*=75NqisLxW})eti9$^3%e~qODpgyox)e>lsSdk6 zG)dPe5VvBA__XUwaAPLp$$`={v*ZoUT+o;pDl3}LN@BY|EaU)!Nqp@5lVMrd=1`Bz zqwsZ0H^Qr9>fYL<@`<#pZ!kG;SGl=!-nVi`T2=xEv*bYLP)Sf>J3A!EsDo_7m08b@ z?U>Qa|DV10>Tz9L8pQs}!F{x#!<+_~@lb&hMUhmXL{f&o0dvk-fc@L8&`I5`-fZpO z=Uy9rX>les$9#xB?Hx{jOVM)os0Dh91~J)JC?B@H1i`HVcd=#JI83B%G&|U zPwDU0M*0e=UTmImle<;%)M@?tefLrWZaV<=$LrnqymWYf8V}Kat>?-xQ>iw?s-Trl zs$P_c=^(-(BWuJI*rO)1Qt{|3PYC`wQR|;W` z=`f#Oy0JII=1!JRa9>$^K)#c6uFeD?TeNtWEDDEn^>A+vye!+Ho3WzR5#X;*&?X5c zjcbmNQ=f~)-0Q%fOPwh-FFdVNrcr!omh--~+ym9l-$Q@yMveAsCXy=KL9>9JL%LTo zM%zvO#Lo!-$fwfGCi5NcrHdn$)Qdg7+RdVHG4N})ndL`wZmvmi>kOJ`-R_twk)a(; zH*;ZXGJm%1z}xcw=juW4O4XnBso1d0;S&ZgcVXu`Z8r&`zE^rr0Px$AS)u2+WqgAF zR4Eer8+n&p8flJa46jXeE-=8q5%6uRLEVortYP9FmjGB^lyr@QVdodk@^=gb+gtr9ThL~?~ zNSkoUKH-k}Y_R5146j|`V4+zPY$ARP9w*EC4>c|%Ioo$3F_qZ{iU%uXgcB&~A4FhV&kq@qjl?WFt_K~H zD`_IiGQE^zlcD%z%h3|D25r@$kLq#ewt^}qU9qXvF!kEaXp~I;Q<9h7r=dNvVttDX zdZn-Z5EH!1VEcHoFAI1Xwf1v7h;2SS%zX?45F)7#Ru?q-Bx7L6Suv#@yW=r8n;0t= zfFXt(Q;NxpfYOb4BICqOi|<%><~X>&42jVp{7+$lcj-_66bF3e(D_;Vw;!qB_NV`R;6f4R?s&c<_Oi&y z5-|3&xhbtkZC6beLG>S*`1Z#s-zUfFhe&^$X7%A*U*fB~Z0F=Nep|ugiAcikF#_?MK-%UuzS(i=udBoS5FMoDwyNe0V}p~$s?!->;Z=JeFV1!FfcQVd znfE@)>W@?ZJIPr;#08({XWhNlmn)c+>DGmeJ0LDmBUu77sqyv)bqdQYlfb5mY2$6` z&wwpZL8aae8YL-0WeWx&0&q&aTZYRVnj*q#vuQwwDB-}-ewmp5Z}8Ipb3E}2&%{sj z!;5?3)AN1#08JcdKd{T`N|}|VC=%8<-Un|S)CJQ35 z_|`wj0sq`$(0;xYwBK9^6d5UztkK!V+jg6=<5(hmY%PS7wW-d7Kp;~VIRKS((jMXOEPf-aSD)mp}XLu?v<;_v~UWZrlq+=;<^u~~k^M)w_zQ>5TU=bdBjl}j zwb|*KgtU2=Zw&PlMNsVK!|#(8Sg2?F<+6PrQS~P%wmb{lM{yy$P zX+yvj3(jZ8e`09TA7p~sEB~Me_ze9-3=Fl% zvpvyJi^_)^bH{WtNGvv1obfXl#`t>G1|*7@?ZX$uiJV(5%Str4ZL*g!Y_Y`%imrl+)FJkO3es>tg`ZM__V!##v9n* z6!aK#e0al&KVApJE8rf%!bdojoYfeL+$_(xGY29!+*p=?G%zb#EnD5_*p3^y4Pi>M zuN>H87NtiK4o5*J=cpU9(b`EXD1uVULw0e%Y~)^T6hDogdhWV+4V!vP+a7UMC#1wy zeiG7)(CWTLr<2HHl*0@9z9Q5EwRAsw#WfW1d2}UJk2<;&(l5qV+io! zoQu0-G#6V-#taDR$ox=&27*?A(LtoU7Z5 zihs`P&wTx1?)_6l?>X5oWVp(o7PfIOY=S4d362=6Lco3Ls`nmAt_5?7Vk11cdu7%%+}_s=`! zr<>gQgC7xMKYPcEaCC**!`{5ZfNfW<`9T+Cd`!pn2(BV+A+TbxWRTUq1^{TWuhncfnP!_(Yw{8oi^mtiqd=sFzK#>!vOK&hzWZBdPmtnLP9DcW#f*ScF-TPxk6o+r(T?>)PF5{$sV z`w1r>)r!yU25*&?{uF!%{Y1jo!SDjKhdbVuD5UbS0$gpD#PnzwGrmCdJPlnVciecA z>|tEUICo5MA$Ok)WK$?s^%UrI+zag-b3K@!2Dph$<%PtVtwZ|z9~3bz-+0*;|JVQe z!bWzQRS&fb{Q&=j#5bei6>bkNNwQA!Lw&@WHM3~=NoEz+Mv-eI&-mJPQe9!}eJ8tm zODQO^5?LDefPtx4_B1+h3GIlQWNNGEIj#c6rPEmcBww69khs~e zulHOqbMKZLv^iF6^Qlt&BOhh1BE&S5=puyOj>2oI{h$Mn$d9i8>Z#t+HHWjuU zj_y>AZPtp3{=6vi*~&`xOclFe%y6}PR*SPI>Jit&3*55+c={P$0QD&0)nFKzSTtob zdW~a1heq>KnG}@1iW&YuF9E+bSIjOI=W|w3C@30IApOU=y(X>(vUBu&iLp|z1M z7B^5qt zUcW1@zuil}OQ+9Ybtc{CSB96@^{8GNg4EuvO4DZrQ|^>@E(<_I9YbMk=Qz07WeeSe zQB~Ph7+8lPdG&2vwO!wbM)BWlU0vTTxZV>i=CI?Sk*y>3m2nCrqSDCQ$?G1s_Cg%m3* z3`H}FEnId}P2ya4V|!(+jeLZXh!O&JJXp+HK87H#Qsr0OK{PDojAXIUWN&u5z^tB-0M zWS~3S>$*7G9tR7DY1>VOa%8L{YC1#4JiRG@7ink3?hAZ9VmEmU`iiQH_ILr;qsAJ4 z7^&U5)@PC2$$Lu!r}F|BHA|;820Z6M$K~WCb_7LoWKng&8&XLgrWLzEw>rf0(v;+R z8Kr8FZCGre6Pw7E!{5bHVTG1adUvf4=V=4|4z6Baa7Eb5aCn9MYqaSutyC~FS;$4s zqFAfhY8tFjp)@$Ykz;xc)Ld@D;UI2#rm95=QFv8ieK<*Lvd&0a#8j79YX%T+trdVA zeTf6V3Qp*SHuvg}xyN1P?_lf<`w3g;!wY|reF}wHpeNhL#M%&9N#rz1js!0=>(v%Z znf)qFFwyp>VIyb~+;vu<^Wd1Oxj~nWvS~EW@o*AsVpT|_ks8v@LL)S^R}{yux96AX z_#KV!&8B{@gwZ1oha1>uJU<;?Di-zdH5imjnfpEOIsD2%^+u}4nAv7!wm3BFm9;8l ze-)-%F;09v$?W#SX4rz z&6PrFDScUC&WsrCWQG;MB4F2xHL!$o)@o4&|7ol_R^k_T*Fu6q@$;hfuw3#4{)D@y zqu~q4Un3A7lW`_jIpR~~4j+Wd#Fln4YdiH}H<(sYoz6K!^(&v76HTIaOCK(Fk!^$J z#?3RH7$xqmAy!A^FoJv^c4UgFqu<&-z9^vtV>clW-^A0~>Pc5fJsOau@Cqr{{I-=V zCm8Rz0=casSc>OPvcFJ#1!q=X$*Y>rogYG^9DOi@kBc zo2AtT$yfk&mPmPHF{z_9v#P6A9ZfZr286B6NVH?_wo5wM``Ts^5d-|B-SdMCI;vu` zMH@-w8R}8Ye=o@Bq*Xn~o&6WmyQ<4w7vKk4Jgl(4Kz|{}CG3mpr@No#!V<7l+>QsF zv)`|2F;m%6XTZG*sB~&!{1IkAtqZmy>9h!>tK&mgZ!NVQ&$;?IpJCR)HwMQ}+hU`9 zBzGD-2p%<;d`6L9`PSaMpU>a@jX6@3T3Ho0U~d+u-_b3fVV^7GJsl3=e!6AL(~jC0 z7UOPc_^1vPeM%EitLijJA&u$Dlpo^K^3b z)?V6e(YRXKIK#+`tf!Ueo)-2nlHa}JgxYs!E~;1`!55~vdLofh(k@wX z7YZ2UNZwqr!@_16uh^ogNTich!X?#WJlzKFA)aEh4FGiH&9IVt9q}Yg|e0p1~*My-Sn9Zq^Mn?Z~XrKv@%0Na_e0 z=~70tK-O67NfF>N2%1q8EyJjnbGeM+a*3kdj2d`8$!J+Jng!KJ`2)_M8%eI8a&}IR z@CzUfE60n6U&$lb-_RpYpHE(JLjK#~@B+Dq$%QqTrMdBdy}H?v;u1)!C9zg`RkP<& zCdQ3)P%&@^Emq-J@DXs;j`xVBTGVeWpu6b=HP5cDmoQPRGtC8R^ zH*NziK6U9oIhk*QvahetE&Ie5*XRuJRu+E2+?O#u|8;_U4hTC(hW(HK4#Veox*oA% zx4>Q!e$bbMAM7RE41YQ5?PNQ{D@wp>Q|s>RKp!j9djtBchF=bbXuk@*Q?{KE0osIe zV^!njj8ZW+=9nhsr(&1$I)2W-chw4nmwO-3kGm#@_xx@EAuBH~{EbXtO3X?Yldnho z92=O+dOZ09GvZFU&AhnFH80ka z=1GYFPqX0z^YtkbeeOSEoMzhDJX%|q{FduK_6>fE5+ktgMMnG{zglxx4d0594|}zLm{@;7k)dk_FeAm*U$Bz5${uJetu%yyx}aTydC$QCdlTnJcKSu zvO2gRgtfGxCEEay!%B>|yBMw}qg^r+;*;`+4|ICzwb3zk1sE516J)tjIZByqwtY|*J{^sK$Tx^ zd1rUclX&&-rEw8!Y2hY+X6`-%KO1wN4*OCX+;@~!Nl@Svu@8;sW!ZR?M>?xaR=u)as!`d8quU<)WyxBhNnE0o#U)?WO^*hL~&QWZY z*BAALw4IcD9-4_(y_pqb!A+rPw3~AYwGIso8_dVK#Ym`aQ4~FILukDgl?YyDqm2kebna=uhvv5LIUH+?@t-&`uZ zynfl&Kj=B<91FdBdf`dU#@^rXk4XmKQ0j{}i`_Ta_X+ENfP>GF&rE#&?aRlCy;3Ax zBc+3in8r*cr)E=(s*oA8&0u6%3b;AMa0`q|PX!1}ow+1q$+H=`X14+$yIQu*r?8lZ z6Q^Xz469sGivFAu_3ORHNa7Pl%i(KlmKTNu|7~3L1zWUdSC0kQ#a(aT-}ochDX(x( zEOGifyuj%Z6NM!Zi)%~4Qo|j9j8~x#94M&M1IXDGoHW1$dch808QuBy7UPyPnB=G$ z+totC?EU$kTxtIP0D_x2QpbL`7KsD>SWJ|rCnrLl2wI-agm%cF)xa#WO3>1LRBGfo3Kb&N z#Pf-_E~Y+2WuTcKP1&^QdD&QBg-`UDFxNE8Qp+9dG#6YidNN==l6sH7Nh1D=S|<#j z&8}hMIJZ;gy@&Msu9Ek_FVwm{b#ayUaG$^#s^N z&X+3$u?KrrULLLEIz1TK-XVMqS)%4hiH=97kp>zFQ~svKR$~uYR37~pgBymGmS6dj zAK>dN%rkcArzplrYla$_bO4%jf z^7|bB*V&8TgXNv`B-6Dol3X6~QoVvbQ}JamB>H)#_?RB35@|Q~V&#llB*H;n$h06r zKt&8XHkm^m?pD&e9)qjqFe3tw6f|QwGV+x!Bneqh4;`^ctAH5zyf_%|l3MyhZ4du~ z`lK^!etieQSkq zTxlH@2<-wzoU(Ptk&rpaIJoPj~Esc<{KROYSrj56)x$?Pa&q2 z7Cy}f=vMH)+*IY>%WS#PsV|X&S3k(`ZSv&Pyt#3yWtEqo3nnGeTSXoIyn4{j7vi$g zM7MJ57`(Pr`I=>(q{Ms6EArSz^a}ThgPum$pz|L2X5KCfF>t!u462=BZq~?rl4<*gHXqPm*%6s^@yAU@CF#e z&?vld7X8rMf8nA0Pg)*A|`0U@k8b1!B`Vmy|Q0CEx^7iqZJ zPNxSFQCLxcu%zx4L;oxBuFrHjfA0w^R(l7j*kiNl1?)3UFM~?~f*x}zs}^e|l(xIs z5?;=!?M_L^eN(7tk!Z2&B=}O;MkG3gPJ7#wED#ZFQq$WUyA5>&4u=IF@^Xz3nJDU1 zYA!;4H|3aKbLkf-?Nb}=^0`IXg?EDq(VHr9-@@q??lV%aqu~W!j}mD5h|0$cT7q)j z_x2MVb~BEd3+l3U%77GhoA!XPhh~B>xKOsba#)Y!c{<}%fWPrCifzVrQZ+`r#t*>JTmc#GEm{b`5lRdY;>%P>cW26A^(LLNxB zdx3f(_|x(50;@;2B_uYd2-!3=e#B{ir!NuL+M3f@h)Qi0&L%6HYDXZzs;H@N=JLqJ z6+z3Grpn2B&aDHA*Rw4Dr*;W*T);!YHK=Y823l@ z({uL{fga`LE8w>nKMgP0Kt1?56JVy8jG|>-tPL6)%Tm5Nk}T;6inWDoM;VP=mLT_C zJKB!+z;xkc9T^ljJCVke-&IZ;qM%WX*J!cCIMjpH0|39XXr{SkXirvf$@PlAo`Q(~ zIvu`V{Y#6@zZx$L|B92p!X$RA{4d@5t4hzY$L8OEtwQUh*8O#&*I%V;{S{lyUzZOa z#?C9ixF{{n{BM7KvJ^#LaBiY<65j(0cz*JmyzyR-)4llqRP;_<)c)=FX)1qC^7ZPw zHap@map4K*rCQPTa7gqM6%K|jX>7I-?XdwO>t=%Dt9o%Jm(3c)?;NyIzXUVPS_L+@z4rM{*w11ABJF2v5LPI*6zBXjX@qvj#^fdD3!TI?vrgcD*zn9bAFMVa1hQMa~0jL)+sFWbNJNzzw!l!}}_< zQ)Z(bOf)I&NzIyO!wkb&ofQXN82}6aBv|kp2(>Is9*u0y!xs2ALgeVvZtq&dw=?ex z)SIu?zS}^UFVOy>RLu{%W^Q4h32=L+uVaQidgNwp*mgFyguTOf4i|b*Q3N5Yr}KEM z8aN%q%1lj0xRWok&eA)=uOWD`TRV|N$Lu85jR30Jppa1WC?G3&^k|^suWNnw!Fu`P zsrbB}5A;Zp)fccAR6iXLufTfbdY2HG1tc;PXJiW2T%?V2((=6U(1;KL(Y3x2`LeDB zugRsb!{Ks3C;?4wOqSj2DSs~JNEfX`AI;6Saq+kTu*uK6dEWNjdPJP)wbDPyR-Y^4 z@B@jQ7l;?KoPLKF7(Lv_<#;y<+pZfgc}L@sR&l^FxRl{Gv#T|pf>=79vV~H0>wyLZ ziONaUh(B(GChBy1>C}q}Z-P0rlwx!+1tkw3!}Nm=$ufz~ad@F+rC;oS4=m7c0H5*m zW_Z~Kdo0p{Ao`Pxc8RnF6zTQuRb_Hg4Q;Qzs}^0FZ@>?z&2K=T(fejN ze1iFF1Pd#QUQGw3I9OJTSxf-bz)0L6tl~wX$et!o?LAU>=*$C@`J~wkPSE7g0@s0-k+Fw?Q^<1jLWlx=-S9(xfQQ zy`BE`^4OaMfluF8dZrb6cKPL-o^QImYty`G!x)(>FB`da4%>Uy}phs1`kKZ%<$J zudDB@Ul5^I*IsgG?VuhC9=t$2FB#|GA=NKv&{pYfta>;Ij*B_qQ`2=)6XA4B$DZnq z7|)~2kx(7fB@Ktx(xNi4J{&W3&iEzk6`)h9f(JWqVdJDN=0# z04#7_6BkQ9*_+i$-CII5QQHa=cQgbTBfHMw4Z9_34~Lhg-~&}2K&~D6Bu=nMR^rux zxVP;}h3|<;ku@p#A>9D2F50C`MO| zoNQY~%sAQ%Kr{1s4y&<+$IOo&IOwI}f4RuPFPYDMW{Q?u*X|DY1KP+3>~e45Uhw-e z8eZV_C{yn({H}(8Xuf1u3c6`LZji_nfEtK2-C5#h&RI4`bMXNSx+2tt!CXn2QrGs= ztVCIUHzGtOJZ%z2fjb3bC4ldGKR1IeU-U_+>toaC9<-mEONE7_LoLs>?rMPkLQi;v z*zdt#X#W1>MQ7+idKT$IG^f@h?66T0rCRK#E8Bn-_aNeGV=*gsuuE$C7!OFm)sbX@ zhjCYEjN$LoV7#*TGP9f1$$<=_{bWVR-KJE3L}xe$81~xnpT6C{H>YlUc6}4ge({Q3 zzZhO%{Tit>muhM_kI53OD=<{QY#_ zRU7!`J5IB;sKRsKmoHy)1$!Z4QKji=o_|B=|C-Ih6T?2YD>>&)q+bPbpCrXccFWJ- z^2CLoT^e3r)uW}1Th=33n8A&ogXq8|h{8dFkY=0Q5wqCeqSS0wnelElV;ILFW)RU4 zYs<*e0X)gEU^i)n&B)NeEk_tLa?ubdOy1KNN^>^sVgWYNV^(h%#KnJ80eIPs&f4X>rkGyrTBlDaUJQyiy60ye zrfY6nA3EH23;YP{bL%4hz~=Z4_O*WB+cU!p+#Yc$6;Q<9I9HJgCY!}{Ge6F!=nPiJ zN|wwpMw;)u@fh8*dX6i`@-R|Ctkb9|=c`sgiC8PrjX%o<(88RJ=q<6Pwnp-sKFSXy zx=kOv1RVb_(>gb8eU9vZXCgSeX@@V-7cb_B2VBv8A|my~>|X5Qde0hR?DqVEkOc^tQ*T)(p=C z``5D{`{wGU9G>_3Pko;+KWohRWt{z8n`sY=snwn)QqgNGI)@MpPxqgLBJWl>ek>^C z9qjXrxINQ1EMsK`q(P-gH&9*C*~<;I5Cj+o=7v{0oZO@>mw_k`_);|Q#)lY!<<-K{ z53T8MHB5>|8N1DQTSriLh_w+np>L1Jzq@0-w@X}2R^RQ#{5>uGjJ~f@A|8Is=F4RLL< z$61x;7~>D76N@~72wMXh9c?~s>z`kzY%dIlxfVMwJym}z?D#9n+?d-xm+jz3>P)_c zd?C~8aCimTBYtj-jZARqEEK1iWxF6gs6ZX;)*zabf)XzdNT+&eJ&Cs7AsPdzxfMV` z7dET*km{v~ROa=2f{IQ=y>AidGo$A)pjf7vTqg^YbUH(#6ztWR?3A*(%A-%%0zckEYe-n?a zAuqYK!8uM; zt8R{_BkaKPl3Z$DJznwhGKh2{f+1s3rza_Mut4Hs2alu3YlYFFMQg?fejs8y>S--oZz+4Lb;gNQz6LsLjI`QpgdbZt*f+z^*w5 zgMG{6fVDrsZ8u=DZMl_eH7ad}pDfw7I_Z7$X2RK%Blero`FRx&PkYx1Z$|E=<&*UH zNZfI6y{*S`RCuv@rb_Nsy>zoDE&Fq6A9_S1J3~BE`TTq7AJs$q0tB0ox}((MTcq18 zL|vr!1cl)_Y2@%g^htV*nI+k5SIB5hCzgVdLUPi>cI1jY&H_Q%mcF$0aQi6Y4495g zL)E8`1|9y|HPc62H?)&pa1sj43zKw1*9ueXZqD&z-mp9GIQMM){7PTH*fxbUJzRiZ zJqfl)-_RCjJFQ{?1C%-_m<3$$BgW3~7R)<$y$4_&;2Op{tz>)}&C8Xz^?Z_}D4^Ne z$+VJ0J*xPhuO)e6us4<*=q5D$I)|?P-p+`4*=D}0K3^!_CtUQ3^Q4OJHI{__exw)s zE7%vho(C6F_NewT=n9G=b`+i_DAxk?C>@P6m!_swyU^D1WbF_zh0RfSl)5#-9vo0l zMqJgXX^E;zit`7Ijt=X12b3Kzg_~5{TK><+^WL8>SE2vL0C=uhbo$oZiwn~Al$B-jh)Z@9Ty4`}1D6kUJl*r!|49 z5>BW)4_ho4L1wchj9|qm@)dNDwG>~~VS#ydCrkySY*D;jFV~1BRa2rUv_Di6rjPaA zI0+Zw(70cD=dq$-uV61oejfBK1UBGx?pV_5Tv_FiFGyQ%&0z38H5k89u}!cc>^3O& zw_m&)1cs~!Fuv=}yO0-2!;znF8 zugdKNUAasxk2BE&N3(4y$OT3ylwT0aOiJ@@#3VqaUAkRJ zak%+I(lFFZ7CzU+_(G$62&-XmMQa#bw8%c5PcGJ7rrWSex~r@s>5cfPn`&sR`zR}} zyUI0yrlSIt0ObA3XjqZj(>PA9DsmHu!~mQT_;$Gwt*)WQ=^Df#4~>4)t$kbN<&p$@ zy97U3W{PVyp?^L57#`3vKY8S#+9sF3->PbIdLnkLuealeM4nf;S6+A?^%Z+y`j8UU z;-IV3<7QPbi8k z*5G7qcL2occz^uO4f#fN`6S=@Y}_lgxO}^9zq`duZmz!LDA&@=+g<&=2fP@DN%MZ= ze}Bs-vcbE|?hhcK&#w<{FMmoQ`S8EoiYLge9*}Ce7Jc!hsaBjM;V%$%>7joA`NBE} z8W`4Bx5QfT<@H8Ozd%yymEl*9e=2}|di@58{jx>QMN^C_FYYG%J~%61z@8`N%b@R^ zWP#(HZVJw(m~56PJSxi@dYtIgU@KI?K{6?HA~P5FTnw9&T|ya)-%mt%s}%mzCe$+;8_z87CyqQii7rr|2z5E` zYc5Z!>R_UP8Nu5In?+fN>$6S}1PjVaYLiB7Z7sJV!5K~=#XDl7*hMn{^eT{N38d-H z$m40x0C6%m!b2gVtQ4&*~+2`&(?$gR8~*{=k_Xln^^ zR}};{Mgc%rQ_i}C0HctUE&<4`KG5tX9USSjWGcQ$Olp1-A7(;j9#RiT)_VeR<2^Sh zHUn(6-|*&Ok`wBqi2b7Y#w8l^g)2X)+H$@l9iD~H%XR#HFj|vqZ!SOR*62;x+YnhR zO8l>jNsbq)t2Oa{7tN;MDFgC#i2f&-e8&fOLWUj) z>3R$J(vA9cI7It33U9b>y;-OJ0xZ}Rho|}WV9pAkU&w`)V#!AE+__ufGh(q90m^4b z_^z|+<)Bn5G0S6z^Z}#gB)OA!O}&+J&pRA}pSMfjGUIa<+gnN4uEOy8?dRy@VVa!2 z_jB3((`omIWQh07@ODbyE4lXlN%aEt+@tvU_)>JO$AnV%GuDR#En04+w!wws;3uQj z-Zn)Hc7|yck%6XzH4GWpaaA3lG#m(ayEofaY0m3N*o$ji*{U;?-j!VmFdi|1@Sk@x zebmuEA?v&K_PrYLk?{XU4gQ5t-_zp5B>u{r`+#ff4DqrDpMLu~v=;060bcVm9wOQt z@bPw>ttD3lC~=NX04gjH)Nq2`$eUV;v5|HlTFz~5H7a%-w8{?S-I^z69u2arve;J2 zoW)U2{|OPar(ZZM?rm%Ejds@`iA8(CVbKmR5PEb*RU>dMkIG#>k`M9>G!YUPXLJMM z2a3X0p14oo5uy9?R-aquEW|AEAZr(%vZ3U~CvXfv$v0GhofCWdH?)cEl5cU(U zo%0&2hlvpko6~pQPcVHfTKNO`Gj89X8$vyUn8n0Sz%)ZxE-sj|nrB;vkg}1T6Od+g zhsk~c&eJFx5zL5(v#IASL2o4r+woy5Qt6a34-(zdf`uvb8MW&`m9I(To4edssJyM3 z{BuRWZXjPU_-5R<;MZm|9j^+X@G79yv4m5Nf|+mAlo8^>2QXONOB+r{k1H&Rm1fT% z$9)t@iC~EKY&;lmCaKK@NBW1nf_H?YzV6JK{bv>Cb&*lB29J% z2~W1jh@E1*hBNVKzbh6*v)@gQs9B5hAM&Nc{n#+NVRqL?^i#noIv{F=MfWH0R!t}W@d?~;CP6@vTm%giv`<>#d|B2;M-@7O7?I{nK z#NI-_u*sWo-!4|x78EGCiF_%`#b|>hB*I{|OdbZ*2AaqFBhp4k310C`3Do=rE?1|KMt9|Y;t z!X%10Xmr{wXEQNos*aZrshNb5!k6`Q0g``c;rtKHwS1Qvdym-P?-%(N@Ea;$l2$Je ze@)(4@-y2QF;g$)Ol4f7>SQgC?Z{XjxQK*8lL1pYNu|2Wnb}@9HuwtI)3k}r2w?!0 zQckWjZwHo)W=?R1LxpnDh<~VlYtII6pEeWy(G~9<_$%t)o$R~zadnDf)I8tA%ya>b z>B57!YQU>VpcQk7l9(=#j&LhSyp`d401G=rQEGcJSmRIxwm~U3%2OPUp(RdA6 z0=w4AM467d17^xj%w>94_ zS2#C2_@Tn(;?hFR#hPQ0QR`uiZxx4xQ5Nzv6y%Y=I`F#theDt5o+X-$v*-9ye8T%G z{QnVC#VgVuFvuQhyX#TyK@%fgptDJ)#eQWR;JJ@9QxQuKlPyV&WIZtQ+H8Yj zk>t&8GC63GLY-FYAf>bh4x`az=>(!arO}BjEGS0(N*wwUO;)44}Lbc;`c zl~?cEj1mfq(?vP8y7^RO^@whuyddcS+*f(A7Mg|#Z9*+~&G8R7vf}!pB|c|7!|#$Y zqjQwu&^}@9S&@8~P2(5CPK&~Sed^!1Hmo>z3%y*&KF^WOhu|EAuwx4sMHW2MC#KtEMp@h!K0rz^>Wts6dRO48GIOAaVGvvi#~ zrV1r)2C{~WFr^i2;#eF0Xv|8Q70i^M&%2Wb4cZ{4ZJGT@H>TOl23AS~O?~<>$Y4O9 zjvQoCS2>4#Lzi21rF+smU)b<_*nH*ndl5a~N9GgE6E2^QF3~)Fx>&9`2|cb`B_zXT zGb-o2+-Q<9vl;PFd*Z?>5wQc>XcoZEVU82Tc)?TCy0p!0;K&9o9b6y4u*Ct)qYjC> zv4n-i&lf^@!-01T7=0*`@Mcjt7u`5~>kgE-GPc-+jlbvmoM64(hst+D>pBo&NhW+}?M z1J;7r`QkejWIy2brRmohtCzvw@wbal^mb|9+A;6hh9B6Q-vGW6l#`)R z3d)W%jaYjun zVnow!VU)pwO)}b@`(@b>n}W&r$wE-{LYA|Wh^|HhA~^UN9&J%f1bxrP>(bj;Y09mq zWhQs{EXy@Z$R1RVuy{#D2v{F&>u?-!!!>nggu$F}a*QAch#{(Jm%f&0Qym(it(P7jt^58C}= znao6s<&{IE?>Ka>1_PWj)^mJWnVXXg4y2n1R>K|OPWIH;+ky_a<26~uY*?^%b7~C5 zdqgj!aGZclA?=~xwEJHQ5k2GTyk`>q>rrNSWU#s8V%xbkqC`)cO}mNYEf!r1RviYd6|XP9RSkE;V--l(nmad)K$6lShFQUuMO^xflQ0Sp@p}qFdqWJry zE@)qv?H?)R{R;L>(w9NsQr_y$vkOJ3f_NV8iYRnC6wY!1!ZpWzU5Y^xKF; zn)$&)(fx#96M#Jv0$)V{e-H8F0W^*dx;8&nPG@b(^ye(bMREF^yX(wD62}GP6<4Q& zzKPv{qyr1X=O74*g{?75bc`3uA}$3U(#FDW;-w=%3Yr7sc9T4xqQq8g0f=lESl4~W zKn}<8_9SLVSX^RLok{2;uz%DB@NpY?#?w_AypF!h#l3`yqWHq`ggg{#`~>q#l8d_u z=@(#pgyu8OP&>G#NqV-nn>+?rbT?Ry2nCpJePp*^$W+F4F^aUZHgG~LR-zr6WlMf@ zl=n+!OmbDRQ%DH_gRv*7Db0S1B<79Z^79D~cLIkfS{$0{Mc1$?E* z%dl@9pE&8 z-sE#zP}-ao26Ox1#K%mUr<5;79Pbv=&R4`md=SlpO08kCLpw|7j@g6@+wdR7tb1SV zdQ4q;2Kt22^I=~_WveYmRWpkaUfg?|45mi`Vl9)lIZT)796!1t!sv9eAodaDBsSOL z(-2~H>&*#+Xdno%je(W z1x62R>a1zxxLMc1-qvbvU&1gmTQ-AM-I_;w(?noi;S*Qd(?}KVF!x}<~{ zxKgRb=wK)ZZ(JPK^2C=SY;6NEThkpuM9PHrAFliOt2S)96%Ny|I+1!9X=n4uSLgCLYFH3gAiHr*z129}JZ z?qH^lb$^g^gG%i-eAN{D4$OIPU#{Z8dJ%F=Ew2D*rKVb%sWHe~a1b-`;14aB=P-y~ z#yHcmwJI#1D}~>|Hg@S2^nGmKz`o%8=FIQ{_t%(LCRM%75OSVFyeXi>bW*Eji|jyN z%F^*P9x%9Fl1I2!Cr3W7*X}+AE00RnW+o$i%^`KRn@UbtLgjwu_{(a6dB@*$g51^` z{v@Q}{kM8o^Bng7wi3Iae#hrb@{m;X0sJR?;+dB|C_N@=3+>0Psi5V6Z1%PZ6$wB! zgL;kDEfI1iyiT!lvZ=~x-b5P`6P?Ibh)uZM@Umuac$IMVsi&}dWeT}3(kl&cm*h`$ zMEv(t@T=gx?5#uEAU!7sKUZu0H`40dT_V(u z-7w9Qd-2#0D$DPHUuk!9s;|;440uaXlPpJ4(TT~{?l!BwEKxHX6WBZyAzN*1Um$aNr7;!*7bFS$=782|cU?LhuAAI$!CEb}5bWu0H5JB=TC|mO zG)=kdLYh6@&Ci#n=QG@ENg@F2M7W2C`{x^U4Dh*+@hO4#4zd^|nqNHkFC2M3_^#F) ziu->W*7uasV~GoAf)}=D*3jexcbv@dC2n<$p9-lvnM|`{n$gvUj|DGVhCq?hy=5Q{ z@8J+o0?D#;R6I>iJP+xK3dj+SbQBFn?CQ8q6?RgVeDUXk?uYE@S$1CQ_kzf7OBfDk z?3v_+wdaEia|bM`!N4BnOL4|Zsdsc#jb>AXE|yc=ob;2u8~0+@s{VepV!{<}PX(*n z2=REU?l21-<`k@buFlcUk#F4F>w_Qj&%e>VF!c58 z0;4d%J5N;sOv$oLAStr#W*BJ`lDjKgR@s<(5w7Ko-50e%fpyU&3kd8K1V>LVO?7Js zN)A!J-5+8Q^MTYE`zadtzDHGmv!v_~V8>X#(w!L-OPUlG1wVCH^Jwg8i86~t+NMyfotTEB85FyrEmDr>BFD&>>eu5IkOJ> zek{kQk2uTVv+GaShYVOpjwu1|*r-fo0RgiEht@pLI25~aIdsQT?VO}qufwgRh%qnh z^SIp3rkX#?RiD=up44&kZsKnfix-yT1GLa8oB6SDfOn{;KZmaJLiEDB*Hq&{al5lb z!cRs)ZtB6j>}qS4kLR{MX9~FBCYyc5906~G<)){wzO^z#A|U1Ey4>wau@R0yG?S`* zv_qLdRq}@0>m#rrhM9QZL3c$uI9t7i>dMmQ3v z8W%szcRhroI_#Y00d{MU*bGLP7?tbAh=dn0JBhTS&X(k6iwiMQ$}nCjQQjRpAEnD= zPfqVCvhySWe|Hji)PBA)qCFeXLu67tm3j1aec`ja{Q<4`p7L2h@6RtT{2>VDnX|HK zyJ{JpF0sWzo{2JG14~T-ST31vL4`^o$i|Ym-sT&1LLb6OVNx>^n2SkjLy}eH5sIxb z57gJ>RL(tWzWtkBUr(y2K%Y$Hy8b&?%KM)m?_TQ=Uc$WoR{7m81Xo|ML{3Y^D*eKr z@W6l7#Q$%dy~lFsAxK8O|GbNzr^ zV-j~P@^C%JIHT&i{!q)dT!Fo1t2VmckIm{~2kqmfVs7%9ep4dIO|zHEK#ycB4Xg}g z>t&^vzMg!A#0WmL(|k+%jB9yw;RzhJ>&z2`wm)o5a_8@7s)7QDi4{TMxMASUyDc2m zQ{JYq>-Gms}&NgLi#jNpl~~3z3t>r#G;?C0j8gMFJs{>`kTDa|COXh zWZ$&;Wk9^Nsf(li(uBO7DxaHpdg;A3AqEc~qfVZu%UfrEl3p+00KC7OT!*X_?Kc$k zduUnTpIBdrp8L-8;RPvcz=XP$nwXq>>N*{5*SfkG9o3rE@+m>`?jiFwt3_yWu5IAu z3Sd#WVEDzjLJ4|eH>=ss#Azb39flA^r@)ST95Mi`R` zRi~f<)6Uu!V$P9^iLxSOVY@t_dF9T!E!*lKK>$)EVr#Zbg()|~$0oz>!o%w5%f6`6 z2XyBLVBhkHz@D9ONGi6YiQg;Ky=mvOpc#XAJN|F-2X*xU^AsD_O{an4e z&35{xtjuNX)!3Z3t+s^Pg$N{kdonrJfV!l?5d@^*WOHyREz}l*Y^}dBAkOhlUvTxe zz|-VIS%vq3r^#XYg>#5tbfMg>)*(DX;p|An^AZaL4fb*_vOKO!d(i7fx2n2C}&*J_^+Mz;4=_MEFALe5st$;2D@j+V-m3;@fFncaGv7HUEcmVoaQ4z*lYqvUzMPAp#OP<{Td1>3ioy*)>(Pkux?$=!ebsAcC`f-mX3kr*C z#~G>BR?in3dLp7AVPJx$6>xDK3eQ0MX=-QT--xzZb`Nd9O_V;&| z9RtH&+4U{(^7rs3pAS0tAt63fy-4x-_~}AxKs8Vgio&_*9VBfZq%O2!Ghs0uFAl=i ztWB6hjE5!^D$uGQdt=g4v3+Bb67%!b1^n_!FABZ$pMiJ4 zOHUlY?(*q5_~aaSVi(oD?4`&2iNBIRi{O`wLw$=jlBkaBtPg0hn9gAYcGvC>#Fa(Y z**%DgR=^e9Xs)TLyo(FjyMgE+THpr{@ z&b4^2!#`jOzfirh`+9uo@&ioagM-arv8~`X(2j<1T*8O#oaO0uf(IjS5=%WFbyNcnoVK+my&+Luovavy%=sp-_`!gbBEP zP*4^RiwLC)fv|V>oUK+8SdnF!sCD~uj-K-A1u?ElLI7R|ZkF4F#FC;$OPx!9YIk@K=wIAIJ%sQ!wM<7w3iC*M%IeNMh8nB(+EfhXZ zN|_$-$fdNIF*eu^jj}W?me0FQ?yLGRy>MOk z+ovouar6@j-n2`sBK574VGs{*Ihbnu+m@DIG=4IO=yTKG({u{kHp*dd`qK9IR3ksB z+W~xfZ8wmjuU`?Ge%mlg)5IM}H1@L+N9|}(<01Xz+OqIV^Ej|=iI8ABsO9f@pV-w< zfj&3=J6z&LaG3PV`#jXD&~rxk@PC$u}o+fZ0{8_!6k)#zkU0Kva=ZF_~y@v6I^kdHw)zoYxi<>#}Z0L}}4 zRc8lOw(DtA;6ya#?Jfqwl0Qg7YOSa8iar3`D$!cAutVdR7p}E#BSDrjKhVX)CYT7t zwwRUxE_8$})m=dT;1*+<6@IMWVcBD8+|M*G?7AEcP1v@lHODpMb!O=!_gq(Sc1*UQ z+G#srwXp??kpP#jq=_nn=DgP6naPTYwmf>l2G^%{UeFX!8jCao#j=mVpwzc(^n0;m zpO_`Dn3-3z5W3LgS*r;5o~Umtw>`_ zb0T==_UY&8 zLgDvJ*7-Tcwc}WCHaY@=dIVDm%cB0`m_j+Lwew=h11X5j$35<*V~1`a0cVxi5K%4` z;K^znx*HA<*~7MWD955B$z1+9pUt3o{CKHaq8F}RJ(Zq+Z`b^>T+CmnpBet~+R#i) zAAom8vg(1lRp~W8T38#w6}OBgq40Pl<$EJkdIo_Zrlu8Poy)Z#@)MAk;L#RttNqLp z<@kVFD(bFuo6ilYPNc1!n=X7L;Jw?C})@LA1_=YtsOK zf{o{}l6EjFpX$Uvv+!;{(Su&z55(Wt`+8}phj+fVFuOh)(mZQqj)-ypxTFnFu~+_n zvoMHF2|5a)1iKUzw2+-;J(0DR;(+d|iYk4XH6U&3gn^J^dlX625mo;-Q10Pa9z!qe zr`Iky9BK3VmrI?UFI3hNfE#-?0Zy0S@WP z+4>fwN8*&(OL17iT|}&R#YRQ5GRwCM*38A@hVM^C`6Q~gL2Is7%fd(}sQ(9?W$(W1 zHB|jtqwbOL>Y=Lhv!~t@-UFeezmWeR!{<c<}QGoLA*8GZhJ!iM>jiF%bC4yidgsMKW1v;0B`ka&Fw2{%U3NQXFk+ky7 zHG)-Ta{(@Kb z;eMK&Ct|=*u^AE$crh20-`dg&K0j62UrH+;#8wC$dB%PL-9>?V&SFP{}0^nq-l zC+>~G_=}v2w65ND$XiTzJ9$az`iS;!7ss>S(<|S+^WW3Gy0qUodGplE#OvR=`Brr8 zq7A>R!~XGKw4m(EG+5}B{S^7}U4Rzip*-MU$-kR=-!488!_tEp$PyPLGwzn#`bdqY z@JeMBreE$M-OVW8)O4~GT6rna3wwsRP4DG`%53S~7I9s$1Ax(70f+#D1w&HhZC8kv zWc_@y);Vz1vYwUKONo{5_n1#gh&+na^NE;$q5U;J;+r-;zZ?2Kf%bmya`f_~IqdWN zdjVlRSAIWPmS2EVKH}uK`;=2(yL)e_+hZ%b;?~9Nb$e6~(`HL>N5{}-I2!RCB~ z1ehaD`?W;3TS`Ez4Wf^?J<-7qP%EH~Q26%54F*Y97#e5_IooJF|5$Fu^S9V1webb; z406FReUOJQwBI=Qa^;fqHNbQ4Ah|-ON=F9p#G`CrMs8>lYUZ&>(exT{895Obll>I) z%0?bjb1?wPnTgHzi=H&6{Akoh8AJ0fqx;pS1d)lR66j+UM=xLC_|E-AY~+Cmn^&qY zJUSm=?DYXbHh@KzPFkW}+h zu?EfD7T&b+|9<7{4Z!b z{lEY7>*w6H83$R7zdr8y=>PsZgXNhja9z$^MQM6=tiNTk-*jp{xRgWt=V`6=>zyYj zElwT&ZK-p+9y@oIla~K{A@uIiPlfHgq{0=Sw=NvZd>yib$46e%~zS9cY5V z>GfeWtvDi)`qgrmc)q>tx;*!@ez9PaS@1WVreE2KFQ6X-C2$r0J;Uh1Y3W4th2!Vf z8(5OWU)nY!3ahPy@~o_vn@tfWyG*AxAV0}^z|F=h*f7QibRGpp1WQvv&H3cuuM4Hw zK)9Lp4Zt8PEWm_13IJEb;K}5_C!o(T+`jG=_jMKa7xCb5eA7>7ophn|`z{e3;tEOh z9+OD>vk^yMO)QO#7vw zZk$N!X8_C8b+7XM#7TAPSpEfP<)7q70-u|2pX@(5XXK^0dusIVb4ro#deyl_aatJK zW%W6k%uin4r6< ze-Th=$1i$*e6e=lJN;7KdNR+u7|(XVu+V{*aeuAvaCdTfRO7snemBQF*OI`7X&-LF zGZVs2kE;sHO~y5;BUA5yBS;55n0ix>T^xWWGm&nT9_T%+I|q`|^E^UaAfiX|Og)Vp zC5_Og8CP}X$p-0L|84#bUtFJu_07fCZuohY`S^k5_LbzRk6aI)E>s2-p|VO*DtJ<} z+`ww=^-3kB#-2@3Rv`B6EFl<9XZ-T$ZKAboqZ9{Kb7nl91YpGH+f6jGmIhF;Z2?l1 z(P2@l#PHpqshc8HzeLEsjm>l5>-FrBpjT+Uf7OWaD=;I1dVMxhc1;*SsHbYe=T+Y9Axx8weZi=c!Mvt z=XpO3{R={d%xO+^O~v>;E%%}I;)Ue7BVP`lz+tOJb1AIRv8+#0+Hk>)I`*ZTX-hBm zavrmVzyk!nCaPtC{3HF<0I^NBPEHsWW7C-(JBk{!drO@ z&81{#0#=nB7|MDQ&E|e(1YxTBOdV}Od6_E9JwNq$nn*o6`1!2^{}On8@pCk}Rb#H-!OL*I-$UjSAv0*qn%)R*qfArh#Pr~*hs8+8iba!aZFD%;%RmEAGl@Y}-i*Py zZK<;Zm=QJUs5}Fn7E1>u3&nX~q{Q5bX`*al#MtB2X3-vrO!@iDkuL%{|8BVEZ{r=m zj%xfQMDV+P=pP^QD88Pm|F!Xcx8B{)F>oKLW%`cpwdcN^J(0s|m|}YyJ-sk&y^c~qvfQ}KX&;5>6)LK0Y=)@|l4vRDGtCI=ep_O&2UOF>akWIc;= zL)iK|_?}1Pd)t!l0Lv9D7U{5m^*-`;}Ajc+)U;`f(;ar*@REDu?-rw3Bhx%et zMvdoh+hAfDF1qNoMT&c1KCh2lVYZ{yk0C-k>FHaG^fWA=Oz%Dx6Y@~(>qp{e=6$$y z35*&rtGoOz5c7(wx2)T9sxTq9v|_J>`GE;sVJ%Cv)VI}<%K>C8rhx=e+_ZM`lJ39) z%~wjipO=TdWOr)b^IKV}GY~2Nrn~U7L?`^F%YVocLLW;D{KV1qsLAV>x^51dB|nPp z){lSlVV@&kJhHfXNB8W}e>;0Zhb?7{zB@oRK{TWc`3u1i6FEBWwPL$uA{3V)V+u0J zj!%vwvI>_)TP%oRz1Dm#V!|*Mw{8MSIPLHg2wBzBT-Hf3Ee3Uy|Dr;SExpp;yOHj~ zlsqscek6Y#-?!JU*d;?mSKB9TCmr{5m<%ji(Kh_tHdp#VOe#PXwn2KJIZWQ--~k^4 z(|9$fLYb4sxd$zIq~{iuVCaWAW-B#xoI83iHv#(dcJ__4_o@uPp9^tu$_?9PJ#|05 zu`#6=JSiwc)CQr~|UkY}(VIt(X_=R@o5`w;vc}151^<3$Z#;f*tAR>;Ir!10sVhL8-XdM*L79&q) zMjNNBH=fs6h94)NcDQ!ta;7{vY2o_J7#`7&7w}dh>37`b&Xc zv(A1FN%cbUBE-}0P}Eel1-6}ez`>cU=W}u5J6(~Axnuv@?rhgtygDG4vOJHp3WXiwx_fE@ka+pQ2tZUd32k-4}Wje(qU9bVk% zk$>RXCf%fhcv?1j+iG8gRoHHzUAY@&%jj22$-?KJVcato~P*zg|)Rug%pC+^Iv>Wv)R_L`A)a?Q^h}pOV)HR%L z!R@hZNg15b>H-MWoMeej4XAb*PAM!!0)NEyv%gtE;j@w#zr;JAy{ebH_{UJOSNxZk zE&m61Acmk9I^~ymLGWXlCgm$)(97WyJS@)yYg5MAjhy+|(I;A>yYY6J8C=zPfI1#; zV@b;M*>r_tG;%yr;C@!P+=znq@c}_msFDIK!I2PzA$Ye)g{F@@$5H+i)a{3@`M2w5 zcE0U1|Hl=m^+g*0_b>sTqwMjw=)C8{lURr1n4PrTMXO&5Hr^YskA=Lyr+gOj`}3i} z?&IBT(ay&Cj%=q`%r|Z5)v=bgfW)f{Q+Ao6-Ih`XXOjX(wzCYE3N>1cIcmjabXJVg zjSO;Q6!q7xO2COAIa7G`s0w;?#S;adUKoRf(f8fyFZY(E4@SVhP`wD@`FLmye5sPu zf(|GbpD*0z*hZ8EmehngDt;Bt`*gD>rTt!&mCX*|j*fszx=+r_smHh$k?$?51daW8 zyy^EA=GWBdh!xFm<1hwqVY{bhU2?DN{ACP08Fr;V(0!jtpLq6s^z@$G?-_@9i}6A) z!~IcW=E@$!++>R^lu>M#?8MHrJaR`H)(FOZpR*FRS$MrU-S6$3O93s~_qeV2oS8v0 zv!oC5D4Dt|qW?otP558rpvl6u)3Z{#yO?_Jrkf>EMk*Uu5zg6 zD40I4@x^Sk7ONwF9M3%yCB_|K5|kCyRzYi-zjaOvIUZECE_YE<;%tYX966?DeT;D| zpm!JTPXNdLcQg+y&WMbL?(WGProLmxFe-gl}! zhLONIaSKhC<3xc;1XalpU+$3QWhi}F5Qs`5U4RRS1#$oKx)1D*x)@$wTi z%qy=Pf|!-*5wAgYh^sAF?qGO>*R$=WF)X8XAV**30;G6zYwDKjls=@Lu23?{1F^zSQ)M}VJhC_fAH^?WG!6X~pim7bpT zzRGX-Y}BrVh{YqP@z~XPzNkcP1X1r@8KL zTr741gCyvmFM#yBdfqqb&YxC2`hMN-UrVA~fm?3VML*cCFW4^cnw;hGQp^35xA;(A z{N0_Cwf|Ihv5`h^5C7O8ecn0wC3XC??)Toh!+QeXU7p>PBKg-DqGz_9zV69R>ew#M zg%_VfySrbR<`I|Foo74`rcdr%4Y1!2tEE_qFt;icx@*npteh5e#uUM*9f6`f!fit2 zxU`>;fWs?uPwAJsdK5Uz?8l=?>mtE=21xm6!K1B?)xcVVE2RwoklPBnR7?MN&W|sn zWiu6^BL?B7tO$OL^rsU zpGWjQD$Og|XK`Lnp73GvtV(?AkKh0alpy!VV1rGf1;KDhxN7K;l*cXGTkK>`!TIj6 z-yl1{fN0Hem-DHxknG8}wU*AB;AAK+k;U54XY_JE$f@}+0Hu6%*xk>yfF4{#UDGTs zU?kAM^%LXlPJ(beVZ4|jvOPArxJDLq4K<<>s{vn9=_hb)xJ03o8%=E z>cj0!zanA%bNuno*@?FPf^*>%X?zAwtlo{@o3VJb zz%FCp)Z(xBv!uB{zR7-zUvn=B_5t_F8{LCph0e+=2;eKu6@;1kVI2*nG`}vo2#INnyzE;qmb$Q%1wHv5cldTcMw^|RYxb0wp9NW zB|`s&cJs}i&gZ*}@ELmV+v0j7e3shV+0&KafX!S(znGKebww6$H0hpEj zb^|WQh+&R62TfK$Aq1nnzQXxw=gV_&lT!QLD1x>{goHTa0b(&5C7uB8j$fq=f61lH z%kLISz;A(rzQLk1)hm0>M^Dd`2B<<&EV`st)Wimti;Ok;nzd%pUY5dgwp#PV!6es- z?PIQ1N{a~$9HlIkdY}^x9Ro8v5HUOtNFtZORj_X-q7NbNA91H#65`;O4IlK~=FbJd z;d%3CJaF^JJ1ywDb57qq-{U#Y?fY>fuVhcMcs+i)5*v_OEqXzY$_l-w(9N8q`Xdp? zrn%OwCYscxe31FEM?(zRGQ5V(ygn2}Xl$Z(1UtBj(_;u*k}ZYSzSP>{098P$zgmZr znbbTgjPD^eKbI4FAMg7MV92#efVO!WBh!k`^?hkv&&}f0IotNv#=Tg7WCAM4Wx8YITm$^YHAuK z%6;NvvvmVA$C4)I!Bm@zq&Kn+Xoss^EzfM!)4=td-r|Ix#$K>a#dRJn|BzSu-((=X zdJXSw^?cvbzLLC3?CdpzheaEmvxdkOy*!?aj#Jiw%NNVtR>!T}8*i-{X!1PSjp%Mg z6jLObqXcC}g-*_5(c5g+vu?Rv%&`5qWts^!HXL^qglp;NozM4tyno1v;@SGyuVd=v z{X!9scv0TbJxl8CY^Yz%2XitGWqVb7y9PI=uCLHE z)CgM}LnKSqEsM?lgHu`2s3)McYq-GXxZ9wzAlrX4f+%b zHRX_)@9&2keI))Wit;w#dq4;hzcS~Bz0AU+OrUtlH*zIwOi)*Ds!r<#mKf5;HBLQ5DPNqmKB`EVJDG+9`|9oNvODbQ-R~vSiqE> z7UER6*o?q#Vjl_#Q!;5{?W5G3rcsc9r2uS|ko!)V$=~k#`~?kzi1fOXsP8Zsf6R?{ zA$jKP`S%GQ=(?+Lpr7;bF720?d)$oCB#DUmVP!PgX2Gq)bqUBM)6}x%`;^g?Scp!P z#ikJtBsc9%F|Y)TrKo+l=_7MJ3+LS){Icl4_gx+Ty!f0T^8H9Ky%*Gc^y45o-8y4f zyjq99Z1KFu7x<9iZ=Kls0@+X8>H|9{U&-C1vf4>r`^9TTBILu}=W2+bK$m{V7rFZQ zZ$9N+vcrFzL$E(8FgHnyYxV5c|3kML&bdtOuXtJ?QPb1n&bxJb;g&bGzwYcW|FZw| z(zCA{Q0L93V30Do^xm6Gx82~=_0qXxpx=*Rd`I~-U@qWe&!m1oV46|IOC?g|uReg5;h z_6)jEJQ=m)TzmLQMV_?~{Ez?ZAIL+Y6qj7y|C+!azHQrM487}hc%)k5GtF}sxgK4% z`UYqm%j|NGIqo1D#iQN9+~jm7j<`xvm5s$q3mjk^EGXeVt=DBf9rJj}wSL9Zqp`Rb zVN$eq@_c61WIsnsE=e~^lI#Ck&!{2M>WcS44p;7~0PQ>R(mTosNb*R8#3n^4!m^>JA%LP01@MZL!W3jcLMdWm=SPE2HfZcrb zr*@Qw*ygv|{w`R-gZ#bFePiC+d52cf3zt%hl@xz*6N|a}Ez2Py7h}XXIHvvd)<8+X}KK01| z1ZuP&p9j&?S6S7MA;i2Ve3r|*)1k;Pnu>@{p&hjSd`aQKI&fNC;>fMJEoO7FtT9bC zMD!5uUCP>uOPNboslr=qt<@?4XK~fe;4<4zNe{QH#wnm|PUS!Ep?QwoxpMT`Q2mJV zf92UFXzJC}{l1F+_eI0{=TEPmzO4T9*iPjQ<#R`Qe?EB6(qfoHjZR>>JVZ!RKhkYs~oAm%qStGSwq!{X}g9Z*V~)=RG<@e>l*>Hi}LZ9+(AHxwap)z zEQf4k-Yk6X>|#EGTJc8r!s(Zjrz^SN^BL!X*_yHUoKr98%?hb35W^^aM>XQU?whfQ zuN#J+<>}Yi=;v1<(XOJ<1e2iIz{6RAtKCEiyW~zK+-v7R3-aoGU zRBxl^fyxE%Jf`;?(U0)-O7z0f>*2)(J%F7daGdHp6xc^Pvh6#GK5B}*+uJ9O<+4~M zIc3$oHp}`GJsFHnu-i?TS-Xpm8ablX*4w!lJ{Qs>J2K*J!fvTCF{cP*bI`Iv)MA~+6sM?n zsoD10iB}QGEE=(GV&ekmLTpYW)HLw$>$$0bTnNu?6UITb-h>SHp~b6HR} z1|}@y8Er^epzpt%{QM=`tkeweBETSzDft(wSC(CmpO9h7-Hrm&WtoUgN?<(MacN0m zA^<0}gf7RNvJ9stz-;FoR>T~;Js$LKTKFMkk$}SQu|z-}a$jzaR5-yyA)6&+!LO`A zF5X|9gYUWXA7*NgA`Ae@N;A${taN&KVacqe6?SsUpxl;`$qOE`sb6u zkiUj#Ocvn+2a%1B2JGR8l5=|_ND10ao6_hHO zlr)LTtu3N!+r`-pzEgf8X=#vMU4B&+`mw;7XPQ^eUi$XHFqzhlR(dy^A^5>%$A_&K z`QvPhpx(k*M1&k1F>w=z0)u*##UPbOXii8T_j);(M)7VdA3QE}4^HdNS4q*R1$v^l z`Xgl>-X@0g4$-H1JU=)#{N$;;tF#}>r+uY*mD2TiXwGb~*Kvg`W+WJ@&{3rDg*47{ z3yNJE;aZgO8cf?nA|$P;++*dM*4=`gN%nD3)26}F@$LX>-Y!(*(LOFPXx6aH$sa;R zg#WDyQK3g{C-Z;g6lc6Lz@SCiX9hh2g+2f zSy)TYR^w{6agX#oY{#pLPxZE0Y!Q#1%w2XJaE`5pBWVgKZJYteiq%*SsnmN_7KRVD zHv{9JcQ$f9GfO^U{bL5ozdP^x@-3Bp0n|Kx6=?ck4|*m2(s^Dl4DC1Y?8vjCn&vAU zc59X%vm>iAV-y-? z$$^+Gjvxr4k~&8bMO-qGNSf2*BEuJl?O{zt#&oxD+vE?qO2BKp%%HBC8o^JmKTagC z96lWkU0v`|xnpN?P>Ei)APS&Txd2X>PK#$p(^=RxkQ6F!?pSE7%C=tZOfO6W$I+pa zEb=XC762FEO2|6EG(md@7sVs{r@)&&$+Y;_DakB4>G?0j_83h6d%{=Yy`ByQ>K`p# ze{_`U^&%8Hw)G{d!uW_wrA|x=toHS<`POZiuN> zVr>>Bqb_g=h+`)IV&eiKH1C+DJRY7tLXZ+WfC=+rPx$c`OIy zmFiV;&*(b?^FKT;^#xyxa3o1aVOhhkpLJyY8>BR}#N~s#f!`=`IdFq8Oxh`&qiY(e ziLz3s-DD%svek0&5n~R%YFZJmPn6xnSUEzck7O^+7HKtCin5}-yv}R%kkz8Wm;kZD zV|V8+x#dr+#{P{UN@sq)Pcgi=$a^4|?LFmZ$-SNr1+Jbd`;{QMjy;JtjYs-z7ZL;! zoraOOm`ufLk1LZAUu>hAlo*ZHcd?!J@&R6vViJrErJ-bCh6`|Lj54Fs*1ohb?pAyn zxXAk?C3B$V+?4kcF&|b(Cz4m*o(_g8qP4kkHjXZ$D-(^!JH%SA(pj4J%9LU`o1sVj zCI#_|BwCxG``PMnpzLt5n~ka(TJ7 zEVEXcXJnL!v*}DtTvFjYm6nYC#N1>FPL}a%YUYT8;BDY;He1aL&^(_T+C0j~t1=*{ zk;5wxThr{6ha<7<6r2Alg7ZE{-s7)*J}00L_|{&jo;dS*d?`~nz^5ipql1$5aOddW z1W+w#PtX>*;@L7k?!x&dT{VE|HeTX!5@VDKXCL;dAdC(EK&?p1)Z_J*#Pu=5AW(;@GtU#NV7A=O9u$;rz?p8=|0(P-+QgUQRX9l17g&i zg?9;p_FHHL!-#hbsyqZoZn-QP3m}BWd?&bvg9P|XuH2hY+hra%!cUXU(PA-{l&ERQ z{7fln{kc5Bd7lHm%{qHmko&4FZc^E@lc{K?(HlVWFl51Jft+suk8X_&61-pecjrX> zfo0B_;92gcpQj6j0WmY7AJMA?6g29QH(c8Vu<@Srh+JV7M#C6ns{wfpGn1LYafh{U z@)6p(8+~%@kGAAVn*y09*-F$FNmCKaRCZ#~d(@Bit0b-*I{m@8e$`nV@t{1rAiZnR z;ty?GoC%(pd-{38hiy`TTBd7`?^&oKEt;YSQUj*4@eV}0x)s7eo%*OQ#&X_x=@CPH zydIM&eH?2edK{%=P!eZ2WtTj1EKLUL44~`9-J{HXbXv^xZW?7 zdS?C0@lYp~Y6)v6GFil2_o6T5id)h(h;z%DTwA;#gND5~mfmcEhPa-&LghPVN>>_b zn5~@csVZaOke2Y3(Yq+E*X0&iia+M0dMgWdXH9@UuhwEw0SA;4V#zQk_q#w;JfTiO1sWrb1B-G>R47jzXB{4KWR|Y8u_0<8 zu$Zxgv)sYRvT?km3!OZn;Z|+sWYb`~ddlmMdJ;cj@Rdo=>^+}+S9uP>a=kzcN2%+Z zPj>^PAFKLuL-`_`cjrSZz7(1UkD}bH*KvR{?$(L>Iy;<{>I6q8R=m&szL%EU0Abpx z<#3C#U1sKDv(mKyjfgE=O@Wc;j)7S5+F*_7OWl<5uLjd^ICU9CPv-)0=h{o>dWye6 z+Ib|C>&qv-aPr>$OWC>s220yL*5(+)|$2OubpIDx3+gN`pZ0G5jb3Yp- zeeWSJEdJ!y&}~&uE)M)=js@MG3;J+8>c$BsF#R-I6NR&7>U}qBraHWx5I|*5C%NgrKJNMG zZr0HNwP)FRtzYYf!k19ff%D3HUno8<;!l?_HEIqDf)2OsU~8|wd@AP@gO zLH_)G*j@DkKe7NjQ+(ze_H>~!AT2DGxAxfXX8Re0nsaNjOgncpm1jt?-;G9M))!qQ zG^;I1RLCM6t%;o+5!_ak-KOd-gNSxh2k-X{v+nJgv~^m&>>dp=_{3PcGU>9webCh~ z)LQzYJRbf~Y}pIZXOUbA;^D)h$+&5~Y!Gl_$^2SVB^s6`wNf^tAlwA7=`8b=z1V6e#W<)2#QOV&-tbx*vkam-W=J>F!zgw;JCp&+n_uZE<1&^W8 zzL7mK`0ZpU7Og>|Q-3j279B1uw4%ZqykB&VBNdBqcQ6o93+aPkz#FL5*(n`@BytQ7 za1bI@rrS#d0c3wikG4mVoV07(NE|FN{^mB^>HV!srLb3aT}J`-2$my0$ZmPZ#hdHD zzRJCI%J*SdKhQpj@57bLT4Vq=E0KYdb%^d{#^vp1<%1EyWL`a&#H3vM@c$Iu+Y#3`W^%eanFOw}suZw4WoXH=8A@}npJ3fK7y z#>6jhpf|{HZ#$Tu{PiVhII-KxH^Zlw&5mC&N6)BJ??9*i6Z=?q@QT~;|5)}pn&SmF z^h2A=XPiE@uuc7f{q+%A^!xql_Pss_?|CHN;T_#me|mQ|v{cX3g4YL1V8UIrA5RUT zbxM{1lA{=|*)=pp2ooy(1+FY{om^_96wfGPnq;N9iX~x{a>QKbi;Ac%pjlRF(3R*E zA3bIa-{sv$k=+Xy`Tk^jOZv>gn+unKkpYux0<65`$oM!nGmMRM^ow+~O#`3nkE4>1 zmePze`;EPH))^zrn{=*$UIj(yzM*KtCo*Ajv{}|l!dbWMv?UPts?+>UyW+EvFl2Wq z@?Ecbio4SqKCkWaUe+gmu2=tk<@JI1S%rPL^mL*8d!Ey?y-^ctWuz-U-ITKfzPC{` zKqn2*xo|q+{5ayq@#5$(8;FGG>NsJ1v0CvCUC*_#n1;)hmH=evZ00d0PZ!_>CjQ%H z@F^bIp!q)y{Wpg>^x5>?=tXj6=!@h0{lt8(aeX0j1B-d-X5a6%w=>A=%l+KUaV2@` zzt8VHaHg<*Vv?5QKnELJ&A47j*a^9w3BY)##JL+8YLhtdL<>xc+~&j>-H5YO7Yzcx zknpv)h5;6HxV>(5QRi`yW#%h?7*@bfReJu{A}f9^*Izr<&%w5Rpna0`hbu$j+Yl3; z_sVJAPgdS))i3 zLa+tODwQ!CiN!$WzbC3;HpRLBoTX)ck>Q3s;)Zxn`9+OApFUkl4)8?o_EhgDi^7PU zLSIh1!dRvZMADE)Mh*`^aqn*T$K6`9Q3##(zz*UVct;&p2WecWS|LpcVUEbvM4$Rj z!Hb@Pb>CU?F6TpoVJy2k*Tao`!~DcSJa~Nu-SKYxv8m>yOH4a@#GP^@Q9ZGW)VEG6 zj~GWk=`|nQTYAy>$#-<-W(#`MSkq#xk=p4sy2^Zu*PUIY8yhsozpb-nkG z`PlQ`-y7WV)ZU(wLX8=^3sXl3h?;0494Qvbajn{wp>>$g>CSPntQyVcJxS#ePs`)~ zkG(f*a#Tsy0RPIdewhbG2gEM38Jk9cKxhLYfzU&bu?xf|7O_0s-##GaqRdKVk*ch7 zdb;mJRT2ms@bHLm_i+Dw-Y$j;zudIe944+0{A4WqM=UT=GtA7lHR%3k!Mk$hKV9ys zze4J&yE0dOLE^T6l#LU()pgMe2t zz42VzVvpJWh~)fclOLjmr8t~}4=2Z(6g-$kHGjKdrQHy%yc!HP%`Pg2=hEBTh@sig z36PUa=0SR6GrJkC^4{mG>t88yPb~S5mAQ}A>E9)LA3W{741RD)Z&|GHG>Ve74s&y; zkyghXPxB1X7_qU6d7_?6YJ#(i!)~JNcMO_~>G;S_P7N2A4V_KZO!QCk49M#xyJEKE zooy?;eEfX+YhUy)lf?^b{_`dA#eVwjQh0sRT?xGY+*|sfC|cBUy_&CuontIkUZBfs zbIv0|i8UjhS#r(>bW2)vb;ge>$RkVQJZ>iQ$$IGE^kP1nkgj6bMtIyV5l07)l92p6 zseAuD^7mwq{}lq*J?b+F?0)aB|0U8fwxbl?3T)#lQ!Sa2P{2&i>rhl&JU$uml6PVr zrKPE}qyT=E?ukWA%=RJ#TQolR-Ge9z_BcE54nk~!Wi%cCJDIxw4I)_mMH684+4NU^ zaq?3LDaGLFVINvEQAq(MFUc5C=b0pE^u{8Cc2QDYMv% zrC7mevRyc(TvbytIi%piSW*8rYT$p1-2EjJU-jvXeSO;ESu>VxS=gh)z@G%UcjO~0eK^n&Y%x(*UOcs6qWk# zV}bl zRgQNyhmA>%qa`!8bll$T?RG_W^k6C+CKYs=H7+lNrnreX>!)VNUnqhX&isdqVD(oC zVD+i^RbLf8Dm;zGpd9Zti}8lXNgDf6d=lrCc92jt#&+JEWECM*vN1`mV|pm6Dz0$( z22y9V9r`t?(?AdxLgdTDc1Tu;0pXup9e?HQ_a7*F?R$4SS%a2B5#G)7?xG#P4q5R7 z^^26fJ9h!A?SW-M)Ir_8@?HW(1s?eamI;upL^KyZ9mp`Q!N8DyIaorQe0EN4vt>@Yj=Lu0%VgT@D6M zbbijOxvOjziIh*{g!YJ$EZB@ELK{c*FnY+vh~jUgsbsvl8uYmS_6qx;`H{l>@lg&fc>#P;YG5TD06T` zsrY%NHO{)8|6*9_+rr>)1H3;*=et1CJOZcn_uD?gV;X`SQ?}@)<*5%YC+oeZz`?jcbO+T)PoxNHbvvluZ z6V^TIQ7$?dvpq3--H4d7+o$Pg%AgE!vyR!(EZ=7AfNE%zh@@aryapa3%J0{^}aI26Q%C+d*g#i5Vy9;BYTb zlXEyFIr8|}Y-m?oj#0b6{^ZRk&=9phgQ+`T2;vi!C=c%u1pzMn04f@<5E-OV_2 z&c`QU!`8H46}D{i(WI(tf0>X_?Ls>RJ#P;YW2aznJ_n}-sHbDh*hx!l27^fKMK!&y zD{=$V-(TAIpML6Du3g$e0A_K~s??#LT#9CyPm>FFlSTJgcjSkz)JWRFVVd_<>_^m~ zceF2E^5)EC{p$ljGu`Dz$sRF&Bi3wL&vy8MJ8HXXF^UWyN5_B{C_+SoYkUkPJjS6) zYnvsCF(;U@kLJh2m`V~u+6E3j!FR!E&KJYqR|T?9&GFE-ylWo*XL(Hz@cfl-$M4rx zUta587Nv}ca!VV+x8`gTDVX6bmg0C@qJB2#bhT8Sh)2#4%thm3w}Th75@Bm2Rb$9U z60_NQfo23J!jXt&3Fp{u_M2)-wY=_ASthho*B)4QW~N?}e+EMH2u{Th)GvI0cdjp9 zs2m-UA*x_{J((X8#5r!)Y+>MP?vEYOqD5^uk4TUVi>R0vo_5Hnu{&1OEN& zbeJaGZ-?_)Sd`>(13=M~KhM&cJ4s8=i38AzRnwx-{V7u=l3k{g+0nv@g_FeKJU$!K zZD!=iWA^Rk_2Iko3;IBE%$4LbYv93!N)LnfL@2Dg5L8qkbJJ18nslMj(v-@*Wt0>4 z)T*KC{uoaiKLU{r$CUYs*76-!QOJtS#ipHBXqs`)fC!6N4MBThwfbE%c&|CdGt;b7EQpJ%l8EFpx&g(86{ITDGS-{Wvlt#fiqv*rc`-V?iYrtF@;)8B zgHV0uYnN<-JW$h-?1g@D!|S)XWjAl|eOP5LRJ(k#=i|N@WWpB7ZGN-#Ll#zOZqgJQ z$?h7OQA+kShIP`(rsqIW_C`P>CHzQTC*y&jh7qqzxi_=!~H^+zvvsV8)A0*`Lmb1xvJ>(Pryd2LYgoq5m z)f(=^ncq=Er{@^!KDLO={K~(NVM88CZhlMpm9bAJ23Wt;Wga z?q*0EFcZ7w_*-iBN z$n06qo#X2YUykO+qAts=yvQqd0}z1{GxNEHtdQxh6v}f^L>ajqgS<`sCS|;rFU5hBt4P6GWmKuxDxA8Y>-3gWI3*MY>}iI0HF)RU6sQ#A;)-x3EB|HlZiK) zIa;|PNT-rb+Lo7+ylfKON<>+O)75g7WcbR|!(ll&&~B`JTWyPr20mz~cRhOM(!a2e zt6O~9K|`|hvVY)f|K*YPt~ka|df)qGCklSZ4!aV4?t1UC^91*?!Qi^4*5qk?Tq0U= zumwHZCMu0>5yQaZjH%1zm|QoE5-=sh8?i|VXZv*WhXo193Pboub%WODjHeUzbW%@L zWk3!6=+yWq_XGc+r$$fiC;DB81>zxWt7oE5-0uztL_buk(`wboLvy@QwFx@rNk_3o zX1rRByd+;l+?L&!OA|B~YP3<{NSW^mC0?qm$R9Pc*;7zr#S~!$xJ^vvI5vuQBN^5| zE4b5p6~enQGDQElmN6%K@ixCF)yRYEMt+s(JijQ`eYQhp-kI7s>4*qmP#V)3b=+x; zkxo@{0Z*qhHXtz#&H#c0-`(syVT{8M45@iE{ua^JK~4vk zpLnypZo0CAfsw{#cGqtX|4BRoQ1zbrg->r!4X&hnl(spEvAGeJ`iA8J$buK5=Zfxn zHFSbfQ2~qL1@9Eil$}eXo;uym&854W37ooZnoQ0jZevk%WC5sS9?=j~i8YcS?qU6W zt+dTQpFavr)6zCxJf#CYNDlg+L-MUR=H2CkBxr4;s4JS*GSwcWwi&0^SBZ2ed)d!! zdXKmNkH>H!+okFMf_v%QX=j{$;!J*ExLrtgf^<3PTmDl+O39kIu%hF3ewMH)3D?^L zXJxb0)Zz+Hh>0^F&W#x?pb9jcj5b_gC!6UZn!#vJ9OJ!bgf0osI5#*@!`%#R((b#STBRA93Qzd2!XX6GUBag2#eq!mPZ{iAQ2MT7nl| zl!GgQ9(5w@+`>GhqW6rVE;OHKm14FD4=0Tb-_1()?RjXa_YM+gO$w3k%={(XUN(=aSsaVal+1Bz>8M^#dWMpeEAoV^X5{fb; zQz6C}zBm^oIXsOfdj)`$3a)4rRn#xo^8F3Wf3^B^J7YaNVxUXF;?FrB=~0J=bu4H;(B9e0Ah}&qJ42>BeE;N-q$*L8Mwm?}f)hQ~?s+GpnBY{d| zL|yEN1YX(7dNMi#2udW8eq7pTG4%MuGTg(wF`)?jjj8#&;WBmak+M8LEGRFXa*3?G zw*EA~ysG?bc#(#G4dLq_Ea zWd`hH5J>?{T^lt~Al&Z@3hZNpM)7B<2VJbd*L`VEG&>ewk1jC>Jv?b?xY>`64d5Ut zeV)M^X1KM%cppR=vEt&XDx!{w1VL4;cfsn&&tg>+RbkaGWyy4-8**Hth$I;6Y0OKz zJRd?zVAZ_-%Efy4cUrAyXuU9`&()c%JF;Z7hboGCaM*DPO&q{a&Mw97Dl*WjtEJnH(LK9>N zQ#JW}i}a5q&~qnF!~Y}uBhtGy{10ZeV4q+A53jY~T7%@%!STDN zSKkZ6y42IWd&uiV`+xrO!xFtt^x)6XzW0dUbNNr*C4JZBPJSHwvmhkmQBl2+eU{Nn zV{oDNbKx}6$=cb5pkuWqE}j+{s5M)888`Es{Kcf2@}TFXJ9z5RCl|oi7E1Kb>bfH0AK(1B<<#lD z)-$;MorJfaTTM4qzRPC1^lxehww~P$*16c?U-vt`A^j{$&+WmLXpiC<;QS?|uec|8jiN3WnaeJR(^9)gQ+RJz~8OboW ztx4;2OgIl6D{_Ny`pIK)yD1E)y@QpTe77yPW1PmPGebIRuoxL&$e^kg`}Ddr%XzQi z_>*a_9R*OoX)Xx|X%T(K;m0uiZwYt&y=nGE@0U?hZT2cb5Y1sZO(VjsR>4$WQYUY; zr@=y+L~F~ir~F}mpecNNN{*`yxfycA`0QA%@UkiCPS9*?=rZIH(s}C8>Mz#Iy1f6< zu3vmtUymQ_6Wkmdeh2xkXPM{T)0NPNd@OG$w;l7QeaVjQ(KD&wZlvhAjrd_UDam?+ zEAkd;7$j4}0?+n`X=ZDrvIDqvfr$8om=u7pWa6E34A{V!3vy&4ldZ%nHfnCMgAa_& z?Qhcjdk=*tPPBSf(*C{g*g_siKYmO5mF-U_23N8@+#xvO%>z_`*&WMm49Dha$4Pz0 z@$&PWTDs6S*dgU)yOlT92%hcM6Wd+zTg8=6EKr^gl;NT3$>-dW+0@xaf!V~ce_w78 z`h7mt-tiDmoXu0)zLs^o=buErzVY>z_G>pjofurn{=6I6iQ-e5)2Jsk8!y(pxS)1( znwbhwvN%{Oby^b@hc9p)HZxpYOp*Wu_ApeA8b(FW$7(fkEX#Jsv(sp8A1uhIRF?Qn z!Fzx7+F^{1;$AW-{NOxQxEBT&?q#2`$E;LrPLt815L2C!fN2(q4ua!r4mHKmI^TN4 zV!j$Kkr`_Or2*-9JxlC46of~3Iv)BOHseJq*qHbR6xJ3EYNv`{mdBs@fj=_2J`Z55 zn&!q9`pkc8*&SDZX8L^6Dbc{LynN7Vg~tnE@+Up?b-%_B)VuC_f9}$EJ$xOIEeINZ z*v&a-SXg}NES-FO;sKXH*eyE7AT-+Bv!oej+IprtlzS*ERw$w|ydqL&f1INt=VS{d z+U)i)>wAWAGPCc{q=x99J(rJY;CPXj9qv|=h9AoJx}kez@N;Vb_sjf>m7qDg2)m>X z^bu~XGcgrP3zW7D+Q92-T_#79)5s*F6_eKX%M)5^k)l#_egPP1UI@M|s-89h=^!ka zl%x+BaC~&JzOPx?uXq;!cK4uGN70v|f7neza&-m~|fV zWQ36*$IcT3_`*8=W?SPE(>~RcMDxPl%TeFrnnxqiWtkH; zsztSPyQtWU)odrHV%|zHNfTvk35Jyxg47@--r`J%?a{NELQ@wUE@y?h zo;ie%>AEKWB7o0Libl5y{|GYAH)eKyF_OMppY9DC=%H%j9mTF=ySR@li5{U@?l`do zUaTc}%VHI92;`j^*?vQv8OVU)Exaly5g=DlAZ!59SH&uKL+&)2nZVlJEO2Bya+i?S zq?$<#*RZ+)51U_ffLXSq7eRg#6?u(&coR6$UexyMpewZ6g^DCM2IS3EUe=ieo@I9d ze!1S>kv{p^-(6T{!D|%XqbN^*Us^_->UXD!hZf0H?<6VJ2Ux#F5i@X&#B#CP?+K~S zSHM_m4I&j8^1`uz33ELSjs~^UmlZI!OvMA{!Fm!ZyT+d2Iw8=dkkln+q6VPJ$~2Uw z={PBVac{+Vjxc%$?)3@oml=2ivq-ZzeUhgSe$NswYUSuT^auMu;&MCHuki&R3foW6 z#cr;Ai|6*i3wM!5$)L-5xcvS@^iXM*o|PY7-s9_9z~6{n_9n{fo__Iw)%ilUlku0v zMc3$IYyxu7&Xwso&tlzQGc%gSKx^Ef%=FCfBq^e*T-r<^bR|?81Tgh}C&!qGjSXU_ zsjCAy%W9>Gt=p5zx<-l*qQ3#=X=kDU z%8u}o3_OP9se(sM9aqjN(V81-nG?YAeC9BHY>Hu+93-3+GM0l+`Y0N1>Z1%Zb9<2^ zI6_f83I3ud_jRlPIkfcW1HAq6E<*C!{AL-wp?u}>YrC&RauUp{>qJsWFb1fS)K0mx z-;2(2t?sp>;aTkHh^0vY9%$s8^ZeN1LU`(U_(@d&GiJDBx}EK*ibdvejvdWx9UOq~ zxAaUs2r@6f!JqgQJ^0h!%C3X^uCDQj+WJcN+D}i70oG50)oXfo4#DI=bJgmotz~*a z!X8taISI0HB(p9pS8Bx&XB+o<*UcsY>g*M1EUuTX6wkau0b}bhNx4Sa?MuURXmb7i zo%BybH|zksEc#A6-me3Nc)woTX&R>kyLwu%k+(|kg)dhYb+N?*!|o!B2bY_k^^tc` z&L3e8U*k+ZFnxOOwEWeY!1bH&rd^;9ZCXAPeG$7byKJTP5W3CINoy}P!V`klq%8556tfs5$K-t60d9fJTdt;G-Yo`(mP@IAKcwTcpI!#Xt z{x|I#{EcSGg{@bzA5ZPb1M1r|(dTY!4+j@YKkqi$tL;@a*?_{nUSc8Cj6`QwqB1=e zaJhDyA(I49dGdn;!*bkM9CA^%RoFR{;K(87hK}hY4qrz*Z?x1_Xr!*@!0Gp)m-O+z zC3@D*|DS6pk1e1tbT5p4Y4uI|I{7l1k?D9P= z$;Z42HpU{(Whe@{ky~q2ZP4o2EJW1F#`cYaG3vWH*{ByCR^9HuV6!DF$8Ij+H>wfvD-=J(i zQGI6HS5)m)0WBeH;l~kKj2~0AUji*Y4*PkSvn|nQ#yY_=Qlg{R2JOMrjp*1E?06AxK8@1P34Q6cIL>T%n%Ujsvj z9&&Qs0YiuS`M887)$Gk(O6Mr7aPvZIpvIvZ#-YxFs^XNR1$onIPlFQlIb+{=l< zg=&vIltWUYn-Ps4#KaYC3MPvTB36QZ+GA`ZZH|Uh7Kd!>LMDt5>o}am>_%|I1kQA1 z0-{6LnX@>DnI}^#n<%tddlh_9tNfgQpQ(nADB$_wc`d!FgFPfl-TItKoy4Il>1Hh1 zz-laH6N;EyC{yo>?bP36rb%GtoIeYMl`peR;U3)2?iC{J`gWmx6jT>g_$_!9_G^f5{L z5JD8~CsCNY30+nLv(pTBC%gGHla~B&6sQJj8zM8OP}!P`gq5ks>5f+e4##7$P|iD< zn}|uG?Hh8>>`#!TX{o_GV_Ml7!{3#r`i(eJUquj2yePiEwmdX%wiGWt)+(Y`5x zVb9?RHD;22Ay?xiKBn=@BQE~e1b_BlzJLH=WP6d z8gVK-vwgQNCO;n(t(=;A^0ejncHmxQpf&VU`vOMs#FBSPTBbW)+Oci~_ERy6tGW9O zZhU)b9JS0d;y8SH*jxC6L;E=EHB+0|L%L(xn-hIeR7(jmKoy;& z(D0Ned~lLaSz`JKdl;X+FtZNOEZ`43$*=d(B4c&P)?sI}ov(H)d1RVWio_wnncVt_ z+JKj(dsQKSmxFbP{|WaL+c?Y3yNH0~pV$LPG64(7dky0QYx74$Q9`CqL75y zdU!<9WMzoCWdx2_s8MQ>JAxAkJDi5}D$9$AGj`h~A$V(?PNW^43QdG$;szNJYJ%x> zN%L=}g5FuLcd;~nRAfFXoB70n{)w--XW4=0Q;lV%Vm@Nfag|fUAjG_kIyKUsjwPJ^4N(DE*6Mj5tCwA*gV(9&ppmx2Feazo3HQa!F@+QKZgMG3*_O%A_#a zjPl_qM6oFyc@EjAa|??_d5=L-R4$wuz$5+{g-8qaOOP1n`5DtI8Jl{1JlB;aZ-1Xl zrvr`14tDSwv-%M?p~qCHcf>E8e0ypD^;4a!1>`HmP7pI@i8JSQV(Tc0=JZxycstcE z=m-FKZgbkI4afLrEZ-m5ePB@nxLpLNwZ=_S2DI~W9iw2iDrhi^cJOaX%Yy&DFvp}r znya78vwNO8;tg_K@6Nm>-Sy;cdvGQC^L~_!p<83CRKx&PK&rohhH>EWIclr`@w1IH zJnfW)-WX>(o*nYpNy$)9o1t;DL*1Dq2ui)Q0aN#vVg$`%8d}iEWE<+d%7))xL9mO0 zy}E8+tl&2b-sSf!@9J8AY$mrxXqQ9!f|mF7aM^B4V~G6uyd>TnqknejL^n7^y%f(k z-S_6Fw;%I;(O5ThTY0%@^^M1(t1`)9+1WIkd}lhVpy62CCRcz7EW)kJrAu#Y?xI4i ziiyD6xQ_7+aVig`jjdc=)~3)@I3MRHbvLAB4lsq)k@bF8A%$Nb^p{}rTR#0iPt(Bv z-6zH8se|tZHjN(h&plIp9r0l{81-}1xxOM}hm{B{ka7`XQMgvr-Nb7!wX9io3>>rFv_jnPAM7^~VRxNI|Hgq) zFW{zk7VcIPeWc$nR4=`L^$I>w>H&mfakc|msXB>kix~>pqA4a0IfS5S9{}72sCCnX z4c4?R%o(lyBiaCJKG|-@#YjA?ypa$3PB<0|C|s}_T23u$(hmry2hdp0x$^qSkzM7T zxAO`1^cy3hK6tYuswe$KvEKk_~2(!+B3O#6mu zPiHRfr9QE~$S5CC3BRo1ISTOONSd9hieF~Kl$cF`X_Q-}1iC|Gd%#bSI!#9BSlkI< z1^K{!j$*UPFcGW~aDx5$biHuSY<4(O5BWYG^a?n7mUrIr-rk2_^RfK+xSx3djUJo0_Ga1y%1Yj@0im*(iJh>T zIbP)Zk#w?b2S}qvwbuJ$VXW%1!15Jb!b>7O`7yQJW5?0CE)R2joDP+>zn!`psY2PW zh6VIxc28bc^+30*`^7w<2Vn7E$zF%bQ{%GE^uQ$x0x4U}r+c#;ezD@d++L`9uaMer z@+EEC`E0=hiR`BafiI~Asf=_8n~wDHe#JMrT7%n@DOi%W%p7cVPS-OvihXJ`(g4nw zp5x7!1^`;*PYE+Vd|`GQ%gg{7(1BiLcAt*BW>_EeD6)eWXYRcCeicMZoA{N=agmn=hJmp4d{!{=n4T9!38b#v&US?Ui$bch5K7{th<34_hPQT z4xRS#BQBEp(GQnstR6^exkeAA;lZuf1@8v20&2SqE{9kViOPXIIR$v4H_l7iZ{ zPJJlCnGV-nV#zT{oHYbar)J;-sH1AqZo9}vEPsB?lxdYJ_a_?-!#8jeeOY%)xMkRF z^D>TmSbThI9acb`p5oe#!o$Rv={$>@@CX+GenUySxN2=WcUdIsRTy%@I<6asLrjx8 z+b4RQmMI9=m4uBI3*Md3+98O%)o6tLTv-kJi+zKn!<*LP2U_ zO*|Kd@Sl z{m<|r*H~Xg>EbcJH^xS7Z+(4!x{&O;{o;(j68U+jk0K|54_ZQ(E1y~dcfot1P$-a;rJHeXAW%z`I};A; zF;%fNi%ut%W9rQqo`+2kPh-yzrU*TRr-24Tz-*$=&j2wrwu1dIt3Odn&4b;s@wxI6 zOne;*`&qtQjrPjwzJ2E14J0QXn-8C;zVw)v4X&hm1ZBZoRu{)P4o`(B&>aVi*0w83 z>k&$WyPY1M7iuW;YXPl^O$MT|$*sc;e_myzD6@DnMl5xeGGNrIu3Id#ig6~P-xhj* z{hZWxT29=HE{D2eieERo-jIIb+*5mSCE8>6)7@Yo$RNJs3kJ?*eszZAAn{?uO8`D! zCDGE23|PjREkciBoCBwf$i+3f7RD%CHWL=bnRS-shKlDiKAsr|s`^bXim%Kp)^h;w z{USx^Lzw*UXkQtBduD+4L+6jD92c6&W?qV}PL3lS+!L6r==`w3tZk9Qo*~!NLOFz6 z*Hx2{iC{}l#!y5!WK`<1x6bW^${e9~cGDHc&=iZ}@x1-=!+tGgim@nshfs@80hM{c%NmiroL#vO5@wXCyP^%j|{N~4(um9ME@`!WsO0pHD>%jo;=U$v_JUUrcdFk!31PKD$<>}xfcFBRpVvctN#ntp%@?=nq3Uicr0VYwxIW%f&R&=VIE zBb+ql7T}8B%un+bb%4TyLXDL1g13Otme?EchF@^jcpLAPRn8eg<5!u+F#xnyU=efA0DcOcO`n^YIiVrqSGTwcC(Fv zNf4Ike&?x*&G>5}k6t5}GZ73FIiEuZgefjKdX7VAg#@Q0rw%hR-c5{8)%o=-E zMAcziE_ta~r}g10l?VH-@9j5T3VuGX!T8%*#m*SyxldP;7s2QbdY6338H#jAq-sNr1#xG^ zUTj8s%C4eKIXW#MWIi&5olg6ymkd`c0!P=(cs_R0F>030l4E>qMPXiChxCX$dX1|J z%)_NG?u$iN2eyc~@J1{AYX9}YpLm|k+9l)?!G6#8_84Bu57aN6 z`tDp`{1k_)*eL;&88@oZv*l-L5YAzEwb*PteqBQlmdD68u=$h7oZ0nV);|ig{Pwd)XxDn7uU0xkLEKAOc6_|%yLDX53~xz z>2byRBgHH1IAg~%+_T9M?fH?j4h}kV;7=gJR|QHRRVlB^V9Y^bvyn8sko<4-+!opA zC7~W+)rIDTRhOfSb=)Ux9hbI_1EKLg;WNnQu!Ka?$^5|E3Ir7{s5zr(zrdZjy-h{8 z7;lanX=Npps%FXJfMJ`xqezUXFOj7rIEJ#OD(fzK^v|Wvi?42pR_fmCiH|IPj%D6u z^CS5F9l?&r?Vk(mc^^E-p@A$h>A2pi+ko)uI?#0=Ij)lF23o@2XmOgd(oQ50PRW)d zvqT)LB6m1qvY~nqI1d&@dIBR;KOv5JXd$CiFQ=bPxu38j4uawy6cqX=HhM(xE;Kuy zTn+|TGCyYv950dpCv>Et`4LZy=Jvugn8Qv5x1q{`HQW@ZXaf7v2`f&cjjbF0g`s(6!*=>0{5|Z#~UHjNldM*`ve}C?uPu=#^X?kR}=7crS({NzxhWCLye0md( z_PWE;)6$E+enZvs@(x7C$iDJM&v*2FLf}P3bzzem6&}M z$9>_ZAdVyV%a3}#>x&Od67$QCy594}2c=$Sp1=I4=exf6unZYN)fXRCefj08ue?~7 z;P4eG@2)?z@)Jk(7sgUMQW5xB?6R}@g_}IR{qKwSe1&JPciex7lf7;*{!bTM3inYk z;v&DhV+TLxgujryEU4YV0Pg2_kLH_nI}71$?ahg_Rc4a{+y^K&DVOeX&*^lsH>SMq zGn!il0=;VH@)0nnA{AxqNf}`n=TGNCG&3xT9!84T04}9{e`3eAl;qV9_zp3wy~%p< z-@dQ=)8%4#Ptd(Tco1*k(m!wv{{V#fkAK}+H-EZ?(94dz_TSgBILY6F#Yy(dUL}01 zRHo}Z6Ul{^SUb5~$&h9-5K{oBRXhPHR-EP}DVp>o-P28l4&&-r41I^_gt%?S12r<*I<$va zO+&5%sSv|R7gmdy;iaEO*#2*z#ofpJ?m&wlGi0t26@4^|3s~f*0YTV9vG_N1TPeP2 zU2rOT_%qT3kzfkR--BCLlnwb*4I&7-Nx3 zaS3n?ZupTF!b%|)^e#*a?HtlO>3>6m{?7E7ix^xK2KcV9J+eo1L-$$OuC2a_>sl$4 zHr5`h!Hk$0D`CxwmcL9B#goQUBtbVA6gZ_=Fo%7_B0Emm1l-vJ^f)jvV12HbR^Fm* z=quTF6b)@7o^Q4CFBP_b_r&!c^VoH3q>IbIdbwTi0o{IVBt5dZ^5GMnMeP0g0o-o` z#z4{}+04Sx1`soa9_U8?8Ozb3*rRiu|iw4iT!`*IYpAF0srbM39OSn~pI8!osjyRk3nmptl-L+*N4HRDzzd-21eC&L{k_ z%_4m&E_gAu@9+tI$Qt^AddIH!=LTrc{cUs>X%1VTG@)Y3V5!t=X9ct9a>F}|8Kqj= zf+7W|KHD(UfGj9lV>{6xWPPrMB+I7BdQu88&0ttb0U^s|__$X87wF`}{PxcTCOm%< z$BsOrwq8hHM58;nlo;uutd7@&a%O0SUjZk$8nbG4tYn-K*x_j%83a=`+cb6!Vo0m8 z?0Dw5(lU?YEMOKuVR!-;Ny?3CDqSDzRH`;BeCIEkFSs?j;t==uh+g>A{q*!@{Xp5X zcBTHrx_yMdk#*s2Wc5wS9lFupA()97Pfgw5_?yx%3&wAX1{Fn9gXMfC1{p_5LqOwU zXu4L?vA&bl(DLJQBj5$OHld*yYb%c5IpQ$X%>D9rdmP_pltf)V$g|_{2e;!jlY4N; z!)MRp`;3%acb|SC-v+EcCuMy=^<9$czkWzk4ZA>x*HGHGdBEN8&-V@AzD-v<+KasG zU_ZN2(YJ)(<##_v_upL6YEF4Ov|nHB>!CJ(^!EMywGO>jvh((K`}@n}y`g*^L$B?= z;hyX=AWV(dXW%R^kJxI%06JqxNI{d+ab1A;_~-&Wb0!xdu#3h~k|;|(FdbpD%#xvJ zWclm>ArL6cBuRAx=A6$;_S?(l-S*ABl8?Qd8+LlW=;^t4FFpf)a2k6heCdkU=4B(L zPw}AjZX7|0c#<}XfH7Dp2^eta-AZ6ZKvelYZB;E5aXlw6POG5 zPvQ|n={@y}1im{rxX|vA!)Y&uL9zw6=fkEd0T(f+PPOA}VQqqiXIV%+8;URryA5w; zP+>`9t;vv@^ih|lRbVd=x&_r{9$4gBTLFgE^6~sw`Hc1(k~GfauCHR}Tb=4}NniPO zbE2$p9p|$dwZ`h5m+h*dH$AIyy5nE1V$?s*ztSCM<>#9 zGnO4Ah3T5seq+t|r%FogfFa-Q?_aOD(Pi#m6BO-SbuAs#f%IHetLI(4&u(n{!p=Xq zoOr7={nLuu_5NIePk*20O_aPrnCLER#la4`1Zcau%6L1CftmHPEr7p!i)-ZBSr0r* z&+S3m`Rx>99`#m-i}dhyEBuXe_*B_A3%sW#8SMzaxul&kLp^%QgZ^PR-Hfxa14?nc zt8zPfe}QGcr0NX+#NYpBC!w9X&#(6`x76~SOWf0C2mZ}l*_CbTPtSWtv$Ij3GfS_z z-*46`CmXaJO|Lf(e@JI_il(Wv*NS1oAJy?octHmZ=stf}=c2)HFM9=~?1mclRv#~) z6>{ipmv^(kz_Fk6JCRFJ$*soT4uI#keqS8z>3hicde>`Bo$g2M?OWcj57K?o`@(83 zxTIHG;mxbPHJ5a`e#)Bj~yxS14_y(*=LygOJi`M*2AH4LgY|R>Itu_zIY_3&Zsu= z?7SdN47bMEn95aDGD^(nH)XlonVWgMUK|rfNN{Bi?V3Q86 zW#=1;N8X^+U)b~|kou2$^+NDYhqi59 zF?v9ulN4}3#fABza*T)vXT*leb5f90MVbM)3vG9^g{=s2tzhi&xXjp8A`^u{j5%-o zmSO{!Y7oQ?<_7X1;>NFa@a6ws@7uupJoW3bP1IMiT`#{hdSidnKDxrnS)DchB4jpb zzV}DSv8rop3C^%aRAt)6L5Na7iW(*-8{3bkC8Wc9N0byIm}6jVV0^YsZ2{j-sL3#A zrSG?Af5@GCUQoVjd;X2FM;{4=9mf9W^Y{>Yqww?wem4WD~vWii>;%0Ol*h^{ct{SF&;@BIWQHB_Tt4ZTBBW?w6x!LqQq!BqG z87hJRA1jG3P6A(K=97~65gSKuKm&Snv7^}WulqZ=(C7i0H@1;|yhP`rwjM$GHdYEa zx8ZSSG`w>VYKQeG#c7Bo1~zBFw~DDVPZhYbq}_@)bOxWf31_WF;#yn`HB=f&NAdXm zkPQF46<_e8ggwCy-B$m&)%?5Ql0lZ}W%RKY+-hP)`s5zQ-|LgEo!=Iu{lRQF6s_4Y zxF&Qy>#y(e8Cy*}&|7P*RV!bV?f0R;?~2~OA<(IS*T}s5@bs2H)ct*}9Miqz`x?FP z@=bqufh$^p<8@a>b{Vu&(Z|fJV>7?4BY1T#e{DAV*O2^kIC=(|g5SnpJUqMIO2tL) ze|hD*F~L5Z;okZe`;N_Ls_pQ6J{(+0{d|Zjs=W3*G>523h)6~HKre-)A6hb7Desft{!!Pz8TB8}%a0U|c_rKS{%d0} z>Q^A0>7r2eju&X#_J6Mnf}>|>jQ?X}^_ zr}}KL4p>S#yV|UFL$^5MERrMm`lz2gIVUL)*VtfL&3{*=>|b|4eCJ@hoj>m3zY&=?hY6uK~tH%?MsjBj%);M~>YJXPg|ZjkULtS)P`Na;4bR+&He9(P*S4rwxkN zi}jStRGndT_U&!p?2r*k#2T4zp)au|k3h5uGsCYPM$OJeQ zbF4bckZVb6Xi{(J#ezo=jUX*%(=^lX_b)v=UOTrE@`FwJ(MWm>BlzE0a2}pOh7YBt zeq{m~_DfSmkrWQs=LR5!^>h}g0)Y6Wko)V|9_K>8adZ|ud1E2+j>||pgSer)YhifY z9+pRPjj=nBJH`eBq(J6Wv?yfWZ2Vuc`oGzX{1})Fd0_kDm2BI!uZ_WlT8~oa>oGxQ z=@JZZ_oNnqei+GVWouDoTh^3AAb?w)X5eTQ%$0iXBD@%-xO`fv8+EmttxFoVIgLK< z+tq(r$nIHA6Lw{NQ z?jbO8=yqe|&*1}GBi|8#bt762%H~_Q-S@3-w}dV!7-EI|doOyLopqd~$OJFjUxYg7AGv>(A)yl9X;r91o( z$aMMnTIVv3a=j&(etcmPmu-(7>>wBvxfi_Ph`+t6%-;U|$Rq}T!yd|a3hv!~6Y`;$ z+W4|#(*8dn`$f-|wg`;(s(E=9|k{)=ti=s9tZX3g2 zo`fB?6h?s`EEjR+2xoWb%vf$ZKL)drSw?@U1@|WM;)6)E?)NP5qE`5xH{(Wc`BC6wpU{lAP))dqL|6hCW)#N&tB#6E5 zujrU3Nf>_ch7VFKK?4#bXh6bIp;f?pZ;9BQ-!8f`tSa)NclSrhmAjFocvWiY`mL6GUf(|p=UKwLW1;LqdEx$jiEQ%ITJmMc!aw*baQjg| zm^kqU_mn;HHtL!}p|yuSY*JL+U%~E@)#lMEsFYnMtw#YytYD3SMyNcCs-xoPud^mw zQl22}+(|I<{ctYX5zG-oYc_zE}brYZJwG<9=T)t{#3?N0W!vi4N| z&^y2$Zpb4k*m9zKbQI%wgd)a57>$WKyuhtB*B(*^leE};bJareNvaX)pnZG z^NA$nkR{bAwK>dD&SvQiFB6RBV!omo732TB+IAa9c$A-^k3!HXO2Ry)N~pQ3M(@Oi zPonmJMX}-Lo9@->dm^Xr73`J0E`xK0z7FP1JEWOBNa77!*bz6VR$|KRlX2TO4)J_9 zY!66ewO~Z4vx&0=z2O+lhN0f58cles)l>u^X&D`YRiifaX1%R+$q$@A(7fq=uE9&3 z(YG1mr^4;u(EQthXjt109mBAh;#*GmFXjcu{qPs-t}!5o#2_>vo`f2e8df3g+e zy=ma7f z=eo0feAm}b%HJW;OSZ(#xNFBf5&(>eQ|Jwf;%G^$DK#4L*s^SBv!L4{x!pobrH3XL;Zl$7@Rm=XRSqF7YA~Mz&TQILM&w&>4>k ziCKfqQT-yE)LQe?(i4_-i(3b<)-)&jPWFCR2|Ryawg>(weqSM#v zwriGYX5lQHx;i_^7Hf=$4l<@A^I^tiyPuclpJvp5M2@-e{5^(wqJq!|;2-(rca&E?twEp|o>A(7@49B9^=N_gvOnCu)g@^^|uB}~86_aMBcwlP*>6NWZ@ zkoJ<5n2&~BycmFPNzZ2!ng4lq(bc1Dr^V%K#h;Ir86LCK$?S0a`t0Q8)33K6w-plp zYjND$N_&s%o-i|f@q&+>cRhXPz7D1bX}txf)pWB{qN$rN;y$OR^mN7g$i$znz#>Sh zz&K=)8DgrrNsij0i`s|6$!nWPAUNK}y8x#$J#i-kZ-QtUGVqcATHM!d$Nh)l(c`bO z;-6J*E-){a^3zdQRpy{IkhFq9O54(lu_W)Su|e9Lgl;30odgoPt7JIh$J%JYFE>lo zTrMeT4uvLNuZ@AanvuJL=Xo{)$2r_OSvH)OqR)USu}KU&u}HXPAXAPP|VM14Ue@ulm4qDt4#tMEUU@X7<2Le){$J z6U2Q1dnWPA;JjDi9h_e~n&?oS926@8O`QY43 zv;&^3l0<29LmKkQFbFoHyCAo#V7pL5cEBC~>IW|tcLFmV#v2(oeJSI`1Y%-p#in+v z`oeHFPg_cGJ%6;InZ6FDE4zyc;#09B)i8SJAAh>_RK8db+`o>WceAO!AnxXdKf~9N z>i@E~>k}K`E7%jQUI$(CohBTQEAe_#uNI|)WqjL5j6=mm1g>M&%1{b4&hcrx-I0o~osn)paZP~ zk1!)P^;&qZrAUBFYN|w;sMXR+;tmsZf_+DhyD2!|b;0P|9{L?Vy!-3>Q+0^nL%zkl zmv=3&F31u$cNVK!oNFXP&4gmJmK#eEfHF4@S|Ma}kSdumHQaDj=B$#sYDaYKK^teg zAi0fBRvDK}522J4xyxRa8=V<1UMh9f5% z8iSQG#dgxYE%ZCVI)6K&vgw4%qq19Ak2n^3qS(qC*fUCB24@MbL%o$zUtimPwFpGC zKxgd&8bQjUVg~(z<6~>R5^Le)kJ>UBtgfMDR$zm1v=g+FsnT*hgu(%VF=+u?t(ygW zj=P%NQ1{Tb`dTcXvg7N{@MgdUo_*k9$xzjRuxEc8pt_81|Scp@5{RMfG|` zkNw#Z9oS}q9)({X21MDAE0cp}G{+WHYpIP4uhESo)|p}gI7tAWKUfyqEfUh&H(ebM z5%yC4|DFxuDSVxQUeI+uJX;YuU~5#34>&HOBbqGzh>roxT`@b{TElt3Q}rfxM8l6< zd%xxq?g)I&ZX~C66?!ma$EXk>$u1h~T*sl6hC!oVxVS{3v3o1t$HQS~84{_9EnOcm4*urH{4f2Id@ ztA{E$BWoHC`iL?JmeJ61!W0tCAWKJMYCDeq${^)fVp=<|#+zCCv)% zCZH9Ws~5fVkLa19TikDJezNF1ArXJ^f@`SU$J4#@8-7j2inF~j$S~vecoI32QX>)- zn}jUQ)8cB8%w{vhsfK%M-fH9=a)N10hMS6Ll#H&13uI9YW^_Ff=2Tskti2Pr8=U)Y zHIc^{jqLyTjTk>ySm74*Yuxk8iLS*I9G{md0hT;=Vo-~G#3F|cSW8l)#>qGz&;l%5 zK1U4z4+1Eh9WY5!z=WQ`l4BF|nWkZ}FA!WB5cJ9e$}$1#x%s>CMmKG5|Ls5Ut`>@4 zN0{SJ2LRuTFvq(E0Z*gFYRIFNrz@0Z#>+*adwU#=ng~&?kQ)<$lZ`S{i~W>S6F}BX ziHiC=Ia!ZZslm+gRG*>o4r1mziKvIICr zBmX;v4gbcj^hQkmR-t++Ab-PH|NaGAo%GHp)U5|>b%xl%Su{Uv_)X%mP(DitWSnjH z29tXnE9Gi}$NbWDrcOyPBrC4KzBi)@;b2w^ppeT|nngC{fqHXfse>fc)pnP;?!E>D{FATSoY931{jlx&3|xXR4e0&TT!V z)urWX0Gah*nzRttB+8_!ZQ|e^;3b1Lg&C(Ufnnk>2KlueW$`V-t>99 zd?|(gRpE^@kG<68cq)kx`wRY}waqvA>|n;B8hxVRx7qFC>T+BB`gd0sqFV^3f>Ppo zJJnNvk`0qdwCPvnRu0p$tngS~%@fAl5h{~qXpAy?e-MZ&!P1tnT@53xVVL~{0HHXZ zk@IX_3fs023<3Yy)dl~fQqdJ%4}{|@(Y_Lm|3$LD56QHdfwH%C5L$6XY2+&3>!`7R7 z`wd>q;Cw91<{2u)eh$e(fZ^K$odjwjrl!?TG9UB!QR_&Aw6_6N^ZV$5NEY5t$DBu6xkcKR#)1Aexhx|w#Ypwwr z*~&TYmbT)TU|<%UkgnuOEQwG%n+cki7*nJG3dO^;4afh9f^X3q0zU?%{OICyDT=yh|VYpsVg84fBw=;uYbnpWmKkH~4HvwT(I5S-3beco<@6$mWq zM(+bqiqwlkg^jGLpdfIxj*ui>(K&03+}M^G{wPaUHUFCtLynsFtU!HfQUAw?Q>)3N z_&E4E~Ni!GFk@M>dQxKSIzl6CTBD)c2| zUEphAyanqGt~HkH9jLb6+xz`A4~D2a$eX;}aKo1U&FHw`l2fKnTYRC^v+N_L_$*Yer?u~IPw?pa>vA}6pG_nAn0`8o@DM|?90A2^km%C zD6?gnf=8PX>F#GuW(_iLoKMLKJe-a&ej*f&X&LECV%!TY{=Vn%J>U~*-VM)z#T`6{C>Zx!REA{8+LcM2D-{o+2@8%qsZ7(% zs%d+-X$@)QZnj~6?iPbX3-+Zn-y!TqBIhC!0@@IX1F%gK2_=`)W})8OF23qv)s;pa z(CnOAr~SIG(GyGBd&nn5zaMvvu)|zVToBX2Y$;0?yr1vA*;;S$T2WWV+9_7lU{~z{ zIZaS{XQ*j0s5kyHoUiy)pT)T1Z&F51alN+kdQ@|1x>;rk`;jrbB!? zMs>AD;1q5AN}AJ!r{a~JuB6#?%A#(prm(oSB5>QLdeI`90LF?rH~L_U(+gnzbE#*i zZ_j}vP(j2cs1P!(lNqO{qLsB}CwcuV%-?T91T zcA4s9Ueg)H>la)$+R%#F*F8Hbqsi8mM??e z1>CO@?IHUVTOKwFgUj4@hv`}lAp@UsS;1&{4w7g1=FrIHe$~!bvt=liS%T)FT%rfO z9_ehB6m_!oYj%QPqq8{L#RhHxvqebTnOO*#!8WbT zL0em1>`~crRiRvY;B3B`mOI%^00@^OpgfEfL$o1Z8M(=h))(1OJP7Sz-IAMdkZDjD z{;9Hxw?@E6*e-%!=DdF2|Mmv5) z;rpRw82AjRDF-aViDj-D7N{z}$>)s`E+MJd_S=Oq9ov>Iu8z`^T>w$6UY;MNyNsqcAUmqObgXp_j`?>2dZ} z#{7t)PfOLOMDrIszvhs8oosgR-}ciaI>UXX(`nF|SOF^|##m~gEi=VdL;{eLb*+Rf zsFg5#-0oS5U#Lu9BLjD4?oksmQMUBul_CQ6Y_3OoTGg@tS$t;Cf$~h@xwTS^;);9O`~bEniPE0UL9~_ zW)yoY8&&2ab&f0j8d$jCv>}Sa99oVw0AYrQ$Q*L4%cR+0G~6zID*yRy-pzYa8EV%g z4DvazPPa`UJ}Ra9NyWaqOZ3mD7LFr5?FnDz2dz_}Cd|X2_oKoruKHE=;7QsMd7i*(=ly0R?j<)Vm zb&qiBp4_FbhE zo_qfpOkaSWv3xl^yY)L@IJYntC8G_ppc^biYnsFkK&iz^N=TqFYh@dnj2JIhqWx4< z;gL#BrWB6W!2+=h!Lfmcl|9QxePO>vX+GYV@rM3GDSh4WTiT~s``CBytr5>PS9}ln zjOVvu*XD}8T=Fg)7V4bK@`cc}XueS@F+fQgTIK}TT3I3Dql(qdabH^>@?@3z{idl% zS=&pxwUD$)820;Q6;Nm@NFqBRuy4raUspZ&g%I<)rsLmN&^i$;!-%`e^)tEsCx9mc z9sisY)jOEQmZ-$#WhxRxutT9?CNH(I*I>-J4&oZEh%Cdxp;% zFKNZ-YZ?$CdC(4q8H9I#};t=%seL1ErVhMzc#b{|0)I0zf zTi9Ex!&c>81_p&cP?zlW8&8GEFWCAI=r4r4)ql=eI9d?vey=`$=u6@#+EowA^*FLz z``lFZkt6mQ8odX7rqufrT}yr}irRGwbfp3CRj64D}5yu zFunGT1_%MjX3I4PY@upslI@P=6k!eVRI);3E&~)QUOa7syH74Jk0bn5MZHP13*E>K z->O9;$9?tIKlK{)`E2pHPU})0xY}J)1NF=+x^z45Nbt#7@dSHr;5zTr|q9 zuvw7x5o8)!;UZrRz-ZtQ8Zn+i^>7@|AuwEW<9yS1SZhY_&grka5jL_R@lO8|lC zd`FIPk*gFbZK<lU`Fj2vi{alo zDlVtj=*PA9{#5TjBdxuHy%PE|=$)Z;aD)VKwQtuWH(F$UQz%dtEJ%@<*voO<-*^?h zHV%2)pIe*J2!pLnHbfMxns1JX6_Uvg)8s&d`Khx=5~?mjg2Q+A_8YYR%HN-uXL{W{ z^4ZXr>n~=$)8W6rzml6-bs_oX@^$=e@f-UKCOc5}v_$Cl(;Sg!N`78o9!YvR=v}~c z2-cWM#xU{hCV}yx#-7q*l>Tlw8k18=T*7@1cEVP4;(@P#z>sY)tY3)D4zKq*%+xl; z0&8d?Rc%1GjlxG$7Jyx{lRf>Hi|b!7)hYV*`o%BP@=oq3^@L~kJ>)mko`<~)$X_FP zke9>OvY07*(2l}*7G}6P%_ummSpoIEn&5yk$)sv1yGwJ~->#T?gR&9jX;g^r3AYt( zKZ;-;n(T(-!5Z0Q3kCeKnq23O!&%e|RolJi)rOvm*}H*!M&7&exx-Zl*&5i;v`h~x z*V1vq%C)lDZ-}jXl(y1TMz?2IIg#K!;0q03hh2pOJ1M5ijqS{qkq%ZnX68fN z)r6TW<(g#0EZ~J=7)LB0RBBC(N*StGIBWWGKbMXIgW~|}Tp8@iSRS~m$O46VY#-d8 zu+^R_B6jnHmQms+_cI%wu@788o>6)_=o(U=cn3sNoNZoOwG_?T zwvb}5<5jR3X#wHIpc1TIEYv8~7JP9?(GyanmSt-m*2|Rl^8xC##rzK$4?C8uE2F{< zdTM@%?yW!16@-5W_l)M(QP=YDGk5D_)1V!2=}ySa>C{9;XT}`LNx1AoEw@WX=pH># zp1IN5#Vo}kh!Z)IO_53%M7#N5vSzci_S=kD$2)!PF#5`UR;qn=A@R+kP$ShX;x42} z47D(OS{Bzw2`E2XwT*i!`E%i=U%%o+pf4|U4LN0VDD3MEkgn`e6GJBFPMC3NN^Q{s z1_p3w#suMfy#sdGYzum8>=4xGvQA1uPjTOE)Qm-e4tNWJ`oE&p8%_T2 zSDL(0=WiV%wLjDFi&*XVDEYV7NB`HqKYnN78s>4CE*`$^<)-s{uAg&dBk)MGCtv+3 zFQXf)s_wg2T#x>r-%$6Cij5kmm(}Q~sUe@^q0Y&DFQpOSuX3h8X%Tm)$iIDv9k@|W zM)w1f-(&c)Y+`>Q-HPhnM3&r3x_f4dzJNVX%a_49?XJUAlz7dvL#4H4e<+geQcMoG zVrNrZqbnF8GH$TgY`83JSK<(3IHXoLe7#eYty`}yT(<3+W!tuG+qP%f)-2nYW!tuG z+vcgY|I_~O?A_Yh7yV+4i}8*(dGaJZN$>d#v5tsC0tMieM$qG|Sl8%Ye8NCASZpe* zymV3t-1>AMpTukM@gilrCA!fv&XRMPRIV@^Z&jR}i5JBTK7Jee6>VXIUmXrxvjq(v zxj#x=QBuh!JXg2*CKwUh=h8&AwC`NrwBSe4mpSBWQAxTH6UY`gdB$dxo;@MV&Ejy0 zn`c_=lSu|ITug@G1N;_rm4U1yWIB9~nB72?J%5A{8rlkC$y&eb(fGKwd_yg{ zgYvukZwem=y3&((_xAT>BB*O!E-@UJo?@aHQ|GLEjaH)BMpm+M7F$a}z|_kYjF8JN z5i<9jEz^-8_3*?nP{>fIjXFlO)sXxH`a4JjbBtnX|DaQ;$13jJZTXqD6#j2~vcSIE zzh6&$-^bfu)!)diK~3N3c~mUzC5k-FwwVCg3^}-*W{h;0GMegO#!yx&PQNt}ghmR+ z>h^|1vjT@vs{@7zssuQ3&Ap!JLF}afOfO9rLjpbi7DDl*+8Avyuwq(HJ?&_I#rS{1 zi+?70xw-txxzqpo;Tg}5d7}1L8cTf%Sskibg^cGX5KW2(?jFd3@)v!IThDf;J_4D) zJ@mA)d97$w@la;=+~TlowPjJa!BLXxmxvv8_50*OjbA4k`+aJx6JmAIs%^bRC7Wg` z=g;{)+j=qgdkI&b<&|OEZ-Dg$>YAj>;I;74ceZ;^bR2v)=(o^02W3?FnU_^1`*b3u zdei4$?H;hcX|@kCpl1(S9ncv*3T9`hmYFDGRVsn+K-o!plyo^;_xK}vdagyksR_TH zBVTWCpSy^HkI}9c30>lew{^H=J3o>hn$@(|De{RzbWgrtceTAcg?*@tJUSMbgeI9` z=3Ct493aL%?#6Sw?JrtnJGwR3EM0?ReLoxq9b8)4jBmR2_xcArT78gQw4`@)LsA%* zNAyk@8h&P#BVV!waQW z#05aW2@YzRNdIJhIF2M8XZWR@>5wJ4&P!2i+^IO!l?{j;*{tDA^C(B^73kJExRnv3 z;!~?-d0L-bcWqPn{rNU(dOz2R`hIfn-AWSW@?8h9*?CwRfijq9Hn{4L=EnDTKK{sz_&^>L#(|hfUre2knsn-DdrJ4C^ z->*fvMuN0+1l|R~dVE)LJo$!H;>*j4u79=pk-f%|Nk}Wp)Zu0rgZ^6=%G4RTke0M? zd=|MAK`vo%oKE=1trkQ%lvpdH$Dcua9X+P_s6jEpzDK3?@mN+Za$sD3x9q;m|Ak_r z7rJjL^|##9m3a5R(F;?8=Y5N$aA8?}OyK8PShX1UW(U@@o1PeBIhTE2DmFDHQ_H~S z%ig?7Nx@~2fa4+hiXx`_KC>p%^%nj8CS7l5m#&xa_%81w7w0AZwjKI3hS?2!mh6xX zrp6n5@NE6;t-;}Y*9)H<6g#b98RsiiQT`~V!<#KN(b~rirMg^Db;^F{%v04YFL|*b zT8#k(URt|nbyZ`H&>Dw9{NNI$y*A=Ud@8dFE_!M`2sY#zDs$PWmriM+d|w$F*%Vb} z06b1?`J5qx0W+^Sp6gCUu}Kp3K9ah;M(RNq9vJ9iarxfZ{+#BCtJk>`bWJDwJY(C) z1rwBnCe#e|JZ8%kX;VLa_+;EN4V4*WvAj$odfQ2G!6lG;Iib)~=w&RdLSzX8Rv{@7 zRcLX*2|*!miW;9;JOBA5_ZWI^=*&gf&k~T0C#L4S4V~giOL4~Z0u9KUd67;YToVXk zQwAt!yp_2YqMUgvGy=%N10Z%9K>gC#dr^zY{SXC7ui7e7%KY%~E9D+E_;FHEPcAbe z2Aj4S$f`)ery%{ggOJT+315FkA#&|1tB=2$@s{VoTkrJ^;612)ok<6JSQNBIILcKO zjc^<01uVwejK_?!C9SQCU-mepNYlx;R=Xu0u?ke)O&%~fr`7g)E7tFM>*a9yhJpyhs8?`*y{X z=j0{l;qLDlv98Q_e42zGblBk?%B7%`dg@`wp{Bgj}AmNdH7+uNLD%je8- zwyq+v(G@YCyR5elE1k=VgHHVi>o*^_BQH*^<)m+^%R4JWUgV3PJ}4#&zN|~lmRZC) z`6P28oKu;i!r5N`Hyg}JEguq(HJ@Wz_&)-%Jib!tQ|=88ENLW%ln~IBv~HfiTI&0e zFz^m0A&`amiYrXSKYvRKT;W+b(Of)_y5DsP+%#g}RD0~l;O^-D^ke<8tzvpKFoQXx zP}-wfK*sODc`mgD8{8man~O3Br5%K{>Bv$p*9oFAqyI~2OO3aZP6OjqYkF#o2$WBE z(zU%zEKE;hH5?Yubazj>u{5Lax58nPc;onz0f>0K?aQdF=foEltN9#?=TGO2!Mkyr zlb5$yY(jD&ZQK@{55>s*5J-+cM&X zNb=;mGC+=1YXWar5igSw_qLchsn#R2)?Xn+L$-^Y%%e?)C5yhig1T{c z$bUZ6?8be|x01wUgRMj_8-hzghxmGJYvc%Z>$E=s%*rff*kjH?z zH?@{aor2b%zC9dLa8UM~pM~qk*L10;rpq1_qxK8bqf3IZ3X$-l)e10*^$Zi)4ul`1s^Jz%CW#T3Cz*?!%@ivHl6%5wHwcs zz~%)u9OvwYwn#oly={nu_+trg1lR*%ta3=zgCQ~*Wv7mWKF4_Y=u{ARd;hO=xs?jk zd!HnF(Jm$l<@8)avb3;Qw?X^6dV8+dlV8V{u&yJCZ8Y+ol5idV7P=O#IhPX74JMRSPe`od%sN@gXCaBIj@x*FS=1yj-9*HA!)I(`*y3-#WQI zp{wvdUGU5wUk9H6@4&dRW>XCp^ueI^GU!CmgEY`s3XCiP+~ejYW9~c_U`%sHfu?lJ z{gtbGI8e`d2rC0?6OMk`SQ6_LY=4Md!(oV79%Q%(%cJB^HgnF}?w$)wyfW|Lu~!h~ zMBY37c@%GK>}e-A1+2}F3mLPTR&-^F%lT5r`ZU+WCVq=1C)wr7Y8`PA(T1>6GlQ#8 zTbE|ltY?w<7oaqcpvpulNS?f>aTdDL9+?Lz!1yk|q@GSuxW6rG--uA|#UqU(3YB!> zl;jV;o(o27MC6t`Tq(UpyqIO!eZyYOmDEH>a}9`m3*K~#@4X*HMwQz3MY+V!DIbCO_`mE5EW3FTfa1hCP=4ESs`RrF{e+1Y;20dve?WO z<;!b&Ayt*KtD<9@bc>4amIn56?ZZtWWph;Cyk_2vA*b5gD%)_RTgGKl##cBB_jrc< zN|J3Rqcc9IM?{9(fbs@b0c+Z915vw46*4txg`D%q!}_zjEvUM3k_r9iNIzye7D@%K zJc0HJy?)i1%n}cTF1l%!$fF%ZmAEMlUX7 z-`>MhgSJWyW$-FfZog@_Ut>OfP(*+QpjcbNz^YM4TX%g^v3@r`u_&cW8RQX!=-JSq z>LDA!W2i8gF|N;nk{hcYR=Cb9-_DuSclVdDVB|+VYC0*s`!N`udn3PuM;$1(#3@Tu zA|jukEMN9d?oWsQU42~K{Jc2In8d^74Qrv7hD`Vt3tD^m{CeKMyx2V&zBsGGZ&kjt zu`+^8s}*Mgofw!3i!|Hxq@m0wzFBcBe zwhqgqioMoHg@+>q$$?D=Mn%)K*Qg1r!tf5ahtTD|ZT1EaVjWuw{Y)LxUV`}(OjB_+ z?mBuRDN43Hh76@kn9IBA6)-VX`L6hMS zBSY@S1L>f4Jb&LhDi{9nff2voRpuRzY6?ZcxzQ#Q>Gzu39JSd3v(*_P$tYkoYMI(X zFozYcdDZ64F;R`{uxDeicz3CS-_u{r5OaAEejQTS3bV;miiv>|Ch_j0Qer6Asa*?BmkHF5O5%V+^Spy%Sm>99<$W-9e4fyP(->TnI(9$IzI#}7 zOv+TvCLY<}6OzW6Z6sMadkPU`dD_d%p{VDscN)W2-4x7^^X=A&ij_ugdW$I0+{h_U zf_@}|9C|$~O}9+H-Dsq5Ib?ZVV9itelzC${0Heby)66@RxCh^{8raM>dx;B+1fDVE z=7e5o?|t&DkNFkT)TC(R;8_4|in(;x1|CHqiAlPCQqhph5ZXb}IQrNAgR+d9&~uy6 zU)1Dn8?H&wA;0=*%_tiEXW0*6+OELBz2X#R>4;O!eE-BiK9@E%M;zy3e@(qHUkAy} zOUU*C7rUcHRPF?zUqS=(tW7L^pX{H|{l~7%<5aYP#Wv=l0097yfPQT2U+v1s&c@!( z*2LD?>Ay@%M}fyKh#qG16&1q8I`OkOvCZ|$RuJG>(6J6#hhndLnZQ1O^N#o8Ie}V5 zhmFo!luN*=EQ4W)ORqt;)IDg*-K4KDvZ{;y<%mVjJ~M05#}41lDOW2mJUWhty$L(! zgN9vkjUd-6_c}-m1llOz+F>LTP6k!7t|@7?KND73)ULLIu|ATf#v7hizUd>Et)xuu zSCA^0EUs{C;w8hgB^JR_C8p#VcoPV-SuaUo7L6NFXhQGt)I5*-`M&CTxtzP4IN~NP zr?rcJXvlZTK_$Gx#&m5UwouFE_}HyR`h_13TQy_$84|}ny!OUur z1RWk}d$RAO)!)W)AHe@EOo6c9PGLX7y#Em<(Z34Q*~!Sx*3`o6zeH)HIBwg=57Tjv zst{93tP;zka!5chtBC4Z&Th?0s?oL@ZCwIN@YT5$G;>T6&hr#CJmr8OQv0N0L%maH zx{o{9JgYDVRMQ8fzUSW7*4ot?Q{DDkh~B@_f&QMoDZ<>e=O{0}*54_fC5>2@u2O+p zgEv!eG!sz8lwd3KFI5g3Qj=nA&9QF8mUJimY75Ax>#kj%GsY$xZAvSVMTmK-kC`Xf zT@$1akl7OIQ{kBAH$$~$thIJ+@o9GN?CLukv?x1@(ASLO7Z6t#B>jo5>A8Xs-QGt7 z<43)j*t>jaE_1Bl&7p~bHpY=*AV&1p;?+lF;^r}QbyCrHEm?4RLf#ELFY>x}zFmZ4 z1%&yPDt?H|t68O0E`GsHp6z7!&~*r?6!dvLy&ukfO#5DZCN?VGT-HFrhFZ$FY5rpX z>x=B$=0e1H^|v&V+i4A|xS}Az=sk+2;eLaSqq$XKK2ZvfEnx4dZJW{XI#kim zEY?a2B(iVOIwB5v=QSAFz+STdDDod~<4%6={`8~BH4p#*;(t}7tA(=(?f=!Kvs3UN zo!ESOl#uIBRI<*#fk9(NH4HUe6J#>5s2cplZ~`52TemzGo7q*2ulHnlKr$jPk(gtS zYp*xO!qa$YP_YUh0cv-su-h(2HL+C!GnK8%um~60t97BfC|6MRcBy;G6odv5X8^HOvf|e01Ea? z^eg=kD`BR+=tC|ZTX&^5*Ud+8y{5JHaLB1Mlz4c>2BdQ;C2~ar$V)g$EkK$PGvzs@ zibb!Lh9GLEYo*jYb2RoiX2+Gl{&fLE$h&FjJy@0G`&r)dCKT>?hARKzR_T?pfyQGx zK&dCBsU!+(q!O)~Uclv)cT);)-Oj2Lt`eods{fF0v>Si@XegzgTgE$7n}@Gw=Neeo zB{dG8dNuD-i@;k_az^7Pei7KI+FkP1($m$r^5>VbvooLWTfIe`Pfqke`EbiBhZY4o;PD0zM*Fs)M_3LhKhv) zMvGf;U1?cbcOR2sdSv}W!9c@bEkGFS%b!>_0B)5w?f^P@d0yo}zetRF%5}+$Kw!t0kv30Sl`;Hkw9fmsdpcWh2!46sa5wT-MF9#Yo#B(?&gxK!p zKm+waLCwi1DOZxr1HsAS#f;@X)QlV50l)GJeg=F7VP`8eqzbn{C^p+5)Y%5yH_8%|Tunkk@89o{3saszv4+H{or^uwe~EtwZwgD3lFIX;vCP73gUZ!}MSKY^4gthG(f3rsC_i>eSkhwtdIyNCgU>?};5AetX8!xI zWX>GEC%3y%l2vgOiXE5VE*adKZ|Ez!a z?f>^polKlv>}j2y#wTb-=qMHB9myqVXh$ccmM2H0DJ7}P7p8&kT$Jvd9>*C46eX9m zwE_Mk)_*7y4b!mG^vCa|{7@#rzlznw)|J-8-N44)+9djqfZZBDLh$uRM7$%UVy{X% zGG!73dqM_89ISuZKYEObCKxB9V4mWx2lM{dKeh9*T!{b7)&us4-%7-Jm%q=H_(q z?aVqB*94ZFZC>3GWDz(LiR(-3B6pT|>~Q36??MyVeg3m1BHTo!2S-nVJ;e9}9_=$W zaScm+{v(&fCeg`pHR>`f+m>1&`J5;e?gDI8byYXWRs|GLFdnm_?1px$WF+trH@MgA zT@3Lsxk6bNvz1|_<1Q#)iocr{*AeLRmU?jQPUWv*c$0nb*eI@GubGIZm<$5~%S&+k zAavNn5%`Nz>`Y%olcHPYVNjmK=OJ62?|sajq2aM5DIKoZC%Pg9rfnI{_xQon)l7UV zzBSTvDCI2}&xqVfZhf))SIRV)9ILz}weH!cEtRa^DeiGnx0wN{A>h9|et+Y>Ab&HB z?R`TYF7R6h9|W#IWHO_+%~;Y|Pf2(I`}BV%$}*-^4?Rn8>wxT5Zv`jvB(c%e-&*6D zeV<`J>M5B34qJIONp#SgyO|f5mioLN2o6y2E{_>nncjz(*sOy5j>i_TvRX+Vpnn(`rWu@-0ev$@TFxee95LZdsY6;VVQb8JhA71MK>ktLQcafl|qp) zvPBN=Rm4L7iI5Dp^+aJEzN3YAr3NR?WdfTd{R-j*LIHt?Xz7^WqhG&*8N-i#-GlOL z)>DO?f;%MsbziZ~r$lGVcx)`$;(hStfAI4x&Lz{`4>-+#IGW{OL2BUQZ2n(cOWOZz zEosFZ?SAaT!@$N`CazbupB^UU+5<`o$I}u&S5O>P*?dlR#_O=?>WHRHC=&v9pgj=+ zaD4FT`n$ezqu1FmI0;uE{I~)VA^GC7F%YmKh^j(?yVTv2Pl5PX3CI{PyRMWHAu*!c zt}8`z`q36^A5Tw8H4@obBnZPogk*yp&mr3mnS0 zeQZV%M?C3P%zZ84Jv_txojx~-Hobuz0P$UXb6wetO_(ET#+vY-jq};?^aRH;!Ihkh|!J zsj^-bCyOc;x7V-7BO?7lPzpi=AZoArde4UT`$KKfZWJrC1#XXjjOXXrsjyZ@uBNK2 z=b2Ux)f%czw7E!TJYTYgv+Li7TcS9W9Q{k>|B2%C$LJi zy0sUsLnC6cN}IZcB+Eyo zF^FBsXds<#bI*QSLmsREg04~X^0%*WPXNoxG*$%-{F&H5jt;{n-LSxU+yzyvIU=5n z%9uhu4}l;Nb=iftq@K$5R*as=x|5)QMxzjA zs%q4~2~W3MOS*VJN37q2tivbMhhKAcY%Ln|!SgrKyfh7!g~$}m@I5Ete8%~xA@A4w zNiq&r?@j;YiECF&D=*T7X#c7C7KB;!^Qb%LuxWL-@8?*j?C|%?v7vh-MojVj z;DP1WSCsR^xURcXWD=jOSQa{$rHDB|d8lY>9sa@a*Gr)HBlVf;T!=UItpne6!i?rA z`nZ=l&DALXfnfZX_Lify7#9P8Ir zP4`cG$LY)RsySA=r+n^%xL2Ac&9VdVGSMYw=3Z9qi97tSO2uS-u@{t!ec1J}I^#w} zYIM+Qsc|f0)W-O7%N~&)pbdYWNvgn5mS%Y((_4`U8Y&YPJ4LiwyUnSUcgkrw$A$== za?N+h2$44F^-J-s$+0!{y!rV~FGvnE`M-@HI)#W$w~Gf_w75)#n$#q%!@`ufap7~0 z6n}+0$wAG-%&6k07duPkAIfRR*<@`c7(G{VACJZa7wuk&_w5)?FkT{+T8QGt>*spY z{2c~cL3#<*v%7&q+50${G=A}EeXvMo4*v?m>>DittR{e-q|LP}=y&JF=XP}ftjc{T zsBsF`<%o&S5iHoLE{CdM(f2~6;as8n?J;`u3rZur!%4qz(2U)u!rexV{OOvR>6-~? zEF*<~ZD+%<{m5ata083L&Q_jObwTAwz8U3-vOvQ@CyM9G+lI1HB&CW&KX7;jmSA$i zV7dEiE$!2OT@S($dPSClE3 z9UG-P>48q)XWb{iD)QCGIr@9IhM)vu@8aL z7^nj({@hu;!hMqIigG!zS|{mA|XeHhQj*)ONS0R$qvePOAFZY)On=2MGM_ zWTn2?Hi*MkrcbwGtE$3PwTeNkSX~<~zVXdbuH2(??3}r${0kKpe_5HoYZQT9T+xgm z93ztkYqq!FyMhPuK*aF+7S8|lHA1GC8M9CJ5|yvKi?rw|DU?adlE>3mGctN=p_6~~ zhP#|f!+`)l-CO_8cw;&F8}KliQzLtlu7$Dqz*YFriG)ANvz*T7>77aJBM3iq5T*jx zV|R6UIFYt>dU0*?vht6O*r9DFT2c>7^R;bVaXWQ_P*K2ygklcU-0LcG|r2jp>b#gSK z6R`g$j&|SFw6WW0LHx?r>xBr_hgDx|#BC4nv|2vK5SJfjFeC!CH8^NNaw}4|LujNM zGW8YfM)_Q#6Y*Wn<11iVz@|`q+R9TyL8Uc|%*336G0VnOgv)0hbwmRF`)7!nc%C{u zOr>)zky^tsS%Zu&Ai!ScC{t&KK2!eL09}u^MCs^gZ#kA)a)7RxV-j=q&m5!ZW(Ub0 zw~Sq9X!=2{_tkuqhd1Z+CmO|!cOgSotu&e4k#X^JR7k7uF4MFBGPmqDdVdqukjYyH zwFBm{0C!^Pyr(>Yi3UoKInsE-ys0v2*SPsai3Hkg$6(xFCdPTL^m*tPbkaIjyr>mh zh6<%X3H^S;8)AHpq*zJS+;~jBi_UN=yjnB%TqbaO%6c78g}D2x!HCyL;;B{1)qATp z2-Chb+oO=7Upu7GXb39!$gvcjQu}Sf7IVKCrAxuBBFr~QGHKNxi=`q?`$BAv0H-xB z@~QM%YMeOy*>8`k=wbHa5)m=GfBoXVi3wK;%50Ppo5~Cmlq=Kc*1uh*(o3{UXxQ+zE?z1ekbgn=TNXdhBN$FYTcfLvB2gL9s_W z*iK1NR3+%71ykBS=1v<77`2f^1f@}@uOY4!exbyXPdn;(pn_Hz(vUTVuOtePFQORD zKjJpmUu(Pu_nhUx9ZO2xj<4l!wnwI zH1P0Frcpr|Aatmn1Lit^;_n+t^$UWgN{rv%8Wu}}H0jAtXwEsc7k&;bJBEf?cgIc?Dd74ubmeKaJm4=tti!kG_w5k{#lNgGmbD|ZlebY4iV8KU$bK4%38X*0M0zPoAT?|!#@vQhVQn|2uJ)$m;0_Dq&NV>%kW=qMD+Lxv zA(JN|7D5o++ zDG7>sHqqa|jz%W=x#JNz4AiJs@zIYbPnj-c&Qp7R#yx_39I|eXMwp_db1Y362Eo}9YqB5aIz=}}VOC2OVx666+&DP)y z&BCQMRVJ`QHC7xPBu3cPaz);JDlZHCN zCY_*Q_nSHXY@ZhJ7`!5N2JPum?PVjWQ`pb!`9W2pl9L(VQa_JUtOCnlG@clsD)cqF zK$+--q>?VJk*(aVQR#jh5V&vfV!<$@2FagD8fp{|++%qxc}!Eb8I-^XiJcf+T8DTW zvr3`X+N2W9X`biQ8{>IR)Dy)@C&28NyeLrC@L|M_PUybr6Ac}9g-IoP_yUaKFIoEY z^vlY1tRWu4qoE*;uYGhdSc2|wfJbX`SQG~*M!-Mfjd)oD`l!XpF*O6wfwUkZ9>5JO zMjghe-xUVJ3hWf^00EG<T&lIqr&b3d*M_{g~&AOEw+1T)H=T{s0O_J+~!MdU^YAe?oYQ- zeh>3b$gzgJGBDsLXJfG0L$Dk7)0Kszn~_2P(l}q)KgvCwxMJ?GYq}FM)px;U{UD}F z(03*oM{ke+i!WO`x|}oRuSMTUV%%_1c9sD23}}lQ z|GJhRYi+KdKz;u$ptBd6kXG2~KEqv$?y0?gvh9$xQXhXULa_=u2=1!VKnyMabW?ts zMatCDYp*9-}Wt3(f5t$(KO1O z(!3;7p7RjH^HXnC5MR8ubrRCx?>(T5Qb`+}*PiwaEbBC&_;8v4AJRzcQoMdr{-6ow zIY`CNNxN<}-ZZ8%(2_Y4WB5u&;s6R0+G<#f*(8JSNbHyBFFxB}>WznBUw0|p-*?Nt zU+4I~>z?>B_Dgt{un_V{IVk7IEWcJtU3PpP%S*NPbX&h3a^X_8hZY20kyAJce8Ut? z8)CK076+dhdT-Lf814&=cH62-8==gMOMf$6GVtaQ;N5i`I4z5HgDs2MWv!5@XRFHMTdIJ>LYVQXs3;8?uUdr)M& zKrhcqPr`rVvO@^<{_LttW72V0O2{+V5Z|s^Q_+48AVCcK`+V8`ULk`YH((M+*!ZRE zhwYKCb5F@`(`Sn7W$azdd{8lz ze{3fEH4!9I4JI;<^=9}URH+YN7CKOGNhiIZ5#+BPa7P;M!>R7s+Mylsj}CVHPbXFg zVc+s){yJUW9`9dqSBamFC_Y*^EY~+q+uPV9z)xR&ya^l^-rHatp;No9bwIr$z7cRE z*qH_32LQu<`(ZF$9gnd-2}wcT;#|}xY!*ve>7UTh#=ye%pV-hvNycf79-;GC&Dz@$qeeObOj5j9B3%fMnZm-$MA@R((q=UN z03l?z+s%Z2CQg@muB%zkPOY3g`mrX+4s~tNrb_<(>1%&B9i3#h52|JF2-Fa z8C$mRB-{PD4LF7VSan;@?(o4h>mzhhY>cDGY~2>=h|yMok)T8-I&19c-GKbg<**)@ zq^T=Y-qD;JXa}96O_&}1;=7uNmsA}C2_@Sty`RK9^IDET7Y|T8^N#WvzDVtW!B0PM zO>XxIlD~iSww=-*06!1(m;!f`S!TTlLj$UaD%MsgJDjCH15bXmVOpm#_RI)X(zFt7 zLsJ$FR6G!5!-}Z?`S9@Q zbo=f6XTO?au9QXkrNkdq-k7)f#4n5MsGJ#cc1hXHV`VGM-V7YWzkkL~|U` zn>n>)tox=u`Bo8wicEImO^WqGVJh*J84oOb-Es+29L)TQ_c>S$A|>#@##%x2A`Mr* zR(0%3Qw7l}Hvz1|cpvkkG^+Je;kiH60M?=5xv=uwk5QOUotRzE`j!+2W60GF5)f=4HViP5T`-h#61ms z0_SEv7Hv_1pLkOsm)i^X-idpReqNvuB_%Wl`1=-DyY?DWg2N@%b{efNK^Q#o~*V4F4fUvmcZa^;t+N7d(pRlyw3 z(uM}j)DmRtCmF8rYH&z3X6G#qkP<@wx;6oulWYJRz1@*{NJqa-nqS{9?qFVHhE@b+#+hXO&BLTqMTnGQMBUw4Vr*B3D0b<934 zKC5xxnMXs{K#larxF~sbuMta_r1N~p0%#TlS~?sU=ml)Q^B1JM!$MW!iqj;rxG(5> zIBwVmG1sZ`I4p-E)iG~AIfPXi=?HT2QC8@2nUQY(p|2rzE_Yg?KebQRL5Fp*Vz-EV zsuB^GJIt^>$v)G#eE6OCA(6n#b#(tBOL7o1G-=TAZswaI+Pwxdlw_Y^5W<1GUpf|~ zFDl`pA>2m3PX1eeL)Goo8_VA^L8mh}@t(;V_MD%#PYwNM{1y$k*BlE{88#7EZp~?j zMj*Et09|dgNT+Eb?8}9sH!zGks2=;>l@~noAk%Tq-?A((I;JeJpWN&q4q7U~EErr+ z&M87}&%~~&?skwc7ES7a%&Z1561Pkfj*L%#wDVjd@N))y1$e18{ExdWeeRnb=}SLl zOSmeX-em+n+gNOH7u#Fa=40Nb-hb5h59|?{jOa&y)Mx+0wEtea`~NrL|5WgPFyE*& zZo5v8&~Z+M#yJ~Iy@|UVHjiTN4?>=v>z1yqRY9Tni-Jsa$M;$>KSv}QKmZ=>AZv5> z;zFFI(glzg@VRH*bt@Pvd5SeIC8@eqNW-E0kSz_1bGs)m{sii#j{s|>=xg1Nm%JX! zs?mPKhALD$XucPewz9ukdjV9u(4nyh=%!Hw5la4Hy%cy;RHSSFrNaik?I(`2~#Sx?+fv)cd2w`vl z05tzQ2Ra+r8XH*ubTHBUQ``9m6Gf`)w)?CI-qUImP=kVC)KoV9-uBejrnu-b@r6~1 z)S4gy$yBop%Zx=NB*Rq&*Jobc6+-cCuL%uTQik!|{r&w+OwKy!o&mC@xf>;M6^4{N zR=r4PZv+M0wLO>kwH`R(AWN^@Q53g{f5~%g#7S^vNf+eqa+V<_$c^a{XK|?We)2Y` z?g%`NFx(^i$>Y2)o-0YcFlx)m$cPR1-GO0b5VQDZ%5MRKkdZBTFKG#WP@nH1BnE>! zf#+fv(L}0k6i(jS3S`b$^?3;KrGN*2Ah22nrM(|r=-Y`ixfL0ZW&?J!Nvf1~%2_78 z4KqjNYNgL|^^aaWm9x0f(OC`vA>$t`(xn|r)C0iJi2!`Z`T(lSv~+q#6;yW?EGxUg zllh9iqHe{YvwI2I1EJ`D4$J)xN-x0OJ!15~y=h**zrDFIaDRlHbz9oGC<&c?S=I{) z#QqCAczo^4y%9rK;WaR8;!`Iv=IsK%Ug+d;;WCO@cU6_x_|WT!=2j|-O)Mi{?p3Jp zQnuVM$#laE^WOBf&RLeXs2Q!+jfE&_^X5t-gPRHMC{Z+!F>VB71spBUhzPM|tRNa8 z@_vyB97*Y6Rv-dK;M;a0Wsg)dM_PU0yq>Li!jHXSX>KrqH+Q&?ZvOSOJjtgn^RDH=+ zrnWHxJJvD^N~1F|LV8jgY}3yr+<>e5dB7UT71Kyr@mC|pU|yVN7*KNL5muGH9(^XN zi|LdQ@~cVVfn!Q8bYc2ClEOOZ?aD}-F43s<^0m@P<~8hF)zH*Uun&z`CqZV(kZoR646%jzf1Or6WYzfpsS8 zD~9WmCTDFYGYjwr+$*|=+e^CttX1K9Beg%xeNpgFODwuS_^5%YeDn7@vr)pQ7kWFL z&!ks+l`7SH)NTpG!@O=?+@MvybXdes&CF|O!ij6}?4Zw{i;2+^V;gOIUwN{;Zf~Pz zB;|Ecor+yTo4#9QU2eUqJip|k>lC@OEA%ejs>7aTtrEfL3ICK>Q4avIwWK%pGX&~WQi`M>p!nx$0{`p7oE;5polNZ};Lr{`+Ska}y&g zr=PzusHvs4E{^2$TzztKAWbYf5|ov~;=m3$Zp<#lD4{Rwy3GFT0*rYifv8a^b>Q2( zy!_e*bL67`fS{@UucXU)d9@Tuy~ifRQxfjv{n6XWra^g^H|6$`%y>qBK5EC$HQ05L z#o4vyl&tG=hew&N1zEZTBw_0u;0yx|+su!iA$Z@09AQ45@{NOsN%}%hjl&pXPp&<> z%rZXj7gQOyO_Ox5SALE86y@W%FB8}f>dGyuG^WQL3RYe&7Rf7juW;hXuO6dXlU!K) zYs~1c=bmHZ&mVof5Udzh$FBn(D3!N#0cijuyjs<+?Og0 zzUvE4TVYzU!j?MzuDLjN?ku~$IwBO-3aEQERn_SC{EE709@ye<4I@+v&XmDxNBOos z{q``ae-zM`H-rV!S85072+pq75-JYjwC6iJsI%;sq3H*Q+Da+kl_-E}(S8q6g+1pZ zRjDiJ-CLR@F^*vjboHugTs`oIZh;6AtbCm}4}bIUxH~!DoTcpdW@&I>mB^}&>Iv|U z4$=oXE=C4xLv5C8wKf&8`h>#ci_j)e3RM7|+H6`?*6d6lcO5mtgH&NaI& zR5yC^+zr?|M_h{eH~oF9FoAjSOCX4_>^;0D`LvtR_H0dRGyyEh72haipa7J~A0-Qr zDMl|*7nC(q7g}QnIm{VDFL;!P4g3!E6YtU9fhDZ`5dnlX1HZP-C1l@I7q5A zzsQEB9Kz&PhZ;3)P1WusA8)}o_d*&jNPIdl@2JhlB>o&Hl+ch~a5gq3H%YR&!xraX z!}j-bbIT*YV1HLv)yxIpbipe?u^gq&8E)bvX)B1!=2SXafhi1{MMD+tra9{@F_mMn z>#Vh5{rIYU{x*1O*K8?%lTc9b(y9u<%IGVDy!=K!Wz+R)rCab}^0cq;cKP0tM~>uu zls9QoVRy|l3faAe>EJAnGKke7S;4A~PB*ueqiba!JfbmD9Yg!#0eqiy{d&(o^a}zH z9b3G$<4r_TYula4or4wKu@a=XxY^l$r|_!gebT%9KCbK)v-Srln;%3r{#qPVcy3(* z*6B*r(LQg(oayDL%FZkhn^h@r$VXyyiMJbB*yt~+*@VKbtlrnET0#Q~j!{Cut4lRY zNdsAAFtCu^A#Sa2Qg`>TGpH>bi)6I>f@%n5PJCvf5VQ&w+$x~c$KODTy_@9Iwf?$x z=H_h0v?C_F1Uq^kX283@>84@1M0O#sZn9A)1%FEmgBUs_w85dd|JRh#G-~>W?{hp-(W^yJz?x7$P zJ4sR$EdV^qUV|KtXQYetghah#b>)Z4#^2<8H)jUCJS?d|X?xR>(k#k`YVdur`q3cg zIN)a^A2V9$O4Cj8r;GKc{qXVkd{&~$t28jE=fR)6W|97Osshg0VQ0Nh%$Ac6JmA+r z?@BVV81!RJ2=ywM5_l7awXoOIxKX0ME^i`t6+L#sn-Af~*X!SeFi&cD35Njpj*3S% z<0CLk34M6FGV3nLR1_4M->HPa=yra7G7N_>Kt0$ApI{x4vzcLZsm2JCM($7xrk0s) zivCKx%YzF~iW>Tqqc9z5hEd4Jb2H^gAjINjQyveu)Kjbp_0m4vF)+}c_DA@(#W@a7 zFMqFA$EAI@@#vxVe^%FUThfi>Xd{dn((S_`$yaKYbhvA37!5dIHo?-U(rz;%Dd zwrzE6+v%ud+qP}nwq3E&vC*+@+yA^Xv)0V_-MworYCV@#SM}_(&-v}$hxHpB-FXbf zYWkme%1PR6(CiKylMXoB%LXZZv|x#cp}ugO%_zd4<19tpT2w~{GESKhQ36&fg%2d^ zlp)CWPCA-pHtK|wTqQH9Sb}?=fpeY^D}oo4_o5n@GR}1gFqV|dLWyoxrDD2qcWqI* z_dfL}!ee*mkY_Wj?WdFbTD{kb0b(BYAD~&&R6NebS@FCXiAWMo7d>o2FgvnRrJ)Jn zGPINIITz96Zn6Y~){;Gz9g!Q(xT*d7r3}2dE`ATU1h4`(XVlj&Wu5`0@y?IH^l4aU z%p$)OKz4sfb<|@2W9m#drZba=B>Kbz_0pyCf~&oR1mubaMG&QN{v>{s&FVPnM(ZW7 z^6gFtQ7DvtZx8@WOSlyB1yuY!<1K?5%{0HxVsZdxQCH`uCD)6oiguM*>H^VEhUVKN zpmoAm{jvj8IM&=$sWjxmBP1YpFgToa7XgCwR1 z*DiMtTpw~RBuNv2fX3^=8A4MTuf5Ksz)pWej!<|mO;Wv?cw=pQ>l!XH-BfRclzd9s zlN9`mYLFC9ILAzK{Eq926mKL~;J;&Tm@nqNbZ5btcpP_)RSW2>?{OV7{j&Duy`eAf4IB+L@bd0W% z3LYm^)^(4_Ri`cV2{EF6<-txal_5rl7eDun@Nr$6_@D(PD2l%TB$UWP4Hrt(%?^VC z4@z42KdxSVMKKwc`;{wI=}owm43As&eg*EEMkB!6@89{%&%gg33fl5Z@Nss~ddDP0 zDTB0Ix%Bb^g_5XFU{$oULIBvir z{7C50A5Mt(zmm|R2F?bucE%>wDo+1F9e=!x8qH1H{WkQT8KwFGePZC2>`CVioe@`8 zMxIN!mPV?~%MGml(9{!kTn$CBUlF^=_418%v+w-B^NNpeBuIXZW#}klHptxJ<>p;~ z#LEE~?f@hbicU|qohAxw{mbW(s?n^*T1Q@cDbeC7ZXT&vQ3Bc@TvnLgJo`MF0Qc0s z^2Qrk1?`dN&yuEE*Q0q3vAbH@dqA(^OnTM!JacY%uibsMp$2)c_lUbPg;>f#2A=zj z`Q-1{FC)d0Nqxc}ISH!CUzMZ*M$>^`DblZ>)qD5@Pv2fvQ{9I<f2a}-lHUp<^#yGPJprd47;wlMed*I;{9ov3BpcICmb!kF}wYjTHi-lSv$EWh9# zU@q_=w_*RG(q;|SveWUAUWy_f(coku|G%jPpi^(Ahjn(er*5yL5HZPmK1>y#bh2Ea zC;?b0Xg>94j^uE#3Qgoa7FB{CH;R*`)g;JMB&nse5Iuo8*@+~@g5dkfgn;mLZz(gy zZE12l3w|~;%_d`@2k1^hY|LWF&J*RRRq8V@Y zbhhfW1d8bHwNV$5G}p}TcwmGTGqwGJHQ1LhUcUn-sjc0G^HJYmnFJU7ZZ0(*Kn*u4 zl)!%Z2rp`ee(CvUN#Ffw_V?QSKtOU=7|G^3=s>@bdd$+atutzvj>M&0D82`V-isCb zD8j0sHEtM3J+MT}U$D!+LyEVa%Z&D&tO`$UwAVD{H-Kh)&uRzNSUkA!gx(NMPoa+S ztEE7plO8e^r&*@fEovQUj!z^G4o#=A4}!hq1{MY62%L|^_bP@{;=0%qh&=196hEpu z`lwi*4yEr|SiOAD|BOr7ZVEuRS({v{Hh_QFV`@Y^Rt%sr$8$pq`rSZzV#;Wq%6%EJ z(rp%|uN>vkJHnFZ+nY9+lw@VR9d_fq{0nsTZ%h$1&hPWxz(25ZN}L6QVb99q>DqYX z)p&Q_GjFHkbz-|UB5K3|m{47HJ%M8w=!~UXo6d(6q`d>nJ+V{iddT7gT=)+IP;ulg8P8)r}$LSOgvQe6&Fc|Mh9V!PIvJ~5UAm* zz&Pj326!xo4QWLL9Un~yfBzg(>1o)=!}dOAU~Bm1+y;t`u?Hxgg7?b`NFY2s7e7)W zDy43!@Bm0KDJq(RA5t$-Dr(q_&23}c%8;6p*~lLOBM@M0nCbkN-sND2_GC9c+{CyB zWH@Kte_7+q$F~LyFy$7$N^_tli;4BE9`H)XZIUi0x@pa^>1gUmd9l1e4bKYCqfq_F zzA|EJQkPrW+h`^G`X%A0l3F3v97#5$aX`9{^~?in+*2l&)-6PZXY_eWGk3Vk(_fV7 zpaIK6%J^p&Ut7GG`a#~S3LK~ac0_bk>t@^HC{~6B&xS-o_o4UV*@06#K(9{l5f)zQw(5^iAt4)chHvv)*cgHsG!ti0Pb4NGe9@w9 zVE2YgQ;!zWS=e5wZLI{NcvpSmSwSZthXlk5A&Bxg+`J^C6kva3TYhzSf+mjOJFz%t z_d(YVrn}+AmGKz0ObGy$SdKuAg#Na*v0~vVm^M68w{EDY8n3`{Z)kWp2sWEKSk>a> z+hmACVIPKGlxPEsXI(6E}1lD<-zsMT-CyM6L9mdS7DWr8?4G)3f>wTgw_8o*7 zbEM2v9WDb+n|RGjCM6(M;(kfwU-dDHqKK&;ZLnNNEY@A1=rX&u$5r)@F#pU5Ol?=QrX127g2RH@ZoZ2w%}M91+{wH{o1(fnT5Lx$%<8L%MwK%^ z*QL6j$`loG-&GW-QZOq~0xF9sw~ z@_*n)DEKS;eU(xlkoFjCd`CKYn#RunOUoE%P;M-W79A3OV#-)zYw0@{q)HeGb04z9 zES1d(TC-kEI+)-zq%czqx?)?P)unM#lam|oZ=zR=GnAk2I#r7ntHVnAoyBrFU`5D_U|*w4MYQjHy3+GbzG;dKzE$UOrY-NxBLdg zwBYx5l^t+*-?9pyP7)Fj!~|v$@a0QBmHy30`N2#Y5fOl1_uUE2wtK&q#m)t#@@8vN zDsUBVjeMbsBpicJq)L1`HJV0Jeq=Wmp!R%hYA_r;9w`kFr0H6Jb}(dBWne%GfPR$u zfB!F7$8uH)MEYk*c8LxIB>rFNOy&P+-AbBR+yBT;1MB}N&Sv$^q&0RVzvH@-RbJ5{nqz&ooXW~ z>XZO{xuRj7A{~kgE`Nc)P zw*@nZOV5@g?DrF^>z+v4WT+#U?hCr*W9KJBK0Y{4tqnG}eb}I<46LV2tiO$O5bhlh zs#mzNw4|?ctP=7L8kHh8`#sG~=wC>o1R^@jWmr`W$CCXe+{!31N6e8vQw4Ht=ugo#XJ-M54s-Z`$Kh?PhU1V}}4)NH0A4kzeVef_UwiI~NbR z*5`&h2B2(yA`!JlAR&0VJKV+`O2*vsgX!aNJBE1A8FX@1^j(@3Nae!Je_jA7_!Xv=+X< zp^6!?TtkUkU(6aH0eM2wQ{%Z^yG9!L#^VcXI zn^a5|WGBvo(U)elk{5v_pZdh`0xHrW4yqA`k+{JvmNZ1Hq* zb|ZRe`r1O{60!6IUCSeVMTJFM)5q>lYkEv%v}JH~e8R*B*>Ik}+*sn9mbc|hft0*u zlux#a)>Tt&JrAK3-moueniAFwm2*wtN_(qrBPU%3_?PS)D>S@DYIgHvgpb0`l5Bl4 zuk>IbSl5O{OlGU{D+o#U@XEIjvv1@#&^kKu$Q)@#0-e6;aHv(rDS$B?x;4F2Ofy@& z)P3y)!)!@MMry^?a7LL=4x5OxD1Xu6wCk!*?(YqPVn~uhfWO-I%@Z%lmI1f2#uyi_ zgsRL%={w2C=F9-@X0+r;|3e< z*y^Pk%@q_5e9gmEC4H8=vs(QpR7#%BhTeD!nKuR6hb2M>IX6=WlWZ+>Cc_@w!_rkJ zUL0otb28`B=`W2^END>lcX=8opBR}#wrYSpVYjTcq7?bg|me4q6kkU|4NXt^v}4Wwzk)LX-Vbkrs-o{_+4 z$me2Je=|#tOXa`$T_^lQ{H+?v2M2rxsWHFl^L*R0ub|Px5E6((J*KNPZItPqc^=lg zvh-nxrUDmRk8XmHtIw*ibx7+pP&@5M%^jwPaTg1dO3&=gp z5GI78JCBABm%=6Kseiff>yHp(e=c-})KFw_J7cec*f*8Z@V0cvxyaw4*_}{rSj|zJ zUydTOJwnQqw#Gi(H#4B9*;jdRHWyHgN^xEgS=3+g4PN1W`|0yRGdn3UaXs=Q!Di4$ zYV{u9=K_SazTaL>bHW=NB%?868P7!bsL@(rtEys#2dhjjD#p}BT>-?tVNj27eWgj2 zgNa5UYD9Zsmg;E~Hz@mHN-0!peV7cM!v?BkUB5HPmQMb5xOAFV+H>(tn_l!Qw-s^E z@8H*lydaF=G#M(amk;({$Z*V~{7p5iB(_MkxB8s=1Ta;PN+}>!GKhug8?ASXN(M}A zpwEPvn~e5zmff-(=+EwgVKQn=!_FexvoihERBmuf|JBj=cz7Sz@fg5H@5tbYW>J#Z zxMBygOAW@#4PzF;<`+?L=plKtRNDxbgj+6Y0t%NZ@s@VN@X(qj5Y!7SKBzBx-|@0D z>6-hFolB0ec=ig&B2%JG6B@9GgL-LAq+aKTU{ZRHMu)f{A1o1!CbG378~F{+Ff*-B z2wB&molZA}@XeMI;A;4|_T*g8$d?Y1@fX8PIlhs#%CY_$E`V@m8sZkHnPf|{=Z{Gw z%Zxxr1P1p4QM0POj5Z7JvwvhXMD}pBgwo5(V)+}c%?Pas|3sT&B`w4?(8FW|uhpG6 zJKiX-G`|>|gXi++qmRr5yG`cGr|gqfy0WnT=`t}FG#7!HQE&^|qlAL0*!Vn=yumk8 zSKz0SJ;4`{(w;X*f9qzc0*{WoHjr5y=5=<9qv#j5SZ;V9G1~=L+rruKimJ|lzdW%y?dUP zHff#3$sJE>>=Z2EyTN*GHP1YrzVv6t^SkdwEl9DE`RJ^9;4Dh&3Rv>2~XbpQjtL|j7N0JPwii^)Erqr@_b;KJrC?-m3P8B1-v+F zCVNO$Qcu&DRjZW%#O~D`e*b*SfG%W6sg&$~G2qBUWv^QE$RrZ`Twu`oQAc+CJXV}> zYCD0sf2atKa#^KX&J(i0BwLIUxta{Y;Z7xjL8+zEVf`+9=T1t8Y*sR2Y22(8!j*2V zuWq7?e%Q_SZ$d-%8Ezul%pDZvxMyewPzH~;WA|T+oKh?>z|MKh&!xlSDfq8B`SL>Y zlRYF|Gfr|u#AHlABVpw&*2EXRJJ=ACrv1dk@YAb;V((F7Of{NwHs?~8MFlbZIZP8@ zjX)EqAmnTe8g1m1l6rdScn68tG43+XQ$5!D(rP&rBHTb@s<)^2{WN*P?w8w#xkgO+ zI6rUCyNd(#`0X4aM8_eqp6bT zUPyb`o^}2)g@J-a2Qy(ZBV}aIal08YHTnpTV^N77ObO`Qe+9uFPb~2`J!IK^4R^w% z3z1q-$D?N7Rl$b8=PU2=#zra#?&^8eoyCBh%nxV z_a;e54TSNY5i}D^XDf^1t2Q0|g_P2oPhWzYBnCbmHN3r(A~oQ8UwzFNWm)_L*TNw= znOxO(06n!#smqvvO|l@gMUxM2j3$zKW7Q=P3rNVTBq1Prk@__?|i1*Z3 zd1UBW;Cli0IiCqvx+%S&v`7+om`p3ti3qX3#*p)1pDp&+{pC*LpWgHE+4EoYd#9cF z7zUr9heG%Y$kAK5XF1iT&FLrFp z&JwQ1`3X_T$U2Lw68I%;grkN)rov-*2~_k zB{=89y&|J1_6f|lb|iha6NCMwX0za7QXPb)PFZYeRUVBhm&%iQGh(2U!6wzM&JDVP z!0gb=-m7d-mGJ0TS$f>+d<4|sG%05}LpCy5B(PgHfKXn!$$H}c+DH4o4@D*fdzEv^ zO-b0rqr9C`I;Sc4>pihZblmvg1J4P;cEouP_~^hf8?%bD?5psgMbqK9&0Det2O>%T zO(7;*<|J6$*jWlEs)LbQ@yVI3blSrZ0?8)p0il8@rZKl6F_mWl%Htj09eFAqw8S6Bedd0;bH9EoGAGY0-5s&uTg;sTmULB5l6rIS0pfimky?gJV z4rCD}rM~n~aon1@>Mhd$aMc2R8*5n9SgjK5op(a{S*SNqmC{Idt_8)tivtzMqzpLl zPXKxcQJ#hr9DJk5ONN%x!20|1<;OlmkZlrHeI9n}uZLf2n{J0pe*qs*9+u28Q>itM zY$jD^JamFi`PRR(hct@~=MTt%mMC}JN{!c!z_-g72a_2vM(<^yS6@XTABmC&6;gV1&=Spl3Pdn@SCDh~^QXS^D%qONxY? zkQsBFRn1Ua9x{LaEsiq^s$MH7NO2&mJ^{19tki7{9INQD;Y6GBA{^YfLTo!!Y8o-d}@&u**LPvagwiK2x9;T z-IJpGS+@JwOK#p0%hHNe}I#lkrmt`U^l2UhQG8t3YIA7JqNlDrksx<6{&_14~aJJ00z_@-Qr@ z>H@dqA}3_73+L2?M%7lCAs$h8p9t0_e%dCRM0Jjc8Uwv9&vBcM#fjrSoqksuB^67# zr}8yZIGB_fr1+B6nREBxYbSD+l^mvAeN;vX4FBXEUx>Y!c25kO#hhm_f#@4NQwRA7AmT}fH+!s6sv%rgrQ58Qrk=Z zK@$N3w-E^!Z6l-VnY>FB4QNk1jgiifryHAMu>5^LxlyQ%nU6PjfNkUPgtheH+JIbI zfoJ?Oi69X(r#I)?9H{+tX&gG9T_DaXMe6Lp)h=nt{A$fEGPG!niN2hKFFJ;vqpecU zGkHQruAp7Ex0yKxR+FxXcrZI-#*!nY6o3n}`b!`hLAB3pmVQ#-g&+Nz&1;dI;=n5N zQJX7H4bpDyBlNoRzyO*k)lQ?4nyhECQpYyM-+^h>UE(h#d8(!a-3FV;WccKqX~{cQ zfvhqn?qhc1by~||4Sc4pi5S7FO-hI*r3bXIou6j=Mc|Y_a(I|eJt25pOT;pOR_G9x z;w-k`Um|&Umt&k-bTcdsXY#QPOR~anyEL(8?u?giCn$Jo3|9$}V?N=d<4is_04nvc z;O89&TJnOU@R91j5cCZkgVxdrq|gv?ulh_~H<^z>$Nour|8@VFiQOoOhF4yR#v zhnUEZM_VgVANCqGCZu}y)6>+Bx(;r#*M>SbQKptMk4vr-%5FJ@nTn((mLn}<5aJ_(YpFv15IY+1NuA^GKe^>};&TYzaF?<@ zTDrbPGW(>%?4VJTO|zv+)Nbt25VR=Ewmk~I)9RwDQfn0mFjeNVmprIX{pEN1JOf!- zIg02M&J5nBipyD*On!!BYX0ce;j0#ao||{aLe*7F)SZY1jet!JZJ%!H^82^_Iv67i zyLLSkiZ%ovZCk>%)R6x{m|d(MK^(|~ORhw0lQC8=3dF;;@i(rz z{=Xgi)#cW28uOi0gfOt_;~GYxDi&P#z6x6Qk7GBXpc)1hN`Mot0uRf$@t(;u>%%fK zenJ<~sv)UB(N#pFH6n_knu4M?&8Az;S=6-=K-c{;RFWdT2JCpD6)mi^pBIb<}+U%gR4^Ci+5U2@}!xtfU2X<~|gAd-*QI<(|` zQzAF#(t{74qFc>czC$n(*#2Lv;jlP49wx$Ds|tols4(`=;-4r&fS0JrqZb8c5|zAK!)kK{6k-L&Wo2c$!luV@=11cxhx1Gx47GA8!eI8Y0BHL&hpx zD@8Ipsl;!H;iFlU-lYkBgnV%ZQI>t)2P&6`cvLzofSLA>6v+Ob}#822&tfkAz;c`;(bw z4BHvY`{jy!Ch$K;eb0fY9?>6WCxqv}J$ zG1bFk(==t%yJ9*RlUC&DfJUqj{{r}5wluLOrvE9HQEce0`F`IT>5`IiCD1`zK@_6B zo6g~JyV{?`vlZ}cA|{9cT^%(b1tidBTBje8(1{nuTRgfqr61oEC+r=Js2OUPBw>&K zBf(cS(TOVk9p$O5+SoKUUMQ|3`|E7TnB-hs*-@bkvmI?;jEO8j)LU)($RcI&M#MO& zu)4S{(=?{~`1DVt0z1LPZwwI)%6w}tBN5%1iAvD#`rDu*GF?>dtH zr;-APimHt3u3EzMLC^aRir8h)`esbbr9@m`F0cG?vl%!&aB!dfSIm~bK_eKQBE%_q z1jyxBQ!yp`kZE@Q8x=(3N+kzv zE_xB1Ht_elg}CPBA{sBbqJxU+3vG?Q7Rj4lvJsuKDhWOZU@v8`3B>44l>J)&20E5& zuYx3dL_@eCU1#*{Asd4!SQhj!YS@DxsqFYfcLf9a5G4?b;L&Zj*UZ={al&w3X19My zRYp_4Y&h_UYifEZs2_-rsOME&^e3MEap<}i)|ZYTD#yt)TyFj^cxL=0<|FI)o{pz; zXa9F{*6wGw_NvT+crjMwiL^#^U(!vm8zBaSe6@UMj=OqvParHLjnC+pBU$xv^)mmM zMH@-Nl&NE~(A6==o^ULa3VDs9Zj_`h;=NdoPjdYLZwOn$d9s`QyHufA=jLPJgGcQd z_T?IfFU)S_)W=SSZ#CTy$I4bKrX^>--DI`{9P{dn7a(v!i>2LwKbpZ}kM0jicpdH& zK3X=tPuI|B)h+Jy?++>YaqgmBlrRk1-^+S}e^rV$B4{M@ATB35&$u4>kSS4TViok$F@w&D`o?~ozlr?`?c+>{`i4Z7wnJ^Rf?(lI*ZISRq z*x8nB<1Q;07M7kYj7n*SX)_xxt}}O@+Mx@(NHsIVIo#nQ+@XD2IhG19`b-sdx5rZ! zEG9@j5i>{1;3Yv3_;TI0Uo!g3VOV9hGK&4Ipy<7YrgT;kZ_%&&`Y(W#Q&OH`JtcqY zYPbT_UTGR54N)1a>Yu7yuv{q`+NvASaZu|wRM5ms`WJKuo4NHtK_NTJwvRHL%%2GW zJ(DKAu?yu;!VJtBNgViZ9V6i|V?Mf)OYrK(D7L#Bv?veXb-*MojjqBRV-J24sz2Dm zd5eBJER{NkG!{lCF0~?{dkktBDY^;z#OhT&%xE+p9E>*pJqK}J@R~qaI1I3d zfpGKio(RbH64JW|=4uKL5j&T%kz=P;PMn-B6~f z!3m*x0#^GI%Z!((l~b0%=xdhtVd*YKZG0KKqY&}ao*rd{oyW{TJ8=7B6*bn8P-*gl zfQGA~8SC*u8;BHEfBed(6P+l?sktb~F0Y5G5ug2pDoB%3XlY?6%fe5r!ZyDI1{0a94VDg}}j=x{|j2#bb8Dewqw!|^sMeK!v4XNz1T2N54>XI}xvJGahGg=-lem6QI+Z(4Qpbs26wGd$$eJbo%oUyjd~dQtkx z6AOP#N$|Yy-kIma7Mep!Hn9W(5f>t`MK1vsuX_3i?Y#vQS~FO48D8G{;q|`J^fI;h z?V+I?Ic{b)Rp)09i>9!>Frj6)CfBBs63^wtqWNl?X@vN>c(l!RYoD{vd0f{MtrXl* z+a^7&HEcBn8nUc)=d;i)R!_MYXmSX-X+VcsuRLyPK)Ey@?daWE>Zi^bTmKEy0t7!u zmJ8C#g4LjS4&XFB4TnKvEQRmb_TsG%f+Aeh&De_7129eq)}0ODmmmkWOtM-r&U7}) zS!nUF`m)6L@M3j=P70eS>8YL=5}z>mFf86Hf=I`H6{$d?5w`4Hcw^1E!PC1dsMRJH zR&(`R3Hlhuy>M5Y)jKf+OxLBj$#_}J>-}o=(qj8&lI4_ zpBTwRkPaLyHQ^tiJn;;#h^RhdgpyXDzW_Tv1*wj>*k=c1b*OxKzTMXyYxM#ui$JSR)!TVM+@x-BQQ}CsCi_qwS}Pl) z8t0ZY0DkPA&aVA1aekgPtPr#fC3UfgdA$l7|KzrdYO^`~8tqOhNUD3_p{tBIi3v{Z zq@~j!3Z! z?ekA|Ajw75!MVv1T_r0JTy3~21SgaC?$UvQ8zpAH^Rrvph}jP7wbcpwyupoL%Ah^F zmKJ9;zC)9E0_RmSQd?Rd z{ZElVdRd5j5BF9+AMmdSQW?X>aWA)QS7#m7t+Y*(HF?A-WJ5J7gSo0EXK^bfyTfkx zG@mv*vyQ5ET6}THLBoozT;X9!tI^^r0}ut62YpR9<+x~kp+*+J&0Tq=(X~rIesbK` zx^@(St==i0EL^T%c6KkvpCf)Nltr~S!ja{yuy$8e^}n?6Z%f^gC~FJ|>;JuisC zP{KZTZW~z3_{pfRP)bent~=<$<8hj%*lLWJRv;7y`lzkvzNW70>V+u4KJ-=BIpNr# zEIrNTMTeTou{Os$gz9VZb)!xCP$f!g?_3w_+*}E!Hvg+0vd#xnH-krehQJ{zt!BFV zOSZwK#M1Sm*XoNKFLWs9U*I(Ho9EnWY}404k(dmw`5Xo=3Q^4Y5_leHDO7P~s6JeD z``YzxN@Xh&rF!oqNEhxsdP3E&C;`76<{r^8q7zjlGKBUA4O%H07vaLe1gK)dtZ%Bb_DJMA3Fswrm; zBlN?=z0ytv9ezfwpa|7Hd^na6(vA~)-{$1=y=8n+wYG^-Hn16P$y#&?G(u}1`XQ65 zKNItOOcs2ku@k(kaB1itAP1^yaJj#^t;TIlr3+ChOm`gRq#?3X=Q{!y9LL9SgeUOD zG{8l;F%H@DRq)a^0=hR_bzAfTGjTtpP>eggQ00*=tvOpss6Q#K8+?8Be#fLmCCK_I zn7sUd3UU4eW{4cnZOQyBpvQkc%>UIQ+QQb@#QkR`m9C-sPlA5AD%7vvlQeP@4CAu2 zW0Ny92$C}LDw4F~n5yL}k~HHpDu3n|Mhb<-GHKAmJoqz)$lKWVmrnFjHItLn{gr5x z3Cw~17k52P5`8C04FvQ64GhHhU;VcKbsh7c8@@{)E4K~y#1pq~n6@~MzpiiOhfLTS zbTvg(JRJ=vafcc0W+pX5w!)UNE5=#ITJtUM*`H0@*WK^1$7vgtAc7!dqo&e;8nQj9 zY6@VqN|=yJ;oU=dGlgsbcowDi_eFHv0>T&X!9uui*PhwKGnI?dbm|3dY-u&RlUsI6 zF5g}A{ES&6={3p3UEQbg-tfkG=e@JysAv7Hj{5Y;-(}(9w1#hjGrnkE-RU~=D=~xd zI=JZEnU7D-*gZ$Cl)~dJC!;!%ZTb70gCrDGVd#|y}DtB~x7e7;9v8&-A= zWHG>$E$)Nqe#1nBxCq2%NKG1(3m$lYC4ujAKOo=Ko+);SAfZ(6H)AH*)P)1I#!)*8 zh(G0@7jt(%O~eaj7ZSe>190=4A`}KTf@P1CI4%MQJ+7c$K9#=Xxw_o8jBvZB^0+Um zwm8Br3B1-A5?@g&W$OGW1m()ZX;CpSZutwHDXj$-oVr42?SA267+d3oNR88D-2^{E z_p!Xig43@|*AK$JP~SCsSv(Z^4e^;3b@TF~4;lBsJ~3E>V(}S+wnUZCrwZf%=-x^& z-yK%k}^%XiZGrVi>f9 z#cVH;!nTCk-zA^}*L$lM`I78cAx7(ve5*ywKKc%ScAS}gEVLV4G=EQy`7e6v4c1G0a~&nl!j4XdYUym3E%D9_S0aGze~HrZr1x%&)XeY)=9)VxI{!* zeqZ8#*S24mogX>r&pp)beso~q-n&A=KEbgtb( z8zyR5eWCE~VZC}L?X3+ijt(LrA28nj&)LNB!6m4(Q$$MncBM*94wJy^peP=vpcb3- zPBVhp>Oht_hX;;(Wq5CM>6p$e<8v1$I`x!&L`kTW9+*_nERT)JERvLDUSqU3N@d>^ zTRx~y>wCD8p#Ls7!_Bhb-Bye~7D0&?NC#&vo}m^FuKg<(&Rn%@G*GmbExMt#Oft!_ z3meVIIt$7ah7-d-KX)GUGV=WEDfrbXVQUz`%CC_V$vQ%J{L3aGb>!Y~D?x&eU-W(R z1sQgBJ-8K~MlwfxUIHJt$vz44(+%lHzN9+gk$Sb~U}Y&#>h`%LXvGuU;6tW4&9UrP1b=K|X9)bDMyGE+L=C7+e_o6)(vr)}=i~0I7e^`>63b3TOfKq5rT3(4poS z!M^+)5f7kt9}M|nfuK(~#?pL%mJR9dZ2E#3B`|~)CoPphjX-%3*15I97($KPddxgOb;H1sK19kXyqwpsp@xcK$%dj&}_9~~On zEiz&X3v3j0)xBk=3s!?IZn1U56~rhqZ*a?N{GAR;&QAqt{Kx`^2ORt|FE400;MeCL z*}j92E=CMq9Gnb^g^YFbK#*Y=&~{m(z2#I8b4*gV%Ioj6oxHhC}9*|F@$)cZCD{KCqD@EvSHZ!0akQ*H#8LCVNAUBzS2 z*;&1avI)amgGi`;ZvH*=wPn>Jv=5=M1-YU|1udx^x8=*_pobO*>aw>8xTWpW)X)udS)gqfrPCNS1R*PxXy-XyE@lBOnjB2kjO^NQD zzxK~u2((8+7>blvMHy?fg2zc8FIXHM0(Li%Prz_GDa88Z#&~%RF!5AjpwFYY8Gbg) zMd6tbP&xya$H0M+rr7QCzgc7mi%*9gNbKh1gN`QCjn)nTN&-+F9GrMJwWcbH{a+nkvDEN=<$Sq`S4!M zuq6}T3-V-Wq5lx&P_o12Pm3TBjzIp(8@CjZ71KXe2FG%aH^Q4dCFB%~=>xekJrnwu zWWnfjx{FcTTX*wK+wbLtz`~G;8cXu6{ z+fiB&!^jnOMZ1s!3tK{wW8J=wCQG5{ubM=~R0LwKJo};;!WXYg(uzrKLJ>o45>zV^ zfem9FHhxU#C@&2n%@{nPQ&{566|p;hIfxjz`-W-Q_9bN2_Ey_) ztWHd6#V4c-4dOfl;uJ7V2Dy&EYT}Ce;O2De(F{oikTawCbqoDD78kJcMMiQN^cm1 z#yAU`%mW|)7N|pyU-(;)iF*)OQ5IjEi|Y&{%=zto^qH{;>&5>VwSno4It}&4)Qmp1 zc(o)7lu#xh7QZoAU%w24sST*!Xw3T`{N{7~5TPCwW?BS_L?w`NeUxq_kDOQ7J(`in z&1o94r{ua^>>n+~deUU5-oiGCQfb-^hsxFY3ImamP{ZRn$Ep@^V<6Gdmq79@a82Xr zbCCOjJaUPx5N}XQi*(3g{3!_GIF$%27>=Zm!DvrJ*Z_OJXKT1IQ{bC6LBClqw=)V% zx)yMLb=?E?6|fs54^L46c~Nw`#%&mgr~S4Oc0_aeDuS6q}p?`x2t(Zta_ z2q7_Sf~Ho`#xU9(eHt;hw_~xO6e5(e?3V$QqZ7Kz{qV0z-hMUu=LX$#r1k0Tq#$9X3HuD;{MC!yRm&3B%{4?7m<$o`7xkBt=Kh{6 z_?(*yK$KgLzm{^2aBv{rx)TfAjpvaO3lP(Z`4pjQS5kX zWp5>n`J*1C5${CIF9G%~M|xd;QDiB)2g}`@_wQG14#G$|!9~BuewO!68X0)fGF(^= zS+x$1LI7Z@ujaHz#5ZDtF9ikz1Svp{KO>awXxeU#jnWQBTOd%Lb{98DATHjV=2ah*&+ZSfzN`9gGb}8YI{_A?ZmMRU$+p6Iu(wA77g-@)kr(Uhjky&f5N>FSvNI^wv) z&~1yK!Yvye!+NV%Why92s4bl8zPGBQZ%5la$9l zKW}yt4Ur9{a#*B;jo3!N2?ytRn=J;UqJ?7+r&^)6I+_?Gb%c&rkAnV>ok{Njni^dQ$UIP+i9RUG7| z8LDfP3k=i0zZkeeJ^6&NQu4bTF#(mdL59fs117ADGdAb1%3Va`E|al#GDqv``b2&< zPod+V>w2_vaelo+fcE>pn{vGjp%nmS#`|g6pV#FY7P%#E7BvKLO!t)9Kwgr{o9qU@ zxR=7g!$gv(OTm~7Yy6LmK7^l8E$%6T6Zk-10yU(Ou8b*chc0L zo3CdV5{a?U0++~iA6c*^_8%;FQ)4PCg2sbh&~%t`6>NFP&7@W(2)#10TwnoA(c4gPgE} zLs%))F%y@-s$tCqA{QD9oaars5 z&QMC1rSHQ?59j@&{~oV01oTtgcNG8#;T3vqq&;U_F;I_G)?dvflOj7FPaT^qL#mww z<{eV$Z4L^mfZ*<2>46TH`~VsN?%ieuci)pix@Ph*I;VK-;~nd7B1T>bQq9X)wj` z&K^Q`i0eBosB<8ctk`q@l#tkZ1Ogb(9%4QIte#YbRm>sL&oD|=q%YVpZ|_fsd2fai zcN#-uNUg2nacr~ZxC_%Idn4qEwj?yJ_vnOFmA_@gh-~I^`&+=6 zTm0f(D=Cv!bFb}~E~s|MPXYw)mMsfAJ9v8f4@h0~CD$?WNWVwhdYyG0Ms9{s8bh~` zf<;55XWAIUFg;61z|i?!nQWS%Nl%;a(iBPOp4+JH54mlu*-Sl&LVLN)_b>*gKV!RD z#8l++cHEi!&9No&!t<`6lq?kf^&od`I&jqFCXRa44P?rDa@;IErmXUd$Y@2SG0y<9 z3q%3zq`Tf^R%-tC+Ex?o$@1)JK}qe;gP@K0q?I5-02$7DUyi&fCTn& z*JhneR0bKtdu~l^N=*N0*!-S5-S)$G`F(12S1L)I#4u%cp*~|g3fG_MC*z^7nhkX_ zSruD3^15JyZgLdD*czsT&0;->UGI+d&A7iKwHwrsUr?_QEK_9xgxC5=b@`fYcEOx8 z?Xbsq<4k3vmHc?M^C#x6BRM(q_wWu~80wbVPr(hSLUCZWC|~pqKPjqgzTLhTy-14E zmO|y8^$P`5V`SYu@pd7`B@bsXGiTcMQ?fJz(RQw$9<3g2)hbqVEgr)(R%~aMi$ovk z6q*|_JUSxlERw>y)$?12pns(o9r4UGCPf`(PuUbwA>4&kjRGtQw@lGU?{4R|Ri4Q@ z#;P%nEVn9Qx7T9*CWMDyS=i3!*6;%8rQ-P!;PKE|k!F=majosTEkhfgr>+sFQBK0l zz*i2S@Xe_`NGmO1o#gAX6P6}h{?lN@tIj>O!s^7@P|%Tp2tC)-f|9YVSZl@?qrVSk zO-j<;ia3@?)^6C{uhCE{W>l*GmG0J>HN@fgFl>`6gJZkPJ>`9eBQ&s0D@Q+dDC(j< zP>sucMq3tJmX9nEdZB|Bv{4mCy0VYxC9+k@z%2_F7`jaL#Ue+?>P`u7l@jW-K}gyf zZi+@)1RKlCLqfNSEkSwRipQwDz(m`whd$Chk;`HXS_#>btq3OJB~<)`X`1<>Ho*xf zhNHKsPKs^EM%L*+B)kO!LMU8p+in+X$Bih6%hqze5@3I<~#n6zF$;t5^+Vt!j zKCr?0gvrH6o8!P=>Okwn8?jC*E`wpWGCW*C2J8z#u$7O(ucOi0!?wAqwKZ$CF*=#* zX`sZ<4z(iWG8#=rbrE}|kd@(sSGVe`G-VAR!sE*(9PzZ;tW&?+5_P?4l_TTgPCkt?Cwp82XWhk=^i) zBXR1aLIXyj$4~;t;f3%`pySYC{j#7YBm`yni>o+@_gOtZ<FRmjibPi&jZ|F}?U_ z!`2DVsB97+&-~IBly!{KqHii@oTQ|1)CKp!9b;Pe^6hhu=!7jg9zw_WA3UrneGSX6 z0BF!wDg6vBoF>Mzh8WgE?h00QXE3~201)Q*jZxXx+W2ZfXn znpRZO_jlMy&N5@e9Hlx1?n1aV9sNZC!98O|q~Jy+6w?T`NMTzQx+v<0e5J+fQdwS3 z?MX{m)cHzZ#g5ccC--OjvYBB#8?UI0*l^GCVYNq}gBpBY{O@g+Ng1B>&)kw(FM9Y< z0;$d1T-F8JRCLL{fyU@^-^ld zaqpiJALBoYaIHY`>yR+aLi)w|{)IO88s1^1XVyX4G5&D&0#IJ*ec-Kie6u=jYJo}! z$i}rAtJ)=NiD4YAB|x`ZWQEc?m8c$tHF@0AV0;e*l?WhM{3=wD;p0;B0(1`E z%Rs7`Iqe;$>6F+e;|PR_69jAsFvBnYn0(VXU#CF9|4qeMPf7Ky$&!+|z$07aP?8>Q z<7(t2Jp1?ULwuYe!r-YD)Kk>^!%RV)9RecP3-Up+g|1bLtdb*IzN9@)AgVj|ZaRmH zbN2?ib-Ni+omH->w1Gi9mxFxPx@xqqP;#z|_{_{Ak7h<9(tVQGk1i&o9$M2`X@MV( zDyylJvz~D{hiVWt(MA10f9_ifRX1Z^;t_4-lLZt^cDw4P*z4>1#K6sUFdo@l&}GB* z)KaD5wC((l8t!t5V+AZnWdOHyF)Z|(W@TnR5(!X_zr4j8Ajhd2EODG>T6Oz{Eva~M zX_`%$qb`$b)mlZcnKF7R8gZ1Ct)c(kJBvueb%f~a)Q42o8QVR}io=1XWfyxh8KP0$ z{e%2UVjh18Ue;}t!;xIL zVS5!ool*vsI@fzM5&GPa$>Zh3t;)rbA~L?>mD5ixrN;xn@^1ZEMUbvvUSXQ@?|pEc zBd+NF)a=$bY!rTuOn^3sUl~w(j@2U~sKV)eCQ%x@nqRvVx)15-fd0zV|l$dBsqm;9nK(r{9z4U{ge9Q z=y?St)V@qeXqPb zJ!TJKcM0rjB5!CTLEpnI!5f6l$1BJm%6wIlIcnNEvnJH&mXuoB-*|i3QHH{c7>~)zVvpF$T&^7W@{jjq7#QOcVX~Q zeXM6psfsH6o0i>9FwO&YVbHtUyz2`h=q3nY9J-xO*kHcavIr4nZkZ6n_bby~7nI>zp&{(WD_XHf7?}iXM zb=mRD_?ti=pTcM1#ui!qy0r9tv}8~(CS~(%)za&^K_pJm42yR?DUCD?rdw$1tjKJfHOZ_jMVMh3KPiGul5lwr=oOD*85D zDFM_Mcu#cnJ|V3tmNS=;9c}0axFJ%EP*6XBBt=2gGz`7oVQF!;mgKX`ys$ZV_crW^ zB$FD~w;3cg#=duU9uviyVw%h#RUml+s2-fCwxF1n=?-nR_EHS zIb`3zf^C_ds!=t*N~m68u=g7H?LIoaQ;r5pQX*~*-dr9IQp3)_o6tFua$}af%^81g z{IW_GK;iNKO7ryvz6_#f!C#Z+eeUWVCf~Bg@bETkn11Kgk2rMQ86Ms5q4Im3Sv++7 z&V)Wz&l~Za?7s;LR-XQ}Vb3b`g%?J>UllAIIsanAk}u7#b!&gf{lTtCO^5p^rrNwYDIFmIrJh~l`+v{Upduu78LwdE-) zg_~5`g8W;XC#%sCf}vfXi@Hiytc&`b#fNS4Y|%SY)Vh8?D!*Yz&UeR+MC9-6G)ASL*Cs=#lec)o6X# zw)ron-Q9n^$)1CcW_LB>_VwU)9ezr)TM26&i&DXFUrbf;cU|+fUOiiRuoAAeVz5~c zb0wRe2<@Wf@04iN%9TkWRCI^gBL#-DdAe4hdesHB-ItQJV%4HgTrIG${C?@*4!)Lq zOnf_7kEHZGSoBjK)`hfF*KbxhoNJ8nuk4zjkCns&o>arjYYK;G1q$c?kf+uIUUUpKtoi5W2)AD!2>O<8&oSRWz}DvC84z~#m>0*deU9y zYQ)6Qhn+GF@r7bO+A$3ackRWp*{J3LHr)7fyw6x8U^V*?W06ffV<(bQ>9S=XC#Xs zh6a04GYDn!Xeun+XeeHV9K{YBK8*x_U{^;p{c(bC6GX4h=;_sN0MbUz3DmlaRP>uG zNUuc$q%<*i*G|djx^OMNctywdd3G_5@2u-N30Ih2+ zVgcx39yZsT6RUe&YN$7TU}I_yi)v`@nVb!*6>{^xOb@kTb;RxXIhJda|`zV zn|RRCiH)#SOgWMWdjN+N=XvdvMpB{3!2Px_7VN0`lP{@qoTU89j%OUbCzjlUZhA|s zSyyMCeXre$Gn(?suXH&L|2dr36TJXaJaa;v)nLh5q-P0HpD}E}Yqx^5WP;TI zNLghbg%wcwnr{uYCSU(|P9*Iw`t;$P;sQb=hqmf!RbBf-{CZ=?$Az(`qYl_B+t9k* z@Jxx5yX8ntJbwWu{j#4lckFy;{}ed%4|m(%tA=LAcg_L%Po0pW;6H2V>AAMfucf;3 z-^ux|Wku8aJO#n?lwBom!g4!-`kSgiPrNrfry}1gqlwS*{2wOwp=JHG+eDR~q!2&y zPRZMYKBAc?=9*JuW1V^Rmz;+YU-t`+l>S;ZsS_OF^Wv^_i+RP4tc_3$I5A9ejA3fp z$?gH~Ab_Et_ubz#%y>TO{GXRl?KGyiG8TQ$p`Cln&oC&hU6x!O^eVgh>id7`5GZ6M z&yQ_^zpNf*L{qr$?kRgKQF=XhHF~03BHYL=u%dNxtZOow8m>$`tI@39_7 z@N23p)tPqNhg1o*Q6jmp4ZE^@BwurP9n6YWIaaqo`bzWkdj24E0_bk;D7@B|+{V1G zS#^+TVdrF+>^OgXKkG%d(Pr5Q^|T17a}utw&ek#W!pXaN{r#@k%YeIRQA;8wT$wNt zMn2Y??s-q=j@>jQ9vn8+Z&VC}#S(NKvi2Y}k9Z-;d@viXds>N_ZqUkn|FO| zGi>5voct@Fi3_fdw1M~s=CTgnx;|`7X-Vu`Y4zjA@0EI!o0wrlw9bk-Ce+*5`~UQh{87fjx?Ud~Ywbkh5{1{sru0kL2H&hE zRhL;km2c9718maV8#pPF>D;X>$x`OO(sKhRk!+$~v6*R|Pq_{b;y08z)n(kH5MQ={-Z|g~G+Ae7^U@ zr-|U6I#~;6b#>t$G+^nRob-g{&Pr4MYum6y9#u_Dw*iKo-Dv7;;1mS{K-g;wxN{=d zB97cmZkgGf7NclmC3Gh-_&ht0DnD^icF%*;#evdu0q42f>;}R(V;lJ=QyVQpocU8I zKg%VyGp5^m)iQ^ja%(c?B}p|n_0v)23u%F+4TA*tKgF(GBTKHO~Bd(XycKJ zThG|hhVCX$4G-Hy$*0b@$m=_xqAk8pdoqWof}@j#Bz9+@g3C@tYl|=tpgxC82_O{Qr- zGE^Pr`yi^@_l=hSb-ss8MlEvV26ocsm{yR3-3o*qMQ4HTbUfcgl|6cRk2VOi+3eJr zoM)T5IaU~gWx3$tkKO$C9|JarpYXE6uM4=_JVtQolY@CO3Entxo?}@O5PUomon&X; zI!nR|n}+qu=_%B`RCnhYNw#hIzaHP~?P!%1@WNKl+m`v=Sgnql5w@34?#;V09}2KO z*&((f6)))99J$8u>2-dou!a^*by77)61%_tqO%uDCQXE8m+rKzM`uE9ATzvgw*5Qp zZ+PShBHQsqI!n)`dDH8rhc#-hPb{w;0H>jJYg$E7qIMCh2DU@co-0i|qCFQCx48@& z`NGG>FhHs9S8G=Wbo?8Rc%8K05JmIT>>H-Ei6MqX!_T3!8SxtO2wKk!s`gD!?n1)sMgE|M}u zt$Mx6-iGf1;jL~3uX)RPJ$)aoZr`VO%YaRf011RykyK8n0a*Dvefter@J$EWde%OB zRvR~_e{5ZqnDFBO+t9?`pBPRqP))Gl;43S0bHPI5db3*+f> z@ZL9gn!!h2^4GEW;3H#l^^1&}UiNGdtYhSs>(gwOd=ZPZw2F%BuyMr&_hykg z1_<}eEB*#8dzV;q?bkZG`}0M)3XjAXsAt>S^FedM(wW`vmn_KTBas?iz(ry+yT3cG z{1vKZwU|(}>Ftk1xF}0g{R>*Ur9nEsmI^1E^Y$@iE>MIok;kVCqa65>YSsTM`lo8qF-ItIYwpU&Qh< z})ch;+z$|q){zHo8aJC#XDHkhfowLgl@i*E=KlnS_2> z$yw!l_av3Wp>RH!sP_^-zf5x=bHSc}My6B~u0#^eEBC?iM!FUH{3JytAumWC0sOCkzfyCc=GM8@(xa_%i9l0tViMpF?3yVu1kJ&dWiEKos z*(WJ+l$LjOd4)_J#&)Q1M|%(69?!d`)XZm>r+)ii=P|TS2Jqie8PBUL5m_c~%j}<4 zQ5}9DmZrCaUW1dbSc`RZ5~E)vxm2`|Y%R}Tguqeb$aTHui`^urNu@z%A9B}I>X7m7)7^IQ1SzxA5Pag0ZL z%<+s$KXn!=4OS-^G*Aj+*bn1tu9;HmjQ?8}-Ku3_P;kT^j=k2UH~oDHN}BAM>f)3G zrg@#NOI6}5Nv69~Y^{(loeo4r!8HsntvtV2LIGPXfSUvslw|1R9* zv}nfgol*Bdw0aS?@PJ*M{rMR*^SVnK*Ea{9#Au6iaAiu+3hv~^)2ql|$ntDJbPn_h z?2YLe(b|>VN8BooCD$e}BGx4^B+AD>`h${{_sC5J&4=|5iV}G?p!X-mXZ)edhVS<3 zi>z-*p@`!Gd~!}-+;YMeDWnHB!P6y?)kX3h`Ar+Pg*ikE?Ca;J%SNTP)__J;S8qxD z=@!p0D4tVla><0JSAKq7Bhp@?%D{fOHf9x6R~Hg6e9X$I1Z=uES+hd3c8Ea*q7lNe z`Bt2`HCb0N-RKTt$s4ugi}Z*KVehNN3N|p|sBquhFta>UeZc&-8Oe{&Nlo-JQ^mvi zw;HOC&q+(xW;Uu(0-ro-kyfRsbph^!*>|kAQ1=j!b#~SV_x5OT&{eNHGV=DouAm`ZnT^B4fBl2e* z#V8Ub5E!-aOP+|Wm;9OIIS`->MN;kFIZNz_TxmJe(hO_D=cVC0v=#j7ArWvkIz88* zK;7wVp+G0LK$vnQuXc!@Pmqwvy+ZgXl}Uj=PB9F-T0sMt=Tb(Vk!^`4Zx5ZYp{bz= z8BUlQzybcP^3OU&r{w-uC>w|Ur-j>UXuq1GitD%1MDZMN#mz<5;-seIYjw5;^I3wl zEdaX0s{n6ODG%6Z^1@wqI&JM&r0@WjvEqAt4TkCq`I!U?JS;MBoXIw;DT#DQMIHL- zs)k5Y)e^vRCcvj@FQ+Nh#PU~G!!Rf*;DuxeQ7#;R6T!PhLkDAk^Yw=pi->;*_c{21NT0)>5?vV^xG@0>2u@_ zF%)$72HnVxsO9oZ+hoU<4bgWKyFweT&M>U{mY&e8@~3B(09uf$n$Czzr@Sjc8C#R> z-Sd@Cs*!)ij!1pd#qL$QF76Q9Ek$3=dQTGHCh*)KrKNDAN#`{!h{igFYBUdGsAzqu zoBI)21ve^=`Q}p$}nC1 z3j=5u#wZq(AC*P~+xRw%m9_pk%|5PmX2*eNq!*AmSrjuN3!wDwcR|GAqV9@B)6BTL z47?L8!7^b-o4waz;<_h@aL$2UI2V~kKUbQGHH%ay_KmRgNaZfRR1diHB7v=xP(071 zAORv)&WHldw1CpOZ@l4qV~k%Ik<6{u#XVOTLOyT?OBRoSfq2Rd03!wt424<5e9LS| zQa#J}*K<)Qk?vLK2K17W&VeZcd(;%D`?h zCE$&{hFLFXozs+6D^O5aa}Zr0*iw`*V!bro% z4OVlBo0Vh{%awS`WD09uuD=Az4@_ttUlk1HQcPcxS#74tW~X5Y^vNySy{^1 z4$3};BP;f-+e2tpY;@|t_kJfB}r}W z*rW)=^L~6*tmHXlly=Ac0f`M5YYj?u;#p-mR*tm+bs!FK@qjixH z=p6pbRE|$(ix5jE+?^z8fh&iMjLDKUy38vLd+6QjjMnc{kHQ&WdaL}UyfhNeMUnVp zrr`QOj4N@TA41ay;qr#`1jG z`J)S*`Snr^AMFfGRVG>ClwNX8l}kxf2L@`8i`g~LJ>=KHUPB%~;U*zmyJII*7ta>< zlT5*8x+%K!a+6jpH{Mc4#=86h?gay`Cc|BdQO8AaNX?M)v|-ujg+~`=^HedDNY)V< zZF29tL%*X4&Kt7L*!+(tT079)L2UMDehYf?ML19}$`iD&Cn90!GtVvWJAZKlYV;i1 z)0>TLq@1Yj?B2p>s;g63`6rE;`j3n>Ars8Ov_+yb%D8x%zHHI4XbFMKLCi&+nh+1o z74iaFH4@Y{rw{Mh%%-yLnQGqN>deh;-1&Vc-QW-FG63o^cGDEJ&5XK_9hGcVH@CsI z;%%M$!z^V#4z8wA2TDvmgeefHD6|}q0**#?mEMhv@0b$K9sBrhH1c6Ph4e6B4!O}`UB-~{5Opq_?{q(aJs0a zoUP@D#%$#6#h&|4x#}m1PU;2{e4bMrX@&A;CI!v&WR<=!z##~v%L{{HmB->j&Ux?(1gew80>8p3XnJZX|>g2 zo|kfk8XCl3eyWqa{GA~bb)x6ie@Ex$NYX2d=I)`)0P4SLs6-om%kfL9#H-+w%>9u- z>~z0wN3GX+T4Qd;+z-uPErZz3VYP+E#oQjGvB#7J@b>EBL9_X1Z~s|(@mU&uBhqxX z9CKHkX}XdCr+J0bKSwi*c9ThAQoXZi9$895ziF}D$g?g8dZBLMmeoHkHu`K_2>5(I z6!H04h7rSW6+O{!WYcU7^;miNFK5sEJ&nRD(HhXN)YAW5x|0p3ZmGwmYAWm(2Xq}H zV!Rbyr=PuThX$kGA~!HuD0O5pTl?JSaAgyA>GTDA8Pug*Q~07i_pH~%S#X7iJRWOD z7WW*}IbyS8?}n=eqWdspdD4O3K5IS(o^~P^gQz7AEQrcq>%Ty3Dj%N0T_`!Fc6K)Nr78zY5+4^G)%0r z^rJa}d4WjA@oqe)(sL+N7RN`6YtpGuM-MLMqE7}p2_Y72pKkUsg499=QL}4c;Uh&| z4k)aIKV$J{F=8F&9+C^dZvN#j^#f?ynR~h^9{)UPU>`XnK0m|vVLJJtxqQ4#W#{;< zSbXH@*H3xxz*=(a@trXGzUNRY>Cj>JgYx!+G45ki#|i#XcHTCxyyLuh7e%J5_p)Rh z7n#Nkx5w<6`%kPwMt!1r|8p|~^1`K|r%w=1D9)d7w6l31FQF@uQ4Mu-eK-fD+$F+R ztZ4Bp(3;oHzP4$1o}g+Od@@{A612Ri2)_8? zvAwT}{fYltJn)}F+H(~>x&WYmlpk;afPYM102h0E8)te$2M1?*M^{4|OBYK|Qz!cW zRJH#<3BmtM<3Ne(X6#=E1fNstQV%F4Ssilg^!!5|gmS1csXpN0|pv~kh z^iSq$kOwdizuCz(d88{HnB*XgKnb;&-cWnMxL8^ht&0P2VChBYZy6?O;$>ukAI{-w|Lo|<=|*7q-&=?Ug3!b0t~OVxrjmO>Asa+)AI;i_gXC6TH%GaX-I9f zX8k-D@C)MMNeTaFy2IWL-q-$3HPpWer~iLH-7X#u zrvJfKB4KW~ee^R6QhzXt3B1m{bKGjMj5i}-DOU(vx{O+{q)=N+(>kV5Nn3=md zS|_1Uy`nWsuHHt{=Cd;mFvC2XXlx+F5zpp0k9!OwNE)Te22C1e@w^G+xBOudA>Tqz zjw&Be>a%&>%lOk<&JSGchlYH-%C!t)2Z}^n=QE>6z*+pJ=d2s5PpUX8g3E#WFb1h% z_Q#iy{u3+!0RR35{r`9ah&vfNSp4s-GM42(%-2ho z-$=40RAYg~gd3f{C0o{zL=x?)U}p#+OEO1dxI(djQfqVM&u4GPE)1onW#e`0I#Ek; z2Ky~vm`qtyVf94hH1&r!OW_cgiTdu5-C7dct5V9vf z=T&%0^Ej+VPqw1JPr@RNhc*cd34iIk_?z}H?rOPCD}b%8rnnTeGxy^F|p8~q5S{ZYT^BsWO%UK|`FUwp<0e0qdjFhl=TtQ9e zyrOzJ3kp{z9#H5yDiAZQ!)pw7JvXE1*DSq(L%Bm|vyAM)-eP%`#cvLT^~qs+s* zi@+4}kF(`(^%58GrHU(LB&xJOFZz#O1+3v3>pO^f)76%_A0s&?E+rfXJAdY`AB_0Q zGsd89d?*K1^M6h?mzDLKks$u_WC;AJ%3)K zK;5Df1f|*Vm3He+_AIjTr9oozbV#_?w-Bc!rK$F?6SY7!U#xuQZnPawQv)<;e^ zw4ztmdS5jlJd|*33ktSdQfmMs3uw~FIW2~c$)LZ#IqU&28KUB}D>MOV8N7n7_e#v= z49rgOYM)rAR?+B(S4czv1xClaQ!ZKcO8?>G>^GPUg9X_^^<0Ct=E0>pGC!+kW~>l{ z^XSzUOSW$r7+>Dr1S*6Y3&@$*Sni{V;*2uO#V}{iB=2Q^QQ-?-r{hx^58KJvC+Ohs zyuET!LA%}%gbAl#xn?3*3ohP!yMcHqFSGgsQbO}08ml6`*Vp{?EI(50BgfEk21xBY zXpH^|{&*rnGEKf91XAte)G;+-x;Zg2(3%vl%&yq|twY@tsEf8H&9N18v-x5IYTv~h zrm3Skovo}jh6|?ek$P+eu`nk%aEcZSycW@3Y55{FtHcwvo0v%MTsc4>kHZTyuIuzB zU=G0v=aa6I@p}!Gzeeb>-h-Ve{(1|Be-$8M6f7{MQGbsG_>TlsF1?BdW&(8d4@>nv zG3a)qKcMJ5c_|SW5Dr0qtTZl?nN z>ssLj->G}kC4Oi5$6|_yG{o&FMT&nKk%qltu$i^YzP5*4pH$1!k11?tKp)rL*3&Wy z>F;(ZcKb?g_i{@dU!~Hx^GgUCO7!WyLtrijrHtI}WM4#-0Cqxq`I{5ZgWU-`kx*qh z*+`5xoTry1Xq0_@S0lC`4J5!zlSGX>SEc?Esi(+fE#n89!o+kN=mm5o8yvVSS>{ZY zq%@>HG6Sb=-4R9t64ZV}Wv54M@nzS-DD&f1I_nxz3Z#`U?T|xns`}R7UaM6<+A^+Z z++)Pg4DqWSl`i&T9bz_NEy+H7@$m$m&}9>!Svt08$muT7US|40VxciReSBP(oC3wT zN8a?)jR;cw(;9BM_u*Y6)tIGO*6L?6e`>)^6Uy&uRlM(6|6{%_QrpvwYOJTipsL)^ zBk1@o&-Y^B3n*W4A5Nv~N;;aNBBq};Omd`1rreYhwhCWn*fvA|NVQCAdei#dr|9LL zU!hC?9bf(PN#rWMJm8k2n+6@Z5``H}mK3Ig;DYJ!McmZ~x zYoED6=qz;sIus{b_)g%brUkJk@mMyP5Y-QRK8a_~rjRutVxFz8 zC2U+CKJRs)d%vY z?Q(ULl(m+elaX0+Jay3WEBVSVZf26==G6CQCz)4OH7Pbj>%A=9%$;YjIy^D*d?EI4)f#3^!Xc1gPEW@e#F(^KX`mNIW-r<37=H?QTD25l>h&)1+oQX*^5D35 zi4s9`N`r``>nY+ob#HYl*bibZK3wn>43a(l)@>TzKc!Q3|E3F|+(Jk4y*j^BxfVmr zpI7U73MPg4XC$)-ohB8C|L zKqh@07W;XWj z|5+sej~Z%G*H%7cL-C!fL)gi|Et}yg*2#*W&(Y;-V%|o#2n&Nz4yFx?vMov65*YaH z5l7!lGzOO{<3Z3q{W;&tHldyb@e~3jH+Pf~VoZ$Nl@MDQ3h58bM;eJX8#e|C8_a@D zl%gu58M1t6JD~nE^R|?}YbaLOAi?y|fFL=E&3NBVMDPhclAy#dl$N|bMyZ>}8;_7~ z>8oghX%^SgYd{myZi|)u$;CO#E=%SB6%A~9!Y)U3tY6=sw@xeW{KO(av5&sc^F%md zUv?I{n7ro=27m$%O-YYvQn6AzB6qC-ioQ}<0iwwd7KXo4+#+)TY#0L4rEe_bl^(GZ5+*{p2p>*V(9>j z0j>XYtE5H__M2Q9D;IW9ej{CZyfUb-=c@TG1QIIa`jo{i{>TYQ85Mo2K=$qZYgSARjb@^Wbw<<5t9?e7eu%ujJD1BjS&mSFV8ducJSpxtoU_p* z&|RR(mrIs9a~MB4{6Uk`#qxucduC{r&fA)Cx74Vg>}cuS{rxBTagZ0>``^NS*E~beBXX6Zdue4I2ca7j_cL0`?cbVK_0kVm`5vw4_k1HuN{b0Pqjb`+5 z{sYx8QMWK(0;g@3Z;5g#Mly#K!9X!cOahl!nFL}W%(QVjnlgzuJe^i2FeH+NmCydp z-H1lAh&jnc8%sTx>n*n1HmBB#eH;7$)DrKq0@mu z^o*GJW`mf;%EATGn&%2cpNdWX_yIi1h*`+}&IH7%++Ged?L6R{tWd`t%dG!Pra1RK z^_2$G_Wz>nouV}9+AZz0ZQHg{m8^7TrBP`=Y1_7K+qP}nww+m>@9wet`}W_X|J{8M z2XPc5MyyzCuIrxbp6UBY80dN9Qawm1uQsux5GK6z3#kvv{6mpv*onOacB>hGI=A+_?VQcxvCJm&H{na1bvr$W}s}HvJ zM5zLKJm}+A4O6*RFkdPac@XDOxHTwEp+(54wAtrC2$o3oWQ<_3UW*?F4p8$3%cVU? z=S?-yUE&k z{1Ims5CpoMho3PAdKw~NIDlXE=yVuleiT}w2c7A7d!3#ama*~M>a*7kNKqRKEx|t* zF}5_^uoqpGt_GSH>i(CJw()~SYw3GQmGF1P*WtRm%b<6b?@RBLun~7_rsr$Uw12;Y zsyMQ`z+1t!0lcT{zutaS?tARR#LYq#Kf<7-eC{2(@M6Z*C0hB62IW-TRjN1g%h9w? zQm)dX$i5qf39nmvyR`?u`A>1%n-r2fUJF#2KDw?ut{82-mMJAfeRcnw={Me2YgE~{ z7JrPE-d-87De$F*{P)%1pT2(z;6Rjw-^r8S(EnWk-M>xFqAm`0dIk<=)>iUnHbxd^ zRz|-at^QX^?&deMp8san*Q#*Hh^1)FM(watX3nulzldyS`*4LwWGE_$Yf0D5>K*Q{ zBkaxM8}{CO1{5!DU5+MF_o3x}m%?2T&A;6B7W#mYkfYjUMLn*mVnuPQXHxq6w#p!9 z9gDsC?*8uBrykPUk)hBYpNZb4PBmBSu>vAeL}OKx#Lj2TQuBAgkcwor39f1Ji#*6> zFLsRJ^b#^zqhe55s$w4M(Oo%6>4k^*9e6)B=r8SoZbw_SgCK%2e90Sdthzy3in8so z1KqWQ6`Yo18*6O5#FhNxys;DMm!5ozNo{rGpt~oK77}ktGM`u~)#@v-f>nQvGttm_ z>~1De?>WY4CRHD=?>sJAeRiXznp32ec{!LcjvAYrO>mP7fv@|teo#Aa%d!wNSRjRB z-ch2~d8d?=kLw8MpNg>UbJ?jPV>k_%fx8rUEcY#v*+3F8xCIa3m-`)*;UQT zx4d$)6~>e-O)QW7j?AUMRqeW5+MQecs-rLIKl0_V^qAA_-$0qfC^e$pj&p>P4>Y|V zt;=dMz?q1oXU_{u`SwE@;R%^-I`^K60j*#!OC-X{1Kcq32gU#aiFXA!*jD-u8gvP+ z!{=s*5^i83l$Q&b9FJ9>8ey+omkFF#i<~;fL%(K64Te|yN)a-qBxpV7AIS>LiiFDh z?-Yf((_@hAIRYP&_02E} zPs%BoFYp}BAb&|_6Os!nr1W6n?QKf!Zuk z9jk>6SCc5Oh^Yv?htcuqX&x32Q)zd4zZ)xk;+&wjePUle9k*qowCkTFk}mkyld2`0 z4WE4pz8A3ER%;r1+jy@fPc=2JGM)}=z;%KCD;44&TI{l)g;w=V)3u@gyHtpO`~T$s zmrnZs6pJ+D)4sC>o>epM0$3wk&ey_|GiBfBrW!K80)ZfGL9Gs;`P&Z3S_TwOs0+q_s5hcWtqDwUs3D}m}0)JsGMb{+K zX-7q2z>kM`1jb_CVFelivKn}9#q3TUyBuV5>f;CqJ`uP!jp-G zMFKxofm*QNM)*DyzperrK2*B2Z59Mz)FU722@n%5x(S~sj5 zG^*7vL(<%>xu;QL1 zNBcO;`tAP*`}cdspKsbQxrke0y=DFP1zqgu=o992{_^B$QPP4oEf=*jga$XlE3CTX zvlmwRLRvHa`+)4k{t4%Q{SO>u$y4{gYo_glKtMwO51WMleJT3S?ZTzH=63}0KidV} z#>yBDW!WW;%ZnB5Sfd^v46HSHcP5aC*b|X*IyaKV0>I<8vrFti`k&_Wr-tMK3Piyy z+;00{$?5c#TyDV{Vhl@wxO*iJkDnY$UM_>olqJIFL00k$NE!F0PD)SZ=4%!<%3tJ% z8c8Iw-qf4{wjHYi#R-v8-Ptv`8!`HQdS5@s$HO9jd|W00tqtP;ZQY2o*Qg#pSG_d$ zPj5C8e5<37t>mLgxI5e$llLzoI;+aiN&V{t9gW zQPFB_8nuN_tW>8u2&gqt*O8k=FGTNsgriWqb%Wux#C?Nwu?oYo{$UtY1?}-#TS(natb57u zX`p(qM4hpgUM#-p(2a_6>YuSB?ULv(aKF`T%Ys{^B0@Y9^f=lB)ola8xTufaQBNEZ z&P5X*CZg98{@pRppJJGf>CpYMT$Jt$VpqwDd+qcmEK@>c`M79D8{D3dSDlHn(f-*_ zSj;7ohYGWsbymj4Sx+10A8|!Pi*lmb3MHC7G@a}oI0yhdO4F_wU_aez1q%qipYXeu zq^#(YE*-COqY-YHXEC|0pBzQ)AaK(_D3I zRXbPlR(_hw+TW;D%UKIm$rt^kP!FZ5U@+;&IgM@7Yry{aAZT>_xfJs`NTn)okndF< zR73AU)F<5Baj9R-S#hg%@(_a($a;gQ(rM3Y7f$9mHR z#Z(>L6@CnQ59+uyPFRxEjg3B|(v1B99abfJIf&Ku%%zMvG8!#d;_F&@%;|HGp)4J# zuzF!)^8?Hg6W~6B2?INBQ=wWm%GJwXpM+&~<6hqK0lNl-q*opqn|x`WJ&wh+l!Aq- z5Kae`O_VQ+s6&YRSGe?K6dE=;#98oU!nnWK*xyVi#}H)wPDzFEeprg`o1(=BlJh^w zd5OxAhV()o`B?Cs-qBasgX6|r#Fuj(DzR^A+c~cuQBmNCRN1T2Jsfi2NmZI?@)M>^__VUF&Z4Po{$H~&qUN|MVMzH9z9KX8mh7| zzPubNRkoxIn_sXs3EMG8d+?>N$3Gp<=C;PjG~|ofA_q@@{P|H=sk8imp|LVJ(aTfe z;;HqT7Lt*vM82<040@g$Cf%v3 zGU{@Z6nycicp#wa9wy^`n?z)*ul`#xth%Z$=QiOBNaF5tiO&}E4NPf_Wj^+V5#U0` zBV<-2&=}23M=aqez|-Sxj5JqG(!Z%Ms5s@fldy}YPwCC3m`TUsLa^94j|P{iVD=vq zoud-QKAl_1n0@zipgRR}yvVTV?>+;?$`maZ1)6g*pPUKT{yekgxuop_v{WpG{lcK( zENxYmTo*A!8sPb-X^+T769OHuaVdy`{GLziLGF+I2SpclFQak95soZ=Iyxn z9<7YToBpagI(Fke?&Lo;+6uIGZ>{Sg4u^$tb^Gz5A3`qR{(fRXwYQB>bRg%&iy-JJ z{=u${L_)5HsDBiUXn5xjv^k3T1mVED7ft+md?U2_4JXODl1At&fI`M+PKvsAwQ>wj z_Eh%=&R*_N-du>L9G2})^O$@xK%f+tfi`x3BKxG}U8x*oYSosmFtx;-T`Go zIX*XfBC)z+xkUyzB^4(b7qI$J@1=yG&;5QKg}LkllB6S(LN*XnEPk5k?79nRqbuq2 ze{a~60yuLy_|Na$0|By)W_M5eujg7W`XEp0kf<1$x<{AL1K)d0(=-p!M>WeM-6+Fj z+eJ`M7OLe*htz=iOKrX&N9<0w4Bo>?Tt#j562h9|n;Ko@A8p#nfX@F!i?8I$w^C?Y zuI)&xN(Qgu3Up96thTexPo6XzK7|F1Q^8p6T~49zAVJqGi(UJ8h~F5MH z{uP}0@Q1|N9hv^%*%wSp@5Y0R=Hv;q+{JV$*X|s&mRKr}QkiluGy64rbZ|jFYNmMd z{K58O*QWL(bo^eaxYUR|qPpV(oe|1>#%m9GZVkSNho(G`QEQV9Qs1+BGjsFS)l-BQ$W5brwtt5b5L5Mm)-@#6-0 zE10G#jhC2x8QbUlI*X5wdlM2WY5A^qLGAH!e?Ittrfv_-(>GhdtHTQ=@^*%Gtar;g zX{zMybe7cslLN(j4F=SrS$DP8i-8vp;Z z)c+4sTF=2!&*r}<>P)5asB|W@&3p9biV!x03Bx&Ylsw5zX-rSLH&6(M-pX2f3zRvk zzuM_wAgNT9ZGDIy1kVKNiIOT12=aiBj~DG8)EUK1?>dQ^?|u6T9sDP|D|)(gNolZJ7I8 z5v&mR&={;c>CSR3zR}V%KiMzoLP(pkk@;;K68xO11vai(AQRQA@yl-HpxbtyHxy)?%HLa8NfO@t%29Esv%$D>gXhhy#IjIvNw zV^2DyUr92y6UVuFX5u&S(WI@ul;ce^CrzX!-jrWX*R|s#)OZfg%u!%xSo*eK)n?v< zO(H1t1o6~k`k)TjSgD4sBF*a>WW;KH3+N=eSU!KJ#_BvlF(9s#9#v1KqCslxr}4!F zrvBOM%?ycteJ66^&fmG?#Mc|QTcmT2bGDU2>@4`&t=i;`%)cYRT3|8Xi{ZT+SZ5X; z+a@kN%UP1EzTf=?ZPkU{5W-xJU^gh#`6*b)s#fEnG(+5=X+5aT67>h9<)k;uNjmPr}g0d_+kbzJ9nN1J}G-)B~uENlt4)_W>CUxx?LnIGHnqJh+<|!@dXhgH?Zl-KCP^dnFgEWsh*me@C>_&|BgD`#|=Q|@)JMl0p&uT z3^P=Wa>M{DapV>&EHIz`Vp#lxHTwBZ_o{9u_@+Fnq?pls-lH)F^?8t(`Ab{; zd+csNS5)ayf;Z2<^9)&9$&-6MBr*QL6-{1Ojzorlc(siBX&g`xbIlwR##qizU^x1R zs4mpMND^qI*c}sjWzse zE6$6*2@)g~OM2pbWce+VaDP(4$1h>1W5Ohb+!tM!sBOLE5?}O5Ebws%>@jFUtcd2P z7=|Qz2lCn$6zg?`T12|>Z?~W)z`2%i)*tpSM@khkWWV=`x`1Fv7YWvprsMLO{lD}o&siks$zc3v#tdGg$?-$5iu zcYE@^DIbEjlG_`HG<~C?%mi<3-!U(X4mucPM6Onecs-gH-DlY zAS5b>Z?X!qq9jb9L}iHL!WwmxR|M>W%bVG+i4J#jKNtn4I6;hq zkMQtjdiBL*uwE?sxVl@P?GkCLmdVh_!2!p*jH+zoPDX{p54O^1?ndRoO6+lQ_!AFV ztBF`TqpT%tqCg}N5CbEMknp7MY zC>)YE;vIK^<_@O6Bej$?4%&((rUgNz0ZvTgV940SKtt?~w|6U8fRHMyk0jj=Qr zB(&i=#a=!UDl6Krr$~d*gkG+kl>(GX;a1&J?f$an>4Ui`E=H7(J03paS8om7f0IM^ z7LTu>&3Gcbc=Q@I9KFh|&JgGK9mHT>2BF@jcde~1b_qlUd__|q_eMR+wtE?kgk|=b z84SEJmtwOI)N)^}v6=+CN%6Y#2(sm4`I)jyhhxL=idU^WH6p$| zs$r-!Bft`53%_0_Uq;cg`5^j!{cEqM$`MUurI|=OV_}>KG{jv2Yx4(jm*{Mbd5u7Y zrxHwuV1@690&}KxjsbIYiJxst#FFG%{p_*`RK9f};sAr9iy2ze@eWWx9kqLL_Kz%hmg#k6 zAb`J(Y;uI~v1t3GmLQ79Hg5(mjRN=g%r_TD2R52dtghu_S8yF=!daXWOiXt5yx4Ga zQp4i-eF9H`jFlt+qI#r3f|=BnMTgoqmZ|Y$)Chh#29IT*#0&Ue6Z1bGq;!x>l|TQ?m3UFQ{6I)kZxHNc9qaT@HVwb3 zp@hj``yF6yNEi8`COiKQ!EYIpQ$v$iub_izfj8YnmoM`Xx$|cFaT2BpOLJYW^1ZM0 z;ep16tK=Dq30?gn;is4TbsvzBT%ld&6H|9-6BWDmA!uB0{)h@=f{MvT1JE zRlDA%XbwyMs@(E{LqbkQU>TX$rr6Zd?E=(Zd?P8^^T~Mwwu)`6cEC>@|Bc8uo$oW* zx{bzW>cQ7@o#(nOPVS3}L}70R5+1Rnv3ylo6}?Qty7kIGh$O5~wc|Y-iIxz`l`-v9 zyY(OxKZAX63xnUcjRXL;v<^>{mj^eu;edpJ{SBm&F`}<1S4m? z&<7g&Dklfkf>{sd=J3`(6PKcAk*%ZQ?V0KAh4;`zTs$W3sE8X*FKYs+dW35Y<+Sfq zX_*4@f(9nM+qQO+n(LcU82*zxnEx7-|EPuRgM~}sZxPFa`v0I7#2l^uqayR~YT;6C z-D;f!tLs_u13gR#glu>+_k4p(UA|y4hys628}1}bEXg!Ik_?9AupbTBJ&k`Q%TQ24 zLWPQ4M&&}k-_GFd`1HN&?++F>S#^pWALjwY0dQF81g3E{I28)|rEuWN;Dd~hmj~B5 zxEH-(#*c^qUbIRs8>E^5ST4cW!~50I_xfpTSw?MdE`R8Ys2ckuO5Yqh;8?wJ%!7&J zaMc76;^t(pgm~tIQRP0BP*_z%dp-yTmb8h?A%sC7pQ)Z9LZDg+=ycySnD|jJI{qy` zO1TA~Mb?O4ESRudXFX+Nqm@By(0P1h8%-VHd3AUfb_-5G*vPI)J%{^3j3cBtNbUz| zusny^-G6OgL5>s9C*tYuIfcg-tB+2w%FoCR1RF04LF4naZSjgb%P2lfK_m!7NAkp> zI6j4D9EY^66CJ5MozrrZeyKVNZwk|tiRawPx@uwSH5A7a5)F~2IO@z^>X<%az{IgTjA zTaHCjmyBbU#tsk3{sl$nip?B_Y(#q?B_?cEC4AEtErG8+Hzg79A)$87JY)f-hCy&f zY=!S54kcB#mF4e3!14i~e$QMI!bL|UR`r#^R*P^L%dK{nxSt@#Yu{6vP^zxmz8_&! z%P26DVk(}C#U^1tTM!>tWIhgUNYCZ9(zgj4z4GdDg zS5OtxGzOYl5lv>+(iJ35k0YB&u%^83F#GC)HD{EV@)O=bfASO8&>s_}VuVx<@2%GR(# zxFWW#cgA&R17B;JuI+$L4Hv>}LORTBA9@Ln@RhN37cT}ZLpnJj6t`I|A$58rT74G? z7mENcm|{T&>E7KJEV}XzJbjnJCPfY=oB7-zr4#`UW^i+a@JluSlO_Q{GAF#>ZcA~7q{X@SuC zn&u)#^MY5|B8*(%&l|8{Xli~niO8>C(LKQtnL$EEuk#X)WQIF6B?j}J!aMOobn>E= z=SfL60FY?bUJZM)j)ZCkb{GNg19N|pW|!AGqYAhNSh53Inik~-t(^mUJD;A2HeKX$ z#eJ@AdW3?GTSi0uV_S8+Wf#0Xv*w?(#{j+=^NvYJPQgn@#l#+T9iAyBY#rnjgj9;* zf=7E<7-p03wQ$W&OfsFDV#es#%+O{8-kJ^edENkF)p0ABB5X5IMfRX#uOECDw<@XG zPCq{$zAgvl33XELnr7iWlkx6PY9`|)lPdEZ@S5w>=O5mDBIW32MV=2suQ9 zHujD@Tb&s^*E4_2fs#pEL#NQpGQa*8v?C4kPqMoE*i)v!8TKk_;@Q@#g}3{0hwXj` zFZEga2|sI|&<*F9Of*L)DbNEzv#W>m&6rlR|IE`R{W#6yH-q#_D}fdFlx4ez9$Rgt z4)0-Oo+(D|+6FYpx6jmhzSI5+@F)anmJudH_}~?w1HazRpkEnXbUNZ~^a1{_nfV{N z5bwfEME<>hqy4`A@lX9<>9_yQIR!;ECMQeJFf}2i`mablaVQ#fd*FYwPW`hIuw>nw zfPb5{E@ps$SpRRI_b++!ACiP0V2{fgxBW@0Tg519^%7&qoBk`$A@st+4q&1j>siWQ zNkb5u!*y#D#Ll{~kM&jc?$v$Kc8kMj5@cs_T$e?oi3hX^gtHkbmhT&iIZnqonpOex z=JDOouP$0pXHIm;>*JTn#kD$iVuHm8-84o){JiOJCj^24oQLJ{!_|jMn!D?KeS$*= zo-ma|Ek-w#!+C-CzhqKUX-OZ4*z^>x9d!G2htS)zrjqtw@5)*fO2Yi3K$9JiR#HT7``DW(ia&yCYL`z1oKg8WVLM$lyMo;0|blMz8DY zahonamvs0Sua>Fe6@Q9v<0xz;`Jws(9h8b)IdVmji&ZIqeAlj;?LK~N&l;MkUW~#6 ziyx9`aO^U{zAAXuw{=LLz`BXfmtsb0_vou9%TMRA%+-L6tA&u&x9qq@fg7@f!k!&z zLXqXS(jJ<==erNdnV6LnBnoi8 zQ|`#w9%4(y@JxJa%lN=5RFxmqht8Kb`oIkNyD-(32M2xB8Ny&jGN+BnmVBC`Wc;F% zFsr}ny~9=;(9v5K5#MJ)Mil3-o*}0C;K*>B4(gaTf1a|Xv}(tcCAZHquHL42YRH4D zb+iiK;7~KhuEKbol%S005dsGl=h37=m-m5C3y_qQ66GI$VDCzae2>2POq8R9>wK}G8UToTo zlY506o|8=2>AFBDtOcjxRli({!~pKiOiP+}TPG-dRYK~>g0YHL$_Hv2DmCPQYs`g1BL_NjsQ|ws2inH{ANbivb)dmHq@6q?2kgWW-BP(!wuf#|W z-}uLg6C0u9Io`fV0yieEJ+9jfK04}kA&>@_pnV7sYk7x01 zSWmV=5>9Rfb`xVJXBD15NCMD&RT<2)ER=E*wiTLDy=^yW2@bSV?3MB zKv4jsXXo?@35pY`sm2d0Jsw_q<;C3DD+6SK?Dh%Ut*6%}S8GZSn2ugLbKs=w{LqE_ zJh>8mHo1eUsrcbse-azqvJK0X>LqLTgh=?ieQ0tdVshATKKif{U7cj?DE~eO2Oic^eg*2h&BstrxaWG6ifoWngn8^e+3>Zb0A7Zh%(0_etaCaPQ!B z+~Iz^>WXlfphYoefpG1-5iDuEIwpjWz__dSFH-7Ue00?JPf82fX;j@M*!V~YguOHtb6%DVS4Y@(@)BU4b9li%B_NR$2yJUBq?Y~e!81+r~W+vD9OTB2GNKksW^9U zgcmI4iCkMJmN_P-i3Rtox0xwDHc7IV=A<%FRKINMYC0h-FU^4yB|jU;EXUkpT?7Rj z`$XOV)bKt<=~W&u>p}rZ`jeH4gPi8XkO{XHmqGE$S@R7CYn)lJRn_a+o?-+lDQeg1mNs*Q)al*=WZcF0)h8!2NXrST+N^=Z+@a9qtu;c?m0i@#l*kw2G!TRCJDf$IP9i{FG-vZxe8AdqV(;mDhcx%JgZJn$0lWo2-$TJ7i1C>Is8o zX*X@Tj`s=wQLfl0yN{RVe+CH@++syKJiIu5zit$jmsJ>NUsKz%Ghz&b@yJwN<_{A` ziAbymY+T7^7`XtN4-NICV!71Gp4FHFDkmA{K#E7^zySL$-#-?8U2?tkibcm8to$;I}xoheaEyd zJ{0Ueq>5Q9-JJVeq*Y#vNV<8;L|9##Ka?wLSkmo@n{&fNy^arN*la#K?XV6f>7fqR zXe^DGgjRy}8&1-ZBrDJCbjfduyvcL?^yZ1P7GauEIfE~fJ} z1lA=~#OS225C{eSDNH{SK4uRM0(wwI5V3Hy1tc4%20evcReiymep|V74!S`SOwt*# z2zD{8+m3E(;kH~LHw|Hs8I|UvR_j^K^B8bWKrtkJ1+X&Yg|(MO7#rM&y} zF`#q3c(|0Um`d_qI~#jfU3AC;;7MlY>}(&sW!SgK;Cm@V|%h6dtdT85%>)}+9R(ww*MyptE{V+mc z^tw6c7^4a!oq&bkRMdAlHFq5*2P|S8)Io%lrwhVvchTKbdW%m(^&0oC`>!xTrLs7O z^@!IZJ*rVXSJ@;vLx@}BFitJU(8}qDDa#et02BJNnUJj25p&AMpYN7<^{-svBaJDe zW&~1-4$G$H!v*vzs0)_(!rLPhGI@3^lz)y!mT4{4(Tq{j{dNjcE!z-jB+^#Ele$0lltkA|g| zohb3-9}atOaEFiH<9$jMD`I{<+P^y?zS2fbg3tvVYY#lVN#HIU!|OlPzgrNOVp+L1vo?KR=83Ea@OGO z*`9zOC+`ym&6KggW+CtaAjzIc0dc?Fp77Y%$AH}IS%}%FOBNX*8%?G7t#oqDtJc^e z@o^2Y_$Xn^PG2G7Y$*|N_FabfefEEJ^xc5wc)VxafBWJ1-a~3Z5UM~R2u`5Yam41S z8L<}5Bpq3KZ9?=)@$ydK^;GEFH%sIgQmMoZfx0~e@7g})NyiSP{zR6{I z8BzCfZ~NH*J8}1H8RV1aL9AjlIr@5x&tR2W;j-h{vi&0Sl|PoL#LFA}4cFP(A?C$> ze1mzcwx>UW61(k;m=?x@u(L!>2qk^O?#DcZBvzS==)xx#IHo0L8{eEpG`ZnIbH7)* zyAFl>yKQg)mqvz!GiWSK>|S~=Xw+d4v|#0lMRrl_fu|&H5QRNa|vVlv@#JT5I^&5i$0Pv|xm((eFKM z=B%oFqTa`mDsCo;+T;ux&elJs06JN7@S~O*aKKIL`cojdQIbLjLS+0bR&X3*_3DN5 zbT-$oyJ%4q12}-c?Ku#C(x6^9K<6z5!(Jk=mWh}C*zC|cN zzRo48b`9o;x{vR0-2z824-`}d2pW;4x^|b)Tmc?9{m=IOf+V7C(?VD(Zi3rSfk|`G z*V?e;6^8qO!R%D`E&8z}k~n(`HrcktAxfm5l5QDFL+J(kTZy zJ|}4LDem%sLtn*Pd*jf}d<~*@ZR#Q9E^XP!u*H!O1b{uN&(1qs*^JCbir` z_!jWeH{FDpvt0vU}Y`wXD2-ZV9Y$r%N<#ZCHm(ff_v<4)O!xDn{zUU`G#?|&KP033$wULdV+J`!Hw2GwhT`Cr%W@r486_W`6K$DY4j_JhMW8ib*St> zH);R+jf$9CQpXwmx!kRZI=7<{|cLUscg#97+zt3ob1k z=RL6{BoLjzKzo1z096<0(LZ|VqxTetsL2Ubb1@~rQ1Y4-Zrb}C-<1E@!dVWtvfqg) z5Y^ao!lW2fWQE#t_w_-Azi3DM5e?aNS1zy1kEG@n5l;Tm^M{R;<-8`%&9ET;S|z|7 z(anBgljQ7qc8zSrm<@Pt`~hnV)$|3Iv`hUu)}o1$fd&XALJ?BWN?zBo2{UmPOr*mY$pnS#Pj=#;HVlFy%@zwi|5LREQ(I}+kMZ1Rt-o#<(yE=Dc*Ftm zP~=;&OQ)6y;`jXUk8{0RbPh^#$ce__>T2POLpyMQvbY{D$R;RL!&JwAWSdLrA`sn(6+b+IUv~Ko&}AJq&P6(%5q7mn&EPtUv8% zw8WXpJ&|`9&w-FD&slm49WlrYR=}6t2V^3_V!1|YTHTqBKKAPh-L7!#XAYNbul?}S zgC}FTVPR=er8G$*t-cck=_iQ6FddXAHnkvjr6hGIE^ZhaulKmhav4pm&+KyZLQ!L zPU_@q@@x8vL%9e#SKI{-iNM}MG`@oCktOBuY^6Y{)eSxiE>@9M3^rFcXHLo7oyMy# zpcvWh{O($pSG*kq(ejAMKQk)BqWpW63A#;$;>@%}bYEniT|1tMzFU|DtXDf|92)hk z*}6jFoc)2WwhpQP+0&^T93-O5uMH_Xu;skNw9$N-gCF(7^nr{P81#CkC}Bl+&ln=0 zj`HS6(NepTL6kkF>|MdqAE;V1@KA3|Zd3M(4K~-Wmf38%Cau#lvWD0lR{~aSQIL%fVtQV6#l4(gxeUwLW;&#tA6_cW2Akz1&0uI6pjo zfa5o|zS;XS8?b1VQJ_6mYeuY@63k3Us$eoiAJnuX<=c!Nag zMF3FIMh>_S1@Y}D^y)+3v~fOxS`p2p5>*AlMC>v};6{s`&XPk^&;}zPdP)M7-rzl- zGRsH0o$jDxRK$io;Np^MwRGrb`K=L4Wm+xE{YI~QTwY!i`IPrVri`)1uzVxFtBkMD z3-sBKIKVP_=rT$QtiOW6G+*;Hdz$8D2B^7N{svu9_XVRs{KPt5x=OhcnpBA%^QM7r zbG9h%@TznDAJdLa>}}2mZ%+hLYs^i%jOJ8IoOaVK3Cyz$0slbmHXiCqA(^Y;QO(j` zV>9;Z5ZK4rnb}=gp<1Jkfwh5*@ig4opMP3zwb-X$p5Ce$ zZ@*T#dbI&q@L0Olb-H<w7Ktb;6B9{`+yF(%?MS|^ovwj!p0<+-`Yi>s znn&EdgzrPLw?)mi?dW%CUtXyTX|P`{6*#6@hC4r+?B7{UtY}veKY?Ea436bjy>>Y= zuGe5HU$@~cU;Lr`SO~saNaW1`mq&I}Gs+#KkUMLKG&&UP_LWv(O-HJfc1MVPRf&x+ z)jid3ka}GG=C{&>J_eM|3T^D&I1rwIAV<*praiUl?mpC+n*but978xO$l0<9kD$iK zS#G)MM$fBS0)<@zNLF*(j;A61Hy}^uP?!zO;}c>1AtD+Z*05Pf(?J}XU$nZjkY%gk zFw)_Ya6Vj$6$s@lpgm1p^Lj?wKnuHk_$o$kKDN|6Lqr^m=o5?(5z9yJP=1@fQ?T{f zzIGQgJhVez?DdEQZaCHbka-}FFV-I>=y!TN??qYUej5&7|0rUvCQOn;{&cG@YA zP3Y>d&utm8j6gRP^A85sH`<;SRO#lcTCmSI<>iBLRCPAZ!EQHr@#+2|yU3XR=rtO< z-;7$u^Qp#(B`=+YEXy8*9$=ipa7m9uXDaJblT)4^c`k z!|LqK6T(Xx?^;9fI^uIUOZ|Kl~CO6d`3mJ(|xVv=evr4Vx0+=K4}jX zGg$3?BE;0@{B1GVPo2Umw(XG`uVfxpY?rwZeJ=?W@^Dr!m%+nQH)dYX-`Q3rC{Q1h zHRd0>4CP1nKE%6*9oFC7e~x9$PoS{sfaSdzSU)yvJ)FcCpy~`ZQOn=7K?^Fjv-a*E z`UD5WPY+%bR>xx11d&o$At4CL>t$x{gmy3fME!81^{O`;-zWE?d*en4J?G@3*7riL zqedA;{d*kFivIE<01J5Rc5*245)yrY>vnzx*6-C2w{UZn+rW%SH;hsX>+sx%QGTx< zG!*d>baHZQs@t+4JbIP&JLe6sLL$Z^J?71+s&PNm@tV#33Cvaw6k5`VaD!iWZ;=<= zJS}*K{BT3;AO^Lq?%;0S`pVa44eG3UXy(P_m1pF>e1fhSpPH(|k zcvJhfU)|j|P`a@6zxai?-nP1f?cqby!pS68eBC2DS>EO3P4~D)BR4zhF;Dt3cYB(` z-TtxN!t#EXWoCH}je{N>Z3s)y+iJYtuxf&~vw*WFW4~=D#`0c?WV{(7bi3CCe{O=l zezdh=IynCe>D&yv@j0-+cF)k;K^U`*>+iN6{P+d@+C?q#uk9L zbye6RCn^B=1?u=hhfQ+%1}=dl>K~6z-6b73Kx?gTy7vhzQdBvwW*&BG4|nSYBhoe3 zEC1A)IY}E^R7`Qdy@%ZXS`sl5VK5`112wb0V_r?18q^7!Ti@|htfH>Q!^LScb|Pi4YX8c**Ym=L#pU5X4L zbPFa+)=P0V*&n|L3Ag!wfB-gCyS=Vpmt|qyV9E}OETWh2U`C8x8ejKXp+*ve#)?X^ z!yHX>4E7XN|B7XmiRMF9qj=&lIHPGwb1h_+V;k6XDG;_Ld%h-W0tJcZ9dGB@8WLpCA9`$Sk`I(-CgBcK%4RJV5 zSS1}}OJg}FiG455>3i%ytot;f>%~GxXa%IkYxxsa&HF{o#}S~0sFU~DgIa{_1ySgK zHb7OUS^Rc5U*tY#V>-JsZhH3=_Lx3Me~n9+dL9N_r@1q#LXNZZo_GTU{M7S_-MuNSWy=ZJq9yZ1 zz%kiBN-cvrWy%DfS-t>1e30mb&7H2V9?r`wOTy`x6%^}IyU%K^n8?dHJFH&@(+-4M z*N~osF996;ErekGb{`B#vIjGr8r??M>y@(W^MzB=3fkdr^ZL!IlnBp7Pn7!aA)gPQ zNbbmTg2?NK7n#q(m#!Y{e^(ByL>GFqTIZNUKQOCQRw+hU`dZ&J6V4|;f1zY-^kFY$ zIJ3U&g+5w_y>G=GZ($%TZR-j^$%LO*84Tv_8!{vVb?)HD%tWRkTXh`WB`Yfo)wlPO z(_7#8?|9Ugq#WD6ajdKX*?qp_$#n4uBG!B%EK+jdSkQh|ws1x-^^Gr^Rj9ZNt=flMlF zSxjTQ!4i1dB#fJNx##J6=da*cq|y5dU?^h0W#f)(E>_ztvVCN;CRB|k*dbH$QSxm8 zbntqFy$|u;Q0l%2IzD^g7U_Cy)Cf8gPc@~VrB;RFgLKsNHQKpM?aFN)b$X<|=J>+m znD_<@Z$8UJb@)#vCm*}SjC#UKNk6bw27T=<8h>a0Y)UHswHi(%H(Y46+#i*@U`=a;Wn1zR;mhqtG zwqs%3%dmCkX$84Z3M5tvE*RR^2RLh*g7A4m#2+pFXs`I|I__ByRG6JN(#&l z<`O)$?7)XaeHa}Kli_H;H{aO&J-B8Ch~7}TF-m>v$z_JmgAv2e+=5_Or##hnH+2DR zv$>1>2=L9E4PEuQn=aKN?gk&o);Sr0m)`q@X(2iFsrJU z-7@v*O1#RNjkPsm;19)#dr5(1<@z^5d43u5BN$4f^B~o zy-=l-yQX#X;ab#lNzI7`M&fyWU9YE5D0ZYzNS2O;0TsoM`OQ=SD@amT3!js;Qmopw zSZPYQ%UNg&#;4^@ApqJ}*XUJyvj~^}cr6YrV_49qr?abi=ofMJ{tOq+iD``F>JT(m zdVc%Pwzlu@YqD6`>q|u}U$xgT?^0&qn zYh`X%^z0HQ1Cx>jKa)Waf@VLH`urc1y;G2GQIw^dwr$(CZ5tS_k3ZxL4H3~naUGpRb`y`e5)bEa!!62*&RmJQ`~%I=GR>-V0bO8o1%Lc46eY6* zf>^RJ&lN#A4mcy|<}s@jtu{4-6W<@Wd4)n*=W*}D)vEn=c>g@H>+yYFIpNRkejkZC zG5cV9sTw;%-EIo81Gg5`>L&fHocm0+jvY;l$zw5p0ks#;5fVAk(c9gP;&ln^qEB!! zwFtAeKj?3Qa5mn*jf#>pPJ@`x4p5*H!bR1c<&i4E(_tDBab-3dWdn!D8?{9m8JX8* zriWhBmwl})K!iWqA2h>W5nwh$m_`iU>Q!fLarvX)Y&Vlon;@McR}_>KTB~>S1)eTsy|});w=DD}hQs8b4iPb~ zudyb1h}^=SZim|{mX5@IGQ4gB9|s7{Ungh64FgVY9-dj>#ff*qkU z{`;YZD4&fbbMcJQyC`edl<^ML&?7}D(40&OZGknAgi>=9kcSK)g`-CCZcy~N%~RTV zhZSi_#XFwg;&5^@K_a!ICijy?b|9CLPXxLw%j{p|A=gaZK*x@QH32qh!_Jzs`qpU-MMb?fFWTK5XgGu)Yt!RgL*nB4$|ijaJT)tbEXp z4F-beLJH$d#l4TVuX$A9vYT?FDcZIwivwn)Y52}64d8;^$;i>|Bg`+LRzB-hdw}IF zm!gz^F%_1R@Wm_Gcq;4=IVUMO71~izm9y{&i7n%B0qE53{M=1pA&{jDES_{t1-8q= zQrdB>N`0R2Tvm;2Y069M4-*OCc{yN-briH3JtQ^q7m$u$=m?MAHQ+v8C#q0!hQ@^> z?l$+PT*6Sf55^gqQKDRMo`Wh|83SBcj(Ky)-{Lhb*6}jfgZUmSNDAxQd5r@Wm~j*1!0g;{Abh^`hi944h0smld~pY`BV)+tBNgd@z}#IBFE=3%fh!;3aX+X*bHPbRA|N5L5&aI>C!Z4ibupB3fqHf@E|eg-(m<8` zn&Qhc^@aHSwga?hH>%8`nRa$s=lp8v095y$l>X)nk@&j4Ue4C7UL`%+jA`o5<9ycl zgz`|_hf&`R&3(QOp`$F@_9#stH0|};AjJWkpGI(uO3+(L-@HJ2 zysO|icnaxA=zPl6(CT{RA$+DD({eSd|1=xln%C>+Ym`V4%GZgw<70-^S(k1}-?8D> zXQxcEVhir#}D~p;lVa^Q}GT*B+yXc^1W;ryqpoTsO zzkm9J=?URQ?H0arf?C46Fb16^lh5QGhyauXub*W7Tn_CyxgyeRZ3@QebxFj5wG*50 z^Z>C6m-^cZWOg$7h9inRdJZ8N9!1c2Wnhm1qY<{=E>^Ae0c*u>&qf>BVFY~Af5>Dz zsIizu(c(soZItefU~U;VUcAXX^-Nu6dXbd==}bRHVAqN5#7xoY&iTi^`0x0@_>3V_ zddWP8Si<;`2I+IHSnC`lz@?aPh-*vQ_`RNCbMaD(g88x)GNJ&2y<~abvS`PALf*th z8SDbIz8un8hwFd)kp8GREcRdU>v> zS3X#fE)G7rY+E(oZgc5aVu#=VU!lv$bw`M0=u*LooZXtLP5qhko!LmHYS|CD3Ye01 z$AD7zqkyO?E~whma?niUa9yKpId4;VX2?!uZC&jR@z`p8b!G)yz)yOUN&kG6aRh9- z${&JD2_|=Z-!q|?cGJGad0?6~T0c^EuEwPcqk`-iZfPo%NJ zhDSKMB@Z=Yd;YLkw~9yMPy1`$p+x%irYY5MPD3xUO!x4}Z-TccPk}DQLg&L{C@7pw zF_0`_4OCJG``+ysPqfg9-=FbYH>~FqxKJ|t&d{>9A6W7AT`zULs8Re=tO?iMldB2I zhTU6*XIxfv{XODBrGm}^+*|gNU}7GB&@=(yhBEO ztveoAe{05Vc^XK^zfTrILjp|WSH>jJDh6i}0SrhyIjG!hXq{|W8vu!qXAiqHGyu>= z6q*59nsH1TI4HD{WdsXj&y_4#2mL4*tNgh!h-=rBBOY04IF-+-WU@qvrg4(VRMSVt zs6#$XJVxyVue!ZLA4=TLiqf&5xkwM{^VD+jPXe1K9wtK?Mb`hF?+%p=@k@T|um9{q zX=FhT&gdXF&sN9SX*uZbb(>u5_HL*OWWD6LS2cAsmbrK33Fvbzb`?fzqDfaTwym(^ zPH4y{e#)(`#i*rI{uV=4E%^bUMaV2&MMg>f33%o8dM4X24^p)F*(|+R;IzkR)KH`k z@EqA2wiAT(G`&ntA8f0?hA{YUfSJhz*r1!v)QG*YTwNGoPLzeynbjW()4Z199-Xvz zheiQ1Od2AdRe{Zl(ezCQ;nNUxv_m>yTuAQ&?iHpGeuZ|tvHNpfmw|KjCWCz3S?~|= z0rPFgY9~%B=_g7GGqJ0_BJ{$}Y?S1Q-5M?)J>v5AhZcs0p9?%;Jy#d#d{2TGS5v)I zk7{0Fl{Z@{wNCy6SxCJNJ{&lWYZ*VOs3bF)hTp(qnGF|UQxmvux zKL-=*h)}r16`J$IG%y}R7JNgj>Wc|^S3!@HE-`!R@#J{Dipr?=tE@^$C(&Y6o7ZN} zfvv?eb33(uKkjID@&}?d0$R8DKi!XJH*hb{Sc?s_Sd-N2yMiCcS5oFgN3?S6HGIdB zW+xX_8kirGRIqXQQbT`#1m`sucaT*@be;ivYAZ~r;m1+kmbYso-nuJ3+sQ%l~uh$Nv^1 zQ*kt~buzVcv@!S(lG^{C+u2gL`9;?teCOynpoR*8(ew`Mo{Nmt*$Qh{ZOyuFg&AmA zM6{$y{DS{em{)#$#Je@^rq>NHLeT_e@Bg^J++Gt76=+DndaWva$syG&3yFy^|Jxz? zTWNt&SfUf$>OM0}@fGpMDC+4-HB*RUf{u zJG5HAM>Dp#tvKgT;C$j;jOIM-Nv)*Fg_5Z7VyQ24FlkqQPW-oO4M%YBjzhw|)hh%K zqX*vE6D`=Ug}QN=+sm`g$+`ENK)g&=7oZ1n9Px7uuJ{CyJpg}Ql_Et6-kXW7m;X#i z_l+~5V|9|E*03(c$;@6~5%IEN+!UTAwnvh8$nfaBHxG;A6t&;(i!xia3QA)i#BE#n zH~TiK{H|Jt0a8#G4s%R`zP743-d(A6(2HFk*jK`JQ$%uW1^0~Cz^Dl};m^EC0&mL5 zXjpJ^8(;aD8O`RgmN zm3AQ6$&y(5G#Eq4{n=aMw9LPkdbT3%oq$tZUj1DriM;H~`pbw~&d^{Rkf+3mt5R2+ zC@HmTSUPH=Wrbi_;$|sjO$wL z!EPAE9-}VTKs$MJYRSHkTCg|2$R1yFqRm4x#XDcI!FK8!DHFDLF5_3m>&N4^7p+-M zZbm@Rp`ZTUXO?kg?Tt6$-e2;wgmC$A@bOMkr82swEM4D`hIdhdJ^TR~_`Wzn=?B~S zq^|8-W@ghByIl5(8ed;Ps})`642v=ThJ62#Nwa)AXl9=gTrWq{pk2NkZ0cX}g>-Ul z7Fjfte6-V{iS&E}UC_ARU+;c1l)Ml$Rqu?95XVj8C?|1X&r7xQ^W+`phrBCk-nen> z{E@WU2L2e(PfLD7FwNezADHRr>M089M6LW;u}F_g^Yc`Rv9M8sZLFRA@0~4siI{tw zzw=x9cYgEz|IOL_B8va(2>+k=;%troF}{Bx^A*B`HWfJZwT)J#L+gOJDFzZ;mqCbm z(ITYQPx}dr^E3~BJ9nZ?qKaY*^!1mWUf0*{=t}uVC8j{U1)+c4Jmi!RCq|%^me2R3 z^aW?pj;iPs`yk{*>(XYID=IW2pxMhR%XhC$ zbBpadF^9w}hfwhAwWI+qTDrp7T67V#Zw3II;hXt45xSJ?U&*;27%&dBh4gwatz3)* zV^e(2Tix*fjilZxl3^c!d8#7oA-oEdKxNe{Q1$cANRft2pMy|Og~|hZ`PC2>--~gW zsczLZqUGU^hB(<+OI=5ajKJSSS_gxcYfkI2s-2GMm1sXm-m%(1MN!Y?NH+v<3JU2G z(04>*%DYW!HfSjryI(E;lN$~udvFIO1bj`xbJj?=t>;h3#joVrdyuHJ8#5A>@Yto3 z*kqbMM$87=r1k5Rb$~|~(eDK(KJx%T3C3aH=F|!(ae$HE0)rTUpjEFB)kktfSE)=K> z1!1HzmoyLrZ43$u0KsoFUV+~?r zqjEK8qugPjS5EI>W_ezHJSKKc^nwq;qV?yM87 zNL7Jg0NEb`BakPX49B$+SQH%2u$g;2U1V9lz$|Di=x4GFHJaJ@zL^nn#>pvcR3xu| z^4Sz;&_0Jwi}e{Xx9+5kvhu#W@;7Zk2%(Jv{zG(!_K^DDuIcS$heHc{kS)Ktj?2xL zbU9#raV|wfHI$oSEz#$;^rqLCv@=k?^%WmuCj$U_(K@5C)RJopvCgA)Uv2%Uh3MPX zbWv0jD?@?>eQk;w75yKItR=@&aXTQ*>;$VyQK4G3R$HfTo3!l?X_5#0okZI&9Ig(m z^OXcO8v#HP)>j)=0yp+7Fc5>IpW1_uy6O#Tl31cQ?l4@a5aUUp)caMIBEQ&eaik z(unNs9vsB$dcOniLhPwldPWGA$E(I!5^_NGbM|QO+AtH&s#?6wL{o_$Cl5C!J4-Ei zi<66se^UA{){=P6`)w!Phv;khBBANw2C?}j15fcIu}tJ(LuW!f(?_K0#7d;hlWN)7 zn*8U#p;34A{QLP}e~YxF|1Z{*|110`Y;NG_{GSO(oDIi~j=L?r0E%>&WQB%9FY5`u zh&cHSx%s=*>m!x}3kt-BbcLeOBI|NK&nxgpv-fTJvs7n?UW6p$kyh8lF%qJ>&OSO< z^r#_HESQBVffe(lg8^Us7pUA%o?#yr(Jva@Jgv~6KZ+Zgks#)=M*e@F_AG;vMJx(} zo))YTQ265-{1;z8KZJ84bNytIaio~|X;07vLkEtCuy%*b!uNF)smX++Yf=%oaL~o) z5b%p6`MLNpVZj91?o{9IDCVI2FiD%#P0uXQNH{M57r*$fEM5HM8tuL~y18%;w!>8> zxaOvgna-qZn4#|9XSb!svqTi2{H2>-#5LCkJn%?Qz!kLnP8h^-#}`$Tg3p#5;^|87}{9G2F3ol#Jt zeB=G2fq~q_`H7T1J5FEt{oz`%EiB_*Iv0oGEa2Wu{PS9ly#&5c1iHPKAq z%S~8!(h*2dxU)F~Y=iEIzro}*oEx~u#x>l{0_}#Gb@RCF zl?7?>8=*_$QZ)ThV69pU#8#}AsXio#_1rnum@&Z$f%!Mj8OyDAf&$8^gyS}spoD_b z=(&Q9PZgw->+~6>@2`6>^j%842%C6Y1QDtD&3L-cv9nX6oLnF%mE>%rZnOe*&^S?y zl#aTPP5RmyJmMUQD!cAfW+t2CYoYc?ZOYxt67_bpHpXs-+iTczx78S}$JqJmt#&8< z5Jr*zylZvcGYNWk_)TMXRmDQVjZ;B~dPM5eO5PL+yB-?EMB+8cNzVA@;`rZH`bkN6nc0A(`o;c)pcArHpCWpbeDtg6obtJLq z4A~1MhVWf!UYmJfyL(fMv0K-ug;&?KiC@>aMbM#q=J(7Y?MQ^kPANjHP%TS2n??J! zNB9J;zCs0XLff-31_=P^F18jjgR>1V&lj|SrzeXHSgxCT^tjcbB0{zbF73qd`6=rC zYCJp1Jav;HQ${f*rf7@ngG_csqa0#98L&I{$e%0K>g~x}g6_c_I7AfD<0bPT*4#6# zY;-2jAf;zv6g{!mb6u{`dwSYMA^IB1c@$rUwlnlO^?3lZUQC!U0ugw%qB?@=2_>n7 zSxZe5WbyPh>Bi~nD$R|!eT;KUb#%pmt7C(6sa^x6FPz%lYTrszC~ge#w+|XzSiyZ6 z)2!47EuWFVLO!@%%bA@j(8{gqjC{gfPSn2P_2YH5R#Rp7R5Z{k5$^t;Vzg8L{*!KC zakq@b*eSq76`RSG487Te2xuRCgmIgJOLDvXxGKpg70B^5GU}%E@9>Y1X^`p^$5xl{ z$F?G28w>%#@fvMJslpRN@t&D=cw-GnpH z&kFJ^EzKfTA=V)-I`mqODC);NDP;fT7^Gp$z+=61>Y5Zz+&k970V zZ7qT*q4mN%o6J%xDqs?S3lhZr$YGkbwO9r3nymBG1(^MKc*~YJJC${l$!OGe6@&Ju z<(nn%_Zkqh}x~DgWP%OT+zk8 zf(A3L!b8tl8Kjv6s{r3YLBIA$n8jE&Zs8q$8$uI2O?t~T`ma-3_A|j@eN(dYK1Cih z0J69PGel?(y9}`*KEl*~earEzB&3;?VCEq3L_KS=jy9!#EVF&aGHA>(m<-D%9L_3! zi@%`WADxAsJUQ@acwo$BrfThXfQQZc2)bfs1m{=h15!JgS#CKXi>2B&<`U5J1+t+JJvNV z?6!=vrdXEsglrDJFxNitwsp-t+dExDyIPn-Lt-mJ?~Gk9yj|5X*J5q1L3>MNuMD)? zrW_QtrY1U5>i@V+ib7J(aMVnYdAlyfW(8!t)UaCTKN7EG|m^D5yam9Co)Jln{RyX8JJ=v-mN=5SySy!9D(QF&TC5>!~%X*(}u%%+3sNDK$GCvA$_Jxju2wpiiUi zV}6(R_l-dkR`mT#?mn|ut zyyP7ib{5ddau!Xf!|Xslmp`9c=?wY$m{b2zI`e^pvow&9kzEvh*j)?AJrKNRMlk-0 z;lBv3;-hgmpU6bLtIfzFg=|E}e9V8je?t-GaIDvEm_R9u+DX)8kxE1nNY%0E4UscK zLAzTUYS-@=4MhqE7qyh~&Z@`5k<5nbxgJsSIQq!pV=o>>ZBq@+Ep!{gco~)AX$VUQ zYUm0uh~<5WZGrW>fUD4nbD&B-=Wws{G9NB)F{&(e#5+^oySy!c3a374L8Ip6;OAy_(_>R5EJdNKp;=GinV3#G) zdbR0luroebucjAu%2p&dQwutjM;aHG9J}S^>?Ue%*w(F_+Vijm%BB>IBAVOyX1b2` z%~{FmlC(vTlp*Uvh#aLTRkqu{cqScPc0nzPXHh~~ z04*I3a-B`>+>(-g_*bc)vv`;55hcYy>H4#XsAwUoU6Mele-e`XrO4l0jO=SqlYUgZ zrD;K z(@+}oPa0REa?2}CR`+q|U(zXDT+(_7Z_|omA7Ak~9>Shp%Ea^FNVQOdA-efD6)i%N zB&mVQFTi7CCqDzFFj>6yH%k7|WXXmIIjS2J7@1Sc4LgU%{_lNfAc_TM%F43MDR;JO zdr0T=+VK%j9LY?`*3`q=FlvuxTHHxvOr{U2ZddgTn-09YZL627P87?B;#s6gpwPq6 zFzFZ-yEWMqR!XWag(#s;PI7`hNALVyhUWH+lngKDi`ikY?ZJ;Vm|d#A#wy_0F%7(N z*|b{+fjG9?RZtalH*`(?By_L5O})tlsa6OD@mAAV7%~c9z6%Jcj1>kL?_3V~x9K=_piqhz{-0O!c>@lI z+a$1J8*xni+Io{|!xsDRF56 z^b0W+`la9epBH83CI;5d=CnrUCPr3H^#A3F*2USv`ak-hm$24sH%ISu_2!7OK+|O? z#^3@&WmnybH|;byv<-_tS@KjqY_k4VQNKDiSzFwIq={;MaP2O+|B_X$wMh7h zF_}3Foqiy)8+_+ht96=wsNm64!G127PK_a&PcYG~mQ1?dGvMJ`Uo*%Z+?#08VeuET zR5PveRaaMMJ@~||KET#$x{Ob{@|-@0w5SM0duK(2p|40}4_+Yc?2~mQ3K*qaBR4yL zi@(IjoQ17Kud)W1C6e4-Y0@md=!%Aaejyjhk$tAo5b~AQr=EMXTyAoayoMROHZR4N zT2euO%eV`zVb{uO`P5KrH7O7!%r&4in&>i4kEhZ*e{kAOPk~mW9fMx46Un7=U7%hj zxZ~hdk|@&#NN)SJSCAxqcb?u|#(P?ruK5NVuq%91IE0{k18Al0F z=qi7>ABSk5o`nI%8r#b^ZXLvnFOq#a|Ga9?Ln5c7zXy%_M*{vK89$cQOWWr_r`E(X z!{1#qZaU=E1*HB^L4`qkV-UrBL8gQ3IVH%&@WH3?6L-9Fz~5I(zQ2?pT=Atbni$Bo zAN;vpjB?nsSZ^#$DaJOrLHNe3t>WTJ^TaiG?bHFR6hbry31dIOWk%7z@y4pnQmz$F z`$nRBEIMGxlN9g%o?v4J$;nB2E8sd8!sZgvc5|^03o0KAFw2oukcw8-WvSMG^o)#+ zMM{99b<&40S0(FUN94i=42D{K_C48;v1JTE&@AntU`kK0z|x$CJOuJBXVpSU;jaAX ztSEwvB&ZWynBrq;*60f01DucOxRVRBtbGA6nh+n>{Vz#?>^h zzMB(&CX=bJ&R~*M6E5hxbjZA}FkM8G_Hui};;3GTd8)el!~9F%ZiB?(k+b1Q7s9(# z;*ds^ZV!-|5@}4d)#`~nLQ-t-7$LT0QT&iv|Mu-D$>iuk%qdqIkOdk8tU@D4YDNCD zrupxoio8(^VIK?x7P4HSM~g269cgOKGhD?R81J)!KBMzIQ~4^dY&m4u`aF?S8unZr z;#!FT#vX>}6tm*5jXN;s&eUwe>W81@z|OK=@Jy2d;WZu~!OLQxhCcsIUHp zKxFePo@WP*`2*Hu4GYq5+FxXTkLk`bM2byBPQr=qTdIIZ5++>I%Tb&w$sMhU4u8w! zfzHR7Jf%ZAUqM>u2^vYA4MvH%#USmS#NCavk%c8%Gx3)cia}ct=p4Z@1e7oOh%4Et zpy3o>oBX1YF|V1FJG#KF4JktfL-Gn+&FR%@qo(?Xu4XiWwPLd-z;3cnQr{i8⋘- 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

0xq!8TR*}F1S}yCn8-V#h(=}x7;n_tCwb23D z50o;hv7+y+a9VDZ)R4q+eD3CE^oH6v?ahL(1eimu3qSzoS}wojkP@P$F=|;t++do< z2Bw*&T9rOa^QbKrfX=a|sLn&BQ?1#f3c}TOP8t>~xq-~LH5|Cxjqb8k=nU1#V(K*ON`A4d&Ky$<$F`56>otO|>b6*E%>53EW;_;OE|+8= zujgZ1t~MPT39Ne8sI_<(%7PU_vnz%pK|cTm6GD9@4{R(gm&kQ3py<5gQ)^djnVS{E zK%OJju$y7JXiEV?#u?Vx{M7Qz`D*NjuIq+UX2oR-Di|h>(Ama%y_)f3uA6JPOli98 z*2NBqAP%8;@?azM02{Lu+A<22f@g>=!BiDxBxxOz*m$E(W#lUX&k@;CM#)X}hOk*= zP*fhsrRa)X5#%2dZfZV}cqrR6YflACp(m!!I%1CmyYfgPzKpOmSlqehD2qs_J58DPy zH<${tX1WyJr$E`yG^qQfwJTVSwI<_8Yit!AhB`5fAKnU0>xuf|@c4eZU< zT<@wVf~rJ^eTwsAB8-yr> zFuY5lAzs%9s3!yQ?E*Px;STA07_jNkfCGAYwOXgGVO?p6-l$ax+hm#%Rh2BbInwGN zb1V#P98gcdtX!R7kOh!u?Gh@s+QvX+;tv!>(~dsgP~LJpuAu~tps4Ap({8h}0Sv=7 z{Ej&X$VDLTSz^t!^ffY3RKQqWu|jN+APkYT5+e0_9ci$nHEfg^+t-Lt4oofxkr~ye z#-66~V_yTCN$K!IP6I5x?d@*P=e>h$wXmRzCntC!Bv2eUPZRvh?!tm24x05f>tz-l>IhLq zf=iP%O)R$vROxiswb~#1u&FsU40)C!X<@`8x)AU=)9uKL!$}_N8cl2%DD0+|W(kHx z?FAv03|7RQ)g+xxcjoD|8ul`>ParHi5knTRJ?g0h11wa5)s~j(v)SdinWXuWT9V4z@{aEnugZ+#D%(`TIw&WLm=^SewM4^mFZ}l=|CP1k+o@()OtOz*;Wsj{afIYun0NE(}FfI)+W-6e2#{lA}he3>duYnGJ{A} zgaj%hAJQw)C#Zms)|2L{gAp@nuGJaVtMD%8!@jp<3fF*eH8T_@N}CzQR;;2tT~Rpa z%nH3Au!dLsWwypKjWvmFi``(nV2GRU;U8SneDQ%H;oI#Fc z^bLv9z_v%%_^N@^f#dYtMztde3qxYEbm-W#Mg@@AL`IFF%{k?DR+u_2Q*D=VGQg)2 zQt40WYTr?d4IZ00Q^l8NO(#c})_DzBpF>S=W6r2iF-JI_ua)d!Un_>d)*4oj=2#Td zpnaWRciTggYd7+BB-8EJhZ5HUs&Q;_t}|$Ay{3s4MqG{Svh*~Z^yrdf3nAiX91k=^ zcET3$ovXT$LHP`WqNs$*X}{(=<9=$6r{~QPFFkMdC>O7qb;How0V))h`pWg# zJ~bR*q~1q*$dKl8X`@oIu85ki6#GxvTk>$Ej z>9u=uhvzsZKzRkQAE{QRAw%>s-eL{(WV*eKeY$Ly87*-qCt->j&Ss_bYM9AOvlc%t zth!iN!TUUC0bdnZZggFz*DHY5N_J3eJ4UxE89v^YM@vpFu3G8Lw1!*VI-b`UyV>P? z*>sCGt-+9*0$uBF{6c4xCXEp24a7;)8?r*U>(K4^G};2b2C*2|0@9Q%V=&exe1TDy zWk3)ky=N8I_*@^(QAQL+vxzErkK_k~i9MoB3wLYM1P@(a^jky*HOn5F+j#9F>I%yN z-B@<83DYTcS463AhKggXF}gHs2z{l*>W=NJeTHr{n_RCYFC5uY9e=2}Gn~pZ z@-Vaz%1cW^jj2#h*d3@`Nmpd0HL`Ki>zH*(E1Eq-7^Jg+Alx)=kvKo#YmLy!luh8c z@Lgp9*tJ-2daEpq0WOS2)!A%>9B}@yMkzm?W`nlSs-_1rV@$Y=TkLcY@Kg$ot}Shf zt5P}FUpW~A!3Tr~6kw}s%tYI<2I-^KTH z9<<#}$1P_zcs)152t*kOz}B^GqQvsRwrf-4K_9iJm@uibtlR^77a*wT;ey>~>Vhv* zSV3C!m|3x-N?6->X4Or*Lvo8kZvlK@hQT(bE-UMz<>~p3;x-Xr%6C|tK@dR{@%1Rs zL>jM7g~32`Sb9>Mt~zxhO)W8_zcI8GuaW^UwkSrXJX#hUM(722Co^m3mf0yX%N4=D z*|A#5s00SaNcvq4RPfYn=zlQEm(yS8$fAxYg%cDX~ku*sSPKF zISuUcqEYFVu$o7T1YO82+4jODe3m9Wu8qz0kx*T;KAE@EPO#}xsz}#3v1bjrfD~=a zZBgZJMw`zpEgyKc(5Y z6J05{4a-fQHo*215+v&KlJX`v}pxUAX%zAjA_x`Bdt?gH-zEp5myoXH6IeEw!4 zPbL^6yByDmb%jKLVM8+=l>w%c8PKf~(5tw()_eS-!Zd-OHiC9A!PIn(WaS3pi?wk* zpXZjO+3NQ2I@c(X(g3*JU0=hMu%&UtR3DXK47}b8N*fi2wtO#3a!i-z3}9hzdN#jC zXWEd+nagSxm=tO;tWmr{&IP}0uGadf>S--*y%+)y&>p!Xx26DINEash+U`#`Xfr=_ z9M*#v4@Fn7$s+Auv?y zolqsZd;x6$C0q}N>28i^xjIVa>$!Xg)dt;BMjvCczNzBfC69OYvOFS2l;Agt z(3D=u_GlvH+#+bFWcHWqVR7yYh&iCpz{Cba2Sfa!rsRq%zFgqOwpJfZ7b`V0sLv`D z(=6ur1&RdIIY*>5pf@Y^Tx(La1J0QBfq~wTRbbIGq2zY!^Xy2>dZRX3fWG=HB=B(5 zYT1L(*iadj-V{r?&S}*}yIg298?7O3c)i!|qM(z6w3&G8D$7ibd=_g4d1o*}`G6bQ z2GPjPfSe$+$U>Tvesh*-PrKuegk~&(1>RRTYatFor#CaC<9SP5;Y(6`DzIxFE6h=> z(H5jZ*~_6BX~>fj;$SF@#G_1;&EiENV+>fH$#2FaaAaroke^q&oqBneAw_-DMZ&p) z`o-c#PqS*NRI9P&s)3Tgs|a`+MgvR@7B4B-YUw4saqy1JkJYh zZ(5=%Wyz}J^_AdDfZ}m9oGzRk%ZHs_e~6W8xlv)XEHzeK5$pFyd3|X+^@b<6hGTYF zOD_b0UN@a8#{i02S4Ix5c5vPwb&F{^+jTQJE!9;wc9G6ZT$K=Kg$XK(NlZ$wrUh*V6F>JJoItwQ#^eDt!&&sy#a`j~} z+in)j>(29iTM8IR#@TrW#>|K|BL^%=(Kbdl3AHWf zTA8{H>~UJlucttqY-q~YRk32uo4hoo%*kx-8K6!m`aX-$BGdu+Na@XRr^T`vZ|(b* zuL3=on{z#ktIvZ)1|P}_0(hB}WT|4QL^uITz@bESXl!sUJ6hpp-k)|V0}JC^lANt5 zdY!|?b|~P?W{{(R>YpJb@XuJnWq~Ljw8=`>&_N%)4O`dyEUC6Sgg4hqEurJC*K1UC z;Ub)sK@ex!pxXWz50vQ`3qqG+8%VG$7iP<`9%6OiH}*^OMlajVWk>mG)t2(b?A!uY z%xuniMSC(r+_|xu%0am_v~ps$i*SCa&>htgT`Z|huu^B4BIf4=muOF&bbZ~n&50nm z7FNs2Q*Ny5b(=yDGACkR%Y*W3ZhjjHpq$1?LYAepg5h_aKOYw40X z=P7I1fNlUemfB@cp77a{rcWjmMa>pGSCX=vjp!RwYLn<7VRDf ze3w#Yl`Uf0G%xoHmL!)biziLAkJtMpG7}W~`L4jN@Rl(z_ECW&ZI$9w9df zM)pmYAqm5Ui%0&*Edht1kuJmjHvmVfNFHY?j^~XyHp9pczNQ;8)ca(E^I^P$FJ*D5 zgJ$6R)%w6u9oNF5y&qDRQ=> zgXTjK*xb3bT}81Rm@vLjTr~$kRyJnoHQUzvgk;yoQ)CRLktI7U5_0p7DqDQ&n*?A;tN8pp>b>5b(Rb7%>yi6HD_I z?!xu)LT2vepkda^j@y;;RPWopWmoBhA&M$J3lperU2}k$>ualt=g!=)&@wmLfRY!y zBM(P&v5chC-3hSW))SI%G#b1}lDsO`CbBdRLf&N*dq}H-Q7FxsX1`Vh>RvD8HgIig zO=V|O5}C~H1(=l0#+nZLbzBL=DvTY@8AJiD4I_YWjL5k2dBIdXIUt2re;rz?vQauE zjb@e5L_90o&FATCzHh1n8)E~OWhvKDM=aeN+iQDVBO7YV*eIkn8@dD#EFsC{y6OO^ z2879IfIJYE0C+Yw6*EVyLQ;l#1?_@{%||nxEW5MntkGb|A#aj6H}Qb4B;bPFG&m=V z)rSBVBH8maKv#`|jnQ(n-ZGw(1Pa`_0L!^8U^Wk>b}7G7+PE<3E&MFU;hR}+YD+>c zC!0fQ(j)||!-qrwY6#t2y55%Z)n*w%L)&fPy*7`oX`?Y`S>N{|eOARL4%cKSGN3h5 z;z?uK#1dzR4Beg}hBauWr{%>xx*O(?#&StFfMxzuI5WrDBg zLb*(c)?}0|I%yrD{jM#eWuM{3qtImdAqM1&q;x82;5OJ}H-il)UAQa(`tE34Lw5mv ztQCc2m?7#pgIXGG^h3oPF>0G}H=BX0glx`sdKEI0kz`;*`$#5(k+_44t&P(37Fw@r zP%2*c`3+6X7aAqh$h=xpy5meJ_Cy8+R8h;Y6MKv7iJh8)QV+E zS&T74(U|Uq6%x=6()1+;*fjum2s-hM(Z(PUgpdVqH0fBI$Un;3g51}XmePdMnp3&tFB`a)8QnL z+vccV!m@lQ2t<|3X|Abr`NcRl=5W`Uk*iGs&}K(y6Piz(zC8$xvD`9NW31t>;M%oB zU=>&B@Bu;)M7mDMO0CbinZ5vMp^m6T4`nilLgaEQdI^0doMGF5VOgLUsxUykBHaM4 zQ!&d%D?~TzKARWlj^pXoVK5aqo^3E#S+UubFe0o_$oX1%#kS}$2pnfrCWH`WfG8tP znk4NeC|oJ9h}z1rPODff14|~|SO*jt;&dO<3zbCrr%XD!9&c#Jf=!C#qBOCxgJg~1%57Sz%FttK##hU45HT3MRsUS>y!>;4z_TEsnTw@ zTI{kk8deLTS2Sw=sARZIQ|_0i`E|AwOgP(W=53iOn^wIW%-p4-`lAp_k1T(oOj-?l zj8(?&x^6ToYh;tI0~u&Ga>Te=$}>(jTr)+vUSViKQG?K{*r0_pOJcV%8MJjGXM^4qaCEN2E$3f(Exs~I|Ong zVDkNy0_MEgq=)q-2Lu{ps`hm5FDq*;?M{8KHJA^DhKb`ka9P@bH>c&9*lYM*k_^g* z;A$l7JpYvQ1{w?GA?)40Xi#Rm^G9-A1|z99lHwha;s1Cqn8+9`QUW=8y&Gud8Q6%oz$D)F#ZznrfN^(r$MG!gu*mrZP1B z3Iog|bCV91LoJsX3azql0&M#7v@jep{Y+`ZbF$m^iJXvwYofNhz_?OtgbaxS1?>-M zgmu($y6&3HYSmK$ze@L~c^jBtgEc^DQ*&rm?vWnGiw>d_Dj>lQ7KRvI8MZ6)Rhrk@ z{Z?NYw5N1tjCXOgj>&2{ zL{+FTd3(aFDA0jcH(+EK`}I4BvmBN?N}eQSw?Uf2oZexEOI;B{#S(?Q%5u7ku!A-? z@lCpw2Zjw{va|{uMr$#0d)9*U)hWLyZBQ;Fj+^~OZy*7TvkIy3bR9ULzQ{F&25U{z z<9Rw=k_V18kPTAAQGVbHt7b(F_=Y5dv9#s}fp!09qn@{H1&#b(cJ1?SuxaRPL}e%z@LM^|WISM#&HKPq0_r9pT%MgkSqr@30Ltf4 z0}uktm2wS5+CVwNZRq8QX^nsx&=P2<`+VI)1i88((-{;EW&l1dy95x_AyYw7pkEo) zoAqQx>x?p-;ExcwZVnJuRRece=a5=a<1%m!D}$22Uqx2<9N$pZ2BkL|mRg-M9U@lNRjj+5pgX>C}iQtpwhH|OMHdINpFq`55!tfcm2Hzbc zayKot5x!w;+NO&+T*Gb3FeYuUDc}b)8y)%|3*ae}8A5DjSm>#U{{P3`d+j=ov|EA? z#0z?NDNm6Uo#@0nTG4y|^bX;!+8iN7 z&M-UBR-rHhc0UW%j^h2x!6K~p>oVV2rW1Hi?>KypXK?{0(~^)LYy&a?`v!@3z*Nc2 z+*w*w9`l3RCJr@Os{fdJQ4dOt0-g+v8x!6d?5|s$gKb!raBZUApZP`zlgOY# z>7MAJCd~SbBA4rx-#3_tlkzKh z!3DbbesCRqx@NUtj>L3Z9-g@f-gjswyfJO3e^+v5eGQ4^@#)eVlbfcm&fkQ|j0!LO zgoe~BF5oQQ)95dqzk>ZCTZ*+BL}*HZ7EN1mcG4N<(avE!wW*Ex_julOyx-)CF2Z1B z5lp)E0@??QH35c)@u_to}Z#tf3MAiM`gY|J=O=nFTL^ytZv_z!tefQbOs#>O#jL?F##|=TE9C=f#kEn3HBD|f-mO{XA?ijo&`59kuOT^;@}mTQU7{Xi@<@==B>J!b z&b~vgL@^drsb#b)kUs3rD{Jp6cNSM?8o^C3iu?KnY&uB=!>2^QzHw2F@I)g9KgFG_ zy=i`P#;41#qLsdjYp0(^N_v4!iJg5_zTOE=-1VkckWnUe#n&gUQBIp{=6BNYHHF>H z2P1VC&Umu-dAu_SU^OYy{wSA7`HA;3ZkL`CP zAl6(2U3^I{Pv{=O3TuNFNhUKpUW?tS5%&F;>oZcFwj5^#rKi?4IJxUSao zOgd~c;3ZpdBYf6f<_AOej{j};x~j}Ak!bphlY!J;+W0ePV6oU7Ll)F$`$V?JeGDdS zcG|usZ0D@JNOdf5-F5jy(KM7SiZ)Q8oWGrVuEU57^PSrw{@|>jN=<*lO#RP((^*b@8YL;>PNw81l+cEO<`b9Bui@uc0 z+>wY$`9eJN&9W3x;5SeELWh-2Ue%QMNh$n@g?VQ?bWJ9{`^G@^Kd3#AWf(7~z)3jw z)z*aCm`D_UL&Oj#1{dkua%;_X+^vg2y&rG(I$pUDXOyz3x9lXeUqvXs9@#vsbBx`s zz)Iv+--f$AyAm?1AFMLHzR3IXyTs)ef8Ccp_Z7dJgv*>iYM<-cz;2bZ7@XXVY%-brj#0`gUL~mwHgs1{dP7^WFASw!yfm$%mwe;Z>i zOk$SE`7Y)x<^GC!ZM1Hk2tEG`*qUVD<(u-FpZ0jSs;TH7z9u`vUIrDGfqyZ8IeuK@ z9*TF``QVSYOZg{2zzNFsMRR&`JL=Ho+$2nLwKMR)Dio{y*V$lj!A@J8CeId`^S#{9c^Gn2*Y~7qs&j+H)48fvfY zr9R`!8f}YDgVkw2K=3Uec^j?>^wdA{48w5sYP=M0XYa74My_@D`Z$lFZ6lQ?7MY7M zC?dx`PAh4`Ohb?1etO4s(~YUUhxxd2ThtaF+R9z>og1(#j32Sa715hQYo9TMeDyf_e6cl zk?oF}rrc+d8@JDIwhT{rj0S_F+8ZF;xED6ogfI+4ONA||#FJnGV)>B!a2k)dQr`J=?Z4r&d$}37;XxNFNU6QGw5lypXVukmd!*O zgNz#u=6QhlMx+>X{^a6pG`nuBH#*%VWpj~Jt#rtjHW zTvn-ae~cvPy97&D=$+)JNK=k%b7ap4^XcNet=+#d-$<=Y_vLY~4zmP;{#@N^ydsw2 zUu3Jqzj!yg`)&d8^B7r&)SKt66kQu(RB48JC4H-0Dsy5a#i%ENWTP=^i@PaUa^8M> z7z=I)@AUI+}`v)SVuhfCtyYoAO|iQf+b+;*Hz?}Gki-3SIzRosnXuX^PTkUtOnOT#pq(Rw;SnYhmDu-4 zHSL-4H0qKvjhtjE|5F+7%0zXyaN|3?EH=U>9~+O(R2g8c`~(<~ukT0&%h;(TX*c8 zO`C`#+FE?tLD1Lt^3z){-zD2g`LNi`a^%*`iR}9fLcbkmp5l*>6Rayew&>0@=brUj zV%R%?ICY!&bDqa|%NuK36C;TVqDUh*G{7#~r_oN&=SL&Ker;ENqr;iskU$}jxF?~{ zfqhk`#tv1Yfjta;a6HU|c9^~9V>BUmT-#uM8b&9uE-aDDjZU6Cs$H*hrwBRC?ol-1 zJ`%?Qte{Dhie$moCl@-LjHO?BmjjPWU~Fx6dFazcD+`F+eSvX{$YJQ9a-~wc@w{@r z&a(^lRK&1zk|YS3 zOMh^r9oPfhr=<}FO9GRhM%0j~WP!$<9{0;=#~B8Hy`G+!G$oshsra3c^ebmYRinT?IL zx(C8NiiqtFAa$R3_dU)JAYJPWeGxQkg#POhYrZUWF;SdssWcZL4I=`_5?IK)^`!eO z90}2anOxC64prew#%l^h2dN%>dn|>@SP(6;1GUN#4z20>Zk^-b|{qp9ckF zoOIL(YRckqJnk?K!tgk278y%ByHN7|bLv<(^Z@f+z2v)m6jvMOCXP(<#chLwMQBKN znDn^H7!qp_Di|*$<1k6hurCDPKR1;{fz;$sesnrJ98nV1s*G6VQg^4n=U{%oq>*5m z>#kKf6t5r#C$duS97@)oYiD6TYG|!~WlppjD?mCd#!Azx;+h=NB}Xp9tFjGXg)!Xm z%5(2^r$V+v`YgVc3+~??NoSNx`Eq*2bG^>3CO}|bM0_#I>xF!#T4{L}_%#>*>MqHF zqrnr6?bw?{44fFrMU(Z)oeRrP)oUniwEACoG)9amD$ZfiBRy=wHQK%{GDR2|rK zx0dN#j5-O{Sz2E2?DUY0^JNFi7LhLoOkdk}^XYhW3#R&dMi;!nG#dKg-I(l-oF`2N zhXSnz>-&??NvfYHwtbZb|ON7!}``LC_D-{n&wdeU-jws6|*OG z&TjVgb#>Tj3(i=qXGea=t%apn9&|#q+ic&eb&EJINzgTQNwDP6ksE!~N0kIIZTb_x zxHXE-cyzlH<;Tz|9`hQ%7NwIK3AATpb5&W{t$X^d_=eB!p2e^4z%8}G@m};~hUGaU zIKb$*iTA8ALY8X)Z#7EM^k%Z!k9w93r+MDCT@oM8(ZeYeg7k3#?C*C%CN!{d_Rcdl zK$gr+rv=QRcz;0O!SP;FzjCjaMliqzR*ihm7Rq1F(Ix#1%t>zD?>XxGzLWCAXx^U) zPox=eVCfv2a+%@%Q9rN1pwaYI7uX$vx?%e5m(Jr+59d9dv}$(bdz`h_Tf9vXmk%A^ zJ>T-y^HegUe6&X4PJh>iof5IY{E?=rJ5E5ic+ih(XoM63>35kT{meWg{ zPFEV{>Cgz9#0bJGwOqXK31WPBfWM~b)_HnPl70ESgdncptwU|t=c7FEJ_dF;LQS0I z`p;qIA&)#H|>3T&< zHnd@UpNEe_BWzA8uB{sm=S?TafDbcIxgp2<(;dq_Jbl5TxNO#Doj1e$_dBJ_ zS3JE+D_<$ThXJCA(hwMD#?*=DC;(1iNji7nhG8BzI-15@EVcwJ5Q?IT)&XiYtFBxO zFYr5Cl9qq-pCmnoImb`2VqjrBn}97rhNew98{`);;(H#l0qx1`xiOGL2fmxwVIKJO za@_M3utN78vS=eeP7{Y6`28Av7SNau=vj2Ghap1P zFdA|2rv}EM&b1g71QNku9?qT)0$l*4;p&!6!!C?Yanrr{&rCkbBclBb@!#I9j zCvY6VX@}|bxK{71GuI^BT%EYw_=K(K9%mSQeAFf}!xCgXcS#a2E#mWf-5eRG2gnU8 zZmQS_FrvkbFWz}moLpZ-8b#|OP=(7^S}POg1ic^J`)|J5Q0Tf~l^u`3tS+;)`k5r_ zIYNyO;9VIJL}Mt&(Fx`pWV;RK~kO!A-YJFp96YpETqd*=|0I$EbNi*1W zXQ}0633HeL!aLR~nM{g^Y99RpJkJA@%6f3l14Sy{wx1cNGJtT7CSctFD<_H93z5!5n=>CU5Rq zaymz}lUf(DKDepRz?iLE?eXj|Kq@CFz!ijCS3u++z?7vprWe*1d=-KXZZjcl&`g^QIn|f6wUUQE=}Pe|?%}*h?W#SAu$-&KphfF{6{>*2~j7*IQ;?&jF4j zmtuEK$D8$Y`hxvIdJE>GnKSJ70l2mFQ5@Y8%jq*B;||V?-)7L@v+ZYcgHA?z3fRl* zeKoDH$S2j(Pwfgdr=#y4$6#Q4J5C(DDj%k6HAJkPzYO=_wR;z;9Y=y@bD-}0;`|4Cs^5aA%gpQLUQnK#C~vTl;9$SkB`_LgOe=J zA}g5;geqvGKoW$L@HqjBigO8$<-d5Tw)HFKM)%OYao#PgwWee1qHi%1;w_%s*Cby`Ci_52Q1X zTTS7fIlVB&LGLYJhy~Pnbo_Rk+YN?2yF7KYdAj0`1n7CR6wLzmhI~bl`&Ho~Hn4Mj zT`^#>tm<#R?ZB2h%{K3@WCEwY*}JV0&@K!+d(=`#1IP1hx)oW|KcWb%6J7!^vInqh zUuBJ;T0QPL80|BkPkl}?!uir@T>nb3RGo6{%#HxiXae>fsRf1ij5W z4v`RH$mV)pXp9K5Bmc`LTAYcb5(oPFN`f&aQK+}G)So{6x^%^OVrpG&7c8&7*DhwF zc&NIUBGQ}yLuz?sW;{Q(eV=XXE$3`sTdgR1&F!%xNkrM!-Hwo?ySxYj3VMV7e7mpY2BBOXuF;K~Da@n}7 zdh?M-g8g*3sl~u{aY|8oJB|BGIDn zjn9+D6%CphJO}atALcK(j+nLJ%u=m0bFwVYu_e7Uc3oF~8U{OrX12bTJNOR+&rE^t z{3#ZOPzBsMnEOz90_tlJ>d9u1sjA&iz;Hm~Q=~;Pk&h-MPinx{F(1G)`>bJ?$hhC$ zvlFNlg1tiKmvblUR3&Eajr_9?C;u9C_$4P3lw^44HP-t%{r2`u@^muplbpy(iYmu z;ag=gz(QPcb*@fJ8}@@h66C3(pCNoj`I%BG{CYx_JK)Uj^?3)lsBBai`IsN6&)~}a z#-=*JF4Jq}Xh&}*KnwA$r5PqGd#rnlXaew+{@_0E>pQNB?;D}g7%U~g-oa6$oT-1u z(``u|oT7p}X-dp7()~RE68t&(>b;*eRI)*j5r&L&2+XIijDZn8-Gy$uE9^OTdVYH< zeks4@z1&sz`u%ESBEB`vcDfDPvS5^Ef&lFK$p2Mt&H{|&^IGKDukPb}H^dw1;w*R* ze~c%=L9!mZbO5OkRQQr%lofAJ3pw17VGjuQ{YXM|r$Te2xW{F9Ks$4n>P+ z*$7<2X81UWjyxt0XGU*ed^R?W(~NXohwQMHsG9^jZia$~&qqe=!i?@EIYAb%oceGOoLy07|vntvJ{cAr3_ zS#2VNIq2`z4vBvXvE*6aPzvTSpaIlMtOPj8x1-Gh@BMrx9$L`#tbbl%xW+em6l> zZL8UmY`Pmf?9T|+=5I|7SeqQ;4LhT-{6KJWI$gd-PqGY;kadrDgriI(+7UYx8mQBP zBWmv_%?22L_i?|pgYl6W-M@&EW z)89Y;^SvR>%Od^x*}JD4(x@BxtMMjEE6-qgoH$JXxA){TB}QHb_QV8WX1bK6)AxU$ z^}j{^lGW?VWA{F=#S8mt`kpm_@TniLFV2lXB3R?-NMMEh6+oQm432pB`OEj~kl~~V zD5Ah5N78W!1c$kK6KOy4b7rh6_rn$O9Nw&B+%55aY1-oobOFFg*!hz8Yjfqnn$rN{ zECij?96=s}fNZWyGAs16;XcegZ&{|RYVz?yY7X&%EuP>W922+4`SIvi2*;ldC-%?$ z6~-Xf3;Rl8PuS1t z8CN@x&Vzef@3{<%*%_FW&m#$KGi+25y)9KhHm3UG(FigXMdEV5`G2LdfE0)QQtzBp zox{OVu5WM-=PT_cPy_e*F5hjy^=)2j?FN{%^n2DDYk&>w$~s*dcZBr~u-=y2SC~&v z;5bfB){ep4If6Z>3$q@&FPx0$ggB1FfX}h?M7lt}6mC=NKkfW%?8ERBYSTI-3CxyD zz`6_q+A)NbCf6K^(c&YRr<%+R!=Pj3#PMKQyp2wfz@k~HPY?X<1atnd^os>kcBY8lXnPwd+l<=X zz?fjOqW%tPEsMZBZ4Zh!HU__gFkF7=TAvaPmKdTx=O(&5etWrF0kH-$&yJD+STWO; zNsrq;l+#6L+S_iPU0DFZVDA`G!(ncZb<{DC48nz4j)`Cklb}|A zHM@#Gxj-vi?)Ku!u3=DI%tnD+FbyWe*QN=KB_g*?%1++Y_V152+){i58^|{;9+;NE99H^_HsW)we_=z(wO{9L`wNF7p3- zTXXq1XC3_4Z18f(XWcmw?>I4p=J%cIHG8hFf6dSHq+g`x^`E~3)A!eI|HkwDW+&=j zTXp*W<6}OC^Su3|hknEP_2~F#I8XV%Htap0{+B&_Go2?2bw1v&)L@Mk*dcbOJg&*y zwlu0vGYf1gKeg86jswuT_-p|EJ;FN8(b0rFb3Ok1Z|~x!h;Cm5o;PBLeHt9tzs@0n zjsmR5ewIGpVO>ndvpF}gtDh;~fd1LveZUi}-Lf=|lcdU1&|Vhx9{h_Zm)6DJS4Kh* zq-&4AiGK9B`%*-=lfngZ=2p{RvnD zh82?oxetmFW}*MPPKC7WSfUl11AB})z;2DiYIhT|SknEJGxYZ;@&3o{XAT)&PfOIMA$p16(0?buY2x*^&ZF#*4XY| zgAXWdb%yS-0i>|>uq9i2KB{D!eluLkq>C7Bv%*OVU=gDQy@;tVJd!vD^IaGK5w6^0sE=@w(@YbW0~L{&b>TX~Q^eq|X(QuTc=5me6D zbI9-qiC6Ttne1PXPd#Utx5}^%c2s~C#Aj$fu6-97Lqs=+#X@V(@6dV^g=?~n{`g2g z;|gv1RXk&VI56Ngey2h{SlOqB+#{lpg=B_(9>@NIo}nESB_R`|Kl*VSw}M1btq*vSFoE`2I|++7@B zzyZ|_SeIP`9-<5@uybW)qjU-V7D@#;z%xS*zJAd)?+<3YuYlhged)I**Z^p9#7$*h z0g6kRIToDKafJFGohPt8?d|J^_x(NEU1h>NauU{?Fw*w3C6_Z({D}cS?~Wbrl?!{e zujT9vl`S9j(Hj~m^MCEL^OiN&f$Vn=`oL9w+Pu#Ysjhs3_1r!V;8cG2iUUix zH*cRJ_jK&1G#jr+oLP4-R+n7?ZL9P^t2auv2?mEb2Ly7zq|UaB#ZCb2f)G38#}hUC zaf~o4Ff7c`_x{bs_MySfV0qL0cn!t6VV-p_@_TMna{`Y3(bqTw$L}%CE1-ZH0ek5a zBseT3jCJ5KGL0j%mK*(n&07zf)Se{l1z%shbby-y4YX}XotkRqF8}~`4@8O^vDC+M zS(q2P?5=X~jPo=7JC?h3$3mV6joF29OQ!nG-|f^MvFDSd-~14*-_WbaMmBU=!D?kK zn&7-u=1$_Jh*9BN3W?<~J>ScCJ^DfDQX@4vx-2K~ItYSJG>{o8uzRqcY+Her+K(Dw zXF}sSRQdc^%JW-|8hGIa;1u>bx|5;Z(IJr#L&kSZ1h4x5=bKdk$002fY_DS@eE##9 z^T=uW2y5!tIAXZi4NTLF=^6?qrv;*gQrPu#Xw$c5H=pBtpTWZ(z3q<`%mW%=6H^Y1 zI{pL`pLs{d}-426zIoG7hQH?{M2C3xvqshX-&ZGOdqdyubqe( z>_LP8ILIupg$+H4gY>iUR%(8Z`L;?+pP_D>nZyBn@uRFhjy%bWfukfth&QhUyT-_N%aUQ4XBE(@vn&lu*FheCychENt zbWOOS`sZgR^vB=#L4@b@)jzMt;}WT4OdR)L9ND?sCR&q2D1i15P(eL@^2fQ^6277*-?6ZBlUw~&G%9M4WAOLKN%_L(T;3h}lA1aJ8XndNj#W*PL}gfmqnsoB1ozza zg!qzjI{b!u$0h~mhbqu1P^ThH=F)(qt}V>}$OK!?VUK%7mF^o4o5hr2Zs`fyw=D}K z4GC-W=BD{1Vd~m1^SMTG?AS_`sI{ihhu;*8DRVEx>o;G|GY`b^-5;0lfCo_nIGEFy zs5_H9;>b9EX#N4-ufR5b_IiY>AY2}KGz9|ec@qJ`%SJHX9>BXpdiRp*W5UV5HO$0y z8O_6HpS-)Ew%}{oIrw}i)Po$V2bBEMeo~$CJ~ttk;Jxf1c$ME=LsGc?flWN z9eD)M29Fz{k5@TH$_@#5=%WUDDBbJIv)^Hs;15|4lEUEJZCS3rz3KdNj+{cO1LA z;ebzMPzM`*E8Sb>f8cvh^jyPw{X4sl$K<}Az3{+ZKkO=Q*k`aM!Z%7zUbBj~5l0fOoa2-+R4uXO6N4dy=}JC5TB33bRckMQmZ{K%cWFes`$ zZ<@&i{j*Fr8RpQ?fOJ|Y{QerAJ~oO2bY z0Kh$k(|+;%;;K*MlT1|?=(jsKW3S3i`#R6_;f=~W&hSwHeLZLr+so;7*du7#j(TW> zx$qs>Pk#w{3UrBnpvh2W;z@&1o}R+zjAz zS|*?krtcd&eE0gbUw-kFJA1*xU?BxCoWtm!d$@m^mZ=-Lc*p$~(A9Ea-kuF68WwfU z8n6b`a%+~R-CS0}vWBs)8)~p6u)}?cu@H``5=`)jm-RdC+Zzx&)349FGr{-*F5c@J z-X$~Augs9ssf^KN8Y|&?u3-*yJVKuqjlPIKw%VkeHg})7RK6z`@l2`Q_<7$+vcApP zFW;5wGl@-0gXg&0gQJaR>Z~)R!$O6qCs?J-_nl??%Pcm{?7-YrBntyrW9&2gaHZ|k z`uLLEF?QuYPtziIQ};dast}}mN8ziMzqcqc8|=-{1}0!(tUa8BWOy5^P{nrLmBduL z)kf~J6^BmEqCK0Qbso)bIRRbg*ivbAc>NsT#2zirFiFNd(hG9A(UCMKJ4I25NIri4 zg3T@{V$DQ5XffYSc3f)hjkoIrA;1>i0JKmtl5R?wV&J5l@8p4hmx2QN0Br1tJ>tC~ ziq84fb*|ENN4d`vU@b-A+50E?+LunGL#x32N`AW~5Xb^%AFa%1jDdn{|K-hUernAQ zWNJJpFFtcm8tDe*Pu3+sA+N- z@CEp`0m%NvI) znbE+U0BpYJJ?z(u^JoBL^p5i((<641$xSw8{23TShK?KOd}lu}#bkl^1US%^hARD+ zn@tdVyw3y(fbz)Ag+vpn?~NYkSa1-dh=6y=5M(rsE{Z%0Q$)6PUFrRs0L%=;&ykD@ z`D1WL4viv-E-@>#HO~a=kkE&>meoweIrjLGm3#N$-?Pi}oK_-S1vG3kbFN(Ojmz?Y z4N_BxlECb1#J-~_@qFGdOZJ6)fqF?7=5qAC@_{`Q9FiSJK*vAcZ~qiP&i~8xv(83x zThdny=3}WO$wb$TIOhL$vYOAoyrc*Az3)lr!&>Dkzz5npd}dU%{5Sq^e&gXg`!1mt zr7?Z@D)Sa+`t)~Ckb!Zra#cRxUu+|@ZaVGmqMP@vc)PIXiTDijoaS-=!!>>UM=#k$Q;$~(0Tc}0J>yRf zyaUT6SP$mzda$1aiBaRi9ek^lE$`* z&eMesG!#K&;UgdC>1?Fe|KQBl<$UTrp!Gaz!<~MB0pIC=^jR?GIe0!P^iyQEEZ<G$22C-;hMPRxcz{!_4;PpR@RD0v^ zoJdoWZQhaNy~ws&4K|VUmcWrU6iXCkBUo0Qe)Z_0Pt=FZrJ{kl8m1NFZ-^-00e! zfB5KT|LnivhGYL3E4%vtQ?aw>U>FKQg}!q1=!#~uvD_q~QJ`9-Uu^I8pZgWY+~Y8T zJy8mn%z=s$L}8fOT$#XG_ki@`x> z!R_(f19o6tg7lXUB;8IwJO3(e1YjT5g0-Bghjae4R%SX}3EN#&j%?2Wz5e6)vY#07$8X(p zTzivo1exJwV?dXa&@{#bNg~X{9cjP^2mni#G@<*paVlE=;TFn2ejmqU#Aj|SEYKKy z63gLlo|Sj@SI^%q9gU{#bL5k=9?V5>yZx#MK@!~?dOYU$e7^rZqd0&q7$^1#=wpZX zUnY+jTg;P)A%L=m#Bx0P`~Ju0)pc3Kz3C_MtZ9M`h@_`bCcND2Uq^?D1OZQ<@xUaeoxyq4Hv4>QyG(e zngE-F7+(JFgVcB=H=g(&9K7iQ9hLvu3y2*E8UWnj55KD``%iK1S4K^4?sP$5eWy}` zGoS#T%|v!rnxfGxpAYPDxuZ1)@AGt8aERaQk^5yrf4a8E@8NijqPZ{Q{__Q7r@%l^ zxAztxXywxpC&d6u>#1f*Mp&b*;#UkFeGEF@7RWhCuOR}b2kVKD@P44w-Q$`>5&y%X zXrJ4it<~R>N{+c#-}iyS4p>MPg?2pxCfi?}KAHs2mkF3}9yv^;mKkh`ILH7q*%s_| zfN0LnA=)jiNsZwj6%b)GOWte(*3io2_lOsrZib^O!?ED{HH&ZsC>`+4s14wI2~Kl<8|bzKWKSfk3hxRdsC9pojiPj=t@D+>&F`?pX=d|m{=hl$%%y>< zgh{@9e1IFCh_e7jU{BnIlVg*&8A^vU9K_G0+@53W;W6c!;pyQBx)@PDD(%D1^$TV zx-7YfF-HVRZ2a+dPSuo)znqDSo%K-K?Qe0GxHR|B{!ym!I&uRN~-o zFlU(g*_o3tkODZ>TCt^6(tC7O>YMc~n6C-f_*>O+#8Lv_N!;OFSk20DTSdokEMX7i@&Ao?Z_$qVxg*>;sjk+ zo_tYSvM&olIr~exUpSO;AI>k1drN7#`UKDYh6%X3#9n7T4Q{ybSpQ&(<9u5^e{0>e zpHva%l9F8T!!`YGh}Q~x?O|xCH^fX}D<4d#eHb%@`4P6RlX0@U!7?7>J)d#8_yjs8 z(6FcY)Q(5o3-#A`VN>mW0HQ>#{n4L~dVjnJlo9&=T0pHLFW`rpAn@7YqvtEg&CjQ; z)tb+w#Jly=pqFO^?CQgjOC0R0)(XwYU|pH-h3ezIfZ0o!)6@bK2%ks&c}e1b_?9##buL$0wLO55M31R#O&B3<6+yaVMC26-;{Y%dyanP>$9vO=gq^`*yqT{#4M+ z`WfExxnB-#(-aBK`DsvXqL5S7FP8k3((8|7UjVI05tuLM1VDejS@kcDsef_o0dTB* zX}?^A6ZKzw_6#xo$@VDj)nA^{ZZh<7%O&Of?i>Fy|KM;h{g->e#peIPJ>h@<_W#8l z<^Si||G$0qwGgm~=Qs@O-F~Bv`?#In>K-=~O$>7rT%iB){?}uFqr<)oAdT4jKXIks zpH^wU$p3AuhKJX#PuITZ7s?WQ3>bV86{2QNtD_ABJ z2Fgb^Q2LWAk1&Zg>>bu0fVks{UMx08&R2@lrkMpyQ5|8-3|_zLy+^ZcHU-vo?d?K; zfNb9}bPIGi2Nzwt*wv^`fDq8VA4x^#x+Zt{4PYGVuGQBx-RRF4ZnmcZ&D_>5SvpR9 zgFQ;+hbdyb5B-%gA~}cVy?xtTKKphc);mFgQS1u|HLNFrcUpda7DhbtGS2dR50p$e zCMe4dUeKchpnt1|sVJBpM}>I<(*5(*BJID`89c9+#6EHtk}sG;rd<=N_YO?E$ynwN zY^nD<#|;Ak`4}$LW1JQwGnC)kz`%f_xJk2 z1k_}I_ChB^nj9a)xBMvH5$+}8+tQ>iv@47##6|NE1d{!bAJLnHbJ}Yoiq2(yt1$am zC((E|I1m!fT)%U0xB)vlG_;%LF4TO}Dh)$^`s&(9RMR}Zr)hf01lZg&?8Q62@cdsQqC@0=#Yg$`+P_~jFviiG{khr0`N+)1wd{6i?q2T8rrknm@A zPxS8=_7_)?oPjko1JF!FnZYu_0b&EJ8G4aX0Dc!QDvpKU`BmS--x!l^TzOcVF}~?& zDvw&>0S54ty2t$2^cI2O5Oxk>v>x6mLp}(GT0EMfz7@-KUC(NDU9&N;0jzH{R9MAk z@T*(9(tqP#;jNu-u9>Z{k3+S2d<>)xfMS?GjCZN=#3wEm1f3=_dMKKUkg1w;mQ z!VynKf{rjX8A!R<8Ljn&Vf`nUB9mjzS034&HAnphbR`xS<8ppJ%+&p=2HU3#6TQ+c z6rb4wv`gb*XY|U^>a36t>-*VL>#M)TWp@8B?!IH$RV7;TgBajJ46zat-isMt!h0mX zzN@s)ebF5~>2aUQwXwGZRcmEd<;q01you!sdEITN8LFUZ;|r55aDHX&etN4Pek$IC z8eKWNn`}5YbwV8UVaL`mB>Q$x!TrJ{fIvjHhj{+U?o|lW)CC!1I<+U-2Ci1+WOq0SWJ+cj@lnt?^p~ukOV4LpX!SiKr-x z=YXFA{2pWIzw8fozk^4TsOm$J)WwjIQ)%R;CFuTO&cm)Q)sbGgFVWqeX3 z0nI6bjn_E>OLtb z0y8=vID(YCR|+mgNO82nq{>~qp8Qp-BLH6D^KuP*cz(qfB2m0N#HZj@J&l0C*uoNbC95APtHVY^-grjRjGYKNr}mp1pIjH zjI!(umIYCo?)4Hj;tX#fOLqSxTXb(nDN{uMS7&WK`>b%zLGEUFpGHusZUOumMd91hrQ+>UOFf+<)_b%6)z+eDpX(vH!p` zRQ!|*9%>BaV$@;1e_+X75zqBQfd$TzD4J1M8_tt#wxn7pdZ9jami#>(>QM2Y5zb1zLMP zmo7DuI+*Yq-|DK^WIN14UwH)1V8L7lO&1xc{Y{|8_`GCHY>Oi~YWLf1Cl>9>uP5!#EduH|hh8DaejS%` zttfZ}0I+Spyx-flKt1;PU63QR!7F060+HY>$~TIx%wBB)!(<$^G9%f`#V^Qn{ms}C z1i_Kyu`?ToOo6*cezDT*-1qYh@V`2SK73@O-_TPH;~cKY4#LfwPB^#(txdGBUriGDxuPAw`Jk^bpfQ;cyMTZqpY!6E_rkapY- zp~QMnPov4Hg;y(8a10CsE4x~scRc0LlH3_4$ycP*T6P{K`~w;$S`aWhWBW?-XTVZ6 zZ~LAi@!K^dXB@2J%Ad&|9(NRapzvJ#r_ti-;MrXs2#R(C)Yf7UV^k>`yNa5dWP*u~ z-XZ2?CLS4|yS##lx!GUewL>8UyrUo?>u4>K!DzlX=H9{ zdCBcFRm+MY!R&ws0!sj12|I)j8gl(Xxg!@>CRJBh+MruPOwFjk&YpC5s zw4^`OC7~;6+4L8}i)adG92wZ4Sz!U&^RvSq2;L+3u7FPyNICyBX4K235(Y9J$I=2%B3Q|li(5Eu2vHNv_*76jmrCzDn-vg9DRZBH1p88 z6LE-Nmk+vQOktTF=nH6G=D$0LH`MQ(pQuLcvqJLwhviBG$8ogZe;%r1h9@{Y^eA&0 zM~LSoGr1GakzGuJr35(VNe#^0c}D+g&mQI)=Qs2Q{jr%AA>su~IQ9#k>3k;(@O;?| zTOJhn6t8k5z{i|fuxEGBidUKZmQ1wYhMe?PqK-m_3kN^5NLbrH`?SH3&{w*nFvAg{ z2P|>!bD4$DRcGNXUJfrTYZQPRhFyMsTHac2q&H?O%L-I00VH-*Pw=~okwHCIUf>$t zSfqX9DQQR!91RaI;X}zu+k5lLC&o(KXx8hJbZRaq@?LTrhp^Y)W>VVCv#rQ;EXE4z z*4VG+bA2%rD`!T-rR4j(d*!~b23&;kz`lNGb{2R)g~dIdqJ6(R_YwJ`qa)1k8}+Sf zU%$oqn<^4hxkc2A+FcCAGv16Q=TocqkP`1-a)g(iJ9r-`LNlLt(AZs*4J=bINB92VVDY)nhc>69Ux@Xm%iVA9#XB(@ zmodvOFEY>7nh^atrK`hM$;*4#;!K-2EQR(UR==I*Bf|Q`rQ|zLh>XrF0{;wXLqeyQ z5sl3Onh{uiIH*q-bwyAl0# z|GMsC$w4Yqc8OZB;bl8A3xJFs{v4>*cX-=OCZPB$P^6j#OC^7m->t2kyV@m#?8lF3 z;8p@k)v{+GVJnQiG87fyL_bu@BL#HOF3bA$Lf8xo-v*qyA{n9!DV8j%DzEdtb{sAQF0hJz}G~JlWu5FZkg;vL_d?+#7*BKGJh; zxEVMhE>hHyrTw^mQ}x=k^-89FwoQsY61PHe`gz)vEOXAna(Z;qV~kY3^JXRCD9~^7aJtJ6V+g@f@9XSemg_!|fd?2x7`N^y0we zVS%Cj-Je`_qj_OyqRayTM4g6L0`De=i5--(>%@4(JRXZ8etzJXS5Nc#i1^_q2JQq^Pou_>%KlDM?Cmhf!u-5+uJo{GNUAT+L1**ZjCfHMwgJPh&J2Arvk`Q|74)kp z(kJ?>$!#gRdAY%ckTtT8rg$*U+qa;Md?esFKpL(9_~WxLtqS(AyFqk_=)yPcefTPV z*=VO#K;<@}M_nGZnU{+ln*PrS`_U3RY3ezy~gI(ch?8IP=#e@uf+9WA) zUcyB)O+yX9TD4qB;$gxlWgzwr!dN-0V(Hr-KKHJG36DKZ(`a5KQ)6ghz&SMLQ;)=~ z63n~ncLs1ILK9vJ`^`Y0JBD(945#t;CIc!H#h(xoQgU zYgJf3M#EpI_rMLlSefH}+qR}N$Wf92CI}x@eBL>L^ZN)XJvd)-8{@2W^}f`YseF9q z0DpV{f7oG$bZ#aFzZL0Iz6S@Bcjrj#3-kKajF|ArL(#KqluczkLk%>Ub4nY5Wel_1 zVa@`v<`6r~mCHv>mZNN$=i@RH&ihfls>k+t>rbS2$DAxP-bb|=)S+3}6q>i00otq8 zFbB8jy>g-zz%xLEfHK*AHiXLu2jPy5dkZZc~w%1b-)IR^=@2XW&oUjChF z1Q#RgeSAWxctSqUDbTAn5yvMvId}O}W;h$7%xumoS||!m9~ml)v6e?v7wMfOZ|LMW zf%c}b?nPkF{c>%@X~@Lt-uHGU^c~~m6=>~>2WceVC`GnqeiNX+4M~h_#pk!yLZ1^?w`J)v zey@OqP1-iDI4Ln>*isG240l?<6Plw``4&Ayo0q0{6U|3~dIOb0n|~VDAx7phLkj}X z=V}01Ow)w30z|x_)z^5gcY5fq#r4d$T-H(J=_K@%mQ|X<1S-N={h@I#!*QQVtIF1Ik&Y*AqS#jH zy#PFB2W|KYK{SVsKJcq@B?|A+w-FEe(jZo!qAa6eu0hXSm0-gg?8te5ZO%Gw)V|`G z=Ny2Z-C*|AH@G2Q?R%}bw}8ftYvT?u$DLz>oRc#i`(FN=x3RxZCgYjkT&bO+KmRwV zyN>R{0rMl$x#nOla&&7RT2LCfPCO;qmdeN zl6Cdx0iX_gWxn|4ux>E>l$DgR#c}%cal)U+3Wrv8eV*^vn#?bC>0HI86#yHAN&8re zLW_B@dgBGzy=8}Cqvop&G3Y3zIb79o%Hx5oG&Ds$^k47;G) zla6t(j!e*1Hg8ICsRz$X?;rT}{gT$mxQ|j;Ku(qz0Q3LOF>S-H-#jaekpw->r8qmL zi9Defc({`^r+nTQIH5(}rs;y7fQO^;&tLw~7MISp6=sNH0K8Ii!)3Z}K{;DPPm~3GF?Y9O6RL<;Fb!{~ z0c$Psn-)uj( zQ?=P)V4uV`|If#wQ4i0N(@;1vsd{a*<3e9W6D&zC2W)z7OY8&Be7;!b>~K<^J2I!r zJ^g#u<$CSB355pJx%KmSK)=>RyN=UQ!xhH`>&sR17EVlZ-oXMG(1@ao-5nT0a#5O+ zgoB~#cg~&2>++l1RsfpuFHCf@G<`SK)cd<9q|C1>ywwT(O>$KnJQ4hi<;=cDxsO+h zon%aOhLlY8y}rGhmj~JQD^Qm~qj-og@CFu{i)4(#~^+d9!&@+ec24_q7dP^Aski z?fuT z_XpGnbqrqa9Q*T*hi63f?xeh{ebGd_Ps&E5W_yjZZ(-$oV6R0p!2Q#^9{Zj7xsR~r z9J}}e7?J-(ndonA+mB1WXl7G5YMZhg!;zV*{&H9`<&0x$?${XYuW>8G zu&+N0d3OGTUbg5wd}DpGq86LF%F}GkI@RS4K(f+J-1-vghygE~f4(X3v(wc> zzD}KE0oa6IT=v^MZ^IhFp1i`d*c5C_c-D+&`_HqNV-dtfz1*J!o=@Nm)l(bAb&iT6 zxxb`8U!mW3@!@y5G7B@Is@-97qimVc~ zF~!oZsO`peW7UNjU`CdCn}*xs)x737Yu~_U z|9bDW-qp6MWbau4D+5&PF*@l>4fyEWi?U?)07pQ$zbjucbZy*7Z`K-Dzkz?2Q&-|XPG06> zkhKcD6JGZZzLM}9Ufb7@NFCm|U-rv(z1`S(msQfotU|kQULZWoZ&n!B;G(tAM>321 zIc$r3{nMxMw0fz`N&PktnxT(DotA`Ns;I_Z0t~Qj)mD)ULO9@gvNo;Z&EM9LEr{QY zzeH@QS& zn63LMUz+_lJ9$^q<;{2Yu|%tU%z;DOz4xI=F+RHMh@CM-aY*5MY2CoHElJ3ZfK`n9 zI|2BToy~!*gxruBbI34&V>@Y;)H*GT;=K-`lU3J+NtZ7GAFq7G0LlE#I?=v-Jplz0 z@pxJ6^-l4B_p@T_Adl=?e2~;C#@Netw?VlY9r;a4O5*JlHE2mp5@>V-sf8%<@7_GDE#|* zHbHb@KQNf$({E;OLU)}=I|W;Ej(R78j2+1u2z4#oQIPO`NK~B_4g~w*0t1bFjP{L#CZU(orhU7pJ+1`q*8QqO~VYv3P$K^Yu^5z=O>MNQIriyX57&(0b^pvXnP_%Wy@X8b)4F zm3ckSlbx$UC&|e1W;3UFn-Uqdx{~{K1O4B%*A9dBx8O1Om&7}rtpq=kC9UrYbsS69 zym-Sf0pitU5o$HZ;O7gIuI(>x{QDNTi!R?c8Ha0|RH#Gl8_XL%&-*1%*DHgOyO+lcY>_Pcz z#9I7tWpQY%zxgD|A-nI8{%o5u^3Wa>bOo&&$$lm@%vDg{ zFZc74eqOay@*Q^(N3abXpAM#?L}@z5FERZmLIQYOClW4M(wBSFHTC}Q8I@r_s>@Rm z1Wz*ean1dL_3eS$*+0$5a#Khi(&>o$4t?BN`_4g0+TsRUyZ-4^p`U8*g_#j|15+>a z10?{fXTCWHVJi6Z>REUt5e2;c*3(@feQ1oB;$-xI_hDEc=~~NN2o;~MHF#C`?LbE8 zm2;buk9%Vcg2jojPB{B^Vf{Z|Xinaz$!F=?>C8w+P~jkCQxK&z^kPkyt0+X#zOG)( zA-zkUD^8LG4tV1iG#)b9ZUMm>^^1Yr=^0uGp%jVap^ZcjX0ZS-y8}sp-+tM27#Z+XQh>9qRGAFDB zA-wDUd4>&JC*B@j3#u>gJMHtjNyZ0aSEblZ;r=j|F!HOiByk+2+eh8KY-`pu7G1ur zI$$CU`T|geaWt4~s?Moli}v`%zqLLCf?5Nd+(g&~shxqt<=q;KB>z&2x0Zpx<#fPc z(O!be2>mD?4%z<+E)O{nWdR$#1u3k6><|}x7xP|@?;9pg?!3wyC@1)G-m6bKH=U2$ z*P)o>ktG%JUGouG}zW?xpeRE&;dU8_$L}NGJHdDR^ z^!@!&D`)PQGa1oYx1-=U7tVrh%%-3Sn5<-ZaAqNeo^Wi0q6mF~nik#Wi}x`Oc*1-@ zgP+3z%Pa$M`*XaM%(K3ugsNm^675XmFw)PfZ;v}e{STd6^HzHHLTClFZpCmWCEdw2TJ08PJ ze>#$9_rygxX`i0Rc`$1L(896#`Q|De@vZMsSwJ7Pf|ZOJbSco_XeaK@e2@Cl)))Ps-n0f#rZkwkGCEk@E+>*K`i0be!E$;k)Q~e z<0;FjeieDeec8v|XNvu%C^#0ffYDT2}dtoW?!ylw&hwkLDQW`DwyNrW36`a*JgUXWq{9m+M#X zFFtbQj`_q3JAE~Al!lCH;CajDf8y5b-6D4xXcgY3G^j2#;AE4XUf-^N4a+;c+G699_l;BWu@Ag*w2NP9u4F!y9<+mpmF*+Oh<^t_X7zcV&a z4|xfXKvd-FHjJTI{LcOv0~$}hU-n3iG2Qz|vL&)kjPGa1zxI19VSH7lLP=jfP7rN| zVn9N?Y?0PpGNwJf+vhjWcF6k!aDxBlY@XFcUAz00m5yqVALDg<8(+jGq2BjTla|Nz zV6(C7kUy@29HhBELudtWFVDxQhi@@u*i|CG$uAQV`s^T=7I`D~qbRNWy(Mo5oUz&R z`|UOc%A-XP%M7i54H&^?=k}f?{`JZHK#N!KfI01IUF!$ar3Jt)uE`a?_+5xdQ|j`? zNB~n^bxrv)7}WYZx5=wS4?WvAnT}+h>ADd>4YLC!`!>v9R&h{0p2swuG{)lOOtKsK zxP2RGhXT?XVi%jV)2O33p&9;JnaJ>SRojCzYv(w8s+HR3+|ibNLVpuDajz z3-xm^PrV8|uZA0tQ3H433-iz0+0JS#DFDEiE zFe>gb8vimyL@`#?x2XvFvxQnp?%a0EFyRb3i=5NMaOS1MB(-nN)Oa697&*zyy)t!w zyCu=fjAm@Ipca@5p;o1&a7;C3y{jYbRb9$-&~Fk6`nWy$413&_rjCllsSsMOou7B@ zNB6705stU&S7v+HpN3c?0E!hAC(CsBEG*A)aI%`o`a^ZhJ9?6j_iaP^2j+=GMf`F+ zBg6$TmMoxW8=%Csn6yDvczeJ2u7pP1zj;Yj8yrV29wL8S0V-|smgY+n;I5yB8jrTK zg<0DK#E3)%Yd7>i&4~tC9`sQjDCJEaKj`Cai5Ytu7;^8MX4&4^o8bRyglkdS;NDbO z7_KtlHz(AF5!+3AA;d428ul21qH>e?`Bo6c?hFMY3c~p+tDCM`Qdtz+vIgAT!hBhd z%RoaSz_&bU_22AE)ih-;wukI?JX`r!sEbdoWV-gDa3r9vvIDb%&-tz%lGyY1RdzAI z$2*~1I*+Co1(d?fEbfZA!bSUP2G>1d{l^x1F#~@J)#Oou-eYw0N+X0?BY_ zevwQwyKQhjGVQ_hPktTVbVEu@q$5~L*q<|{mIYn=7X6TvHIwpXYr_akpakftM`?r zvH3%1XNFc59Xa?zQ{H$6Fv$D!9AlVq%&N~c?FE68VFp>iG?W7B1$bR2o1Y2l46-b3 zNKq8rIgE?+)t=W2a(MP%CWd&o-6wo3yKdD0^Kmh(U(numXA_ua{nmUX6P{D|ehKhYc>Xet zGOQnjyV~L$QaoMa)>OqUwI>u0;Y>uN#>*a^?C-pled?AqOW^JF@Z_@m&FQEYI zcoyFaUu9Rw#B-8b3vQWHj zp2Dz3HF&HGoiWec>d$8!b2F_c=FM9d)T%$f8Lb;U|IgHs|HIwKpoaHMO|HTLaP&Ke z-Zwk;5#B$oYWB-Oi-B&=%;ktq!6&J%oD4VfGKh&z;CTu3`bN z&k)q}Jg~p^(ok+bAc2EZGysb%;HjZ!*CB?Q?kuKQ9-U!^aHT_?v%GR+Ind zvz3X;5V-f{xBhc;3fyImSmyE|h{lb409RcEG^hmXuR+h(FP`S)05qmKAfjXzGyGB5 zwRhJ0WdR+Fx&RUhlOTTc4*+*P(Q|&>#m(=OpD)obgV;(pGF$1txj&Io@6KuG)u=yS zuIA41ut*F%tD=w@fcOV_$ifXl(=|$)$cx26leJ(y0(ZCwuDlJD-xMCYyOSmF&{r`( zWW;;5G(m*^R*>mI>B>em24LJb{Np^FjO!I#?CHpq(w z?pJm(A2F`=ExfMmcjcXoe;#K-Hdz88NewU<;>RW1G#J9DS5XmPQFh~100zDX z%#D;A;TBlB$lOQiiPi@dr2{73ewj#;Qys^R=oxEOYGli>v=0Ygzj5aWcX;{V)dwYG z(XIHs>&RLNNnwBY>b|Rr`)6$RRDL^F{`?N~;EFGPxVaOa?HigV35O3--QvvXqGYYx zb$al{ZgnvCVq-yZh}61oCoD1Ljz)uPwpAC{B5HI6RRh%DugMYr?l%I}`D*jKI!pod zCoIrTX%O5C#>9(QU5La0z2Jz|)HV#U!>+Ti`-gp9O3E)9hxb?x@QcZyfq_34rhuca+{%)8Y8d{PBrL-EqS)-UU^EN`(& zrkB3M+>AVvL4QnpmYvs}-lU&%dmq_~sS3j=s6M>I%joWW*+Z~wpiXm4t{sD4Yz5d- z`;hsh?0&(s^xvMJ<}(i7j&e-ho29*ME6o%@S!C+bz0$^^`d}=2IOpq6i*)D#f3FA7 zdDIAc80VR_x6cqs^M!yJaOHgH#Mz#7`vzDv%B1JJ`#J&%&+qi*5^#o<@i70#77G~t zWL&P>`O4N334;JR0W;M%`BSL*G}3cLwQcxuo)+=T+wA=%IYD7Qg&HlO!53M!(fj9{ zVCpn}{^QQ_6$AW;p9I^LUi77berE4)tHGoKw5X#R3-WSlaunk;IixdNEQU_&)!$(hs>V5~#}b#is34Uogth1|Mg9|6TF+<{4i!UPS|4pe6sX6 z`H+MIV4@d1V9Dpw0`(Jpe$>Weq4tVR3M*O@*gI90jP3i~wH032X{Z-yepxcgAudt6 z5m7XcV;V1nr;_$$z;j`Q^O4-#f@@w$4!r^hgHUW--rgTCu0V?*!^SFaD5xO>vVa~R z1Yo86?7eYI?li;8Kho7Hsx-K@4xqFofnI7_fPK+e7Z&gD)0x3GtScC%S(a_WTp z+y7v9eFD9ES#pHUj9#j2rO@(S1N8nm2cTjfcr0Bklx0s2%8qjJtBRQCM3u_^vQ)SD zG6xL3{J3T&BZ4gi9Nu^@YWk-77CeaJ2cgzn6p}|?A<%1)AmJV0h8hAr>fNXW9(jK) zL2HAbl}!HjPs7yQ9aYI<8i0Q2joVT?0gCNi2w9K+$Nk6FqvAmj|f9Ig8Iyz?+2oHcaC<-G#)uKsP;=y6@s}JDg?N!8<2bcqZ25^zsjE_$u`_2Oeyi zuCzvrgxS9foXyvEiG*`i8_)DxAAz4u_1;q)@-Vgf4g+hB#cHJDhm|Ct@)Sm!<*Na> zcJtFfy7TQ zomi6Rd2;!0&pLAL%r9IKUjAXh-fD(WF9Y}Nqnb?kT|W$~zs%?Lp_pC$(@2@Y5Z3Of zHtFChpx%Bza1Qv}MK0E6cU0i;I}}%Ca6lET@2yIx#A9gGf^k?-5gFZj^pZIX;0G_X zwEyKh!5mX~nrHzk#Y)b-5_QbTTr?w1P!=h9O6+*1kQHH~-gJ~Z3Zlt?UBc>gUUt?|pD;3dBP zxckE_0sscmtMvI$gUekm6ua0D>HFioyjUGeq`mFq{irD8JQ<{b{4fT+mkjj|)Gc|m z-#0eA!wiTuIK$L_prbzrFbfRlcBntfW4-2AFuY z0ibED-5zOm`5D|;!KJR1rs(J0+578^GYk&T)V60!Xzac$%^Ou*@lBo)bK7s7puc0C zDbgpVd++$UM;w(H-Dj|(8CxWpL+01%zDzS|?=%0;-?%c}>)Qtl=27zlz)|0d^--89 zl$y{ZnBl+D!~WezR~PTJ(Zho0E*G(=CO2W6>(38X&0To!6G_Q>U+F*>1is`aH90Ax z4NGTB0SU105l@oUpJYVY?{eTaNa7eG8 zprius};{|H-l<=@3fmS8Q<}I>5h8tX35GUgE%#uVm@25RqP^8A~K}JxG1blK1g9lzP z&6|drkPpmgMCk11zxO?*BBbo9i&SFU&EpVKi^20BL`EMU<&Rq)mxu&4H(PBSuTnTL z|36wLxpu|JqvtF8TIKa`&2RJzgV`aQv{078?sf_d3eLUGMr#JGyws?~a%#pKI&4mognsUjCPv zDDtr?SH*i2o`R^}0-VQIEWU0ZTcI(r#4Z<@*PJ^Y6p~vxnI8;)ZIo7-QDp5UUjkn< z-?=lF;>?gO4B*r?4CEWU-zalJ*x`&sp5|W)`}Hoo{f_pX!vE6<2&`Zzo(O8DZ65w3 z&}2NU3X5beSK3=@)%9aK^wX545Ry_b^!F0H}JN~lmvh| z@|y#V*dfP~n63d2edyXUap3=_e;85$RU#Loe=>JL)mDvq$nWH_ouF^&po1}&iyyP_ zJhVEV*VgTxst+D1O5!-v0h;d^3cdgGSvQEg863`cglqSS4S);4s(>>%2vXP{f+T7B z%h}dm>3gynUcn^iWT3B72z>y9uN^_?D!*}k!EwrMVfGM_t_KBken10BrGLO{7e%!n z2K&l8@7wptjBxU=gh>9hW{c}ogUejCp!quY=sn$`IV1R;iJfSNHiLRT&(ZIU7J3#X zaJi=s2zDMq{=`i!+VXWGQyO8P%C>}({L3vw5l+X2|4!inEImBO|Hxv6Ntvc>#L53M z(*U%=zhRmsnx??>-tEqZHt{+xg&`(JxOdg&?Ym`~B|Ai_m5Gcyk3+9++nZ+#OQJSnso3<@(G)q1+}?;@Ut?!XoDwC^-iRq zmuJD}a=}OfDasNcOWgi%tz&SlD{!s%8UI!8Zew4ku4&Pgn8OolBsSwB%~;H+cmIZ< zVEJ-H?!9NgGdxvxS^K{`k3DXgA z`R+d)L^&U*e-knoQT8fMIIB*=Jas}{z+Qh%<86taV?cwJ0ifIpa0lMWj_gGDb8*0r4}`^8gP`7Fc^*K;f4lXG;qntfw#sEzLUj?twkgeP`&Su-*UiLO^Z1r~~vM zli;btH~w)_DTVV1P(O5rb2wj{-0a;-sQ*DY*?<2$r%es;{q}5s^`0mHop}M_}w4L5I)@Hd4-t=SHLy1?z=B*s7d@D zqlkl^9?jI;bh+SbxkHWJ0`K12w{er^-1_sVq5gcUuZpu?Urxdy$nFLT^pJrs=R1V# z)$bCkUb$DryD;BZRU2jABMSOK4=lM|&~AZ=IPC5N0$0^o4*HJqJ`{nF;WhB=k;lP< zYNha?dD&z0f!Tu6wxb+koCJ-SuICZwLFw0!eAG4lA=zT{jE*Z|j%f`&^o#V12JA|( z;c0YrM8JD*0&M&;bf9X+;83Wkkob??FY+bD+{f8;EQ+G*RusiEe&FHMUL&(N07%Zp zwsr=5c_S!lJlr=1K>phPJkp@&j@0K~GkNeFD}{IFkuD+dY;%Qm2!|H7(eieSVu8A1 z@O%nebQ{ZirGS`x4V(5)@u#zGk{D)nliUi=QX4+S{(NpBMt!Vz_VIidcMK^6z4a$$ zBj*vj6uJ71m(M_X!b$+v1^vgFk3%wsB>XaM#)7lLRKHphpT-sce!U#@ z!2q|TXX~4D>6(e?P6yaPU_ZIp33xNN`An=Y5p*pn-4T490C&*OWA&#{y-BZ+dXbU_ z`s`bdmi%TMO(DB^d2aFV+b?H~TCTsdr4QHu`t>)%gA)70YK7~n&?S^;b>HlRmX>AF z&(@`5EgFz-o;~oAFtq%T2CovVKOZ-+bZYR0AA%-LclJZKW+i&lH#1xFc6-0{^$GXf z@$fa4M;~zBG!l4@**#f&Pz2Q4NH2_`b;^O>_iT@@U$-dpTLB7t6oy~sAm@Ag#hf)H zPr~}>we2q8+4VO#hxZAv=T^XLrblkm;Msx|mD;AwJ-ouDXkMN|Juxt1(wVmdB_)oW zb2i65<@^z*$HXxYv$;}a@W{=3D87Z(460-|tB#H^_WWVGGp0E6k|c~ckwdb7zC#L@ zs^Zt)Z2dAXT!7whVodTgL&B)TG7SR!qRi2@%_bE^fV~JlhO^wYb|@=!tb7812XI^# zEO>OMSO1%`EFI6@N`hzFoxw`14t{U_ha-?F>~kM;3_T*W9!kZ*{tPXb{37A>3A~fT zDg!nLOpttpS`F`9f1Y3L{6vME42b7EQPc&^UpWuwJ^nyc$?HQZKxL1*1Yk5lj< zJ{|}2O)?HKMG5LCtsVKmSqDO?aVpoI3!vLRTWM)-iO81B~#s)$23Iyd_3ytr}EsBV7Lubrq z>?}};3Y%zJ#sOK66@}(*IvVTUiEc-Gj`_`>u)I+rgePxa7#KJXc0B;1QObRtNy*0a zODr5xu^+o(!3J(a`gXPZ3-y9|FV@vtY12IgHDl~l>`c5FuemJ~JAUf0ACpt+sF**6 z`k>42Kr5dYSqtMrGsn}M0y;o2d`xvfw-y3WB=z&bud+3@XRj%}^P!9C@#A4pdcUSV zybDRd_7cUD!(#VweR+K-U0t-XyqVZJqdPBY@U8vytva)7h2qznmYC_fZqtt;*%*!` z>H3XAeZv{9Z)Vf$bLfQ6bIjTI9eSygZ_3{fC*WhSCKg-o>5rDxSo-?9$zr2!xZnic z+&gx50GEEB#`ZSNgE5hmVi=~wmF^n1ytjxWLf8~?&Mm>_(Rm&7h%3gJ_E~v@&$NDL zlPrlEX?CnqO0WmWwyhF}_hsB)2W%wu#VOOVIY$$o877R$M~j6(2lUAwI9T(h_EoZx z9Lh00osE<0(~`ianT20lO<%75{j$4U&*|EvoYHYo*!}Fpv8aFESl+SISm+6fALFh)=?C3nTo{ip< zQNwUmJEFAm)_O#{KXG;34A`FhN~3dXQ%!!YhtLIBCl}78Uu-6o-cNuzDpF_M@5NCj zcO)ar$A3Nof_-19lNk@XK?mdIz$@dvQ9FrUJvCT%>^7zk@GYfrjY{t)-ZIHMzX0JD`eBw`jo5BH&AS5jD3x0 zK=3?1S>2O5N!iz)#Jt<#>~vmPSoyh09l_W?) z=d0}!t{pxG&%)jy#)LkxvKKy8q#FxDUZ}z2Ym5mGE?&kjBXb(ngFilV^J)twa=mrJ zD$5nlZ-?q42q~uZ!Sgxnx5y0?yq04o2jJ)lYO}3OcbOd}drnZsA!j-esxpSkCxWq- zAx{8YM6<>Yjr&3Xc(}3H876zc0)|d99Oot^3T-O;&4aZI%T{*25AtYC$MMt;-n24l zwzX74ToOe>iAkz<65tXUY#9KW`-wU!mZqW{gcdSC;d#%ga;dzsIGUkWMsyJZrQ=c! z#8jB*S#(2?EJK+6O>O|#0u-r%oHBrvhYmkIgE+)3`AxCJi+oQ~efroDX)QTY)k1U1 zhatz*kkK^3zAp}0%L-&RV)V{*T|7XSF`9&}v{pE5@QiM&YykBEA{faH)_q@40&Qfn zA>SkZYJFH&PtwhM0Q@bL&K`Mul#VvMDM4L_ZtSOvW}Dn_If`-%iA2PJ5wSbu5PPDj z&c;6ATV_&CxxTIlb3ijR0_9kMNBMYy^N$ z8Jxe^tDkNp|A$fTgO_ve=)`~nqvJ`&q zJ)>Z^`%W>Z;d1I0C)R~^0pz?4&@XQ$eBIYtoXWH^pA@<^?x8MT3yK`Z7g!k)^35j$qZ3_|H5Aqrpk+5^Y|N$Kb>`7*Y6u2o z4N}4Nwh|YaC5l*c$xcTh7eX!+`2E|Er6$c#d}}icL7Ohg65W5b&Vtg=E4P{~7S^#8 z1C3e>A;SyJ1cYUuv0(2a8P4B;EF4em>)H{I~v+>R1%TERq=+6A09?#%V;=TJARl;1o%m1D^XV$j55(O06KIB5Hw) z{O-^?)TG>_eY;aLZRJ#MN#WaSkB<7W1lk~cAB}13imV0qxKe_t2(pfA?84MP%J?dN zI;)@N5JnaJ<8_he@Xlu?XTCiHf8UGrGR+D>BO_wV$*8k>;VrPP7^l8yI+B;x5kH8+ zP5s%K4}i^@vZmN^WsT^m=vuy@>cHaW0;thPyzWh1zqO`GiAsDZeK93IF`oD+zaq~W zN5y*iLNobP{as5J40C;#ixuEkMcq(>@0Xy#(RsSEYW&2h`{qpGQ^3YvYWL{D3M5pi zgok~aSGrhquUaE@#+mO7>%6FxgZI(l4`!O5vfRecCkVHIqcq(BLM9KbuvG3`yH`c8 z*%};M&|Yt}Ke$h3k(MvlZ%RGC+ZVZ_)_#$%8R5F!g_v?B($vF=Q;jobw-wq7B>T9Z z9$&wW?CRsE#pl3fNXZ@-o^<3qHc}Y21`e~?7htcLd$7gdi2*llnjr-^q|!5IB~-QUQxDtSyzri>ix}BGlQNg z*O+Qkb~KP1LcF6jrJ;+|Z~3hAEc_+A%=lsW=t*7YH>tZ4C2xfO;d)mOB#W?Y*HWkV z8oaVehs$Jd@V0m(=h~L7$7uMSVAt8fXN4-~7ke3IwwhI{daDVDV1<(=9})8x=8tb+ zNv=&ve6u*LztY^RqSfSmdy&6TNPblp=v({zlWr2%P5PiPAO0w*{tg0gP zd3INIC%d$=&IqXc#68*_BzurdkCHsgX9ry%_GF}Nm7bKB-j9>0{2?iuq{`6Vp7RhvF|Us;u)(3O|<{<8b7fO(?*74J%zb z$^{{#yuD98GyHgKuN0x`b3(Nb@MqznU(_DN(dN8b&89Qq%;xR^Qbp%uL(%%Cy}Wsc ze=4zRm^WHq=#M!Z$Mvi5$jfiCt4{Jo`#Yn#x`pOoVPfBo=0Gr&vRJ7UMZM)*FEt8( zzy-|>oq?40SMO{K-}P}YMOYBt=sus$`Q|RW{6@a|#_k z=5~wf5(^^rJMntQ^89|L(v9~S-)i1^7vSo>I*qXCNQp)7)P=@9EnS?qXh-e3{f@_n zCQ$Fk#<;5_^YtL!^h@@L&iK3MZyv-6G>x-qUo1QjXHkeoN&r)>}`3D_Z2u-ng(U_)^(f}yj%l$FK!}6fDGuG zSM*g~(Hf5o(kKnrGCAVqq#*);g4A86!nTy0`QRhf)6(TG@@CAKG#Br*nk679Ao=xf zGmX=mVTk2D2~{#;e_%I~?Y)Ux6#yC4SkN3NlSIr*NBmv^mVC&;omBlEn;*y_6wmE} zntcZ66nk%DLYvxGcwHB2Y>;?=ecq*A8aaK2MiazVpqQEHT;6!#+`k)GUs&6p7{)VE z5z5T{bAr6q>mVlZFD+M0{=K__xI0Dl#c@q`XZk|FY`if>*_ph<2kYQUSP53YzeP0O zY9BxX`{sY*siaH)dTilSTSF7a-Ah1LfG_VxiohBe`}*09Jm2RI6QhXNxSSKjh#5Lt z>x0{{eP3;#%2{8`N@G)*jxU*l3>RAFc&Zq3>}GM?>+aGDp+#+0M2yHd8Jjnq+v$(ZpWdo`zFj%k3rDNzBig`z-A}cVh+OxT#w81{mnc8qFAPJH%>4nl zES=ZrWCIMc4)_BvvXpSrwW56c6@8Y%s!M*?`i$GBg5k< z+o`trH+O5*`&(ar)q{AMRN`RoDj4aK>ZouZoPH)H#z1rYn@e>P4`XX~yR|yUD z&ESov&<_4+1RqR28^keJDw4gHy!*(1HL+~9!n%Xy?zq{Noh7=dh1A2jrT1i#_y&6N zcy-nH0zyt!$UPxg-EL%5XI}`^*tU(jw@O&9*3%Cv_5ug^(#wtLMz zsZ))3=BIt)X1TC!=p|b2hhdLJ@7POlB>6Rf7m+OI4vqe_v`c!ehCA%%!6PxgkeIIb zsG9|WU7cp@j8*k8#6->cX&qX~?3Eu;*sYwXv)uN=ku=xyv9O%crNrLzqr?Y?2 zAG?0t#PUfisr7VRJ||37S(dAtQ2yu`_!N3=U(?T+JuP#{nX7_pk(rnKEY2WnUCNVQSTwc)a8TVRWuC)KDT%( zvrwDIx9Ti6qcV)`KmEgL)P3#QB{b`RXZ)+R78KHU-Gv6B8`hrK;Z5wlMMiKVo*EUe zLb1c|YrF8NnQpK*Jw0wMesuyeqe0v{8k2czO2g0ER>OD*%UN2_%cqDxj)R+~mx zjIU2OW^Jpl7dmyO&|h`}_dZT*YxsrtE;!a&uZj@(T&ipevGh?IDOxv-byz$1-T6Gu z;7<4wUju=y*@#Bmf}!`CNgvPe%QZjvx2x&Fnh1^GX-|JpSU*ZpU3DE7kE6Z?7ZLYQ z|0`WbkG53@P%UrH;oW$ZyECi}U)|<3^3eWFccDR+dkAR!@uVO9VLR=8Odns5m8`{; zT@e|eD4tpfqjlYIKy8936AJc2ry|*@iYSSuOQZ%}8wx60JojSPdU12tkpk6Yxmy3O zxW@&mLA2>O6$(lO%$0c~21DMcN^iU3ojR?HMno}JBTEj?*K{AsltyzBB|UGUx(vYj z2Q46tEI0TQ1w^UqNWb&q>2b?_JdjPjzs?_hOy9W=z{AnKbNvkFj7lE*K-I}*cjM5e zh=5jcIeZV^ksAy}p*X3Hg)^{})g(u`tfNq+WBHaJn!Zg?f9O)4Z(5XHWXePo_R%xv zC7v8D={jbOu=eK)vsIfd*Z{sRJki7H>y(>Kx zAA-eW;>&;l3e9F*4C`~!ebP7_t5F1p_k;-5!NBRym4%CcNoKZY{x7@NJ- z2)z#~1JFkfbwj6yX#^@II!uQez?&`-M-6gCW;1LO#AF^1FOne$FXf=_cp1kA)COUu z4gMq)E&7{5)F&<*TwLGVY9XhQ^Cov#H+XN0CO^%J*ww#rN`N(o)U%e*? zw0q?rVM0WBm^Aht=4d|QIjq2OZjVwGngfj2lH3>17e58| z$N;zPtKl-dLqqXmx>n07=O6%2G!_>iEOE$%!d@2I#Rge>Uh`ckFqX5+Ka;RTu zisi8FCLZ&$pHPTlpiFQ^8uDHNHi-tTYIZsnX zw;LX7-5dX%@1^jZ`s)E$S$nZ@hTJUiT#|Rw#Bgj1R#ZbQZ|Iwo3wX2`;?Eo9jL_yf zku(k4iF!vtQl)(ZYAo&uK9TJ}k)d^-3)cNKQBiuDNWz<7of&u}pC-=wweI=?MzY+$ zO;%Y2L2g>lgs;-9Ut0n_E|?80=v5P)e4#mnSx&Gxv&c0%j!xf5fBt&u4^>Qxh7HBjTnCB=Kevi?COE5n{2&T3?G$R`9T4!lYSA0Dlx z+?;aZaX<}frYQ#K^&4{|7CEv}nYX$V-}IBd2^^RTb)GJnp+27o0dhHYv;Y>^R{cC0 z#!~%gl>hX`7g2gkyFced7*?`R%X@{2vt&dPE7~o*>>oFtiBOwfV19~OtHzPJu@%cV zk1ZM>qHTmuS=we)3zPgvl_jyr|LPm9Rl8@VQ|Xn06^d)k-^cQbRfP5c8PNrC&kPgH zyG~XG|HnF`$fn!10yBq@ zu$ISzy-D^CHGDpC0mqRqP0M*yJH~{Cqe_#FMM*81sVZh>0QI{RBjFyYBVnocRi)#S zFfHWyV)0l(PD%6?aI-NH6R~{6CoGUEo)*)6Wa42=U_i^QyHaFyP3Fb)o_42@? zpCuGealf#HM*SWa>Q_-o``%%UCKwKc%@f`Y?#RS7d{;7IHN*Nqg8bE=78mQwWs4~( zDuKvP(Mg^c=mTjcGkbnN!>v1a3J~!PWQV)BbL;P{`70k#*PeiVOa~6))oD>13VTv# z>%wNgz9nS|XFBFk5HRtH;xaO0sF%QB2?OsIdTFvLz@}P)wWoerzKh6K*q;});AGUr z!h6LQx*hfhT95KkPOxyhq=W9KeFp}Yh^@YMJ?I0qBCyT_WWGrCVBciK5%kYvw>+)? z=9z7Df>fJmfrXMlJZT{5p$>#6$0y$i9fx-&^ydnD~i}RrBkj{Z%u!-_r0 zM+fZ_WjFuw^i|9g%Z>W*i~$?Ha|6?84dY6oU@3nQ`h+!-?dR8X{n;t{5U~yRb$9R2 z{{2u0a))AbAb5Y1x0@iDk&?yWO0s`-{@oj|rtMpR1GW3;DoqJ{Oj(R&a+GE>oQ8+M z#etsS2eq!NqwJ4OS-K`p_1UZ`;j2Ut8UjxkhG+tH=D6$%a~OE$63 z9I)*p;Ewd{UGwdm`b(~w^Z*O!L#e2}`&?U%&d& zr+7HYMf&$s{_m&>H7#@T77OOX2IfSzLcK|9-{YMKjE@@)V}D+`)3dR$P3H?X zi{*`Aj2kM0)Vf}=0EC&0M2vmkIkLkM5Tu$JYWdeL!@zo{=^krs6CL5LWiA2W+&UR8 zu|)ssu9e#V=h=%7)OTR!VltB6XDHTt7(KirOg&6lphm+x&x*B7buuGDilX-Q`G)JC zNs=5Sx6%rRTSnvW0b>YQ>rNmD3O2A|q=ZP=pvqnm%Cd z1a{&m4Hi73g>lS4;bMfj7y^v{6MUxRE0YpVUA{5;)25oBhfD*#Dt*$qMg*=b{`vLQ z>({u->|SeRm#H%pF|d$OgAmS>scf)AJ)c5QKDrC)|@+XojyUo}$yS+kwj90cxUq%02L z08Bu$zqOp4+#4U884bpU3BzFedA6ZTR*ua|PTTtGfA##RN_8mI-cDF@Th|0UhxUO5 zN=v!j@ZV;4BHSr`dM|t}>x-A--M}O+X zqV84NJbS>JlRe8(c<%VTUvnSInlnD96Uwtlo44|P9FLMTVisA~E&dRVP36Q!T~`0y zlkapxaY-}05Tn!dAfkp!ExCezTS@-Y3zyF^B{wL$;L$n8EMzQvf|-7yUy=D14?zR} z`mO%*4OXckU>Ql$K!fek~jY5HJk9rO%Hvg0vIB zBsfzktdu}6z&F6l_p<)Q2T5sBWd8j62_B#OH>LZ+rL51E1FWW{;nqTph8b%3Ec~l` zPh~EpfOUx+Lf*ZVCgl+qTCx*TqpJ=d2bq66)k4^vk$PTGSc9N0S`7HB-D82aB2g5f zUsRz0-EsSlGz{2pN~iwFvrxCVDWN7TJDup|@-UE&a=7WcpJ7O-YIW@ofu;*Xj3OEh zNwEK!K(&dE=JKU!8rHkK{h#-wf3JT2ikZS`DHO5uYX7H|e^8I6M3?ZMUzNE})eUy# z>Ynd^nHc%Lpbz(cyZyYi0HJ`L2U~WFp!`FJSeK~Bma2ENLM-(!jH zrfz#llp6>A)2EguuJeh5Z9r-qh*Kw$+hfeabC0;88s~<j zso;VwE)uS32QkFgKkN9>7QY@&{;J;BQeigw=Lz|erp9WlLh_rpWafS% zSI{4Iy$J_D`%dv>l*0&>7J%&CN`C!L8cv95H{sh8g!rZ<{Tlbv&cNx#=NKA|E(6ry zXh4uWLq0S``i(m+em3rDe}}J1!~T_WafwefKBpD8?x%MdmJx)(!m&?bbR*`KjJOJ5 z-W7#y$2j&~K`z=xCV}b}uDw@#e^|{=3pq_&E8GH2y55J~DZDSo$rA_yK380r`^O9l z*W?rFBgL@#gA`F3jk^zsmr6CkHCJn=#8rp*R};+t#~9^WQ?^KB ziX=`RfUrXVHbyl0@LJwo301e*UvJ0>uy}1TfY>LxB*%XNs0WffGV93#aPs`=VIbRk z2u^?*RLzA}9{0)}Lj&LzbEZ*<>HpC-+zEgYy!eOLr4o;x@)ZAt2M4g3Mf&>F1A^L8 zk#)0g4d6O>9{^HEg>!4~Fz50EhPpJBG!@u}8(IiU|e6$Qj;GB8e9?|vXV{#OqZE-15^Tk4SU6!b@cVi{2>cXXO< z9Ru&Q*C$c_ncp$hJJlTmZau><_s3^`cv^rnbq6Ki#bRaB^~~*5#QiPTgH8l|26kq( zChWm_Br*NNCh$xReXsz(#W$P#3&#sh4zV7*r&^$1=~BWx1ZWMN8wdhu&BuDMVFTcI zc$r7cFu=^8vfdof^g4Oow!apdz=w@&4CDlc$J_jK9K0!;l)3n3hW2S%C%su}<-@wQ z=;A1n|7^TS@sg=K&uU(vE=S^K7s94yBAHe8=kff*rO=zRZr=)a|Id3W<~=Zx5_&BGa$mJqN0n+jcE`a{a)Zhr zo%#CDBk|Yh6MOCY_cL0JZ9o3mj=WuTD?kpnmlr>SsM60gTfQ3PV1mfkk6QoF>u%Qv zuigF~_iM>N#Q#ne{$8(-t1bLRhOVF6&%gdZYv^_bF#6v;ZC+~$`}be-!sAi=zxZsi zG}C)&+3=iWC%APF(I3K1MfNdiQ1$S?+KJ#s5Fr%6s|{186@F$+U;{6POkSYXDT z^9t>_GssyOnL_9YOk&qC7j_W=7OaiJu+kC_=klGr%?JFBhxHFvDuvYdq4;@N>|c~) zpN*uMF}Fkp(qm3-4l8jPEaUiNE}OqK4d%d8^^!+MtvzC0zU&d zdooB;T91S3|9B}4xk2V@cU|wz0XRfO(CLbgus)9U(lbRS=lJzH1(O#mHR+QinKS;T zpKG3PfH|Yt=Hf&exk}^iUq6dqt!IE|KsXoBldnh9v>pC5Wm*RM}V7l9IrOb3$eNOE6q0nZxBFy@f?0PT$|+Pqwu@D*v^6liIh1kht^ z^H6GXDSX^RW>xO<*5Wcq+R{n-=pxa-GyE+JGml^Z6=ZyA!}1AA0y9Mp&l+!{Vp;z+ zml+N+?=iV6`KuKr&T@ZrUSB&Z+=Cqe{V+BWo7x-%3B4KD{^ys50rGY&0I-d;&S>A# zislmuko)EjHJ#quj#EDQ3Gwo(@8cQGhx+ZmU}C^e{Q2x47DG>x>@Le>z{e$enS2kA zQ@~Xslu&eGro4xe3tY6k%7uo9cVr$X@0;_L5(eU=82W5Bo0+-LZ%4{V=Ck)Z#-#J% z`e+CH@sc}dttwis~=@M4$pGq=Lkd87N+pF*%^X$cs+(L+4JYcS=wI zy@j}R3Yd(Vh&Lr`X8h@^*?xC79S+rsx6A1bOf;wgh?!ssa*N)*xy=Fqv@&2!cwUd2 z^ADD8AmPW8&lCvDl|_)dP~!-oE!ljWmDU{X8`fr%)dvuDNFmn+1tSI4FUF2Furx>5$t;u}|3AI#UY%iWo%NqrmUBxHLxf91O88rQYko#e$rPmPALSsV+brSbH=Ge%r# z&4VtSH}t}=xu7`Dk()yT*|l=R+?2Zbgvb8;11JeWcGzF0t8529w=S|jG5vOBm8Sgm zuf=8-Se^X_Jj&`XxA8V=5p|siu%7XmQ7iEL1hbJ5Ny=4KMVF+^#%K8rQa5j{KyV+y zYQR2U0(!0zGuZzK@qVAw9_N8@VFy|wTpC5eYtNfLD^o<5BlBtjhEo>@s_r`xh~X%# z*G|E@h(i_XE!7?K&Ni0QGz0bAz`ZA&Iv^5L#-?7pa`*`Lv$H?U9~@!c`Xms|0Jj&v zw4x2{Z>1rsE2dWFSJ43P_Pjf0V^H^eni%SHt>6ANVz1k4tl-_+VD)Y4WVmDby~sIs z2<9ajFT{G0#hw1W&V#B!>4}9D$Kiv6I%yqVagx|F#gthA~7fM%p9Z3M_s*_tK zYzOG(rW}APe@Iz_5Sz5I6bl1S2le|AYF$g3RX{Qi9ehGD3idLW#HE7I=8PB2 zXwh5mT0(0_qZbvkq&|OV`5v#wzIK4zTx8zN&7D_mmc{CJh?A8VL`K>lkZ6wy`N9DO z&wqPW45+jQxFG(&h!7mNAz$*x;t3#`Lm`unp?kEZY*E$1wq_v50I6;1Nv@y3&>xQ zq2&ljbMe+R&6Y%9F1exp>54Bch!s_HQpK(!e~pdeEqi z(Z$Q=k#)%#?q zL4p#pH$}3i`npbr0TRevP5$WQ8H};HI#?^g>?LXn5K#F7ZzXog8^($xc|_I|tekkf zSm#xh%HyHcMB_urvGDOw|GLW>8;x zm>5Mf4ox?PMXb^vUBGE;keoKc2BaTwiJ17BN$$%6(%=+*!~;$vA<|V+^{Jr$itaUv z^{m-Ihj$!Dwn0r=BTfOv4b;<5P6Q`MkQX>ah_K%noSGv4(NW~D!7_3glW?dZic6<9 zcDdNYql~%DFbrlb5=nKJd-LWleCqN72m81$-bMK>yy|xR#_1`HKMyAkY$qav`~7$` z8-lDGXXbC5=F%9RJxyRK2_Ndi6-;IiZNa z`)L5wwfh+cXV~M+Pk-7?8wzno!@RfO92gJl z$3<_#*suHm?;dX`D=7di{MMu|wkZ%#dC2`&dxBKx-q4>Wz|Ti9 z{`rcj_M`k(42b(Lz*f40iWs)CQxHe@wPjEQX%_~b!$K={oy>IreAXBQD>RPcoc-zY z9Mr8MSq3Z)?xZ0fqPK8?J#;_)*$Z=WbB1kSW4PAkuU#yVz)EvOhV%hD@=2PL<;{Ti zQYtL2+Gf}vDRDdLgcy>iLwdV5KOx!2{U84P;GL&OMvFi{R-&>V(}v^Cl0GNpSl{VF ztoG3i9zWUqHvoa}4f}R&oI^H?AUw}sv%Lj7PFmvLt+WgSJZ~acuzxs`mZXn+l~O*l zn|zzT>P2ElK13#fT-SW005FbF*&L9F+J3E@UAcfP_0y#ko8AGN>j;FsN1;9f2mM7k zXsDW};LQkvKmmO}uUQbh?)ENMpA(@n8lEMQ8_xK@hSm!TGVF9;2r#WHW`sUACFGf| z9pIu0t={jx+H}53XNpj4?k;%)>R+m8SV_Axqw+kS&{Jc5F_XFV>j;k_;)c6a@cG!3 z(tr2RfOhb&UmP97hp>?#SS;@+?;!4&eI*w&o}Jj9D3Q4z<9;+ghIC&5kaz3R-^K6< zZjJe|F76r;)>mfXeTP4ZOP}@@MsAXIlZw!LOg2u3T=nxD4GAlMiz}u!N&i$|fPaO( zBr`7e%|rR6$OOkak0oH&MMtoT8AxVlhWUt0=;u|#1ZMu3cPnz^>$(*3Ibeqht&-HS zQ#Q<^K<@H>d>+BSEbMIM(`d-D90hxi%|^<$b1j8Vjpyl)5gJ z7JMS$SvEHk@J@F4Wb|XiAB@07 z!=h|QCHkF77L(dF=`F)aqI0S+%8@^wAd02&ze!ZgQJ4;do%>1cm+ z#F&J0?8Q{C%0!gkx9zh27k1EU?2ulZxV5228AzThnGKoqZ6{|V z-SvHQzgl>0e>EUZ3_X7931Fu*WN>A0k1wH*&bfY##{{)Upf2y1fS%d0pHA+(;+Az~ zF|g;HP424V8Yi23d$jIdjC+#2P+^)AlQm!$8D1IaxUU(eSK=NrV@2d@Gn3r(x)C9u z8jKku)=OP=gbm`iMK5>%QI{U?eaD+tX~i4n5B`cmwe&ydn!H`}fFn#F@FhpinfStl zo<_BOX(?--^Od6 zW$|g|=JR$$7h(roO8R`@8C$~D;aGdU89boI&wO30pLvXt1CEVHwf($bCjMWj1+aK* zNm;v^aT%ou2%SqZ`hboNQf81Oy$E==X+`@E0ciq!c=2TM)3g9fVs=0OMF|Cac^Exd zFZ&1fMhja*L%q~V`nBrsKP{~kyaA$5)nBmjsbfV}e|b*%fH=!6@?RM7c~1wGh(53n zfPg$O(@+#@Yj9->^5+20Ft;a0B}ae|-+#}sP2-{TT|VNk1|%k&OZ@Env`a{)|id<7xu0eRHpKi{v`Oj#;$XYmGDN<~hm+hZ>%DM2wA z`tw@C;60e90_d74>^4f`ha16zX*1+eG(aJzPOE$TH#bA?S?SUr^9$$D(w22n zpBN1QJe}e{&$^#iQe~(g7V6t`P$T$Pt)O?3w;!~pJB2^ZO0r)5s#i_4 zdq_)Zk_5hbeIQ!#O^m(m5z%?laDF4%cR2q9xdG>!qjAUKtvXFYpn&gM$gwOObv!-O zu~l>&$F)3tl;-Xo$?{(=t1K`6i+4R_JfTOPL7^nXnSICm=)?Q3FNVLVtxR;^n4!n{ z@~~?_FfwPit}5*7e_+8Yd1lZtHZlwnQg^=tvBR{M+h4q@F>?#n{7_(V0nD||(DFEO zG*urci1*^8G#~GfWSX6Unh62p>xSGND?g3UXQFyr=}BlYi=Rz!fH>10U{PQS()~Do z`c*u>&5H5*{r8#7hw4~Ten%pLBtOHlj=@m!RQ!Ls@8bb>-m!NRi0?-f+yp)VZ(o89 zIIo%Euk~L%@ydqdQ!YP%)|~_#7edku!*YjpjE5!un9WokqypuRz{Y6YGxW6o!QG*` zup;?V?Kx)5R_{EEULF9k`R@#>xZcDV>SE@xX@0rC_7K?DZ0{V@wXxwIiY(<{u6-Tw zn6$ z|DDWNy_G6eAC>}(cNy{_WKOj4!>xVqGo9)?tYQCquhbF-rP|sZ-d^KBt@i@VrhXNu zzt+egn!e<`QOJ*B95W^Z>aNTA<*(1a6(!a%bFV1l=dT)O^EMDp*!8dueTlLxn0l;IL!kA;A!wXHMj{RRuH5$`ThU`2Ugg6&OAM;+d&>`*?i;!v`}R;@2H z&zOJbpNd^RRHzS4MmPp*9QA7ky{Fda{JR@}sLG?f7O*^YM$qn2+d2UT*j`cJ^H5?N z_oFOei~iuABI=zd^`$O2HIWR>rP=@fezXB0CN@H-F%U8w&G|vZyr$aqp9z&9aq#O0 zV}p5J+qNYj-*Q)^e@Fsy(BS8Unux1WgLyg6y9RqyE}V9RVDSz(X?i@w*q8^Ny7j;) zr9_(tBL8Ku6W#uER>8oU*G}AY0{YnJX@u*k-uX#JPa080Zm9wMm=dLEz{?_p>7ZC2 zfoS*2Jpf4-1@cWY>E<7UIb67?+L>@6Xa)E3;XQ`%fHYY&1X=42-|xBZ z>n-W4s+!B`8?JFd44r|a2$lc*H2a6lBFCpBU@Q1DiE<&xd)#zT$+A$%=*H7T6aDKh z`cK{$SjPLxIZV%MAf8aae)9bZ-!}?Mr`J5 z@k&OEfeDLN)|3CSZz^7Xdl3!f&=GKN60t~={XnE(P0<1ZzB#4ZAI%!+8-~KQ=BXgmXU0>Wi(a*S%GZ?NP} zK>A1&jX{o3JC8@B&rd5#{xA!S%YgX3q}{zi{mRb?&nXRJ|16vJT-U0i{%}G;IG|TM zaZU1E7X{yb{${?dm>xX5)I=_wT+AM6i2dCpWq#OV1Q>K)582KJ_~;ed{x zMbM&F>)W5%)OG13)zXxfm-d zn9T{2me#$I4J^C0ej9J$V{UTf&cE+ev}>twuiAU10Y;h=?D@Ms#0TKX5|M1sC)(hK z>3-*XG@p(sji>@@{q;EErS8#Nk8YfNK#(N*411FM`7=)SU3PtMca3VFPkLLxJqoMTFW5bI$q5D^c7P+S<=S6;NQkOsN0g>T{h<6RS&wr zGpfQ*Q|A6zzY*r^|D0E(niNLr#4QSliA;c7-V8l*j-z!8-3~L?SC=%CS8sy-Ll{hVnE*w1qgv?ghVT5 zv=WHE6Y%THoyhZLocHS9cUP@iwJHZWI446P3HQCtc4J10BGlvqFFo_zT$Cj{Y`Wb} z38J6HIGMJ&xAsKL;jCu`?MQwsgitmHqAlDDi<$rM1iTelea5 zRv108SR_FZ)Jyd)3PM*+GbrG@;JDC8I4u>Xsss>D5yNY3>+so+;*&sZM3TkIV(13N zqwW@2&ii9N=#?l+EHb7qpqRmzdnE~GT+W67_1P^0q5AWR3CRZ^wHFBdxcz!zm%qSJ zI3-Q^xaW81y-xYq6=#UYi?cS%Lh0}8`|)%@Kdou}OHj|!cJT@f_5`LHoUgicz`ISE ziu#N5M9C8-8AUP|8p{vf;B;{QxMe^pvRj0B{oP>#eB5aJv7W0$x5AS)UO6`1sQ>-n zOc}r`Im2gTp!wq503ZZ4uDSGs{6$)#jdNlFdub`9V9>VV&kQ~WeQF74289p+t1vpd zKmYc#t^#LF3dG(+k7vu&fFl9u1IV+DJ@6Vh*1GZyOBiipqBF=WW zVMiWy4i|8unW&Y$+SZE?aA1oAbR3I6vwv5z2l&4#0VZt#UWW%yJm1zEAM*$Thu{(c zuHpcGaFqm$g%75k``>*ztu@;kO=eT+@g9rgpocU0BM1IYJU0I?XL99Ohx*#v!Ntu( zN31b9=RYs3p3Y*VgZGQ(FdxYmf?@h|pyAKandb;L=F<$#$b7&U5c3HUppHv%^y=X` zTjMgpdpu^dx@p)a2gqDi8rR?aK@x=Y;^#a9H$uRlcNO4sKmkZT7yCNk{kr-ifbrin@tPXRtxw^k z`7S+10)W!X)weFCP?d0HwU|7%k!YSMF%IsFmY(se9wT-*=6eY$fA(wn5E5PocYA_8 z$tef844=eX6OXm-!R3B%nYs#k&lRb=!QJ=dd&{yG1$k?10GIn4X0#7?MoEAjc>D@r zYgfL{pd-Ie*g<*eR$boot^Gpi`Vn)!@)Td9F z9h&u0G<~!g1TBGoN0uu{c5EC3kE*+LzKSK6>UAx9;ZL*pN~KiiZmU!k`#XL`r;D+U zq%$NA`23w38oU6t*TLD>nlfKlj^p@LwU#fHSOnA`@FxVxvzxnlOl7|T(1)uz^x$_{ z0t1_B4%`M{5v)aOa{xXPz}fyn0zyJsAU>4+bnImj_KEu)B1Z7tKz`$Ecrx>-1+6Mm zx~Y9#uE!*^F2jdr0`aXcQ18Er@Cfc@_CzFs2S}WmWi^(K4`dw(C4Xxbuy36ZT6BBmxH^6`~a`h1bL4)n6=}i&j|LS9$LTu{w_3p(`QR5*%bUd>Ahdy z@VUVLE09?NJKWdHz)hp`rk&aw3OJ2{=};o1z)r+dP+ z_rt6KHo2zsQj_2+<;B%SGE0s+w+KkJ^)nDtO03_Li@`U(Y}3Z^$V~+coq!5h_1puK|ISl>4J79Y3q*clpDDhUujKku$QcmhA8 zdHltoiU*WL!Aa~oL6I0~8;1!9 zq%?;x-upyDpA2tE=OBb~PS8}4j23p+)_C8xVw^Dnd$KwU0N9j#jX(4n?Pz{EbnNR~Hh!fvZ42VUM6C*2p-`y)JJEar!1VLJxvq9z{-d zH91y^I31qQ%Zlk}z~(2|EGFz-Y#fkYB@TVGSX$!#fv-LmVgJlbo@?VZG}=oJFGy=x z*1PPcxY}v9HwE5q%|^;rv_x5o!n?=91p2?mup!!$jtSGnjk(A z_~Flz=ZY+oF-?cLl2xC@&{z_Oxh2+RA(8P@bOit>o+sy8ZB+@!6r`ay0qSO8*1e&O z338^k<_*kq;-@Vn2IfNYLgX;-rv}ek70*rg@i<%4!%^Y%bGqR>J+6KWJCV24J4^k& zTF&i9VcwTHT0f2lAnRzk=@{XBBK6s(y(TEdk&<;r9o`Na={gryNgw+K?}*%LdNwH+ zsLEq1gE`&~e{(@N;|SqPa6(dnY!>CyX@+xJ=m!9cKj?mLK7FN`H#$dA1oLReA_3;J zE;ByV;<65^%la&}U0Htq&YUnm@fff7#{l)ab5b$PU2C>$(M@7<#et1-!3)0wA=&;^#Q&QED4o>!<*>#KRrr zlkZAf8*|1aU681s*jeH3*&?r3n#U%JK4u3=d+4JS zVz-&ZryG&my&h4U0Wl*~N)LK^S1uM=r8ri3LO{dDcE{Dyw**10qUMc-}=2#foR=KGH+eI9eN z_B}BdUr9^NRF+O;ap@+8=BbsaA?+UTpUdm4-s{^@AM>jk3*eR@-Z zY@nEVS>`^|aH~YEX6NT9j#-d;VcixyPpfasrrWxySrdjk`Ytazo?BJ#MLKHn`J&5W znZ2+W{H_}MsM2_yy#PjgIH;c3f3cGEF$S>}rh$g@VZ%?uWAq&}Am;$&JcKxWejZgH7}USIC8FTrA7>!|wVnVs{WixA^@g2{{6D_w@Q?Ok3Y{id zoE_jkAne)bC>{T+7V=^WlK?za01rfv(BapNstN+_L*TYheGN2w{Zg(vK)sd__DEBG zfW3=M*>LH{L(VQ;KAv<5VELOeub<;3(pBK8(Z2E{Mv{10@7F4Q4DIEN25m_FnsHSH z_kuYK?71&F$cuagJ{aJRXjEvwN-;-2&AXpbV*}(R+Cq2yHMcLGxEEPJpwt!u@u0Z+w%o~Vb8N9fIFAFfcy_G;Fj^TDZ!Tq&QP($kjovt zf!9c}aoS>kv~r+6!?CBQ;g{kqf&V63K8*bZ|M_)Dq{5^MBpfk-007cl78?4773d?P zM6n#Bi^0P^QXX=z+fj!<=1(t++h660)XN9l5x)>5a_EMI!w7q+QwuO7-v{(zaq{P>H75W4ela36UUwcnxV%3r!kgiHKv!nUl%jb-X(r+~YK);P?a}whJ1&yB=B=5NJG)evhj(?B9LhHG2K#u!;AO(`d%?C6Exsg}R0Q z4twkbYQ0y8--ygQlZwJos7m|f&p{*fMyXNS%!fhZg zwxriLh>P`9>xKIM4s1FReC&buRnOTQ-GgPC(v109_2|de2(jY`{n>XkBffvX1KT7E z`FszCjb`#o6OMfV2Wawa$>%s&2v$)lANtwOSpH`wV9wP^Ipv|Ekfe()!*KXwkMjtZ zuK7h#6n4S?evs20F9Zh8W$Wu(h5pFT>+Tbgr^{%fhER|uyktB=#`ylL&USupfLwcz z1bL`fE>5Rk&+T?k9v2kkwV;AJl~1qzTMs^;Y_399&XL^vFK(|I?imX(B;Yh$_<8*k z+{GB-F7;3dtmIN?jw1XHHLYl_G{F7G^TRhXADe}YS2{tL*Xzs8H zDK^c%+3uuO@?(d5)y8QH?(fC7#UCD7qO&Z4axRsFFk`zAT!?D6*MUgmKM(!fJfP*{ zv9rlWfY+pONKPho8(=Srw(sc`>ew*vpBgI2eD$%%a6KhZuIGO^ufOKj`-_raaLfoJc0Nx^h%-yB-4f<0PJvayGZowJ_Gd#(@D~WVF zP5mCSPzTaPldPS0vXQENZiqScUntCHCVxeA8RVZslk9Vm9v$`#F!j(n_-EHdRyo04 zK`3IUagr9O5p&rAoxG9BoZfhThU0wFNa2sp~SaFssX5$ z3lk-}j;6P7?m;cY5cZImR<~Jp-^&J2B@hzvUX}zLB(@&YqXtCyJPVc+rtNw<;2gty zP**8}xQU+UsjpP)Ygy?28s{0ep64u^UvHVSZ}vQgu=W@+CW6jT>k{gQ>@bU?J_h&E zNDOn+8G$>@I7weHq;{@NVm2txr#S(&m1h(jQG`hjVW|n=e*z;>S_S8I|7=%frs3Z8 z(BMvpF?dGC)Cisj&!gx{Htdt{axRzQo^)^)^7!%D!*+*Wp1l4M7c?yzXGKT_ydwQb zj#^uJ8|ggnv3Y;lN5cm0WdGUY(L6SqE>(I~a;PgvK+P@UM-z7YNFavR_t+$8?2^8; z(<}E`D}n_M8|wjArqeX-8aSM5pOV>gdk zaOR8Y-l_u2hO(lx)oSG=cn=o42BWK2Uuv)6+!vrZ{dSd(`HV*+E_;uGxN=>S)@vhT z8_M%lvFhDoa_^yEHq;@I;5!={w`uJ~4DGv80cd)bvyfORnbS=;+%HUR+CQ*;kspSf zcOF03D;=f-2{BCQ%Rj^Y_`Scfr?J@5UT$`me+99^UCzYBKh_}Rjo9sQ{c$2HG@Z%J z0td#ikNuh=+z$OE;Z*dwttTzQuU{rL3Mhe8Fx?htRiMF@;wR))i;d>9bb8(A*+m2G z5a{~ybwra|X)u`;gTpUSuooT=uXVyb*V@H*U_Y)8KQzH@3{z}~J%APRDy$yF(Bem1q{6u0p<0w zk1s{`P$I61aoQuGK0#&I$9xo-Xm0z`n1~WugIC=k7(_TO!BqV1RG)@#U(h7fM+w~e zVKZlf*>R{hT?y~dqZ{vqgx(!cV-jk*P5inQ#LN;Bdjgpj{r4Vknn6F0jLW{TkLdcW>RnX4bF1#*+qJj00o(xUq&;s z&-ZOGTTWKZyVmiSy?Dl#(`A`xYf4)b`rdE!bE^3X!NWKJd_q@Gz5S!Vs9!pCEZkK| z!@jsvXbWnTcFJ@x=M_hJ11X73VfQ|3?a@NUuw5nbSJO=6|{F_(ES zx&MPVI-sv7RmxZK>3n(Ye7#D(fzQhP{e!v1haUcSpYM9z&I;LLn(Y7dEWY%J`%5qp zzV3~FGSMK8hhgJ%IIDv5)rgkx!lG4rp?_aQx=uyR(BR<>!9ubni0;ZMxC&RwDs0S1%%B`4cz>Vqc%LsW>CSSYOEW zzK@mXaq-X^g1#mMoNXhZrYu2bi&9_7<}W6{8?BEQ5(E1eF`Qk9s87N2LX<+SiZReB z*1Iimr-WlOG#X*gLqp1;!;pOHO{K)bUorsVomQ<@04IKg`#06!J~QlTu9r65cam(N z=Dj4?szl$R#-4u8Zi+=K&?u2&g6Z%15nUbGt3YJs3xROY5Ilfb2Y3ffa5u5KI=7l8 z{%nGBcp@v$CUbu6R&e09zT9A^jjCi)tr}UJ<*_IlX6RL%SxH)hH#6u$szB|^LAEl2Fx*xKyQvaqw@P~$|43LC0~XC$0SnSFu!uleBf*w>D_Nr!XZLy#}z62p2ecneq9nQ$P){D)H< ze>D54D#L$f!}U^}UrGUGT9fziA&FZ_u<1C(>42W+7;qDwzmZm5O5Q@2yPYiq#`wmv zRufJcX8HR=lx3~j2X@JmyW}^)Q;FAb^bd6?^Sjq z+kFV$|9)3rOV~ z!-Dr$tKvOhBtc-qH-KCEpa6XJkaMW16GFWM3L*LXp>sv6)Q|qes@;ZxWutK1o>agg z(3cSE8Z(8z99juWY#1D$ByWj_vzAL#R>z)%eGmU=U)h&G+7_xn%a5}I@PS;C39ppz zZ3TDPCp3a2=MF{FjZQY|8T52=%kvi2BO9mM*Man*1}DSY-G_&M0=PfckL!#A$^i}D zA7(;iJLK^DkH7Cu!oJ>|iOiuL&M+w2^nem+BS&I5=7Z6FalxfmoYai-^3V#0H8pRjwlIR4=DOKPjk7!Ej~=bB z$yVNcKH!DmIP)AyOcUf86Cl=+yK9fzR=@==7pTp%G21&|hK=V8Rllb*4*5`z6YSJY z7J-(sjH6Tl4a>s8>t#g(fw;a*DFXMEGGxy(1c91N{R14=|LEw}bea{VV=;Z_G8rJm zGnWN71Nj~ouk+FFd+6wZ`)5Dyccl!+8fpnAQ`PAyNU=Kj8kZ&~Nx)|=L~d1^&sJL( zE*adnKlD^3k|Y%i(G^49B&bF7fN>pvr8~I23tQnCUCVGj$M+OV(aNG|b4YU7`ZPav z`Mib32&dfn1-$)*KlwM@hLV;Apaf4hXR~cKI@1w3&}Tl+*c6L)G|$y zBt7Ow(VU~eHNvv^VQS2t<+I;LI^ZA`^Emxm~0n0Niw@g-0)+-VxxR zjYGl~^xU@U##t@``?X_y(Bs2918`A3kEZJM#gdyTq={9|Gs2BfD-TOS=2#vbkDd}J zM@mb_jNL1mN3%7x z*X?=D;H-v7vjc1v<}Ana)4QA+5FVC{^L4qR!yV~pP}T=I2aL6d#e=Ysdag#b6+0XBkh=gJ%!VPr#+!6Q3)-if)6!$*4GpOfs@$Qby> z32~v$mv0aak6ZL5;>S|g^(w$J2ktw0yN|$q{VdvO)XiGIuQjfijWWu4k86!?8_6ycyh~ct8LnSr-z=zIgr7mqeF+-+5{8Eh7tqfqPIO0d8t? zXfTO)OZbB&Z(3;gZtJoY;Kl4CsBSf%gRd1QrsV6fo@*w4%CGHnT?L=w#U@%nro9O9 zLw-?A->9D~36znLF2NiT2D_$tZYrK?p;d*WNyOJ%_*}5282A<>!*)@p?9KFfa_nt+ zJ)Xy~_dz<*&s5?mJl9?m;@fAI3^X_aL<>(^RPTxC-6P; z7&>Z&i0ZJ(H^#Q?O2sRzX=b_2DQz)C1A=OBPb+*~AO37L&}0`+X4Y9M9Y@r(ZMKpP z5Txa&3#@w(5mQ4C!&GLlq-fF~&Dbzuj z1@XL&m|L66XW71PXCrfn@_{W}Rd(qoduRmSBW0uWw`=BYa{uL&)pGyYxu(z^;LE#o z-MH;EI_jxA(aMvov%CHLx181am+ygiI=|+Bk)YFA_@zfAoYa5&m0X42^Ja%H$}e0h zp8h)zfz!J?q4=p4Ke4YlMJCUu_w~-u^#u9Pe}2cG_xG~OJpz!dI`k7xEE9xqhP*rJiv- zfG^=2K4Fbnmv6PBHrc=Q#NHaAT775`>A{ciUJza=7k&0<%2=A>vg_Bp|J@yYStmzW^;j(!cs47eI+Pu@EEtf0?Dx z-|_oz-&ehURDV734*2y@6Y)09Y)T*>CTO#Ux?N!H2!lJE*%f8YVpVz8m;UZtt3;yu z4+D7`k$Gq(9bU3DPoT?6^Xv*uLRY?|qL=glxO98`Yw!M6M~tcQfawf4!=#W8K`#V2 zjw*Z+;=H9d|9oho@ldnC>)&_P%k1?r8!2=P%fW{SSRsNPvsfDezKozw%$NOie?Q>K z)wK10>=mN>WQ5Xsl_F#mhVI~@Pc(-*s{CGd-87HT7pQ$ymtV7xnwNreQi6Ox2K@I` zN43aB=B1z)i$3?&zjT)M`upQiq=I`3bryZfPmpw57{Et=XZTwk zpe9s8&q&yNrBr=ia>usezU7{i9Q6$iWCxrN!QPtvkvq?+)C9!rvIZwQr_e7TDKFNU zEeXyE>VAG}t{K()V zmlANdH=qGE+sV&I%YpDK)AHE~-cLY|as!~NW7i1k{r&W@1WAURMEAgRyFLeRW6|k0 zFAGoQ511bZ?5K~xnE^^Tbo!u>8PqzAj+%?v0sa*La<;JD%E6t}W8duX&fvz@R?vDE z8j@%MK4Vrmk4lh15D?JUzOIyVWpN!aggh97(t2|L?qSu7e$fu?JLsD+JzGy>2YjfC z^;@D#A)L$M0&rQ)#6d&i_;Y4%g7{1$~#B;cU|ap<;67t=g3fT-mr zBhfV1KUgQ3yYi03=3=Afp;MU|U6oD#>+0|~BT3TVbN@b@Tp-3xASWxH=Lq7b^j{Kk4Ej%>i4dP)qRg{Oo-X8G; z!HC$Ky(8x-0I4?34m|#v=D}llLZZE#^Y?5qYwwmf;Oz6`q08Tt>$A-HJ_0mmRPZnX zoHYViaPG7(3m{y%z~M%poE~-P1S?7&|_!7@dp{-W)pVX%u%gXEzYFEdA3NwIm6Fy;E?P zEeIE^_A6En${>Rr{*eTW%2}|MmA(`9^yZHHQvXw5l`kJBTzsfi6}6+U$JaP!Ne>X& z?z$#Va(Hwff=p&p2Ise{pk8p<**q)DM0)J05ZkuV`^z_E-1S1@J6s~V-P$)ek+;(C z5OH{oUu|p0ZGHr&1$Q)Dqq8L**cpl-FErq!d72VTya?*BwUpIq`!-)AdCr@<<_Y;E zV=kdztAYs3dhx|=EA>EVctB!GzCYn_n_d|z4Mdl7)$dBWNBb7YGP$X6Kwy}53D zOE7`OKz&CR(2cmU*a^Ex0(cNsF--##vJAO=K5jBvi!0n}>I-8B2MmwQ8 zY_aW@oQPKGNmBu+fZjy}128r@h)_E{g0qwC$n_;wgFNpg^3ahVSFge^mEPV?X}|(r zu8|(UeAq`m`8fIEtY}gukO;`U3Ty^jp2|=p3j%f7J8m}k^@p3_fqI;Q{PmwR&`Rn{ zoL5RtY41HaLv!o}cg+LlFCUirF>{ll>^!nu=lN4G zeZMkKH==CA(n*r!mHuTSMm7W>gK7J1k0*`;;2op|(VrZCE=xu7)GFiC&L_CEA7bxz zx`hRbE`u(_w#VnJ?-K}p*Iyzy36ZH^4qrzpqk6c5UXsiCVFe#PZ(u_#urNYMO+WEA z0lcIIXXnc9mHPvl69dsx+u>ifpNq$BC2C6Mb&r4De`a)@KRECuio!DuDts1W?S&K| z()Kz-M~u-LD5B{)zrU)j=i5R3Y@>~wPk76O9_4!YQn}J941#-7V9n(`U(i{WappTW z;4A1-XUI_S6{d0RT&v+i##2F+Xr;A#&|7e$Wq!(X71UEw+yj3#Q$PJ$)>6D8b|#!W z&}I^3vWh;m=z_R@K2JA&sOo(kJORPD;OsdfI1(~AP!av^DKA3P)HKa_naX5z0hfAh zh6ZBa(8Z7T=7C4>`0{@0v6FkknY>MD<(naG!;Ox!?{B{K`fko){_+nmJAeh$CvIsE zq$@7njVT_&#kpK-8{5XDLTk5EeQ&T(jmx51FY5CU-Zbh??nV7EH>)Qlobt3D*0T>E z!*sX$`ZhZk%%s&yx3FhiKIrL^)2I|2`uAsY+)l->^S0`Tx*&D!V)Thoh)P?BFvt z!Ws>gv6tiXyp{j9&-4G02io!HD!MP^4X_M@!x>w0iqB6cFL*1W88d-}Z^(0eJ$PN2&98%;igaM7G}}Kfh25 z&XSN84=^8tua;vG0cZ0$anA&u^{wmI(Y#TSGc{gU$G)*jm8Y52aSN7GPH|cm;)RTYk&otYE7tF2T;TNahDEhAn~q{`zJwRk!S|oDg~bR_eG$lrEuX zG#r^Ep3TP&dDV?9zwHfR;dD7X6Lo$THaT6=oA!Nj$?YHgt=DRc)VIC9GDG8@c&XLr z&cN;|0sD?r#A>c^hdX`A!Y?Gtq~eahS0!DsQEont^S#-3Ge6N+f#zkbIbmXe-A0G} zdCzbURF3|$yGRC2)8y1^qG^&z)ryf+faf3Ify@Vd#85V!mW2$Q7gxJlXtIItP@%w z^BF^*j+3Y11?rJL@p#&w#~vx%A=br*ie;C~{iW?ARwf|yE!a@DT?xr8Lpg zDu08+CdfCj@QkfeB`#*W&W!m5uiJw=(y_rnhZDF94 zt9r58?DOKdB1#HZk`ToNfZzEwOL;OC&fAi|zLF>5eE*+lG#mN|byp~#`ez^hs9AlA z{j!`r`@3JD{1d}4XbgJ^5%gXRGOGTnr}^~wFXLn)C7qXn#80DXVi+c@x0~Y}n+#ws zS(ZXAnzcER8t)x7R{ad{jTymlw6D1Z9uZf2x0B!R>E_?abe<6ax0x02RE>C!z6M@@ zz@3U@yNyR~nx2jrjIJ3<0mn&^41z1RD`hqTQxiwJoeGRv-b~ zslH9Cd9u~?gLE7-j#+Wy80>NE41m{mRH*-Xxv{k>G-Y`DstrgER~%g9iI||P&7ld6 zFLLqrCrA+veM|5i>1ja0eH%7b6lE|#>WQClUY2kBG9#L%ae6w*b^~{v_ysC%EdcETvd5GA z(E~sBl5p^PxQvk*ioWCF)FfZzwP$d3>jM2hMLeCSyPQ}aS?}}tjAlCmYvTBZ+K(*a zEd+~FD-m+B29z^$JLj^lpWxG#;HUYR7#uVuaU~!IrbW?pT@hA8-lthbuW*K8E>P;I z=|N0pgWm-LL;PlJBgd}z=!ekX&A*OB9Idc+KtLU5pP`dE(Nj}&oF~>Cd+=~?ctpWx z1Ng&t#lB6}J#^25ebaH}-UfQTLhg-|2(IQ9cs^tj^luLwI1rtNBK{z40zyYJ3@DPl z4{d53YBC*~<0{B|Uz!|o)yy;W@T`EELtpS5uc;5tI>qWT0**0_(gTPk&6MziRVe2- z#S|vo0dCkARSi5cmbVQ2|3Pbl<$C1DTaH1kav%0|5c+GP&5a69~^go+0xrcb*23Z!lv;84JELqWXTNN zs?P|0l&a}|f1ER$dbxw_JQi5XoLRqw{ciRhhtQL`IG>nr6B^4RiQ>k@M?DEZBkC+c zaUyF*y@56W2{5lKmfmUiB)Fb#ZQn14Ua#V#9OF&%>GZv!xaRLSW4R?*64_ z@r$3nW%s32amb?4m_7nCbS8F{SU&b#Gw%FdlQVFm;hF1^me&ALHFe`Kry-$NllOIE2m?-7)#x&w?s?aRJM4>WIbxC_h=VBiywZj4FDs3 zJjp(e)-3=%G8uy~pQJX3Yl}ldPtQ5uPIKqvuI)*$hZ9f_(M$O&7Mvf-yQ!>5h%Xg^ zcsQ5&hsQRY$C+a!p5M4vKTk{%!FjF-EPUvM^K4h~j zX_jlZhQAi$`~0A_@(eh>goIUTmv>L&Gb_lwKs5~J+|Ly)-|T?{%1hIB#UiB1i{R^z+CAAVM~W{k5FO$53aLx@S*XSaMdxm~lzFpODsJFCI% zea_N)3p2)NLvYr|=FlC#^)%F)4m#2`NHVLftBEJ*Z)i>$X4HX3K)%9Rem6ON z?PnS1XJxhVIavgzWi_7*SQnCFK#UPKCNYLaOs zUEmH2k!7Tp@%L0Y?RF;({$_u#`3cc<4{yuQg<;)I;$bZ-0V(qQJ;@zui>+WbWE^W> ziBP2gUwW6RQhaXgMr>&{oPFGUk@xw-aN2upQ%rW)XLA3Xs|EmaSM(C8TB-JdB5)TE zSuazC>|u-Poydn{VUO(nVfS#K42Rb0Ub1_$wG27l=+o)EWZeBFW0F_Y)--}R^mW(* z;Ob?FTb5(DA;y)lSH1b8q0x#MtCoGrJM)a|KQF5WF^cVk_jMw4@x38K z3+Eaa>HJOVjkwZ?INlowiQ4Z1V1CN%&gHq9LGcP^KcPzxRTFzIdf4xhe(3)R}t1Ha}V(Q*k52@YpFp{T54a%(Yb5TZL>3^6h1pL1FnT+ zEcENk9k0hN$b$lH$>VY4P==YJiPzKX5+Gg_oy-0Mu;M@=OFS{;0`+A0TVT~Z^wAb8W4NdGVWiEWxWYez9-fgJy?%<| z9amc4R#yB}`IX`#c_!+P{DAwOJq}-~WpG=l2LP#+|g+8As15gF`dcV6TD`H+1V*F6LwPvqEvyETRD zO!F~WTlC!5_T8xe)cAB+xjmB4JPO+-gH|dT-a+lM+U5aN-QXVbTn;A?R-}ozBd`|E zFJ)P>Q?nQ42EjA)+Ag+Y}9h8GL1oh`pi0j~z1^JG)XV*6J|L zsTiF~LdiU#o}4&00AAf6k{?qHxaafCHI-8zy|DQ!ws-fAYbvjukdOa-e~?^%4HR?z z(|;D$J9}3OR}bkPU~2RUC%yT39BYpV>8Fa7r6*2Ak7?nH0{nVMka=8W>}{W994Cdx z^Ux~A$rLAaxoEvEqEB|OGstUJvoJ9FO}j^3pIQwXT9EC{!}JC5&Ax^iRI8vtmJ7J3 zs!Ub%jOpz~YoXfj)R*;@qpz|;isJjShhqYG4)kh(mP1L^NVj*CXLH-}JkfmpHsnur zA##yGHXw)j3zUC8=0<{N`3St8B%6Lf_ep*6ARTtYBe)X`p@VDd>jS1;q?t8^QxK>3 zKbp^lFpJFj4fr~Veb(u$O46wpOt#6S1$uG{wu_J2TY1q)YpSspp6pxIufh$=NX?|* zajQvPRPe#~XXxY1$xate!eqnq`a31xgw*A?_v))Ue(XbwJW;;f#Kpj^7{n8MR#$CS zU-S9aQkd(VFk5J}1u0|8KIYD=w7UB?NQ1AlY4)@7AiU5t$`$H8kx#+B6s21;lu$;g zStBtL7JWMmGkvP7Zv*EQhPM#Cernu_o0_Tk=yfkk>055psfF+?2##5!v8FpQ_E5H! zBAvJ~=+DuYc?Cn-IDJ#x-o0S!c1>{57la)?V*Na{cf;>EM4lq0Ev_zqdS0?}y-{Zs zqlOv5;JzQiq}_5#(&yg$youFwTeQ%dP{We)bGj7(*kR7Cyj3WOi0pVe{H*yscXM*W zub4ScuOu><&qSv@5Qy@ibgseX_Cd zl|uH*g+MT92}v+np3l8lKPc1C+Sg~-dr^KC%j;1`TIWx(Zi8=qoab}{fsFLwK4nG% z?8B2M)ZrmF0{mL9#HKt|W>nUOZKMj>Wc27>@I45f2YK(Z+mkhF=f<9^tSI(#&qu1D zp6Zv13M_d4g4jz#%vjpQKn>WZjC)=XP&Wn$6_?)u99pB_oBgrjsyEz0AH+{Ko;3f` zy|8nV=jmM*&yKJGEiLGIuu?6n@^bA%Yof9!arFf{Oy`J0) zaL1q-x+{3XS*)`){aJ#YCKHzn0`!rj`>XYFEQppz+SMYXFW;Zt2;q7`UXMt}Ra$s< z^RiU6xAW1<9nDw&e0Alc!$yZ6FcDnav3+VM;m)EQ_nFYo)nqX0wcJJuL2f6h-sSS$ z@L&HM+~n|KKl1ato zkHvZ6JV7bn097R(pcDhk_OF*GE`D=1zkUQhiE__1JmNC|MTRqWpRjBMC!{(@n;yd2 z-pu8IKVWGjfjpdPdiK?VrN;oT92!Asg0WX3+^(@!Jq&K@M^x>@MHtb1_@*~SJgHJI zUP_vqrRfF-TS6PaUPW?vC4Hns+kF()G}HWf>^<1@jlr}RVE;o7D3SJscUklz-k}~} z5UZOwCZo>{cAtdH+8|^o41g|Hm3mYbK4@Fzwa9A(PL5EomyNQx034rulC+- z*Kur15PPq$Q0IM!$jiLJnGzGu0w__UMo!`+-Mk2J7A1-^sUe*}KePe6?REjK0t^&v zRQt)VessV1W9kQ7pWwYIoiWa!$c)?F21=O`agMmT_PD0KCT$9~8pq>vZF>A<4+!H{ z?DEyf@Z6mnRcbO-VO<&#XZU%<6v;>n`{rtd6(~i870ES;Z8Pl1+|j6Y7;=Y+#Uj2R zbZfL4lW33fsih(9Sj%1d(Efzm8})FYe0ds$T@r<|_1xUjFt)~o`6`!0Jm{`{FrDri z#_iG5dE*V3WZE}HQCA6(;)iOXEPMJSVe#(4M9r^0z>$DXiPb=Kp@+kUd;j~v%qS_gkL+h=vA=3OZ}%p=nl!bSBfxcM`yz(^1`=S%RG1?8f%kz%=0V@>ZgXrT zSUhQI`AIX!@UheyzXCEPUA9DPdPvFn5-dv3fDu zs#D!%p^qS%B)W=E7D|p3@;XiIq}JKllr1Du^P<$Ge7u?4C{l0cz0nL+XvUJKNak_N zBFJT87uZ|U1hS`VYb4gk22$3=>TH_ts+q?tTs_uD*pVxna7Hr+E{_;|RiLJ@Jf!-Z z=(Tlkp?7PY+5=kJtN^`@HVCpnfK{A@hbhbDfT2)H&95jzKw~*Kq3in#9xrt*31AJ2MDM#fJ|~!M#nQ8VJc{BVkXwJQ za@FWS@E)bz(nxEX@B1h&tieI{rk*8_&2*`Z`+?u}q$ILp|6uvznbSA@V95250O)fh zHX3ZSL+kjtMJpJS2y?$y#XitzjG@g2mYQs!owR{*l+6~_uGnT7%&ktBj_%A{wA=Fo zAT3!1*6ZtyRUOEnIZ|Ys%UasEzO1a@^DQ}O>!PqVZsURCwfqg4;xV;@0fvq|h@l^) zNXP;&dp)|xcui@G0?>4uCd2uh+s>xKw(cQMeG785IzI_;PY;C(V4YyNn! zu?QH~dLr>XEXj5%PB<*MXw`|DkwDfY5!@+-e!rfUGj2FIRfIMj?yPaJW>J9m3Vv{< zv9$3?NPx-8&xWB&GHtD?EXh`tiDorWZwMBZ2OFhgp}pTjd?vKpoI3&Z8zvV(z-_c6 z%+(X6!*$sEvwAlnW z8558w1}2O*T6ck>4Rm}TC?;}()B(-pbwkdV&blu3B(}*+9Bru+UX>;|UMVo|(C9NC> z91tV-Shp+gPX5$^ar2p^GoG{!Z6G68K~2M&hD}>*cNK)xW`-a&j^oT+ln9`Ubq{h- zq$xc_B39U{n3u-ug24up2j9M!U0c{ z3L1+kvFDT3Kqwbl zqsYUfz9zAJfv{VlidS~CNP78kCd#&tZ0fS)mvbrIGR63$5WAZO!0|-~bR^ImkrAk26&*&P)};i2niab2fpRb294An|PJf zT~#tXKE|1Nx$~A4k%|*$v5cK6KXoH~vpp_1T}vQMM9A_2*?{f>YivvXgc_c(E=lSQ z>(NF%SbOfp?hq&oa^gocIbLt*%;M;-P)&N=R6zCFZs0P3bIfR(0SGu7>0#gXh*_qw zW!)Gq7cAR4==J`TGfdW3WM!-`hI`D!^LSBlO0t~5*cC5Wt0OJvsZ^MD-m7O|OY3o%d-eoL zl$k%vuw`to3r>zw&S#a;ux~9!27Y7~v$1^CSZ}%2qyFk(ncfU3T{FOjtlDclpI3FD zWt>Es-r_E!CYICfHjUggdCst|xlRFt%&7=H_t|(Ig!rOc_Q5N1nH`fCxplF~_tnwf-!t5d4PE?{9t+neB6PMBUC-SPN0_4r)vPy2kS1!n9uP2OWi<V6 z#MA?(m+kOvTunGbGnT~(+I}jgtw{>&sJhf_7WE>Z*}V{S~!|b(pNC%454|>LIat-UW^u4O?aw8>7`o?#7= zlN@l|0imF6;?S2vY}NOK{bnBGVit;h7|}?#xt7tuhVoOJyPIaaD6Hw3%ma%|F-P1g zuvY1$%Oo)7Vlo2qUZcy-EIykGc_1C5Fj!c##Es6j-&eseh-m~cr#vYQ3}`%KyYS+% zQIRyWja1b9x@N!{0!hP-g*d{Xe2aO-0mh8f;qbg5tQkG4lyo(5RQ{Z&GanYfIx(yi z?zdo!BMA$2lWkJRmodbb1=@qr@x2Ils`8B1TmO*Dc`*)gGvDu+4Lj!&7#M2Jo81{G zn1$Y`$;oX5Blj z77kN@&kWFi8~P*TU3R+~4MSRwwgF(dr(v+n&e>MT4qHLQmf1Sn!I-{s58eHowlr~8 z06jIYi2!90;k-Gd^O~Ipebb8u$Z~(2z&Z#QA7W$O@1-VQ4#;|24USAdA4HAQ442bk zM4uI7mk7I~UZKNL5z2?zNE8I$n#m(U*eYuRl}_g~elSacA#qFCnIwi2qkd>Ev$%iS zYbpX{4#8N=EOAB~@z5iJOx#O`9SEmtenL|<>zT(`6H;|v8GXEvlDbdga(}&U^H)WB zMe0mhF5}}oWmHT`gXMn6&kmf=;gi{98qpID*~5$RJmLIqrk4q#099tfcTLSqJ$Kgh z!d25WQ4|~*1B(XSw%P9b4x|m9sIWMY(hbAt?&s1xWA()9dBZxe8?no=S$lWU_k22^ zh>ABlr)ka!d)&(623~bmO97|WyhlhTPy;;8=gKl2Fu~fJ_XcYiBg`K9SWh?lu1K0W zRpEJ3=Uv8w=udY~sVL?^ys`|JF_Cmz_?|@i48inqhLkI!usoYQ%54nzkY66AyY(tF zNAjMu#gQ*-UVP3g-HuliPT1hi!Cu0;oYs8Q-zR`bD}CIWa*DW~m3@CH zmq6cH%#Bg3nbDw|&PLU0i}hW6I83DoI@^)C9dUUmGN-j(wXwuLM)24^=hmXJ1ugO+=Pf~oTl6fQO0p7DTKZdrNI;^mdb82(1MeKIV7({>LMXB ziuKtew@_MpF{utVtIQkMqCV|Geel5I`m`@IS|uIRLoL8KB`-HTqF7gUug9|V8TB#B z8VwDSj-s?Eg)N}%93`?N-p%8coO&L6-jvk@M?`a@P=O2RrLB>y+~$1Tc#An+6U7`R zDQY&(mb$uhM+0WE!56~;nGwyfH;ek7JRIzYfGRhpJS*u6JeLoCI+#%#q^+N+7W!@;+Fh&}onq%RRwyq%!PYhC42AgfP z@RV+$c!(s5XwlH|B(%IFpVdOt&?daIrBR}3&bf#cO^I#`6df4*WRf&QwpMqwB^J?k zMLN6sw4P5aN?m13!YawN3Ya2g5XOwyl;M(8_qx2Ev1Zp*1ZSqB&ECV&ifk&M-uCzO z(IP}ZlD6YTun=8|PUHn`0SP1Np$V(4joMaW4Xdboji1@^hou&uj6=$WBaxHQ{%lAO z1*ORQQ_d*{QxPaL+*Wbz#ZXkU6TJx46CEB?(w(cAG4l06P0f$64vGou-e8mdm|UNg z+#FR%*tdp&W8pdN+35J#bJj5bXX6f_9(ItItYaAx5p{7X32M}DOcGvG_=(PN+gu@# zMl1E@pq>?Sh+?N|bl49(ft2Q>nmA9{W~+kbiLW)zXKIMfmI8C=E=TG*^#w^DZ;9S< zrzZhxidqEYeu#E<4_z=T1eSq-Q4% z4{b{+i4oXpCQpQ#$(%OjC|z}7d|-8e)qFRVaBzwgu`N+Xt<3IjQnEPG6ZBkPa%}Kc zxZ%8UN)`QiWbV58RAOhaUQ7+;o=JWl^0q$vUFF>yd2PyA+c z2$#*Q>SrWOfsQvo2++ZLugl;ZQd@=dM0`pKa(6lfYFcFSxH0JkGD{UAHN|tWuO&n& zGKhTO`uKza^u3?Xfuicq(gDu_F|$`&LCTPU;UJ-~5pBC^y3p_3_7Q|#cZFkV*r75R zfhCp{CC6b+*6vw1$#n^H8M*;LKpIPB4BndfGzWw}K7^%nG&2hqmzbT9_J>JzUY4-d zppj?#OhLKKY^5Fl6l3Nmeio6 z@maj}m?2E0COAAYE=ri|d%MP&Sn2wW3i#n+JPhl>X^)_&x3;VOF@yQI*&-LA#EGyT zXnW%At-fO?yCeamX?XI5aEFc3ZSEC&fl$U%{e;fpovH)x6C19_?s&ZG?HjY0?qn*q zl_Hii$`OUZwH5{?I-EwZ*`9NfnQ>g&vIcO7r9Gy}7q}(^UB%k0=Xv6-LRqmYz-PlX zpzTGPnyfK`MXAJPwkjES;fPRdSHjr|H5g?m==lbQ@m2}U;T|EIuG&i_Y-Fu_Ww_m< zkpLbzHr-F5Z=w^R2&&S1JCu$vUWly$y=jwf(_IS}8OJ+Ou1fdlGEyh(90fE&Sq6BJ zFY*l9HWA4VlAR9Z`x7-EZmh$M78Q=j0OJ+J%Rvp-_FS5-NKFw30Z$KDc2V`SZ3mH8e4lDulsM)L#ZB)H5%46f~_Y?y-K|~T%sWaiUw?1ED&ib{y z($XF$h{$dfG^a{$P!vJV#6g?7bz=Ejk_76qwr*oAU@4bO?B#mCn~zR3ASFWvNTlmz zbRLDC9Wyb-cnA&ivg}!v#wL8ibP*DgCoqK*XJMT|9}p* zkqX@(sYY9`s<%$92|r{*!jTeb$FDI2`m=73a?s~cOn~mg$1XOTFRA*xpGK=3#_cd_ zP+a2mLLQk)nTt*HxM27!maO@1DfM_G>>pr_5uWXjs1*+ogV|7o!$6#{)=uD6RTYzjJljZM&roPch))}f@tcV0my?m946ENr7*?_m zbyCZ10+MRWT4zcPq)=E>ZO1v8-zO-6)saG~C75vWd_J1W6sH?Abx{;Ooq;N{;k2?Z zWfN^P^`kXSOUbcEyQS8}V4RTJFmgy7U@pl`E$+V$1#TX3wS^1{f4=Ubb^pn>c znXFf#H2AFk=M3v)gWt-4u`VoX5gE zpV-tgLKb=}NHAya#@;9w&O4X9VAabqLEE&=|BynC;Or z`%4#@nynpaH`m5v5_Q9q!3L0a8+K{(!oY>~8F)K|zDP~E-@3ybpDQ`6pj=DG9tY%N zHs2hV)S^4pn)BM;c!sf$S7nq^;z-e#ldN7yk#K0hv>6=Mfg*@~-5@$Kf_~n}z&M6;h1nRM+vM`VQS0_W*XURj?{H)joNvO^~X$<%%0nm`&r{Y%|EWA`qT8nU>%^sQ)3h4cO8F0m3xJ z`NAON5B0q47WpMQ^Quzxl`)4tqg@#Q zM15zW83kUbFn<%Rb+Z9b@^NrNPovXuwUb=^s;?|JQj{6vjUtXo#+$bFAA`6L<0m(P z?0E&udtAn|c-ia#7c5L~IX%PNV7Q=#S?HuNZw9MD=O$S;VO}M>OOf?5H**T#3h^PC0D4tR$h_A)37sSJh?(RHM2;k1&uPtwUWQw@$_MY8yF2 z`e>nRvNt`n@z9~ToTm5;jvEj4NgUXx+V)Inn_nJvRA;oDL4e*q7-C8Hysn5uTPFvx zjt70+Z%7S(l`tT`sI8Bs}1Hw3hp$1~lSYQeGD zZ^f03H5RSg%xX3Yt-ZgaGq)Q9O|C!~Y9Y%Fr_l$1@$w+FMkG^jg{@}BMiv^B*7^?j zIi^&n>`1BQe&32_Og}C1feiCl@zsf*Y%8K0$PK)WaZ-PraN=0==UO7=GP#ARPEBZc z4={o~7#Vt4XIt(NSWCL*U>@KyY3qz27y(qJ>5hOkddBqBE#dp6b`4lbE~d zAlzG0BF6GCFL_JTYnb=80@&EFENU+|J9tko>&ph}%s^Hm^qfDSC^)Z3x2%=~bGCVL zZ4+@{DNUlyS4GMNthw5RVv+Rq`Wj%*l)g%xm9Ux3VwiUe%~A%ltX$iT7)b6=ULSbk zA&qoIpAq03G$*R9MSP}v8np;KqoAmj8&uHYwMWa|z_E4;wX3=mCXBUNJV?xJhdJTtUeisL#0(vAC2=@b!|4|jJzAn=`A_T`bfrY6!b{;{bULAHwXA?n)RrbhfM?`I!C5BP|&$y3!8ZjPRG#` zkUh2;d2?`nOqa>GHO?SGa9n7ZZNPXG-NcsmmfLY!y7TAMkaJSP3^de2w|mRt zBH7qt*q)N(H>(=eRoV{sZDl~uw6y}4L7B+~7#lP%6!12)|EbFxdb za&*-3VdBBMj64ef)g?Hh1VJF@(FjMdHrF)J0rw|ZoBrVM21RMegN&qxVNYB(uvQ|$ zd(Hv+xAYhwpTtpvo=*{p)EFTAp!GMWp z`$okh=x!84zj{L&4Hgq?Sk1bF88vC?S4P3aTV$RP73apP9*Zod3kWXmH+~QR(d=v# zapg6`S)XrfZ1rkS0z6_B4{(F$Idcy9%x1SeX*fD8P{}=9QY&E*J@7c*Qf-$}q4c5l zij$}UQK_kG*XPgkX?#L6MPCE)710)ZPx5_)qW3VKsWNLzYcQ!4hpwZC)=JDgtJ)l> zl}P46&;W^zXJ=4%$XkE4shs8EHivnY;5`ARHOiRWhM^vzo~>{a>6AS_4agOpk$^hF zL`X+E1%kmU0hDZ1Y~=K$5qv$n%LBX_CrZsR%v@{ojIU*Y8w6<;F@|Ik+NJ<1m?W`y z-2u|aabvidI`qacL-dIbWDXzZ)|jh|#YioT6z6-5Q<+VYQ4y}#65i_#$74znHv5!v zTzer{7@M1JAn@XTJBIe_ky(s@nnEnF4K`#Mn9rk7PHQ(?!F>!YGPApdx*NpWbc^8V zC8r6HC5_(UN@IZfwUJUDtdTJr`AFX8jwa6Fd%-fyFiofFaRuvqYx7~BBJu_>9l4^4 zk*uvKMPZ7aooryujXj>6v(s_71jJofQT?I7z%=svZ zm{ZtW0`Zo_0WUNSAQTeh2HCgyEk#=mV9`d#_JcCN)+U*{8%lC=Ek5%)kIM!_>$7y=(o}_gibPd(YnY>~;RS z>)w6Nv!5qh2_`;7Fj3IN{><{`!GM;mngXGs{E=E`in5`mm`R|pCwoSC`##a12?XpW zW+@KU%fWzC9%k(c;4CsINZkGLo;U3&{FO=ggRy2#uc%-)&BW(+!0q16869uXnMeO0 zcJ2|5$Nf%sN%)e62~zT-gWh^df+i3O1trl5zZzxv8s8pnx*Fa`+P*IM%ggQhSL2Uv zZ08D<@Ve>B!{UZB&Uk6wd$HT(35M=@=^3`~uXV|%hVReHYIe5L@dvo1`IPvipgO@reo*V@)dimKYTVbjr0n?D%%T8 z&MArqyZ?Ih z==!K3`@Py1Rr8tfbk7?`^9!a@);udl(wV_u*ZP&bb|pjuEOOOZ3~LWwYAvo4UZ_xd z3?8oYJqUM8B|cS&*@#DfVDo0dz0%>BQi9#Q)7NL581mu%^`>~X;uZt0b)hhk*W1t8 zC!J6%)S#4M$Hcri6K~8e-bG;M-s-q_XPe`t6F_EE%5qE9uaI}jq20xePItE-=~zJe zeBpcVOIMi{L>RE7D56$C+U&{ zzOdwU74}kAd20h@3P_x!8bUtsj2zHa&_0?m*@$Tg`o7Og;*MBC7P!jc1eW`o z^oQtj>F18y!gRIJw-F=y;>iS~PtH98Zv-WH2Of@53q7Xnh$A4B)Q|PCe7H-Jj;j)% z5D!xo{4gCoOwmiarTk`71sTjjQ`ZvP=j&vE41PlQVJ`24Swk&;=);TS8IyPGh&6iM z&_AXw*Hud6=N}2)u+8xNVA)~7;u?USM_yyP1r+xQlmg@xk!qGqZ=|QcN*~l2D5UzF zq&8MI{v_H7UAA`+o?HGI=~S~zsrst-&{{KM)4uboUp#wY#5-TKnTIm}6TKpXkW%3I z_(n!lUJXg*!hVM5Y_Ek3eN)_HwT$;&Hmch+-^k$Vl?)ILSKb~Ejncvt;pQCsAlb(q zI$ytNlR&R-E9plCB!-3*jKj;B-jNA?moxC9>Y<`%cRn#kC;ecd0+z4b7UfMp2Hq}- z$xK^l4kyzLwvY-JySgTOV#wn+;Yn*ywU1Wq1cN;*98%uFyknVRWvl~s@>MZb#DN(C zW1Nv4%>nImaj0*YxxM>@H?uE+A`kk>>d#);)r&k5jBpqEEx<=Pke4C+!1_(V$k1E< z=~9LHVIf(+d9sN_c8*YIr8B=IQu0^F8K&Ifz0kk)z42Pj&5aHxRqV9h5zkW9RDbY& zhD)oI+%@3wI9{d=&LHz&q@N8d;1QgA>@X}-@9=WVm8M!oM=rU}dKbVU)lE3W)QGGS zxSlyP81H8sNh2bS$kB*B-OvsqEFod8|MV{wMBuD5*`*$lrG7Ul%`b_&5G9z+S_U z)~^hiYc|oJhe(IR_>$b@pP6$DkaNS zZ69SL*NkZz+CO?l5B)`h4s~z4{((-K?dw*uZagrzvOTEzyUG za7!Z>7fB8ZTcc;(WbruPmaSSuavPVq(;j_|Y=xrTUH!ptjE$u6x&`6!+e8z6A`e`u z7U&2Ki|Jk&r-id{k)1iU(%7CpR-56|^P|dMrrZ?L^ZErA%ON$Sc(E+lwR~Z;a-<*d zX^G)}1mtD?3;pq-`-XoE$D-*<$M-9g6t6=C6OJ-d>JUK>&9s|mOows~o#Q^u-Y65A z2?*{n@)3ucQ`}VGENVn}m9N9UYs`x@y;GtoPG7rQW22h&!qT**`?W{_&@KPnZ?^fV zM`_&Y?uE$SAO@w~`&>VbyITeg**$1Qz`bd2JYw1&=oE`+Cf5}bTpT?`?4IWwCCvSl zB~0A-XLg5rx>_c0W4!ElZy;||1L9>NO|)Jy)85NcI4h5=YOl>CmCSHS@(+7eYLe%= zKjbSHDw6YAYs?h2O<14FhFWkch2zROzaa#yBt;KqtM{j4?#_F#36R)K|5OgUS586f zlTE)yy?C?EC`TK){p3*SkI5_J+;9A4St{wubl~~14UJ~*voEf{u*rD;{3lzL z+}iOu?VrNcJsT*qSOY3)`Cd-Dl;fo`E{b@0W%sXN?>$o^bBAk{Tm|Q~5C2dNe$}

Nj704l201cH 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%0DZKr#?TK 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