Repository: numaproj/numaflow
Pull request #292 (2022-10-31 18:46:33)

feat: add pvc support for reduce vertex PBQ
Signed-off-by: Derek Wang <whynowy@gmail.com>

This PR add pvc support for reduce vertices with following spec:

```yaml
spec:
  vertices:
  - name: my-udf
    udf:
      container:
        image: my-image
      groupBy:
        window:
          fixed:
            length: 60s
          storage:
            persistentVolumeClaim:
              volumeSize: 10Gi
              storageClassName: default
              accessMode: ReadWriteOnce
```

<!--

Before you push your changes:

* Run `make pre-push -B` to fix codegen and lint problems.

Then, you MUST:

* Sign-off your commit (otherwise the DCO check will fail).
* Use [a conventional commit message](https://www.conventionalcommits.org/en/v1.0.0/) (otherwise the commit message check will fail).

If you did not do this, reset all your commit and replace them with a single commit:

```
git reset HEAD~1 ;# change 1 to how many commits you made
git commit --signoff -m 'feat: my feat. Fixes #1234'
```

When creating your PR: 

* Make sure that "Fixes #" or "Closes #" is in both the PR title (for release notes) and description (to automatically link and close the issue).
* Say how you tested your changes. If you changed the UI, attach screenshots.
* Set your PR as a draft initially.
* Your PR needs to pass the required checks before it can be approved. 
* Once required tests have passed, mark your PR "Ready for review".

If changes were requested, once you've made them, you MUST dismiss the review to get it reviewed again.

-->



Patch:
diff --git a/api/json-schema/schema.json b/api/json-schema/schema.json
index b695791e..391e5335 100644
--- a/api/json-schema/schema.json
+++ b/api/json-schema/schema.json
@@ -17803,8 +17803,13 @@
         "keyed": {
           "type": "boolean"
         },
+        "storage": {
+          "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.PBQStorage",
+          "description": "Storage is used to define the PBQ storage for a reduce vertex."
+        },
         "window": {
-          "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Window"
+          "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Window",
+          "description": "Window describes the windowing strategy."
         }
       },
       "required": [
@@ -18220,6 +18225,15 @@
       },
       "type": "object"
     },
+    "io.numaproj.numaflow.v1alpha1.PBQStorage": {
+      "description": "PBQStorage defines the persistence configuration for a vertex.",
+      "properties": {
+        "persistentVolumeClaim": {
+          "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.PersistenceStrategy"
+        }
+      },
+      "type": "object"
+    },
     "io.numaproj.numaflow.v1alpha1.PersistenceStrategy": {
       "description": "PersistenceStrategy defines the strategy of persistence",
       "properties": {
@@ -18459,6 +18473,7 @@
       "type": "object"
     },
     "io.numaproj.numaflow.v1alpha1.Scale": {
+      "description": "Scale defines the parameters for autoscaling.",
       "properties": {
         "cooldownSeconds": {
           "description": "Cooldown seconds after a scaling operation before another one.",
diff --git a/api/openapi-spec/swagger.json b/api/openapi-spec/swagger.json
index 78484c90..25520c2f 100644
--- a/api/openapi-spec/swagger.json
+++ b/api/openapi-spec/swagger.json
@@ -17811,7 +17811,12 @@
         "keyed": {
           "type": "boolean"
         },
+        "storage": {
+          "description": "Storage is used to define the PBQ storage for a reduce vertex.",
+          "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.PBQStorage"
+        },
         "window": {
+          "description": "Window describes the windowing strategy.",
           "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.Window"
         }
       }
@@ -18215,6 +18220,15 @@
         }
       }
     },
+    "io.numaproj.numaflow.v1alpha1.PBQStorage": {
+      "description": "PBQStorage defines the persistence configuration for a vertex.",
+      "type": "object",
+      "properties": {
+        "persistentVolumeClaim": {
+          "$ref": "#/definitions/io.numaproj.numaflow.v1alpha1.PersistenceStrategy"
+        }
+      }
+    },
     "io.numaproj.numaflow.v1alpha1.PersistenceStrategy": {
       "description": "PersistenceStrategy defines the strategy of persistence",
       "type": "object",
@@ -18445,6 +18459,7 @@
       }
     },
     "io.numaproj.numaflow.v1alpha1.Scale": {
+      "description": "Scale defines the parameters for autoscaling.",
       "type": "object",
       "properties": {
         "cooldownSeconds": {
diff --git a/config/advanced-install/namespaced-controller-wo-crds.yaml b/config/advanced-install/namespaced-controller-wo-crds.yaml
index 12f9225a..a2d9a524 100644
--- a/config/advanced-install/namespaced-controller-wo-crds.yaml
+++ b/config/advanced-install/namespaced-controller-wo-crds.yaml
@@ -87,7 +87,7 @@ subjects:
 ---
 apiVersion: v1
 data:
-  controller-config.yaml: |
+  controller-config.yaml: |+
     isbsvc:
       redis:
         # Default Redis settings, could be overridden by InterStepBufferService specs
@@ -156,7 +156,7 @@ data:
             replicas: 3
         versions:
         - version: latest
-          natsImage: nats:2.9.0
+          natsImage: nats:2.9.4
           metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
           configReloaderImage: natsio/nats-server-config-reloader:0.7.0
           startCommand: /nats-server
@@ -190,6 +190,12 @@ data:
           metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
           configReloaderImage: natsio/nats-server-config-reloader:0.7.0
           startCommand: nats-server
+        - version: 2.9.4
+          natsImage: nats:2.9.4
+          metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
+          configReloaderImage: natsio/nats-server-config-reloader:0.7.0
+          startCommand: /nats-server
+
 kind: ConfigMap
 metadata:
   name: numaflow-controller-config
diff --git a/config/base/controller-manager/numaflow-controller-config.yaml b/config/base/controller-manager/numaflow-controller-config.yaml
index fb9e8972..fa77996f 100644
--- a/config/base/controller-manager/numaflow-controller-config.yaml
+++ b/config/base/controller-manager/numaflow-controller-config.yaml
@@ -72,7 +72,7 @@ data:
             replicas: 3
         versions:
         - version: latest
-          natsImage: nats:2.9.0
+          natsImage: nats:2.9.4
           metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
           configReloaderImage: natsio/nats-server-config-reloader:0.7.0
           startCommand: /nats-server
@@ -106,3 +106,9 @@ data:
           metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
           configReloaderImage: natsio/nats-server-config-reloader:0.7.0
           startCommand: nats-server
+        - version: 2.9.4
+          natsImage: nats:2.9.4
+          metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
+          configReloaderImage: natsio/nats-server-config-reloader:0.7.0
+          startCommand: /nats-server
+
diff --git a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
index c041d9a7..648ee73a 100644
--- a/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
+++ b/config/base/crds/full/numaflow.numaproj.io_pipelines.yaml
@@ -3666,8 +3666,33 @@ spec:
                           properties:
                             keyed:
                               type: boolean
+                            storage:
+                              description: Storage is used to define the PBQ storage
+                                for a reduce vertex.
+                              properties:
+                                persistentVolumeClaim:
+                                  description: PersistenceStrategy defines the strategy
+                                    of persistence
+                                  properties:
+                                    accessMode:
+                                      description: Available access modes such as
+                                        ReadWriteOnce, ReadWriteMany https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
+                                      type: string
+                                    storageClassName:
+                                      description: 'Name of the StorageClass required
+                                        by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
+                                      type: string
+                                    volumeSize:
+                                      anyOf:
+                                      - type: integer
+                                      - type: string
+                                      description: Volume size, e.g. 50Gi
+                                      pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                      x-kubernetes-int-or-string: true
+                                  type: object
+                              type: object
                             window:
-                              description: Window describes windowing strategy
+                              description: Window describes the windowing strategy.
                               properties:
                                 fixed:
                                   description: FixedWindow describes a fixed window
diff --git a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml
index 6a27055a..888e8222 100644
--- a/config/base/crds/full/numaflow.numaproj.io_vertices.yaml
+++ b/config/base/crds/full/numaflow.numaproj.io_vertices.yaml
@@ -3479,8 +3479,33 @@ spec:
                     properties:
                       keyed:
                         type: boolean
+                      storage:
+                        description: Storage is used to define the PBQ storage for
+                          a reduce vertex.
+                        properties:
+                          persistentVolumeClaim:
+                            description: PersistenceStrategy defines the strategy
+                              of persistence
+                            properties:
+                              accessMode:
+                                description: Available access modes such as ReadWriteOnce,
+                                  ReadWriteMany https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
+                                type: string
+                              storageClassName:
+                                description: 'Name of the StorageClass required by
+                                  the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
+                                type: string
+                              volumeSize:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                description: Volume size, e.g. 50Gi
+                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                x-kubernetes-int-or-string: true
+                            type: object
+                        type: object
                       window:
-                        description: Window describes windowing strategy
+                        description: Window describes the windowing strategy.
                         properties:
                           fixed:
                             description: FixedWindow describes a fixed window
diff --git a/config/install.yaml b/config/install.yaml
index 0a46514a..6aca889e 100644
--- a/config/install.yaml
+++ b/config/install.yaml
@@ -8400,8 +8400,33 @@ spec:
                           properties:
                             keyed:
                               type: boolean
+                            storage:
+                              description: Storage is used to define the PBQ storage
+                                for a reduce vertex.
+                              properties:
+                                persistentVolumeClaim:
+                                  description: PersistenceStrategy defines the strategy
+                                    of persistence
+                                  properties:
+                                    accessMode:
+                                      description: Available access modes such as
+                                        ReadWriteOnce, ReadWriteMany https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
+                                      type: string
+                                    storageClassName:
+                                      description: 'Name of the StorageClass required
+                                        by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
+                                      type: string
+                                    volumeSize:
+                                      anyOf:
+                                      - type: integer
+                                      - type: string
+                                      description: Volume size, e.g. 50Gi
+                                      pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                      x-kubernetes-int-or-string: true
+                                  type: object
+                              type: object
                             window:
-                              description: Window describes windowing strategy
+                              description: Window describes the windowing strategy.
                               properties:
                                 fixed:
                                   description: FixedWindow describes a fixed window
@@ -13593,8 +13618,33 @@ spec:
                     properties:
                       keyed:
                         type: boolean
+                      storage:
+                        description: Storage is used to define the PBQ storage for
+                          a reduce vertex.
+                        properties:
+                          persistentVolumeClaim:
+                            description: PersistenceStrategy defines the strategy
+                              of persistence
+                            properties:
+                              accessMode:
+                                description: Available access modes such as ReadWriteOnce,
+                                  ReadWriteMany https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
+                                type: string
+                              storageClassName:
+                                description: 'Name of the StorageClass required by
+                                  the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
+                                type: string
+                              volumeSize:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                description: Volume size, e.g. 50Gi
+                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                x-kubernetes-int-or-string: true
+                            type: object
+                        type: object
                       window:
-                        description: Window describes windowing strategy
+                        description: Window describes the windowing strategy.
                         properties:
                           fixed:
                             description: FixedWindow describes a fixed window
@@ -15376,7 +15426,7 @@ subjects:
 ---
 apiVersion: v1
 data:
-  controller-config.yaml: |
+  controller-config.yaml: |+
     isbsvc:
       redis:
         # Default Redis settings, could be overridden by InterStepBufferService specs
@@ -15445,7 +15495,7 @@ data:
             replicas: 3
         versions:
         - version: latest
-          natsImage: nats:2.9.0
+          natsImage: nats:2.9.4
           metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
           configReloaderImage: natsio/nats-server-config-reloader:0.7.0
           startCommand: /nats-server
@@ -15479,6 +15529,12 @@ data:
           metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
           configReloaderImage: natsio/nats-server-config-reloader:0.7.0
           startCommand: nats-server
+        - version: 2.9.4
+          natsImage: nats:2.9.4
+          metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
+          configReloaderImage: natsio/nats-server-config-reloader:0.7.0
+          startCommand: /nats-server
+
 kind: ConfigMap
 metadata:
   name: numaflow-controller-config
diff --git a/config/namespace-install.yaml b/config/namespace-install.yaml
index 1470bccd..b56de73a 100644
--- a/config/namespace-install.yaml
+++ b/config/namespace-install.yaml
@@ -8400,8 +8400,33 @@ spec:
                           properties:
                             keyed:
                               type: boolean
+                            storage:
+                              description: Storage is used to define the PBQ storage
+                                for a reduce vertex.
+                              properties:
+                                persistentVolumeClaim:
+                                  description: PersistenceStrategy defines the strategy
+                                    of persistence
+                                  properties:
+                                    accessMode:
+                                      description: Available access modes such as
+                                        ReadWriteOnce, ReadWriteMany https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
+                                      type: string
+                                    storageClassName:
+                                      description: 'Name of the StorageClass required
+                                        by the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
+                                      type: string
+                                    volumeSize:
+                                      anyOf:
+                                      - type: integer
+                                      - type: string
+                                      description: Volume size, e.g. 50Gi
+                                      pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                      x-kubernetes-int-or-string: true
+                                  type: object
+                              type: object
                             window:
-                              description: Window describes windowing strategy
+                              description: Window describes the windowing strategy.
                               properties:
                                 fixed:
                                   description: FixedWindow describes a fixed window
@@ -13593,8 +13618,33 @@ spec:
                     properties:
                       keyed:
                         type: boolean
+                      storage:
+                        description: Storage is used to define the PBQ storage for
+                          a reduce vertex.
+                        properties:
+                          persistentVolumeClaim:
+                            description: PersistenceStrategy defines the strategy
+                              of persistence
+                            properties:
+                              accessMode:
+                                description: Available access modes such as ReadWriteOnce,
+                                  ReadWriteMany https://kubernetes.io/docs/concepts/storage/persistent-volumes/#access-modes
+                                type: string
+                              storageClassName:
+                                description: 'Name of the StorageClass required by
+                                  the claim. More info: https://kubernetes.io/docs/concepts/storage/persistent-volumes#class-1'
+                                type: string
+                              volumeSize:
+                                anyOf:
+                                - type: integer
+                                - type: string
+                                description: Volume size, e.g. 50Gi
+                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
+                                x-kubernetes-int-or-string: true
+                            type: object
+                        type: object
                       window:
-                        description: Window describes windowing strategy
+                        description: Window describes the windowing strategy.
                         properties:
                           fixed:
                             description: FixedWindow describes a fixed window
@@ -15287,7 +15337,7 @@ subjects:
 ---
 apiVersion: v1
 data:
-  controller-config.yaml: |
+  controller-config.yaml: |+
     isbsvc:
       redis:
         # Default Redis settings, could be overridden by InterStepBufferService specs
@@ -15356,7 +15406,7 @@ data:
             replicas: 3
         versions:
         - version: latest
-          natsImage: nats:2.9.0
+          natsImage: nats:2.9.4
           metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
           configReloaderImage: natsio/nats-server-config-reloader:0.7.0
           startCommand: /nats-server
@@ -15390,6 +15440,12 @@ data:
           metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
           configReloaderImage: natsio/nats-server-config-reloader:0.7.0
           startCommand: nats-server
+        - version: 2.9.4
+          natsImage: nats:2.9.4
+          metricsExporterImage: natsio/prometheus-nats-exporter:0.9.1
+          configReloaderImage: natsio/nats-server-config-reloader:0.7.0
+          startCommand: /nats-server
+
 kind: ConfigMap
 metadata:
   name: numaflow-controller-config
diff --git a/docs/APIs.md b/docs/APIs.md
index 8e7d31ff..1eee956c 100644
--- a/docs/APIs.md
+++ b/docs/APIs.md
@@ -1295,6 +1295,9 @@ Description
 <a href="#numaflow.numaproj.io/v1alpha1.Window"> Window </a> </em>
 </td>
 <td>
+<p>
+Window describes the windowing strategy.
+</p>
 </td>
 </tr>
 <tr>
@@ -1305,6 +1308,19 @@ Description
 <em>(Optional)</em>
 </td>
 </tr>
+<tr>
+<td>
+<code>storage</code></br> <em>
+<a href="#numaflow.numaproj.io/v1alpha1.PBQStorage"> PBQStorage </a>
+</em>
+</td>
+<td>
+<em>(Optional)</em>
+<p>
+Storage is used to define the PBQ storage for a reduce vertex.
+</p>
+</td>
+</tr>
 </tbody>
 </table>
 <h3 id="numaflow.numaproj.io/v1alpha1.HTTPSource">
@@ -2414,13 +2430,49 @@ numaflow-controller-config will be used.
 </tr>
 </tbody>
 </table>
+<h3 id="numaflow.numaproj.io/v1alpha1.PBQStorage">
+PBQStorage
+</h3>
+<p>
+(<em>Appears on:</em>
+<a href="#numaflow.numaproj.io/v1alpha1.GroupBy">GroupBy</a>)
+</p>
+<p>
+<p>
+PBQStorage defines the persistence configuration for a vertex.
+</p>
+</p>
+<table>
+<thead>
+<tr>
+<th>
+Field
+</th>
+<th>
+Description
+</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td>
+<code>persistentVolumeClaim</code></br> <em>
+<a href="#numaflow.numaproj.io/v1alpha1.PersistenceStrategy">
+PersistenceStrategy </a> </em>
+</td>
+<td>
+</td>
+</tr>
+</tbody>
+</table>
 <h3 id="numaflow.numaproj.io/v1alpha1.PersistenceStrategy">
 PersistenceStrategy
 </h3>
 <p>
 (<em>Appears on:</em>
 <a href="#numaflow.numaproj.io/v1alpha1.JetStreamBufferService">JetStreamBufferService</a>,
-<a href="#numaflow.numaproj.io/v1alpha1.NativeRedis">NativeRedis</a>)
+<a href="#numaflow.numaproj.io/v1alpha1.NativeRedis">NativeRedis</a>,
+<a href="#numaflow.numaproj.io/v1alpha1.PBQStorage">PBQStorage</a>)
 </p>
 <p>
 <p>
@@ -3087,6 +3139,9 @@ Scale
 <a href="#numaflow.numaproj.io/v1alpha1.AbstractVertex">AbstractVertex</a>)
 </p>
 <p>
+<p>
+Scale defines the parameters for autoscaling.
+</p>
 </p>
 <table>
 <thead>
diff --git a/go.mod b/go.mod
index dbe2c722..b887110f 100644
--- a/go.mod
+++ b/go.mod
@@ -23,7 +23,7 @@ require (
 	github.com/grpc-ecosystem/grpc-gateway v1.16.0
 	github.com/hashicorp/golang-lru v0.5.4
 	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe
-	github.com/nats-io/nats.go v1.18.0
+	github.com/nats-io/nats.go v1.19.0
 	github.com/numaproj/numaflow-go v0.2.3
 	github.com/prometheus/client_golang v1.12.1
 	github.com/prometheus/common v0.32.1
diff --git a/go.sum b/go.sum
index d56ee4ea..c044132c 100644
--- a/go.sum
+++ b/go.sum
@@ -683,8 +683,8 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+
 github.com/nats-io/jwt/v2 v2.2.1-0.20220330180145-442af02fd36a h1:lem6QCvxR0Y28gth9P+wV2K/zYUUAkJ+55U8cpS0p5I=
 github.com/nats-io/nats-server/v2 v2.7.5-0.20220415000625-a6b62f61a703 h1:d8siT+8VQ68hfqPqYZvpMrHIihlMVW3gGy+o2hRDCyg=
 github.com/nats-io/nats-server/v2 v2.7.5-0.20220415000625-a6b62f61a703/go.mod h1:5vic7C58BFEVltiZhs7Kq81q2WcEPhJPsmNv1FOrdv0=
-github.com/nats-io/nats.go v1.18.0 h1:o480Ao6kuSSFyJO75rGTXCEPj7LGkY84C1Ye+Uhm4c0=
-github.com/nats-io/nats.go v1.18.0/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w=
+github.com/nats-io/nats.go v1.19.0 h1:H6j8aBnTQFoVrTGB6Xjd903UMdE7jz6DS4YkmAqgZ9Q=
+github.com/nats-io/nats.go v1.19.0/go.mod h1:tLqubohF7t4z3du1QDPYJIQQyhb4wl6DhjxEajSI7UA=
 github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8=
 github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4=
 github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
diff --git a/pkg/apis/numaflow/v1alpha1/const.go b/pkg/apis/numaflow/v1alpha1/const.go
index 257d4961..f3363990 100644
--- a/pkg/apis/numaflow/v1alpha1/const.go
+++ b/pkg/apis/numaflow/v1alpha1/const.go
@@ -126,6 +126,9 @@ const (
 	// Default window options
 	DefaultWindowType     = FixedType
 	DefaultWindowDuration = 0
+
+	// PVC mount path for PBQ
+	PathPBQMount = "/var/numaflow/pbq"
 )
 
 // PBQ store's backend type.
diff --git a/pkg/apis/numaflow/v1alpha1/generated.pb.go b/pkg/apis/numaflow/v1alpha1/generated.pb.go
index b3b6460d..922115f0 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.pb.go
+++ b/pkg/apis/numaflow/v1alpha1/generated.pb.go
@@ -972,10 +972,38 @@ func (m *NativeRedis) XXX_DiscardUnknown() {
 
 var xxx_messageInfo_NativeRedis proto.InternalMessageInfo
 
+func (m *PBQStorage) Reset()      { *m = PBQStorage{} }
+func (*PBQStorage) ProtoMessage() {}
+func (*PBQStorage) Descriptor() ([]byte, []int) {
+	return fileDescriptor_9d0d1b17d3865563, []int{33}
+}
+func (m *PBQStorage) XXX_Unmarshal(b []byte) error {
+	return m.Unmarshal(b)
+}
+func (m *PBQStorage) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	b = b[:cap(b)]
+	n, err := m.MarshalToSizedBuffer(b)
+	if err != nil {
+		return nil, err
+	}
+	return b[:n], nil
+}
+func (m *PBQStorage) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_PBQStorage.Merge(m, src)
+}
+func (m *PBQStorage) XXX_Size() int {
+	return m.Size()
+}
+func (m *PBQStorage) XXX_DiscardUnknown() {
+	xxx_messageInfo_PBQStorage.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_PBQStorage proto.InternalMessageInfo
+
 func (m *PersistenceStrategy) Reset()      { *m = PersistenceStrategy{} }
 func (*PersistenceStrategy) ProtoMessage() {}
 func (*PersistenceStrategy) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{33}
+	return fileDescriptor_9d0d1b17d3865563, []int{34}
 }
 func (m *PersistenceStrategy) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1003,7 +1031,7 @@ var xxx_messageInfo_PersistenceStrategy proto.InternalMessageInfo
 func (m *Pipeline) Reset()      { *m = Pipeline{} }
 func (*Pipeline) ProtoMessage() {}
 func (*Pipeline) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{34}
+	return fileDescriptor_9d0d1b17d3865563, []int{35}
 }
 func (m *Pipeline) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1031,7 +1059,7 @@ var xxx_messageInfo_Pipeline proto.InternalMessageInfo
 func (m *PipelineLimits) Reset()      { *m = PipelineLimits{} }
 func (*PipelineLimits) ProtoMessage() {}
 func (*PipelineLimits) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{35}
+	return fileDescriptor_9d0d1b17d3865563, []int{36}
 }
 func (m *PipelineLimits) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1059,7 +1087,7 @@ var xxx_messageInfo_PipelineLimits proto.InternalMessageInfo
 func (m *PipelineList) Reset()      { *m = PipelineList{} }
 func (*PipelineList) ProtoMessage() {}
 func (*PipelineList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{36}
+	return fileDescriptor_9d0d1b17d3865563, []int{37}
 }
 func (m *PipelineList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1087,7 +1115,7 @@ var xxx_messageInfo_PipelineList proto.InternalMessageInfo
 func (m *PipelineSpec) Reset()      { *m = PipelineSpec{} }
 func (*PipelineSpec) ProtoMessage() {}
 func (*PipelineSpec) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{37}
+	return fileDescriptor_9d0d1b17d3865563, []int{38}
 }
 func (m *PipelineSpec) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1115,7 +1143,7 @@ var xxx_messageInfo_PipelineSpec proto.InternalMessageInfo
 func (m *PipelineStatus) Reset()      { *m = PipelineStatus{} }
 func (*PipelineStatus) ProtoMessage() {}
 func (*PipelineStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{38}
+	return fileDescriptor_9d0d1b17d3865563, []int{39}
 }
 func (m *PipelineStatus) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1143,7 +1171,7 @@ var xxx_messageInfo_PipelineStatus proto.InternalMessageInfo
 func (m *RedisBufferService) Reset()      { *m = RedisBufferService{} }
 func (*RedisBufferService) ProtoMessage() {}
 func (*RedisBufferService) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{39}
+	return fileDescriptor_9d0d1b17d3865563, []int{40}
 }
 func (m *RedisBufferService) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1171,7 +1199,7 @@ var xxx_messageInfo_RedisBufferService proto.InternalMessageInfo
 func (m *RedisConfig) Reset()      { *m = RedisConfig{} }
 func (*RedisConfig) ProtoMessage() {}
 func (*RedisConfig) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{40}
+	return fileDescriptor_9d0d1b17d3865563, []int{41}
 }
 func (m *RedisConfig) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1199,7 +1227,7 @@ var xxx_messageInfo_RedisConfig proto.InternalMessageInfo
 func (m *RedisSettings) Reset()      { *m = RedisSettings{} }
 func (*RedisSettings) ProtoMessage() {}
 func (*RedisSettings) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{41}
+	return fileDescriptor_9d0d1b17d3865563, []int{42}
 }
 func (m *RedisSettings) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1227,7 +1255,7 @@ var xxx_messageInfo_RedisSettings proto.InternalMessageInfo
 func (m *Scale) Reset()      { *m = Scale{} }
 func (*Scale) ProtoMessage() {}
 func (*Scale) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{42}
