Skip to content

Commit 3f26fb8

Browse files
committed
depreciation warning added and changed imports from infrav1alpha to infrav1
1 parent 4c59057 commit 3f26fb8

18 files changed

+66
-40
lines changed

api/v1alpha1/azureasomanagedcluster_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ type StatusResource struct {
6868

6969
//+kubebuilder:object:root=true
7070
//+kubebuilder:subresource:status
71+
//+kubebuilder:deprecatedversion:warning="infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedCluster is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should be used instead."
7172

7273
// AzureASOManagedCluster is the Schema for the azureasomanagedclusters API.
7374
type AzureASOManagedCluster struct {

api/v1alpha1/azureasomanagedclustertemplate_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type AzureASOManagedClusterTemplateResourceSpec struct {
3939
}
4040

4141
//+kubebuilder:object:root=true
42+
//+kubebuilder:deprecatedversion:warning="infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedClusterTemplate is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should be used instead."
4243

4344
// AzureASOManagedClusterTemplate is the Schema for the azureasomanagedclustertemplates API.
4445
type AzureASOManagedClusterTemplate struct {

api/v1alpha1/azureasomanagedcontrolplane_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ type AzureASOManagedControlPlaneStatus struct {
5656

5757
//+kubebuilder:object:root=true
5858
//+kubebuilder:subresource:status
59+
//+kubebuilder:deprecatedversion:warning="infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedControlPlane is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should be used instead."
5960

6061
// AzureASOManagedControlPlane is the Schema for the azureasomanagedcontrolplanes API.
6162
type AzureASOManagedControlPlane struct {

api/v1alpha1/azureasomanagedcontrolplanetemplate_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type AzureASOManagedControlPlaneTemplateResourceSpec struct {
4444
}
4545

4646
//+kubebuilder:object:root=true
47+
//+kubebuilder:deprecatedversion:warning="infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedControlPlaneTemplate is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should be used instead."
4748

4849
// AzureASOManagedControlPlaneTemplate is the Schema for the azureasomanagedcontrolplanetemplates API.
4950
type AzureASOManagedControlPlaneTemplate struct {

api/v1alpha1/azureasomanagedmachinepool_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ type AzureASOManagedMachinePoolStatus struct {
5151

5252
//+kubebuilder:object:root=true
5353
//+kubebuilder:subresource:status
54+
//+kubebuilder:deprecatedversion:warning="infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedMachinePool is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should be used instead."
5455

5556
// AzureASOManagedMachinePool is the Schema for the azureasomanagedmachinepools API.
5657
type AzureASOManagedMachinePool struct {

api/v1alpha1/azureasomanagedmachinepooltemplate_types.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ type AzureASOManagedMachinePoolTemplateResourceSpec struct {
4343
}
4444

4545
//+kubebuilder:object:root=true
46+
//+kubebuilder:deprecatedversion:warning="infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedMachinePoolTemplate is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should be used instead."
4647

4748
// AzureASOManagedMachinePoolTemplate is the Schema for the azureasomanagedmachinepooltemplates API.
4849
type AzureASOManagedMachinePoolTemplate struct {

config/crd/bases/infrastructure.cluster.x-k8s.io_azureasomanagedclusters.yaml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ spec:
1414
singular: azureasomanagedcluster
1515
scope: Namespaced
1616
versions:
17-
- name: v1alpha1
17+
- deprecated: true
18+
deprecationWarning: infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedCluster
19+
is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should
20+
be used instead.
21+
name: v1alpha1
1822
schema:
1923
openAPIV3Schema:
2024
description: AzureASOManagedCluster is the Schema for the azureasomanagedclusters
@@ -144,10 +148,11 @@ spec:
144148
in the API schema to permit resource admission.
145149
properties:
146150
host:
147-
description: The hostname on which the API server is serving.
151+
description: host is the hostname on which the API server is serving.
152+
maxLength: 512
148153
type: string
149154
port:
150-
description: The port on which the API server is serving.
155+
description: port is the port on which the API server is serving.
151156
format: int32
152157
type: integer
153158
required:

config/crd/bases/infrastructure.cluster.x-k8s.io_azureasomanagedclustertemplates.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ spec:
1414
singular: azureasomanagedclustertemplate
1515
scope: Namespaced
1616
versions:
17-
- name: v1alpha1
17+
- deprecated: true
18+
deprecationWarning: infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedClusterTemplate
19+
is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should
20+
be used instead.
21+
name: v1alpha1
1822
schema:
1923
openAPIV3Schema:
2024
description: AzureASOManagedClusterTemplate is the Schema for the azureasomanagedclustertemplates

config/crd/bases/infrastructure.cluster.x-k8s.io_azureasomanagedcontrolplanes.yaml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ spec:
1414
singular: azureasomanagedcontrolplane
1515
scope: Namespaced
1616
versions:
17-
- name: v1alpha1
17+
- deprecated: true
18+
deprecationWarning: infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedControlPlane
19+
is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should
20+
be used instead.
21+
name: v1alpha1
1822
schema:
1923
openAPIV3Schema:
2024
description: AzureASOManagedControlPlane is the Schema for the azureasomanagedcontrolplanes
@@ -172,10 +176,11 @@ spec:
172176
cluster's API server.
173177
properties:
174178
host:
175-
description: The hostname on which the API server is serving.
179+
description: host is the hostname on which the API server is serving.
180+
maxLength: 512
176181
type: string
177182
port:
178-
description: The port on which the API server is serving.
183+
description: port is the port on which the API server is serving.
179184
format: int32
180185
type: integer
181186
required:

config/crd/bases/infrastructure.cluster.x-k8s.io_azureasomanagedcontrolplanetemplates.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ spec:
1414
singular: azureasomanagedcontrolplanetemplate
1515
scope: Namespaced
1616
versions:
17-
- name: v1alpha1
17+
- deprecated: true
18+
deprecationWarning: infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedControlPlaneTemplate
19+
is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should
20+
be used instead.
21+
name: v1alpha1
1822
schema:
1923
openAPIV3Schema:
2024
description: AzureASOManagedControlPlaneTemplate is the Schema for the azureasomanagedcontrolplanetemplates

config/crd/bases/infrastructure.cluster.x-k8s.io_azureasomanagedmachinepools.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ spec:
1414
singular: azureasomanagedmachinepool
1515
scope: Namespaced
1616
versions:
17-
- name: v1alpha1
17+
- deprecated: true
18+
deprecationWarning: infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedMachinePool
19+
is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should
20+
be used instead.
21+
name: v1alpha1
1822
schema:
1923
openAPIV3Schema:
2024
description: AzureASOManagedMachinePool is the Schema for the azureasomanagedmachinepools

config/crd/bases/infrastructure.cluster.x-k8s.io_azureasomanagedmachinepooltemplates.yaml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,11 @@ spec:
1414
singular: azureasomanagedmachinepooltemplate
1515
scope: Namespaced
1616
versions:
17-
- name: v1alpha1
17+
- deprecated: true
18+
deprecationWarning: infrastructure.cluster.x-k8s.io/v1alpha1 AzureASOManagedMachinePoolTemplate
19+
is deprecated. infrastructure.cluster.x-k8s.io/v1beta1 is equivalent and should
20+
be used instead.
21+
name: v1alpha1
1822
schema:
1923
openAPIV3Schema:
2024
description: AzureASOManagedMachinePoolTemplate is the Schema for the azureasomanagedmachinepooltemplates

main.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,6 @@ import (
5858
"sigs.k8s.io/controller-runtime/pkg/manager"
5959
"sigs.k8s.io/controller-runtime/pkg/webhook"
6060

61-
infrav1alpha "sigs.k8s.io/cluster-api-provider-azure/api/v1alpha1"
6261
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
6362
"sigs.k8s.io/cluster-api-provider-azure/azure"
6463
"sigs.k8s.io/cluster-api-provider-azure/controllers"
@@ -80,7 +79,6 @@ func init() {
8079
_ = clientgoscheme.AddToScheme(scheme)
8180
_ = infrav1.AddToScheme(scheme)
8281
_ = infrav1exp.AddToScheme(scheme)
83-
_ = infrav1alpha.AddToScheme(scheme)
8482
_ = clusterv1.AddToScheme(scheme)
8583
_ = expv1.AddToScheme(scheme)
8684
_ = kubeadmv1.AddToScheme(scheme)

pkg/mutators/azureasomanagedmachinepool_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import (
3333
"sigs.k8s.io/controller-runtime/pkg/client"
3434
fakeclient "sigs.k8s.io/controller-runtime/pkg/client/fake"
3535

36-
infrav1alpha "sigs.k8s.io/cluster-api-provider-azure/api/v1alpha1"
36+
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
3737
)
3838

3939
func TestSetAgentPoolDefaults(t *testing.T) {
@@ -42,16 +42,16 @@ func TestSetAgentPoolDefaults(t *testing.T) {
4242

4343
tests := []struct {
4444
name string
45-
asoManagedMachinePool *infrav1alpha.AzureASOManagedMachinePool
45+
asoManagedMachinePool *infrav1.AzureASOManagedMachinePool
4646
machinePool *expv1.MachinePool
4747
expected []*unstructured.Unstructured
4848
expectedErr error
4949
}{
5050
{
5151
name: "no ManagedClustersAgentPool",
52-
asoManagedMachinePool: &infrav1alpha.AzureASOManagedMachinePool{
53-
Spec: infrav1alpha.AzureASOManagedMachinePoolSpec{
54-
AzureASOManagedMachinePoolTemplateResourceSpec: infrav1alpha.AzureASOManagedMachinePoolTemplateResourceSpec{
52+
asoManagedMachinePool: &infrav1.AzureASOManagedMachinePool{
53+
Spec: infrav1.AzureASOManagedMachinePoolSpec{
54+
AzureASOManagedMachinePoolTemplateResourceSpec: infrav1.AzureASOManagedMachinePoolTemplateResourceSpec{
5555
Resources: []runtime.RawExtension{},
5656
},
5757
},
@@ -60,9 +60,9 @@ func TestSetAgentPoolDefaults(t *testing.T) {
6060
},
6161
{
6262
name: "success",
63-
asoManagedMachinePool: &infrav1alpha.AzureASOManagedMachinePool{
64-
Spec: infrav1alpha.AzureASOManagedMachinePoolSpec{
65-
AzureASOManagedMachinePoolTemplateResourceSpec: infrav1alpha.AzureASOManagedMachinePoolTemplateResourceSpec{
63+
asoManagedMachinePool: &infrav1.AzureASOManagedMachinePool{
64+
Spec: infrav1.AzureASOManagedMachinePoolSpec{
65+
AzureASOManagedMachinePoolTemplateResourceSpec: infrav1.AzureASOManagedMachinePoolTemplateResourceSpec{
6666
Resources: []runtime.RawExtension{
6767
{
6868
Raw: apJSON(g, &asocontainerservicev1.ManagedClustersAgentPool{}),
@@ -251,7 +251,7 @@ func TestReconcileAutoscaling(t *testing.T) {
251251
machinePool: &expv1.MachinePool{
252252
ObjectMeta: metav1.ObjectMeta{
253253
Annotations: map[string]string{
254-
clusterv1.ReplicasManagedByAnnotation: infrav1alpha.ReplicasManagedByAKS,
254+
clusterv1.ReplicasManagedByAnnotation: infrav1.ReplicasManagedByAKS,
255255
},
256256
},
257257
},
@@ -267,14 +267,14 @@ func TestReconcileAutoscaling(t *testing.T) {
267267
machinePool: &expv1.MachinePool{
268268
ObjectMeta: metav1.ObjectMeta{
269269
Annotations: map[string]string{
270-
clusterv1.ReplicasManagedByAnnotation: "not-" + infrav1alpha.ReplicasManagedByAKS,
270+
clusterv1.ReplicasManagedByAnnotation: "not-" + infrav1.ReplicasManagedByAKS,
271271
},
272272
},
273273
},
274274
expected: &expv1.MachinePool{
275275
ObjectMeta: metav1.ObjectMeta{
276276
Annotations: map[string]string{
277-
clusterv1.ReplicasManagedByAnnotation: "not-" + infrav1alpha.ReplicasManagedByAKS,
277+
clusterv1.ReplicasManagedByAnnotation: "not-" + infrav1.ReplicasManagedByAKS,
278278
},
279279
},
280280
},
@@ -290,7 +290,7 @@ func TestReconcileAutoscaling(t *testing.T) {
290290
expected: &expv1.MachinePool{
291291
ObjectMeta: metav1.ObjectMeta{
292292
Annotations: map[string]string{
293-
clusterv1.ReplicasManagedByAnnotation: infrav1alpha.ReplicasManagedByAKS,
293+
clusterv1.ReplicasManagedByAnnotation: infrav1.ReplicasManagedByAKS,
294294
},
295295
},
296296
},
@@ -301,14 +301,14 @@ func TestReconcileAutoscaling(t *testing.T) {
301301
machinePool: &expv1.MachinePool{
302302
ObjectMeta: metav1.ObjectMeta{
303303
Annotations: map[string]string{
304-
clusterv1.ReplicasManagedByAnnotation: infrav1alpha.ReplicasManagedByAKS,
304+
clusterv1.ReplicasManagedByAnnotation: infrav1.ReplicasManagedByAKS,
305305
},
306306
},
307307
},
308308
expected: &expv1.MachinePool{
309309
ObjectMeta: metav1.ObjectMeta{
310310
Annotations: map[string]string{
311-
clusterv1.ReplicasManagedByAnnotation: infrav1alpha.ReplicasManagedByAKS,
311+
clusterv1.ReplicasManagedByAnnotation: infrav1.ReplicasManagedByAKS,
312312
},
313313
},
314314
},
@@ -320,7 +320,7 @@ func TestReconcileAutoscaling(t *testing.T) {
320320
ObjectMeta: metav1.ObjectMeta{
321321
Name: "mp",
322322
Annotations: map[string]string{
323-
clusterv1.ReplicasManagedByAnnotation: "not-" + infrav1alpha.ReplicasManagedByAKS,
323+
clusterv1.ReplicasManagedByAnnotation: "not-" + infrav1.ReplicasManagedByAKS,
324324
},
325325
},
326326
},
@@ -384,7 +384,7 @@ func TestSetAgentPoolCount(t *testing.T) {
384384
machinePool: &expv1.MachinePool{
385385
ObjectMeta: metav1.ObjectMeta{
386386
Annotations: map[string]string{
387-
clusterv1.ReplicasManagedByAnnotation: infrav1alpha.ReplicasManagedByAKS,
387+
clusterv1.ReplicasManagedByAnnotation: infrav1.ReplicasManagedByAKS,
388388
},
389389
},
390390
Spec: expv1.MachinePoolSpec{

test/e2e/aks.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ import (
3434
"sigs.k8s.io/cluster-api/test/framework/clusterctl"
3535
"sigs.k8s.io/controller-runtime/pkg/client"
3636

37-
infrav1alpha "sigs.k8s.io/cluster-api-provider-azure/api/v1alpha1"
3837
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
3938
)
4039

@@ -158,7 +157,7 @@ func WaitForAKSSystemNodePoolMachinesToExist(ctx context.Context, input WaitForC
158157
var capzMPs []client.Object
159158

160159
ammpList := &infrav1.AzureManagedMachinePoolList{}
161-
asommpList := &infrav1alpha.AzureASOManagedMachinePoolList{}
160+
asommpList := &infrav1.AzureASOManagedMachinePoolList{}
162161

163162
if err := input.Lister.List(ctx, ammpList, opt1, opt2, opt3); err != nil {
164163
LogWarningf("Failed to list AzureManagedMachinePools: %+v", err)

test/e2e/aks_machinepools.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import (
3333
"sigs.k8s.io/cluster-api/test/framework"
3434
"sigs.k8s.io/controller-runtime/pkg/client"
3535

36-
infrav1alpha "sigs.k8s.io/cluster-api-provider-azure/api/v1alpha1"
3736
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
3837
"sigs.k8s.io/cluster-api-provider-azure/pkg/mutators"
3938
)
@@ -88,8 +87,8 @@ func AKSMachinePoolSpec(ctx context.Context, inputGetter func() AKSMachinePoolSp
8887
if ammp.Spec.Mode != string(infrav1.NodePoolModeSystem) {
8988
isUserPool = true
9089
}
91-
case infrav1alpha.AzureASOManagedMachinePoolKind:
92-
ammp := &infrav1alpha.AzureASOManagedMachinePool{}
90+
case infrav1.AzureASOManagedMachinePoolKind:
91+
ammp := &infrav1.AzureASOManagedMachinePool{}
9392
err := bootstrapClusterProxy.GetClient().Get(ctx, types.NamespacedName{
9493
Namespace: mp.Spec.Template.Spec.InfrastructureRef.Namespace,
9594
Name: mp.Spec.Template.Spec.InfrastructureRef.Name,

test/e2e/azure_clusterproxy.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ import (
5050
"sigs.k8s.io/cluster-api/test/framework"
5151
"sigs.k8s.io/controller-runtime/pkg/client"
5252

53-
infrav1alpha "sigs.k8s.io/cluster-api-provider-azure/api/v1alpha1"
5453
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
5554
infrav1exp "sigs.k8s.io/cluster-api-provider-azure/exp/api/v1beta1"
5655
)
@@ -76,7 +75,7 @@ func initScheme() *runtime.Scheme {
7675
framework.TryAddDefaultSchemes(scheme)
7776
Expect(infrav1.AddToScheme(scheme)).To(Succeed())
7877
Expect(infrav1exp.AddToScheme(scheme)).To(Succeed())
79-
Expect(infrav1alpha.AddToScheme(scheme)).To(Succeed())
78+
Expect(infrav1.AddToScheme(scheme)).To(Succeed())
8079
Expect(expv1.AddToScheme(scheme)).To(Succeed())
8180
Expect(asoresourcesv1.AddToScheme(scheme)).To(Succeed())
8281
Expect(asocontainerservicev1.AddToScheme(scheme)).To(Succeed())

test/e2e/azure_logcollector.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import (
3939
"sigs.k8s.io/controller-runtime/pkg/client"
4040
kinderrors "sigs.k8s.io/kind/pkg/errors"
4141

42-
infrav1alpha "sigs.k8s.io/cluster-api-provider-azure/api/v1alpha1"
4342
infrav1 "sigs.k8s.io/cluster-api-provider-azure/api/v1beta1"
4443
"sigs.k8s.io/cluster-api-provider-azure/azure"
4544
infrav1exp "sigs.k8s.io/cluster-api-provider-azure/exp/api/v1beta1"
@@ -211,13 +210,13 @@ func getAzureManagedControlPlane(ctx context.Context, managementClusterClient cl
211210
return azManagedControlPlane, err
212211
}
213212

214-
func getAzureASOManagedCluster(ctx context.Context, managementClusterClient client.Client, namespace, name string) (*infrav1alpha.AzureASOManagedCluster, error) {
213+
func getAzureASOManagedCluster(ctx context.Context, managementClusterClient client.Client, namespace, name string) (*infrav1.AzureASOManagedCluster, error) {
215214
key := client.ObjectKey{
216215
Namespace: namespace,
217216
Name: name,
218217
}
219218

220-
azManagedCluster := &infrav1alpha.AzureASOManagedCluster{}
219+
azManagedCluster := &infrav1.AzureASOManagedCluster{}
221220
err := managementClusterClient.Get(ctx, key, azManagedCluster)
222221
return azManagedCluster, err
223222
}
@@ -255,13 +254,13 @@ func getAzureManagedMachinePool(ctx context.Context, managementClusterClient cli
255254
return azManagedMachinePool, err
256255
}
257256

258-
func getAzureASOManagedMachinePool(ctx context.Context, managementClusterClient client.Client, mp *expv1.MachinePool) (*infrav1alpha.AzureASOManagedMachinePool, error) {
257+
func getAzureASOManagedMachinePool(ctx context.Context, managementClusterClient client.Client, mp *expv1.MachinePool) (*infrav1.AzureASOManagedMachinePool, error) {
259258
key := client.ObjectKey{
260259
Namespace: mp.Spec.Template.Spec.InfrastructureRef.Namespace,
261260
Name: mp.Spec.Template.Spec.InfrastructureRef.Name,
262261
}
263262

264-
azManagedMachinePool := &infrav1alpha.AzureASOManagedMachinePool{}
263+
azManagedMachinePool := &infrav1.AzureASOManagedMachinePool{}
265264
err := managementClusterClient.Get(ctx, key, azManagedMachinePool)
266265
return azManagedMachinePool, err
267266
}

0 commit comments

Comments
 (0)