9da206dc7c
PVCs and CloudNativePG Clusters need S3 buckets and backup schedules
provisioned consistently. This operator watches the
backups.unkin.net/{schedule,destination} annotations on those objects and
provisions everything needed to back them up, with no new CRDs.
- Add a PVC controller that provisions cephrgw ObjectStoreUser/Bucket/BucketAccess,
auto-generates a restic repo-password Secret and creates a k8up Schedule scoped
to the PVC via spec.backup.volumes[].persistentVolumeClaim.claimName.
- Add a CNPG Cluster controller that provisions the same bucket stack, idempotently
patches spec.backup.barmanObjectStore (leaving a user-set destinationPath alone
with a Warning event) and creates a ScheduledBackup.
- Resolve destinations through a ConfigMap lookup table; requeue until the
BucketAccess is Ready before creating schedule resources; own-reference created
resources and retain bucket data by default.
- Add schedule-mapping helpers (k8up 5-field/shortcut pass-through, CNPG 6-field
seconds-first) and deterministic, length-bounded name derivation.
- Add unit tests (schedule mapping, name derivation, destination resolution) and
envtest controller tests for both paths, wiring the external CRDs into envtest.
- Add kubebuilder-generated RBAC, a Dockerfile (distroless/nonroot), Woodpecker
lint/test/build pipelines and a tag-triggered image push to the artifactapi
docker-internal registry, plus a version-bump Makefile and deploy manifests.
2389 lines
5.2 KiB
Plaintext
2389 lines
5.2 KiB
Plaintext
8
|
|
5
|
|
26
|
|
12
|
|
5
|
|
235
|
|
13
|
|
6
|
|
28
|
|
30
|
|
3
|
|
3
|
|
3
|
|
3
|
|
5
|
|
2
|
|
33
|
|
7
|
|
2
|
|
4
|
|
7
|
|
12
|
|
14
|
|
5
|
|
8
|
|
3
|
|
10
|
|
4
|
|
5
|
|
3
|
|
6
|
|
6
|
|
209
|
|
20
|
|
3
|
|
10
|
|
14
|
|
3
|
|
4
|
|
6
|
|
8
|
|
5
|
|
11
|
|
7
|
|
3
|
|
2
|
|
3
|
|
3
|
|
212
|
|
5
|
|
222
|
|
4
|
|
10
|
|
10
|
|
5
|
|
6
|
|
3
|
|
8
|
|
3
|
|
10
|
|
254
|
|
220
|
|
2
|
|
3
|
|
5
|
|
24
|
|
5
|
|
4
|
|
222
|
|
7
|
|
3
|
|
3
|
|
223
|
|
8
|
|
15
|
|
12
|
|
14
|
|
14
|
|
3
|
|
2
|
|
2
|
|
3
|
|
13
|
|
3
|
|
11
|
|
4
|
|
4
|
|
6
|
|
5
|
|
7
|
|
13
|
|
5
|
|
3
|
|
5
|
|
2
|
|
5
|
|
3
|
|
5
|
|
2
|
|
7
|
|
15
|
|
17
|
|
14
|
|
3
|
|
6
|
|
6
|
|
3
|
|
17
|
|
5
|
|
4
|
|
7
|
|
6
|
|
4
|
|
4
|
|
8
|
|
6
|
|
8
|
|
3
|
|
9
|
|
3
|
|
6
|
|
3
|
|
4
|
|
5
|
|
3
|
|
3
|
|
660
|
|
4
|
|
6
|
|
10
|
|
3
|
|
6
|
|
3
|
|
2
|
|
5
|
|
13
|
|
2
|
|
4
|
|
4
|
|
10
|
|
4
|
|
8
|
|
4
|
|
3
|
|
7
|
|
9
|
|
9
|
|
3
|
|
10
|
|
37
|
|
3
|
|
13
|
|
4
|
|
12
|
|
3
|
|
6
|
|
10
|
|
8
|
|
5
|
|
21
|
|
2
|
|
3
|
|
8
|
|
3
|
|
2
|
|
3
|
|
3
|
|
4
|
|
12
|
|
2
|
|
4
|
|
8
|
|
8
|
|
4
|
|
3
|
|
2
|
|
20
|
|
1
|
|
6
|
|
32
|
|
2
|
|
11
|
|
6
|
|
18
|
|
3
|
|
8
|
|
11
|
|
3
|
|
212
|
|
3
|
|
4
|
|
2
|
|
6
|
|
7
|
|
12
|
|
11
|
|
3
|
|
2
|
|
16
|
|
10
|
|
6
|
|
4
|
|
6
|
|
3
|
|
2
|
|
7
|
|
3
|
|
2
|
|
2
|
|
2
|
|
2
|
|
5
|
|
6
|
|
4
|
|
3
|
|
10
|
|
3
|
|
4
|
|
6
|
|
5
|
|
3
|
|
4
|
|
4
|
|
5
|
|
6
|
|
4
|
|
3
|
|
4
|
|
4
|
|
5
|
|
7
|
|
5
|
|
5
|
|
3
|
|
2
|
|
7
|
|
2
|
|
4
|
|
12
|
|
4
|
|
5
|
|
6
|
|
2
|
|
4
|
|
4
|
|
8
|
|
4
|
|
15
|
|
13
|
|
7
|
|
16
|
|
5
|
|
3
|
|
23
|
|
5
|
|
5
|
|
7
|
|
3
|
|
2
|
|
9
|
|
8
|
|
7
|
|
5
|
|
8
|
|
11
|
|
4
|
|
10
|
|
76
|
|
4
|
|
47
|
|
4
|
|
3
|
|
2
|
|
7
|
|
4
|
|
2
|
|
3
|
|
37
|
|
10
|
|
4
|
|
2
|
|
20
|
|
5
|
|
4
|
|
4
|
|
10
|
|
10
|
|
4
|
|
3
|
|
7
|
|
23
|
|
240
|
|
7
|
|
13
|
|
5
|
|
5
|
|
3
|
|
3
|
|
2
|
|
5
|
|
4
|
|
2
|
|
8
|
|
7
|
|
19
|
|
2
|
|
23
|
|
8
|
|
7
|
|
2
|
|
5
|
|
3
|
|
8
|
|
3
|
|
8
|
|
13
|
|
5
|
|
5
|
|
5
|
|
2
|
|
3
|
|
23
|
|
4
|
|
9
|
|
8
|
|
4
|
|
3
|
|
3
|
|
5
|
|
220
|
|
2
|
|
3
|
|
4
|
|
6
|
|
14
|
|
3
|
|
53
|
|
6
|
|
2
|
|
5
|
|
18
|
|
6
|
|
3
|
|
219
|
|
6
|
|
5
|
|
2
|
|
5
|
|
3
|
|
6
|
|
5
|
|
15
|
|
4
|
|
3
|
|
17
|
|
3
|
|
2
|
|
4
|
|
7
|
|
2
|
|
3
|
|
3
|
|
4
|
|
4
|
|
3
|
|
2
|
|
664
|
|
6
|
|
3
|
|
23
|
|
5
|
|
5
|
|
16
|
|
5
|
|
8
|
|
2
|
|
4
|
|
2
|
|
24
|
|
12
|
|
3
|
|
2
|
|
3
|
|
5
|
|
8
|
|
3
|
|
5
|
|
4
|
|
3
|
|
14
|
|
3
|
|
5
|
|
8
|
|
2
|
|
3
|
|
7
|
|
9
|
|
4
|
|
2
|
|
3
|
|
6
|
|
8
|
|
4
|
|
3
|
|
4
|
|
6
|
|
5
|
|
3
|
|
3
|
|
6
|
|
3
|
|
19
|
|
4
|
|
4
|
|
6
|
|
3
|
|
6
|
|
3
|
|
5
|
|
22
|
|
5
|
|
4
|
|
4
|
|
3
|
|
8
|
|
11
|
|
4
|
|
9
|
|
7
|
|
6
|
|
13
|
|
4
|
|
4
|
|
4
|
|
6
|
|
17
|
|
9
|
|
3
|
|
3
|
|
3
|
|
4
|
|
3
|
|
221
|
|
5
|
|
11
|
|
3
|
|
4
|
|
2
|
|
12
|
|
6
|
|
3
|
|
5
|
|
7
|
|
5
|
|
7
|
|
4
|
|
9
|
|
7
|
|
14
|
|
37
|
|
19
|
|
217
|
|
16
|
|
3
|
|
5
|
|
2
|
|
2
|
|
7
|
|
19
|
|
7
|
|
6
|
|
7
|
|
4
|
|
24
|
|
5
|
|
11
|
|
4
|
|
7
|
|
7
|
|
9
|
|
13
|
|
3
|
|
4
|
|
3
|
|
6
|
|
28
|
|
4
|
|
4
|
|
5
|
|
5
|
|
2
|
|
5
|
|
6
|
|
4
|
|
4
|
|
6
|
|
10
|
|
5
|
|
4
|
|
3
|
|
2
|
|
3
|
|
3
|
|
6
|
|
5
|
|
5
|
|
4
|
|
3
|
|
2
|
|
3
|
|
7
|
|
4
|
|
6
|
|
18
|
|
16
|
|
8
|
|
16
|
|
4
|
|
5
|
|
8
|
|
6
|
|
9
|
|
13
|
|
1545
|
|
6
|
|
215
|
|
6
|
|
5
|
|
6
|
|
3
|
|
45
|
|
31
|
|
5
|
|
2
|
|
2
|
|
4
|
|
3
|
|
3
|
|
2
|
|
5
|
|
4
|
|
3
|
|
5
|
|
7
|
|
7
|
|
4
|
|
5
|
|
8
|
|
5
|
|
4
|
|
749
|
|
2
|
|
31
|
|
9
|
|
11
|
|
2
|
|
11
|
|
5
|
|
4
|
|
4
|
|
7
|
|
9
|
|
11
|
|
4
|
|
5
|
|
4
|
|
7
|
|
3
|
|
4
|
|
6
|
|
2
|
|
15
|
|
3
|
|
4
|
|
3
|
|
4
|
|
3
|
|
5
|
|
2
|
|
13
|
|
5
|
|
5
|
|
3
|
|
3
|
|
23
|
|
4
|
|
4
|
|
5
|
|
7
|
|
4
|
|
13
|
|
2
|
|
4
|
|
3
|
|
4
|
|
2
|
|
6
|
|
2
|
|
7
|
|
3
|
|
5
|
|
5
|
|
3
|
|
29
|
|
5
|
|
4
|
|
4
|
|
3
|
|
10
|
|
2
|
|
3
|
|
79
|
|
16
|
|
6
|
|
6
|
|
7
|
|
7
|
|
3
|
|
5
|
|
5
|
|
7
|
|
4
|
|
3
|
|
7
|
|
9
|
|
5
|
|
6
|
|
5
|
|
9
|
|
6
|
|
3
|
|
6
|
|
4
|
|
17
|
|
2
|
|
10
|
|
9
|
|
3
|
|
6
|
|
2
|
|
3
|
|
21
|
|
22
|
|
5
|
|
11
|
|
4
|
|
2
|
|
17
|
|
2
|
|
224
|
|
2
|
|
14
|
|
3
|
|
4
|
|
4
|
|
2
|
|
4
|
|
4
|
|
4
|
|
4
|
|
5
|
|
3
|
|
4
|
|
4
|
|
10
|
|
2
|
|
6
|
|
3
|
|
3
|
|
5
|
|
7
|
|
2
|
|
7
|
|
5
|
|
6
|
|
3
|
|
218
|
|
2
|
|
2
|
|
5
|
|
2
|
|
6
|
|
3
|
|
5
|
|
222
|
|
14
|
|
6
|
|
33
|
|
3
|
|
2
|
|
5
|
|
3
|
|
3
|
|
3
|
|
9
|
|
5
|
|
3
|
|
3
|
|
2
|
|
7
|
|
4
|
|
3
|
|
4
|
|
3
|
|
5
|
|
6
|
|
5
|
|
26
|
|
4
|
|
13
|
|
9
|
|
7
|
|
3
|
|
221
|
|
3
|
|
3
|
|
4
|
|
4
|
|
4
|
|
4
|
|
2
|
|
18
|
|
5
|
|
3
|
|
7
|
|
9
|
|
6
|
|
8
|
|
3
|
|
10
|
|
3
|
|
11
|
|
9
|
|
5
|
|
4
|
|
17
|
|
5
|
|
5
|
|
6
|
|
6
|
|
3
|
|
2
|
|
4
|
|
12
|
|
17
|
|
6
|
|
7
|
|
218
|
|
4
|
|
2
|
|
4
|
|
10
|
|
3
|
|
5
|
|
15
|
|
3
|
|
9
|
|
4
|
|
3
|
|
3
|
|
6
|
|
29
|
|
3
|
|
3
|
|
4
|
|
5
|
|
5
|
|
3
|
|
8
|
|
5
|
|
6
|
|
6
|
|
7
|
|
5
|
|
3
|
|
5
|
|
3
|
|
29
|
|
2
|
|
31
|
|
5
|
|
15
|
|
24
|
|
16
|
|
5
|
|
207
|
|
4
|
|
3
|
|
3
|
|
2
|
|
15
|
|
4
|
|
4
|
|
13
|
|
5
|
|
5
|
|
4
|
|
6
|
|
10
|
|
2
|
|
7
|
|
8
|
|
4
|
|
6
|
|
20
|
|
5
|
|
3
|
|
4
|
|
3
|
|
12
|
|
12
|
|
5
|
|
17
|
|
7
|
|
3
|
|
3
|
|
3
|
|
6
|
|
10
|
|
3
|
|
5
|
|
25
|
|
80
|
|
4
|
|
9
|
|
3
|
|
2
|
|
11
|
|
3
|
|
3
|
|
2
|
|
3
|
|
8
|
|
7
|
|
5
|
|
5
|
|
19
|
|
5
|
|
3
|
|
3
|
|
12
|
|
11
|
|
2
|
|
6
|
|
5
|
|
5
|
|
5
|
|
3
|
|
3
|
|
3
|
|
4
|
|
209
|
|
14
|
|
3
|
|
2
|
|
5
|
|
19
|
|
4
|
|
4
|
|
3
|
|
4
|
|
14
|
|
5
|
|
6
|
|
4
|
|
13
|
|
9
|
|
7
|
|
4
|
|
7
|
|
10
|
|
2
|
|
9
|
|
5
|
|
7
|
|
2
|
|
8
|
|
4
|
|
6
|
|
5
|
|
5
|
|
222
|
|
8
|
|
7
|
|
12
|
|
5
|
|
216
|
|
3
|
|
4
|
|
4
|
|
6
|
|
3
|
|
14
|
|
8
|
|
7
|
|
13
|
|
4
|
|
3
|
|
3
|
|
3
|
|
3
|
|
17
|
|
5
|
|
4
|
|
3
|
|
33
|
|
6
|
|
6
|
|
33
|
|
7
|
|
5
|
|
3
|
|
8
|
|
7
|
|
5
|
|
2
|
|
9
|
|
4
|
|
2
|
|
233
|
|
24
|
|
7
|
|
4
|
|
8
|
|
10
|
|
3
|
|
4
|
|
15
|
|
2
|
|
16
|
|
3
|
|
3
|
|
13
|
|
12
|
|
7
|
|
5
|
|
4
|
|
207
|
|
4
|
|
2
|
|
4
|
|
27
|
|
15
|
|
2
|
|
5
|
|
2
|
|
25
|
|
6
|
|
5
|
|
5
|
|
6
|
|
13
|
|
6
|
|
18
|
|
6
|
|
4
|
|
12
|
|
225
|
|
10
|
|
7
|
|
5
|
|
2
|
|
2
|
|
11
|
|
4
|
|
14
|
|
21
|
|
8
|
|
10
|
|
3
|
|
5
|
|
4
|
|
232
|
|
2
|
|
5
|
|
5
|
|
3
|
|
7
|
|
17
|
|
11
|
|
6
|
|
6
|
|
23
|
|
4
|
|
6
|
|
3
|
|
5
|
|
4
|
|
2
|
|
17
|
|
3
|
|
6
|
|
5
|
|
8
|
|
3
|
|
2
|
|
2
|
|
14
|
|
9
|
|
4
|
|
4
|
|
2
|
|
5
|
|
5
|
|
3
|
|
7
|
|
6
|
|
12
|
|
6
|
|
10
|
|
3
|
|
6
|
|
2
|
|
2
|
|
19
|
|
5
|
|
4
|
|
4
|
|
9
|
|
2
|
|
4
|
|
13
|
|
3
|
|
5
|
|
6
|
|
3
|
|
6
|
|
5
|
|
4
|
|
9
|
|
6
|
|
3
|
|
5
|
|
7
|
|
3
|
|
6
|
|
6
|
|
4
|
|
3
|
|
10
|
|
6
|
|
3
|
|
221
|
|
3
|
|
5
|
|
3
|
|
6
|
|
4
|
|
8
|
|
5
|
|
3
|
|
6
|
|
4
|
|
4
|
|
2
|
|
54
|
|
5
|
|
6
|
|
11
|
|
3
|
|
3
|
|
4
|
|
4
|
|
4
|
|
3
|
|
7
|
|
3
|
|
11
|
|
11
|
|
7
|
|
10
|
|
6
|
|
13
|
|
223
|
|
213
|
|
15
|
|
231
|
|
7
|
|
3
|
|
7
|
|
228
|
|
2
|
|
3
|
|
4
|
|
4
|
|
5
|
|
6
|
|
7
|
|
4
|
|
13
|
|
3
|
|
4
|
|
5
|
|
3
|
|
6
|
|
4
|
|
6
|
|
7
|
|
2
|
|
4
|
|
3
|
|
4
|
|
3
|
|
3
|
|
6
|
|
3
|
|
7
|
|
3
|
|
5
|
|
18
|
|
5
|
|
6
|
|
8
|
|
10
|
|
3
|
|
3
|
|
3
|
|
2
|
|
4
|
|
2
|
|
4
|
|
4
|
|
5
|
|
6
|
|
6
|
|
4
|
|
10
|
|
13
|
|
3
|
|
12
|
|
5
|
|
12
|
|
16
|
|
8
|
|
4
|
|
19
|
|
11
|
|
2
|
|
4
|
|
5
|
|
6
|
|
8
|
|
5
|
|
6
|
|
4
|
|
18
|
|
10
|
|
4
|
|
2
|
|
216
|
|
6
|
|
6
|
|
6
|
|
2
|
|
4
|
|
12
|
|
8
|
|
3
|
|
11
|
|
5
|
|
6
|
|
14
|
|
5
|
|
3
|
|
13
|
|
4
|
|
5
|
|
4
|
|
5
|
|
3
|
|
28
|
|
6
|
|
3
|
|
7
|
|
219
|
|
3
|
|
9
|
|
7
|
|
3
|
|
10
|
|
6
|
|
3
|
|
4
|
|
19
|
|
5
|
|
7
|
|
11
|
|
6
|
|
15
|
|
19
|
|
4
|
|
13
|
|
11
|
|
3
|
|
7
|
|
5
|
|
10
|
|
2
|
|
8
|
|
11
|
|
2
|
|
6
|
|
4
|
|
6
|
|
24
|
|
6
|
|
3
|
|
3
|
|
3
|
|
3
|
|
6
|
|
18
|
|
4
|
|
11
|
|
4
|
|
2
|
|
5
|
|
10
|
|
8
|
|
3
|
|
9
|
|
5
|
|
3
|
|
4
|
|
5
|
|
6
|
|
2
|
|
5
|
|
7
|
|
4
|
|
4
|
|
14
|
|
6
|
|
4
|
|
4
|
|
5
|
|
5
|
|
7
|
|
2
|
|
4
|
|
3
|
|
7
|
|
3
|
|
3
|
|
6
|
|
4
|
|
5
|
|
4
|
|
4
|
|
4
|
|
3
|
|
3
|
|
3
|
|
3
|
|
8
|
|
14
|
|
2
|
|
3
|
|
5
|
|
3
|
|
2
|
|
4
|
|
5
|
|
3
|
|
7
|
|
3
|
|
3
|
|
18
|
|
3
|
|
4
|
|
4
|
|
5
|
|
7
|
|
3
|
|
3
|
|
3
|
|
13
|
|
5
|
|
4
|
|
8
|
|
211
|
|
5
|
|
5
|
|
3
|
|
5
|
|
2
|
|
5
|
|
4
|
|
2
|
|
655
|
|
6
|
|
3
|
|
5
|
|
11
|
|
2
|
|
5
|
|
3
|
|
12
|
|
9
|
|
15
|
|
11
|
|
5
|
|
12
|
|
217
|
|
2
|
|
6
|
|
17
|
|
3
|
|
3
|
|
207
|
|
5
|
|
5
|
|
4
|
|
5
|
|
9
|
|
3
|
|
2
|
|
8
|
|
5
|
|
4
|
|
3
|
|
2
|
|
5
|
|
12
|
|
4
|
|
14
|
|
5
|
|
4
|
|
2
|
|
13
|
|
5
|
|
8
|
|
4
|
|
225
|
|
4
|
|
3
|
|
4
|
|
5
|
|
4
|
|
3
|
|
3
|
|
6
|
|
23
|
|
9
|
|
2
|
|
6
|
|
7
|
|
233
|
|
4
|
|
4
|
|
6
|
|
18
|
|
3
|
|
4
|
|
6
|
|
3
|
|
4
|
|
4
|
|
2
|
|
3
|
|
7
|
|
4
|
|
13
|
|
227
|
|
4
|
|
3
|
|
5
|
|
4
|
|
2
|
|
12
|
|
9
|
|
17
|
|
3
|
|
7
|
|
14
|
|
6
|
|
4
|
|
5
|
|
21
|
|
4
|
|
8
|
|
9
|
|
2
|
|
9
|
|
25
|
|
16
|
|
3
|
|
6
|
|
4
|
|
7
|
|
8
|
|
5
|
|
2
|
|
3
|
|
5
|
|
4
|
|
3
|
|
3
|
|
5
|
|
3
|
|
3
|
|
3
|
|
2
|
|
3
|
|
19
|
|
2
|
|
4
|
|
3
|
|
4
|
|
2
|
|
3
|
|
4
|
|
4
|
|
2
|
|
4
|
|
3
|
|
3
|
|
3
|
|
2
|
|
6
|
|
3
|
|
17
|
|
5
|
|
6
|
|
4
|
|
3
|
|
13
|
|
5
|
|
3
|
|
3
|
|
3
|
|
4
|
|
9
|
|
4
|
|
2
|
|
14
|
|
12
|
|
4
|
|
5
|
|
24
|
|
4
|
|
3
|
|
37
|
|
12
|
|
11
|
|
21
|
|
3
|
|
4
|
|
3
|
|
13
|
|
4
|
|
2
|
|
3
|
|
15
|
|
4
|
|
11
|
|
4
|
|
4
|
|
3
|
|
8
|
|
3
|
|
4
|
|
4
|
|
12
|
|
8
|
|
5
|
|
3
|
|
3
|
|
4
|
|
2
|
|
220
|
|
3
|
|
5
|
|
223
|
|
3
|
|
3
|
|
3
|
|
10
|
|
3
|
|
15
|
|
4
|
|
241
|
|
9
|
|
7
|
|
3
|
|
6
|
|
6
|
|
23
|
|
4
|
|
13
|
|
7
|
|
3
|
|
4
|
|
7
|
|
4
|
|
9
|
|
3
|
|
3
|
|
4
|
|
10
|
|
5
|
|
5
|
|
1
|
|
5
|
|
24
|
|
2
|
|
4
|
|
5
|
|
5
|
|
6
|
|
14
|
|
3
|
|
8
|
|
2
|
|
3
|
|
5
|
|
13
|
|
13
|
|
3
|
|
5
|
|
2
|
|
3
|
|
15
|
|
3
|
|
4
|
|
2
|
|
10
|
|
4
|
|
4
|
|
4
|
|
5
|
|
5
|
|
3
|
|
5
|
|
3
|
|
4
|
|
7
|
|
4
|
|
27
|
|
3
|
|
6
|
|
4
|
|
15
|
|
3
|
|
5
|
|
6
|
|
6
|
|
5
|
|
4
|
|
8
|
|
3
|
|
9
|
|
2
|
|
6
|
|
3
|
|
4
|
|
3
|
|
7
|
|
4
|
|
18
|
|
3
|
|
11
|
|
3
|
|
3
|
|
8
|
|
9
|
|
7
|
|
24
|
|
3
|
|
219
|
|
7
|
|
10
|
|
4
|
|
5
|
|
9
|
|
12
|
|
2
|
|
5
|
|
4
|
|
4
|
|
4
|
|
3
|
|
3
|
|
19
|
|
5
|
|
8
|
|
16
|
|
8
|
|
6
|
|
22
|
|
3
|
|
23
|
|
3
|
|
242
|
|
9
|
|
4
|
|
3
|
|
3
|
|
5
|
|
7
|
|
3
|
|
3
|
|
5
|
|
8
|
|
3
|
|
7
|
|
5
|
|
14
|
|
8
|
|
10
|
|
3
|
|
4
|
|
3
|
|
7
|
|
4
|
|
6
|
|
7
|
|
4
|
|
10
|
|
4
|
|
3
|
|
11
|
|
3
|
|
7
|
|
10
|
|
3
|
|
13
|
|
6
|
|
8
|
|
12
|
|
10
|
|
5
|
|
7
|
|
9
|
|
3
|
|
4
|
|
7
|
|
7
|
|
10
|
|
8
|
|
30
|
|
9
|
|
19
|
|
4
|
|
3
|
|
19
|
|
15
|
|
4
|
|
13
|
|
3
|
|
215
|
|
223
|
|
4
|
|
7
|
|
4
|
|
8
|
|
17
|
|
16
|
|
3
|
|
7
|
|
6
|
|
5
|
|
5
|
|
4
|
|
12
|
|
3
|
|
7
|
|
4
|
|
4
|
|
13
|
|
4
|
|
5
|
|
2
|
|
5
|
|
6
|
|
5
|
|
6
|
|
6
|
|
7
|
|
10
|
|
18
|
|
23
|
|
9
|
|
3
|
|
3
|
|
6
|
|
5
|
|
2
|
|
4
|
|
2
|
|
7
|
|
3
|
|
3
|
|
2
|
|
5
|
|
5
|
|
14
|
|
10
|
|
224
|
|
6
|
|
3
|
|
4
|
|
3
|
|
7
|
|
5
|
|
9
|
|
3
|
|
6
|
|
4
|
|
2
|
|
5
|
|
11
|
|
4
|
|
3
|
|
3
|
|
2
|
|
8
|
|
4
|
|
7
|
|
4
|
|
10
|
|
7
|
|
3
|
|
3
|
|
18
|
|
18
|
|
17
|
|
3
|
|
3
|
|
3
|
|
4
|
|
5
|
|
3
|
|
3
|
|
4
|
|
12
|
|
7
|
|
3
|
|
11
|
|
13
|
|
5
|
|
4
|
|
7
|
|
13
|
|
5
|
|
4
|
|
11
|
|
3
|
|
12
|
|
3
|
|
6
|
|
4
|
|
4
|
|
21
|
|
4
|
|
6
|
|
9
|
|
5
|
|
3
|
|
10
|
|
8
|
|
4
|
|
6
|
|
4
|
|
4
|
|
6
|
|
5
|
|
4
|
|
8
|
|
6
|
|
4
|
|
6
|
|
4
|
|
4
|
|
5
|
|
9
|
|
6
|
|
3
|
|
4
|
|
2
|
|
9
|
|
3
|
|
18
|
|
2
|
|
4
|
|
3
|
|
13
|
|
3
|
|
6
|
|
6
|
|
8
|
|
7
|
|
9
|
|
3
|
|
2
|
|
16
|
|
3
|
|
4
|
|
6
|
|
3
|
|
2
|
|
33
|
|
22
|
|
14
|
|
4
|
|
9
|
|
12
|
|
4
|
|
5
|
|
6
|
|
3
|
|
23
|
|
9
|
|
4
|
|
3
|
|
5
|
|
5
|
|
3
|
|
4
|
|
5
|
|
3
|
|
5
|
|
3
|
|
10
|
|
4
|
|
5
|
|
5
|
|
8
|
|
4
|
|
4
|
|
6
|
|
8
|
|
5
|
|
4
|
|
3
|
|
4
|
|
6
|
|
3
|
|
3
|
|
3
|
|
5
|
|
9
|
|
12
|
|
6
|
|
5
|
|
9
|
|
3
|
|
5
|
|
3
|
|
2
|
|
2
|
|
2
|
|
18
|
|
3
|
|
2
|
|
21
|
|
2
|
|
5
|
|
4
|
|
6
|
|
4
|
|
5
|
|
10
|
|
3
|
|
9
|
|
3
|
|
2
|
|
10
|
|
7
|
|
3
|
|
6
|
|
6
|
|
4
|
|
4
|
|
8
|
|
12
|
|
7
|
|
3
|
|
7
|
|
3
|
|
3
|
|
9
|
|
3
|
|
4
|
|
5
|
|
4
|
|
4
|
|
5
|
|
5
|
|
10
|
|
15
|
|
4
|
|
4
|
|
14
|
|
6
|
|
227
|
|
3
|
|
14
|
|
5
|
|
216
|
|
22
|
|
5
|
|
4
|
|
2
|
|
2
|
|
6
|
|
3
|
|
4
|
|
2
|
|
9
|
|
9
|
|
4
|
|
3
|
|
28
|
|
13
|
|
11
|
|
4
|
|
5
|
|
3
|
|
3
|
|
2
|
|
3
|
|
3
|
|
5
|
|
3
|
|
4
|
|
3
|
|
5
|
|
23
|
|
26
|
|
3
|
|
4
|
|
5
|
|
6
|
|
4
|
|
6
|
|
3
|
|
5
|
|
5
|
|
3
|
|
4
|
|
3
|
|
2
|
|
2
|
|
2
|
|
7
|
|
14
|
|
3
|
|
6
|
|
7
|
|
17
|
|
2
|
|
2
|
|
15
|
|
14
|
|
16
|
|
4
|
|
6
|
|
7
|
|
13
|
|
6
|
|
4
|
|
5
|
|
6
|
|
16
|
|
3
|
|
3
|
|
28
|
|
3
|
|
6
|
|
15
|
|
3
|
|
9
|
|
2
|
|
4
|
|
6
|
|
3
|
|
3
|
|
22
|
|
4
|
|
12
|
|
6
|
|
7
|
|
2
|
|
5
|
|
4
|
|
10
|
|
3
|
|
16
|
|
6
|
|
9
|
|
2
|
|
5
|
|
12
|
|
7
|
|
5
|
|
5
|
|
5
|
|
5
|
|
2
|
|
11
|
|
9
|
|
17
|
|
4
|
|
3
|
|
11
|
|
7
|
|
3
|
|
5
|
|
15
|
|
4
|
|
3
|
|
4
|
|
211
|
|
8
|
|
7
|
|
5
|
|
4
|
|
7
|
|
6
|
|
7
|
|
6
|
|
3
|
|
6
|
|
5
|
|
6
|
|
5
|
|
3
|
|
4
|
|
4
|
|
26
|
|
4
|
|
6
|
|
10
|
|
4
|
|
4
|
|
3
|
|
2
|
|
3
|
|
3
|
|
4
|
|
5
|
|
9
|
|
3
|
|
9
|
|
4
|
|
4
|
|
5
|
|
5
|
|
8
|
|
2
|
|
4
|
|
2
|
|
3
|
|
8
|
|
4
|
|
11
|
|
19
|
|
5
|
|
8
|
|
6
|
|
3
|
|
5
|
|
6
|
|
12
|
|
3
|
|
2
|
|
4
|
|
16
|
|
12
|
|
3
|
|
4
|
|
4
|
|
8
|
|
6
|
|
5
|
|
6
|
|
6
|
|
219
|
|
8
|
|
222
|
|
6
|
|
16
|
|
3
|
|
13
|
|
19
|
|
5
|
|
4
|
|
3
|
|
11
|
|
6
|
|
10
|
|
4
|
|
7
|
|
7
|
|
12
|
|
5
|
|
3
|
|
3
|
|
5
|
|
6
|
|
10
|
|
3
|
|
8
|
|
2
|
|
5
|
|
4
|
|
7
|
|
2
|
|
4
|
|
4
|
|
2
|
|
12
|
|
9
|
|
6
|
|
4
|
|
2
|
|
40
|
|
2
|
|
4
|
|
10
|
|
4
|
|
223
|
|
4
|
|
2
|
|
20
|
|
6
|
|
7
|
|
24
|
|
5
|
|
4
|
|
5
|
|
2
|
|
20
|
|
16
|
|
6
|
|
5
|
|
13
|
|
2
|
|
3
|
|
3
|
|
19
|
|
3
|
|
2
|
|
4
|
|
5
|
|
6
|
|
7
|
|
11
|
|
12
|
|
5
|
|
6
|
|
7
|
|
7
|
|
3
|
|
5
|
|
3
|
|
5
|
|
3
|
|
14
|
|
3
|
|
4
|
|
4
|
|
2
|
|
11
|
|
1
|
|
7
|
|
3
|
|
9
|
|
6
|
|
11
|
|
12
|
|
5
|
|
8
|
|
6
|
|
221
|
|
4
|
|
2
|
|
12
|
|
4
|
|
3
|
|
15
|
|
4
|
|
5
|
|
226
|
|
7
|
|
218
|
|
7
|
|
5
|
|
4
|
|
5
|
|
18
|
|
4
|
|
5
|
|
9
|
|
4
|
|
4
|
|
2
|
|
9
|
|
18
|
|
18
|
|
9
|
|
5
|
|
6
|
|
6
|
|
3
|
|
3
|
|
7
|
|
3
|
|
5
|
|
4
|
|
4
|
|
4
|
|
12
|
|
3
|
|
6
|
|
31
|
|
5
|
|
4
|
|
7
|
|
3
|
|
6
|
|
5
|
|
6
|
|
5
|
|
11
|
|
2
|
|
2
|
|
11
|
|
11
|
|
6
|
|
7
|
|
5
|
|
8
|
|
7
|
|
10
|
|
5
|
|
23
|
|
7
|
|
4
|
|
3
|
|
5
|
|
34
|
|
2
|
|
5
|
|
23
|
|
7
|
|
3
|
|
6
|
|
8
|
|
4
|
|
4
|
|
4
|
|
2
|
|
5
|
|
3
|
|
8
|
|
5
|
|
4
|
|
8
|
|
25
|
|
2
|
|
3
|
|
17
|
|
8
|
|
3
|
|
4
|
|
8
|
|
7
|
|
3
|
|
15
|
|
6
|
|
5
|
|
7
|
|
21
|
|
9
|
|
5
|
|
6
|
|
6
|
|
5
|
|
3
|
|
2
|
|
3
|
|
10
|
|
3
|
|
6
|
|
3
|
|
14
|
|
7
|
|
4
|
|
4
|
|
8
|
|
7
|
|
8
|
|
2
|
|
6
|
|
12
|
|
4
|
|
213
|
|
6
|
|
5
|
|
21
|
|
8
|
|
2
|
|
5
|
|
23
|
|
3
|
|
11
|
|
2
|
|
3
|
|
6
|
|
25
|
|
2
|
|
3
|
|
6
|
|
7
|
|
6
|
|
6
|
|
4
|
|
4
|
|
6
|
|
3
|
|
17
|
|
9
|
|
7
|
|
6
|
|
4
|
|
3
|
|
10
|
|
7
|
|
2
|
|
3
|
|
3
|
|
3
|
|
11
|
|
8
|
|
3
|
|
7
|
|
6
|
|
4
|
|
14
|
|
36
|
|
3
|
|
4
|
|
3
|
|
3
|
|
22
|
|
13
|
|
21
|
|
4
|
|
2
|
|
7
|
|
4
|
|
4
|
|
17
|
|
15
|
|
3
|
|
7
|
|
11
|
|
2
|
|
4
|
|
7
|
|
6
|
|
209
|
|
6
|
|
3
|
|
2
|
|
2
|
|
24
|
|
4
|
|
9
|
|
4
|
|
3
|
|
3
|
|
3
|
|
29
|
|
2
|
|
2
|
|
4
|
|
3
|
|
3
|
|
5
|
|
4
|
|
6
|
|
3
|
|
3
|
|
2
|
|
4
|