+	return fileDescriptor_9d0d1b17d3865563, []int{43}
 }
 func (m *Scale) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1255,7 +1283,7 @@ var xxx_messageInfo_Scale proto.InternalMessageInfo
 func (m *Sink) Reset()      { *m = Sink{} }
 func (*Sink) ProtoMessage() {}
 func (*Sink) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{43}
+	return fileDescriptor_9d0d1b17d3865563, []int{44}
 }
 func (m *Sink) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1283,7 +1311,7 @@ var xxx_messageInfo_Sink proto.InternalMessageInfo
 func (m *Source) Reset()      { *m = Source{} }
 func (*Source) ProtoMessage() {}
 func (*Source) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{44}
+	return fileDescriptor_9d0d1b17d3865563, []int{45}
 }
 func (m *Source) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1311,7 +1339,7 @@ var xxx_messageInfo_Source proto.InternalMessageInfo
 func (m *Status) Reset()      { *m = Status{} }
 func (*Status) ProtoMessage() {}
 func (*Status) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{45}
+	return fileDescriptor_9d0d1b17d3865563, []int{46}
 }
 func (m *Status) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1339,7 +1367,7 @@ var xxx_messageInfo_Status proto.InternalMessageInfo
 func (m *TLS) Reset()      { *m = TLS{} }
 func (*TLS) ProtoMessage() {}
 func (*TLS) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{46}
+	return fileDescriptor_9d0d1b17d3865563, []int{47}
 }
 func (m *TLS) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1367,7 +1395,7 @@ var xxx_messageInfo_TLS proto.InternalMessageInfo
 func (m *UDF) Reset()      { *m = UDF{} }
 func (*UDF) ProtoMessage() {}
 func (*UDF) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{47}
+	return fileDescriptor_9d0d1b17d3865563, []int{48}
 }
 func (m *UDF) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1395,7 +1423,7 @@ var xxx_messageInfo_UDF proto.InternalMessageInfo
 func (m *UDSink) Reset()      { *m = UDSink{} }
 func (*UDSink) ProtoMessage() {}
 func (*UDSink) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{48}
+	return fileDescriptor_9d0d1b17d3865563, []int{49}
 }
 func (m *UDSink) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1423,7 +1451,7 @@ var xxx_messageInfo_UDSink proto.InternalMessageInfo
 func (m *Vertex) Reset()      { *m = Vertex{} }
 func (*Vertex) ProtoMessage() {}
 func (*Vertex) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{49}
+	return fileDescriptor_9d0d1b17d3865563, []int{50}
 }
 func (m *Vertex) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1451,7 +1479,7 @@ var xxx_messageInfo_Vertex proto.InternalMessageInfo
 func (m *VertexInstance) Reset()      { *m = VertexInstance{} }
 func (*VertexInstance) ProtoMessage() {}
 func (*VertexInstance) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{50}
+	return fileDescriptor_9d0d1b17d3865563, []int{51}
 }
 func (m *VertexInstance) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1479,7 +1507,7 @@ var xxx_messageInfo_VertexInstance proto.InternalMessageInfo
 func (m *VertexLimits) Reset()      { *m = VertexLimits{} }
 func (*VertexLimits) ProtoMessage() {}
 func (*VertexLimits) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{51}
+	return fileDescriptor_9d0d1b17d3865563, []int{52}
 }
 func (m *VertexLimits) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1507,7 +1535,7 @@ var xxx_messageInfo_VertexLimits proto.InternalMessageInfo
 func (m *VertexList) Reset()      { *m = VertexList{} }
 func (*VertexList) ProtoMessage() {}
 func (*VertexList) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{52}
+	return fileDescriptor_9d0d1b17d3865563, []int{53}
 }
 func (m *VertexList) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1535,7 +1563,7 @@ var xxx_messageInfo_VertexList proto.InternalMessageInfo
 func (m *VertexSpec) Reset()      { *m = VertexSpec{} }
 func (*VertexSpec) ProtoMessage() {}
 func (*VertexSpec) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{53}
+	return fileDescriptor_9d0d1b17d3865563, []int{54}
 }
 func (m *VertexSpec) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1563,7 +1591,7 @@ var xxx_messageInfo_VertexSpec proto.InternalMessageInfo
 func (m *VertexStatus) Reset()      { *m = VertexStatus{} }
 func (*VertexStatus) ProtoMessage() {}
 func (*VertexStatus) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{54}
+	return fileDescriptor_9d0d1b17d3865563, []int{55}
 }
 func (m *VertexStatus) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1591,7 +1619,7 @@ var xxx_messageInfo_VertexStatus proto.InternalMessageInfo
 func (m *Watermark) Reset()      { *m = Watermark{} }
 func (*Watermark) ProtoMessage() {}
 func (*Watermark) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{55}
+	return fileDescriptor_9d0d1b17d3865563, []int{56}
 }
 func (m *Watermark) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1619,7 +1647,7 @@ var xxx_messageInfo_Watermark proto.InternalMessageInfo
 func (m *Window) Reset()      { *m = Window{} }
 func (*Window) ProtoMessage() {}
 func (*Window) Descriptor() ([]byte, []int) {
-	return fileDescriptor_9d0d1b17d3865563, []int{56}
+	return fileDescriptor_9d0d1b17d3865563, []int{57}
 }
 func (m *Window) XXX_Unmarshal(b []byte) error {
 	return m.Unmarshal(b)
@@ -1688,6 +1716,7 @@ func init() {
 	proto.RegisterType((*NATSAuth)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.NATSAuth")
 	proto.RegisterType((*NativeRedis)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.NativeRedis")
 	proto.RegisterMapType((map[string]string)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.NativeRedis.NodeSelectorEntry")
+	proto.RegisterType((*PBQStorage)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.PBQStorage")
 	proto.RegisterType((*PersistenceStrategy)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.PersistenceStrategy")
 	proto.RegisterType((*Pipeline)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.Pipeline")
 	proto.RegisterType((*PipelineLimits)(nil), "github.com.numaproj.numaflow.pkg.apis.numaflow.v1alpha1.PipelineLimits")
@@ -1719,314 +1748,317 @@ func init() {
 }
 
 var fileDescriptor_9d0d1b17d3865563 = []byte{
-	// 4902 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5c, 0x5d, 0x6c, 0x24, 0x57,
-	0x56, 0x4e, 0xff, 0xba, 0xfb, 0xb4, 0x7f, 0xef, 0x4c, 0x26, 0x1d, 0x6f, 0x62, 0x0f, 0x15, 0x25,
-	0x1a, 0x60, 0xb7, 0x4d, 0x4c, 0x96, 0x9d, 0x05, 0xb2, 0x89, 0xdb, 0x1e, 0x3b, 0xce, 0xd8, 0x13,
-	0x73, 0xda, 0x9e, 0xc9, 0x0f, 0x10, 0xca, 0xd5, 0xb7, 0xdb, 0x95, 0xae, 0xae, 0xea, 0xad, 0xba,
-	0xed, 0xb1, 0x23, 0x56, 0x20, 0xf1, 0x90, 0x45, 0x2c, 0xda, 0x95, 0xf6, 0x01, 0xa4, 0x15, 0x2b,
-	0x1e, 0x56, 0x42, 0x20, 0xad, 0x84, 0x90, 0x90, 0x10, 0x08, 0x89, 0x27, 0x14, 0x5e, 0x56, 0x79,
-	0x40, 0x22, 0x48, 0x2b, 0x8b, 0x18, 0x89, 0x47, 0xb4, 0x68, 0xdf, 0x46, 0x48, 0xa0, 0xfb, 0x53,
-	0xbf, 0x5d, 0xed, 0xb1, 0xbb, 0xed, 0xf0, 0xc0, 0xbc, 0x75, 0xdd, 0x73, 0xce, 0x77, 0x6e, 0xdd,
-	0x9f, 0x73, 0xcf, 0xcf, 0xad, 0x86, 0x8d, 0xb6, 0xc9, 0x0e, 0xfa, 0xfb, 0x35, 0xc3, 0xe9, 0x2e,
-	0xd9, 0xfd, 0xae, 0xde, 0x73, 0x9d, 0x0f, 0xc4, 0x8f, 0x96, 0xe5, 0x3c, 0x5c, 0xea, 0x75, 0xda,
-	0x4b, 0x7a, 0xcf, 0xf4, 0xc2, 0x96, 0xc3, 0x97, 0x75, 0xab, 0x77, 0xa0, 0xbf, 0xbc, 0xd4, 0xa6,
-	0x36, 0x75, 0x75, 0x46, 0x9b, 0xb5, 0x9e, 0xeb, 0x30, 0x87, 0x7c, 0x25, 0x04, 0xaa, 0xf9, 0x40,
-	0x35, 0x5f, 0xac, 0xd6, 0xeb, 0xb4, 0x6b, 0x1c, 0x28, 0x6c, 0xf1, 0x81, 0xe6, 0xbf, 0x14, 0xe9,
-	0x41, 0xdb, 0x69, 0x3b, 0x4b, 0x02, 0x6f, 0xbf, 0xdf, 0x12, 0x4f, 0xe2, 0x41, 0xfc, 0x92, 0x7a,
-	0xe6, 0xb5, 0xce, 0x6d, 0xaf, 0x66, 0x3a, 0xbc, 0x5b, 0x4b, 0x86, 0xe3, 0xd2, 0xa5, 0xc3, 0x81,
-	0xbe, 0xcc, 0xbf, 0x12, 0xf2, 0x74, 0x75, 0xe3, 0xc0, 0xb4, 0xa9, 0x7b, 0xec, 0xbf, 0xcb, 0x92,
-	0x4b, 0x3d, 0xa7, 0xef, 0x1a, 0xf4, 0x42, 0x52, 0xde, 0x52, 0x97, 0x32, 0x3d, 0x4d, 0xd7, 0xd2,
-	0x30, 0x29, 0xb7, 0x6f, 0x33, 0xb3, 0x3b, 0xa8, 0xe6, 0x97, 0x1e, 0x27, 0xe0, 0x19, 0x07, 0xb4,
-	0xab, 0x27, 0xe5, 0xb4, 0x1f, 0x4d, 0xc1, 0xf4, 0xca, 0xbe, 0xc7, 0x5c, 0xdd, 0x60, 0xf7, 0xa9,
-	0xcb, 0xe8, 0x11, 0xb9, 0x09, 0x79, 0x5b, 0xef, 0xd2, 0x6a, 0xe6, 0x66, 0xe6, 0x56, 0xb9, 0x3e,
-	0xf9, 0xf1, 0xc9, 0xe2, 0x53, 0xa7, 0x27, 0x8b, 0xf9, 0x7b, 0x7a, 0x97, 0xa2, 0xa0, 0x10, 0x03,
-	0x8a, 0xf2, 0x6d, 0xab, 0xb9, 0x9b, 0x99, 0x5b, 0x95, 0xe5, 0xd7, 0x6a, 0x23, 0x4e, 0x53, 0xad,
-	0x21, 0x60, 0xea, 0x70, 0x7a, 0xb2, 0x58, 0x94, 0xbf, 0x51, 0x41, 0x93, 0xf7, 0x20, 0xef, 0x99,
-	0x76, 0xa7, 0x9a, 0x17, 0x2a, 0x5e, 0x1d, 0x5d, 0x85, 0x69, 0x77, 0xea, 0x25, 0xfe, 0x06, 0xfc,
-	0x17, 0x0a, 0x50, 0xf2, 0xed, 0x0c, 0xcc, 0x19, 0x8e, 0xcd, 0x74, 0x3e, 0x50, 0xbb, 0xb4, 0xdb,
-	0xb3, 0x74, 0x46, 0xab, 0x05, 0xa1, 0xea, 0xcd, 0x91, 0x55, 0xad, 0x26, 0x11, 0xeb, 0x4f, 0x9f,
-	0x9e, 0x2c, 0xce, 0x0d, 0x34, 0xe3, 0xa0, 0x6e, 0xf2, 0x00, 0x72, 0xfd, 0x66, 0xab, 0x5a, 0x14,
-	0x5d, 0xf8, 0xd5, 0x91, 0xbb, 0xb0, 0xb7, 0xb6, 0x5e, 0x9f, 0x38, 0x3d, 0x59, 0xcc, 0xed, 0xad,
-	0xad, 0x23, 0x47, 0x24, 0x1d, 0x28, 0xf1, 0x55, 0xd6, 0xd4, 0x99, 0x5e, 0x9d, 0x10, 0xe8, 0x2b,
-	0x23, 0xa3, 0x6f, 0x2b, 0xa0, 0xfa, 0xe4, 0xe9, 0xc9, 0x62, 0xc9, 0x7f, 0xc2, 0x40, 0x01, 0xf9,
-	0x6e, 0x06, 0x26, 0x6d, 0xa7, 0x49, 0x1b, 0xd4, 0xa2, 0x06, 0x73, 0xdc, 0x6a, 0xe9, 0x66, 0xee,
-	0x56, 0x65, 0xf9, 0x9d, 0x91, 0x35, 0xc6, 0xd7, 0x66, 0xed, 0x5e, 0x04, 0xfb, 0x8e, 0xcd, 0xdc,
-	0xe3, 0xfa, 0x75, 0xb5, 0x3e, 0x27, 0xa3, 0x24, 0x8c, 0x75, 0x82, 0xec, 0x41, 0x85, 0x39, 0x16,
-	0x5f, 0xf7, 0xa6, 0x63, 0x7b, 0xd5, 0xb2, 0xe8, 0xd3, 0x42, 0x4d, 0x6e, 0x19, 0xae, 0xb9, 0xc6,
-	0xf7, 0x7c, 0xed, 0xf0, 0xe5, 0xda, 0x6e, 0xc0, 0x56, 0xbf, 0xa6, 0x80, 0x2b, 0x61, 0x9b, 0x87,
-	0x51, 0x1c, 0x42, 0x61, 0xc6, 0xa3, 0x46, 0xdf, 0x35, 0xd9, 0x31, 0x9f, 0x62, 0x7a, 0xc4, 0xaa,
-	0x20, 0x06, 0xf8, 0xa5, 0x34, 0xe8, 0x1d, 0xa7, 0xd9, 0x88, 0x73, 0xd7, 0xaf, 0x9d, 0x9e, 0x2c,
-	0xce, 0x24, 0x1a, 0x31, 0x89, 0x49, 0x6c, 0x98, 0x35, 0xbb, 0x7a, 0x9b, 0xee, 0xf4, 0x2d, 0xab,
-	0x41, 0x0d, 0x97, 0x32, 0xaf, 0x5a, 0x11, 0xaf, 0x70, 0x2b, 0x4d, 0xcf, 0x96, 0x63, 0xe8, 0xd6,
-	0x5b, 0xfb, 0x1f, 0x50, 0x83, 0x21, 0x6d, 0x51, 0x97, 0xda, 0x06, 0xad, 0x57, 0xd5, 0xcb, 0xcc,
-	0x6e, 0x26, 0x90, 0x70, 0x00, 0x9b, 0x6c, 0xc0, 0x5c, 0xcf, 0x35, 0x1d, 0xd1, 0x05, 0x4b, 0xf7,
-	0x3c, 0xbe, 0xf1, 0xab, 0x93, 0xc2, 0x18, 0x3c, 0xab, 0x60, 0xe6, 0x76, 0x92, 0x0c, 0x38, 0x28,
-	0x43, 0x6e, 0x41, 0xc9, 0x6f, 0xac, 0x4e, 0xdd, 0xcc, 0xdc, 0x2a, 0xc8, 0x65, 0xe3, 0xcb, 0x62,
-	0x40, 0x25, 0xeb, 0x50, 0xd2, 0x5b, 0x2d, 0xd3, 0xe6, 0x9c, 0xd3, 0x62, 0x08, 0x9f, 0x4b, 0x7b,
-	0xb5, 0x15, 0xc5, 0x23, 0x71, 0xfc, 0x27, 0x0c, 0x64, 0xc9, 0x9b, 0x40, 0x3c, 0xea, 0x1e, 0x9a,
-	0x06, 0x5d, 0x31, 0x0c, 0xa7, 0x6f, 0x33, 0xd1, 0xf7, 0x19, 0xd1, 0xf7, 0x79, 0xd5, 0x77, 0xd2,
-	0x18, 0xe0, 0xc0, 0x14, 0x29, 0x72, 0x07, 0x26, 0x0e, 0x1d, 0xab, 0xdf, 0xa5, 0x5e, 0x75, 0x56,
-	0x8c, 0xf6, 0x7c, 0x5a, 0x97, 0xee, 0x0b, 0x96, 0xfa, 0x8c, 0x02, 0x9f, 0x90, 0xcf, 0x1e, 0xfa,
-	0xb2, 0xc4, 0x84, 0xa2, 0x65, 0x76, 0x4d, 0xe6, 0x55, 0xe7, 0xc4, 0x8b, 0xdd, 0x19, 0x79, 0x2b,
-	0xc8, 0x2d, 0xb0, 0x25, 0xc0, 0xa4, 0xc5, 0x94, 0xbf, 0x51, 0x29, 0x20, 0x06, 0x14, 0x3c, 0x43,
-	0xb7, 0x68, 0x95, 0x08, 0x4d, 0x5f, 0x1b, 0xdd, 0x64, 0x72, 0x94, 0xfa, 0x94, 0x7a, 0xa7, 0x82,
-	0x78, 0x44, 0x89, 0x4d, 0x7e, 0x03, 0xa6, 0xf9, 0x58, 0x07, 0x36, 0xcd, 0xab, 0x5e, 0x13, 0xa3,
-	0xf3, 0x7c, 0xda, 0xe8, 0x04, 0x5c, 0xf5, 0x1b, 0x0a, 0x6c, 0x7a, 0x33, 0x26, 0x8c, 0x09, 0xb0,
-	0xf9, 0xd7, 0x60, 0x6e, 0x60, 0x8f, 0x93, 0x59, 0xc8, 0x75, 0xe8, 0xb1, 0x3c, 0x90, 0x90, 0xff,
-	0x24, 0xd7, 0xa1, 0x70, 0xa8, 0x5b, 0x7d, 0x5a, 0xcd, 0x8a, 0x36, 0xf9, 0xf0, 0xcb, 0xd9, 0xdb,
-	0x19, 0xed, 0x01, 0x4c, 0xad, 0xf4, 0xd9, 0x81, 0xe3, 0x9a, 0x1f, 0x8a, 0x6d, 0x4a, 0xd6, 0xa1,
-	0xc0, 0x9c, 0x0e, 0xb5, 0x85, 0x78, 0x65, 0xf9, 0xc5, 0xb4, 0x7e, 0xca, 0xa5, 0x7f, 0x97, 0x1e,
-	0xfb, 0x7a, 0xeb, 0x65, 0xfe, 0xe2, 0xbb, 0x5c, 0x0e, 0xa5, 0xb8, 0xf6, 0x2e, 0x14, 0xeb, 0xfd,
-	0x56, 0x8b, 0xba, 0xe7, 0x38, 0x20, 0x6b, 0x90, 0x67, 0xc7, 0x3d, 0xd5, 0xbb, 0x60, 0xe5, 0xe5,
-	0x77, 0x8f, 0x7b, 0xf4, 0xd1, 0xc9, 0x22, 0x48, 0x1c, 0xfe, 0x84, 0x82, 0x4f, 0xfb, 0x69, 0x06,
-	0xae, 0xc9, 0x46, 0xb5, 0x38, 0x57, 0x1d, 0xbb, 0x65, 0xb6, 0x09, 0x85, 0x82, 0x4b, 0x9b, 0xa6,
-	0xa7, 0xfa, 0xbe, 0x36, 0xf2, 0x8c, 0x22, 0x47, 0x91, 0xa0, 0xf2, 0xd5, 0x44, 0x03, 0x4a, 0x74,
-	0xd2, 0x87, 0xf2, 0x07, 0x94, 0x79, 0xcc, 0xa5, 0x7a, 0x57, 0xf4, 0xb9, 0xb2, 0xfc, 0xc6, 0xc8,
-	0xaa, 0xde, 0xa4, 0xac, 0x21, 0x90, 0x94, 0xba, 0xa9, 0xd3, 0x93, 0xc5, 0x72, 0xd0, 0x88, 0xa1,
-	0x26, 0xed, 0x3f, 0xb2, 0x50, 0x0e, 0xa6, 0x9e, 0xbc, 0x00, 0x05, 0x61, 0x8a, 0xd4, 0xb0, 0x06,
-	0xab, 0x4f, 0x58, 0x2c, 0x94, 0x34, 0xf2, 0x22, 0x4c, 0x18, 0x4e, 0xb7, 0xab, 0xdb, 0xcd, 0x6a,
-	0xf6, 0x66, 0xee, 0x56, 0xb9, 0x5e, 0xe1, 0x9b, 0x6e, 0x55, 0x36, 0xa1, 0x4f, 0x23, 0xcf, 0x41,
-	0x5e, 0x77, 0xdb, 0x5e, 0x35, 0x27, 0x78, 0xc4, 0xe1, 0xbf, 0xe2, 0xb6, 0x3d, 0x14, 0xad, 0xe4,
-	0xab, 0x90, 0xa3, 0xf6, 0x61, 0x35, 0x3f, 0x7c, 0x57, 0xdf, 0xb1, 0x0f, 0xef, 0xeb, 0x6e, 0xbd,
-	0xa2, 0xfa, 0x90, 0xbb, 0x63, 0x1f, 0x22, 0x97, 0x21, 0xef, 0xc0, 0xa4, 0xdc, 0xd8, 0xdb, 0xdc,
-	0x4e, 0x78, 0xd5, 0x82, 0xc0, 0x58, 0x1c, 0x6e, 0x19, 0x04, 0x5f, 0x78, 0x48, 0x45, 0x1a, 0x3d,
-	0x8c, 0x41, 0x91, 0x77, 0xa0, 0xec, 0x3b, 0x91, 0x9e, 0x72, 0x03, 0x52, 0xed, 0x3b, 0x2a, 0x26,
-	0xa4, 0x5f, 0xef, 0x9b, 0x2e, 0xed, 0x52, 0x9b, 0x79, 0xf5, 0x39, 0xa5, 0xa0, 0xec, 0x53, 0x3d,
-	0x0c, 0xd1, 0xb4, 0xff, 0xca, 0xc2, 0xa0, 0x13, 0x12, 0x57, 0x98, 0xb9, 0x4c, 0x85, 0x64, 0x1f,
-	0x66, 0x82, 0x63, 0x65, 0xc7, 0xb1, 0x4c, 0xe3, 0x58, 0x6d, 0x85, 0xdb, 0x4a, 0x6c, 0x66, 0x33,
-	0x4e, 0x7e, 0x74, 0xb2, 0xf8, 0xfc, 0xa0, 0x0b, 0x5e, 0x0b, 0x19, 0x30, 0x09, 0xc8, 0x75, 0x24,
-	0x4f, 0x5f, 0xe9, 0x8d, 0xbe, 0x30, 0x64, 0x87, 0x8f, 0x70, 0xf4, 0x8e, 0xbe, 0x52, 0xb4, 0x1f,
-	0x67, 0x21, 0x7f, 0xa7, 0xd9, 0xa6, 0xdc, 0x5a, 0xb4, 0x5c, 0xa7, 0x9b, 0xb4, 0x16, 0xeb, 0xae,
-	0xd3, 0x45, 0x41, 0x21, 0xf3, 0x90, 0x65, 0x8e, 0x1a, 0x20, 0x50, 0xf4, 0xec, 0xae, 0x83, 0x59,
-	0xe6, 0x90, 0x0f, 0x01, 0x0c, 0xc7, 0x6e, 0x9a, 0xd2, 0x73, 0xc9, 0x8d, 0xe9, 0xa0, 0xae, 0x3b,
-	0xee, 0x43, 0xdd, 0x6d, 0xae, 0x06, 0x88, 0xf5, 0xe9, 0xd3, 0x93, 0x45, 0x08, 0x9f, 0x31, 0xa2,
-	0x8d, 0xb4, 0x83, 0xa3, 0x4b, 0xfa, 0xe0, 0xab, 0x23, 0xeb, 0xe5, 0x03, 0x71, 0xc6, 0xc1, 0xf5,
-	0x32, 0x54, 0x7a, 0xba, 0xab, 0x5b, 0x16, 0xb5, 0x4c, 0xaf, 0x2b, 0xdc, 0xf0, 0x42, 0x7d, 0x86,
-	0xfb, 0x5e, 0x3b, 0x61, 0x33, 0x46, 0x79, 0xb4, 0x3f, 0xcc, 0x00, 0x84, 0xa8, 0xe4, 0x55, 0x98,
-	0xd9, 0x17, 0xf6, 0x73, 0x5b, 0x3f, 0xda, 0xa2, 0x76, 0x9b, 0x1d, 0x88, 0xf1, 0xce, 0xcb, 0x79,
-	0xae, 0xc7, 0x49, 0x98, 0xe4, 0x25, 0xaf, 0xc3, 0xac, 0x6c, 0xda, 0xf3, 0x74, 0x85, 0x29, 0xe6,
-	0x63, 0xaa, 0x7e, 0x9d, 0x3b, 0x4d, 0xf5, 0x04, 0x0d, 0x07, 0xb8, 0x35, 0x1d, 0x2a, 0xeb, 0xe6,
-	0x11, 0x6d, 0x3e, 0x30, 0xed, 0xa6, 0xf3, 0x90, 0x20, 0x14, 0xad, 0xb0, 0x1b, 0x95, 0xe5, 0x5a,
-	0x64, 0xed, 0x04, 0xf1, 0x59, 0x38, 0x62, 0xdc, 0x7f, 0xe6, 0xab, 0x69, 0xad, 0xaf, 0x9c, 0x4f,
-	0x39, 0x4a, 0xb2, 0xb7, 0x0a, 0x49, 0x7b, 0x05, 0xe6, 0x06, 0xe6, 0x8f, 0x2c, 0x42, 0xa1, 0x43,
-	0x8f, 0x37, 0xf9, 0xe9, 0xc6, 0x4d, 0x9d, 0xb0, 0xed, 0x77, 0x79, 0x03, 0xca, 0x76, 0xed, 0xbf,
-	0x33, 0x50, 0x5a, 0xef, 0xdb, 0x86, 0x38, 0x0b, 0x1f, 0x7f, 0x72, 0xf9, 0x96, 0x33, 0x9b, 0x6a,
-	0x39, 0xfb, 0x50, 0xec, 0x3c, 0x0c, 0x2c, 0x6b, 0x65, 0x79, 0x7b, 0xf4, 0x95, 0xa8, 0xba, 0x54,
-	0xbb, 0x2b, 0xf0, 0xa4, 0x2f, 0x3f, 0xad, 0x3a, 0x54, 0xbc, 0xfb, 0x40, 0x28, 0x55, 0xca, 0xe6,
-	0xbf, 0x0a, 0x95, 0x08, 0xdb, 0x85, 0xdc, 0x81, 0x1f, 0x66, 0x60, 0x66, 0x43, 0xc6, 0xbc, 0x8e,
-	0x2b, 0x23, 0x4c, 0xf2, 0x2c, 0xe4, 0xdc, 0x5e, 0x5f, 0xc8, 0xe7, 0x64, 0xb0, 0x84, 0x3b, 0x7b,
-	0xc8, 0xdb, 0xc8, 0xdb, 0x50, 0x6a, 0xaa, 0x39, 0x50, 0x07, 0xe1, 0x45, 0x67, 0x4e, 0xb8, 0xa6,
-	0xfe, 0x13, 0x06, 0x68, 0xfc, 0xe4, 0xea, 0x7a, 0xed, 0x86, 0xf9, 0xa1, 0x0c, 0x9a, 0x0b, 0xf2,
-	0xe4, 0xda, 0x96, 0x4d, 0xe8, 0xd3, 0xb4, 0x6f, 0x67, 0xe1, 0xc6, 0x06, 0x65, 0x6b, 0x3a, 0xed,
-	0x3a, 0xf6, 0x1a, 0xed, 0x59, 0xce, 0x31, 0x37, 0xb8, 0x48, 0xbf, 0x4e, 0x5e, 0x07, 0x30, 0xbd,
-	0xfd, 0xc6, 0xa1, 0xc1, 0x1d, 0x07, 0x35, 0x85, 0x37, 0xd5, 0x88, 0xc1, 0x66, 0xa3, 0xae, 0x28,
-	0x8f, 0x62, 0x4f, 0x18, 0x91, 0x09, 0x8f, 0xd8, 0xec, 0x19, 0x47, 0x6c, 0x03, 0xa0, 0x17, 0x9a,
-	0xed, 0x9c, 0xe0, 0xfc, 0x45, 0x5f, 0xcd, 0x45, 0x2c, 0x76, 0x04, 0x66, 0x1c, 0x43, 0xfa, 0xb7,
-	0x39, 0x98, 0xdf, 0xa0, 0x2c, 0xf0, 0x20, 0x94, 0x87, 0xd4, 0xe8, 0x51, 0x83, 0x8f, 0xca, 0x47,
-	0x19, 0x28, 0x5a, 0xfa, 0x3e, 0xb5, 0x3c, 0xb1, 0x05, 0x2a, 0xcb, 0xef, 0x8f, 0xbc, 0x26, 0x87,
-	0x6b, 0xa9, 0x6d, 0x09, 0x0d, 0x89, 0x55, 0x2a, 0x1b, 0x51, 0xa9, 0x27, 0x5f, 0x86, 0x8a, 0x61,
-	0xf5, 0x3d, 0x46, 0xdd, 0x1d, 0xc7, 0x95, 0xf6, 0xa3, 0x10, 0x46, 0x91, 0xab, 0x21, 0x09, 0xa3,
-	0x7c, 0x64, 0x19, 0xc0, 0xb0, 0x4c, 0x6a, 0x33, 0x21, 0x25, 0xd7, 0x06, 0xf1, 0xc7, 0x7b, 0x35,
-	0xa0, 0x60, 0x84, 0x8b, 0xab, 0xea, 0x3a, 0xb6, 0xc9, 0x1c, 0xa9, 0x2a, 0x1f, 0x57, 0xb5, 0x1d,
-	0x92, 0x30, 0xca, 0x27, 0xc4, 0x28, 0x73, 0x4d, 0xc3, 0x13, 0x62, 0x85, 0x84, 0x58, 0x48, 0xc2,
-	0x28, 0x1f, 0xdf, 0x7e, 0x91, 0xf7, 0xbf, 0xd0, 0xf6, 0xfb, 0xbb, 0x12, 0x2c, 0xc4, 0x86, 0x95,
-	0xe9, 0x8c, 0xb6, 0xfa, 0x56, 0x83, 0x32, 0x7f, 0x02, 0xbf, 0x0c, 0x15, 0x15, 0x7d, 0xdd, 0x0b,
-	0x4d, 0x53, 0xd0, 0xa9, 0x46, 0x48, 0xc2, 0x28, 0x1f, 0xf9, 0x83, 0x70, 0xde, 0xb3, 0x62, 0xde,
-	0x8d, 0xcb, 0x99, 0xf7, 0x81, 0x0e, 0x9e, 0x6b, 0xee, 0x97, 0xa0, 0x6c, 0xeb, 0xcc, 0x13, 0x1b,
-	0x49, 0xed, 0x99, 0xc0, 0x43, 0xba, 0xe7, 0x13, 0x30, 0xe4, 0x21, 0x3b, 0x70, 0x5d, 0x0d, 0xf1,
-	0x9d, 0xa3, 0x9e, 0xe3, 0x32, 0xea, 0x4a, 0xd9, 0xbc, 0x90, 0x7d, 0x4e, 0xc9, 0x5e, 0xdf, 0x4e,
-	0xe1, 0xc1, 0x54, 0x49, 0xb2, 0x0d, 0xd7, 0x0c, 0xe1, 0x71, 0x23, 0xb5, 0x1c, 0xbd, 0xe9, 0x03,
-	0x16, 0x04, 0xe0, 0x17, 0x14, 0xe0, 0xb5, 0xd5, 0x41, 0x16, 0x4c, 0x93, 0x4b, 0xae, 0xe6, 0xe2,
-	0x48, 0xab, 0x79, 0x62, 0x94, 0xd5, 0x5c, 0x1a, 0x6d, 0x35, 0x97, 0xcf, 0xb7, 0x9a, 0xf9, 0xc8,
-	0xf3, 0x75, 0x44, 0x5d, 0x1e, 0x26, 0xca, 0xc0, 0x4f, 0x2c, 0x3c, 0x88, 0x8f, 0x7c, 0x23, 0x85,
-	0x07, 0x53, 0x25, 0xc9, 0x3e, 0xcc, 0xcb, 0xf6, 0x3b, 0xb6, 0xe1, 0x1e, 0xf7, 0xb8, 0xb9, 0x8f,
-	0xe0, 0x56, 0x04, 0xae, 0xa6, 0x70, 0xe7, 0x1b, 0x43, 0x39, 0xf1, 0x0c, 0x14, 0xf2, 0x2b, 0x30,
-	0x25, 0x67, 0x69, 0x5b, 0xef, 0x45, 0x12, 0x32, 0x4f, 0x2b, 0xd8, 0xa9, 0xd5, 0x28, 0x11, 0xe3,
-	0xbc, 0x64, 0x05, 0x66, 0x7a, 0x87, 0x06, 0xff, 0xb9, 0xd9, 0xba, 0x47, 0x69, 0x93, 0x36, 0x45,
-	0x3e, 0xa6, 0x5c, 0x7f, 0xc6, 0x77, 0xc7, 0x77, 0xe2, 0x64, 0x4c, 0xf2, 0x93, 0xdb, 0x30, 0xe9,
-	0x31, 0xdd, 0x65, 0x2a, 0xd4, 0x12, 0x59, 0x9a, 0x72, 0x18, 0xd7, 0x34, 0x22, 0x34, 0x8c, 0x71,
-	0x8e, 0x63, 0x3d, 0x1e, 0xc9, 0xc3, 0x50, 0xc4, 0xaa, 0x09, 0xb3, 0xff, 0x7b, 0x49, 0xb3, 0xff,
-	0xde, 0x38, 0xdb, 0x3f, 0x45, 0xc3, 0xb9, 0xb6, 0xfd, 0x9b, 0x40, 0x5c, 0x15, 0x59, 0xcb, 0xe0,
-	0x2a, 0x62, 0xf9, 0x83, 0x7c, 0x13, 0x0e, 0x70, 0x60, 0x8a, 0x14, 0x69, 0xc0, 0xd3, 0x1e, 0xb5,
-	0x99, 0x69, 0x53, 0x2b, 0x0e, 0x27, 0x8f, 0x84, 0xe7, 0x15, 0xdc, 0xd3, 0x8d, 0x34, 0x26, 0x4c,
-	0x97, 0x1d, 0x67, 0xf0, 0x7f, 0x5c, 0x16, 0xe7, 0xae, 0x1c, 0x9a, 0x4b, 0x33, 0xdb, 0x1f, 0x25,
-	0xcd, 0xf6, 0xfb, 0xe3, 0xcf, 0xdb, 0x68, 0x26, 0x7b, 0x19, 0x40, 0xcc, 0x42, 0xd4, 0x66, 0x07,
-	0x96, 0x0a, 0x03, 0x0a, 0x46, 0xb8, 0xf8, 0x2e, 0xf4, 0xc7, 0x39, 0x6a, 0xae, 0x83, 0x5d, 0xd8,
-	0x88, 0x12, 0x31, 0xce, 0x3b, 0xd4, 0xe4, 0x17, 0x46, 0x36, 0xf9, 0x6f, 0x02, 0x89, 0xa5, 0xcf,
-	0x24, 0x5e, 0x31, 0x9e, 0xee, 0xdc, 0x1c, 0xe0, 0xc0, 0x14, 0xa9, 0x21, 0x4b, 0x79, 0xe2, 0x72,
-	0x97, 0x72, 0x69, 0xf4, 0xa5, 0x4c, 0xde, 0x87, 0x67, 0x85, 0x2a, 0x35, 0x3e, 0x71, 0x60, 0x69,
-	0xfc, 0x7f, 0x46, 0x01, 0x3f, 0x8b, 0xc3, 0x18, 0x71, 0x38, 0x06, 0x9f, 0x1f, 0xc3, 0xa5, 0x4d,
-	0xae, 0x5c, 0xb7, 0x86, 0x1f, 0x0c, 0xab, 0x29, 0x3c, 0x98, 0x2a, 0xc9, 0x97, 0x18, 0xe3, 0xcb,
-	0x50, 0xdf, 0xb7, 0x68, 0x53, 0x1c, 0x04, 0xa5, 0x70, 0x89, 0xed, 0x6e, 0x35, 0x14, 0x05, 0x23,
-	0x5c, 0x69, 0xb6, 0x7a, 0xf2, 0x82, 0xb6, 0x7a, 0x43, 0xd4, 0xb6, 0x5a, 0xb1, 0x23, 0x41, 0x19,
-	0xfc, 0x20, 0x81, 0xbf, 0x9a, 0x64, 0xc0, 0x41, 0x19, 0x71, 0x54, 0x1a, 0xae, 0xd9, 0x63, 0x5e,
-	0x1c, 0x6b, 0x3a, 0x71, 0x54, 0xa6, 0xf0, 0x60, 0xaa, 0x24, 0x77, 0x52, 0x0e, 0xa8, 0x6e, 0xb1,
-	0x83, 0x38, 0xe0, 0x4c, 0xdc, 0x49, 0x79, 0x63, 0x90, 0x05, 0xd3, 0xe4, 0xc6, 0x31, 0x6f, 0xdf,
-	0xca, 0xc2, 0xb5, 0x0d, 0xaa, 0xea, 0x4a, 0x3b, 0x4e, 0xd3, 0xb7, 0x6b, 0xff, 0x4f, 0xa3, 0xac,
-	0x3f, 0xca, 0xc0, 0xc4, 0x86, 0xeb, 0xf4, 0x7b, 0xf5, 0x63, 0xd2, 0x86, 0xe2, 0x43, 0x91, 0xc6,
-	0x50, 0xc9, 0x8b, 0xd1, 0xcb, 0xbb, 0x32, 0x1b, 0x12, 0x9a, 0x60, 0xf9, 0x8c, 0x0a, 0x9e, 0x8f,
-	0x54, 0x87, 0x1e, 0xd3, 0xa6, 0x18, 0xa9, 0x52, 0x38, 0x52, 0x77, 0x79, 0x23, 0x4a, 0x9a, 0xf6,
-	0x27, 0x19, 0x80, 0x37, 0x76, 0x77, 0x77, 0x54, 0xf0, 0xde, 0x84, 0xbc, 0xde, 0x0f, 0xf2, 0x2a,
-	0xeb, 0xa3, 0x17, 0x16, 0xa3, 0x45, 0x02, 0x95, 0xe8, 0xe8, 0xb3, 0x03, 0x14, 0xe8, 0xe4, 0x67,
-	0x61, 0x42, 0x9d, 0x5a, 0xaa, 0x6f, 0x41, 0x81, 0x47, 0x9d, 0x6c, 0xe8, 0xd3, 0xb5, 0x9f, 0x64,
-	0xe1, 0xc6, 0xa6, 0xcd, 0xa8, 0xdb, 0x60, 0xb4, 0x17, 0x4b, 0xe2, 0x93, 0xdf, 0x8a, 0x94, 0x5e,
-	0x65, 0x7f, 0x7f, 0xe1, 0x7c, 0xd9, 0x04, 0x59, 0xbe, 0xdb, 0xa6, 0x4c, 0x0f, 0xed, 0x45, 0xd8,
-	0x16, 0xa9, 0xb7, 0xf6, 0x21, 0xef, 0xf5, 0xa8, 0xa1, 0x72, 0x15, 0x8d, 0x91, 0x47, 0x23, 0xfd,
-	0x05, 0xf8, 0x9e, 0x08, 0xb3, 0x44, 0x62, 0x87, 0x08, 0x75, 0xe4, 0x1b, 0x50, 0xf4, 0x98, 0xce,
-	0xfa, 0x7e, 0x46, 0x72, 0xef, 0xb2, 0x15, 0x0b, 0xf0, 0x70, 0xdd, 0xc8, 0x67, 0x54, 0x4a, 0xb5,
-	0x9f, 0x64, 0x60, 0x3e, 0x5d, 0x70, 0xcb, 0xf4, 0x18, 0xf9, 0xf5, 0x81, 0x61, 0x3f, 0x67, 0x12,
-	0x87, 0x4b, 0x8b, 0x41, 0x9f, 0x55, 0x8a, 0x4b, 0x7e, 0x4b, 0x64, 0xc8, 0x19, 0x14, 0x4c, 0x46,
-	0xbb, 0xbe, 0xff, 0xf2, 0xd6, 0x25, 0xbf, 0x7a, 0xc4, 0x5e, 0x70, 0x2d, 0x28, 0x95, 0x69, 0xdf,
-	0xcc, 0x0e, 0x7b, 0x65, 0x3e, 0x2d, 0xc4, 0x8a, 0x17, 0x8a, 0xee, 0x8e, 0x57, 0x28, 0x8a, 0x77,
-	0x68, 0xb0, 0x5e, 0xf4, 0xdb, 0x83, 0xf5, 0xa2, 0xb7, 0xc6, 0xaf, 0x17, 0x25, 0x86, 0x61, 0x68,
-	0xd9, 0xe8, 0x5b, 0x39, 0x78, 0xee, 0xac, 0x65, 0xc3, 0xed, 0x97, 0x5a, 0x9d, 0xe3, 0xda, 0xaf,
-	0xb3, 0xd7, 0x21, 0x59, 0x86, 0x42, 0xef, 0x40, 0xf7, 0x7c, 0x4b, 0xef, 0x1f, 0x88, 0x85, 0x1d,
-	0xde, 0xf8, 0xe8, 0x64, 0xb1, 0x22, 0x4f, 0x08, 0xf1, 0x88, 0x92, 0x95, 0x5b, 0x96, 0x2e, 0xf5,
-	0xbc, 0xd0, 0xe7, 0x0c, 0x2c, 0xcb, 0xb6, 0x6c, 0x46, 0x9f, 0x4e, 0x18, 0x14, 0x65, 0x1c, 0xa7,
-	0xf2, 0xef, 0x5b, 0x23, 0xbf, 0x47, 0x4a, 0x6d, 0x31, 0x7c, 0x29, 0x95, 0x12, 0x50, 0xba, 0x82,
-	0xda, 0x65, 0x21, 0xbd, 0x76, 0x19, 0x39, 0xf4, 0x64, 0xed, 0xf2, 0xaf, 0xa6, 0xe1, 0x46, 0xfa,
-	0x1c, 0xf2, 0x77, 0x3d, 0xa4, 0xae, 0x67, 0x3a, 0xb6, 0x3a, 0x48, 0xc3, 0x32, 0xb9, 0x6c, 0x46,
-	0x9f, 0x4e, 0x6e, 0x41, 0xc9, 0xa5, 0x3d, 0xcb, 0x34, 0x74, 0x4f, 0xc5, 0x4f, 0x22, 0x91, 0x8a,
-	0xaa, 0x0d, 0x03, 0xea, 0x90, 0xab, 0x3b, 0xb9, 0xff, 0xc3, 0xab, 0x3b, 0x7f, 0x96, 0xe1, 0xae,
-	0xa9, 0x4c, 0x9e, 0x0c, 0x08, 0xa8, 0xb9, 0xbb, 0xcc, 0x9e, 0x3d, 0x2f, 0x5d, 0xdc, 0x21, 0x0a,
-	0x71, 0x78, 0x5f, 0xc8, 0x0f, 0x32, 0x50, 0xed, 0x26, 0x7c, 0xdf, 0x2b, 0xbc, 0xfd, 0xf4, 0xdc,
-	0xe9, 0xc9, 0x62, 0x75, 0x7b, 0x88, 0x3e, 0x1c, 0xda, 0x13, 0xf2, 0x3b, 0x50, 0xe9, 0xf1, 0x75,
-	0xe1, 0x31, 0x6a, 0x1b, 0x54, 0x15, 0x43, 0x47, 0x5f, 0xfd, 0x3b, 0x21, 0x56, 0x83, 0xb9, 0x3a,
-	0xa3, 0xed, 0x63, 0x55, 0x5d, 0x0a, 0x09, 0x18, 0xd5, 0x18, 0xbb, 0x33, 0xb5, 0x7d, 0xd5, 0x77,
-	0xa6, 0xbe, 0x97, 0x7e, 0x67, 0x4a, 0xbf, 0x64, 0x8b, 0xfa, 0xe4, 0xee, 0xd4, 0x93, 0xbb, 0x53,
-	0x9f, 0xd7, 0xdd, 0xa9, 0x5b, 0x50, 0xf2, 0x28, 0x63, 0xa6, 0xdd, 0xf6, 0xaa, 0xb3, 0xb2, 0xd6,
-	0xc8, 0xb5, 0x36, 0x54, 0x1b, 0x06, 0x54, 0xf2, 0xf3, 0x50, 0x16, 0xd9, 0xc2, 0x15, 0xb7, 0xed,
-	0x55, 0xe7, 0x44, 0xd1, 0x51, 0x9c, 0xfc, 0x0d, 0xbf, 0x11, 0x43, 0x3a, 0x79, 0x05, 0x26, 0x65,
-	0xe1, 0x55, 0x1e, 0x59, 0xe2, 0x9e, 0x53, 0xb9, 0x3e, 0xcb, 0x57, 0x70, 0x3d, 0xd2, 0x8e, 0x31,
-	0x2e, 0x1e, 0x85, 0xd3, 0x20, 0xa5, 0x5a, 0xbd, 0x16, 0x8f, 0xc2, 0xc3, 0x64, 0x2b, 0x46, 0xb8,
-	0xc8, 0xf3, 0x90, 0x63, 0x96, 0x57, 0xbd, 0x2e, 0x98, 0x83, 0x68, 0x69, 0x77, 0xab, 0x81, 0xbc,
-	0x7d, 0xfc, 0x5b, 0x4a, 0xff, 0x93, 0x81, 0x99, 0xc4, 0x45, 0x19, 0xae, 0xb3, 0xef, 0x5a, 0xea,
-	0xa4, 0x0c, 0x74, 0xee, 0xe1, 0x16, 0xf2, 0x76, 0xf2, 0xbe, 0x0a, 0x7c, 0xb2, 0x63, 0xda, 0xa3,
-	0x7b, 0x2b, 0xbb, 0x0d, 0x1e, 0xe9, 0x0c, 0xc4, 0x3c, 0xb7, 0x13, 0xa3, 0x9b, 0x8b, 0xa7, 0x78,
-	0xcf, 0x1e, 0xe1, 0x48, 0x9e, 0x23, 0x7f, 0x9e, 0x3c, 0x87, 0xf6, 0x69, 0x06, 0xca, 0x77, 0xf5,
-	0x56, 0x47, 0x6f, 0x98, 0x76, 0x87, 0xbc, 0x08, 0x13, 0xfb, 0xae, 0xd3, 0xa1, 0xae, 0xa7, 0x0a,
-	0xd9, 0xa2, 0x3a, 0x5a, 0x97, 0x4d, 0xe8, 0xd3, 0x78, 0xc0, 0xc8, 0x9c, 0x9e, 0x69, 0x24, 0x43,
-	0xeb, 0x5d, 0xde, 0x88, 0x92, 0x46, 0x1e, 0xc8, 0xb9, 0xcb, 0x8d, 0x79, 0x93, 0x76, 0x77, 0xab,
-	0x21, 0x8b, 0xc3, 0xfe, 0xac, 0x93, 0x97, 0x62, 0xfe, 0x58, 0x79, 0x98, 0x07, 0xa5, 0x7d, 0x2f,
-	0x0b, 0x15, 0xf9, 0x6a, 0x32, 0x64, 0xbd, 0xcc, 0x97, 0x7b, 0x4d, 0xd4, 0x01, 0xbc, 0x7e, 0x97,
-	0xba, 0x22, 0x5c, 0x57, 0xb3, 0x14, 0xcd, 0xeb, 0x84, 0xc4, 0xa0, 0x16, 0x10, 0x36, 0xf9, 0xa3,
-	0x93, 0xbf, 0xc2, 0xd1, 0x29, 0x9c, 0x39, 0x3a, 0x7f, 0x99, 0x81, 0xf2, 0x96, 0xd9, 0xa2, 0xc6,
-	0xb1, 0x61, 0x51, 0xf2, 0x36, 0x54, 0x9b, 0xd4, 0xa2, 0x8c, 0x6e, 0xb8, 0xba, 0x41, 0x77, 0xa8,
-	0x6b, 0x0a, 0x53, 0xef, 0xd8, 0x4d, 0xe9, 0xbd, 0x17, 0xa4, 0x13, 0xb1, 0x36, 0x84, 0x07, 0x87,
-	0x4a, 0x93, 0x4d, 0x98, 0x6c, 0x52, 0xcf, 0x74, 0x69, 0x73, 0x27, 0xe2, 0xa3, 0xbf, 0xe8, 0x2f,
-	0xe7, 0xb5, 0x08, 0xed, 0xd1, 0xc9, 0xe2, 0xd4, 0x8e, 0xd9, 0xa3, 0x96, 0x69, 0x53, 0xe9, 0xac,
-	0xc7, 0x44, 0xb5, 0x02, 0xe4, 0xb6, 0x9c, 0xb6, 0xf6, 0xcd, 0x1c, 0x04, 0xe7, 0x37, 0xf9, 0xfd,
-	0x0c, 0x54, 0x74, 0xdb, 0x76, 0x98, 0x3a, 0x18, 0x65, 0x15, 0x02, 0xc7, 0x76, 0x13, 0x6a, 0x2b,
-	0x21, 0xa8, 0x3c, 0xa5, 0x83, 0xc3, 0x34, 0x42, 0xc1, 0xa8, 0x6e, 0xd2, 0x4f, 0xe4, 0xd4, 0xb7,
-	0xc7, 0xef, 0xc5, 0x39, 0x32, 0xe8, 0xf3, 0x5f, 0x83, 0xd9, 0x64, 0x67, 0x2f, 0x62, 0x04, 0xc7,
-	0xc9, 0xde, 0xfd, 0x69, 0x06, 0x4a, 0xbe, 0x21, 0x23, 0xab, 0x90, 0xef, 0x7b, 0xd4, 0xbd, 0xd8,
-	0x05, 0x4f, 0x61, 0xfd, 0xf6, 0x3c, 0xea, 0xa2, 0x10, 0x26, 0x6f, 0x41, 0xa9, 0xa7, 0x7b, 0xde,
-	0x43, 0xc7, 0x6d, 0x2a, 0x13, 0x7b, 0x4e, 0x20, 0x79, 0x2e, 0x2b, 0x51, 0x0c, 0x40, 0xb4, 0xbf,
-	0x9f, 0x82, 0xca, 0x3d, 0x9d, 0x99, 0x87, 0x54, 0xc4, 0xce, 0x57, 0x13, 0x0c, 0x7d, 0x3f, 0x03,
-	0x37, 0xe2, 0x09, 0xf8, 0x2b, 0x8c, 0x88, 0xe6, 0x4f, 0x4f, 0x16, 0x6f, 0x60, 0xaa, 0x36, 0x1c,
-	0xd2, 0x0b, 0x11, 0x1b, 0x0d, 0xe4, 0xf3, 0xaf, 0x3a, 0x36, 0x6a, 0x0c, 0x53, 0x88, 0xc3, 0xfb,
-	0xf2, 0x24, 0x36, 0x1a, 0x21, 0x36, 0xba, 0xf2, 0xef, 0x49, 0xbe, 0x93, 0x1e, 0x1b, 0xdd, 0x1f,
-	0xdd, 0xfb, 0x09, 0x77, 0xe4, 0x93, 0x80, 0xe8, 0x49, 0x40, 0xf4, 0x79, 0x05, 0x44, 0xbd, 0x44,
-	0x40, 0x34, 0x4e, 0xe5, 0x42, 0x5d, 0x56, 0x90, 0x68, 0xc3, 0x02, 0xab, 0xf1, 0x43, 0x94, 0x3f,
-	0xce, 0xc2, 0xb5, 0x14, 0xeb, 0x40, 0x5e, 0x87, 0x59, 0x8f, 0x39, 0xae, 0xde, 0xa6, 0xe1, 0x84,
-	0xca, 0x03, 0x4d, 0xdc, 0x95, 0x6d, 0x24, 0x68, 0x38, 0xc0, 0x4d, 0xde, 0x07, 0xd0, 0x0d, 0x83,
-	0x7a, 0xde, 0xb6, 0xd3, 0xf4, 0xfd, 0xb2, 0xd7, 0x78, 0xa8, 0xb0, 0x12, 0xb4, 0x3e, 0x3a, 0x59,
-	0xfc, 0x52, 0x5a, 0xdd, 0xcb, 0xef, 0x0f, 0x93, 0x17, 0xe9, 0x43, 0x01, 0x8c, 0x40, 0x92, 0xdf,
-	0x04, 0x90, 0x57, 0xeb, 0x83, 0xeb, 0x96, 0x8f, 0x29, 0x01, 0xd4, 0xfc, 0xab, 0xeb, 0xb5, 0x5f,
-	0xeb, 0xeb, 0x36, 0xe3, 0xab, 0x42, 0x5c, 0x8c, 0xbe, 0x1f, 0xa0, 0x60, 0x04, 0x51, 0xfb, 0xc7,
-	0x2c, 0x94, 0x7c, 0x7f, 0xf1, 0x73, 0x28, 0xf2, 0xb4, 0x63, 0x45, 0x9e, 0xd1, 0x3f, 0x20, 0xf2,
-	0xbb, 0x3c, 0xb4, 0xac, 0xe3, 0x24, 0xca, 0x3a, 0x1b, 0xe3, 0xab, 0x3a, 0xbb, 0x90, 0xf3, 0xc3,
-	0x2c, 0x4c, 0xfb, 0xac, 0xea, 0x26, 0xf7, 0x57, 0x60, 0xca, 0xa5, 0x7a, 0xb3, 0xae, 0x33, 0xe3,
-	0x40, 0x4c, 0x9f, 0xbc, 0xc7, 0x3d, 0x77, 0x7a, 0xb2, 0x38, 0x85, 0x51, 0x02, 0xc6, 0xf9, 0xd2,
-	0xae, 0x80, 0x67, 0xc7, 0xbc, 0x02, 0x9e, 0xbb, 0xc8, 0x15, 0x70, 0xa2, 0x43, 0x85, 0xf7, 0x68,
-	0xd7, 0xec, 0x52, 0xa7, 0xcf, 0x94, 0x6f, 0x73, 0xd1, 0xeb, 0xc3, 0xe2, 0xec, 0xc5, 0x10, 0x06,
-	0xa3, 0x98, 0xda, 0x3f, 0x67, 0x60, 0x32, 0x1c, 0xaf, 0x2b, 0x2f, 0x75, 0xb5, 0xe2, 0xa5, 0xae,
-	0x95, 0xb1, 0x97, 0xc3, 0x90, 0xe2, 0xd6, 0x0f, 0x0a, 0xe1, 0x6b, 0x89, 0x72, 0xd6, 0x3e, 0xcc,
-	0x9b, 0xa9, 0x15, 0x9e, 0x88, 0xb5, 0x09, 0x6e, 0xd4, 0x6d, 0x0e, 0xe5, 0xc4, 0x33, 0x50, 0x48,
-	0x1f, 0x4a, 0x87, 0xd4, 0x65, 0xa6, 0x41, 0xfd, 0xf7, 0xdb, 0xb8, 0xa4, 0xaf, 0x54, 0xc3, 0x31,
-	0xbd, 0xaf, 0x14, 0x60, 0xa0, 0x8a, 0xec, 0x43, 0x81, 0x36, 0xdb, 0xd4, 0xbf, 0x41, 0xff, 0xea,
-	0x58, 0xdf, 0x54, 0x84, 0xe3, 0xc9, 0x9f, 0x3c, 0x94, 0xd0, 0xc4, 0x83, 0xb2, 0xe5, 0x47, 0xd8,
-	0x6a, 0x1d, 0xd6, 0x47, 0xd6, 0x13, 0xc4, 0xea, 0xe1, 0x8d, 0xd6, 0xa0, 0x09, 0x43, 0x3d, 0xa4,
-	0x13, 0x7c, 0x2d, 0x52, 0xb8, 0x24, 0xe3, 0x71, 0xc6, 0x17, 0x23, 0x1e, 0x94, 0x1f, 0xea, 0x8c,
-	0xba, 0x5d, 0xdd, 0xed, 0x28, 0x1f, 0x78, 0xf4, 0x37, 0x7c, 0xe0, 0x23, 0x85, 0x6f, 0x18, 0x34,
-	0x61, 0xa8, 0x47, 0x7b, 0x94, 0x0b, 0xad, 0xd5, 0xe7, 0x5d, 0x6a, 0x7c, 0x25, 0x5e, 0x6a, 0x5c,
-	0x48, 0x96, 0x1a, 0x13, 0xf9, 0x8b, 0x8b, 0x17, 0x1b, 0x75, 0xa8, 0x58, 0xba, 0xc7, 0xf6, 0x7a,
-	0x4d, 0x9d, 0xa9, 0x24, 0x5e, 0x65, 0xf9, 0xe7, 0xce, 0x67, 0x4c, 0xb8, 0x79, 0x0a, 0x5d, 0xdc,
-	0xad, 0x10, 0x06, 0xa3, 0x98, 0xe4, 0x65, 0xa8, 0x1c, 0x8a, 0x0d, 0xb2, 0xca, 0xfd, 0x22, 0xb1,
-	0x4c, 0xa6, 0xa4, 0xc1, 0xbb, 0x1f, 0x36, 0x63, 0x94, 0x87, 0x8b, 0xc8, 0x83, 0x59, 0x8a, 0x14,
-	0x43, 0x91, 0x46, 0xd8, 0x8c, 0x51, 0x1e, 0x91, 0x51, 0x36, 0xed, 0x8e, 0x14, 0x98, 0x10, 0x02,
-	0x32, 0xa3, 0xec, 0x37, 0x62, 0x48, 0xe7, 0x5e, 0x65, 0xbf, 0xd9, 0x92, 0xbc, 0x25, 0xc1, 0x2b,
-	0xfc, 0xa9, 0xbd, 0xb5, 0x75, 0xc9, 0x1a, 0x50, 0xb5, 0xff, 0xcc, 0x00, 0x19, 0x2c, 0x8e, 0x93,
-	0x03, 0x28, 0xda, 0x22, 0xa4, 0x18, 0xfb, 0x13, 0xcd, 0x48, 0x64, 0x22, 0x97, 0xbc, 0x6a, 0x50,
-	0xf8, 0xc4, 0x86, 0x12, 0x3d, 0x62, 0xd4, 0xb5, 0x75, 0x4b, 0x79, 0x02, 0x97, 0xf3, 0x39, 0xa8,
-	0x78, 0xe1, 0x3b, 0x0a, 0x19, 0x03, 0x1d, 0xda, 0x4f, 0xb3, 0x50, 0x89, 0xf0, 0x3d, 0x2e, 0x3d,
-	0x2d, 0xee, 0x83, 0xca, 0xd8, 0x7a, 0xcf, 0xb5, 0xd4, 0x32, 0x8d, 0xdc, 0x07, 0x55, 0x24, 0xdc,
-	0xc2, 0x28, 0x1f, 0x59, 0x06, 0xe8, 0xea, 0x1e, 0xa3, 0xae, 0xb0, 0xec, 0x89, 0x5b, 0x98, 0xdb,
-	0x01, 0x05, 0x23, 0x5c, 0xe4, 0xa6, 0xca, 0xf7, 0xe4, 0xe3, 0x5f, 0x31, 0x0d, 0x49, 0xe6, 0x14,
-	0x2e, 0x21, 0x99, 0x43, 0xda, 0x30, 0xeb, 0xf7, 0xda, 0xa7, 0x2a, 0xb3, 0x73, 0x4e, 0x60, 0xe9,
-	0x1b, 0x27, 0x20, 0x70, 0x00, 0x54, 0xfb, 0xeb, 0x0c, 0x4c, 0xc5, 0x1c, 0x7c, 0xf2, 0x42, 0xf4,
-	0x6a, 0x47, 0x24, 0x2d, 0x1c, 0xbb, 0x91, 0xf1, 0x12, 0x14, 0xe5, 0x00, 0xa9, 0x81, 0x0f, 0xcc,
-	0x88, 0x1c, 0x42, 0x54, 0x54, 0x6e, 0x10, 0x54, 0xee, 0x28, 0x69, 0x10, 0x54, 0x72, 0x09, 0x7d,
-	0x3a, 0xf9, 0x22, 0x0f, 0x59, 0x64, 0xef, 0xd4, 0x48, 0x07, 0xc7, 0x9a, 0xff, 0x1e, 0x18, 0x70,
-	0x68, 0xdf, 0xcf, 0x83, 0xfc, 0x4e, 0x9c, 0xcb, 0x35, 0x4d, 0x4f, 0x96, 0x02, 0x32, 0xa2, 0x14,
-	0x10, 0xc8, 0xad, 0xa9, 0x76, 0x0c, 0x38, 0xc8, 0xb3, 0x90, 0xeb, 0x9a, 0xb6, 0xca, 0x72, 0x89,
-	0x84, 0xf2, 0xb6, 0x69, 0x23, 0x6f, 0x13, 0x24, 0xfd, 0x48, 0x5d, 0x7f, 0x96, 0x24, 0xfd, 0x08,
-	0x79, 0x1b, 0xf7, 0xf5, 0x2c, 0xc7, 0xe9, 0xec, 0xeb, 0x46, 0xc7, 0x4f, 0x16, 0xe7, 0xc5, 0xee,
-	0x15, 0xbe, 0xde, 0x56, 0x9c, 0x84, 0x49, 0x5e, 0x2e, 0x6e, 0x38, 0x8e, 0xd5, 0x74, 0x1e, 0xda,
-	0xbe, 0x78, 0x21, 0x14, 0x5f, 0x8d, 0x93, 0x30, 0xc9, 0x4b, 0xf6, 0xe0, 0x99, 0x0f, 0xa9, 0xeb,
-	0xa8, 0x11, 0x6b, 0x58, 0x94, 0xf6, 0x7c, 0x18, 0x69, 0xa0, 0xbe, 0x70, 0x7a, 0xb2, 0xf8, 0xcc,
-	0xbb, 0xe9, 0x2c, 0x38, 0x4c, 0x96, 0xc3, 0x32, 0xdd, 0x6d, 0x53, 0xb6, 0xe3, 0x3a, 0x3c, 0x94,
-	0x31, 0xed, 0xb6, 0x0f, 0x3b, 0x11, 0xc2, 0xee, 0xa6, 0xb3, 0xe0, 0x30, 0x59, 0xb2, 0x0a, 0x73,
-	0x92, 0x14, 0x71, 0x61, 0x95, 0xad, 0x13, 0x57, 0x1c, 0x76, 0x93, 0x44, 0x1c, 0xe4, 0xe7, 0xde,
-	0xb1, 0x9f, 0x73, 0xdc, 0xa1, 0xae, 0x98, 0x68, 0x71, 0xe7, 0x56, 0x79, 0xc7, 0x98, 0xa0, 0xe1,
-	0x00, 0xb7, 0xf6, 0xe7, 0x59, 0x10, 0x7f, 0xc0, 0x42, 0x1e, 0x40, 0xce, 0x72, 0xda, 0xca, 0x5c,
-	0x8e, 0x5e, 0x80, 0xd8, 0x72, 0xda, 0x72, 0x51, 0x6c, 0x39, 0x6d, 0xe4, 0x88, 0xc4, 0x80, 0x42,
-	0x47, 0x6f, 0x75, 0x74, 0x65, 0x1d, 0x47, 0xf7, 0x07, 0x82, 0xb2, 0x94, 0xfa, 0x9c, 0x92, 0x3f,
-	0xa2, 0xc4, 0x26, 0x06, 0x14, 0xfb, 0x4d, 0xf1, 0xbf, 0x34, 0xe3, 0xfe, 0xf5, 0xcd, 0xde, 0x9a,
-	0x50, 0x21, 0x4c, 0xbd, 0xfc, 0x8d, 0x0a, 0x5a, 0xfb, 0xa7, 0x2c, 0xa8, 0x7f, 0xc3, 0x21, 0x7d,
-	0x28, 0xb7, 0xfd, 0xcf, 0x17, 0xd5, 0x98, 0xbd, 0x31, 0xc6, 0x8d, 0xf9, 0xd8, 0x87, 0x90, 0xf2,
-	0x5c, 0x0c, 0x1a, 0x31, 0xd4, 0x44, 0x68, 0x7c, 0x2c, 0xd7, 0xc6, 0x1c, 0x4b, 0xa9, 0x6e, 0x70,
-	0x34, 0x75, 0xc8, 0x1f, 0x30, 0xd6, 0x53, 0x63, 0x39, 0xfa, 0xf7, 0xc5, 0xe1, 0xfd, 0x50, 0x99,
-	0xd7, 0xe7, 0xcf, 0x28, 0xa0, 0xb5, 0x2e, 0x28, 0x57, 0x8a, 0x18, 0xb1, 0x4f, 0xa9, 0x65, 0xbd,
-	0x66, 0xe9, 0x7c, 0x0e, 0x4e, 0xf0, 0xc1, 0x6d, 0xe4, 0x5b, 0xa6, 0xd4, 0x6f, 0xa6, 0xb5, 0x7f,
-	0xcd, 0x42, 0x6e, 0x77, 0xab, 0x21, 0xaf, 0xe6, 0x8b, 0xe4, 0x1b, 0x6d, 0x74, 0xcc, 0xde, 0x7d,
-	0xea, 0x9a, 0xad, 0x63, 0x65, 0x0f, 0x23, 0x57, 0xf3, 0x93, 0x1c, 0x98, 0x22, 0x45, 0xde, 0x83,
-	0x49, 0x43, 0x5f, 0xa5, 0x2e, 0x93, 0xc7, 0xca, 0xc5, 0xca, 0x13, 0xa2, 0x3a, 0xbe, 0xba, 0x12,
-	0x8a, 0x63, 0x0c, 0x8c, 0xec, 0x01, 0x18, 0x21, 0x74, 0xee, 0x22, 0xd0, 0xf2, 0xdb, 0xf1, 0x10,
-	0x38, 0x02, 0x44, 0x10, 0xca, 0x1d, 0xce, 0x2a, 0x50, 0xf3, 0x17, 0x41, 0x15, 0x8b, 0xf2, 0xae,
-	0x2f, 0x8b, 0x21, 0x0c, 0xdf, 0x16, 0xb9, 0xbd, 0xb5, 0x75, 0xe2, 0x40, 0x39, 0xb8, 0x84, 0xa5,
-	0xf6, 0x44, 0x7d, 0xfc, 0xcc, 0xbc, 0x54, 0x1c, 0x3c, 0x62, 0xa8, 0x83, 0x1c, 0xc0, 0xc4, 0x7e,
-	0xdf, 0xb4, 0x98, 0x69, 0x8f, 0x5d, 0x7d, 0xf7, 0xbf, 0x7b, 0x56, 0x35, 0x60, 0x89, 0x8a, 0x3e,
-	0x3c, 0x69, 0xc3, 0x44, 0x5b, 0xde, 0xc2, 0x56, 0x53, 0xf1, 0xfa, 0xe8, 0x9b, 0x5d, 0xe2, 0x48,
-	0x45, 0xea, 0x01, 0x7d, 0x74, 0xed, 0x1b, 0xa0, 0x8c, 0x0e, 0x0f, 0xa5, 0xae, 0x62, 0x34, 0x83,
-	0x50, 0x2a, 0x6d, 0x44, 0xb5, 0x7f, 0xc8, 0x42, 0x51, 0xfd, 0xdd, 0xd8, 0xd5, 0xe7, 0xcf, 0x68,
-	0x2c, 0x7f, 0xb6, 0x3a, 0xe6, 0x1f, 0xf0, 0x0c, 0xcd, 0x9e, 0x75, 0x13, 0xd9, 0xb3, 0x71, 0xff,
-	0xe9, 0xe7, 0x31, 0xb9, 0xb3, 0x1f, 0x65, 0x60, 0x5a, 0x32, 0x6e, 0xda, 0x1e, 0xd3, 0x6d, 0x43,
-	0xfc, 0x2f, 0x9b, 0x0c, 0x9e, 0xc6, 0x8e, 0x46, 0x55, 0x22, 0x43, 0x1c, 0x4e, 0xf2, 0x37, 0x2a,
-	0x68, 0xee, 0xdf, 0x1d, 0x38, 0x1e, 0x13, 0xff, 0x23, 0x90, 0x8d, 0xfb, 0x85, 0x6f, 0xa8, 0x76,
-	0x0c, 0x38, 0x92, 0x0e, 0x67, 0x61, 0xb8, 0xc3, 0xa9, 0xfd, 0x45, 0x06, 0x26, 0xa3, 0xff, 0x71,
-	0x34, 0x7a, 0x2a, 0x30, 0x91, 0x89, 0xcb, 0x5e, 0x41, 0x26, 0xee, 0x93, 0x0c, 0x80, 0xdf, 0xd9,
-	0x2b, 0xcf, 0xc3, 0x35, 0xe3, 0x79, 0xb8, 0xb1, 0xa7, 0x35, 0x3d, 0x0b, 0xf7, 0x37, 0x79, 0xff,
-	0x95, 0x44, 0x0e, 0xee, 0xa3, 0x0c, 0x4c, 0xeb, 0xb1, 0xbc, 0x96, 0x7a, 0xb3, 0x4b, 0x4b, 0x93,
-	0x05, 0xff, 0x09, 0x15, 0x6f, 0xc7, 0x84, 0x5a, 0x72, 0x1b, 0x26, 0x7b, 0x2a, 0xbb, 0x71, 0x2f,
-	0x5c, 0x75, 0x41, 0xad, 0x6e, 0x27, 0x42, 0xc3, 0x18, 0xe7, 0x63, 0xf2, 0x88, 0xb9, 0x4b, 0xc9,
-	0x23, 0x46, 0x8b, 0xf5, 0xf9, 0x33, 0x8b, 0xf5, 0x36, 0x94, 0x5b, 0xae, 0xd3, 0x15, 0xa9, 0x3a,
-	0xf5, 0xcf, 0x41, 0x63, 0xa6, 0xff, 0x02, 0x23, 0xbb, 0xee, 0xe3, 0x62, 0xa8, 0x82, 0x1f, 0x5b,
-	0xcc, 0x91, 0xda, 0x8a, 0x97, 0xa1, 0x2d, 0xd8, 0xba, 0xbb, 0x12, 0x15, 0x7d, 0x78, 0xed, 0x5f,
-	0xb2, 0xfe, 0xd6, 0x6d, 0x24, 0x6e, 0xc6, 0x67, 0x86, 0xdc, 0x8c, 0x57, 0xdf, 0x5d, 0x45, 0x93,
-	0x55, 0x2f, 0x41, 0xd1, 0xa5, 0xba, 0xe7, 0xd8, 0xea, 0x0b, 0xc6, 0xc0, 0xf0, 0xa1, 0x68, 0x45,
-	0x45, 0x8d, 0x26, 0xb5, 0xb2, 0x8f, 0x49, 0x6a, 0x7d, 0x31, 0x32, 0x37, 0x32, 0x99, 0x1f, 0x6c,
-	0xb3, 0x94, 0xf9, 0x11, 0x11, 0xaf, 0xaa, 0x33, 0x17, 0x92, 0x11, 0xaf, 0xaa, 0x05, 0x07, 0x1c,
-	0xa4, 0x09, 0x93, 0x96, 0xee, 0x31, 0x11, 0xdd, 0x34, 0x57, 0xd8, 0x08, 0x19, 0xb3, 0x60, 0x05,
-	0x6f, 0x45, 0x70, 0x30, 0x86, 0xaa, 0x7d, 0x37, 0x03, 0x61, 0x32, 0xf2, 0x82, 0xb1, 0xf5, 0xdb,
-	0x50, 0xea, 0xea, 0x47, 0x6b, 0xd4, 0xd2, 0x8f, 0xc7, 0xf9, 0x33, 0x93, 0x6d, 0x85, 0x81, 0x01,
-	0x9a, 0xe6, 0x80, 0xfa, 0x94, 0x8b, 0x07, 0x0a, 0x2d, 0xf3, 0x48, 0x75, 0x67, 0x9c, 0x40, 0x21,
-	0xf2, 0xef, 0x39, 0x32, 0x50, 0x10, 0x0d, 0x28, 0xd1, 0xeb, 0xb5, 0x8f, 0x3f, 0x5b, 0x78, 0xea,
-	0x93, 0xcf, 0x16, 0x9e, 0xfa, 0xf4, 0xb3, 0x85, 0xa7, 0x7e, 0xf7, 0x74, 0x21, 0xf3, 0xf1, 0xe9,
-	0x42, 0xe6, 0x93, 0xd3, 0x85, 0xcc, 0xa7, 0xa7, 0x0b, 0x99, 0x7f, 0x3b, 0x5d, 0xc8, 0x7c, 0xe7,
-	0xdf, 0x17, 0x9e, 0x7a, 0xb7, 0xe4, 0xa3, 0xfd, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8d, 0xb9,
-	0x21, 0xc9, 0x81, 0x56, 0x00, 0x00,
+	// 4957 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x5c, 0x5b, 0x6c, 0x23, 0xd7,
+	0x79, 0x36, 0xaf, 0x22, 0x7f, 0xea, 0x7a, 0xf6, 0x62, 0xae, 0x62, 0x8b, 0x5b, 0x1a, 0x36, 0xb6,
+	0x6d, 0x42, 0xd5, 0xaa, 0xd3, 0x6c, 0xda, 0x3a, 0xb6, 0x28, 0xad, 0x64, 0x79, 0xa5, 0x35, 0xf3,
+	0x53, 0xda, 0xf5, 0xa5, 0xad, 0x3b, 0x1a, 0x1e, 0x52, 0x63, 0x0e, 0x67, 0x98, 0x99, 0x43, 0xed,
+	0xca, 0x68, 0xd0, 0x02, 0x79, 0x70, 0x8a, 0xa6, 0x48, 0x80, 0xbc, 0x14, 0x08, 0x12, 0xf4, 0x21,
+	0x40, 0xd1, 0xa2, 0x01, 0x8a, 0x02, 0x05, 0x8a, 0x16, 0x05, 0xfa, 0x54, 0xb8, 0x2f, 0x81, 0x1f,
+	0x0a, 0xd4, 0x05, 0x02, 0xa1, 0x56, 0x81, 0x3e, 0x16, 0x29, 0xf2, 0xb6, 0x28, 0xd0, 0xe2, 0x5c,
+	0xe6, 0xca, 0xa1, 0x56, 0x22, 0x25, 0xf7, 0x21, 0x7e, 0xe3, 0x9c, 0xff, 0xff, 0xbf, 0xff, 0xcc,
+	0xb9, 0xfc, 0xe7, 0xbf, 0x9c, 0x21, 0x6c, 0x76, 0x0c, 0x76, 0x30, 0xd8, 0xaf, 0xe9, 0x76, 0x6f,
+	0xd9, 0x1a, 0xf4, 0xb4, 0xbe, 0x63, 0xbf, 0x27, 0x7e, 0xb4, 0x4d, 0xfb, 0xe1, 0x72, 0xbf, 0xdb,
+	0x59, 0xd6, 0xfa, 0x86, 0x1b, 0xb4, 0x1c, 0xbe, 0xa8, 0x99, 0xfd, 0x03, 0xed, 0xc5, 0xe5, 0x0e,
+	0xb5, 0xa8, 0xa3, 0x31, 0xda, 0xaa, 0xf5, 0x1d, 0x9b, 0xd9, 0xe4, 0x4b, 0x01, 0x50, 0xcd, 0x03,
+	0xaa, 0x79, 0x62, 0xb5, 0x7e, 0xb7, 0x53, 0xe3, 0x40, 0x41, 0x8b, 0x07, 0xb4, 0xf8, 0x85, 0x50,
+	0x0f, 0x3a, 0x76, 0xc7, 0x5e, 0x16, 0x78, 0xfb, 0x83, 0xb6, 0x78, 0x12, 0x0f, 0xe2, 0x97, 0xd4,
+	0xb3, 0x58, 0xed, 0xde, 0x76, 0x6b, 0x86, 0xcd, 0xbb, 0xb5, 0xac, 0xdb, 0x0e, 0x5d, 0x3e, 0x1c,
+	0xea, 0xcb, 0xe2, 0x4b, 0x01, 0x4f, 0x4f, 0xd3, 0x0f, 0x0c, 0x8b, 0x3a, 0x47, 0xde, 0xbb, 0x2c,
+	0x3b, 0xd4, 0xb5, 0x07, 0x8e, 0x4e, 0xcf, 0x25, 0xe5, 0x2e, 0xf7, 0x28, 0xd3, 0x92, 0x74, 0x2d,
+	0x8f, 0x92, 0x72, 0x06, 0x16, 0x33, 0x7a, 0xc3, 0x6a, 0x7e, 0xed, 0x49, 0x02, 0xae, 0x7e, 0x40,
+	0x7b, 0x5a, 0x5c, 0xae, 0xfa, 0xe3, 0x19, 0x98, 0x5d, 0xdd, 0x77, 0x99, 0xa3, 0xe9, 0xec, 0x3e,
+	0x75, 0x18, 0x7d, 0x44, 0x6e, 0x42, 0xd6, 0xd2, 0x7a, 0xb4, 0x9c, 0xba, 0x99, 0xba, 0x55, 0xac,
+	0x4f, 0x7f, 0x78, 0x5c, 0x79, 0xea, 0xe4, 0xb8, 0x92, 0xbd, 0xa7, 0xf5, 0x28, 0x0a, 0x0a, 0xd1,
+	0x21, 0x2f, 0xdf, 0xb6, 0x9c, 0xb9, 0x99, 0xba, 0x55, 0x5a, 0x79, 0xa5, 0x36, 0xe6, 0x34, 0xd5,
+	0x9a, 0x02, 0xa6, 0x0e, 0x27, 0xc7, 0x95, 0xbc, 0xfc, 0x8d, 0x0a, 0x9a, 0xbc, 0x03, 0x59, 0xd7,
+	0xb0, 0xba, 0xe5, 0xac, 0x50, 0xf1, 0xf2, 0xf8, 0x2a, 0x0c, 0xab, 0x5b, 0x2f, 0xf0, 0x37, 0xe0,
+	0xbf, 0x50, 0x80, 0x92, 0x6f, 0xa7, 0x60, 0x41, 0xb7, 0x2d, 0xa6, 0xf1, 0x81, 0xda, 0xa5, 0xbd,
+	0xbe, 0xa9, 0x31, 0x5a, 0xce, 0x09, 0x55, 0xaf, 0x8f, 0xad, 0x6a, 0x2d, 0x8e, 0x58, 0xbf, 0x76,
+	0x72, 0x5c, 0x59, 0x18, 0x6a, 0xc6, 0x61, 0xdd, 0xe4, 0x01, 0x64, 0x06, 0xad, 0x76, 0x39, 0x2f,
+	0xba, 0xf0, 0x9b, 0x63, 0x77, 0x61, 0x6f, 0x7d, 0xa3, 0x3e, 0x75, 0x72, 0x5c, 0xc9, 0xec, 0xad,
+	0x6f, 0x20, 0x47, 0x24, 0x5d, 0x28, 0xf0, 0x55, 0xd6, 0xd2, 0x98, 0x56, 0x9e, 0x12, 0xe8, 0xab,
+	0x63, 0xa3, 0xef, 0x28, 0xa0, 0xfa, 0xf4, 0xc9, 0x71, 0xa5, 0xe0, 0x3d, 0xa1, 0xaf, 0x80, 0x7c,
+	0x37, 0x05, 0xd3, 0x96, 0xdd, 0xa2, 0x4d, 0x6a, 0x52, 0x9d, 0xd9, 0x4e, 0xb9, 0x70, 0x33, 0x73,
+	0xab, 0xb4, 0xf2, 0xd6, 0xd8, 0x1a, 0xa3, 0x6b, 0xb3, 0x76, 0x2f, 0x84, 0x7d, 0xc7, 0x62, 0xce,
+	0x51, 0xfd, 0xaa, 0x5a, 0x9f, 0xd3, 0x61, 0x12, 0x46, 0x3a, 0x41, 0xf6, 0xa0, 0xc4, 0x6c, 0x93,
+	0xaf, 0x7b, 0xc3, 0xb6, 0xdc, 0x72, 0x51, 0xf4, 0x69, 0xa9, 0x26, 0xb7, 0x0c, 0xd7, 0x5c, 0xe3,
+	0x7b, 0xbe, 0x76, 0xf8, 0x62, 0x6d, 0xd7, 0x67, 0xab, 0x5f, 0x51, 0xc0, 0xa5, 0xa0, 0xcd, 0xc5,
+	0x30, 0x0e, 0xa1, 0x30, 0xe7, 0x52, 0x7d, 0xe0, 0x18, 0xec, 0x88, 0x4f, 0x31, 0x7d, 0xc4, 0xca,
+	0x20, 0x06, 0xf8, 0x85, 0x24, 0xe8, 0x86, 0xdd, 0x6a, 0x46, 0xb9, 0xeb, 0x57, 0x4e, 0x8e, 0x2b,
+	0x73, 0xb1, 0x46, 0x8c, 0x63, 0x12, 0x0b, 0xe6, 0x8d, 0x9e, 0xd6, 0xa1, 0x8d, 0x81, 0x69, 0x36,
+	0xa9, 0xee, 0x50, 0xe6, 0x96, 0x4b, 0xe2, 0x15, 0x6e, 0x25, 0xe9, 0xd9, 0xb6, 0x75, 0xcd, 0x7c,
+	0x63, 0xff, 0x3d, 0xaa, 0x33, 0xa4, 0x6d, 0xea, 0x50, 0x4b, 0xa7, 0xf5, 0xb2, 0x7a, 0x99, 0xf9,
+	0xad, 0x18, 0x12, 0x0e, 0x61, 0x93, 0x4d, 0x58, 0xe8, 0x3b, 0x86, 0x2d, 0xba, 0x60, 0x6a, 0xae,
+	0xcb, 0x37, 0x7e, 0x79, 0x5a, 0x18, 0x83, 0x1b, 0x0a, 0x66, 0xa1, 0x11, 0x67, 0xc0, 0x61, 0x19,
+	0x72, 0x0b, 0x0a, 0x5e, 0x63, 0x79, 0xe6, 0x66, 0xea, 0x56, 0x4e, 0x2e, 0x1b, 0x4f, 0x16, 0x7d,
+	0x2a, 0xd9, 0x80, 0x82, 0xd6, 0x6e, 0x1b, 0x16, 0xe7, 0x9c, 0x15, 0x43, 0xf8, 0x4c, 0xd2, 0xab,
+	0xad, 0x2a, 0x1e, 0x89, 0xe3, 0x3d, 0xa1, 0x2f, 0x4b, 0x5e, 0x07, 0xe2, 0x52, 0xe7, 0xd0, 0xd0,
+	0xe9, 0xaa, 0xae, 0xdb, 0x03, 0x8b, 0x89, 0xbe, 0xcf, 0x89, 0xbe, 0x2f, 0xaa, 0xbe, 0x93, 0xe6,
+	0x10, 0x07, 0x26, 0x48, 0x91, 0x3b, 0x30, 0x75, 0x68, 0x9b, 0x83, 0x1e, 0x75, 0xcb, 0xf3, 0x62,
+	0xb4, 0x17, 0x93, 0xba, 0x74, 0x5f, 0xb0, 0xd4, 0xe7, 0x14, 0xf8, 0x94, 0x7c, 0x76, 0xd1, 0x93,
+	0x25, 0x06, 0xe4, 0x4d, 0xa3, 0x67, 0x30, 0xb7, 0xbc, 0x20, 0x5e, 0xec, 0xce, 0xd8, 0x5b, 0x41,
+	0x6e, 0x81, 0x6d, 0x01, 0x26, 0x2d, 0xa6, 0xfc, 0x8d, 0x4a, 0x01, 0xd1, 0x21, 0xe7, 0xea, 0x9a,
+	0x49, 0xcb, 0x44, 0x68, 0xfa, 0xca, 0xf8, 0x26, 0x93, 0xa3, 0xd4, 0x67, 0xd4, 0x3b, 0xe5, 0xc4,
+	0x23, 0x4a, 0x6c, 0xf2, 0xdb, 0x30, 0xcb, 0xc7, 0xda, 0xb7, 0x69, 0x6e, 0xf9, 0x8a, 0x18, 0x9d,
+	0x67, 0x93, 0x46, 0xc7, 0xe7, 0xaa, 0x5f, 0x57, 0x60, 0xb3, 0x5b, 0x11, 0x61, 0x8c, 0x81, 0x2d,
+	0xbe, 0x02, 0x0b, 0x43, 0x7b, 0x9c, 0xcc, 0x43, 0xa6, 0x4b, 0x8f, 0xe4, 0x81, 0x84, 0xfc, 0x27,
+	0xb9, 0x0a, 0xb9, 0x43, 0xcd, 0x1c, 0xd0, 0x72, 0x5a, 0xb4, 0xc9, 0x87, 0x5f, 0x4f, 0xdf, 0x4e,
+	0x55, 0x1f, 0xc0, 0xcc, 0xea, 0x80, 0x1d, 0xd8, 0x8e, 0xf1, 0xbe, 0xd8, 0xa6, 0x64, 0x03, 0x72,
+	0xcc, 0xee, 0x52, 0x4b, 0x88, 0x97, 0x56, 0x9e, 0x4f, 0xea, 0xa7, 0x5c, 0xfa, 0x77, 0xe9, 0x91,
+	0xa7, 0xb7, 0x5e, 0xe4, 0x2f, 0xbe, 0xcb, 0xe5, 0x50, 0x8a, 0x57, 0xdf, 0x86, 0x7c, 0x7d, 0xd0,
+	0x6e, 0x53, 0xe7, 0x0c, 0x07, 0x64, 0x0d, 0xb2, 0xec, 0xa8, 0xaf, 0x7a, 0xe7, 0xaf, 0xbc, 0xec,
+	0xee, 0x51, 0x9f, 0x3e, 0x3e, 0xae, 0x80, 0xc4, 0xe1, 0x4f, 0x28, 0xf8, 0xaa, 0x3f, 0x4b, 0xc1,
+	0x15, 0xd9, 0xa8, 0x16, 0xe7, 0x9a, 0x6d, 0xb5, 0x8d, 0x0e, 0xa1, 0x90, 0x73, 0x68, 0xcb, 0x70,
+	0x55, 0xdf, 0xd7, 0xc7, 0x9e, 0x51, 0xe4, 0x28, 0x12, 0x54, 0xbe, 0x9a, 0x68, 0x40, 0x89, 0x4e,
+	0x06, 0x50, 0x7c, 0x8f, 0x32, 0x97, 0x39, 0x54, 0xeb, 0x89, 0x3e, 0x97, 0x56, 0x5e, 0x1b, 0x5b,
+	0xd5, 0xeb, 0x94, 0x35, 0x05, 0x92, 0x52, 0x37, 0x73, 0x72, 0x5c, 0x29, 0xfa, 0x8d, 0x18, 0x68,
+	0xaa, 0xfe, 0x67, 0x1a, 0x8a, 0xfe, 0xd4, 0x93, 0xe7, 0x20, 0x27, 0x4c, 0x91, 0x1a, 0x56, 0x7f,
+	0xf5, 0x09, 0x8b, 0x85, 0x92, 0x46, 0x9e, 0x87, 0x29, 0xdd, 0xee, 0xf5, 0x34, 0xab, 0x55, 0x4e,
+	0xdf, 0xcc, 0xdc, 0x2a, 0xd6, 0x4b, 0x7c, 0xd3, 0xad, 0xc9, 0x26, 0xf4, 0x68, 0xe4, 0x19, 0xc8,
+	0x6a, 0x4e, 0xc7, 0x2d, 0x67, 0x04, 0x8f, 0x38, 0xfc, 0x57, 0x9d, 0x8e, 0x8b, 0xa2, 0x95, 0x7c,
+	0x19, 0x32, 0xd4, 0x3a, 0x2c, 0x67, 0x47, 0xef, 0xea, 0x3b, 0xd6, 0xe1, 0x7d, 0xcd, 0xa9, 0x97,
+	0x54, 0x1f, 0x32, 0x77, 0xac, 0x43, 0xe4, 0x32, 0xe4, 0x2d, 0x98, 0x96, 0x1b, 0x7b, 0x87, 0xdb,
+	0x09, 0xb7, 0x9c, 0x13, 0x18, 0x95, 0xd1, 0x96, 0x41, 0xf0, 0x05, 0x87, 0x54, 0xa8, 0xd1, 0xc5,
+	0x08, 0x14, 0x79, 0x0b, 0x8a, 0x9e, 0x13, 0xe9, 0x2a, 0x37, 0x20, 0xd1, 0xbe, 0xa3, 0x62, 0x42,
+	0xfa, 0xb5, 0x81, 0xe1, 0xd0, 0x1e, 0xb5, 0x98, 0x5b, 0x5f, 0x50, 0x0a, 0x8a, 0x1e, 0xd5, 0xc5,
+	0x00, 0xad, 0xfa, 0xdf, 0x69, 0x18, 0x76, 0x42, 0xa2, 0x0a, 0x53, 0x17, 0xa9, 0x90, 0xec, 0xc3,
+	0x9c, 0x7f, 0xac, 0x34, 0x6c, 0xd3, 0xd0, 0x8f, 0xd4, 0x56, 0xb8, 0xad, 0xc4, 0xe6, 0xb6, 0xa2,
+	0xe4, 0xc7, 0xc7, 0x95, 0x67, 0x87, 0x5d, 0xf0, 0x5a, 0xc0, 0x80, 0x71, 0x40, 0xae, 0x23, 0x7e,
+	0xfa, 0x4a, 0x6f, 0xf4, 0xb9, 0x11, 0x3b, 0x7c, 0x8c, 0xa3, 0x77, 0xfc, 0x95, 0x52, 0xfd, 0x49,
+	0x1a, 0xb2, 0x77, 0x5a, 0x1d, 0xca, 0xad, 0x45, 0xdb, 0xb1, 0x7b, 0x71, 0x6b, 0xb1, 0xe1, 0xd8,
+	0x3d, 0x14, 0x14, 0xb2, 0x08, 0x69, 0x66, 0xab, 0x01, 0x02, 0x45, 0x4f, 0xef, 0xda, 0x98, 0x66,
+	0x36, 0x79, 0x1f, 0x40, 0xb7, 0xad, 0x96, 0x21, 0x3d, 0x97, 0xcc, 0x84, 0x0e, 0xea, 0x86, 0xed,
+	0x3c, 0xd4, 0x9c, 0xd6, 0x9a, 0x8f, 0x58, 0x9f, 0x3d, 0x39, 0xae, 0x40, 0xf0, 0x8c, 0x21, 0x6d,
+	0xa4, 0xe3, 0x1f, 0x5d, 0xd2, 0x07, 0x5f, 0x1b, 0x5b, 0x2f, 0x1f, 0x88, 0x53, 0x0e, 0xae, 0x17,
+	0xa1, 0xd4, 0xd7, 0x1c, 0xcd, 0x34, 0xa9, 0x69, 0xb8, 0x3d, 0xe1, 0x86, 0xe7, 0xea, 0x73, 0xdc,
+	0xf7, 0x6a, 0x04, 0xcd, 0x18, 0xe6, 0xa9, 0xfe, 0x71, 0x0a, 0x20, 0x40, 0x25, 0x2f, 0xc3, 0xdc,
+	0xbe, 0xb0, 0x9f, 0x3b, 0xda, 0xa3, 0x6d, 0x6a, 0x75, 0xd8, 0x81, 0x18, 0xef, 0xac, 0x9c, 0xe7,
+	0x7a, 0x94, 0x84, 0x71, 0x5e, 0xf2, 0x2a, 0xcc, 0xcb, 0xa6, 0x3d, 0x57, 0x53, 0x98, 0x62, 0x3e,
+	0x66, 0xea, 0x57, 0xb9, 0xd3, 0x54, 0x8f, 0xd1, 0x70, 0x88, 0xbb, 0xaa, 0x41, 0x69, 0xc3, 0x78,
+	0x44, 0x5b, 0x0f, 0x0c, 0xab, 0x65, 0x3f, 0x24, 0x08, 0x79, 0x33, 0xe8, 0x46, 0x69, 0xa5, 0x16,
+	0x5a, 0x3b, 0x7e, 0x7c, 0x16, 0x8c, 0x18, 0xf7, 0x9f, 0xf9, 0x6a, 0x5a, 0x1f, 0x28, 0xe7, 0x53,
+	0x8e, 0x92, 0xec, 0xad, 0x42, 0xaa, 0xbe, 0x04, 0x0b, 0x43, 0xf3, 0x47, 0x2a, 0x90, 0xeb, 0xd2,
+	0xa3, 0x2d, 0x7e, 0xba, 0x71, 0x53, 0x27, 0x6c, 0xfb, 0x5d, 0xde, 0x80, 0xb2, 0xbd, 0xfa, 0x3f,
+	0x29, 0x28, 0x6c, 0x0c, 0x2c, 0x5d, 0x9c, 0x85, 0x4f, 0x3e, 0xb9, 0x3c, 0xcb, 0x99, 0x4e, 0xb4,
+	0x9c, 0x03, 0xc8, 0x77, 0x1f, 0xfa, 0x96, 0xb5, 0xb4, 0xb2, 0x33, 0xfe, 0x4a, 0x54, 0x5d, 0xaa,
+	0xdd, 0x15, 0x78, 0xd2, 0x97, 0x9f, 0x55, 0x1d, 0xca, 0xdf, 0x7d, 0x20, 0x94, 0x2a, 0x65, 0x8b,
+	0x5f, 0x86, 0x52, 0x88, 0xed, 0x5c, 0xee, 0xc0, 0x8f, 0x52, 0x30, 0xb7, 0x29, 0x63, 0x5e, 0xdb,
+	0x91, 0x11, 0x26, 0xb9, 0x01, 0x19, 0xa7, 0x3f, 0x10, 0xf2, 0x19, 0x19, 0x2c, 0x61, 0x63, 0x0f,
+	0x79, 0x1b, 0x79, 0x13, 0x0a, 0x2d, 0x35, 0x07, 0xea, 0x20, 0x3c, 0xef, 0xcc, 0x09, 0xd7, 0xd4,
+	0x7b, 0x42, 0x1f, 0x8d, 0x9f, 0x5c, 0x3d, 0xb7, 0xd3, 0x34, 0xde, 0x97, 0x41, 0x73, 0x4e, 0x9e,
+	0x5c, 0x3b, 0xb2, 0x09, 0x3d, 0x5a, 0xf5, 0xdb, 0x69, 0xb8, 0xbe, 0x49, 0xd9, 0xba, 0x46, 0x7b,
+	0xb6, 0xb5, 0x4e, 0xfb, 0xa6, 0x7d, 0xc4, 0x0d, 0x2e, 0xd2, 0xaf, 0x91, 0x57, 0x01, 0x0c, 0x77,
+	0xbf, 0x79, 0xa8, 0x73, 0xc7, 0x41, 0x4d, 0xe1, 0x4d, 0x35, 0x62, 0xb0, 0xd5, 0xac, 0x2b, 0xca,
+	0xe3, 0xc8, 0x13, 0x86, 0x64, 0x82, 0x23, 0x36, 0x7d, 0xca, 0x11, 0xdb, 0x04, 0xe8, 0x07, 0x66,
+	0x3b, 0x23, 0x38, 0x7f, 0xd5, 0x53, 0x73, 0x1e, 0x8b, 0x1d, 0x82, 0x99, 0xc4, 0x90, 0xfe, 0x5d,
+	0x06, 0x16, 0x37, 0x29, 0xf3, 0x3d, 0x08, 0xe5, 0x21, 0x35, 0xfb, 0x54, 0xe7, 0xa3, 0xf2, 0x41,
+	0x0a, 0xf2, 0xa6, 0xb6, 0x4f, 0x4d, 0x57, 0x6c, 0x81, 0xd2, 0xca, 0xbb, 0x63, 0xaf, 0xc9, 0xd1,
+	0x5a, 0x6a, 0xdb, 0x42, 0x43, 0x6c, 0x95, 0xca, 0x46, 0x54, 0xea, 0xc9, 0x17, 0xa1, 0xa4, 0x9b,
+	0x03, 0x97, 0x51, 0xa7, 0x61, 0x3b, 0xd2, 0x7e, 0xe4, 0x82, 0x28, 0x72, 0x2d, 0x20, 0x61, 0x98,
+	0x8f, 0xac, 0x00, 0xe8, 0xa6, 0x41, 0x2d, 0x26, 0xa4, 0xe4, 0xda, 0x20, 0xde, 0x78, 0xaf, 0xf9,
+	0x14, 0x0c, 0x71, 0x71, 0x55, 0x3d, 0xdb, 0x32, 0x98, 0x2d, 0x55, 0x65, 0xa3, 0xaa, 0x76, 0x02,
+	0x12, 0x86, 0xf9, 0x84, 0x18, 0x65, 0x8e, 0xa1, 0xbb, 0x42, 0x2c, 0x17, 0x13, 0x0b, 0x48, 0x18,
+	0xe6, 0xe3, 0xdb, 0x2f, 0xf4, 0xfe, 0xe7, 0xda, 0x7e, 0x7f, 0x5f, 0x80, 0xa5, 0xc8, 0xb0, 0x32,
+	0x8d, 0xd1, 0xf6, 0xc0, 0x6c, 0x52, 0xe6, 0x4d, 0xe0, 0x17, 0xa1, 0xa4, 0xa2, 0xaf, 0x7b, 0x81,
+	0x69, 0xf2, 0x3b, 0xd5, 0x0c, 0x48, 0x18, 0xe6, 0x23, 0x7f, 0x14, 0xcc, 0x7b, 0x5a, 0xcc, 0xbb,
+	0x7e, 0x31, 0xf3, 0x3e, 0xd4, 0xc1, 0x33, 0xcd, 0xfd, 0x32, 0x14, 0x2d, 0x8d, 0xb9, 0x62, 0x23,
+	0xa9, 0x3d, 0xe3, 0x7b, 0x48, 0xf7, 0x3c, 0x02, 0x06, 0x3c, 0xa4, 0x01, 0x57, 0xd5, 0x10, 0xdf,
+	0x79, 0xd4, 0xb7, 0x1d, 0x46, 0x1d, 0x29, 0x9b, 0x15, 0xb2, 0xcf, 0x28, 0xd9, 0xab, 0x3b, 0x09,
+	0x3c, 0x98, 0x28, 0x49, 0x76, 0xe0, 0x8a, 0x2e, 0x3c, 0x6e, 0xa4, 0xa6, 0xad, 0xb5, 0x3c, 0xc0,
+	0x9c, 0x00, 0xfc, 0x9c, 0x02, 0xbc, 0xb2, 0x36, 0xcc, 0x82, 0x49, 0x72, 0xf1, 0xd5, 0x9c, 0x1f,
+	0x6b, 0x35, 0x4f, 0x8d, 0xb3, 0x9a, 0x0b, 0xe3, 0xad, 0xe6, 0xe2, 0xd9, 0x56, 0x33, 0x1f, 0x79,
+	0xbe, 0x8e, 0xa8, 0xc3, 0xc3, 0x44, 0x19, 0xf8, 0x89, 0x85, 0x07, 0xd1, 0x91, 0x6f, 0x26, 0xf0,
+	0x60, 0xa2, 0x24, 0xd9, 0x87, 0x45, 0xd9, 0x7e, 0xc7, 0xd2, 0x9d, 0xa3, 0x3e, 0x37, 0xf7, 0x21,
+	0xdc, 0x92, 0xc0, 0xad, 0x2a, 0xdc, 0xc5, 0xe6, 0x48, 0x4e, 0x3c, 0x05, 0x85, 0xfc, 0x06, 0xcc,
+	0xc8, 0x59, 0xda, 0xd1, 0xfa, 0xa1, 0x84, 0xcc, 0x35, 0x05, 0x3b, 0xb3, 0x16, 0x26, 0x62, 0x94,
+	0x97, 0xac, 0xc2, 0x5c, 0xff, 0x50, 0xe7, 0x3f, 0xb7, 0xda, 0xf7, 0x28, 0x6d, 0xd1, 0x96, 0xc8,
+	0xc7, 0x14, 0xeb, 0x4f, 0x7b, 0xee, 0x78, 0x23, 0x4a, 0xc6, 0x38, 0x3f, 0xb9, 0x0d, 0xd3, 0x2e,
+	0xd3, 0x1c, 0xa6, 0x42, 0x2d, 0x91, 0xa5, 0x29, 0x06, 0x71, 0x4d, 0x33, 0x44, 0xc3, 0x08, 0xe7,
+	0x24, 0xd6, 0xe3, 0xb1, 0x3c, 0x0c, 0x45, 0xac, 0x1a, 0x33, 0xfb, 0xdf, 0x88, 0x9b, 0xfd, 0x77,
+	0x26, 0xd9, 0xfe, 0x09, 0x1a, 0xce, 0xb4, 0xed, 0x5f, 0x07, 0xe2, 0xa8, 0xc8, 0x5a, 0x06, 0x57,
+	0x21, 0xcb, 0xef, 0xe7, 0x9b, 0x70, 0x88, 0x03, 0x13, 0xa4, 0x48, 0x13, 0xae, 0xb9, 0xd4, 0x62,
+	0x86, 0x45, 0xcd, 0x28, 0x9c, 0x3c, 0x12, 0x9e, 0x55, 0x70, 0xd7, 0x9a, 0x49, 0x4c, 0x98, 0x2c,
+	0x3b, 0xc9, 0xe0, 0xff, 0xa4, 0x28, 0xce, 0x5d, 0x39, 0x34, 0x17, 0x66, 0xb6, 0x3f, 0x88, 0x9b,
+	0xed, 0x77, 0x27, 0x9f, 0xb7, 0xf1, 0x4c, 0xf6, 0x0a, 0x80, 0x98, 0x85, 0xb0, 0xcd, 0xf6, 0x2d,
+	0x15, 0xfa, 0x14, 0x0c, 0x71, 0xf1, 0x5d, 0xe8, 0x8d, 0x73, 0xd8, 0x5c, 0xfb, 0xbb, 0xb0, 0x19,
+	0x26, 0x62, 0x94, 0x77, 0xa4, 0xc9, 0xcf, 0x8d, 0x6d, 0xf2, 0x5f, 0x07, 0x12, 0x49, 0x9f, 0x49,
+	0xbc, 0x7c, 0x34, 0xdd, 0xb9, 0x35, 0xc4, 0x81, 0x09, 0x52, 0x23, 0x96, 0xf2, 0xd4, 0xc5, 0x2e,
+	0xe5, 0xc2, 0xf8, 0x4b, 0x99, 0xbc, 0x0b, 0x37, 0x84, 0x2a, 0x35, 0x3e, 0x51, 0x60, 0x69, 0xfc,
+	0x7f, 0x41, 0x01, 0xdf, 0xc0, 0x51, 0x8c, 0x38, 0x1a, 0x83, 0xcf, 0x8f, 0xee, 0xd0, 0x16, 0x57,
+	0xae, 0x99, 0xa3, 0x0f, 0x86, 0xb5, 0x04, 0x1e, 0x4c, 0x94, 0xe4, 0x4b, 0x8c, 0xf1, 0x65, 0xa8,
+	0xed, 0x9b, 0xb4, 0x25, 0x0e, 0x82, 0x42, 0xb0, 0xc4, 0x76, 0xb7, 0x9b, 0x8a, 0x82, 0x21, 0xae,
+	0x24, 0x5b, 0x3d, 0x7d, 0x4e, 0x5b, 0xbd, 0x29, 0x6a, 0x5b, 0xed, 0xc8, 0x91, 0xa0, 0x0c, 0xbe,
+	0x9f, 0xc0, 0x5f, 0x8b, 0x33, 0xe0, 0xb0, 0x8c, 0x38, 0x2a, 0x75, 0xc7, 0xe8, 0x33, 0x37, 0x8a,
+	0x35, 0x1b, 0x3b, 0x2a, 0x13, 0x78, 0x30, 0x51, 0x92, 0x3b, 0x29, 0x07, 0x54, 0x33, 0xd9, 0x41,
+	0x14, 0x70, 0x2e, 0xea, 0xa4, 0xbc, 0x36, 0xcc, 0x82, 0x49, 0x72, 0x93, 0x98, 0xb7, 0x6f, 0xa5,
+	0xe1, 0xca, 0x26, 0x55, 0x75, 0xa5, 0x86, 0xdd, 0xf2, 0xec, 0xda, 0xcf, 0x69, 0x94, 0xf5, 0x8d,
+	0x34, 0x4c, 0x6d, 0x3a, 0xf6, 0xa0, 0x5f, 0x3f, 0x22, 0x1d, 0xc8, 0x3f, 0x14, 0x69, 0x0c, 0x95,
+	0xbc, 0x18, 0xbf, 0xbc, 0x2b, 0xb3, 0x21, 0x81, 0x09, 0x96, 0xcf, 0xa8, 0xe0, 0xf9, 0x48, 0x75,
+	0xe9, 0x11, 0x6d, 0x89, 0x91, 0x2a, 0x04, 0x23, 0x75, 0x97, 0x37, 0xa2, 0xa4, 0x91, 0xf7, 0x60,
+	0xca, 0x65, 0xb6, 0xe3, 0x19, 0xe9, 0x49, 0xd2, 0x50, 0x8d, 0xfa, 0x57, 0x9b, 0x12, 0x4a, 0x46,
+	0xdf, 0xea, 0x01, 0x3d, 0x05, 0xd5, 0xef, 0xa7, 0x00, 0x5e, 0xdb, 0xdd, 0x6d, 0xa8, 0x44, 0x41,
+	0x0b, 0xb2, 0xda, 0xc0, 0xcf, 0xe1, 0x6c, 0x8c, 0x5f, 0xc4, 0x0c, 0x17, 0x24, 0x54, 0x52, 0x65,
+	0xc0, 0x0e, 0x50, 0xa0, 0x93, 0x5f, 0x84, 0x29, 0x75, 0x42, 0xaa, 0x71, 0xf0, 0x8b, 0x49, 0xea,
+	0x14, 0x45, 0x8f, 0x5e, 0xfd, 0x69, 0x1a, 0xae, 0x6f, 0x59, 0x8c, 0x3a, 0x4d, 0x46, 0xfb, 0x91,
+	0x82, 0x01, 0xf9, 0xdd, 0x50, 0x99, 0x57, 0xf6, 0xf7, 0x57, 0xce, 0x96, 0xb9, 0x90, 0xa5, 0xc2,
+	0x1d, 0xca, 0xb4, 0xc0, 0x36, 0x05, 0x6d, 0xa1, 0xda, 0xee, 0x00, 0xb2, 0x6e, 0x9f, 0xea, 0x2a,
+	0x2f, 0xd2, 0x1c, 0x7b, 0x34, 0x92, 0x5f, 0x80, 0xef, 0xbf, 0x20, 0x23, 0x25, 0x76, 0xa3, 0x50,
+	0x47, 0xbe, 0x0e, 0x79, 0x97, 0x69, 0x6c, 0xe0, 0x65, 0x3f, 0xf7, 0x2e, 0x5a, 0xb1, 0x00, 0x0f,
+	0xd6, 0xa8, 0x7c, 0x46, 0xa5, 0xb4, 0xfa, 0xd3, 0x14, 0x2c, 0x26, 0x0b, 0x6e, 0x1b, 0x2e, 0x23,
+	0xbf, 0x35, 0x34, 0xec, 0x67, 0x4c, 0x18, 0x71, 0x69, 0x31, 0xe8, 0xf3, 0x4a, 0x71, 0xc1, 0x6b,
+	0x09, 0x0d, 0x39, 0x83, 0x9c, 0xc1, 0x68, 0xcf, 0xf3, 0x95, 0xde, 0xb8, 0xe0, 0x57, 0x0f, 0xd9,
+	0x26, 0xae, 0x05, 0xa5, 0xb2, 0xea, 0x37, 0xd3, 0xa3, 0x5e, 0x99, 0x4f, 0x0b, 0x31, 0xa3, 0x45,
+	0xa9, 0xbb, 0x93, 0x15, 0xa5, 0xa2, 0x1d, 0x1a, 0xae, 0x4d, 0xfd, 0xde, 0x70, 0x6d, 0xea, 0x8d,
+	0xc9, 0x6b, 0x53, 0xb1, 0x61, 0x18, 0x59, 0xa2, 0xfa, 0x56, 0x06, 0x9e, 0x39, 0x6d, 0xd9, 0x70,
+	0x5b, 0xa9, 0x56, 0xe7, 0xa4, 0xb6, 0xf2, 0xf4, 0x75, 0x48, 0x56, 0x20, 0xd7, 0x3f, 0xd0, 0x5c,
+	0xef, 0x54, 0xf1, 0x0e, 0xdf, 0x5c, 0x83, 0x37, 0x3e, 0x3e, 0xae, 0x94, 0xe4, 0x69, 0x24, 0x1e,
+	0x51, 0xb2, 0x72, 0xcb, 0xd2, 0xa3, 0xae, 0x1b, 0xf8, 0xb7, 0xbe, 0x65, 0xd9, 0x91, 0xcd, 0xe8,
+	0xd1, 0x09, 0x83, 0xbc, 0x8c, 0x19, 0x55, 0xae, 0x7f, 0x7b, 0xec, 0xf7, 0x48, 0xa8, 0x63, 0x06,
+	0x2f, 0xa5, 0xd2, 0x0f, 0x4a, 0x97, 0x5f, 0x27, 0xcd, 0x25, 0xd7, 0x49, 0x43, 0x07, 0xac, 0xac,
+	0x93, 0xfe, 0xf5, 0x2c, 0x5c, 0x4f, 0x9e, 0x43, 0xfe, 0xae, 0x87, 0xd4, 0x71, 0x0d, 0xdb, 0x52,
+	0x87, 0x76, 0x50, 0x92, 0x97, 0xcd, 0xe8, 0xd1, 0xc9, 0x2d, 0x28, 0x38, 0xb4, 0x6f, 0x1a, 0xba,
+	0xe6, 0xaa, 0x58, 0x4d, 0x24, 0x6d, 0x51, 0xb5, 0xa1, 0x4f, 0x1d, 0x71, 0x4d, 0x28, 0xf3, 0xff,
+	0x78, 0x4d, 0xe8, 0xcf, 0x52, 0xdc, 0x0d, 0x96, 0x89, 0x9a, 0x21, 0x01, 0x35, 0x77, 0x17, 0xd9,
+	0xb3, 0x67, 0xa5, 0x3b, 0x3d, 0x42, 0x21, 0x8e, 0xee, 0x0b, 0xf9, 0x61, 0x0a, 0xca, 0xbd, 0x98,
+	0x9f, 0x7d, 0x89, 0x37, 0xad, 0x9e, 0x39, 0x39, 0xae, 0x94, 0x77, 0x46, 0xe8, 0xc3, 0x91, 0x3d,
+	0x21, 0xbf, 0x0f, 0xa5, 0x3e, 0x5f, 0x17, 0x2e, 0xa3, 0x96, 0x4e, 0x55, 0xe1, 0x75, 0xfc, 0xd5,
+	0xdf, 0x08, 0xb0, 0x9a, 0xcc, 0xd1, 0x18, 0xed, 0x1c, 0xa9, 0x4a, 0x56, 0x40, 0xc0, 0xb0, 0xc6,
+	0xc8, 0xfd, 0xac, 0x9d, 0xcb, 0xbe, 0x9f, 0xf5, 0xbd, 0xe4, 0xfb, 0x59, 0xda, 0x05, 0x5b, 0xd4,
+	0xcf, 0xee, 0x69, 0x7d, 0x76, 0x4f, 0xeb, 0xd3, 0xba, 0xa7, 0x75, 0x0b, 0x0a, 0x2e, 0x65, 0xcc,
+	0xb0, 0x3a, 0x6e, 0x79, 0x5e, 0xd6, 0x35, 0xb9, 0xd6, 0xa6, 0x6a, 0x43, 0x9f, 0x4a, 0x7e, 0x19,
+	0x8a, 0x22, 0x33, 0xb9, 0xea, 0x74, 0xdc, 0xf2, 0x82, 0x28, 0x70, 0x8a, 0x93, 0xbf, 0xe9, 0x35,
+	0x62, 0x40, 0x27, 0x2f, 0xc1, 0xb4, 0x2c, 0xf2, 0xca, 0x23, 0x4b, 0xdc, 0xa9, 0x2a, 0xd6, 0xe7,
+	0xf9, 0x0a, 0xae, 0x87, 0xda, 0x31, 0xc2, 0xc5, 0x23, 0x7e, 0xea, 0xa7, 0x6f, 0xcb, 0x57, 0xa2,
+	0x11, 0x7f, 0x90, 0xd8, 0xc5, 0x10, 0x17, 0x79, 0x16, 0x32, 0xcc, 0x74, 0xcb, 0x57, 0x05, 0xb3,
+	0x1f, 0x99, 0xed, 0x6e, 0x37, 0x91, 0xb7, 0x4f, 0x7e, 0x23, 0xea, 0x7f, 0x53, 0x30, 0x17, 0xbb,
+	0x94, 0xc3, 0x75, 0x0e, 0x1c, 0x53, 0x9d, 0x94, 0xbe, 0xce, 0x3d, 0xdc, 0x46, 0xde, 0x4e, 0xde,
+	0x55, 0x81, 0x4f, 0x7a, 0x42, 0x7b, 0x74, 0x6f, 0x75, 0xb7, 0xc9, 0x23, 0x9d, 0xa1, 0x98, 0xe7,
+	0x76, 0x6c, 0x74, 0x33, 0xd1, 0x74, 0xf2, 0xe9, 0x23, 0x1c, 0xca, 0xa9, 0x64, 0xcf, 0x92, 0x53,
+	0xa9, 0x7e, 0x9c, 0x82, 0xe2, 0x5d, 0xad, 0xdd, 0xd5, 0x9a, 0x86, 0xd5, 0x25, 0xcf, 0xc3, 0xd4,
+	0xbe, 0x63, 0x77, 0xa9, 0xe3, 0xaa, 0xa2, 0xb9, 0x88, 0x05, 0xeb, 0xb2, 0x09, 0x3d, 0x1a, 0x0f,
+	0x4e, 0x99, 0xdd, 0x37, 0xf4, 0x78, 0x18, 0xbf, 0xcb, 0x1b, 0x51, 0xd2, 0xc8, 0x03, 0x39, 0x77,
+	0x99, 0x09, 0x6f, 0xed, 0xee, 0x6e, 0x37, 0x65, 0x21, 0xda, 0x9b, 0x75, 0xf2, 0x42, 0xc4, 0x1f,
+	0x2b, 0x8e, 0xf2, 0xa0, 0xaa, 0xdf, 0x4b, 0x43, 0x49, 0xbe, 0x9a, 0x0c, 0x59, 0x2f, 0xf2, 0xe5,
+	0x5e, 0x11, 0x35, 0x07, 0x77, 0xd0, 0xa3, 0x8e, 0x48, 0x0d, 0xa8, 0x59, 0x0a, 0xe7, 0x90, 0x02,
+	0xa2, 0x5f, 0x77, 0x08, 0x9a, 0xbc, 0xd1, 0xc9, 0x5e, 0xe2, 0xe8, 0xe4, 0x4e, 0x1d, 0x9d, 0xbf,
+	0x4a, 0x41, 0x71, 0xdb, 0x68, 0x53, 0xfd, 0x48, 0x37, 0x29, 0x79, 0x13, 0xca, 0x2d, 0x6a, 0x52,
+	0x46, 0x37, 0x1d, 0x4d, 0xa7, 0x0d, 0xea, 0x18, 0xc2, 0xd4, 0xdb, 0x56, 0x4b, 0x7a, 0xef, 0x39,
+	0xe9, 0x44, 0xac, 0x8f, 0xe0, 0xc1, 0x91, 0xd2, 0x64, 0x0b, 0xa6, 0x5b, 0xd4, 0x35, 0x1c, 0xda,
+	0x6a, 0x84, 0x7c, 0xf4, 0xe7, 0xbd, 0xe5, 0xbc, 0x1e, 0xa2, 0x3d, 0x3e, 0xae, 0xcc, 0x34, 0x8c,
+	0x3e, 0x35, 0x0d, 0x8b, 0x4a, 0x67, 0x3d, 0x22, 0x5a, 0xcd, 0x41, 0x66, 0xdb, 0xee, 0x54, 0xbf,
+	0x99, 0x01, 0xff, 0xfc, 0x26, 0x7f, 0x98, 0x82, 0x92, 0x66, 0x59, 0x36, 0x53, 0x07, 0xa3, 0xac,
+	0x78, 0xe0, 0xc4, 0x6e, 0x42, 0x6d, 0x35, 0x00, 0x95, 0xa7, 0xb4, 0x7f, 0x98, 0x86, 0x28, 0x18,
+	0xd6, 0x4d, 0x06, 0xb1, 0xfc, 0xfd, 0xce, 0xe4, 0xbd, 0x38, 0x43, 0xb6, 0x7e, 0xf1, 0x2b, 0x30,
+	0x1f, 0xef, 0xec, 0x79, 0x8c, 0xe0, 0x24, 0x99, 0xc2, 0x3f, 0x4d, 0x41, 0xc1, 0x33, 0x64, 0x64,
+	0x0d, 0xb2, 0x03, 0x97, 0x3a, 0xe7, 0xbb, 0x4c, 0x2a, 0xac, 0xdf, 0x9e, 0x4b, 0x1d, 0x14, 0xc2,
+	0xe4, 0x0d, 0x28, 0xf4, 0x35, 0xd7, 0x7d, 0x68, 0x3b, 0x2d, 0x65, 0x62, 0xcf, 0x08, 0x24, 0xcf,
+	0x65, 0x25, 0x8a, 0x3e, 0x48, 0xf5, 0x1f, 0x66, 0xa0, 0x74, 0x4f, 0x63, 0xc6, 0x21, 0x15, 0xb1,
+	0xf3, 0xe5, 0x04, 0x43, 0x3f, 0x48, 0xc1, 0xf5, 0x68, 0xb2, 0xff, 0x12, 0x23, 0xa2, 0xc5, 0x93,
+	0xe3, 0xca, 0x75, 0x4c, 0xd4, 0x86, 0x23, 0x7a, 0x21, 0x62, 0xa3, 0xa1, 0xda, 0xc1, 0x65, 0xc7,
+	0x46, 0xcd, 0x51, 0x0a, 0x71, 0x74, 0x5f, 0x3e, 0x8b, 0x8d, 0xc6, 0x88, 0x8d, 0x2e, 0xfd, 0xdb,
+	0x95, 0xef, 0x24, 0xc7, 0x46, 0xf7, 0xc7, 0xf7, 0x7e, 0x82, 0x1d, 0xf9, 0x59, 0x40, 0xf4, 0x59,
+	0x40, 0xf4, 0x69, 0x05, 0x44, 0xfd, 0x58, 0x40, 0x34, 0x49, 0xe5, 0x42, 0x5d, 0x8c, 0x90, 0x68,
+	0xa3, 0x02, 0xab, 0xc9, 0x43, 0x94, 0xbf, 0x4c, 0x01, 0x04, 0xc5, 0x19, 0xf2, 0xfd, 0x14, 0x5c,
+	0xf3, 0xcd, 0x00, 0x93, 0x77, 0xe6, 0xd7, 0x4c, 0xcd, 0xe8, 0xa9, 0x63, 0xf7, 0x62, 0x4d, 0xd0,
+	0x8d, 0x93, 0xe3, 0xca, 0xb5, 0x46, 0x92, 0x3a, 0x4c, 0xee, 0x45, 0xf5, 0x4f, 0xd2, 0x70, 0x25,
+	0x01, 0x89, 0xbc, 0x0a, 0xf3, 0xaa, 0x92, 0x14, 0xac, 0x3f, 0x79, 0xfe, 0x8a, 0x6b, 0xc4, 0xcd,
+	0x18, 0x0d, 0x87, 0xb8, 0xc9, 0xbb, 0x00, 0x9a, 0xae, 0x53, 0xd7, 0xdd, 0xb1, 0x5b, 0x9e, 0x1b,
+	0xf9, 0x0a, 0x8f, 0x6c, 0x56, 0xfd, 0xd6, 0xc7, 0xc7, 0x95, 0x2f, 0x24, 0x95, 0x04, 0x63, 0x3d,
+	0x0d, 0x04, 0x30, 0x04, 0x49, 0x7e, 0x07, 0x40, 0x7e, 0x75, 0xe0, 0xdf, 0x44, 0x7d, 0x42, 0xc5,
+	0xa2, 0xe6, 0xdd, 0xea, 0xaf, 0x7d, 0x75, 0xa0, 0x59, 0x8c, 0x2f, 0x62, 0x71, 0x67, 0xfc, 0xbe,
+	0x8f, 0x82, 0x21, 0xc4, 0xea, 0x3f, 0xa5, 0xa1, 0xe0, 0xb9, 0xb7, 0x9f, 0x42, 0x4d, 0xaa, 0x13,
+	0xa9, 0x49, 0x8d, 0xff, 0x6d, 0x95, 0xd7, 0xe5, 0x91, 0x55, 0x28, 0x3b, 0x56, 0x85, 0xda, 0x9c,
+	0x5c, 0xd5, 0xe9, 0x75, 0xa7, 0x1f, 0xa5, 0x61, 0xd6, 0x63, 0x55, 0x97, 0xdc, 0xbf, 0x04, 0x33,
+	0x0e, 0xd5, 0x5a, 0x75, 0x8d, 0xe9, 0x07, 0x62, 0xfa, 0xe4, 0x15, 0xf7, 0x85, 0x93, 0xe3, 0xca,
+	0x0c, 0x86, 0x09, 0x18, 0xe5, 0x4b, 0xba, 0x1d, 0x9f, 0x9e, 0xf0, 0x76, 0x7c, 0xe6, 0x3c, 0xb7,
+	0xe3, 0x89, 0x06, 0x25, 0xde, 0xa3, 0x5d, 0xa3, 0x47, 0xed, 0x01, 0x53, 0xae, 0xd8, 0x79, 0x6f,
+	0x56, 0x0b, 0x57, 0x01, 0x03, 0x18, 0x0c, 0x63, 0x56, 0xff, 0x25, 0x05, 0xd3, 0xc1, 0x78, 0x5d,
+	0x7a, 0x65, 0xae, 0x1d, 0xad, 0xcc, 0xad, 0x4e, 0xbc, 0x1c, 0x46, 0xd4, 0xe2, 0x7e, 0x98, 0x0b,
+	0x5e, 0x4b, 0x54, 0xdf, 0xf6, 0x61, 0xd1, 0x48, 0x2c, 0x48, 0x85, 0xac, 0x8d, 0x7f, 0xd9, 0x70,
+	0x6b, 0x24, 0x27, 0x9e, 0x82, 0x42, 0x06, 0x50, 0x38, 0xa4, 0x0e, 0x33, 0x74, 0xea, 0xbd, 0xdf,
+	0xe6, 0x05, 0x7d, 0xc0, 0x1b, 0x8c, 0xe9, 0x7d, 0xa5, 0x00, 0x7d, 0x55, 0x64, 0x1f, 0x72, 0xb4,
+	0xd5, 0xa1, 0xde, 0xc7, 0x05, 0x2f, 0x4f, 0xf4, 0xb9, 0x49, 0x30, 0x9e, 0xfc, 0xc9, 0x45, 0x09,
+	0x4d, 0x5c, 0x28, 0x9a, 0x5e, 0x42, 0x40, 0xad, 0xc3, 0xfa, 0xd8, 0x7a, 0xfc, 0xd4, 0x42, 0x70,
+	0xd9, 0xd7, 0x6f, 0xc2, 0x40, 0x0f, 0xe9, 0xfa, 0x1f, 0xd2, 0xe4, 0x2e, 0xc8, 0x78, 0x9c, 0xf2,
+	0x31, 0x8d, 0x0b, 0xc5, 0x87, 0x1a, 0xa3, 0x4e, 0x4f, 0x73, 0xba, 0xca, 0x65, 0x1f, 0xff, 0x0d,
+	0x1f, 0x78, 0x48, 0xc1, 0x1b, 0xfa, 0x4d, 0x18, 0xe8, 0xa9, 0x3e, 0xce, 0x04, 0xd6, 0xea, 0xd3,
+	0xae, 0x8c, 0xbe, 0x14, 0xad, 0x8c, 0x2e, 0xc5, 0x2b, 0xa3, 0xb1, 0x74, 0xcb, 0xf9, 0x6b, 0xa3,
+	0x1a, 0x94, 0x4c, 0xcd, 0x65, 0x7b, 0xfd, 0x96, 0xc6, 0x54, 0xce, 0xb1, 0xb4, 0xf2, 0x4b, 0x67,
+	0x33, 0x26, 0xdc, 0x3c, 0x05, 0x1e, 0xf9, 0x76, 0x00, 0x83, 0x61, 0x4c, 0xf2, 0x22, 0x94, 0x0e,
+	0xc5, 0x06, 0x59, 0xe3, 0x6e, 0x9c, 0x58, 0x26, 0x33, 0xd2, 0xe0, 0xdd, 0x0f, 0x9a, 0x31, 0xcc,
+	0xc3, 0x45, 0xe4, 0xc1, 0x2c, 0x45, 0xf2, 0x81, 0x48, 0x33, 0x68, 0xc6, 0x30, 0x8f, 0x48, 0x80,
+	0x1b, 0x56, 0x57, 0x0a, 0x4c, 0x09, 0x01, 0x99, 0x00, 0xf7, 0x1a, 0x31, 0xa0, 0x73, 0x27, 0x78,
+	0xd0, 0x6a, 0x4b, 0xde, 0x82, 0xe0, 0x15, 0xee, 0xdf, 0xde, 0xfa, 0x86, 0x64, 0xf5, 0xa9, 0xd5,
+	0xff, 0x4a, 0x01, 0x19, 0xae, 0xe5, 0x93, 0x03, 0xc8, 0x5b, 0x22, 0x02, 0x9a, 0xf8, 0xeb, 0xd5,
+	0x50, 0x20, 0x25, 0x97, 0xbc, 0x6a, 0x50, 0xf8, 0xc4, 0x82, 0x02, 0x7d, 0xc4, 0xa8, 0x63, 0x69,
+	0xa6, 0xf2, 0x04, 0x2e, 0xe6, 0x4b, 0x59, 0xf1, 0xc2, 0x77, 0x14, 0x32, 0xfa, 0x3a, 0xaa, 0x3f,
+	0x4b, 0x43, 0x29, 0xc4, 0xf7, 0xa4, 0x6c, 0xba, 0xb8, 0x2a, 0x2b, 0x53, 0x01, 0x7b, 0x8e, 0xa9,
+	0x96, 0x69, 0xe8, 0xaa, 0xac, 0x22, 0xe1, 0x36, 0x86, 0xf9, 0xc8, 0x0a, 0x40, 0x4f, 0x73, 0x19,
+	0x75, 0x84, 0x65, 0x8f, 0x5d, 0x50, 0xdd, 0xf1, 0x29, 0x18, 0xe2, 0x22, 0x37, 0x55, 0x7a, 0x2a,
+	0x1b, 0xfd, 0xc0, 0x6b, 0x44, 0xee, 0x29, 0x77, 0x01, 0xb9, 0x27, 0xd2, 0x81, 0x79, 0xaf, 0xd7,
+	0x1e, 0x55, 0x99, 0x9d, 0x33, 0x02, 0x4b, 0xdf, 0x38, 0x06, 0x81, 0x43, 0xa0, 0xd5, 0xbf, 0x49,
+	0xc1, 0x4c, 0x24, 0x1e, 0x21, 0xcf, 0x85, 0x6f, 0xa2, 0x84, 0xb2, 0xd8, 0x91, 0x0b, 0x24, 0x2f,
+	0x40, 0x5e, 0x0e, 0x90, 0x1a, 0x78, 0xdf, 0x8c, 0xc8, 0x21, 0x44, 0x45, 0xe5, 0x06, 0x41, 0xa5,
+	0xba, 0xe2, 0x06, 0x41, 0xe5, 0xc2, 0xd0, 0xa3, 0x93, 0xcf, 0xf3, 0x08, 0x4b, 0xf6, 0x4e, 0x8d,
+	0xb4, 0x7f, 0xac, 0x79, 0xef, 0x81, 0x3e, 0x47, 0xf5, 0x07, 0x59, 0x90, 0x9f, 0xd0, 0x73, 0xb9,
+	0x96, 0xe1, 0xca, 0xca, 0x45, 0x4a, 0x54, 0x2e, 0x7c, 0xb9, 0x75, 0xd5, 0x8e, 0x3e, 0x07, 0xb9,
+	0x01, 0x99, 0x9e, 0x61, 0xa9, 0xa4, 0x9c, 0xc8, 0x7f, 0xef, 0x18, 0x16, 0xf2, 0x36, 0x41, 0xd2,
+	0x1e, 0xa9, 0x9b, 0xe1, 0x92, 0xa4, 0x3d, 0x42, 0xde, 0xc6, 0x7d, 0x3d, 0xd3, 0xb6, 0xbb, 0xfb,
+	0x9a, 0xde, 0xf5, 0x72, 0xdb, 0x59, 0xb1, 0x7b, 0x85, 0xaf, 0xb7, 0x1d, 0x25, 0x61, 0x9c, 0x97,
+	0x8b, 0xeb, 0xb6, 0x6d, 0xb6, 0xec, 0x87, 0x96, 0x27, 0x9e, 0x0b, 0xc4, 0xd7, 0xa2, 0x24, 0x8c,
+	0xf3, 0x92, 0x3d, 0x78, 0xfa, 0x7d, 0xea, 0xd8, 0x6a, 0xc4, 0x9a, 0x26, 0xa5, 0x7d, 0x0f, 0x46,
+	0x1a, 0xa8, 0xcf, 0x9d, 0x1c, 0x57, 0x9e, 0x7e, 0x3b, 0x99, 0x05, 0x47, 0xc9, 0x72, 0x58, 0xa6,
+	0x39, 0x1d, 0xca, 0x1a, 0x8e, 0xcd, 0x43, 0x19, 0xc3, 0xea, 0x78, 0xb0, 0x53, 0x01, 0xec, 0x6e,
+	0x32, 0x0b, 0x8e, 0x92, 0x25, 0x6b, 0xb0, 0x20, 0x49, 0x21, 0x17, 0x56, 0xd9, 0x3a, 0x71, 0x23,
+	0x63, 0x37, 0x4e, 0xc4, 0x61, 0x7e, 0xee, 0x1d, 0x7b, 0x29, 0xd2, 0x06, 0x75, 0xc4, 0x44, 0x8b,
+	0xeb, 0xc8, 0xca, 0x3b, 0xc6, 0x18, 0x0d, 0x87, 0xb8, 0xab, 0x7f, 0x9e, 0x06, 0xf1, 0xdf, 0x34,
+	0xe4, 0x01, 0x64, 0x4c, 0xbb, 0xa3, 0xcc, 0xe5, 0xf8, 0xf5, 0x92, 0x6d, 0xbb, 0x23, 0x17, 0xc5,
+	0xb6, 0xdd, 0x41, 0x8e, 0x48, 0x74, 0xc8, 0x75, 0xb5, 0x76, 0x57, 0x53, 0xd6, 0x71, 0x7c, 0x7f,
+	0xc0, 0xaf, 0xa2, 0xa9, 0x2f, 0x4d, 0xf9, 0x23, 0x4a, 0x6c, 0xa2, 0x43, 0x7e, 0xd0, 0x12, 0x7f,
+	0xd9, 0x33, 0xe9, 0xbf, 0x02, 0xed, 0xad, 0x0b, 0x15, 0xc2, 0xd4, 0xcb, 0xdf, 0xa8, 0xa0, 0xab,
+	0xff, 0x9c, 0x06, 0xf5, 0x47, 0x41, 0x64, 0x00, 0xc5, 0x8e, 0xf7, 0x65, 0xa7, 0x1a, 0xb3, 0xd7,
+	0x26, 0xf8, 0x98, 0x20, 0xf2, 0x8d, 0xa8, 0x3c, 0x17, 0xfd, 0x46, 0x0c, 0x34, 0x11, 0x1a, 0x1d,
+	0xcb, 0xf5, 0x09, 0xc7, 0x52, 0xaa, 0x1b, 0x1e, 0x4d, 0x0d, 0xb2, 0x07, 0x8c, 0xf5, 0x27, 0xbe,
+	0xf3, 0x1a, 0x5c, 0x67, 0x95, 0x65, 0x08, 0xfe, 0x8c, 0x02, 0xba, 0xda, 0x03, 0xe5, 0x4a, 0x11,
+	0x3d, 0xf2, 0x95, 0xb9, 0x2c, 0x2f, 0x2d, 0x9f, 0xcd, 0xc1, 0xf1, 0xbf, 0x45, 0x0e, 0x7d, 0xe6,
+	0x95, 0xf8, 0x39, 0x79, 0xf5, 0xdf, 0xd2, 0x90, 0xd9, 0xdd, 0x6e, 0xca, 0xaf, 0x16, 0x44, 0xae,
+	0x90, 0x36, 0xbb, 0x46, 0xff, 0x3e, 0x75, 0x8c, 0xf6, 0x91, 0xb2, 0x87, 0xa1, 0xaf, 0x16, 0xe2,
+	0x1c, 0x98, 0x20, 0x45, 0xde, 0x81, 0x69, 0x5d, 0x5b, 0xa3, 0x0e, 0x93, 0xc7, 0xca, 0xf9, 0xaa,
+	0x29, 0xa2, 0x98, 0xbf, 0xb6, 0x1a, 0x88, 0x63, 0x04, 0x8c, 0xec, 0x01, 0xe8, 0x01, 0x74, 0xe6,
+	0x3c, 0xd0, 0xf2, 0xb3, 0xfa, 0x00, 0x38, 0x04, 0x44, 0x10, 0x8a, 0x5d, 0xce, 0x2a, 0x50, 0xb3,
+	0xe7, 0x41, 0x15, 0x8b, 0xf2, 0xae, 0x27, 0x8b, 0x01, 0x0c, 0xdf, 0x16, 0x99, 0xbd, 0xf5, 0x0d,
+	0x62, 0x43, 0xd1, 0xbf, 0x33, 0xa6, 0xf6, 0x44, 0x7d, 0xf2, 0x42, 0x82, 0x54, 0xec, 0x3f, 0x62,
+	0xa0, 0x83, 0x1c, 0xc0, 0xd4, 0xfe, 0xc0, 0x30, 0x99, 0x61, 0x4d, 0x7c, 0x59, 0xc0, 0xfb, 0x24,
+	0x5c, 0x95, 0xac, 0x25, 0x2a, 0x7a, 0xf0, 0xa4, 0x03, 0x53, 0x1d, 0x79, 0x41, 0x5d, 0x4d, 0xc5,
+	0xab, 0xe3, 0x6f, 0x76, 0x89, 0x23, 0x15, 0xa9, 0x07, 0xf4, 0xd0, 0xab, 0x5f, 0x07, 0x65, 0x74,
+	0x78, 0x28, 0x75, 0x19, 0xa3, 0xe9, 0x87, 0x52, 0x49, 0x23, 0x5a, 0xfd, 0xc7, 0x34, 0xe4, 0xd5,
+	0x3f, 0xb1, 0x5d, 0x7e, 0xfe, 0x8c, 0x46, 0xf2, 0x67, 0x6b, 0x13, 0xfe, 0x37, 0xd1, 0xc8, 0xec,
+	0x59, 0x2f, 0x96, 0x3d, 0x9b, 0xf4, 0x4f, 0x90, 0x9e, 0x90, 0x3b, 0xfb, 0x71, 0x0a, 0x66, 0x25,
+	0xe3, 0x96, 0xe5, 0x32, 0xcd, 0xd2, 0xc5, 0x5f, 0xd6, 0xc9, 0xe0, 0x69, 0xe2, 0x68, 0x54, 0x25,
+	0x32, 0xc4, 0xe1, 0x24, 0x7f, 0xa3, 0x82, 0xe6, 0xfe, 0xdd, 0x81, 0xed, 0x32, 0xf1, 0x17, 0x0b,
+	0xe9, 0xa8, 0x5f, 0xf8, 0x9a, 0x6a, 0x47, 0x9f, 0x23, 0xee, 0x70, 0xe6, 0x46, 0x3b, 0x9c, 0xd5,
+	0xbf, 0x48, 0xc1, 0x74, 0xf8, 0xef, 0x9f, 0xc6, 0x4f, 0x05, 0xc6, 0x32, 0x71, 0xe9, 0x4b, 0xc8,
+	0xc4, 0x7d, 0x94, 0x02, 0xf0, 0x3a, 0x7b, 0xe9, 0x79, 0xb8, 0x56, 0x34, 0x0f, 0x37, 0xf1, 0xb4,
+	0x26, 0x67, 0xe1, 0xfe, 0x36, 0xeb, 0xbd, 0x92, 0xc8, 0xc1, 0x7d, 0x90, 0x82, 0x59, 0x2d, 0x92,
+	0xd7, 0x52, 0x6f, 0x76, 0x61, 0x69, 0x32, 0xff, 0xef, 0xb2, 0xa2, 0xed, 0x18, 0x53, 0x4b, 0x6e,
+	0xc3, 0x74, 0x5f, 0x65, 0x37, 0xee, 0x05, 0xab, 0xce, 0x2f, 0x2d, 0x36, 0x42, 0x34, 0x8c, 0x70,
+	0x3e, 0x21, 0x8f, 0x98, 0xb9, 0x90, 0x3c, 0x62, 0xf8, 0x6e, 0x41, 0xf6, 0xd4, 0xbb, 0x05, 0x16,
+	0x14, 0xdb, 0x8e, 0xdd, 0x13, 0xa9, 0x3a, 0xf5, 0xa7, 0x4a, 0x13, 0xa6, 0xff, 0x7c, 0x23, 0xbb,
+	0xe1, 0xe1, 0x62, 0xa0, 0x82, 0x1f, 0x5b, 0xcc, 0x96, 0xda, 0xf2, 0x17, 0xa1, 0xcd, 0xdf, 0xba,
+	0xbb, 0x12, 0x15, 0x3d, 0xf8, 0xea, 0xbf, 0xa6, 0xbd, 0xad, 0xdb, 0x8c, 0x5d, 0xe4, 0x4f, 0x8d,
+	0xb8, 0xc8, 0xaf, 0x3e, 0x49, 0x0b, 0x27, 0xab, 0x5e, 0x80, 0xbc, 0x43, 0x35, 0xd7, 0xb6, 0xd4,
+	0xc7, 0x9d, 0xbe, 0xe1, 0x43, 0xd1, 0x8a, 0x8a, 0x1a, 0x4e, 0x6a, 0xa5, 0x9f, 0x90, 0xd4, 0xfa,
+	0x7c, 0x68, 0x6e, 0x64, 0x32, 0xdf, 0xdf, 0x66, 0x09, 0xf3, 0x23, 0x22, 0x5e, 0x55, 0x16, 0xcf,
+	0xc5, 0x23, 0x5e, 0x55, 0xba, 0xf6, 0x39, 0x48, 0x0b, 0xa6, 0x4d, 0xcd, 0x65, 0x22, 0xba, 0x69,
+	0xad, 0xb2, 0x31, 0x32, 0x66, 0xfe, 0x0a, 0xde, 0x0e, 0xe1, 0x60, 0x04, 0xb5, 0xfa, 0xdd, 0x14,
+	0x04, 0xc9, 0xc8, 0x73, 0xc6, 0xd6, 0x6f, 0x42, 0xa1, 0xa7, 0x3d, 0x5a, 0xa7, 0xa6, 0x76, 0x34,
+	0xc9, 0xff, 0xbc, 0xec, 0x28, 0x0c, 0xf4, 0xd1, 0xaa, 0x36, 0xa8, 0xaf, 0xdc, 0x78, 0xa0, 0xd0,
+	0x36, 0x1e, 0xa9, 0xee, 0x4c, 0x12, 0x28, 0x84, 0xfe, 0x58, 0x48, 0x06, 0x0a, 0xa2, 0x01, 0x25,
+	0x7a, 0xbd, 0xf6, 0xe1, 0x27, 0x4b, 0x4f, 0x7d, 0xf4, 0xc9, 0xd2, 0x53, 0x1f, 0x7f, 0xb2, 0xf4,
+	0xd4, 0x1f, 0x9c, 0x2c, 0xa5, 0x3e, 0x3c, 0x59, 0x4a, 0x7d, 0x74, 0xb2, 0x94, 0xfa, 0xf8, 0x64,
+	0x29, 0xf5, 0xef, 0x27, 0x4b, 0xa9, 0xef, 0xfc, 0xc7, 0xd2, 0x53, 0x6f, 0x17, 0x3c, 0xb4, 0xff,
+	0x0b, 0x00, 0x00, 0xff, 0xff, 0xef, 0xfb, 0xc5, 0x22, 0x9c, 0x57, 0x00, 0x00,
 }
 
 func (m *AbstractVertex) Marshal() (dAtA []byte, err error) {
@@ -3251,6 +3283,18 @@ func (m *GroupBy) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	_ = i
 	var l int
 	_ = l
+	if m.Storage != nil {
+		{
+			size, err := m.Storage.MarshalToSizedBuffer(dAtA[:i])
+			if err != nil {
+				return 0, err
+			}
+			i -= size
+			i = encodeVarintGenerated(dAtA, i, uint64(size))
+		}
+		i--
+		dAtA[i] = 0x1a
+	}
 	i--
 	if m.Keyed {
 		dAtA[i] = 1
@@ -4293,6 +4337,41 @@ func (m *NativeRedis) MarshalToSizedBuffer(dAtA []byte) (int, error) {
 	return len(dAtA) - i, nil
 }
 
+func (m *PBQStorage) Marshal() (dAtA []byte, err error) {
+	size := m.Size()
+	dAtA = make([]byte, size)
+	n, err := m.MarshalToSizedBuffer(dAtA[:size])
+	if err != nil {
+		return nil, err
+	}
+	return dAtA[:n], nil
+}
+
+func (m *PBQStorage) MarshalTo(dAtA []byte) (int, error) {
+	size := m.Size()
+	return m.MarshalToSizedBuffer(dAtA[:size])
+}
+
+func (m *PBQStorage) MarshalToSizedBuffer(dAtA []byte) (int, error) {
+	i := len(dAtA)
+	_ = i
+	var l int
+	_ = l
+	if m.PersistentVolumeClaim != nil {
+		{
+			size, err := m.PersistentVolumeClaim.MarshalToSizedBuffer(dAtA[:i])
+			if err != nil {
+				return 0, err
+			}
+			i -= size
+			i = encodeVarintGenerated(dAtA, i, uint64(size))
+		}
+		i--
+		dAtA[i] = 0xa
+	}
+	return len(dAtA) - i, nil
+}
+
 func (m *PersistenceStrategy) Marshal() (dAtA []byte, err error) {
 	size := m.Size()
 	dAtA = make([]byte, size)
@@ -6068,6 +6147,10 @@ func (m *GroupBy) Size() (n int) {
 	l = m.Window.Size()
 	n += 1 + l + sovGenerated(uint64(l))
 	n += 2
+	if m.Storage != nil {
+		l = m.Storage.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
 	return n
 }
 
@@ -6442,6 +6525,19 @@ func (m *NativeRedis) Size() (n int) {
 	return n
 }
 
+func (m *PBQStorage) Size() (n int) {
+	if m == nil {
+		return 0
+	}
+	var l int
+	_ = l
+	if m.PersistentVolumeClaim != nil {
+		l = m.PersistentVolumeClaim.Size()
+		n += 1 + l + sovGenerated(uint64(l))
+	}
+	return n
+}
+
 func (m *PersistenceStrategy) Size() (n int) {
 	if m == nil {
 		return 0
@@ -7295,6 +7391,7 @@ func (this *GroupBy) String() string {
 	s := strings.Join([]string{`&GroupBy{`,
 		`Window:` + strings.Replace(strings.Replace(this.Window.String(), "Window", "Window", 1), `&`, ``, 1) + `,`,
 		`Keyed:` + fmt.Sprintf("%v", this.Keyed) + `,`,
+		`Storage:` + strings.Replace(this.Storage.String(), "PBQStorage", "PBQStorage", 1) + `,`,
 		`}`,
 	}, "")
 	return s
@@ -7559,6 +7656,16 @@ func (this *NativeRedis) String() string {
 	}, "")
 	return s
 }
+func (this *PBQStorage) String() string {
+	if this == nil {
+		return "nil"
+	}
+	s := strings.Join([]string{`&PBQStorage{`,
+		`PersistentVolumeClaim:` + strings.Replace(this.PersistentVolumeClaim.String(), "PersistenceStrategy", "PersistenceStrategy", 1) + `,`,
+		`}`,
+	}, "")
+	return s
+}
 func (this *PersistenceStrategy) String() string {
 	if this == nil {
 		return "nil"
@@ -12265,6 +12372,42 @@ func (m *GroupBy) Unmarshal(dAtA []byte) error {
 				}
 			}
 			m.Keyed = bool(v != 0)
+		case 3:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field Storage", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.Storage == nil {
+				m.Storage = &PBQStorage{}
+			}
+			if err := m.Storage.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
 		default:
 			iNdEx = preIndex
 			skippy, err := skipGenerated(dAtA[iNdEx:])
@@ -15576,6 +15719,92 @@ func (m *NativeRedis) Unmarshal(dAtA []byte) error {
 	}
 	return nil
 }
+func (m *PBQStorage) Unmarshal(dAtA []byte) error {
+	l := len(dAtA)
+	iNdEx := 0
+	for iNdEx < l {
+		preIndex := iNdEx
+		var wire uint64
+		for shift := uint(0); ; shift += 7 {
+			if shift >= 64 {
+				return ErrIntOverflowGenerated
+			}
+			if iNdEx >= l {
+				return io.ErrUnexpectedEOF
+			}
+			b := dAtA[iNdEx]
+			iNdEx++
+			wire |= uint64(b&0x7F) << shift
+			if b < 0x80 {
+				break
+			}
+		}
+		fieldNum := int32(wire >> 3)
+		wireType := int(wire & 0x7)
+		if wireType == 4 {
+			return fmt.Errorf("proto: PBQStorage: wiretype end group for non-group")
+		}
+		if fieldNum <= 0 {
+			return fmt.Errorf("proto: PBQStorage: illegal tag %d (wire type %d)", fieldNum, wire)
+		}
+		switch fieldNum {
+		case 1:
+			if wireType != 2 {
+				return fmt.Errorf("proto: wrong wireType = %d for field PersistentVolumeClaim", wireType)
+			}
+			var msglen int
+			for shift := uint(0); ; shift += 7 {
+				if shift >= 64 {
+					return ErrIntOverflowGenerated
+				}
+				if iNdEx >= l {
+					return io.ErrUnexpectedEOF
+				}
+				b := dAtA[iNdEx]
+				iNdEx++
+				msglen |= int(b&0x7F) << shift
+				if b < 0x80 {
+					break
+				}
+			}
+			if msglen < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			postIndex := iNdEx + msglen
+			if postIndex < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if postIndex > l {
+				return io.ErrUnexpectedEOF
+			}
+			if m.PersistentVolumeClaim == nil {
+				m.PersistentVolumeClaim = &PersistenceStrategy{}
+			}
+			if err := m.PersistentVolumeClaim.Unmarshal(dAtA[iNdEx:postIndex]); err != nil {
+				return err
+			}
+			iNdEx = postIndex
+		default:
+			iNdEx = preIndex
+			skippy, err := skipGenerated(dAtA[iNdEx:])
+			if err != nil {
+				return err
+			}
+			if (skippy < 0) || (iNdEx+skippy) < 0 {
+				return ErrInvalidLengthGenerated
+			}
+			if (iNdEx + skippy) > l {
+				return io.ErrUnexpectedEOF
+			}
+			iNdEx += skippy
+		}
+	}
+
+	if iNdEx > l {
+		return io.ErrUnexpectedEOF
+	}
+	return nil
+}
 func (m *PersistenceStrategy) Unmarshal(dAtA []byte) error {
 	l := len(dAtA)
 	iNdEx := 0
diff --git a/pkg/apis/numaflow/v1alpha1/generated.proto b/pkg/apis/numaflow/v1alpha1/generated.proto
index 00aeba71..3157ea4f 100644
--- a/pkg/apis/numaflow/v1alpha1/generated.proto
+++ b/pkg/apis/numaflow/v1alpha1/generated.proto
@@ -340,10 +340,15 @@ message GetVertexPodSpecReq {
 
 // GroupBy indicates it is a reducer UDF
 message GroupBy {
+  // Window describes the windowing strategy.
   optional Window window = 1;
 
   // +optional
   optional bool keyed = 2;
+
+  // Storage is used to define the PBQ storage for a reduce vertex.
+  // +optional
+  optional PBQStorage storage = 3;
 }
 
 message HTTPSource {
@@ -667,6 +672,11 @@ message NativeRedis {
   optional RedisSettings settings = 16;
 }
 
+// PBQStorage defines the persistence configuration for a vertex.
+message PBQStorage {
+  optional PersistenceStrategy persistentVolumeClaim = 1;
+}
+
 // PersistenceStrategy defines the strategy of persistence
 message PersistenceStrategy {
   // Name of the StorageClass required by the claim.
@@ -838,6 +848,7 @@ message RedisSettings {
   optional string sentinel = 4;
 }
 
+// Scale defines the parameters for autoscaling.
 message Scale {
   // Whether to disable autoscaling.
   // Set to "true" when using Kubernetes HPA or any other 3rd party autoscaling strategies.
diff --git a/pkg/apis/numaflow/v1alpha1/jetstream_buffer_service.go b/pkg/apis/numaflow/v1alpha1/jetstream_buffer_service.go
index 6493c0b9..7bc13f3f 100644
--- a/pkg/apis/numaflow/v1alpha1/jetstream_buffer_service.go
+++ b/pkg/apis/numaflow/v1alpha1/jetstream_buffer_service.go
@@ -6,7 +6,6 @@ import (
 
 	appv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
-	apiresource "k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/util/intstr"
 	"k8s.io/utils/pointer"
@@ -333,35 +332,8 @@ func (j JetStreamBufferService) GetStatefulSetSpec(req GetJetStreamStatefulSetSp
 		spec.Template.Spec.Containers[2].Resources = j.MetricsContainerTemplate.Resources
 	}
 	if j.Persistence != nil {
-		volMode := corev1.PersistentVolumeFilesystem
-		// Default volume size
-		volSize := apiresource.MustParse("20Gi")
-		if j.Persistence.VolumeSize != nil {
-			volSize = *j.Persistence.VolumeSize
-		}
-		// Default to ReadWriteOnce
-		accessMode := corev1.ReadWriteOnce
-		if j.Persistence.AccessMode != nil {
-			accessMode = *j.Persistence.AccessMode
-		}
 		spec.VolumeClaimTemplates = []corev1.PersistentVolumeClaim{
-			{
-				ObjectMeta: metav1.ObjectMeta{
-					Name: req.PvcNameIfNeeded,
-				},
-				Spec: corev1.PersistentVolumeClaimSpec{
-					AccessModes: []corev1.PersistentVolumeAccessMode{
-						accessMode,
-					},
-					VolumeMode:       &volMode,
-					StorageClassName: j.Persistence.StorageClassName,
-					Resources: corev1.ResourceRequirements{
-						Requests: corev1.ResourceList{
-							corev1.ResourceStorage: volSize,
-						},
-					},
-				},
-			},
+			j.Persistence.GetPVCSpec(req.PvcNameIfNeeded),
 		}
 		volumeMounts := spec.Template.Spec.Containers[0].VolumeMounts
 		volumeMounts = append(volumeMounts, corev1.VolumeMount{Name: req.PvcNameIfNeeded, MountPath: "/data/jetstream"})
diff --git a/pkg/apis/numaflow/v1alpha1/openapi_generated.go b/pkg/apis/numaflow/v1alpha1/openapi_generated.go
index 4fc1e279..158cc885 100644
--- a/pkg/apis/numaflow/v1alpha1/openapi_generated.go
+++ b/pkg/apis/numaflow/v1alpha1/openapi_generated.go
@@ -63,6 +63,7 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA
 		"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Metadata":                       schema_pkg_apis_numaflow_v1alpha1_Metadata(ref),
 		"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.NATSAuth":                       schema_pkg_apis_numaflow_v1alpha1_NATSAuth(ref),
 		"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.NativeRedis":                    schema_pkg_apis_numaflow_v1alpha1_NativeRedis(ref),
+		"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PBQStorage":                     schema_pkg_apis_numaflow_v1alpha1_PBQStorage(ref),
 		"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PersistenceStrategy":            schema_pkg_apis_numaflow_v1alpha1_PersistenceStrategy(ref),
 		"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Pipeline":                       schema_pkg_apis_numaflow_v1alpha1_Pipeline(ref),
 		"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PipelineLimits":                 schema_pkg_apis_numaflow_v1alpha1_PipelineLimits(ref),
@@ -1118,8 +1119,9 @@ func schema_pkg_apis_numaflow_v1alpha1_GroupBy(ref common.ReferenceCallback) com
 				Properties: map[string]spec.Schema{
 					"window": {
 						SchemaProps: spec.SchemaProps{
-							Default: map[string]interface{}{},
-							Ref:     ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Window"),
+							Description: "Window describes the windowing strategy.",
+							Default:     map[string]interface{}{},
+							Ref:         ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Window"),
 						},
 					},
 					"keyed": {
@@ -1129,12 +1131,18 @@ func schema_pkg_apis_numaflow_v1alpha1_GroupBy(ref common.ReferenceCallback) com
 							Format:  "",
 						},
 					},
+					"storage": {
+						SchemaProps: spec.SchemaProps{
+							Description: "Storage is used to define the PBQ storage for a reduce vertex.",
+							Ref:         ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PBQStorage"),
+						},
+					},
 				},
 				Required: []string{"window"},
 			},
 		},
 		Dependencies: []string{
-			"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Window"},
+			"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PBQStorage", "github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.Window"},
 	}
 }
 
@@ -1917,6 +1925,26 @@ func schema_pkg_apis_numaflow_v1alpha1_NativeRedis(ref common.ReferenceCallback)
 	}
 }
 
+func schema_pkg_apis_numaflow_v1alpha1_PBQStorage(ref common.ReferenceCallback) common.OpenAPIDefinition {
+	return common.OpenAPIDefinition{
+		Schema: spec.Schema{
+			SchemaProps: spec.SchemaProps{
+				Description: "PBQStorage defines the persistence configuration for a vertex.",
+				Type:        []string{"object"},
+				Properties: map[string]spec.Schema{
+					"persistentVolumeClaim": {
+						SchemaProps: spec.SchemaProps{
+							Ref: ref("github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PersistenceStrategy"),
+						},
+					},
+				},
+			},
+		},
+		Dependencies: []string{
+			"github.com/numaproj/numaflow/pkg/apis/numaflow/v1alpha1.PersistenceStrategy"},
+	}
+}
+
 func schema_pkg_apis_numaflow_v1alpha1_PersistenceStrategy(ref common.ReferenceCallback) common.OpenAPIDefinition {
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
@@ -2361,7 +2389,8 @@ func schema_pkg_apis_numaflow_v1alpha1_Scale(ref common.ReferenceCallback) commo
 	return common.OpenAPIDefinition{
 		Schema: spec.Schema{
 			SchemaProps: spec.SchemaProps{
-				Type: []string{"object"},
+				Description: "Scale defines the parameters for autoscaling.",
+				Type:        []string{"object"},
 				Properties: map[string]spec.Schema{
 					"disabled": {
 						SchemaProps: spec.SchemaProps{
diff --git a/pkg/apis/numaflow/v1alpha1/persistence_strategy.go b/pkg/apis/numaflow/v1alpha1/persistence_strategy.go
index a42515aa..2c30403e 100644
--- a/pkg/apis/numaflow/v1alpha1/persistence_strategy.go
+++ b/pkg/apis/numaflow/v1alpha1/persistence_strategy.go
@@ -3,6 +3,7 @@ package v1alpha1
 import (
 	corev1 "k8s.io/api/core/v1"
 	apiresource "k8s.io/apimachinery/pkg/api/resource"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
 // PersistenceStrategy defines the strategy of persistence
@@ -18,3 +19,34 @@ type PersistenceStrategy struct {
 	// Volume size, e.g. 50Gi
 	VolumeSize *apiresource.Quantity `json:"volumeSize,omitempty" protobuf:"bytes,3,opt,name=volumeSize"`
 }
+
+func (ps PersistenceStrategy) GetPVCSpec(name string) corev1.PersistentVolumeClaim {
+	volMode := corev1.PersistentVolumeFilesystem
+	// Default volume size
+	volSize := apiresource.MustParse("20Gi")
+	if ps.VolumeSize != nil {
+		volSize = *ps.VolumeSize
+	}
+	// Default to ReadWriteOnce
+	accessMode := corev1.ReadWriteOnce
+	if ps.AccessMode != nil {
+		accessMode = *ps.AccessMode
+	}
+	return corev1.PersistentVolumeClaim{
+		ObjectMeta: metav1.ObjectMeta{
+			Name: name,
+		},
+		Spec: corev1.PersistentVolumeClaimSpec{
+			AccessModes: []corev1.PersistentVolumeAccessMode{
+				accessMode,
+			},
+			VolumeMode:       &volMode,
+			StorageClassName: ps.StorageClassName,
+			Resources: corev1.ResourceRequirements{
+				Requests: corev1.ResourceList{
+					corev1.ResourceStorage: volSize,
+				},
+			},
+		},
+	}
+}
diff --git a/pkg/apis/numaflow/v1alpha1/udf.go b/pkg/apis/numaflow/v1alpha1/udf.go
index 87272636..59cd9229 100644
--- a/pkg/apis/numaflow/v1alpha1/udf.go
+++ b/pkg/apis/numaflow/v1alpha1/udf.go
@@ -48,8 +48,9 @@ func (in UDF) getContainers(req getContainerReq) ([]corev1.Container, error) {
 
 func (in UDF) getMainContainer(req getContainerReq) corev1.Container {
 	if in.GroupBy == nil {
+		args := []string{"processor", "--type=" + string(VertexTypeMapUDF), "--isbsvc-type=" + string(req.isbSvcType)}
 		return containerBuilder{}.
-			init(req).args("processor", "--type="+string(VertexTypeMapUDF), "--isbsvc-type="+string(req.isbSvcType)).build()
+			init(req).args(args...).build()
 	}
 	return containerBuilder{}.
 		init(req).args("processor", "--type="+string(VertexTypeReduceUDF), "--isbsvc-type="+string(req.isbSvcType)).build()
@@ -92,9 +93,13 @@ func (in UDF) getUDFContainer(req getContainerReq) corev1.Container {
 
 // GroupBy indicates it is a reducer UDF
 type GroupBy struct {
+	// Window describes the windowing strategy.
 	Window Window `json:"window" protobuf:"bytes,1,opt,name=window"`
 	// +optional
 	Keyed bool `json:"keyed" protobuf:"bytes,2,opt,name=keyed"`
+	// Storage is used to define the PBQ storage for a reduce vertex.
+	// +optional
+	Storage *PBQStorage `json:"storage,omitempty" protobuf:"bytes,3,opt,name=storage"`
 }
 
 // Window describes windowing strategy
@@ -107,3 +112,13 @@ type Window struct {
 type FixedWindow struct {
 	Length *metav1.Duration `json:"length,omitempty" protobuf:"bytes,1,opt,name=length"`
 }
+
+// PBQStorage defines the persistence configuration for a vertex.
+type PBQStorage struct {
+	PersistentVolumeClaim *PersistenceStrategy `json:"persistentVolumeClaim,omitempty" protobuf:"bytes,1,opt,name=persistentVolumeClaim"`
+}
+
+// GeneratePBQStoragePVCName generates pvc name used by reduce vertex.
+func GeneratePBQStoragePVCName(pipelineName, vertex string, index int) string {
+	return fmt.Sprintf("pbq-vol-%s-%s-%d", pipelineName, vertex, index)
+}
diff --git a/pkg/apis/numaflow/v1alpha1/vertex_types.go b/pkg/apis/numaflow/v1alpha1/vertex_types.go
index c24cfec7..cf2fefe8 100644
--- a/pkg/apis/numaflow/v1alpha1/vertex_types.go
+++ b/pkg/apis/numaflow/v1alpha1/vertex_types.go
@@ -312,6 +312,21 @@ func (v Vertex) GetToBuffers() []Buffer {
 	return r
 }
 
+func (v Vertex) GetReplicas() int {
+	if v.IsReduceUDF() {
+		// Replica of a reduce vertex is determined by the parallelism.
+		if v.Spec.Replicas != nil && *v.Spec.Replicas == int32(0) {
+			// 0 is also allowed, which is for paused pipeline.
+			return 0
+		}
+		return len(v.GetFromBuffers())
+	}
+	if v.Spec.Replicas == nil {
+		return 1
+	}
+	return int(*v.Spec.Replicas)
+}
+
 type VertexSpec struct {
 	AbstractVertex `json:",inline" protobuf:"bytes,1,opt,name=abstractVertex"`
 	PipelineName   string `json:"pipelineName" protobuf:"bytes,2,opt,name=pipelineName"`
@@ -326,13 +341,6 @@ type VertexSpec struct {
 	ToEdges []Edge `json:"toEdges,omitempty" protobuf:"bytes,6,rep,name=toEdges"`
 }
 
-func (vs VertexSpec) GetReplicas() int {
-	if vs.Replicas == nil {
-		return 1
-	}
-	return int(*vs.Replicas)
-}
-
 type AbstractVertex struct {
 	Name string `json:"name" protobuf:"bytes,1,opt,name=name"`
 	// +optional
@@ -405,6 +413,7 @@ type AbstractVertex struct {
 	InitContainers []corev1.Container `json:"initContainers,omitempty" protobuf:"bytes,19,rep,name=initContainers"`
 }
 
+// Scale defines the parameters for autoscaling.
 type Scale struct {
 	// Whether to disable autoscaling.
 	// Set to "true" when using Kubernetes HPA or any other 3rd party autoscaling strategies.
diff --git a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
index 17f0f120..afe86889 100644
--- a/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
+++ b/pkg/apis/numaflow/v1alpha1/zz_generated.deepcopy.go
@@ -555,6 +555,11 @@ func (in *GetVertexPodSpecReq) DeepCopy() *GetVertexPodSpecReq {
 func (in *GroupBy) DeepCopyInto(out *GroupBy) {
 	*out = *in
 	in.Window.DeepCopyInto(&out.Window)
+	if in.Storage != nil {
+		in, out := &in.Storage, &out.Storage
+		*out = new(PBQStorage)
+		(*in).DeepCopyInto(*out)
+	}
 	return
 }
 
@@ -1040,6 +1045,27 @@ func (in *NativeRedis) DeepCopy() *NativeRedis {
 	return out
 }
 
+// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
+func (in *PBQStorage) DeepCopyInto(out *PBQStorage) {
+	*out = *in
+	if in.PersistentVolumeClaim != nil {
+		in, out := &in.PersistentVolumeClaim, &out.PersistentVolumeClaim
+		*out = new(PersistenceStrategy)
+		(*in).DeepCopyInto(*out)
+	}
+	return
+}
+
+// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PBQStorage.
+func (in *PBQStorage) DeepCopy() *PBQStorage {
+	if in == nil {
+		return nil
+	}
+	out := new(PBQStorage)
+	in.DeepCopyInto(out)
+	return out
+}
+
 // DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
 func (in *PersistenceStrategy) DeepCopyInto(out *PersistenceStrategy) {
 	*out = *in
diff --git a/pkg/reconciler/vertex/controller.go b/pkg/reconciler/vertex/controller.go
index 716e0ec3..883a09c5 100644
--- a/pkg/reconciler/vertex/controller.go
+++ b/pkg/reconciler/vertex/controller.go
@@ -102,7 +102,44 @@ func (r *vertexReconciler) reconcile(ctx context.Context, vertex *dfv1.Vertex) (
 		r.scaler.StartWatching(vertexKey)
 	}
 
-	desiredReplicas := vertex.Spec.GetReplicas()
+	desiredReplicas := vertex.GetReplicas()
+
+	// Create PVC if needed for reduce vertices
+	if vertex.IsReduceUDF() {
+		if x := vertex.Spec.UDF.GroupBy.Storage; x != nil && x.PersistentVolumeClaim != nil {
+			for i := 0; i < desiredReplicas; i++ {
+				newPvc, err := r.buildReduceVertexPVCSpec(vertex, i)
+				if err != nil {
+					log.Errorw("Error building a PVC spec", zap.Error(err))
+					vertex.Status.MarkPhaseFailed("BuildPVCSpecFailed", err.Error())
+					return ctrl.Result{}, err
+				}
+				hash := sharedutil.MustHash(newPvc.Spec)
+				newPvc.SetAnnotations(map[string]string{dfv1.KeyHash: hash})
+				existingPvc := &corev1.PersistentVolumeClaim{}
+				if err := r.client.Get(ctx, types.NamespacedName{Namespace: vertex.Namespace, Name: newPvc.Name}, existingPvc); err != nil {
+					if !apierrors.IsNotFound(err) {
+						log.Errorw("Error finding existing PVC", zap.Error(err))
+						vertex.Status.MarkPhaseFailed("FindExistingPVCFailed", err.Error())
+						return ctrl.Result{}, err
+					}
+					if err := r.client.Create(ctx, newPvc); err != nil && !apierrors.IsAlreadyExists(err) {
+						log.Errorw("Error creating a PVC", zap.Error(err))
+						vertex.Status.MarkPhaseFailed("CreatePVCFailed", err.Error())
+						return ctrl.Result{}, err
+					}
+				} else {
+					if existingPvc.GetAnnotations()[dfv1.KeyHash] != hash {
+						// TODO: deal with spec difference
+						if false {
+							log.Debug("TODO: check spec difference")
+						}
+					}
+				}
+			}
+		}
+	}
+
 	currentReplicas := int(vertex.Status.Replicas)
 	if currentReplicas != desiredReplicas || vertex.Status.Selector == "" {
 		log.Infow("Replicas changed", "currentReplicas", currentReplicas, "desiredReplicas", desiredReplicas)
@@ -119,14 +156,6 @@ func (r *vertexReconciler) reconcile(ctx context.Context, vertex *dfv1.Vertex) (
 		return ctrl.Result{}, err
 	}
 
-	podSpec, err := r.buildPodSpec(vertex, pipeline, isbSvc.Status.Config)
-	if err != nil {
-		log.Errorw("Failed to generate pod spec", zap.Error(err))
-		vertex.Status.MarkPhaseFailed("PodSpecGenFailed", err.Error())
-		return ctrl.Result{}, err
-	}
-	hash := sharedutil.MustHash(podSpec)
-
 	existingPods, err := r.findExistingPods(ctx, vertex)
 	if err != nil {
 		log.Errorw("Failed to find existing pods", zap.Error(err))
@@ -134,6 +163,13 @@ func (r *vertexReconciler) reconcile(ctx context.Context, vertex *dfv1.Vertex) (
 		return ctrl.Result{}, err
 	}
 	for replica := 0; replica < desiredReplicas; replica++ {
+		podSpec, err := r.buildPodSpec(vertex, pipeline, isbSvc.Status.Config, replica)
+		if err != nil {
+			log.Errorw("Failed to generate pod spec", zap.Error(err))
+			vertex.Status.MarkPhaseFailed("PodSpecGenFailed", err.Error())
+			return ctrl.Result{}, err
+		}
+		hash := sharedutil.MustHash(podSpec)
 		podNamePrefix := fmt.Sprintf("%s-%d-", vertex.Name, replica)
 		needToCreate := true
 		for existingPodName, existingPod := range existingPods {
@@ -247,7 +283,30 @@ func (r *vertexReconciler) reconcile(ctx context.Context, vertex *dfv1.Vertex) (
 	return ctrl.Result{}, nil
 }
 
-func (r *vertexReconciler) buildPodSpec(vertex *dfv1.Vertex, pl *dfv1.Pipeline, isbSvcConfig dfv1.BufferServiceConfig) (*corev1.PodSpec, error) {
+func (r *vertexReconciler) buildReduceVertexPVCSpec(vertex *dfv1.Vertex, replicaIndex int) (*corev1.PersistentVolumeClaim, error) {
+	if !vertex.IsReduceUDF() {
+		return nil, fmt.Errorf("not a reduce UDF")
+	}
+	if x := vertex.Spec.UDF.GroupBy.Storage; x == nil {
+		return nil, fmt.Errorf("storage is not configured for the reduce UDF")
+	} else if x.PersistentVolumeClaim == nil {
+		return nil, fmt.Errorf("persistentVolumeClaim is not configured for the reduce UDF storge")
+	}
+	pvcName := dfv1.GeneratePBQStoragePVCName(vertex.Spec.PipelineName, vertex.Spec.Name, replicaIndex)
+	newPvc := vertex.Spec.UDF.GroupBy.Storage.PersistentVolumeClaim.GetPVCSpec(pvcName)
+	newPvc.SetNamespace(vertex.Namespace)
+	newPvc.SetOwnerReferences([]metav1.OwnerReference{*metav1.NewControllerRef(vertex.GetObjectMeta(), dfv1.VertexGroupVersionKind)})
+	newPvc.SetLabels(map[string]string{
+		dfv1.KeyPartOf:       dfv1.Project,
+		dfv1.KeyManagedBy:    dfv1.ControllerVertex,
+		dfv1.KeyComponent:    dfv1.ComponentVertex,
+		dfv1.KeyVertexName:   vertex.Spec.Name,
+		dfv1.KeyPipelineName: vertex.Spec.PipelineName,
+	})
+	return &newPvc, nil
+}
+
+func (r *vertexReconciler) buildPodSpec(vertex *dfv1.Vertex, pl *dfv1.Pipeline, isbSvcConfig dfv1.BufferServiceConfig, replicaIndex int) (*corev1.PodSpec, error) {
 	isbSvcType, envs := sharedutil.GetIsbSvcEnvVars(isbSvcConfig)
 	podSpec, err := vertex.GetPodSpec(dfv1.GetVertexPodSpecReq{
 		ISBSvcType: isbSvcType,
@@ -264,6 +323,25 @@ func (r *vertexReconciler) buildPodSpec(vertex *dfv1.Vertex, pl *dfv1.Pipeline,
 	podSpec.Volumes = append(podSpec.Volumes, vols...)
 	podSpec.Containers[0].VolumeMounts = append(podSpec.Containers[0].VolumeMounts, volMounts...)
 
+	if vertex.IsReduceUDF() {
+		// Add pvc for reduce vertex pods
+		if x := vertex.Spec.UDF.GroupBy.Storage; x != nil && x.PersistentVolumeClaim != nil {
+			volName := "pbq-vol"
+			podSpec.Volumes = append(podSpec.Volumes, corev1.Volume{
+				Name: volName,
+				VolumeSource: corev1.VolumeSource{
+					PersistentVolumeClaim: &corev1.PersistentVolumeClaimVolumeSource{
+						ClaimName: dfv1.GeneratePBQStoragePVCName(vertex.Spec.PipelineName, vertex.Spec.Name, replicaIndex),
+					},
+				},
+			})
+			podSpec.Containers[0].VolumeMounts = append(podSpec.Containers[0].VolumeMounts, corev1.VolumeMount{
+				Name:      volName,
+				MountPath: dfv1.PathPBQMount,
+			})
+		}
+	}
+
 	bfs := []string{}
 	// Only source vertices need to check all the pipeline buffers
 	if vertex.IsASource() {
diff --git a/pkg/reconciler/vertex/scaling/scaling.go b/pkg/reconciler/vertex/scaling/scaling.go
index c368e72b..531accd2 100644
--- a/pkg/reconciler/vertex/scaling/scaling.go
+++ b/pkg/reconciler/vertex/scaling/scaling.go
@@ -173,7 +173,7 @@ func (s *Scaler) scaleOneVertex(ctx context.Context, key string, worker int) err
 		log.Debug("Corresponding Pipeline not in Running state")
 		return nil
 	}
-	if int(vertex.Status.Replicas) != vertex.Spec.GetReplicas() {
+	if int(vertex.Status.Replicas) != vertex.GetReplicas() {
 		log.Debugf("Vertex %s might be under processing, replicas mismatch", vertex.Name)
 		return nil
 	}
@@ -228,7 +228,7 @@ func (s *Scaler) scaleOneVertex(ctx context.Context, key string, worker int) err
 			_ = s.vertexMetricsCache.Add(*bInfo.BufferName+"/length", totalBufferLength)
 		}
 	}
-	current := int32(vertex.Spec.GetReplicas())
+	current := int32(vertex.GetReplicas())
 	desired := s.desiredReplicas(ctx, vertex, rate, pending, totalBufferLength, targetAvailableBufferLength)
 	log.Debugf("Calculated desired replica number of vertex %q is: %v", vertex.Name, desired)
 	max := vertex.Spec.Scale.GetMaxReplicas()


Test patch:
diff --git a/pkg/apis/numaflow/v1alpha1/vertex_types_test.go b/pkg/apis/numaflow/v1alpha1/vertex_types_test.go
index f368535a..e77a0359 100644
--- a/pkg/apis/numaflow/v1alpha1/vertex_types_test.go
+++ b/pkg/apis/numaflow/v1alpha1/vertex_types_test.go
@@ -101,12 +101,27 @@ func TestWithoutReplicas(t *testing.T) {
 }
 
 func TestGetVertexReplicas(t *testing.T) {
-	s := &VertexSpec{}
-	assert.Equal(t, 1, s.GetReplicas())
-	s.Replicas = pointer.Int32(3)
-	assert.Equal(t, 3, s.GetReplicas())
-	s.Replicas = pointer.Int32(0)
-	assert.Equal(t, 0, s.GetReplicas())
+	v := Vertex{
+		Spec: VertexSpec{
+			AbstractVertex: AbstractVertex{
+				Name: "b",
+			},
+		},
+	}
+	assert.Equal(t, 1, v.GetReplicas())
+	v.Spec.Replicas = pointer.Int32(3)
+	assert.Equal(t, 3, v.GetReplicas())
+	v.Spec.Replicas = pointer.Int32(0)
+	assert.Equal(t, 0, v.GetReplicas())
+	v.Spec.UDF = &UDF{
+		GroupBy: &GroupBy{},
+	}
+	v.Spec.FromEdges = []Edge{
+		{From: "a", To: "b", Parallelism: pointer.Int32(5)},
+	}
+	assert.Equal(t, 0, v.GetReplicas())
+	v.Spec.Replicas = pointer.Int32(1000)
+	assert.Equal(t, 5, v.GetReplicas())
 }
 
 func TestGetHeadlessSvcSpec(t *testing.T) {
diff --git a/pkg/reconciler/vertex/controller_test.go b/pkg/reconciler/vertex/controller_test.go
index ffeb3be9..c828fba8 100644
--- a/pkg/reconciler/vertex/controller_test.go
+++ b/pkg/reconciler/vertex/controller_test.go
@@ -13,6 +13,7 @@ import (
 	"go.uber.org/zap/zaptest"
 	appv1 "k8s.io/api/apps/v1"
 	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
 	"k8s.io/client-go/kubernetes/scheme"
@@ -168,7 +169,7 @@ func Test_BuildPodSpec(t *testing.T) {
 			logger: zaptest.NewLogger(t).Sugar(),
 		}
 		testObj := testSrcVertex.DeepCopy()
-		spec, err := r.buildPodSpec(testObj, testPipeline, fakeIsbSvcConfig)
+		spec, err := r.buildPodSpec(testObj, testPipeline, fakeIsbSvcConfig, 0)
 		assert.NoError(t, err)
 		assert.Equal(t, 1, len(spec.InitContainers))
 		assert.Equal(t, 1, len(spec.Containers))
@@ -206,7 +207,7 @@ func Test_BuildPodSpec(t *testing.T) {
 		testObj.Spec.Sink = &dfv1.Sink{}
 		testObj.Spec.FromEdges = []dfv1.Edge{{From: "p1", To: "output"}}
 		testObj.Spec.ToEdges = []dfv1.Edge{}
-		spec, err := r.buildPodSpec(testObj, testPipeline, fakeIsbSvcConfig)
+		spec, err := r.buildPodSpec(testObj, testPipeline, fakeIsbSvcConfig, 0)
 		assert.NoError(t, err)
 		assert.Equal(t, 1, len(spec.InitContainers))
 		assert.Equal(t, 1, len(spec.Containers))
@@ -252,7 +253,7 @@ func Test_BuildPodSpec(t *testing.T) {
 		}
 		testObj.Spec.FromEdges = []dfv1.Edge{{From: "p1", To: "output"}}
 		testObj.Spec.ToEdges = []dfv1.Edge{}
-		spec, err := r.buildPodSpec(testObj, testPipeline, fakeIsbSvcConfig)
+		spec, err := r.buildPodSpec(testObj, testPipeline, fakeIsbSvcConfig, 0)
 		assert.NoError(t, err)
 		assert.Equal(t, 1, len(spec.InitContainers))
 		assert.Equal(t, 2, len(spec.Containers))
@@ -263,7 +264,7 @@ func Test_BuildPodSpec(t *testing.T) {
 		assert.Equal(t, "arg0", spec.Containers[1].Args[0])
 	})
 
-	t.Run("test udf", func(t *testing.T) {
+	t.Run("test map udf", func(t *testing.T) {
 		cl := fake.NewClientBuilder().Build()
 		r := &vertexReconciler{
 			client: cl,
@@ -278,7 +279,7 @@ func Test_BuildPodSpec(t *testing.T) {
 				Name: "cat",
 			},
 		}
-		spec, err := r.buildPodSpec(testObj, testPipeline, fakeIsbSvcConfig)
+		spec, err := r.buildPodSpec(testObj, testPipeline, fakeIsbSvcConfig, 0)
 		assert.NoError(t, err)
 		assert.Equal(t, 1, len(spec.InitContainers))
 		assert.Equal(t, 2, len(spec.Containers))
@@ -303,6 +304,49 @@ func Test_BuildPodSpec(t *testing.T) {
 			assert.Contains(t, argStr, fmt.Sprintf("%s=%s", b.Name, b.Type))
 		}
 	})
+
+	t.Run("test reduce udf", func(t *testing.T) {
+		cl := fake.NewClientBuilder().Build()
+		r := &vertexReconciler{
+			client: cl,
+			scheme: scheme.Scheme,
+			config: fakeConfig,
+			image:  testFlowImage,
+			logger: zaptest.NewLogger(t).Sugar(),
+		}
+		testObj := testVertex.DeepCopy()
+		volSize, _ := resource.ParseQuantity("1Gi")
+		testObj.Spec.UDF = &dfv1.UDF{
+			Container: &dfv1.Container{
+				Image: "my-image",
+			},
+			GroupBy: &dfv1.GroupBy{
+				Storage: &dfv1.PBQStorage{
+					PersistentVolumeClaim: &dfv1.PersistenceStrategy{
+						VolumeSize: &volSize,
+					},
+				},
+			},
+		}
+		spec, err := r.buildPodSpec(testObj, testPipeline, fakeIsbSvcConfig, 2)
+		assert.NoError(t, err)
+		assert.Equal(t, 1, len(spec.InitContainers))
+		assert.Equal(t, 2, len(spec.Containers))
+		containsPVC := false
+		containsPVCMount := false
+		for _, v := range spec.Volumes {
+			if v.Name == "pbq-vol" {
+				containsPVC = true
+			}
+		}
+		assert.True(t, containsPVC)
+		for _, m := range spec.Containers[0].VolumeMounts {
+			if m.MountPath == dfv1.PathPBQMount {
+				containsPVCMount = true
+			}
+		}
+		assert.True(t, containsPVCMount)
+	})
 }
 
 func Test_reconcile(t *testing.T) {